forked from OSchip/llvm-project
Improve function decl merging, patch by Oliver Hunt!
llvm-svn: 44253
This commit is contained in:
parent
04eb67e69a
commit
5c3f1541a7
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue