diff options
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index c776a5bfa5..df4add2ea3 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -391,6 +391,7 @@ bool Sema::isTentativeDefinition(VarDecl *VD) { /// when dealing with C "tentative" external object definitions (C99 6.9.2). void Sema::CheckForFileScopedRedefinitions(Scope *S, VarDecl *VD) { bool VDIsTentative = isTentativeDefinition(VD); + bool VDIsIncompleteArray = VD->getType()->isIncompleteArrayType(); for (IdentifierResolver::iterator I = IdResolver.begin(VD->getIdentifier(), @@ -399,6 +400,14 @@ void Sema::CheckForFileScopedRedefinitions(Scope *S, VarDecl *VD) { if (*I != VD && IdResolver.isDeclInScope(*I, VD->getDeclContext(), S)) { VarDecl *OldDecl = dyn_cast<VarDecl>(*I); + // Handle the following case: + // int a[10]; + // int a[]; - the code below makes sure we set the correct type. + // int a[11]; - this is an error, size isn't 10. + if (OldDecl && VDIsTentative && VDIsIncompleteArray && + OldDecl->getType()->isConstantArrayType()) + VD->setType(OldDecl->getType()); + // Check for "tentative" definitions. We can't accomplish this in // MergeVarDecl since the initializer hasn't been attached. if (!OldDecl || isTentativeDefinition(OldDecl) || VDIsTentative) |