summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2007-10-15 19:16:57 +0000
committerFariborz Jahanian <fjahanian@apple.com>2007-10-15 19:16:57 +0000
commitd4b3015dd70ac408a55da23d8c1d448a6e5d5e18 (patch)
tree0b9ac6dae442bbd07ac1fe15872f985ce8520b82
parent7bbc582bb3407362423b57c62238138e220e9040 (diff)
downloadbcm5719-llvm-d4b3015dd70ac408a55da23d8c1d448a6e5d5e18.tar.gz
bcm5719-llvm-d4b3015dd70ac408a55da23d8c1d448a6e5d5e18.zip
Several name lookup conflict detection fixes involving objective-c names.
llvm-svn: 43000
-rw-r--r--clang/Sema/SemaDecl.cpp16
-rw-r--r--clang/test/Sema/check-dup-objc-decls-1.m29
-rw-r--r--clang/test/Sema/class-def-test-1.m5
3 files changed, 46 insertions, 4 deletions
diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp
index 65f6708b1bb..59a2d1d5476 100644
--- a/clang/Sema/SemaDecl.cpp
+++ b/clang/Sema/SemaDecl.cpp
@@ -945,6 +945,9 @@ Sema::DeclTy *Sema::ActOnStartClassInterface(
// Chain & install the interface decl into the identifier.
IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
ClassName->setFETokenInfo(IDecl);
+
+ // Remember that this needs to be removed when the scope is popped.
+ TUScope->AddDecl(IDecl);
}
if (SuperName) {
@@ -1214,6 +1217,8 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation(
IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
ClassName->setFETokenInfo(IDecl);
+ // Remember that this needs to be removed when the scope is popped.
+ TUScope->AddDecl(IDecl);
}
// Check that there is no duplicate implementation of this class.
@@ -1397,9 +1402,16 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
llvm::SmallVector<ObjcInterfaceDecl*, 32> Interfaces;
for (unsigned i = 0; i != NumElts; ++i) {
- ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(IdentList[i]);
+ // Check for another declaration kind with the same name.
+ ScopedDecl *PrevDecl = LookupInterfaceDecl(IdentList[i]);
+ if (PrevDecl && !isa<ObjcInterfaceDecl>(PrevDecl)) {
+ Diag(AtClassLoc, diag::err_redefinition_different_kind,
+ IdentList[i]->getName());
+ Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+ }
+ ObjcInterfaceDecl *IDecl = dyn_cast_or_null<ObjcInterfaceDecl>(PrevDecl);
if (!IDecl) { // Not already seen? Make a forward decl.
- IDecl = new ObjcInterfaceDecl(SourceLocation(), 0, IdentList[i], true);
+ IDecl = new ObjcInterfaceDecl(AtClassLoc, 0, IdentList[i], true);
// Chain & install the interface decl into the identifier.
IDecl->setNext(IdentList[i]->getFETokenInfo<ScopedDecl>());
IdentList[i]->setFETokenInfo(IDecl);
diff --git a/clang/test/Sema/check-dup-objc-decls-1.m b/clang/test/Sema/check-dup-objc-decls-1.m
new file mode 100644
index 00000000000..dd48ba4796d
--- /dev/null
+++ b/clang/test/Sema/check-dup-objc-decls-1.m
@@ -0,0 +1,29 @@
+// RUN: clang -fsyntax-only -verify %s
+
+@interface Foo // expected-error {{previous definition is here}}
+@end
+
+float Foo; // expected-error {{redefinition of 'Foo' as different kind of symbol}}
+
+@class Bar; // expected-error {{previous definition is here}}
+
+typedef int Bar; // expected-error {{redefinition of 'Bar' as different kind of symbol}}
+
+@implementation FooBar // expected-warning {{cannot find interface declaration for 'FooBar'}}
+@end
+
+
+typedef int OBJECT; // expected-error {{previous definition is here}}
+
+@class OBJECT ; // expected-error {{redefinition of 'OBJECT' as different kind of symbol}}
+
+
+typedef int Gorf; // expected-error {{previous definition is here}}
+
+@interface Gorf @end // expected-error {{redefinition of 'Gorf' as different kind of symbol}} \
+ // expected-error {{previous definition is here}}
+
+void Gorf() // expected-error {{redefinition of 'Gorf' as different kind of symbol}}
+{
+ int Bar, Foo, FooBar;
+}
diff --git a/clang/test/Sema/class-def-test-1.m b/clang/test/Sema/class-def-test-1.m
index a33e9652c6e..91de54fbed7 100644
--- a/clang/test/Sema/class-def-test-1.m
+++ b/clang/test/Sema/class-def-test-1.m
@@ -8,13 +8,14 @@ typedef int INTF; // expected-error {{previous definition is here}}
@interface INTF @end // expected-error {{redefinition of 'INTF' as different kind of symbol}}
-@interface OBJECT @end
+@interface OBJECT @end // expected-error {{previous definition is here}}
@interface INTF1 : OBJECT @end
@interface INTF1 : OBJECT @end // expected-error {{duplicate interface declaration for class 'INTF1'}
-typedef int OBJECT; // expected-error {{previous definition is here}}
+typedef int OBJECT; // expected-error {{previous definition is here}} \
+ expected-error {{redefinition of 'OBJECT' as different kind of symbol}}
@interface INTF2 : OBJECT @end // expected-error {{redefinition of 'OBJECT' as different kind of symbol}}
OpenPOWER on IntegriCloud