https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99686
--- Comment #8 from Steven Sun <StevenSun2021 at hotmail dot com> --- under c++17 Step 4 needs `types_match == 1` [at 1] but, its value is zero, which is caused by `function_requirements_equivalent_p` [at 3] returns 0 [at 2] . [1] https://gcc.gnu.org/git?p=gcc.git;a=blob;f=gcc/cp/decl.c;h=316ad4c1426940bd4f51197a6297eefc24064fec;hb=HEAD#l1481 [2] https://gcc.gnu.org/git?p=gcc.git;a=blob;f=gcc/cp/decl.c;h=316ad4c1426940bd4f51197a6297eefc24064fec;hb=HEAD#l1052 [3] https://gcc.gnu.org/git?p=gcc.git;a=blob;f=gcc/cp/decl.c;h=316ad4c1426940bd4f51197a6297eefc24064fec;hb=HEAD#l944 [4] https://gcc.gnu.org/git?p=gcc.git;a=blob;f=gcc/cp/pt.c;h=36a8cb5df5d36337c18e1547e775b747f59a087f;hb=HEAD#l3510 In `function_requirements_equivalent_p` [at 3], the comparison is different for cxx20 and before. According to the comments, before c++20, only the combined constraints are compaired. -------------------------------------------------------------- By the way, for those two primary function templates in comment 1. Before cxx20, they are regard as equivalent heads [at 4] inequivalent requirements [at 3] Since cxx20, they are regard as inequivalent heads [at 4] equivalent requirements [at 3] If I change both [3], [4], forcing cxx17 using cxx20 standard, everything works. ------------------------------------------------------------- Many invariants are broken here. They cause this bug together: A failure in requirements comparison caused no reregistration, which leads to overload between implicit instatntiation. The full specialzation is already parsed, leaving a null `cfun` state. Then it tries to instatiate the function body and everything crashes, They are all `by design` in a sense. How to fix it is not only a technical issue, but a design choice. If any senior gcc developer sees this, help me. ------------------------------------------------------------- By the way, I don't think this bug would matter too much, since no one really uses concepts before c++20. I am just curious.