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);
 }