1 // RUN: %clang_cc1 -triple %itanium_abi_triple -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -triple %ms_abi_triple -DMSABI -fsyntax-only -verify %s 3 4 // Tests various places where requiring a complete type involves 5 // instantiation of that type. 6 7 template<typename T> 8 struct X { 9 X(T); 10 11 #ifdef MSABI 12 // expected-error@+2{{data member instantiated with function type 'long (long)'}} 13 #endif 14 T f; // expected-error{{data member instantiated with function type 'float (int)'}} \ 15 // expected-error{{data member instantiated with function type 'int (int)'}} \ 16 // expected-error{{data member instantiated with function type 'char (char)'}} \ 17 // expected-error{{data member instantiated with function type 'short (short)'}} \ 18 // expected-error{{data member instantiated with function type 'float (float)'}} 19 }; 20 21 X<int> f() { return 0; } 22 23 struct XField { 24 X<float(int)> xf; // expected-note{{in instantiation of template class 'X<float (int)>' requested here}} 25 }; 26 27 void test_subscript(X<double> *ptr1, X<int(int)> *ptr2, int i) { 28 (void)ptr1[i]; 29 (void)ptr2[i]; // expected-note{{in instantiation of template class 'X<int (int)>' requested here}} 30 } 31 32 void test_arith(X<signed char> *ptr1, X<unsigned char> *ptr2, 33 X<char(char)> *ptr3, X<short(short)> *ptr4) { 34 (void)(ptr1 + 5); 35 (void)(5 + ptr2); 36 (void)(ptr3 + 5); // expected-note{{in instantiation of template class 'X<char (char)>' requested here}} 37 (void)(5 + ptr4); // expected-note{{in instantiation of template class 'X<short (short)>' requested here}} 38 } 39 40 void test_new() { 41 (void)new X<float>(0); 42 (void)new X<float(float)>; // expected-note{{in instantiation of template class 'X<float (float)>' requested here}} 43 } 44 45 void test_memptr(X<long> *p1, long X<long>::*pm1, 46 X<long(long)> *p2, 47 #ifdef MSABI 48 long (X<long(long)>::*pm2)(long)) { // expected-note{{in instantiation of template class 'X<long (long)>' requested here}} 49 #else 50 long (X<long(long)>::*pm2)(long)) { 51 #endif 52 (void)(p1->*pm1); 53 } 54 55 // Reference binding to a base 56 template<typename T> 57 struct X1 { }; 58 59 template<typename T> 60 struct X2 : public T { }; 61 62 void refbind_base(X2<X1<int> > &x2) { 63 X1<int> &x1 = x2; 64 } 65 66 // Enumerate constructors for user-defined conversion. 67 template<typename T> 68 struct X3 { 69 X3(T); 70 }; 71 72 void enum_constructors(X1<float> &x1) { 73 X3<X1<float> > x3 = x1; 74 } 75 76 namespace PR6376 { 77 template<typename T, typename U> struct W { }; 78 79 template<typename T> 80 struct X { 81 template<typename U> 82 struct apply { 83 typedef W<T, U> type; 84 }; 85 }; 86 87 template<typename T, typename U> 88 struct Y : public X<T>::template apply<U>::type { }; 89 90 template struct Y<int, float>; 91 } 92 93 namespace TemporaryObjectCopy { 94 // Make sure we instantiate classes when we create a temporary copy. 95 template<typename T> 96 struct X { 97 X(T); 98 }; 99 100 template<typename T> 101 void f(T t) { 102 const X<int> &x = X<int>(t); 103 } 104 105 template void f(int); 106 } 107 108 namespace PR7080 { 109 template <class T, class U> 110 class X 111 { 112 typedef char true_t; 113 class false_t { char dummy[2]; }; 114 static true_t dispatch(U); 115 static false_t dispatch(...); 116 static T trigger(); 117 public: 118 enum { value = sizeof(dispatch(trigger())) == sizeof(true_t) }; 119 }; 120 121 template <class T> 122 class rv : public T 123 { }; 124 125 bool x = X<int, rv<int>&>::value; 126 } 127 128 namespace pr7199 { 129 template <class T> class A; // expected-note {{template is declared here}} 130 template <class T> class B { 131 class A<T>::C field; // expected-error {{implicit instantiation of undefined template 'pr7199::A<int>'}} 132 }; 133 134 template class B<int>; // expected-note {{in instantiation}} 135 } 136 137 namespace PR8425 { 138 template <typename T> 139 class BaseT {}; 140 141 template <typename T> 142 class DerivedT : public BaseT<T> {}; 143 144 template <typename T> 145 class FromT { 146 public: 147 operator DerivedT<T>() const { return DerivedT<T>(); } 148 }; 149 150 void test() { 151 FromT<int> ft; 152 BaseT<int> bt(ft); 153 } 154 } 155