// { dg-do compile { target c++2a } } // { dg-additional-options "-fconcepts-diagnostics-depth=2" } template concept c1 = requires { typename T::blah; }; // { dg-message "satisfaction of .c1. .with T = char." "" { target *-*-* } .-1 } // { dg-message ".typename T::blah. is invalid" "" { target *-*-* } .-2 } template concept c2 = requires (T x) { *x; }; // { dg-message "satisfaction of .c2. .with T = char." "" { target *-*-* } .-1 } // { dg-message "in requirements with .T x. .with T = char." "" { target *-*-* } .-2 } // { dg-message "required expression .* is invalid" "" { target *-*-* } .-3 } template concept c3 = __is_same(T, const T) || __is_same(T, int); // { dg-message "satisfaction of .c3. .with T = char." "" { target *-*-* } .-1 } // { dg-message "no operand of the disjunction is satisfied" "" { target *-*-* } .-2 } template concept c4 = requires (T x) { requires c2 || c2; }; // { dg-message "satisfaction of .c4. .with T = char." "" { target *-*-* } .-1 } // { dg-message "nested requirement" "" { target *-*-* } .-2 } template concept c5 = requires (T x) { { &x } -> c1; }; // { dg-message "satisfaction of .c5. .with T = char." "" { target *-*-* } .-1 } // { dg-message "in requirements with .T x. .with T = char." "" { target *-*-* } .-2 } template requires (c1 || c2) || (c3 || c4) || c5 // { dg-message "49: no operand" } // { dg-message ".c1. is unsatisfied because" "" { target *-*-* } .-1 } // { dg-message ".c2. is unsatisfied because" "" { target *-*-* } .-2 } // { dg-message ".c3. is unsatisfied because" "" { target *-*-* } .-3 } // { dg-message ".c4. is unsatisfied because" "" { target *-*-* } .-4 } // { dg-message ".c5. is unsatisfied because" "" { target *-*-* } .-5 } void foo() { } void bar() { foo(); // { dg-error "no match" } }