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
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index e4ac3ed..4e01827 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -3911,8 +3911,31 @@
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);
}