From 03981014e4f0c3b4e935872dda96a28c2f1874ea Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Fri, 11 Dec 2009 02:42:07 +0000 Subject: [PATCH] Fix a recent regression from the initialization changes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91097 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaInit.cpp | 21 ++++++++++++--------- lib/Sema/SemaInit.h | 2 +- test/CodeGenCXX/reference-init.cpp | 9 +++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 test/CodeGenCXX/reference-init.cpp diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 08ae7cbfbe..a1fd79b852 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -2001,10 +2001,11 @@ void InitializationSequence::AddReferenceBindingStep(QualType T, Steps.push_back(S); } -void InitializationSequence::AddUserConversionStep(FunctionDecl *Function) { +void InitializationSequence::AddUserConversionStep(FunctionDecl *Function, + QualType T) { Step S; S.Kind = SK_UserConversion; - S.Type = Function->getResultType().getNonReferenceType(); + S.Type = T; S.Function = Function; Steps.push_back(S); } @@ -2209,18 +2210,20 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S, if (OverloadingResult Result = S.BestViableFunction(CandidateSet, DeclLoc, Best)) return Result; - - // Add the user-defined conversion step. + FunctionDecl *Function = Best->Function; - Sequence.AddUserConversionStep(Function); - - // Determine whether we need to perform derived-to-base or - // cv-qualification adjustments. + + // Compute the returned type of the conversion. if (isa(Function)) T2 = Function->getResultType(); else T2 = cv1T1; - + + // Add the user-defined conversion step. + Sequence.AddUserConversionStep(Function, T2.getNonReferenceType()); + + // Determine whether we need to perform derived-to-base or + // cv-qualification adjustments. bool NewDerivedToBase = false; Sema::ReferenceCompareResult NewRefRelationship = S.CompareReferenceRelationship(DeclLoc, T1, T2.getNonReferenceType(), diff --git a/lib/Sema/SemaInit.h b/lib/Sema/SemaInit.h index debb0deadd..a29159ace5 100644 --- a/lib/Sema/SemaInit.h +++ b/lib/Sema/SemaInit.h @@ -511,7 +511,7 @@ public: /// \brief Add a new step invoking a conversion function, which is either /// a constructor or a conversion function. - void AddUserConversionStep(FunctionDecl *Function); + void AddUserConversionStep(FunctionDecl *Function, QualType T); /// \brief Add a new step that performs a qualification conversion to the /// given type. diff --git a/test/CodeGenCXX/reference-init.cpp b/test/CodeGenCXX/reference-init.cpp new file mode 100644 index 0000000000..9baad94a96 --- /dev/null +++ b/test/CodeGenCXX/reference-init.cpp @@ -0,0 +1,9 @@ +// RUN: clang-cc -emit-llvm-only -verify %s + +struct XPTParamDescriptor {}; +struct nsXPTParamInfo { + nsXPTParamInfo(const XPTParamDescriptor& desc); +}; +void a(XPTParamDescriptor *params) { + const nsXPTParamInfo& paramInfo = params[0]; +} -- 2.50.1