Improve function decl merging, patch by Oliver Hunt!

llvm-svn: 44253
This commit is contained in:
Chris Lattner 2007-11-20 19:04:50 +00:00
parent 04eb67e69a
commit 5c3f1541a7
2 changed files with 44 additions and 8 deletions

View File

@ -238,16 +238,23 @@ FunctionDecl *Sema::MergeFunctionDecl(FunctionDecl *New, ScopedDecl *OldD) {
return New;
}
// This is not right, but it's a start. If 'Old' is a function prototype with
// the same type as 'New', silently allow this. FIXME: We should link up decl
// objects here.
if (Old->getBody() == 0 &&
Old->getCanonicalType() == New->getCanonicalType()) {
return New;
QualType OldQType = Old->getCanonicalType();
QualType NewQType = New->getCanonicalType();
// This is not right, but it's a start.
// If Old is a function prototype with no defined arguments we only compare
// the return type; If arguments are defined on the prototype we validate the
// entire function type.
// FIXME: We should link up decl objects here.
if (Old->getBody() == 0) {
if (OldQType.getTypePtr()->getTypeClass() == Type::FunctionNoProto &&
Old->getResultType() == New->getResultType())
return New;
if (OldQType == NewQType)
return New;
}
if (New->getBody() == 0 &&
Old->getCanonicalType() == New->getCanonicalType()) {
if (New->getBody() == 0 && OldQType == NewQType) {
return 0;
}

View File

@ -0,0 +1,29 @@
// RUN: clang -fsyntax-only -verify -pedantic %s
int foo();
int foo()
{
return 0;
}
int bar();
int bar(int i) // expected-error {{previous definition is here}}
{
return 0;
}
int bar() // expected-error {{redefinition of 'bar'}}
{
return 0;
}
int foobar(int); // expected-error {{previous definition is here}}
int foobar() // expected-error {{redefinition of 'foobar'}}
{
return 0;
}
int wibble(); // expected-error {{previous definition is here}}
float wibble() // expected-error {{redefinition of 'wibble'}}
{
return 0.0f;
}