brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.2 KiB · 8f2b97b Raw
245 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_type)5#  error6#endif7 8// expected-note@*:* {{template declaration from hidden source: template <template <class ...> class, template <class> class, class, class ...>}}9 10void test() {11  __builtin_common_type<> a; // expected-error {{too few template arguments for template '__builtin_common_type'}}12  __builtin_common_type<1> b; // expected-error {{template argument for template template parameter must be a class template or type alias template}}13  __builtin_common_type<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 29void test_vla() {30  int i = 4;31  int VLA[i];32  __builtin_common_type<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}}33}34 35template <class... Args>36using common_type_base = __builtin_common_type<common_type_t, type_identity, empty_type, Args...>;37// expected-note@-1 {{in instantiation of default function argument expression for 'InvalidConversion<void>' required here}}38 39template <class... Args>40struct common_type : common_type_base<Args...> {};41 42struct Incomplete;43 44template<>45struct common_type<Incomplete, Incomplete>;46 47static_assert(__is_same(common_type_base<>, empty_type));48static_assert(__is_same(common_type_base<Incomplete>, empty_type));49static_assert(__is_same(common_type_base<char>, type_identity<char>));50static_assert(__is_same(common_type_base<int>, type_identity<int>));51static_assert(__is_same(common_type_base<const int>, type_identity<int>));52static_assert(__is_same(common_type_base<volatile int>, type_identity<int>));53static_assert(__is_same(common_type_base<const volatile int>, type_identity<int>));54static_assert(__is_same(common_type_base<int[]>, type_identity<int*>));55static_assert(__is_same(common_type_base<const int[]>, type_identity<const int*>));56static_assert(__is_same(common_type_base<void(&)()>, type_identity<void(*)()>));57static_assert(__is_same(common_type_base<int[], int[]>, type_identity<int*>));58 59static_assert(__is_same(common_type_base<int, int>, type_identity<int>));60static_assert(__is_same(common_type_base<int, long>, type_identity<long>));61static_assert(__is_same(common_type_base<long, int>, type_identity<long>));62static_assert(__is_same(common_type_base<long, long>, type_identity<long>));63 64static_assert(__is_same(common_type_base<const int, long>, type_identity<long>));65static_assert(__is_same(common_type_base<const volatile int, long>, type_identity<long>));66static_assert(__is_same(common_type_base<int, const long>, type_identity<long>));67static_assert(__is_same(common_type_base<int, const volatile long>, type_identity<long>));68 69static_assert(__is_same(common_type_base<int*, long*>, empty_type));70 71static_assert(__is_same(common_type_base<int, long, float>, type_identity<float>));72static_assert(__is_same(common_type_base<unsigned, char, long>, type_identity<long>));73static_assert(__is_same(common_type_base<long long, long long, long>, type_identity<long long>));74 75static_assert(__is_same(common_type_base<int [[clang::address_space(1)]]>, type_identity<int [[clang::address_space(1)]]>));76static_assert(__is_same(common_type_base<int [[clang::address_space(1)]], int>, type_identity<int>));77static_assert(__is_same(common_type_base<long [[clang::address_space(1)]], int>, type_identity<long>));78static_assert(__is_same(common_type_base<long [[clang::address_space(1)]], int [[clang::address_space(1)]]>, type_identity<long>));79static_assert(__is_same(common_type_base<long [[clang::address_space(1)]], long [[clang::address_space(1)]]>, type_identity<long [[clang::address_space(1)]]>));80static_assert(__is_same(common_type_base<long [[clang::address_space(1)]], long [[clang::address_space(2)]]>, type_identity<long>));81 82struct S {};83struct T : S {};84 85static_assert(__is_same(common_type_base<int S::*, int S::*>, type_identity<int S::*>));86static_assert(__is_same(common_type_base<int S::*, int T::*>, type_identity<int T::*>));87static_assert(__is_same(common_type_base<int S::*, long S::*>, empty_type));88 89static_assert(__is_same(common_type_base<int (S::*)(), int (S::*)()>, type_identity<int (S::*)()>));90static_assert(__is_same(common_type_base<int (S::*)(), int (T::*)()>, type_identity<int (T::*)()>));91static_assert(__is_same(common_type_base<int (S::*)(), long (S::*)()>, empty_type));92 93struct NoCommonType {};94 95template <>96struct common_type<NoCommonType, NoCommonType> {};97 98struct CommonTypeInt {};99 100template <>101struct common_type<CommonTypeInt, CommonTypeInt> {102  using type = int;103};104 105template <>106struct common_type<CommonTypeInt, int> {107  using type = int;108};109 110template <>111struct common_type<int, CommonTypeInt> {112  using type = int;113};114 115static_assert(__is_same(common_type_base<NoCommonType>, empty_type));116static_assert(__is_same(common_type_base<CommonTypeInt>, type_identity<int>));117static_assert(__is_same(common_type_base<NoCommonType, NoCommonType, NoCommonType>, empty_type));118static_assert(__is_same(common_type_base<CommonTypeInt, CommonTypeInt, CommonTypeInt>, type_identity<int>));119static_assert(__is_same(common_type_base<CommonTypeInt&, CommonTypeInt&&>, type_identity<int>));120 121static_assert(__is_same(common_type_base<void, int>, empty_type));122static_assert(__is_same(common_type_base<void, void>, type_identity<void>));123static_assert(__is_same(common_type_base<const void, void>, type_identity<void>));124static_assert(__is_same(common_type_base<void, const void>, type_identity<void>));125 126template <class T>127struct ConvertibleTo {128  operator T();129};130 131static_assert(__is_same(common_type_base<ConvertibleTo<int>>, type_identity<ConvertibleTo<int>>));132static_assert(__is_same(common_type_base<ConvertibleTo<int>, int>, type_identity<int>));133static_assert(__is_same(common_type_base<ConvertibleTo<int&>, ConvertibleTo<long&>>, type_identity<long>));134 135struct ConvertibleToB;136 137struct ConvertibleToA {138  operator ConvertibleToB();139};140 141struct ConvertibleToB {142  operator ConvertibleToA();143};144 145static_assert(__is_same(common_type_base<ConvertibleToA, ConvertibleToB>, empty_type));146 147struct const_ref_convertible {148  operator int&() const &;149  operator int&() && = delete;150};151 152#if __cplusplus >= 202002L153static_assert(__is_same(common_type_base<const_ref_convertible, int &>, type_identity<int>));154#else155static_assert(__is_same(common_type_base<const_ref_convertible, int &>, empty_type));156#endif157 158struct WeirdConvertible_1p2_p3 {};159 160struct WeirdConvertible3 {161  operator WeirdConvertible_1p2_p3();162};163 164struct WeirdConvertible1p2 {165  operator WeirdConvertible_1p2_p3();166};167 168template <>169struct common_type<WeirdConvertible3, WeirdConvertible1p2> {170  using type = WeirdConvertible_1p2_p3;171};172 173template <>174struct common_type<WeirdConvertible1p2, WeirdConvertible3> {175  using type = WeirdConvertible_1p2_p3;176};177 178struct WeirdConvertible1 {179  operator WeirdConvertible1p2();180};181 182struct WeirdConvertible2 {183  operator WeirdConvertible1p2();184};185 186template <>187struct common_type<WeirdConvertible1, WeirdConvertible2> {188  using type = WeirdConvertible1p2;189};190 191template <>192struct common_type<WeirdConvertible2, WeirdConvertible1> {193  using type = WeirdConvertible1p2;194};195 196static_assert(__is_same(common_type_base<WeirdConvertible1, WeirdConvertible2, WeirdConvertible3>,197                        type_identity<WeirdConvertible_1p2_p3>));198 199struct PrivateTypeMember200{201  operator int();202};203 204template<>205struct common_type<PrivateTypeMember, PrivateTypeMember>206{207private:208  using type = int;209};210 211static_assert(__is_same(common_type_base<PrivateTypeMember, PrivateTypeMember, PrivateTypeMember>, empty_type));212 213class PrivateConstructor {214private:215  PrivateConstructor(int);216};217 218static_assert(__is_same(common_type_base<int, PrivateConstructor>, empty_type));219 220// expected-note@+1 {{in instantiation of template type alias 'common_type_base' requested here}}221template<typename A, typename B, typename Res = common_type_base<A, B>>222static Res common_type_sfinae();223// expected-note@-1 {{in instantiation of default argument for 'common_type_sfinae<int, InvalidConversion>' required here}}224 225// Make sure we don't emit "calling a private constructor" in SFINAE context ...226static_assert(__is_same(decltype(common_type_sfinae<int, PrivateConstructor>()), empty_type));227 228// ... but we still emit errors outside of the immediate context.229template<typename T>230struct Member {231  T t; // expected-error {{field has incomplete type 'void'}}232};233 234// The conversion from int has a non-SFINAE error.235class InvalidConversion {236private:237  template<typename T = void>238  InvalidConversion(int, Member<T> = {});239    // expected-note@-1 {{in instantiation of template class 'Member<void>' requested here}}240    // expected-note@-2 {{passing argument to parameter here}}241};242 243// expected-note@+1 {{while substituting deduced template arguments into function template 'common_type_sfinae'}}244static_assert(__is_same(decltype(common_type_sfinae<int, InvalidConversion>()), empty_type));245