// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify template concept C = true; namespace ns { template concept D = true; } int foo() { int I; {ns::D auto a = 1;} {C auto a = 1;} {C<> auto a = 1;} {C auto a = 1;} {ns::D auto a = 1;} {const ns::D auto &a = 1;} {const C auto &a = 1;} {const C<> auto &a = 1;} {const C auto &a = 1;} {const ns::D auto &a = 1;} {C decltype(auto) a = 1;} {C<> decltype(auto) a = 1;} {C decltype(auto) a = 1;} {const C<> decltype(auto) &a = 1;} // expected-error{{'decltype(auto)' cannot be combined with other type specifiers}} // expected-error@-1{{cannot form reference to 'decltype(auto)'}} {const C decltype(auto) &a = 1;} // expected-error{{'decltype(auto)' cannot be combined with other type specifiers}} // expected-error@-1{{cannot form reference to 'decltype(auto)'}} {C a = 1;} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} {C const a2 = 1;} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} {C &a3 = I;} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} {C &&a4 = 1;} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} {C decltype a19 = 1;} // expected-error@-1{{expected '('}} {C decltype(1) a20 = 1;} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} } void foo1(C auto &a){} void foo2(C const &a){} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} void foo3(C auto const &a){} void foo4(const C &a){} // expected-error@-1{{expected 'auto' or 'decltype(auto)' after concept name}} namespace non_type { template concept C1 = true; auto f() -> C1 auto {} // expected-error{{concept named in type constraint is not a type concept}} auto g(C1 auto); // expected-error{{concept named in type constraint is not a type concept}} C1 auto a = 0; // expected-error{{concept named in type constraint is not a type concept}} C1 decltype(auto) b = 0; // expected-error{{concept named in type constraint is not a type concept}} } namespace arity { template concept C1 = true; auto f() -> C1 auto {} // expected-error{{'C1' requires more than 1 template argument; provide the remaining arguments explicitly to use it here}} auto g(C1 auto); // expected-error{{'C1' requires more than 1 template argument; provide the remaining arguments explicitly to use it here}} C1 auto a = 0; // expected-error{{'C1' requires more than 1 template argument; provide the remaining arguments explicitly to use it here}} C1 decltype(auto) b = 0; // expected-error{{'C1' requires more than 1 template argument; provide the remaining arguments explicitly to use it here}} }