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:
Douglas Gregor
2011-01-21 00:27:08 +00:00
parent 028ccbfcbf
commit d412fe598b
2 changed files with 5 additions and 11 deletions

View File

@@ -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);
}
}
}

View File

@@ -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 {