brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · 8a36d7a Raw
126 lines · cpp
1// RUN: %clang_cc1 -std=c++2a -x c++ %s -verify2 3template<typename T, typename U> constexpr bool is_same_v = false;4template<typename T> constexpr bool is_same_v<T, T> = true;5 6template<typename T> struct identity { using type = T; };7template<typename T> using identity_t = T;8 9// Type requirements10template<typename T> requires requires { typename identity_t<T>; }11struct r1;12template<typename U> requires requires { typename identity_t<U>; } // expected-note{{previous template declaration is here}}13struct r1;14template<typename T> requires requires { typename identity_t<T*>; } // expected-error{{requires clause differs in template redeclaration}}15struct r1;16template<typename T> requires requires { typename ::identity_t<T>; }17struct r1;18 19template<typename Y> requires requires { typename identity<Y>::type; }20struct r2;21template<typename U> requires requires { typename identity<U>::type; }22struct r2;23template<typename T> requires requires { typename ::identity<T>::type; } // expected-note 2{{previous template declaration is here}}24struct r2;25template<typename T> requires requires { typename identity<T>::typr; } // expected-error{{requires clause differs in template redeclaration}}26struct r2;27namespace ns {28  template<typename T> struct identity { using type = T; };29}30template<typename T> requires requires { typename ns::identity<T>::type; } // expected-error{{requires clause differs in template redeclaration}}31struct r2;32 33template<typename T> requires requires { typename T::template identity<T>::type; }34struct r3;35template<typename U> requires requires { typename U::template identity<U>::type; } // expected-note{{previous template declaration is here}}36struct r3;37template<typename T> requires requires { typename T::template identitr<T>::type; } // expected-error{{requires clause differs in template redeclaration}}38struct r3;39 40template<typename T> requires requires { typename T::template temp<>; }41struct r4;42template<typename U> requires requires { typename U::template temp<>; }43struct r4;44 45// Expr requirements46template<typename T> requires requires { 0; } // expected-note{{previous template declaration is here}}47struct r5;48template<typename T> requires requires { 1; } // expected-error{{requires clause differs in template redeclaration}}49struct r5;50 51template<typename T>52concept C1 = true;53 54template<typename T> requires requires { sizeof(T); }55struct r6;56template<typename U> requires requires { sizeof(U); } // expected-note{{previous template declaration is here}}57struct r6;58template<typename U> requires requires { sizeof(U) - 1; } // expected-error{{requires clause differs in template redeclaration}}59struct r6;60template<typename T> requires requires { { sizeof(T) }; } // expected-note 2{{previous template declaration is here}}61struct r6;62template<typename T> requires requires { { sizeof(T) } noexcept; } // expected-error{{requires clause differs in template redeclaration}}63struct r6;64template<typename T> requires requires { { sizeof(T) } -> C1; } // expected-error{{requires clause differs in template redeclaration}}65struct r6;66 67template<typename T> requires requires { { sizeof(T) } -> C1; }68struct r7;69template<typename U> requires requires { { sizeof(U) } -> C1; }70struct r7;71template<typename T> requires requires { { sizeof(T) } -> C1<>; } // expected-note {{previous template declaration is here}}72struct r7;73template<typename U> requires requires { { sizeof(U) }; } // expected-error{{requires clause differs in template redeclaration}}74struct r7;75 76template<typename T, typename U>77concept C2 = true;78 79template<typename T> requires requires { { sizeof(T) } -> C2<T>; }80struct r8;81template<typename U> requires requires { { sizeof(U) } -> C2<U>; } // expected-note{{previous template declaration is here}}82struct r8;83template<typename T> requires requires { { sizeof(T) } -> C2<T*>; } // expected-error{{requires clause differs in template redeclaration}}84struct r8;85 86// Nested requirements87template<typename T> requires requires { requires sizeof(T) == 0; }88struct r9;89template<typename U> requires requires { requires sizeof(U) == 0; } // expected-note{{previous template declaration is here}}90struct r9;91template<typename T> requires requires { requires sizeof(T) == 1; } // expected-error{{requires clause differs in template redeclaration}}92struct r9;93 94// Parameter list95template<typename T> requires requires { requires true; }96struct r10;97template<typename T> requires requires() { requires true; } // expected-note{{previous template declaration is here}}98struct r10;99template<typename T> requires requires(T i) { requires true; } // expected-error{{requires clause differs in template redeclaration}}100struct r10;101 102template<typename T> requires requires(T i, T *j) { requires true; } // expected-note 2{{previous template declaration is here}}103struct r11;104template<typename T> requires requires(T i) { requires true; } // expected-error{{requires clause differs in template redeclaration}}105struct r11;106template<typename T> requires requires(T i, T *j, T &k) { requires true; } // expected-error{{requires clause differs in template redeclaration}}107struct r11;108 109// Parameter names110template<typename T> requires requires(int i) { requires sizeof(i) == 1; }111struct r12;112template<typename T> requires requires(int j) { requires sizeof(j) == 1; } // expected-note 2{{previous template declaration is here}}113struct r12;114template<typename T> requires requires(int k) { requires sizeof(k) == 2; } // expected-error{{requires clause differs in template redeclaration}}115struct r12;116template<typename T> requires requires(const int k) { requires sizeof(k) == 1; } // expected-error{{requires clause differs in template redeclaration}}117struct r12;118 119// Order of requirements120template<typename T> requires requires { requires true; 0; }121struct r13;122template<typename T> requires requires { requires true; 0; } // expected-note{{previous template declaration is here}}123struct r13;124template<typename T> requires requires { 0; requires true; } // expected-error{{requires clause differs in template redeclaration}}125struct r13;126