https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92102
Bug ID: 92102 Summary: identical requires-expression not subsumed Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Blocks: 67491 Target Milestone: --- This fails to compile with -std=gnu++2a: template<typename T, typename U> constexpr bool same = false; template<typename T> constexpr bool same<T, T> = true; template<typename T, typename U> concept same_same = same<T, U> && same<U, T>; template<typename T> struct traits { using type = T; }; struct tag { }; template<typename T> struct category { }; template<typename T> requires requires { typename traits<T>::type; } struct category<T> { }; template<typename T> requires requires { typename traits<T>::type; } && same_same<typename traits<T>::type, tag> struct category<T> { using type = int; }; category<tag>::type t; ambig.cc:27:14: error: ambiguous template instantiation for 'struct category<tag>' 27 | category<tag>::type t; | ^~ ambig.cc:18:10: note: candidates are: 'template<class T> requires requires{typename traits<T>::type;} struct category<T> [with T = tag]' 18 | struct category<T> | ^~~~~~~~~~~ ambig.cc:24:10: note: 'template<class T> requires requires{typename traits<T>::type;} && (same_same<typename traits::type, tag>) struct category<T> [with T = tag]' 24 | struct category<T> | ^~~~~~~~~~~ ambig.cc:27:16: error: invalid use of incomplete type 'struct category<tag>' 27 | category<tag>::type t; | ^~~~ ambig.cc:13:10: note: declaration of 'struct category<tag>' 13 | struct category | ^~~~~~~~ It compiles OK if the subsumed constraint is a concept instead of a requires-expression, even though that should be equivalent: template<typename T, typename U> constexpr bool same = false; template<typename T> constexpr bool same<T, T> = true; template<typename T, typename U> concept same_same = same<T, U> && same<U, T>; template<typename T> struct traits { using type = T; }; template<typename T> concept traitsy = requires { typename traits<T>::type; }; struct tag { }; template<typename T> struct category { }; template<typename T> requires traitsy<T> struct category<T> { }; template<typename T> requires traitsy<T> && same_same<typename traits<T>::type, tag> struct category<T> { using type = int; }; category<tag>::type t; Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67491 [Bug 67491] [meta-bug] concepts issues