https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97059
Jason Merrill <jason at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #3 from Jason Merrill <jason at gcc dot gnu.org> --- (In reply to Dimitri Gorokhovik from comment #0) > template <typename T> > concept S = requires (T t) > { > { t.n } -> std::same_as <const std::size_t > #if NOBUG > & > #endif > >; > requires std::is_same_v <decltype (t.n), const std::size_t>; > }; > > Compilation succeeds when NOBUG is defined, i.e., the compound requirement > '{ t.n } ->' produces the return type as 'const std::size_t &' instead of > 'const std::size_t'. Which is inconsistent elsewhere (see the source code > above). For the second 'requires' to be equivalent to the return-type-requirement, you need another set of parentheses around "t.n". 7.5.7.3: "The immediately-declared constraint (13.2) of the type-constraint for decltype((E)) shall be satisfied." It's the extra parentheses that result in the reference type rather than non-reference. GCC is correct here.