]> granicus.if.org Git - clang/commitdiff
Fix a recent regression from the initialization changes.
authorEli Friedman <eli.friedman@gmail.com>
Fri, 11 Dec 2009 02:42:07 +0000 (02:42 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 11 Dec 2009 02:42:07 +0000 (02:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91097 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
lib/Sema/SemaInit.h
test/CodeGenCXX/reference-init.cpp [new file with mode: 0644]

index 08ae7cbfbedb2593795ef9ec0efcf4a138babbc9..a1fd79b85235d63421d71959b8a52202556dc72e 100644 (file)
@@ -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<CXXConversionDecl>(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(),
index debb0deaddc5b570661a8ee850f5416026dcc8b6..a29159ace59934a5605aa3012cbc7a4fe38827a8 100644 (file)
@@ -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 (file)
index 0000000..9baad94
--- /dev/null
@@ -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];
+}