mirror of
https://github.com/intel/llvm.git
synced 2026-01-29 04:16:38 +08:00
When performing reference binding via a conversion function, perform
type checking based on the actual reference type we're trying to bind the result to, rather than stripping the reference. llvm-svn: 123950
This commit is contained in:
@@ -2363,11 +2363,6 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
|
||||
// functions.
|
||||
CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
|
||||
|
||||
// Determine the type we are converting to. If we are allowed to
|
||||
// convert to an rvalue, take the type that the destination type
|
||||
// refers to.
|
||||
QualType ToType = AllowRValues? cv1T1 : DestType;
|
||||
|
||||
const UnresolvedSetImpl *Conversions
|
||||
= T2RecordDecl->getVisibleConversionFunctions();
|
||||
for (UnresolvedSetImpl::const_iterator I = Conversions->begin(),
|
||||
@@ -2395,10 +2390,10 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
|
||||
if (ConvTemplate)
|
||||
S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(),
|
||||
ActingDC, Initializer,
|
||||
ToType, CandidateSet);
|
||||
DestType, CandidateSet);
|
||||
else
|
||||
S.AddConversionCandidate(Conv, I.getPair(), ActingDC,
|
||||
Initializer, ToType, CandidateSet);
|
||||
Initializer, DestType, CandidateSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ struct ConvertsTo {
|
||||
|
||||
void test_rvalue_refs() {
|
||||
// If the initializer expression...
|
||||
|
||||
// - is an xvalue, class prvalue, array prvalue or function lvalue
|
||||
// and "cv1 T1" is reference-compatible with "cv2 T2", or
|
||||
|
||||
@@ -54,9 +53,9 @@ void test_rvalue_refs() {
|
||||
// class prvalue
|
||||
Base&& base6 = ConvertsTo<Base>();
|
||||
Base&& base7 = ConvertsTo<Derived>();
|
||||
|
||||
// FIXME: function lvalue
|
||||
// int (&&function1)(int) = ConvertsTo<int(&)(int)>();
|
||||
|
||||
// function lvalue
|
||||
int (&&function1)(int) = ConvertsTo<int(&)(int)>();
|
||||
}
|
||||
|
||||
class NonCopyable {
|
||||
|
||||
Reference in New Issue
Block a user