1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -std=c++11 %s 2*67e74705SXin Li 3*67e74705SXin Li class A { 4*67e74705SXin Li virtual void f(); 5*67e74705SXin Li virtual void g() = 0; // expected-note{{unimplemented pure virtual method 'g' in 'A'}} 6*67e74705SXin Li 7*67e74705SXin Li void h() = 0; // expected-error {{'h' is not virtual and cannot be declared pure}} 8*67e74705SXin Li void i() = 1; // expected-error {{initializer on function does not look like a pure-specifier}} 9*67e74705SXin Li void j() = 0u; // expected-error {{initializer on function does not look like a pure-specifier}} 10*67e74705SXin Li 11*67e74705SXin Li 12*67e74705SXin Li void k(); 13*67e74705SXin Li 14*67e74705SXin Li public: 15*67e74705SXin Li A(int); 16*67e74705SXin Li }; 17*67e74705SXin Li k()18*67e74705SXin Livirtual void A::k() { } // expected-error{{'virtual' can only be specified inside the class definition}} 19*67e74705SXin Li 20*67e74705SXin Li class B : public A { 21*67e74705SXin Li // Needs to recognize that overridden function is virtual. 22*67e74705SXin Li void g() = 0; 23*67e74705SXin Li 24*67e74705SXin Li // Needs to recognize that function does not override. 25*67e74705SXin Li void g(int) = 0; // expected-error{{'g' is not virtual and cannot be declared pure}} 26*67e74705SXin Li }; 27*67e74705SXin Li 28*67e74705SXin Li // Needs to recognize invalid uses of abstract classes. fn(A)29*67e74705SXin LiA fn(A) // expected-error{{parameter type 'A' is an abstract class}} \ 30*67e74705SXin Li // expected-error{{return type 'A' is an abstract class}} 31*67e74705SXin Li { 32*67e74705SXin Li A a; // expected-error{{variable type 'A' is an abstract class}} 33*67e74705SXin Li (void)static_cast<A>(0); // expected-error{{allocating an object of abstract class type 'A'}} 34*67e74705SXin Li try { 35*67e74705SXin Li } catch(A) { // expected-error{{variable type 'A' is an abstract class}} 36*67e74705SXin Li } 37*67e74705SXin Li } 38*67e74705SXin Li 39*67e74705SXin Li namespace rdar9670557 { 40*67e74705SXin Li typedef int func(int); 41*67e74705SXin Li func *a(); 42*67e74705SXin Li struct X { 43*67e74705SXin Li virtual func f = 0; 44*67e74705SXin Li virtual func (g) = 0; 45*67e74705SXin Li func *h = 0; 46*67e74705SXin Li }; 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li namespace pr8264 { 50*67e74705SXin Li struct Test { 51*67e74705SXin Li virtual virtual void func(); // expected-warning {{duplicate 'virtual' declaration specifier}} 52*67e74705SXin Li }; 53*67e74705SXin Li } 54*67e74705SXin Li 55*67e74705SXin Li namespace VirtualFriend { 56*67e74705SXin Li // DR (filed but no number yet): reject meaningless pure-specifier on a friend declaration. 57*67e74705SXin Li struct A { virtual int f(); }; 58*67e74705SXin Li struct B { friend int A::f() = 0; }; // expected-error {{friend declaration cannot have a pure-specifier}} 59*67e74705SXin Li struct C { 60*67e74705SXin Li virtual int f(); 61*67e74705SXin Li friend int C::f() = 0; // expected-error {{friend declaration cannot have a pure-specifier}} 62*67e74705SXin Li }; 63*67e74705SXin Li } 64