diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2007-10-15 19:16:57 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2007-10-15 19:16:57 +0000 |
| commit | d4b3015dd70ac408a55da23d8c1d448a6e5d5e18 (patch) | |
| tree | 0b9ac6dae442bbd07ac1fe15872f985ce8520b82 | |
| parent | 7bbc582bb3407362423b57c62238138e220e9040 (diff) | |
| download | bcm5719-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.cpp | 16 | ||||
| -rw-r--r-- | clang/test/Sema/check-dup-objc-decls-1.m | 29 | ||||
| -rw-r--r-- | clang/test/Sema/class-def-test-1.m | 5 |
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}} |

