forked from OSchip/llvm-project
Fix for merging decls in pragma weak
Calling CheckFunctionDeclaration so that 2 decls for the 'weak' are merged. Differential Revision: http://reviews.llvm.org/D13048 llvm-svn: 254143
This commit is contained in:
parent
a3ac738725
commit
f97c8933cb
|
@ -5435,17 +5435,22 @@ NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II,
|
|||
assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
|
||||
NamedDecl *NewD = nullptr;
|
||||
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
|
||||
FunctionDecl *NewFD;
|
||||
// FIXME: Missing call to CheckFunctionDeclaration().
|
||||
// FIXME: Mangling?
|
||||
// FIXME: Is the qualifier info correct?
|
||||
// FIXME: Is the DeclContext correct?
|
||||
NewFD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
|
||||
Loc, Loc, DeclarationName(II),
|
||||
FD->getType(), FD->getTypeSourceInfo(),
|
||||
SC_None, false/*isInlineSpecified*/,
|
||||
FD->hasPrototype(),
|
||||
false/*isConstexprSpecified*/);
|
||||
|
||||
LookupResult Previous(*this, II, Loc, LookupOrdinaryName);
|
||||
LookupParsedName(Previous, TUScope, nullptr, true);
|
||||
|
||||
auto NewFD = FunctionDecl::Create(
|
||||
FD->getASTContext(), FD->getDeclContext(), Loc, Loc,
|
||||
DeclarationName(II), FD->getType(), FD->getTypeSourceInfo(), SC_None,
|
||||
false /*isInlineSpecified*/, FD->hasPrototype(),
|
||||
false /*isConstexprSpecified*/);
|
||||
|
||||
CheckFunctionDeclaration(TUScope, NewFD, Previous,
|
||||
false /*IsExplicitSpecialization*/);
|
||||
|
||||
NewD = NewFD;
|
||||
|
||||
if (FD->getQualifier())
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
// CHECK-DAG: @mix2 = weak alias void (), void ()* @__mix2
|
||||
// CHECK-DAG: @a1 = weak alias void (), void ()* @__a1
|
||||
// CHECK-DAG: @xxx = weak alias void (), void ()* @__xxx
|
||||
// CHECK-DAG: @weakfoo = weak alias void {{.*}} @localfoo
|
||||
|
||||
|
||||
|
||||
|
@ -173,6 +174,14 @@ label:
|
|||
// CHECK: declare extern_weak i32 @PR16705b()
|
||||
// CHECK: declare extern_weak i32 @PR16705c()
|
||||
|
||||
// In this test case, we have a declaration of weakfoo before #pragma weak.
|
||||
// Test that 2 decls for the weakfoo are merged.
|
||||
extern void weakfoo();
|
||||
void localfoo() { }
|
||||
#pragma weak weakfoo=localfoo
|
||||
extern void externmain() { return weakfoo(); }
|
||||
// CHECK-LABEL: define void @externmain()
|
||||
// CHECK: call{{.*}}@weakfoo
|
||||
|
||||
///////////// TODO: stuff that still doesn't work
|
||||
|
||||
|
|
|
@ -9,3 +9,9 @@ void __a3(void) __attribute((noinline));
|
|||
#pragma weak a3 = __a3 // expected-note {{previous definition}}
|
||||
void a3(void) __attribute((alias("__a3"))); // expected-error {{redefinition of 'a3'}}
|
||||
void __a3(void) {}
|
||||
|
||||
extern void weak2foo(int); // expected-note {{previous declaration is here}} expected-note {{'weak2foo' declared here}}
|
||||
void local2foo(double d1, double d2) { }
|
||||
#pragma weak weak2foo=local2foo // expected-error {{conflicting types for 'weak2foo'}}
|
||||
extern void extern2main() { return weak2foo(); } // expected-error {{too few arguments to function call, expected 1, have 0}}
|
||||
|
||||
|
|
Loading…
Reference in New Issue