gcc/testsuite/g++.dg/concepts/diagnostic5.C: In function ‘void bar()’: gcc/testsuite/g++.dg/concepts/diagnostic5.C:42:13: error: use of function ‘void foo() [with T = char]’ with unsatisfied constraints 42 | foo<char>(); // { dg-error "use of" } | ^ gcc/testsuite/g++.dg/concepts/diagnostic5.C:37:8: note: declared here 37 | void foo() { } | ^~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:37:8: note: constraints not satisfied gcc/testsuite/g++.dg/concepts/diagnostic5.C: In instantiation of ‘void foo() [with T = char]’: gcc/testsuite/g++.dg/concepts/diagnostic5.C:42:13: required from here gcc/testsuite/g++.dg/concepts/diagnostic5.C:37:8: required by the constraints of ‘template<class T> requires (c1<T>) || (c2<T>) || ((c3<T>) || (c4<T>)) || (c5<T>) void foo()’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:31:49: note: no operand of the disjunction is satisfied 31 | requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" } | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:31:13: note: the operand ‘c1<T>’ is unsatisfied because 31 | requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" } | ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:5:11: required for the satisfaction of ‘c1<char>’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:5:16: in requirements gcc/testsuite/g++.dg/concepts/diagnostic5.C:5:36: note: the required type ‘typename T::blah’ is invalid 5 | concept c1 = requires { typename T::blah; }; | ~~~~~~~~~^~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:31:22: note: the operand ‘c2<T>’ is unsatisfied because 31 | requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" } | ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:10:11: required for the satisfaction of ‘c2<char>’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:10:16: in requirements with ‘char x’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:10:33: note: the required expression ‘* x’ is invalid 10 | concept c2 = requires (T x) { *x; }; | ^~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:31:33: note: the operand ‘c3<T>’ is unsatisfied because 31 | requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" } | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:16:11: required for the satisfaction of ‘c3<char>’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:16:38: note: no operand of the disjunction is satisfied 16 | concept c3 = __is_same(T, const T) || __is_same(T, int); | ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:31:42: note: the operand ‘c4<T>’ is unsatisfied because 31 | requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" } | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:21:11: required for the satisfaction of ‘c4<char>’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:21:16: in requirements with ‘char x’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:21:54: note: nested requirement ‘(c2<const T> || c2<volatile T>)’ is not satisfied 21 | concept c4 = requires (T x) { requires c2<const T> || c2<volatile T>; }; | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:31:52: note: the operand ‘c5<T>’ is unsatisfied because 31 | requires (c1<T> || c2<T>) || (c3<T> || c4<T>) || c5<T> // { dg-message "49: no operand" } | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ gcc/testsuite/g++.dg/concepts/diagnostic5.C:26:11: required for the satisfaction of ‘c5<char>’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:26:16: in requirements with ‘char x’ gcc/testsuite/g++.dg/concepts/diagnostic5.C:26:36: note: ‘& x’ does not satisfy return-type-requirement 26 | concept c5 = requires (T x) { { &x } -> c1; }; | ^ cc1plus: note: set -fconcepts-diagnostics-depth= to at least 3 for more detail