1cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -Wabstract-vbase-init
267e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
367e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson#ifndef __GXX_EXPERIMENTAL_CXX0X__
467e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson#define __CONCAT(__X, __Y) __CONCAT1(__X, __Y)
567e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson#define __CONCAT1(__X, __Y) __X ## __Y
667e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
767e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson#define static_assert(__b, __m) \
867e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson  typedef int __CONCAT(__sa, __LINE__)[__b ? 1 : -1]
967e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson#endif
1067e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
1167e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlssonclass C {
1245f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth  virtual void f() = 0; // expected-note {{unimplemented pure virtual method 'f'}}
1367e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson};
1467e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
1567e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlssonstatic_assert(__is_abstract(C), "C has a pure virtual function");
1667e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
1767e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlssonclass D : C {
1867e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson};
1967e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
2067e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlssonstatic_assert(__is_abstract(D), "D inherits from an abstract class");
2167e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
2267e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlssonclass E : D {
231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void f();
2467e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson};
2567e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlsson
2667e4dd2e9936d828d68b20e01922b6442c6ce31bAnders Carlssonstatic_assert(!__is_abstract(E), "E inherits from an abstract class but implements f");
274681ebd429846ed98e7beaf49934fa347ff22152Anders Carlsson
280a8709a4744f6a80a006edf78b27597d9232ee30Chandler CarruthC *d = new C; // expected-error {{allocating an object of abstract class type 'C'}}
29b9bbe49f513080b3307e88bdee0d383f4b8c1d4eAnders Carlsson
304681ebd429846ed98e7beaf49934fa347ff22152Anders CarlssonC c; // expected-error {{variable type 'C' is an abstract class}}
314681ebd429846ed98e7beaf49934fa347ff22152Anders Carlssonvoid t1(C c); // expected-error {{parameter type 'C' is an abstract class}}
324681ebd429846ed98e7beaf49934fa347ff22152Anders Carlssonvoid t2(C); // expected-error {{parameter type 'C' is an abstract class}}
334681ebd429846ed98e7beaf49934fa347ff22152Anders Carlsson
344681ebd429846ed98e7beaf49934fa347ff22152Anders Carlssonstruct S {
354681ebd429846ed98e7beaf49934fa347ff22152Anders Carlsson  C c; // expected-error {{field type 'C' is an abstract class}}
364681ebd429846ed98e7beaf49934fa347ff22152Anders Carlsson};
37b9bbe49f513080b3307e88bdee0d383f4b8c1d4eAnders Carlsson
3811f21a08cd40caec93e088c404bbf3136917a035Anders Carlssonvoid t3(const C&);
3911f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson
4011f21a08cd40caec93e088c404bbf3136917a035Anders Carlssonvoid f() {
410a8709a4744f6a80a006edf78b27597d9232ee30Chandler Carruth  C(); // expected-error {{allocating an object of abstract class type 'C'}}
420a8709a4744f6a80a006edf78b27597d9232ee30Chandler Carruth  t3(C()); // expected-error {{allocating an object of abstract class type 'C'}}
4311f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson}
4411f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson
45138bb2366baa3856088bae94f36f2d96b2c995b9Douglas GregorC e1[2]; // expected-error {{array of abstract class type 'C'}}
46138bb2366baa3856088bae94f36f2d96b2c995b9Douglas GregorC (*e2)[2]; // expected-error {{array of abstract class type 'C'}}
47138bb2366baa3856088bae94f36f2d96b2c995b9Douglas GregorC (**e3)[2]; // expected-error {{array of abstract class type 'C'}}
4811f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson
49138bb2366baa3856088bae94f36f2d96b2c995b9Douglas Gregorvoid t4(C c[2]); // expected-error {{array of abstract class type 'C'}}
5011f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson
5111f21a08cd40caec93e088c404bbf3136917a035Anders Carlssonvoid t5(void (*)(C)); // expected-error {{parameter type 'C' is an abstract class}}
5211f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson
5311f21a08cd40caec93e088c404bbf3136917a035Anders Carlssontypedef void (*Func)(C); // expected-error {{parameter type 'C' is an abstract class}}
5411f21a08cd40caec93e088c404bbf3136917a035Anders Carlssonvoid t6(Func);
5511f21a08cd40caec93e088c404bbf3136917a035Anders Carlsson
568211effbd3abc5948a5d6924c87e72323016a376Anders Carlssonclass F {
571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  F a() { while (1) {} } // expected-error {{return type 'F' is an abstract class}}
588211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  class D {
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void f(F c); // expected-error {{parameter type 'F' is an abstract class}}
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  };
628211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  union U {
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void u(F c); // expected-error {{parameter type 'F' is an abstract class}}
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  };
668211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson
6745f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth  virtual void f() = 0; // expected-note {{unimplemented pure virtual method 'f'}}
688211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson};
69e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson
7094c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall// Diagnosing in these cases is prohibitively expensive.  We still
7194c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall// diagnose at the function definition, of course.
7294c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall
73e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlssonclass Abstract;
74e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson
7594c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCallvoid t7(Abstract a);
76e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson
77e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlssonvoid t8() {
7894c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  void h(Abstract a);
79e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson}
80e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson
81e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlssonnamespace N {
8294c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCallvoid h(Abstract a);
83e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson}
84e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson
85e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlssonclass Abstract {
8694c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  virtual void f() = 0;
87e65a3c8f181adc42786e0a409cd1e827f4ab37ffAnders Carlsson};
888ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlsson
898ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlsson// <rdar://problem/6854087>
908ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlssonclass foo {
918ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlssonpublic:
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual foo *getFoo() = 0;
938ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlsson};
948ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlsson
958ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlssonclass bar : public foo {
968ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlssonpublic:
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual bar *getFoo();
988ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlsson};
998ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlsson
1008ff8c2278cf5ef26e40314dfbb363e32542da032Anders Carlssonbar x;
101d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson
102d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson// <rdar://problem/6902298>
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass A {
104d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlssonpublic:
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void release() = 0;
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void release(int count) = 0;
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void retain() = 0;
108d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson};
109d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass B : public A {
111d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlssonpublic:
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void release();
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void release(int count);
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual void retain();
115d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson};
116d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid foo(void) {
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  B b;
119d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson}
120d12ef8d142868889867f9dd968b5f3ea02d463c1Anders Carlsson
121f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlssonstruct K {
122f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlsson int f;
123f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlsson virtual ~K();
124f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlsson};
125f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlsson
126f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlssonstruct L : public K {
127f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlsson void f();
128f89bb0fa8b2b806b0a3ad23619c1f5acb4aa952aAnders Carlsson};
1292782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson
1302782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson// PR5222
1312782302961b6f57316b1ece494c7135b65e18b30Anders Carlssonnamespace PR5222 {
1322782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  struct A {
1332782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson    virtual A *clone() = 0;
1342782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  };
1352782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  struct B : public A {
1362782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson    virtual B *clone() = 0;
1372782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  };
1382782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  struct C : public B {
1392782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson    virtual C *clone();
1402782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  };
1412782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson
1422782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson  C c;
1432782302961b6f57316b1ece494c7135b65e18b30Anders Carlsson}
144a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl
145a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl// PR5550 - instantiating template didn't track overridden methods
146a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redlnamespace PR5550 {
147a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  struct A {
148a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl    virtual void a() = 0;
149a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl    virtual void b() = 0;
150a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  };
151a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  template<typename T> struct B : public A {
152a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl    virtual void b();
153a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl    virtual void c() = 0;
154a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  };
155a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  struct C : public B<int> {
156a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl    virtual void a();
157a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl    virtual void c();
158a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  };
159a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl  C x;
160a165da09c0313309d2d4dda42d0b2d4096a372a1Sebastian Redl}
161ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman
162ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedmannamespace PureImplicit {
163ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  // A pure virtual destructor should be implicitly overridden.
164ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  struct A { virtual ~A() = 0; };
165ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  struct B : A {};
166ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  B x;
167ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman
168ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  // A pure virtual assignment operator should be implicitly overridden.
169ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  struct D;
170ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  struct C { virtual D& operator=(const D&) = 0; };
171ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  struct D : C {};
172ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman  D y;
173ff2d87840df9f269d8a2f9df27518548da3d40f1Eli Friedman}
17452a02758fb81723e16c46721152c6ad0528b2fc3John McCall
17552a02758fb81723e16c46721152c6ad0528b2fc3John McCallnamespace test1 {
17652a02758fb81723e16c46721152c6ad0528b2fc3John McCall  struct A {
17752a02758fb81723e16c46721152c6ad0528b2fc3John McCall    virtual void foo() = 0;
17852a02758fb81723e16c46721152c6ad0528b2fc3John McCall  };
17952a02758fb81723e16c46721152c6ad0528b2fc3John McCall
18052a02758fb81723e16c46721152c6ad0528b2fc3John McCall  struct B : A {
18152a02758fb81723e16c46721152c6ad0528b2fc3John McCall    using A::foo;
18252a02758fb81723e16c46721152c6ad0528b2fc3John McCall  };
18352a02758fb81723e16c46721152c6ad0528b2fc3John McCall
18452a02758fb81723e16c46721152c6ad0528b2fc3John McCall  struct C : B {
18552a02758fb81723e16c46721152c6ad0528b2fc3John McCall    void foo();
18652a02758fb81723e16c46721152c6ad0528b2fc3John McCall  };
18752a02758fb81723e16c46721152c6ad0528b2fc3John McCall
18852a02758fb81723e16c46721152c6ad0528b2fc3John McCall  void test() {
18952a02758fb81723e16c46721152c6ad0528b2fc3John McCall    C c;
19052a02758fb81723e16c46721152c6ad0528b2fc3John McCall  }
19152a02758fb81723e16c46721152c6ad0528b2fc3John McCall}
19294c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall
19394c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall// rdar://problem/8302168
19494c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCallnamespace test2 {
19594c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  struct X1 {
19645f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void xfunc(void) = 0;  // expected-note {{unimplemented pure virtual method}}
19794c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall    void g(X1 parm7);        // expected-error {{parameter type 'test2::X1' is an abstract class}}
19894c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall    void g(X1 parm8[2]);     // expected-error {{array of abstract class type 'test2::X1'}}
19994c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  };
20094c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall
20194c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  template <int N>
20294c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  struct X2 {
20345f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void xfunc(void) = 0;  // expected-note {{unimplemented pure virtual method}}
20494c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall    void g(X2 parm10);        // expected-error {{parameter type 'X2<N>' is an abstract class}}
20594c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall    void g(X2 parm11[2]);     // expected-error {{array of abstract class type 'X2<N>'}}
20694c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall  };
20794c3b561a4f24c5c44a1e2ee6f28f530e6a041baJohn McCall}
2086aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2096aa03e6dc72623f04af415527bf580ec189ab7f6John McCallnamespace test3 {
2106aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  struct A { // expected-note {{not complete until}}
2116aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    A x; // expected-error {{field has incomplete type}}
2126aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    virtual void abstract() = 0;
2136aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2146aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2156aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  struct B { // expected-note {{not complete until}}
2166aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    virtual void abstract() = 0;
2176aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    B x; // expected-error {{field has incomplete type}}
2186aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2196aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2206aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  struct C {
2216aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    static C x; // expected-error {{abstract class}}
22245f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
2236aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2246aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2256aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  struct D {
22645f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
2276aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    static D x; // expected-error {{abstract class}}
2286aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2296aa03e6dc72623f04af415527bf580ec189ab7f6John McCall}
2306aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2316aa03e6dc72623f04af415527bf580ec189ab7f6John McCallnamespace test4 {
2326aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  template <class T> struct A {
2336aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    A x; // expected-error {{abstract class}}
23445f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
2356aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2366aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2376aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  template <class T> struct B {
23845f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
2396aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    B x; // expected-error {{abstract class}}
2406aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2416aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2426aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  template <class T> struct C {
2436aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    static C x; // expected-error {{abstract class}}
24445f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
2456aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2466aa03e6dc72623f04af415527bf580ec189ab7f6John McCall
2476aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  template <class T> struct D {
24845f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth    virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
2496aa03e6dc72623f04af415527bf580ec189ab7f6John McCall    static D x; // expected-error {{abstract class}}
2506aa03e6dc72623f04af415527bf580ec189ab7f6John McCall  };
2516aa03e6dc72623f04af415527bf580ec189ab7f6John McCall}
2527019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor
253cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smithnamespace test5 {
254cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smith  struct A { A(int); virtual ~A() = 0; }; // expected-note {{pure virtual method}}
255cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smith  const A &a = 0; // expected-error {{abstract class}}
256cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smith  void f(const A &a = 0); // expected-error {{abstract class}}
257cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smith  void g() { f(0); } // expected-error {{abstract class}}
258cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smith}
259cfc57085a6eb8036d29164d4294cd95853ee1182Richard Smith
2607019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor// PR9247: Crash on invalid in clang::Sema::ActOnFinishCXXMemberSpecification
2617019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregornamespace pr9247 {
2627019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor  struct A {
2637019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor    virtual void g(const A& input) = 0;
2647019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor    struct B {
2657019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor      C* f(int foo);
2667019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor    };
2677019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor  };
2687019186f3c05539698b589a59729b0adfb8ea0a1Douglas Gregor}
26921eb6d4961abf710de3864a537655e9c57903803Aaron Ballman
27021eb6d4961abf710de3864a537655e9c57903803Aaron Ballmannamespace pr12658 {
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class C {
272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    public:
273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      C(int v){}
274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      virtual void f() = 0; // expected-note {{unimplemented pure virtual method 'f' in 'C'}}
275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void foo( C& c ) {}
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void bar( void ) {
280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    foo(C(99)); // expected-error {{allocating an object of abstract class type 'pr12658::C'}}
28121eb6d4961abf710de3864a537655e9c57903803Aaron Ballman  }
28221eb6d4961abf710de3864a537655e9c57903803Aaron Ballman}
283cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith
284cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smithnamespace pr16659 {
285cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct A {
286cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    A(int);
287cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    virtual void x() = 0; // expected-note {{unimplemented pure virtual method 'x' in 'RedundantInit'}}
288cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  };
289cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct B : virtual A {};
290cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct C : B {
291cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    C() : A(37) {}
292cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    void x() override {}
293cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  };
294cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith
295cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct X {
296cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    friend class Z;
297cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  private:
298cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    X &operator=(const X&);
299cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  };
300cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct Y : virtual X { // expected-note {{::X' has an inaccessible copy assignment}}
301cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    virtual ~Y() = 0;
302cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  };
303cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct Z : Y {}; // expected-note {{::Y' has a deleted copy assignment}}
304cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  void f(Z &a, const Z &b) { a = b; } // expected-error {{copy assignment operator is implicitly deleted}}
305cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith
306cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  struct RedundantInit : virtual A {
307cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith    RedundantInit() : A(0) {} // expected-warning {{initializer for virtual base class 'pr16659::A' of abstract class 'RedundantInit' will never be used}}
308cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith  };
309cbc820af7193e3ad9c71fbe6e3c8bd3c1166e540Richard Smith}
310