]> granicus.if.org Git - clang/commitdiff
Patch to not build ivar ASTs when they are ilegally
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Apr 2010 22:43:48 +0000 (22:43 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Apr 2010 22:43:48 +0000 (22:43 +0000)
declared in categories.

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

lib/Parse/ParseObjc.cpp
lib/Sema/SemaDecl.cpp
test/SemaObjC/ivar-in-class-extension-error.m
test/SemaObjC/ivar-in-class-extension.m

index 243be0ed45aec71f890daab914ae41b37238ddc8..123a96261ad5d8891f359104dadd424f87a954a2 100644 (file)
@@ -1053,7 +1053,8 @@ void Parser::ParseObjCClassInstanceVariables(DeclPtrTy interfaceDecl,
           = P.Actions.ActOnIvar(P.CurScope,
                                 FD.D.getDeclSpec().getSourceRange().getBegin(),
                                 IDecl, FD.D, FD.BitfieldSize, visibility);
-        AllIvarDecls.push_back(Field);
+        if (Field)
+          AllIvarDecls.push_back(Field);
         return Field;
       }
     } Callback(*this, interfaceDecl, visibility, AllIvarDecls);
index 541c27169a7c052ea63501b4707387311556f902..3556057173d5ca1484a047145008f06353d6a876 100644 (file)
@@ -5747,8 +5747,16 @@ Sema::DeclPtrTy Sema::ActOnIvar(Scope *S,
     // Case of ivar declared in an implementation. Context is that of its class.
     EnclosingContext = IMPDecl->getClassInterface();
     assert(EnclosingContext && "Implementation has no class interface!");
-  } else
+  } else {
+    if (ObjCCategoryDecl *CDecl = 
+        dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
+      if (!LangOpts.ObjCNonFragileABI2 || !CDecl->IsClassExtension()) {
+        Diag(Loc, diag::err_misplaced_ivar) << CDecl->IsClassExtension();
+        return DeclPtrTy();
+      }
+    }
     EnclosingContext = EnclosingDecl;
+  }
 
   // Construct the decl.
   ObjCIvarDecl *NewID = ObjCIvarDecl::Create(Context,
@@ -5926,16 +5934,14 @@ void Sema::ActOnFields(Scope* S,
       CheckImplementationIvars(IMPDecl, ClsFields, RecFields.size(), RBrac);
     } else if (ObjCCategoryDecl *CDecl = 
                 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
-      if (!LangOpts.ObjCNonFragileABI2 || !CDecl->IsClassExtension())
-        Diag(LBrac, diag::err_misplaced_ivar) << CDecl->IsClassExtension();
-      else {
-        // FIXME. Class extension does not have a LocEnd field.
-        // CDecl->setLocEnd(RBrac);
-        // Add ivar's to class extension's DeclContext.
-        for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
-          ClsFields[i]->setLexicalDeclContext(CDecl);
-          CDecl->addDecl(ClsFields[i]);
-        }
+      // case of ivars in class extension; all other cases have been
+      // reported as errors elsewhere.
+      // FIXME. Class extension does not have a LocEnd field.
+      // CDecl->setLocEnd(RBrac);
+      // Add ivar's to class extension's DeclContext.
+      for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
+        ClsFields[i]->setLexicalDeclContext(CDecl);
+        CDecl->addDecl(ClsFields[i]);
       }
     }
   }
index ffc0e8b83902bacb2d051f84b530ede10d2a6e6f..6e0b577976d6113a06e9ca66b672cde99a804e87 100644 (file)
@@ -3,13 +3,13 @@
 
 @interface A @end
 
-@interface A () { // expected-error {{ivars may not be placed in class extension}}
-  int _p0;
+@interface A () { 
+  int _p0; // expected-error {{ivars may not be placed in class extension}}
 }
 @property int p0;
 @end
 
-@interface A(CAT) { // expected-error {{ivars may not be placed in categories}}
-  int _p1;
+@interface A(CAT) { 
+  int _p1; // expected-error {{ivars may not be placed in categories}}
 }
 @end
index e1a649cd4784bf3c1b995c775a3120874c1a9f98..4130d8f962527ae1cfdbdaa7a28cc9a95b3a57c5 100644 (file)
@@ -31,12 +31,12 @@ int fn3(SomeClass *obj) {
 @end
 
 @interface SomeClass (Category)
-    {  // expected-error {{ivars may not be placed in categories}}
-        int categoryIvar;
+    {  
+        int categoryIvar; // expected-error {{ivars may not be placed in categories}}
     }
 @end
 
 @interface SomeClass (Category1)
-    {  // expected-error {{ivars may not be placed in categories}}
+    {  
     }
 @end