r275970 - Deprecated (legacy) string literal conversion to 'char *' causes strange overloading resolution

Dmitry Polukhin via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 19 04:29:17 PDT 2016


Author: dpolukhin
Date: Tue Jul 19 06:29:16 2016
New Revision: 275970

URL: http://llvm.org/viewvc/llvm-project?rev=275970&view=rev
Log:
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

Added:
    cfe/trunk/test/SemaCXX/pr28050.cpp   (with props)
Modified:
    cfe/trunk/include/clang/Sema/Overload.h
    cfe/trunk/lib/Sema/SemaOverload.cpp

Modified: cfe/trunk/include/clang/Sema/Overload.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Overload.h?rev=275970&r1=275969&r2=275970&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Overload.h (original)
+++ cfe/trunk/include/clang/Sema/Overload.h Tue Jul 19 06:29:16 2016
@@ -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();
     }

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=275970&r1=275969&r2=275970&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Tue Jul 19 06:29:16 2016
@@ -1199,7 +1199,6 @@ TryUserDefinedConversion(Sema &S, Expr *
   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, Qu
       return ICS;
     }
 
-    ICS.UserDefined.Before.setAsIdentityConversion();
     ICS.UserDefined.After.ReferenceBinding = true;
     ICS.UserDefined.After.IsLvalueReference = !isRValRef;
     ICS.UserDefined.After.BindsToFunctionLvalue = false;

Added: cfe/trunk/test/SemaCXX/pr28050.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/pr28050.cpp?rev=275970&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/pr28050.cpp (added)
+++ cfe/trunk/test/SemaCXX/pr28050.cpp Tue Jul 19 06:29:16 2016
@@ -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"); }

Propchange: cfe/trunk/test/SemaCXX/pr28050.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/trunk/test/SemaCXX/pr28050.cpp
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Rev URL"

Propchange: cfe/trunk/test/SemaCXX/pr28050.cpp
------------------------------------------------------------------------------
    svn:mime-type = text/plain




More information about the cfe-commits mailing list