Move initialization via initializer list over to InitializationSequences.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91050 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaInit.h b/lib/Sema/SemaInit.h
index 85aa421..debb0de 100644
--- a/lib/Sema/SemaInit.h
+++ b/lib/Sema/SemaInit.h
@@ -1,4 +1,4 @@
-//===--- SemaInit.h - Semantic Analysis for Initializers ------------------===//
+//===--- SemaInit.h - Semantic Analysis for Initializers --------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -304,7 +304,10 @@
     DependentSequence,
 
     /// \brief A reference binding.
-    ReferenceBinding
+    ReferenceBinding,
+
+    /// \brief List initialization
+    ListInitialization
   };
   
   /// \brief Describes the kind of a particular step in an initialization
@@ -329,7 +332,9 @@
     /// \brief Perform a qualification conversion, producing an lvalue.
     SK_QualificationConversionLValue,
     /// \brief Perform an implicit conversion sequence.
-    SK_ConversionSequence
+    SK_ConversionSequence,
+    /// \brief Perform list-initialization
+    SK_ListInitialization
   };
   
   /// \brief A single step in the initialization sequence.
@@ -388,7 +393,14 @@
     /// \brief Reference binding failed.
     FK_ReferenceInitFailed,
     /// \brief Implicit conversion failed.
-    FK_ConversionFailed
+    FK_ConversionFailed,
+    /// \brief Too many initializers for scalar
+    FK_TooManyInitsForScalar,
+    /// \brief Reference initialization from an initializer list
+    FK_ReferenceBindingToInitList,
+    /// \brief Initialization of some unused destination type with an
+    /// initializer list.
+    FK_InitListBadDestinationType
   };
   
 private:
@@ -437,13 +449,20 @@
   /// \param Args the argument(s) provided for initialization, ownership of
   /// which is transfered into the routine.
   ///
+  /// \param ResultType if non-NULL, will be set to the type of the
+  /// initialized object, which is the type of the declaration in most
+  /// cases. However, when the initialized object is a variable of
+  /// incomplete array type and the initializer is an initializer
+  /// list, this type will be set to the completed array type.
+  ///
   /// \returns an expression that performs the actual object initialization, if
   /// the initialization is well-formed. Otherwise, emits diagnostics
   /// and returns an invalid expression.
   Action::OwningExprResult Perform(Sema &S,
                                    const InitializedEntity &Entity,
                                    const InitializationKind &Kind,
-                                   Action::MultiExprArg Args);
+                                   Action::MultiExprArg Args,
+                                   QualType *ResultType = 0);
   
   /// \brief Diagnose an potentially-invalid initialization sequence.
   ///
@@ -501,7 +520,10 @@
   /// \brief Add a new step that applies an implicit conversion sequence.
   void AddConversionSequenceStep(const ImplicitConversionSequence &ICS,
                                  QualType T);
-  
+
+  /// \brief Add a list-initialiation step  
+  void AddListInitializationStep(QualType T);
+
   /// \brief Note that this initialization sequence failed.
   void SetFailed(FailureKind Failure) {
     SequenceKind = FailedSequence;