diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-21 00:27:08 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-21 00:27:08 +0000 |
commit | 564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1d (patch) | |
tree | c1041024624c018a4bdce64d957e77bfe2444adc | |
parent | 411c25c4512f00e07442e8818d011c7e0902d739 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123950 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaInit.cpp | 9 | ||||
-rw-r--r-- | test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp | 7 |
2 files changed, 5 insertions, 11 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 7360eca1e9..e25795de40 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -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); } } } diff --git a/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp b/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp index f8a13b7c2a..4629cb6484 100644 --- a/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp +++ b/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp @@ -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 { |