public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "StevenSun2021 at hotmail dot com" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/99686] ICE when using both concepts and full specialization Date: Fri, 07 May 2021 13:15:16 +0000 [thread overview] Message-ID: <bug-99686-4-j5E5IAwNDi@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-99686-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99686 --- Comment #7 from Steven Sun <StevenSun2021 at hotmail dot com> --- After digging for two days, I think I may know what's happening inside. Under std=c++20 and my code in comment 1, the flow when parsing a full function specialization would be 1. Found a full specialization of function. 2. Instantiate all possible primary function templates. 3. Find the most suitable instantiation (here, the concept constrained is chosen) 4. Then replace it with full specialization. (this is done in `reregister_specialization` in `gcc/cp/pt.c`) So when performing overloading in the main function, there would be one instantiation and one full specialization to choose. (To be specific, those two are in the hash table `decl_specialization` defined in `gcc/cp/pt.c`) While in the c++17 mode, step 4 is broken. So there will be 2 implicit instantiation to choose when overloading. Step 4 is performed in the function `duplicate_decls` defined in `gcc/cp/decl.c`. Certain conditions must be satisfied to replace the instantiation. The one failed here is: "the compiler thinks the full specialization has a different concepts constraint with primary template (because the primary template has contraints but the full specialization doesn't)" So the reregistration is never triggered. This is the source of the bug. After getting the whole picture, I simplify the test case as https://godbolt.org/z/9MM6rEf77 ----------------------- std=c++17 -fconcepts template <typename T> requires requires(T t) { ++t; } void func(T &&arg) { } template <> void func(int&& arg) { } int main() { func(1); } ----------------------- I'll give more details in the next comment in case any developer would like to fix it.
next prev parent reply other threads:[~2021-05-07 13:15 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-03-20 19:21 [Bug c++/99686] New: ICE when concepts on C++17 when providing both T&& and const T& specialization StevenSun2021 at hotmail dot com 2021-03-20 19:43 ` [Bug c++/99686] " StevenSun2021 at hotmail dot com 2021-03-21 6:51 ` [Bug c++/99686] ICE when using both concepts and full specialization webrown.cpp at gmail dot com 2021-03-25 11:35 ` StevenSun2021 at hotmail dot com 2021-03-25 12:32 ` webrown.cpp at gmail dot com 2021-05-05 0:09 ` StevenSun2021 at hotmail dot com 2021-05-05 0:33 ` StevenSun2021 at hotmail dot com 2021-05-07 13:15 ` StevenSun2021 at hotmail dot com [this message] 2021-05-07 14:35 ` StevenSun2021 at hotmail dot com 2022-12-07 15:55 ` [Bug c++/99686] ICE when using concepts on function template before c++20 (Reason already found) ppalka at gcc dot gnu.org
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-99686-4-j5E5IAwNDi@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).