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