diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 8d03404e7a7d..af7aeae30329 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; + ImplicitConversionSequence::CompareKind Result = + compareConversionFunctions(S, Cand1.Function, Cand2.Function); + if (Result == ImplicitConversionSequence::Indistinguishable) + Result = CompareStandardConversionSequences(S, + Cand1.FinalConversion, + Cand2.FinalConversion); - 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; - - 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 diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/blocks.mm b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/blocks.mm index 345ea9bb2d63..96e8fcd8d371 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/blocks.mm +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/blocks.mm @@ -85,6 +85,24 @@ namespace overloading { void call_with_lambda() { int &ir = accept_lambda_conv([](int x) { return x + 1; }); } + + template using id = T; + + auto a = [](){}; + struct C : decltype(a) { + using decltype(a)::operator id; + private: + using decltype(a)::operator id; + } extern c; + + struct D : decltype(a) { + using decltype(a)::operator id; + private: + using decltype(a)::operator id; // expected-note {{here}} + } extern d; + + bool r1 = c; + bool r2 = d; // expected-error {{private}} } namespace PR13117 {