forked from OSchip/llvm-project
Fix Sema::ActOnDeclarator() to call MergeFunctionDecl for function decls that aren't in scope. Since C functions are in a flat namespace, we need to give them special treatment (when compared with variables and typedefs).
llvm-svn: 45789
This commit is contained in:
parent
24ea11d4e0
commit
e6b0ec8b5e
|
@ -637,9 +637,6 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
|
|||
// See if this is a redefinition of a variable in the same scope.
|
||||
ScopedDecl *PrevDecl = LookupScopedDecl(II, Decl::IDNS_Ordinary,
|
||||
D.getIdentifierLoc(), S);
|
||||
if (PrevDecl && !S->isDeclScope(PrevDecl))
|
||||
PrevDecl = 0; // If in outer scope, it isn't the same thing.
|
||||
|
||||
ScopedDecl *New;
|
||||
bool InvalidDecl = false;
|
||||
|
||||
|
@ -653,8 +650,9 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
|
|||
// Handle attributes prior to checking for duplicates in MergeVarDecl
|
||||
HandleDeclAttributes(NewTD, D.getDeclSpec().getAttributes(),
|
||||
D.getAttributes());
|
||||
// Merge the decl with the existing one if appropriate.
|
||||
if (PrevDecl) {
|
||||
// Merge the decl with the existing one if appropriate. If the decl is
|
||||
// in an outer scope, it isn't the same thing.
|
||||
if (PrevDecl && S->isDeclScope(PrevDecl)) {
|
||||
NewTD = MergeTypeDefDecl(NewTD, PrevDecl);
|
||||
if (NewTD == 0) return 0;
|
||||
}
|
||||
|
@ -692,7 +690,8 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
|
|||
// Transfer ownership of DeclSpec attributes to FunctionDecl
|
||||
D.getDeclSpec().clearAttributes();
|
||||
|
||||
// Merge the decl with the existing one if appropriate.
|
||||
// Merge the decl with the existing one if appropriate. Since C functions
|
||||
// are in a flat namespace, make sure we consider decls in outer scopes.
|
||||
if (PrevDecl) {
|
||||
NewFD = MergeFunctionDecl(NewFD, PrevDecl);
|
||||
if (NewFD == 0) return 0;
|
||||
|
@ -731,8 +730,9 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
|
|||
HandleDeclAttributes(NewVD, D.getDeclSpec().getAttributes(),
|
||||
D.getAttributes());
|
||||
|
||||
// Merge the decl with the existing one if appropriate.
|
||||
if (PrevDecl) {
|
||||
// Merge the decl with the existing one if appropriate. If the decl is
|
||||
// in an outer scope, it isn't the same thing.
|
||||
if (PrevDecl && S->isDeclScope(PrevDecl)) {
|
||||
NewVD = MergeVarDecl(NewVD, PrevDecl);
|
||||
if (NewVD == 0) return 0;
|
||||
}
|
||||
|
|
|
@ -4,9 +4,14 @@ char *funk(int format);
|
|||
enum Test {A=-1};
|
||||
char *funk(enum Test x);
|
||||
|
||||
int eli(float b); // expected-error {{previous definition is here}}
|
||||
int b(int c) {return 1;}
|
||||
|
||||
int foo();
|
||||
int foo()
|
||||
{
|
||||
int eli(int (int)); // expected-error {{redefinition of 'eli'}}
|
||||
eli(b);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue