Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -14199,14 +14199,15 @@ SourceLocation AliasNameLoc) { Decl *PrevDecl = LookupSingleName(TUScope, Name, NameLoc, LookupOrdinaryName); - AsmLabelAttr *Attr = ::new (Context) AsmLabelAttr(AliasNameLoc, Context, - AliasName->getName(), 0); + if (PrevDecl) + PrevDecl->addAttr(AsmLabelAttr::CreateImplicit( + Context, AliasName->getName(), AliasNameLoc)); - if (PrevDecl) - PrevDecl->addAttr(Attr); - else - (void)ExtnameUndeclaredIdentifiers.insert( - std::pair(Name, Attr)); + // There might be additional not yet declared identifiers with Name name. + // PR5172, Comment 11. + (void)ExtnameUndeclaredIdentifiers.insert( + std::make_pair(Name, AsmLabelAttr::CreateImplicit( + Context, AliasName->getName(), AliasNameLoc))); } void Sema::ActOnPragmaWeakID(IdentifierInfo* Name, Index: test/CodeGen/redefine_extname.c =================================================================== --- test/CodeGen/redefine_extname.c +++ test/CodeGen/redefine_extname.c @@ -3,6 +3,12 @@ #pragma redefine_extname fake real #pragma redefine_extname name alias +struct statvfs64 { + int f; +}; +#pragma redefine_extname statvfs64 statvfs +int statvfs64(struct statvfs64 *); + extern int fake(void); int name; @@ -13,3 +19,12 @@ // CHECK: call i32 @real() // Check that this also works with variables names // CHECK: load i32, i32* @alias + +void foo() { + struct statvfs64 st; + statvfs64(&st); +// Check that even if there is a structure with redefined name before the +// pragma, subsequent function name redefined properly. PR5712, Comment 11. +// CHECK: call i32 @statvfs(%struct.statvfs64* %st) +} +