diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-03-12 01:48:56 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-03-12 01:48:56 +0000 |
commit | 1beec45a618b4613b27ab0e78fdfc89f0b035398 (patch) | |
tree | c2589daed2b6f9ead4563534c8f3a416ff095857 /clang/lib/Sema/SemaOverload.cpp | |
parent | c313d94068b63afb8d8212a42cd74178af6539ca (diff) | |
download | bcm5719-llvm-1beec45a618b4613b27ab0e78fdfc89f0b035398.tar.gz bcm5719-llvm-1beec45a618b4613b27ab0e78fdfc89f0b035398.zip |
Fixes for some more expressions containing function templateids that
should be resolvable, from Faisal Vali!
llvm-svn: 127521
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index bf24b74848d..d746c7bb1e7 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -7490,6 +7490,44 @@ FunctionDecl *Sema::ResolveSingleFunctionTemplateSpecialization(Expr *From, return Matched; } + + + +// Resolve and fix an overloaded expression that +// can be resolved because it identifies a single function +// template specialization +// Last three arguments should only be supplied if Complain = true +ExprResult Sema::ResolveAndFixSingleFunctionTemplateSpecialization( + Expr *SrcExpr, bool DoFunctionPointerConverion, bool Complain, + const SourceRange& OpRangeForComplaining, + QualType DestTypeForComplaining, + unsigned DiagIDForComplaining ) { + + assert(SrcExpr->getType() == Context.OverloadTy); + + DeclAccessPair Found; + Expr* SingleFunctionExpression = 0; + if (FunctionDecl* Fn = ResolveSingleFunctionTemplateSpecialization( + SrcExpr, false, // false -> Complain + &Found)) { + if (!DiagnoseUseOfDecl(Fn, SrcExpr->getSourceRange().getBegin())) { + // mark the expression as resolved to Fn + SingleFunctionExpression = FixOverloadedFunctionReference(SrcExpr, + Found, Fn); + if (DoFunctionPointerConverion) + DefaultFunctionArrayLvalueConversion(SingleFunctionExpression); + } + } + if (!SingleFunctionExpression && Complain) { + OverloadExpr* oe = OverloadExpr::find(SrcExpr).Expression; + Diag(OpRangeForComplaining.getBegin(), DiagIDForComplaining) + << oe->getName() << DestTypeForComplaining << OpRangeForComplaining + << oe->getQualifierLoc().getSourceRange(); + NoteAllOverloadCandidates(SrcExpr); + } + return SingleFunctionExpression; +} + /// \brief Add a single candidate to the overload set. static void AddOverloadedCallCandidate(Sema &S, DeclAccessPair FoundDecl, |