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