summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaOverload.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-05-17 04:36:39 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-05-17 04:36:39 +0000
commitec2748a8ad62769ff1a76d6ba2e57c17e888ded7 (patch)
treeb6596d052d9d8d771672221affe46d136b21dcbf /clang/lib/Sema/SemaOverload.cpp
parentd4d553403492e1032e90813879763a0129770ffe (diff)
downloadbcm5719-llvm-ec2748a8ad62769ff1a76d6ba2e57c17e888ded7.tar.gz
bcm5719-llvm-ec2748a8ad62769ff1a76d6ba2e57c17e888ded7.zip
More fixes for isBetterOverloadCandidate not being a strict weak ordering. The
bug was obvious from inspection, figuring out a way to test it was... less so. llvm-svn: 209060
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r--clang/lib/Sema/SemaOverload.cpp27
1 files changed, 8 insertions, 19 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 8d03404e7a7..af7aeae3032 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -8250,26 +8250,15 @@ isBetterOverloadCandidate(Sema &S,
// other. This only distinguishes the results in non-standard, extension
// cases such as the conversion from a lambda closure type to a function
// pointer or block.
- ImplicitConversionSequence::CompareKind FuncResult
- = compareConversionFunctions(S, Cand1.Function, Cand2.Function);
- if (FuncResult != ImplicitConversionSequence::Indistinguishable)
- return FuncResult;
-
- switch (CompareStandardConversionSequences(S,
- Cand1.FinalConversion,
- Cand2.FinalConversion)) {
- case ImplicitConversionSequence::Better:
- // Cand1 has a better conversion sequence.
- return true;
-
- case ImplicitConversionSequence::Worse:
- // Cand1 can't be better than Cand2.
- return false;
+ ImplicitConversionSequence::CompareKind Result =
+ compareConversionFunctions(S, Cand1.Function, Cand2.Function);
+ if (Result == ImplicitConversionSequence::Indistinguishable)
+ Result = CompareStandardConversionSequences(S,
+ Cand1.FinalConversion,
+ Cand2.FinalConversion);
- case ImplicitConversionSequence::Indistinguishable:
- // Do nothing
- break;
- }
+ if (Result != ImplicitConversionSequence::Indistinguishable)
+ return Result == ImplicitConversionSequence::Better;
// FIXME: Compare kind of reference binding if conversion functions
// convert to a reference type used in direct reference binding, per
OpenPOWER on IntegriCloud