13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 2fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson 3fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssonnamespace PR5557 { 4fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssontemplate <class T> struct A { 5fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson A(); 6a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor virtual void anchor(); 7fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson virtual int a(T x); 8fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson}; 9fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssontemplate<class T> A<T>::A() {} 10a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregortemplate<class T> void A<T>::anchor() { } 11a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor 12fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssontemplate<class T> int A<T>::a(T x) { 13fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson return *x; // expected-error{{requires pointer operand}} 14fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson} 15fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson 16a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregorvoid f(A<int> x) { 17a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor x.anchor(); // expected-note{{instantiation}} 18a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor} 19fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson 20fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssontemplate<typename T> 21fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssonstruct X { 22fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson virtual void f(); 23fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson}; 24fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson 25fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssontemplate<> 26fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlssonvoid X<int>::f() { } 27fce5f79b3a28f1f8c4abab4f31fbd5c803ddf75cAnders Carlsson} 28a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor 29a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregortemplate<typename T> 30a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregorstruct Base { 31a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor virtual ~Base() { 32a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor int *ptr = 0; 33a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor T t = ptr; // expected-error{{cannot initialize}} 34a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor } 35a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor}; 36a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor 37a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregortemplate<typename T> 38a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregorstruct Derived : Base<T> { 39ce2bc7ec5f6946884588f8adc194e52b30a2554aJohn McCall virtual void foo() { } 40a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor}; 41a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor 42ce2bc7ec5f6946884588f8adc194e52b30a2554aJohn McCalltemplate struct Derived<int>; // expected-note {{in instantiation of member function 'Base<int>::~Base' requested here}} 43a3da2548a6ef2c8af00b84d00868ac8ef665e953Douglas Gregor 44523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregortemplate<typename T> 45523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregorstruct HasOutOfLineKey { 46a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor HasOutOfLineKey() { } 47523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregor virtual T *f(float *fp); 48523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregor}; 49523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregor 50523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregortemplate<typename T> 51523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas GregorT *HasOutOfLineKey<T>::f(float *fp) { 52523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregor return fp; // expected-error{{cannot initialize return object of type 'int *' with an lvalue of type 'float *'}} 53523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregor} 54523e1537f65f1a591a9a7c4706c199d6c796fa0aDouglas Gregor 55a78927d6476067d6c7a68d6bc21c93d66f265594Douglas GregorHasOutOfLineKey<int> out_of_line; // expected-note{{in instantiation of member function 'HasOutOfLineKey<int>::f' requested here}} 56a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 57a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregornamespace std { 58a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor class type_info; 59a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor} 60a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 61a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregornamespace PR7114 { 62a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor class A { virtual ~A(); }; // expected-note{{declared private here}} 63a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 64a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor template<typename T> 65a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor class B { 66a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor public: 67a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor class Inner : public A { }; // expected-error{{base class 'PR7114::A' has private destructor}} 68a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor static Inner i; 69a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor static const unsigned value = sizeof(i) == 4; 70a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor }; 71a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 72a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor int f() { return B<int>::value; } 73a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 74a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor void test_typeid(B<float>::Inner bfi) { 75a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor (void)typeid(bfi); // expected-note{{implicit default destructor}} 76a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor } 77a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 78a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor template<typename T> 79a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor struct X : A { 80a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor void f() { } 81a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor }; 82a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor 83a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor void test_X(X<int> xi, X<float> xf) { 84a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor xi.f(); 85a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor } 86a78927d6476067d6c7a68d6bc21c93d66f265594Douglas Gregor} 87