Implement a %plural modifier for complex plural forms in diagnostics. Use it in the overload diagnostics.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59871 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index cf1f017..d65d6ff 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -1440,13 +1440,9 @@
     return cast<CXXConstructorDecl>(Best->Function);
     
   case OR_No_Viable_Function:
-    if (CandidateSet.empty())
-      Diag(Loc, diag::err_ovl_no_viable_function_in_init) << InitEntity <<Range;
-    else {
-      Diag(Loc, diag::err_ovl_no_viable_function_in_init_with_cands)
-        << InitEntity << Range;
-      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
-    }
+    Diag(Loc, diag::err_ovl_no_viable_function_in_init)
+      << InitEntity << (unsigned)CandidateSet.size() << Range;
+    PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
     return 0;
     
   case OR_Ambiguous:
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index ba1bb25..96b229d 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1309,16 +1309,11 @@
       break;
 
     case OR_No_Viable_Function:
-      if (CandidateSet.empty())
-        Diag(Fn->getSourceRange().getBegin(), 
-             diag::err_ovl_no_viable_function_in_call)
-          << Ovl->getName() << Fn->getSourceRange();
-      else {
-        Diag(Fn->getSourceRange().getBegin(), 
-             diag::err_ovl_no_viable_function_in_call_with_cands)
-          << Ovl->getName() << Fn->getSourceRange();
-        PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
-      }
+      Diag(Fn->getSourceRange().getBegin(), 
+           diag::err_ovl_no_viable_function_in_call)
+        << Ovl->getName() << (unsigned)CandidateSet.size()
+        << Fn->getSourceRange();
+      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
       return true;
 
     case OR_Ambiguous:
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index eb38eee..3c2c0ab 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -3050,16 +3050,11 @@
     break;
 
   case OR_No_Viable_Function:
-    if (CandidateSet.empty())
-      Diag(Object->getSourceRange().getBegin(), 
-           diag::err_ovl_no_viable_object_call)
-        << Object->getType().getAsString() << Object->getSourceRange();
-    else {
-      Diag(Object->getSourceRange().getBegin(), 
-           diag::err_ovl_no_viable_object_call_with_cands)
-        << Object->getType().getAsString() << Object->getSourceRange();
-      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
-    }
+    Diag(Object->getSourceRange().getBegin(), 
+         diag::err_ovl_no_viable_object_call)
+      << Object->getType().getAsString() << (unsigned)CandidateSet.size()
+      << Object->getSourceRange();
+    PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
     break;
 
   case OR_Ambiguous:
@@ -3220,7 +3215,8 @@
         << BasePtr->getType().getAsString() << BasePtr->getSourceRange();
     else
       Diag(OpLoc, diag::err_ovl_no_viable_oper)
-        << "operator->" << BasePtr->getSourceRange();
+        << "operator->" << (unsigned)CandidateSet.size()
+        << BasePtr->getSourceRange();
     PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
     return true;