summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-04-06 22:43:48 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-04-06 22:43:48 +0000
commit6a0a2e0ccca22f607c941bf74f4c0f23300c04bc (patch)
tree501505972422c2a9ced3aa11eaf9c108896d88bf /clang
parent2351cb9139a40d5b00e723620ee889076ea69bd5 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--clang/lib/Sema/SemaDecl.cpp28
-rw-r--r--clang/test/SemaObjC/ivar-in-class-extension-error.m8
-rw-r--r--clang/test/SemaObjC/ivar-in-class-extension.m6
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
OpenPOWER on IntegriCloud