Skip to content

Commit

Permalink
Deprecated (legacy) string literal conversion to 'char *' causes stra…
Browse files Browse the repository at this point in the history
…nge 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

llvm-svn: 275970
  • Loading branch information
dmpolukhin committed Jul 19, 2016
1 parent 22117a8 commit ba57f02
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
7 changes: 5 additions & 2 deletions clang/include/clang/Sema/Overload.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
2 changes: 0 additions & 2 deletions clang/lib/Sema/SemaOverload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 11 additions & 0 deletions clang/test/SemaCXX/pr28050.cpp
Original file line number Diff line number Diff line change
@@ -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"); }

0 comments on commit ba57f02

Please sign in to comment.