r208146 - Try harder to ensure a strict weak ordering of overload candidates that

Kaelyn Takata rikka at google.com
Tue May 6 17:43:39 PDT 2014


Author: rikka
Date: Tue May  6 19:43:38 2014
New Revision: 208146

URL: http://llvm.org/viewvc/llvm-project?rev=208146&view=rev
Log:
Try harder to ensure a strict weak ordering of overload candidates that
have arity mismatches.

Modified:
    cfe/trunk/include/clang/Sema/Overload.h
    cfe/trunk/lib/Sema/SemaOverload.cpp

Modified: cfe/trunk/include/clang/Sema/Overload.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Overload.h?rev=208146&r1=208145&r2=208146&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Overload.h (original)
+++ cfe/trunk/include/clang/Sema/Overload.h Tue May  6 19:43:38 2014
@@ -679,6 +679,18 @@ namespace clang {
 
       return CanFix;
     }
+
+    unsigned getNumParams() const {
+      if (IsSurrogate) {
+        auto STy = Surrogate->getConversionType();
+        while (STy->isPointerType() || STy->isReferenceType())
+          STy = STy->getPointeeType();
+        return STy->getAs<FunctionProtoType>()->getNumParams();
+      }
+      if (Function)
+        return Function->getNumParams();
+      return ExplicitCallArguments;
+    }
   };
 
   /// OverloadCandidateSet - A set of overload candidates, used in C++

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=208146&r1=208145&r2=208146&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Tue May  6 19:43:38 2014
@@ -9260,12 +9260,17 @@ struct CompareOverloadCandidatesForDispl
           L->FailureKind == ovl_fail_too_few_arguments) {
         if (R->FailureKind == ovl_fail_too_many_arguments ||
             R->FailureKind == ovl_fail_too_few_arguments) {
-          if (!L->Function || !R->Function) return !R->Function;
-          int LDist = std::abs((int)L->Function->getNumParams() - (int)NumArgs);
-          int RDist = std::abs((int)R->Function->getNumParams() - (int)NumArgs);
-          if (LDist == RDist)
-            return L->FailureKind == ovl_fail_too_many_arguments &&
-                   R->FailureKind == ovl_fail_too_few_arguments;
+          int LDist = std::abs((int)L->getNumParams() - (int)NumArgs);
+          int RDist = std::abs((int)R->getNumParams() - (int)NumArgs);
+          if (LDist == RDist) {
+            if (L->FailureKind == R->FailureKind)
+              // Sort non-surrogates before surrogates.
+              return !L->IsSurrogate && R->IsSurrogate;
+            // Sort candidates requiring fewer parameters than there were
+            // arguments given after candidates requiring more parameters
+            // than there were arguments given.
+            return L->FailureKind == ovl_fail_too_many_arguments;
+          }
           return LDist < RDist;
         }
         return false;





More information about the cfe-commits mailing list