]> granicus.if.org Git - clang/commitdiff
Objective-C: diagnose when synthesizing an ivar of
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 5 Jul 2013 17:18:11 +0000 (17:18 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 5 Jul 2013 17:18:11 +0000 (17:18 +0000)
abstract class type. // rdar://14261999

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185710 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Sema.h
lib/Sema/SemaObjCProperty.cpp
test/SemaObjCXX/abstract-class-type-ivar.mm

index 6b8ac2aee1e62b183493dd03f7cfa1bf19797709..6574518044aab75200ed090e3d8272e6fc9068a3 100644 (file)
@@ -911,7 +911,8 @@ def err_invalid_base_in_interface : Error<
   "%select{'struct|non-public 'interface|'class}0 %1'">;
 
 def err_abstract_type_in_decl : Error<
-  "%select{return|parameter|variable|field|instance variable}0 type %1 is an abstract class">;
+  "%select{return|parameter|variable|field|instance variable|"
+  "synthesized instance variable}0 type %1 is an abstract class">;
 def err_allocation_of_abstract_type : Error<
   "allocating an object of abstract class type %0">;
 def err_throw_abstract_type : Error<
index 9c8c1c71c06546bb1d433d543a2c9181af50e4ff..08c8ade33b7efc0fce6ea5489991d81d32614ed2 100644 (file)
@@ -4835,6 +4835,7 @@ public:
     AbstractVariableType,
     AbstractFieldType,
     AbstractIvarType,
+    AbstractSynthesizedIvarType,
     AbstractArrayType
   };
 
index 7b8aba957daa7fae105b0a40335ca01c8e101610..ff5f7a58927920773572b198677fcee37f267450 100644 (file)
@@ -1082,8 +1082,14 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
                                   PropertyIvarType, /*Dinfo=*/0,
                                   ObjCIvarDecl::Private,
                                   (Expr *)0, true);
-      if (CompleteTypeErr)
+      if (RequireNonAbstractType(PropertyIvarLoc,
+                                 PropertyIvarType,
+                                 diag::err_abstract_type_in_decl,
+                                 AbstractSynthesizedIvarType)) {
+        Diag(property->getLocation(), diag::note_property_declare);
         Ivar->setInvalidDecl();
+      } else if (CompleteTypeErr)
+          Ivar->setInvalidDecl();
       ClassImpDecl->addDecl(Ivar);
       IDecl->makeDeclVisibleInContext(Ivar);
 
index 990ba1c2abd5e85bceae4d61e59186d181dcc406..35787e655f6a23184e5f8804192f5b8ee9835d7f 100644 (file)
@@ -1,5 +1,6 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
 // rdar://12095239
+// rdar://14261999
 
 class CppAbstractBase {
 public:
@@ -16,11 +17,14 @@ class CppConcreteSub : public CppAbstractBase {
     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 {