xref: /llvm-project/clang/test/SemaObjCXX/abstract-class-type-ivar.mm (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2
3class CppAbstractBase {
4public:
5    virtual void testA() = 0;
6    virtual void testB() = 0; // expected-note {{unimplemented pure virtual method 'testB' in 'CppConcreteSub}}
7    int a;
8};
9
10class CppConcreteSub : public CppAbstractBase {
11    virtual void testA() { }
12};
13
14@interface Objc  {
15    CppConcreteSub _concrete; // expected-error{{instance variable type 'CppConcreteSub' is an abstract class}}
16}
17- (CppAbstractBase*)abstract;
18@property (nonatomic, readonly) const CppConcreteSub Prop;  // expected-note {{property declared here}}
19@end
20
21@implementation Objc
22- (CppAbstractBase*)abstract {
23    return &_concrete;
24}
25@synthesize Prop; // expected-error {{synthesized instance variable type 'const CppConcreteSub' is an abstract class}}
26@end
27
28class Cpp {
29public:
30    CppConcreteSub sub; // expected-error {{field type 'CppConcreteSub' is an abstract class}}
31};
32