1 // RUN: %clang_cc1 -std=c++20 -verify %s 2 3 namespace PR47043 { 4 template<typename T> concept True = true; 5 template<typename ...T> concept AllTrue1 = True<T>; // expected-error {{expression contains unexpanded parameter pack 'T'}} 6 template<typename ...T> concept AllTrue2 = (True<T> && ...); 7 static_assert(AllTrue2<int, float, char>); 8 } 9 10 namespace PR47025 { 11 template<typename ...T> concept AllAddable1 = requires(T ...t) { (void(t + 1), ...); }; 12 template<typename ...T> concept AllAddable2 = (requires(T ...t) { (t + 1); } && ...); // expected-error {{requirement contains unexpanded parameter pack 't'}} 13 template<typename ...T> concept AllAddable3 = (requires(T t) { (t + 1); } && ...); 14 template<typename ...T> concept AllAddable4 = requires(T t) { (t + 1); }; // expected-error {{expression contains unexpanded parameter pack 'T'}} 15 template<typename ...T> concept AllAddable5 = requires(T t) { (void(t + 1), ...); }; // expected-error {{does not contain any unexpanded}} 16 template<typename ...T> concept AllAddable6 = (requires { (T() + 1); } && ...); 17 template<typename ...T> concept AllAddable7 = requires { (T() + 1); }; // expected-error {{expression contains unexpanded parameter pack 'T'}} 18 19 static_assert(AllAddable1<int, float>); 20 static_assert(AllAddable3<int, float>); 21 static_assert(AllAddable6<int, float>); 22 static_assert(!AllAddable1<int, void>); 23 static_assert(!AllAddable3<int, void>); 24 static_assert(!AllAddable6<int, void>); 25 } 26 27 namespace PR45699 { 28 template<class> concept C = true; // expected-note 2{{here}} 29 template<class ...Ts> void f1a() requires C<Ts>; // expected-error {{requires clause contains unexpanded parameter pack 'Ts'}} 30 template<class ...Ts> requires C<Ts> void f1b(); // expected-error {{requires clause contains unexpanded parameter pack 'Ts'}} 31 template<class ...Ts> void f2a() requires (C<Ts> && ...); 32 template<class ...Ts> requires (C<Ts> && ...) void f2b(); 33 template<class ...Ts> void f3a() requires C<Ts...>; // expected-error {{pack expansion used as argument for non-pack parameter of concept}} 34 template<class ...Ts> requires C<Ts...> void f3b(); // expected-error {{pack expansion used as argument for non-pack parameter of concept}} f4()35 template<class ...Ts> void f4() { 36 ([] () requires C<Ts> {} ()); // expected-error {{expression contains unexpanded parameter pack 'Ts'}} 37 ([]<int = 0> requires C<Ts> () {} ()); // expected-error {{expression contains unexpanded parameter pack 'Ts'}} 38 } f5()39 template<class ...Ts> void f5() { 40 ([] () requires C<Ts> {} (), ...); 41 ([]<int = 0> requires C<Ts> () {} (), ...); 42 } g()43 void g() { 44 f1a(); 45 f1b(); // FIXME: Bad error recovery. expected-error {{undeclared identifier}} 46 f2a(); 47 f2b(); 48 f3a(); 49 f3b(); // FIXME: Bad error recovery. expected-error {{undeclared identifier}} 50 f4(); 51 f5(); 52 } 53 } 54 55 namespace P0857R0 { f()56 void f() { 57 auto x = []<bool B> requires B {}; // expected-note {{constraints not satisfied}} expected-note {{false}} 58 x.operator()<true>(); 59 x.operator()<false>(); // expected-error {{no matching member function}} 60 } 61 62 // FIXME: This is valid under P0857R0. 63 template<typename T> concept C = true; 64 template<template<typename T> requires C<T> typename U> struct X {}; // expected-error {{requires 'class'}} expected-error 0+{{}} 65 template<typename T> requires C<T> struct Y {}; 66 X<Y> xy; // expected-error {{no template named 'X'}} 67 } 68