forked from OSchip/llvm-project
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:
parent
06769f9197
commit
f184291fec
|
@ -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);
|
||||
|
||||
|
|
|
@ -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}}
|
Loading…
Reference in New Issue