summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-06-26 22:10:27 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-06-26 22:10:27 +0000
commite23f26bf943d67534f633c84d6dfd9ee5a8c593b (patch)
tree227f6e7e58b7385644a63c456c6e02395dd66bff
parentff7fceed7d67a5137ae7827ef605a369c1b85cfa (diff)
downloadbcm5719-llvm-e23f26bf943d67534f633c84d6dfd9ee5a8c593b.tar.gz
bcm5719-llvm-e23f26bf943d67534f633c84d6dfd9ee5a8c593b.zip
ObjectiveC: diagnose duplicate declaration of
private ivars in class extensions and class @implementation. // rdar://14278560 llvm-svn: 185025
-rw-r--r--clang/lib/Sema/SemaDeclObjC.cpp13
-rw-r--r--clang/test/SemaObjC/ivar-lookup.m43
2 files changed, 56 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp
index 8afff70daa0..da98d4c8a0f 100644
--- a/clang/lib/Sema/SemaDeclObjC.cpp
+++ b/clang/lib/Sema/SemaDeclObjC.cpp
@@ -1140,6 +1140,19 @@ void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
Diag(ClsIvar->getLocation(), diag::note_previous_definition);
continue;
}
+ // Check class extensions (unnamed categories) for duplicate ivars.
+ for (ObjCInterfaceDecl::visible_extensions_iterator
+ Ext = IDecl->visible_extensions_begin(),
+ ExtEnd = IDecl->visible_extensions_end();
+ Ext != ExtEnd; ++Ext) {
+ ObjCCategoryDecl *CDecl = *Ext;
+ if (const ObjCIvarDecl *ClsExtIvar =
+ CDecl->getIvarDecl(ImplIvar->getIdentifier())) {
+ Diag(ImplIvar->getLocation(), diag::err_duplicate_ivar_declaration);
+ Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
+ continue;
+ }
+ }
// Instance ivar to Implementation's DeclContext.
ImplIvar->setLexicalDeclContext(ImpDecl);
IDecl->makeDeclVisibleInContext(ImplIvar);
diff --git a/clang/test/SemaObjC/ivar-lookup.m b/clang/test/SemaObjC/ivar-lookup.m
index a8620caf21e..938c8eb189a 100644
--- a/clang/test/SemaObjC/ivar-lookup.m
+++ b/clang/test/SemaObjC/ivar-lookup.m
@@ -111,3 +111,46 @@ extern struct foo x;
}
@end
+// rdar://14278560
+@class NSString, NSData, NSNumber;
+
+@interface NSObject
+{
+ Class isa;
+}
+@end
+
+@interface Foo
+{
+ int a;
+ NSString* b;
+ NSData* c;
+}
+@end
+
+@interface Bar : Foo
+@end
+
+@interface Bar () {
+ NSString *q_strong;
+ NSNumber *r_strong;
+ int d; // expected-note {{previous definition is here}}
+ NSString *e_strong; // expected-note {{previous definition is here}}
+ NSData *f_weak; // expected-note {{previous definition is here}}
+ int g; // expected-note 2 {{previous definition is here}}
+}
+@end
+
+@interface Bar () {
+ int g; // expected-note {{previous definition is here}} \
+ // expected-error {{instance variable is already declared}}
+}
+@end
+
+@implementation Bar {
+ int d; // expected-error {{instance variable is already declared}}
+ NSString *e_strong; // expected-error {{instance variable is already declared}}
+ NSData *f_weak; // expected-error {{instance variable is already declared}}
+ NSData *g; // expected-error 2 {{instance variable is already declared}}
+}
+@end
OpenPOWER on IntegriCloud