// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -std=c++11 %s
classA{virtualvoidf();virtualvoidg()=0;// expected-note{{unimplemented pure virtual method 'g' in 'A'}}
voidh()=0;// expected-error {{'h' is not virtual and cannot be declared pure}}
voidi()=1;// expected-error {{initializer on function does not look like a pure-specifier}}
voidj()=0u;// expected-error {{initializer on function does not look like a pure-specifier}}
voidk();public:A(int);};virtualvoidA::k(){}// expected-error{{'virtual' can only be specified inside the class definition}}
classB:publicA{// Needs to recognize that overridden function is virtual.
voidg()=0;// Needs to recognize that function does not override.
voidg(int)=0;// expected-error{{'g' is not virtual and cannot be declared pure}}
};// Needs to recognize invalid uses of abstract classes.
A fn(A)// expected-error{{parameter type 'A' is an abstract class}} \
// expected-error{{return type 'A' is an abstract class}}
{
A a;// expected-error{{variable type 'A' is an abstract class}}
(void)static_cast<A>(0);// expected-error{{allocating an object of abstract class type 'A'}}
try{}catch(A){// expected-error{{variable type 'A' is an abstract class}}
}}namespacerdar9670557{typedefintfunc(int);
func *a();structX{virtual func f =0;virtualfunc(g)=0;
func *h =0;};}namespacepr8264{structTest{virtualvirtualvoidfunc();// expected-warning {{duplicate 'virtual' declaration specifier}}
};}namespaceVirtualFriend{// DR (filed but no number yet): reject meaningless pure-specifier on a friend declaration.
structA{virtualintf();};structB{friendintA::f()=0;};// expected-error {{friend declaration cannot have a pure-specifier}}
structC{virtualintf();friendint C::f()=0;// expected-error {{friend declaration cannot have a pure-specifier}}
};}