forked from OSchip/llvm-project
When resolving the address of an overloaded function or function template, mark the result as referenced.
The most important effect of this is that function templates only referenced by address expressions now get instantiated. This, in turn, means that Hello World compiles with the Apache stdcxx library even when using endl. llvm-svn: 84363
This commit is contained in:
parent
fef1c0d54f
commit
df4b80e7c0
|
@ -4334,8 +4334,11 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
|
|||
// If there were 0 or 1 matches, we're done.
|
||||
if (Matches.empty())
|
||||
return 0;
|
||||
else if (Matches.size() == 1)
|
||||
return *Matches.begin();
|
||||
else if (Matches.size() == 1) {
|
||||
FunctionDecl *Result = *Matches.begin();
|
||||
MarkDeclarationReferenced(From->getLocStart(), Result);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// C++ [over.over]p4:
|
||||
// If more than one function is selected, [...]
|
||||
|
@ -4353,12 +4356,15 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
|
|||
// best function template (if it exists).
|
||||
llvm::SmallVector<FunctionDecl *, 8> TemplateMatches(Matches.begin(),
|
||||
Matches.end());
|
||||
return getMostSpecialized(TemplateMatches.data(), TemplateMatches.size(),
|
||||
TPOC_Other, From->getLocStart(),
|
||||
PDiag(),
|
||||
PDiag(diag::err_addr_ovl_ambiguous)
|
||||
<< TemplateMatches[0]->getDeclName(),
|
||||
PDiag(diag::err_ovl_template_candidate));
|
||||
FunctionDecl *Result =
|
||||
getMostSpecialized(TemplateMatches.data(), TemplateMatches.size(),
|
||||
TPOC_Other, From->getLocStart(),
|
||||
PDiag(),
|
||||
PDiag(diag::err_addr_ovl_ambiguous)
|
||||
<< TemplateMatches[0]->getDeclName(),
|
||||
PDiag(diag::err_ovl_template_candidate));
|
||||
MarkDeclarationReferenced(From->getLocStart(), Result);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// [...] any function template specializations in the set are
|
||||
|
@ -4370,8 +4376,11 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
|
|||
|
||||
// [...] After such eliminations, if any, there shall remain exactly one
|
||||
// selected function.
|
||||
if (RemainingMatches.size() == 1)
|
||||
return RemainingMatches.front();
|
||||
if (RemainingMatches.size() == 1) {
|
||||
FunctionDecl *Result = RemainingMatches.front();
|
||||
MarkDeclarationReferenced(From->getLocStart(), Result);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// FIXME: We should probably return the same thing that BestViableFunction
|
||||
// returns (even if we issue the diagnostics here).
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
template <typename T> void f(T) {}
|
||||
|
||||
void test() {
|
||||
// FIXME: This emits only a declaration instead of a definition
|
||||
// CHECK: @_Z1fIiEvT_
|
||||
void (*p)(int) = &f;
|
||||
}
|
||||
// CHECK-disabled: define linkonce_odr void @_Z1fIiEvT_
|
||||
// CHECK: define linkonce_odr void @_Z1fIiEvT_
|
||||
|
|
Loading…
Reference in New Issue