summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorKaelyn Takata <rikka@google.com>2014-05-07 00:43:38 +0000
committerKaelyn Takata <rikka@google.com>2014-05-07 00:43:38 +0000
commit50c4ffcca78e080bb5f0a98f09f4af44520381a9 (patch)
tree8f993320a65db6aabebd432712359bbf9d94440c /clang/lib
parentd6a0604180fb6289c7a64d0dc9e5d9826bb5928b (diff)
downloadbcm5719-llvm-50c4ffcca78e080bb5f0a98f09f4af44520381a9.tar.gz
bcm5719-llvm-50c4ffcca78e080bb5f0a98f09f4af44520381a9.zip
Try harder to ensure a strict weak ordering of overload candidates that
have arity mismatches. llvm-svn: 208146
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaOverload.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 7f9e0ecd96f..51d130c685e 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -9260,12 +9260,17 @@ struct CompareOverloadCandidatesForDisplay {
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;
OpenPOWER on IntegriCloud