]> granicus.if.org Git - clang/commitdiff
Second half of "fix" for <rdar://problem/5986085> clang on xcode: error: redefinition...
authorSteve Naroff <snaroff@apple.com>
Thu, 5 Jun 2008 22:57:10 +0000 (22:57 +0000)
committerSteve Naroff <snaroff@apple.com>
Thu, 5 Jun 2008 22:57:10 +0000 (22:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52024 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaDeclObjC.cpp
test/Sema/objc-typedef-class.m

index a7135ea4cfdd2078ab6ba8f73f854161e1f29731..1c91d401d5922969d741f327d85627da17ad7763 100644 (file)
@@ -352,6 +352,7 @@ Sema::DeclTy *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
         // We won't add this decl to the current scope. We want the namespace
         // name to return the original namespace decl during a name lookup.
       } else {
+        printf("Weird\n");
         // This is an invalid name redefinition.
         Diag(Namespc->getLocation(), diag::err_redefinition_different_kind,
           Namespc->getName());
index 84a8e82750961028d6717e649e3719adfac1b540..240e6c7a688d42ed1ebe5716a9892beb833aec15 100644 (file)
@@ -712,9 +712,18 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
     // Check for another declaration kind with the same name.
     Decl *PrevDecl = LookupDecl(IdentList[i], Decl::IDNS_Ordinary, TUScope);
     if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
-      Diag(AtClassLoc, diag::err_redefinition_different_kind,
-           IdentList[i]->getName());
-      Diag(PrevDecl->getLocation(), diag::err_previous_definition);
+      // GCC apparently allows the following idiom:
+      //
+      // typedef NSObject < XCElementTogglerP > XCElementToggler;
+      // @class XCElementToggler;
+      //
+      // FIXME: Make an extension? 
+      TypedefDecl *TDD = dyn_cast<TypedefDecl>(PrevDecl);
+      if (!TDD || !isa<ObjCInterfaceType>(TDD->getUnderlyingType())) {
+        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.
index a35408ba9735c8ac88709d91308050c6cf4f6196..9518ab7a0e5b92932b039f9102b204c5e60f5e8f 100644 (file)
@@ -48,14 +48,13 @@ typedef NSObject < XCElementSpacerP > XCElementSpacer;
 @protocol XCElementTogglerP < XCElementP > -(void) setDisplayed:(BOOL) displayed;
 @end
 
-// FIXME: investigate this redefinition error - gcc apparently accepts it.
-typedef NSObject < XCElementTogglerP > XCElementToggler; // expected-error{{previous definition is here}}
+typedef NSObject < XCElementTogglerP > XCElementToggler;
 
 @interface XCElementRootFace:NSObject {} @end
 
 @interface XCElementFace:XCElementRootFace {} @end
 
-@class XCElementToggler; // expected-error{{redefinition of 'XCElementToggler' as different kind of symbol}}
+@class XCElementToggler; 
 
 @interface XCRASlice:XCElementFace {} @end