]> granicus.if.org Git - clang/commitdiff
Fix redefinition of typedefs of fixable variably-modified array types; should
authorEli Friedman <eli.friedman@gmail.com>
Tue, 10 Aug 2010 03:13:15 +0000 (03:13 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 10 Aug 2010 03:13:15 +0000 (03:13 +0000)
fix an issue compiling <windows.h>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110651 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Sema/typedef-variable-type.c

index e6c5170357caf2991f3e18d7f8f75c57ae1a8ec5..d94b8dd304c670b6fbe337545c87d5c0f7885cb0 100644 (file)
@@ -2332,16 +2332,10 @@ Sema::ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   // Handle attributes prior to checking for duplicates in MergeVarDecl
   ProcessDeclAttributes(S, NewTD, D);
 
-  // Merge the decl with the existing one if appropriate. If the decl is
-  // in an outer scope, it isn't the same thing.
-  FilterLookupForScope(*this, Previous, DC, S, /*ConsiderLinkage*/ false);
-  if (!Previous.empty()) {
-    Redeclaration = true;
-    MergeTypeDefDecl(NewTD, Previous);
-  }
-
   // C99 6.7.7p2: If a typedef name specifies a variably modified type
   // then it shall have block scope.
+  // Note that variably modified types must be fixed before merging the decl so
+  // that redeclarations will match.
   QualType T = NewTD->getUnderlyingType();
   if (T->isVariablyModifiedType()) {
     setFunctionHasBranchProtectedScope();
@@ -2365,6 +2359,14 @@ Sema::ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
     }
   }
 
+  // Merge the decl with the existing one if appropriate. If the decl is
+  // in an outer scope, it isn't the same thing.
+  FilterLookupForScope(*this, Previous, DC, S, /*ConsiderLinkage*/ false);
+  if (!Previous.empty()) {
+    Redeclaration = true;
+    MergeTypeDefDecl(NewTD, Previous);
+  }
+
   // If this is the C FILE type, notify the AST context.
   if (IdentifierInfo *II = NewTD->getIdentifier())
     if (!NewTD->isInvalidDecl() &&
index f29896850b1b270e5e956f5096a9da50cca52d3f..b805b1e0578f24be7dcb79f313f9a34b7e085c36 100644 (file)
@@ -1,3 +1,8 @@
-// RUN: %clang_cc1 %s -verify -fsyntax-only -pedantic
+// RUN: %clang_cc1 %s -verify -fsyntax-only -pedantic -Wno-typedef-redefinition
 
+// Make sure we accept a single typedef
+typedef int (*a)[!.0]; // expected-warning{{size of static array must be an integer constant expression}}
+
+// And make sure we accept identical redefinitions in system headers
+// (The test uses -Wno-typedef-redefinition to simulate this.)
 typedef int (*a)[!.0]; // expected-warning{{size of static array must be an integer constant expression}}