Fix redefinition of typedefs of fixable variably-modified array types; should

fix an issue compiling <windows.h>.

llvm-svn: 110651
This commit is contained in:
Eli Friedman 2010-08-10 03:13:15 +00:00
parent 39f215bd33
commit 88f4ed9011
2 changed files with 16 additions and 9 deletions

View 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() &&

View 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}}