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.

  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: link
Be 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).