diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-03-07 02:05:23 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-03-07 02:05:23 +0000 |
commit | 353ee246e754e38db9b738240d18f1ecf2bb389b (patch) | |
tree | d6685bd035a49a14be69710dea10069e4fc6a40c /lib | |
parent | a7f633f522af786e80dc08dbd63e222c9414095b (diff) |
Produce a diagnostic for unused overloaded expressions, from Faisal Vali!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127148 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index e4ac3ed6bb..4e018276b6 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -3911,8 +3911,31 @@ ExprResult Sema::ActOnFinishFullExpr(Expr *FullExpr) { if (DiagnoseUnexpandedParameterPack(FullExpr)) return ExprError(); + // 13.4.1 ... An overloaded function name shall not be used without arguments + // in contexts other than those listed [i.e list of targets]. + // + // void foo(); void foo(int); + // template<class T> void fooT(); template<class T> void fooT(int); + + // Therefore these should error: + // foo; + // fooT<int>; + + if (FullExpr->getType() == Context.OverloadTy) { + if (!ResolveSingleFunctionTemplateSpecialization(FullExpr, + /* Complain */ false)) { + OverloadExpr* OvlExpr = OverloadExpr::find(FullExpr).Expression; + Diag(FullExpr->getLocStart(), diag::err_addr_ovl_ambiguous) + << OvlExpr->getName(); + NoteAllOverloadCandidates(OvlExpr); + return ExprError(); + } + } + + IgnoredValueConversions(FullExpr); CheckImplicitConversions(FullExpr); + return MaybeCreateExprWithCleanups(FullExpr); } |