diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-04-06 22:43:48 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-04-06 22:43:48 +0000 |
commit | 6a0a2e0ccca22f607c941bf74f4c0f23300c04bc (patch) | |
tree | 501505972422c2a9ced3aa11eaf9c108896d88bf /clang | |
parent | 2351cb9139a40d5b00e723620ee889076ea69bd5 (diff) | |
download | bcm5719-llvm-6a0a2e0ccca22f607c941bf74f4c0f23300c04bc.tar.gz bcm5719-llvm-6a0a2e0ccca22f607c941bf74f4c0f23300c04bc.zip |
Patch to not build ivar ASTs when they are ilegally
declared in categories.
llvm-svn: 100577
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Parse/ParseObjc.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 28 | ||||
-rw-r--r-- | clang/test/SemaObjC/ivar-in-class-extension-error.m | 8 | ||||
-rw-r--r-- | clang/test/SemaObjC/ivar-in-class-extension.m | 6 |
4 files changed, 26 insertions, 19 deletions
diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index 243be0ed45a..123a96261ad 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/lib/Parse/ParseObjc.cpp @@ -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); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 541c27169a7..3556057173d 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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]); } } } diff --git a/clang/test/SemaObjC/ivar-in-class-extension-error.m b/clang/test/SemaObjC/ivar-in-class-extension-error.m index ffc0e8b8390..6e0b577976d 100644 --- a/clang/test/SemaObjC/ivar-in-class-extension-error.m +++ b/clang/test/SemaObjC/ivar-in-class-extension-error.m @@ -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 diff --git a/clang/test/SemaObjC/ivar-in-class-extension.m b/clang/test/SemaObjC/ivar-in-class-extension.m index e1a649cd478..4130d8f9625 100644 --- a/clang/test/SemaObjC/ivar-in-class-extension.m +++ b/clang/test/SemaObjC/ivar-in-class-extension.m @@ -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 |