From 495ba3e03410c42a9fa8efc8a21445a75911bef2 Mon Sep 17 00:00:00 2001 From: Dmitry Polukhin Date: Tue, 19 Jul 2016 11:29:16 +0000 Subject: [PATCH] Deprecated (legacy) string literal conversion to 'char *' causes strange overloading resolution It's a patch for PR28050. Seems like overloading resolution wipes out the first standard conversion sequence (before user-defined conversion) in case of deprecated string literal conversion. Differential revision: https://reviews.llvm.org/D21228 Patch by Alexander Makarov git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275970 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Sema/Overload.h | 7 +++++-- lib/Sema/SemaOverload.cpp | 2 -- test/SemaCXX/pr28050.cpp | 11 +++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 test/SemaCXX/pr28050.cpp diff --git a/include/clang/Sema/Overload.h b/include/clang/Sema/Overload.h index d0f21cd71f..68678ad7fc 100644 --- a/include/clang/Sema/Overload.h +++ b/include/clang/Sema/Overload.h @@ -428,8 +428,11 @@ namespace clang { }; ImplicitConversionSequence() - : ConversionKind(Uninitialized), StdInitializerListElement(false) - {} + : ConversionKind(Uninitialized), StdInitializerListElement(false) { + Standard.First = ICK_Identity; + Standard.Second = ICK_Identity; + Standard.Third = ICK_Identity; + } ~ImplicitConversionSequence() { destruct(); } diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index b025a397ed..dfb4cceddf 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1199,7 +1199,6 @@ TryUserDefinedConversion(Sema &S, Expr *From, QualType ToType, case OR_Success: case OR_Deleted: ICS.setUserDefined(); - ICS.UserDefined.Before.setAsIdentityConversion(); // C++ [over.ics.user]p4: // A conversion of an expression of class type to the same class // type is given Exact Match rank, and a conversion of an @@ -4540,7 +4539,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, return ICS; } - ICS.UserDefined.Before.setAsIdentityConversion(); ICS.UserDefined.After.ReferenceBinding = true; ICS.UserDefined.After.IsLvalueReference = !isRValRef; ICS.UserDefined.After.BindsToFunctionLvalue = false; diff --git a/test/SemaCXX/pr28050.cpp b/test/SemaCXX/pr28050.cpp new file mode 100644 index 0000000000..57e90eb751 --- /dev/null +++ b/test/SemaCXX/pr28050.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -std=c++11 %s -fsyntax-only +// +// expected-no-diagnostics + +class A { +public: + A(char *s) {} + A(A &&) = delete; +}; + +int main() { A a("OK"); } -- 2.40.0