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:
parent
39f215bd33
commit
88f4ed9011
|
@ -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() &&
|
||||
|
|
|
@ -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}}
|
||||
|
|
Loading…
Reference in New Issue