Check for redefinitions in MergeVarDecl. This finds redefinitions of globals without an initializer in C++ and thus fixes PR5451.

llvm-svn: 95098
This commit is contained in:
Sebastian Redl 2010-02-02 18:35:11 +00:00
parent 06769f9197
commit f184291fec
2 changed files with 32 additions and 0 deletions

View File

@ -1298,6 +1298,17 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
Diag(Old->getLocation(), diag::note_previous_definition);
}
// C++ doesn't have tentative definitions, so go right ahead and check here.
const VarDecl *Def;
if (New->isThisDeclarationADefinition() == VarDecl::Definition &&
(Def = Old->getDefinition())) {
Diag(New->getLocation(), diag::err_redefinition)
<< New->getDeclName();
Diag(Def->getLocation(), diag::note_previous_definition);
New->setInvalidDecl();
return;
}
// Keep a chain of previous declarations.
New->setPreviousDeclaration(Old);

View File

@ -0,0 +1,21 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// C++ [basic.def.odr]p1:
// No translation unit shall contain more than one definition of any
// variable, [...].
// Bad: in C++, these are both definitions. None of that C99 tentative stuff.
int i; // expected-note {{previous}}
int i; // expected-error {{redefinition}}
// OK: decl + def
extern int j;
int j;
// OK: def + decl
int k;
extern int k;
// Bad. The important thing here is that we don't emit the diagnostic twice.
int l = 1; // expected-note {{previous}}
int l = 2; // expected-error {{redefinition}}