diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-05-17 04:36:39 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-05-17 04:36:39 +0000 |
commit | ec2748a8ad62769ff1a76d6ba2e57c17e888ded7 (patch) | |
tree | b6596d052d9d8d771672221affe46d136b21dcbf /clang/lib/Sema/SemaOverload.cpp | |
parent | d4d553403492e1032e90813879763a0129770ffe (diff) | |
download | bcm5719-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.cpp | 27 |
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 |