| // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s |
| // rdar://12095239 |
| // rdar://14261999 |
| |
| class CppAbstractBase { |
| public: |
| virtual void testA() = 0; |
| virtual void testB() = 0; // expected-note {{unimplemented pure virtual method 'testB' in 'CppConcreteSub}} |
| int a; |
| }; |
| |
| class CppConcreteSub : public CppAbstractBase { |
| virtual void testA() { } |
| }; |
| |
| @interface Objc { |
| CppConcreteSub _concrete; // expected-error{{instance variable type 'CppConcreteSub' is an abstract class}} |
| } |
| - (CppAbstractBase*)abstract; |
| @property (nonatomic, readonly) const CppConcreteSub Prop; // expected-note {{property declared here}} |
| @end |
| |
| @implementation Objc |
| - (CppAbstractBase*)abstract { |
| return &_concrete; |
| } |
| @synthesize Prop; // expected-error {{synthesized instance variable type 'const CppConcreteSub' is an abstract class}} |
| @end |
| |
| class Cpp { |
| public: |
| CppConcreteSub sub; // expected-error {{field type 'CppConcreteSub' is an abstract class}} |
| }; |