brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · cc4fefc Raw
137 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c++17 -Wno-vla-cxx-extension %s2// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify -std=c++20 -Wno-vla-cxx-extension %s3 4#if !__has_builtin(__builtin_common_reference)5#  error6#endif7 8// expected-note@*:* {{template <template <class, class, template <class> class, template <class> class> class, template <class ...> class, template <class> class, class, class ...>}}9 10void test() {11  __builtin_common_reference<> a; // expected-error {{too few template arguments for template '__builtin_common_reference'}}12  __builtin_common_reference<1> b; // expected-error {{template argument for template template parameter must be a class template or type alias template}}13  __builtin_common_reference<int, 1> c; // expected-error {{template argument for template template parameter must be a class template or type alias template}}14}15 16struct empty_type {};17 18template <class T>19struct type_identity {20  using type = T;21};22 23template <class...>24struct common_type;25 26template <class... Args>27using common_type_t = typename common_type<Args...>::type;28 29template <class, class, template <class> class, template <class> class>30struct basic_common_reference {};31 32template <class T, class U, template <class> class TX, template <class> class UX>33using basic_common_reference_t = typename basic_common_reference<T, U, TX, UX>::type;34 35void test_vla() {36  int i = 4;37  int VLA[i];38  __builtin_common_reference<basic_common_reference_t, common_type_t, type_identity, empty_type, decltype(VLA)> d; // expected-error {{variably modified type 'decltype(VLA)' (aka 'int[i]') cannot be used as a template argument}}39}40 41template <class... Args>42using common_reference_base = __builtin_common_reference<basic_common_reference_t, common_type_t, type_identity, empty_type, Args...>;43 44template <class... Args>45struct common_reference : common_reference_base<Args...> {};46 47template <class... Args>48using common_reference_t = typename __builtin_common_reference<basic_common_reference_t, common_type_t, type_identity, empty_type, Args...>::type;49 50struct Incomplete;51 52template<>53struct common_type<Incomplete, Incomplete>;54 55static_assert(__is_same(common_reference_base<>, empty_type));56 57static_assert(__is_same(common_reference_base<Incomplete>, type_identity<Incomplete>));58static_assert(__is_same(common_reference_base<char>, type_identity<char>));59static_assert(__is_same(common_reference_base<int>, type_identity<int>));60static_assert(__is_same(common_reference_base<const int>, type_identity<const int>));61static_assert(__is_same(common_reference_base<volatile int>, type_identity<volatile int>));62static_assert(__is_same(common_reference_base<const volatile int>, type_identity<const volatile int>));63static_assert(__is_same(common_reference_base<int[]>, type_identity<int[]>));64static_assert(__is_same(common_reference_base<const int[]>, type_identity<const int[]>));65static_assert(__is_same(common_reference_base<void(&)()>, type_identity<void(&)()>));66 67static_assert(__is_same(common_reference_base<int[], int[]>, type_identity<int*>));68static_assert(__is_same(common_reference_base<int, int>, type_identity<int>));69static_assert(__is_same(common_reference_base<int, long>, type_identity<long>));70static_assert(__is_same(common_reference_base<long, int>, type_identity<long>));71static_assert(__is_same(common_reference_base<long, long>, type_identity<long>));72 73static_assert(__is_same(common_reference_base<const int, long>, type_identity<long>));74static_assert(__is_same(common_reference_base<const volatile int, long>, type_identity<long>));75static_assert(__is_same(common_reference_base<int, const long>, type_identity<long>));76static_assert(__is_same(common_reference_base<int, const volatile long>, type_identity<long>));77 78static_assert(__is_same(common_reference_base<int*, long*>, empty_type));79static_assert(__is_same(common_reference_base<const unsigned int *const &, const unsigned int *const &>, type_identity<const unsigned int *const &>));80 81static_assert(__is_same(common_reference_base<int, long, float>, type_identity<float>));82static_assert(__is_same(common_reference_base<unsigned, char, long>, type_identity<long>));83static_assert(__is_same(common_reference_base<long long, long long, long>, type_identity<long long>));84 85static_assert(__is_same(common_reference_base<int [[clang::address_space(1)]]>, type_identity<int [[clang::address_space(1)]]>));86static_assert(__is_same(common_reference_base<int [[clang::address_space(1)]], int>, type_identity<int>));87static_assert(__is_same(common_reference_base<long [[clang::address_space(1)]], int>, type_identity<long>));88static_assert(__is_same(common_reference_base<long [[clang::address_space(1)]], int [[clang::address_space(1)]]>, type_identity<long>));89static_assert(__is_same(common_reference_base<long [[clang::address_space(1)]], long [[clang::address_space(1)]]>, type_identity<long>));90static_assert(__is_same(common_reference_base<long [[clang::address_space(1)]], long [[clang::address_space(2)]]>, type_identity<long>));91 92struct S {};93struct T : S {};94struct U {};95 96static_assert(__is_same(common_reference_base<S&&, T&&>, type_identity<S&&>));97 98static_assert(__is_same(common_reference_base<int S::*, int S::*>, type_identity<int S::*>));99static_assert(__is_same(common_reference_base<int S::*, int T::*>, type_identity<int T::*>));100static_assert(__is_same(common_reference_base<int S::*, long S::*>, empty_type));101 102static_assert(__is_same(common_reference_base<int (S::*)(), int (S::*)()>, type_identity<int (S::*)()>));103static_assert(__is_same(common_reference_base<int (S::*)(), int (T::*)()>, type_identity<int (T::*)()>));104static_assert(__is_same(common_reference_base<int (S::*)(), long (S::*)()>, empty_type));105 106static_assert(__is_same(common_reference_base<int&, int&>, type_identity<int&>));107static_assert(__is_same(common_reference_base<int&, const int&>, type_identity<const int&>));108static_assert(__is_same(common_reference_base<volatile int&, const int&>, type_identity<const volatile int&>));109 110template <class T, class U>111struct my_pair;112 113template <class T1, class U1, class T2, class U2, template <class> class TX, template <class> class UX>114struct basic_common_reference<my_pair<T1, U1>, my_pair<T2, U2>, TX, UX> {115  using type = my_pair<common_reference_t<TX<T1>, UX<T2>>, common_reference_t<TX<U1>, UX<U2>>>;116};117 118static_assert(__is_same(common_reference_base<my_pair<const int&, int&>, my_pair<int&, volatile int&>>, type_identity<my_pair<const int&, volatile int&>>));119static_assert(__is_same(common_reference_base<const my_pair<int, int>&, my_pair<int&, volatile int&>>, type_identity<my_pair<const int&, const volatile int&>>));120static_assert(__is_same(common_reference_base<const int&, const volatile int&>, type_identity<const volatile int&>));121static_assert(__is_same(common_reference_base<int&&, const volatile int&>, type_identity<int>));122static_assert(__is_same(common_reference_base<my_pair<int, int>&&, my_pair<int&, volatile int&>>, type_identity<my_pair<const int&, int>>));123static_assert(__is_same(common_reference_base<my_pair<int, int>&&, my_pair<int&, int>&&>, type_identity<my_pair<const int&, int&&>>));124 125struct conversion_operator {126  operator volatile int&&() volatile;127};128 129static_assert(__is_same(common_reference_base<volatile conversion_operator&&, volatile int&&>, type_identity<volatile int&&>));130 131struct reference_wrapper {132  reference_wrapper(int&);133  operator int&() const;134};135 136static_assert(__is_same(common_reference_base<const reference_wrapper&, int&>, empty_type));137