]> granicus.if.org Git - clang/commitdiff
Several name lookup conflict detection fixes involving objective-c names.
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 15 Oct 2007 19:16:57 +0000 (19:16 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 15 Oct 2007 19:16:57 +0000 (19:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43000 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaDecl.cpp
test/Sema/check-dup-objc-decls-1.m [new file with mode: 0644]
test/Sema/class-def-test-1.m

index 65f6708b1bb37deae12567b15ae86d0182aa9497..59a2d1d547668b9795915f4558067dc1b226e2b9 100644 (file)
@@ -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/test/Sema/check-dup-objc-decls-1.m b/test/Sema/check-dup-objc-decls-1.m
new file mode 100644 (file)
index 0000000..dd48ba4
--- /dev/null
@@ -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;
+}
index a33e9652c6ed0bf8ba2949c817f7d7938bbc8a92..91de54fbed71f8f342819ceba4b6d1eaa8deaff8 100644 (file)
@@ -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}}