xref: /aosp_15_r20/external/clang/lib/Sema/SemaInit.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements semantic analysis for initializers.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "clang/Sema/Initialization.h"
15*67e74705SXin Li #include "clang/AST/ASTContext.h"
16*67e74705SXin Li #include "clang/AST/DeclObjC.h"
17*67e74705SXin Li #include "clang/AST/ExprCXX.h"
18*67e74705SXin Li #include "clang/AST/ExprObjC.h"
19*67e74705SXin Li #include "clang/AST/TypeLoc.h"
20*67e74705SXin Li #include "clang/Basic/TargetInfo.h"
21*67e74705SXin Li #include "clang/Sema/Designator.h"
22*67e74705SXin Li #include "clang/Sema/Lookup.h"
23*67e74705SXin Li #include "clang/Sema/SemaInternal.h"
24*67e74705SXin Li #include "llvm/ADT/APInt.h"
25*67e74705SXin Li #include "llvm/ADT/SmallString.h"
26*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
27*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
28*67e74705SXin Li #include <map>
29*67e74705SXin Li 
30*67e74705SXin Li using namespace clang;
31*67e74705SXin Li 
32*67e74705SXin Li //===----------------------------------------------------------------------===//
33*67e74705SXin Li // Sema Initialization Checking
34*67e74705SXin Li //===----------------------------------------------------------------------===//
35*67e74705SXin Li 
36*67e74705SXin Li /// \brief Check whether T is compatible with a wide character type (wchar_t,
37*67e74705SXin Li /// char16_t or char32_t).
IsWideCharCompatible(QualType T,ASTContext & Context)38*67e74705SXin Li static bool IsWideCharCompatible(QualType T, ASTContext &Context) {
39*67e74705SXin Li   if (Context.typesAreCompatible(Context.getWideCharType(), T))
40*67e74705SXin Li     return true;
41*67e74705SXin Li   if (Context.getLangOpts().CPlusPlus || Context.getLangOpts().C11) {
42*67e74705SXin Li     return Context.typesAreCompatible(Context.Char16Ty, T) ||
43*67e74705SXin Li            Context.typesAreCompatible(Context.Char32Ty, T);
44*67e74705SXin Li   }
45*67e74705SXin Li   return false;
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li enum StringInitFailureKind {
49*67e74705SXin Li   SIF_None,
50*67e74705SXin Li   SIF_NarrowStringIntoWideChar,
51*67e74705SXin Li   SIF_WideStringIntoChar,
52*67e74705SXin Li   SIF_IncompatWideStringIntoWideChar,
53*67e74705SXin Li   SIF_Other
54*67e74705SXin Li };
55*67e74705SXin Li 
56*67e74705SXin Li /// \brief Check whether the array of type AT can be initialized by the Init
57*67e74705SXin Li /// expression by means of string initialization. Returns SIF_None if so,
58*67e74705SXin Li /// otherwise returns a StringInitFailureKind that describes why the
59*67e74705SXin Li /// initialization would not work.
IsStringInit(Expr * Init,const ArrayType * AT,ASTContext & Context)60*67e74705SXin Li static StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT,
61*67e74705SXin Li                                           ASTContext &Context) {
62*67e74705SXin Li   if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT))
63*67e74705SXin Li     return SIF_Other;
64*67e74705SXin Li 
65*67e74705SXin Li   // See if this is a string literal or @encode.
66*67e74705SXin Li   Init = Init->IgnoreParens();
67*67e74705SXin Li 
68*67e74705SXin Li   // Handle @encode, which is a narrow string.
69*67e74705SXin Li   if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType())
70*67e74705SXin Li     return SIF_None;
71*67e74705SXin Li 
72*67e74705SXin Li   // Otherwise we can only handle string literals.
73*67e74705SXin Li   StringLiteral *SL = dyn_cast<StringLiteral>(Init);
74*67e74705SXin Li   if (!SL)
75*67e74705SXin Li     return SIF_Other;
76*67e74705SXin Li 
77*67e74705SXin Li   const QualType ElemTy =
78*67e74705SXin Li       Context.getCanonicalType(AT->getElementType()).getUnqualifiedType();
79*67e74705SXin Li 
80*67e74705SXin Li   switch (SL->getKind()) {
81*67e74705SXin Li   case StringLiteral::Ascii:
82*67e74705SXin Li   case StringLiteral::UTF8:
83*67e74705SXin Li     // char array can be initialized with a narrow string.
84*67e74705SXin Li     // Only allow char x[] = "foo";  not char x[] = L"foo";
85*67e74705SXin Li     if (ElemTy->isCharType())
86*67e74705SXin Li       return SIF_None;
87*67e74705SXin Li     if (IsWideCharCompatible(ElemTy, Context))
88*67e74705SXin Li       return SIF_NarrowStringIntoWideChar;
89*67e74705SXin Li     return SIF_Other;
90*67e74705SXin Li   // C99 6.7.8p15 (with correction from DR343), or C11 6.7.9p15:
91*67e74705SXin Li   // "An array with element type compatible with a qualified or unqualified
92*67e74705SXin Li   // version of wchar_t, char16_t, or char32_t may be initialized by a wide
93*67e74705SXin Li   // string literal with the corresponding encoding prefix (L, u, or U,
94*67e74705SXin Li   // respectively), optionally enclosed in braces.
95*67e74705SXin Li   case StringLiteral::UTF16:
96*67e74705SXin Li     if (Context.typesAreCompatible(Context.Char16Ty, ElemTy))
97*67e74705SXin Li       return SIF_None;
98*67e74705SXin Li     if (ElemTy->isCharType())
99*67e74705SXin Li       return SIF_WideStringIntoChar;
100*67e74705SXin Li     if (IsWideCharCompatible(ElemTy, Context))
101*67e74705SXin Li       return SIF_IncompatWideStringIntoWideChar;
102*67e74705SXin Li     return SIF_Other;
103*67e74705SXin Li   case StringLiteral::UTF32:
104*67e74705SXin Li     if (Context.typesAreCompatible(Context.Char32Ty, ElemTy))
105*67e74705SXin Li       return SIF_None;
106*67e74705SXin Li     if (ElemTy->isCharType())
107*67e74705SXin Li       return SIF_WideStringIntoChar;
108*67e74705SXin Li     if (IsWideCharCompatible(ElemTy, Context))
109*67e74705SXin Li       return SIF_IncompatWideStringIntoWideChar;
110*67e74705SXin Li     return SIF_Other;
111*67e74705SXin Li   case StringLiteral::Wide:
112*67e74705SXin Li     if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy))
113*67e74705SXin Li       return SIF_None;
114*67e74705SXin Li     if (ElemTy->isCharType())
115*67e74705SXin Li       return SIF_WideStringIntoChar;
116*67e74705SXin Li     if (IsWideCharCompatible(ElemTy, Context))
117*67e74705SXin Li       return SIF_IncompatWideStringIntoWideChar;
118*67e74705SXin Li     return SIF_Other;
119*67e74705SXin Li   }
120*67e74705SXin Li 
121*67e74705SXin Li   llvm_unreachable("missed a StringLiteral kind?");
122*67e74705SXin Li }
123*67e74705SXin Li 
IsStringInit(Expr * init,QualType declType,ASTContext & Context)124*67e74705SXin Li static StringInitFailureKind IsStringInit(Expr *init, QualType declType,
125*67e74705SXin Li                                           ASTContext &Context) {
126*67e74705SXin Li   const ArrayType *arrayType = Context.getAsArrayType(declType);
127*67e74705SXin Li   if (!arrayType)
128*67e74705SXin Li     return SIF_Other;
129*67e74705SXin Li   return IsStringInit(init, arrayType, Context);
130*67e74705SXin Li }
131*67e74705SXin Li 
132*67e74705SXin Li /// Update the type of a string literal, including any surrounding parentheses,
133*67e74705SXin Li /// to match the type of the object which it is initializing.
updateStringLiteralType(Expr * E,QualType Ty)134*67e74705SXin Li static void updateStringLiteralType(Expr *E, QualType Ty) {
135*67e74705SXin Li   while (true) {
136*67e74705SXin Li     E->setType(Ty);
137*67e74705SXin Li     if (isa<StringLiteral>(E) || isa<ObjCEncodeExpr>(E))
138*67e74705SXin Li       break;
139*67e74705SXin Li     else if (ParenExpr *PE = dyn_cast<ParenExpr>(E))
140*67e74705SXin Li       E = PE->getSubExpr();
141*67e74705SXin Li     else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
142*67e74705SXin Li       E = UO->getSubExpr();
143*67e74705SXin Li     else if (GenericSelectionExpr *GSE = dyn_cast<GenericSelectionExpr>(E))
144*67e74705SXin Li       E = GSE->getResultExpr();
145*67e74705SXin Li     else
146*67e74705SXin Li       llvm_unreachable("unexpected expr in string literal init");
147*67e74705SXin Li   }
148*67e74705SXin Li }
149*67e74705SXin Li 
CheckStringInit(Expr * Str,QualType & DeclT,const ArrayType * AT,Sema & S)150*67e74705SXin Li static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
151*67e74705SXin Li                             Sema &S) {
152*67e74705SXin Li   // Get the length of the string as parsed.
153*67e74705SXin Li   auto *ConstantArrayTy =
154*67e74705SXin Li       cast<ConstantArrayType>(Str->getType()->getAsArrayTypeUnsafe());
155*67e74705SXin Li   uint64_t StrLength = ConstantArrayTy->getSize().getZExtValue();
156*67e74705SXin Li 
157*67e74705SXin Li   if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
158*67e74705SXin Li     // C99 6.7.8p14. We have an array of character type with unknown size
159*67e74705SXin Li     // being initialized to a string literal.
160*67e74705SXin Li     llvm::APInt ConstVal(32, StrLength);
161*67e74705SXin Li     // Return a new array type (C99 6.7.8p22).
162*67e74705SXin Li     DeclT = S.Context.getConstantArrayType(IAT->getElementType(),
163*67e74705SXin Li                                            ConstVal,
164*67e74705SXin Li                                            ArrayType::Normal, 0);
165*67e74705SXin Li     updateStringLiteralType(Str, DeclT);
166*67e74705SXin Li     return;
167*67e74705SXin Li   }
168*67e74705SXin Li 
169*67e74705SXin Li   const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
170*67e74705SXin Li 
171*67e74705SXin Li   // We have an array of character type with known size.  However,
172*67e74705SXin Li   // the size may be smaller or larger than the string we are initializing.
173*67e74705SXin Li   // FIXME: Avoid truncation for 64-bit length strings.
174*67e74705SXin Li   if (S.getLangOpts().CPlusPlus) {
175*67e74705SXin Li     if (StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens())) {
176*67e74705SXin Li       // For Pascal strings it's OK to strip off the terminating null character,
177*67e74705SXin Li       // so the example below is valid:
178*67e74705SXin Li       //
179*67e74705SXin Li       // unsigned char a[2] = "\pa";
180*67e74705SXin Li       if (SL->isPascal())
181*67e74705SXin Li         StrLength--;
182*67e74705SXin Li     }
183*67e74705SXin Li 
184*67e74705SXin Li     // [dcl.init.string]p2
185*67e74705SXin Li     if (StrLength > CAT->getSize().getZExtValue())
186*67e74705SXin Li       S.Diag(Str->getLocStart(),
187*67e74705SXin Li              diag::err_initializer_string_for_char_array_too_long)
188*67e74705SXin Li         << Str->getSourceRange();
189*67e74705SXin Li   } else {
190*67e74705SXin Li     // C99 6.7.8p14.
191*67e74705SXin Li     if (StrLength-1 > CAT->getSize().getZExtValue())
192*67e74705SXin Li       S.Diag(Str->getLocStart(),
193*67e74705SXin Li              diag::ext_initializer_string_for_char_array_too_long)
194*67e74705SXin Li         << Str->getSourceRange();
195*67e74705SXin Li   }
196*67e74705SXin Li 
197*67e74705SXin Li   // Set the type to the actual size that we are initializing.  If we have
198*67e74705SXin Li   // something like:
199*67e74705SXin Li   //   char x[1] = "foo";
200*67e74705SXin Li   // then this will set the string literal's type to char[1].
201*67e74705SXin Li   updateStringLiteralType(Str, DeclT);
202*67e74705SXin Li }
203*67e74705SXin Li 
204*67e74705SXin Li //===----------------------------------------------------------------------===//
205*67e74705SXin Li // Semantic checking for initializer lists.
206*67e74705SXin Li //===----------------------------------------------------------------------===//
207*67e74705SXin Li 
208*67e74705SXin Li namespace {
209*67e74705SXin Li 
210*67e74705SXin Li /// @brief Semantic checking for initializer lists.
211*67e74705SXin Li ///
212*67e74705SXin Li /// The InitListChecker class contains a set of routines that each
213*67e74705SXin Li /// handle the initialization of a certain kind of entity, e.g.,
214*67e74705SXin Li /// arrays, vectors, struct/union types, scalars, etc. The
215*67e74705SXin Li /// InitListChecker itself performs a recursive walk of the subobject
216*67e74705SXin Li /// structure of the type to be initialized, while stepping through
217*67e74705SXin Li /// the initializer list one element at a time. The IList and Index
218*67e74705SXin Li /// parameters to each of the Check* routines contain the active
219*67e74705SXin Li /// (syntactic) initializer list and the index into that initializer
220*67e74705SXin Li /// list that represents the current initializer. Each routine is
221*67e74705SXin Li /// responsible for moving that Index forward as it consumes elements.
222*67e74705SXin Li ///
223*67e74705SXin Li /// Each Check* routine also has a StructuredList/StructuredIndex
224*67e74705SXin Li /// arguments, which contains the current "structured" (semantic)
225*67e74705SXin Li /// initializer list and the index into that initializer list where we
226*67e74705SXin Li /// are copying initializers as we map them over to the semantic
227*67e74705SXin Li /// list. Once we have completed our recursive walk of the subobject
228*67e74705SXin Li /// structure, we will have constructed a full semantic initializer
229*67e74705SXin Li /// list.
230*67e74705SXin Li ///
231*67e74705SXin Li /// C99 designators cause changes in the initializer list traversal,
232*67e74705SXin Li /// because they make the initialization "jump" into a specific
233*67e74705SXin Li /// subobject and then continue the initialization from that
234*67e74705SXin Li /// point. CheckDesignatedInitializer() recursively steps into the
235*67e74705SXin Li /// designated subobject and manages backing out the recursion to
236*67e74705SXin Li /// initialize the subobjects after the one designated.
237*67e74705SXin Li class InitListChecker {
238*67e74705SXin Li   Sema &SemaRef;
239*67e74705SXin Li   bool hadError;
240*67e74705SXin Li   bool VerifyOnly; // no diagnostics, no structure building
241*67e74705SXin Li   bool TreatUnavailableAsInvalid; // Used only in VerifyOnly mode.
242*67e74705SXin Li   llvm::DenseMap<InitListExpr *, InitListExpr *> SyntacticToSemantic;
243*67e74705SXin Li   InitListExpr *FullyStructuredList;
244*67e74705SXin Li 
245*67e74705SXin Li   void CheckImplicitInitList(const InitializedEntity &Entity,
246*67e74705SXin Li                              InitListExpr *ParentIList, QualType T,
247*67e74705SXin Li                              unsigned &Index, InitListExpr *StructuredList,
248*67e74705SXin Li                              unsigned &StructuredIndex);
249*67e74705SXin Li   void CheckExplicitInitList(const InitializedEntity &Entity,
250*67e74705SXin Li                              InitListExpr *IList, QualType &T,
251*67e74705SXin Li                              InitListExpr *StructuredList,
252*67e74705SXin Li                              bool TopLevelObject = false);
253*67e74705SXin Li   void CheckListElementTypes(const InitializedEntity &Entity,
254*67e74705SXin Li                              InitListExpr *IList, QualType &DeclType,
255*67e74705SXin Li                              bool SubobjectIsDesignatorContext,
256*67e74705SXin Li                              unsigned &Index,
257*67e74705SXin Li                              InitListExpr *StructuredList,
258*67e74705SXin Li                              unsigned &StructuredIndex,
259*67e74705SXin Li                              bool TopLevelObject = false);
260*67e74705SXin Li   void CheckSubElementType(const InitializedEntity &Entity,
261*67e74705SXin Li                            InitListExpr *IList, QualType ElemType,
262*67e74705SXin Li                            unsigned &Index,
263*67e74705SXin Li                            InitListExpr *StructuredList,
264*67e74705SXin Li                            unsigned &StructuredIndex);
265*67e74705SXin Li   void CheckComplexType(const InitializedEntity &Entity,
266*67e74705SXin Li                         InitListExpr *IList, QualType DeclType,
267*67e74705SXin Li                         unsigned &Index,
268*67e74705SXin Li                         InitListExpr *StructuredList,
269*67e74705SXin Li                         unsigned &StructuredIndex);
270*67e74705SXin Li   void CheckScalarType(const InitializedEntity &Entity,
271*67e74705SXin Li                        InitListExpr *IList, QualType DeclType,
272*67e74705SXin Li                        unsigned &Index,
273*67e74705SXin Li                        InitListExpr *StructuredList,
274*67e74705SXin Li                        unsigned &StructuredIndex);
275*67e74705SXin Li   void CheckReferenceType(const InitializedEntity &Entity,
276*67e74705SXin Li                           InitListExpr *IList, QualType DeclType,
277*67e74705SXin Li                           unsigned &Index,
278*67e74705SXin Li                           InitListExpr *StructuredList,
279*67e74705SXin Li                           unsigned &StructuredIndex);
280*67e74705SXin Li   void CheckVectorType(const InitializedEntity &Entity,
281*67e74705SXin Li                        InitListExpr *IList, QualType DeclType, unsigned &Index,
282*67e74705SXin Li                        InitListExpr *StructuredList,
283*67e74705SXin Li                        unsigned &StructuredIndex);
284*67e74705SXin Li   void CheckStructUnionTypes(const InitializedEntity &Entity,
285*67e74705SXin Li                              InitListExpr *IList, QualType DeclType,
286*67e74705SXin Li                              CXXRecordDecl::base_class_range Bases,
287*67e74705SXin Li                              RecordDecl::field_iterator Field,
288*67e74705SXin Li                              bool SubobjectIsDesignatorContext, unsigned &Index,
289*67e74705SXin Li                              InitListExpr *StructuredList,
290*67e74705SXin Li                              unsigned &StructuredIndex,
291*67e74705SXin Li                              bool TopLevelObject = false);
292*67e74705SXin Li   void CheckArrayType(const InitializedEntity &Entity,
293*67e74705SXin Li                       InitListExpr *IList, QualType &DeclType,
294*67e74705SXin Li                       llvm::APSInt elementIndex,
295*67e74705SXin Li                       bool SubobjectIsDesignatorContext, unsigned &Index,
296*67e74705SXin Li                       InitListExpr *StructuredList,
297*67e74705SXin Li                       unsigned &StructuredIndex);
298*67e74705SXin Li   bool CheckDesignatedInitializer(const InitializedEntity &Entity,
299*67e74705SXin Li                                   InitListExpr *IList, DesignatedInitExpr *DIE,
300*67e74705SXin Li                                   unsigned DesigIdx,
301*67e74705SXin Li                                   QualType &CurrentObjectType,
302*67e74705SXin Li                                   RecordDecl::field_iterator *NextField,
303*67e74705SXin Li                                   llvm::APSInt *NextElementIndex,
304*67e74705SXin Li                                   unsigned &Index,
305*67e74705SXin Li                                   InitListExpr *StructuredList,
306*67e74705SXin Li                                   unsigned &StructuredIndex,
307*67e74705SXin Li                                   bool FinishSubobjectInit,
308*67e74705SXin Li                                   bool TopLevelObject);
309*67e74705SXin Li   InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
310*67e74705SXin Li                                            QualType CurrentObjectType,
311*67e74705SXin Li                                            InitListExpr *StructuredList,
312*67e74705SXin Li                                            unsigned StructuredIndex,
313*67e74705SXin Li                                            SourceRange InitRange,
314*67e74705SXin Li                                            bool IsFullyOverwritten = false);
315*67e74705SXin Li   void UpdateStructuredListElement(InitListExpr *StructuredList,
316*67e74705SXin Li                                    unsigned &StructuredIndex,
317*67e74705SXin Li                                    Expr *expr);
318*67e74705SXin Li   int numArrayElements(QualType DeclType);
319*67e74705SXin Li   int numStructUnionElements(QualType DeclType);
320*67e74705SXin Li 
321*67e74705SXin Li   static ExprResult PerformEmptyInit(Sema &SemaRef,
322*67e74705SXin Li                                      SourceLocation Loc,
323*67e74705SXin Li                                      const InitializedEntity &Entity,
324*67e74705SXin Li                                      bool VerifyOnly,
325*67e74705SXin Li                                      bool TreatUnavailableAsInvalid);
326*67e74705SXin Li 
327*67e74705SXin Li   // Explanation on the "FillWithNoInit" mode:
328*67e74705SXin Li   //
329*67e74705SXin Li   // Assume we have the following definitions (Case#1):
330*67e74705SXin Li   // struct P { char x[6][6]; } xp = { .x[1] = "bar" };
331*67e74705SXin Li   // struct PP { struct P lp; } l = { .lp = xp, .lp.x[1][2] = 'f' };
332*67e74705SXin Li   //
333*67e74705SXin Li   // l.lp.x[1][0..1] should not be filled with implicit initializers because the
334*67e74705SXin Li   // "base" initializer "xp" will provide values for them; l.lp.x[1] will be "baf".
335*67e74705SXin Li   //
336*67e74705SXin Li   // But if we have (Case#2):
337*67e74705SXin Li   // struct PP l = { .lp = xp, .lp.x[1] = { [2] = 'f' } };
338*67e74705SXin Li   //
339*67e74705SXin Li   // l.lp.x[1][0..1] are implicitly initialized and do not use values from the
340*67e74705SXin Li   // "base" initializer; l.lp.x[1] will be "\0\0f\0\0\0".
341*67e74705SXin Li   //
342*67e74705SXin Li   // To distinguish Case#1 from Case#2, and also to avoid leaving many "holes"
343*67e74705SXin Li   // in the InitListExpr, the "holes" in Case#1 are filled not with empty
344*67e74705SXin Li   // initializers but with special "NoInitExpr" place holders, which tells the
345*67e74705SXin Li   // CodeGen not to generate any initializers for these parts.
346*67e74705SXin Li   void FillInEmptyInitForBase(unsigned Init, const CXXBaseSpecifier &Base,
347*67e74705SXin Li                               const InitializedEntity &ParentEntity,
348*67e74705SXin Li                               InitListExpr *ILE, bool &RequiresSecondPass,
349*67e74705SXin Li                               bool FillWithNoInit);
350*67e74705SXin Li   void FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
351*67e74705SXin Li                                const InitializedEntity &ParentEntity,
352*67e74705SXin Li                                InitListExpr *ILE, bool &RequiresSecondPass,
353*67e74705SXin Li                                bool FillWithNoInit = false);
354*67e74705SXin Li   void FillInEmptyInitializations(const InitializedEntity &Entity,
355*67e74705SXin Li                                   InitListExpr *ILE, bool &RequiresSecondPass,
356*67e74705SXin Li                                   bool FillWithNoInit = false);
357*67e74705SXin Li   bool CheckFlexibleArrayInit(const InitializedEntity &Entity,
358*67e74705SXin Li                               Expr *InitExpr, FieldDecl *Field,
359*67e74705SXin Li                               bool TopLevelObject);
360*67e74705SXin Li   void CheckEmptyInitializable(const InitializedEntity &Entity,
361*67e74705SXin Li                                SourceLocation Loc);
362*67e74705SXin Li 
363*67e74705SXin Li public:
364*67e74705SXin Li   InitListChecker(Sema &S, const InitializedEntity &Entity,
365*67e74705SXin Li                   InitListExpr *IL, QualType &T, bool VerifyOnly,
366*67e74705SXin Li                   bool TreatUnavailableAsInvalid);
HadError()367*67e74705SXin Li   bool HadError() { return hadError; }
368*67e74705SXin Li 
369*67e74705SXin Li   // @brief Retrieves the fully-structured initializer list used for
370*67e74705SXin Li   // semantic analysis and code generation.
getFullyStructuredList() const371*67e74705SXin Li   InitListExpr *getFullyStructuredList() const { return FullyStructuredList; }
372*67e74705SXin Li };
373*67e74705SXin Li 
374*67e74705SXin Li } // end anonymous namespace
375*67e74705SXin Li 
PerformEmptyInit(Sema & SemaRef,SourceLocation Loc,const InitializedEntity & Entity,bool VerifyOnly,bool TreatUnavailableAsInvalid)376*67e74705SXin Li ExprResult InitListChecker::PerformEmptyInit(Sema &SemaRef,
377*67e74705SXin Li                                              SourceLocation Loc,
378*67e74705SXin Li                                              const InitializedEntity &Entity,
379*67e74705SXin Li                                              bool VerifyOnly,
380*67e74705SXin Li                                              bool TreatUnavailableAsInvalid) {
381*67e74705SXin Li   InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc,
382*67e74705SXin Li                                                             true);
383*67e74705SXin Li   MultiExprArg SubInit;
384*67e74705SXin Li   Expr *InitExpr;
385*67e74705SXin Li   InitListExpr DummyInitList(SemaRef.Context, Loc, None, Loc);
386*67e74705SXin Li 
387*67e74705SXin Li   // C++ [dcl.init.aggr]p7:
388*67e74705SXin Li   //   If there are fewer initializer-clauses in the list than there are
389*67e74705SXin Li   //   members in the aggregate, then each member not explicitly initialized
390*67e74705SXin Li   //   ...
391*67e74705SXin Li   bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
392*67e74705SXin Li       Entity.getType()->getBaseElementTypeUnsafe()->isRecordType();
393*67e74705SXin Li   if (EmptyInitList) {
394*67e74705SXin Li     // C++1y / DR1070:
395*67e74705SXin Li     //   shall be initialized [...] from an empty initializer list.
396*67e74705SXin Li     //
397*67e74705SXin Li     // We apply the resolution of this DR to C++11 but not C++98, since C++98
398*67e74705SXin Li     // does not have useful semantics for initialization from an init list.
399*67e74705SXin Li     // We treat this as copy-initialization, because aggregate initialization
400*67e74705SXin Li     // always performs copy-initialization on its elements.
401*67e74705SXin Li     //
402*67e74705SXin Li     // Only do this if we're initializing a class type, to avoid filling in
403*67e74705SXin Li     // the initializer list where possible.
404*67e74705SXin Li     InitExpr = VerifyOnly ? &DummyInitList : new (SemaRef.Context)
405*67e74705SXin Li                    InitListExpr(SemaRef.Context, Loc, None, Loc);
406*67e74705SXin Li     InitExpr->setType(SemaRef.Context.VoidTy);
407*67e74705SXin Li     SubInit = InitExpr;
408*67e74705SXin Li     Kind = InitializationKind::CreateCopy(Loc, Loc);
409*67e74705SXin Li   } else {
410*67e74705SXin Li     // C++03:
411*67e74705SXin Li     //   shall be value-initialized.
412*67e74705SXin Li   }
413*67e74705SXin Li 
414*67e74705SXin Li   InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit);
415*67e74705SXin Li   // libstdc++4.6 marks the vector default constructor as explicit in
416*67e74705SXin Li   // _GLIBCXX_DEBUG mode, so recover using the C++03 logic in that case.
417*67e74705SXin Li   // stlport does so too. Look for std::__debug for libstdc++, and for
418*67e74705SXin Li   // std:: for stlport.  This is effectively a compiler-side implementation of
419*67e74705SXin Li   // LWG2193.
420*67e74705SXin Li   if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() ==
421*67e74705SXin Li           InitializationSequence::FK_ExplicitConstructor) {
422*67e74705SXin Li     OverloadCandidateSet::iterator Best;
423*67e74705SXin Li     OverloadingResult O =
424*67e74705SXin Li         InitSeq.getFailedCandidateSet()
425*67e74705SXin Li             .BestViableFunction(SemaRef, Kind.getLocation(), Best);
426*67e74705SXin Li     (void)O;
427*67e74705SXin Li     assert(O == OR_Success && "Inconsistent overload resolution");
428*67e74705SXin Li     CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
429*67e74705SXin Li     CXXRecordDecl *R = CtorDecl->getParent();
430*67e74705SXin Li 
431*67e74705SXin Li     if (CtorDecl->getMinRequiredArguments() == 0 &&
432*67e74705SXin Li         CtorDecl->isExplicit() && R->getDeclName() &&
433*67e74705SXin Li         SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) {
434*67e74705SXin Li       bool IsInStd = false;
435*67e74705SXin Li       for (NamespaceDecl *ND = dyn_cast<NamespaceDecl>(R->getDeclContext());
436*67e74705SXin Li            ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
437*67e74705SXin Li         if (SemaRef.getStdNamespace()->InEnclosingNamespaceSetOf(ND))
438*67e74705SXin Li           IsInStd = true;
439*67e74705SXin Li       }
440*67e74705SXin Li 
441*67e74705SXin Li       if (IsInStd && llvm::StringSwitch<bool>(R->getName())
442*67e74705SXin Li               .Cases("basic_string", "deque", "forward_list", true)
443*67e74705SXin Li               .Cases("list", "map", "multimap", "multiset", true)
444*67e74705SXin Li               .Cases("priority_queue", "queue", "set", "stack", true)
445*67e74705SXin Li               .Cases("unordered_map", "unordered_set", "vector", true)
446*67e74705SXin Li               .Default(false)) {
447*67e74705SXin Li         InitSeq.InitializeFrom(
448*67e74705SXin Li             SemaRef, Entity,
449*67e74705SXin Li             InitializationKind::CreateValue(Loc, Loc, Loc, true),
450*67e74705SXin Li             MultiExprArg(), /*TopLevelOfInitList=*/false,
451*67e74705SXin Li             TreatUnavailableAsInvalid);
452*67e74705SXin Li         // Emit a warning for this.  System header warnings aren't shown
453*67e74705SXin Li         // by default, but people working on system headers should see it.
454*67e74705SXin Li         if (!VerifyOnly) {
455*67e74705SXin Li           SemaRef.Diag(CtorDecl->getLocation(),
456*67e74705SXin Li                        diag::warn_invalid_initializer_from_system_header);
457*67e74705SXin Li           if (Entity.getKind() == InitializedEntity::EK_Member)
458*67e74705SXin Li             SemaRef.Diag(Entity.getDecl()->getLocation(),
459*67e74705SXin Li                          diag::note_used_in_initialization_here);
460*67e74705SXin Li           else if (Entity.getKind() == InitializedEntity::EK_ArrayElement)
461*67e74705SXin Li             SemaRef.Diag(Loc, diag::note_used_in_initialization_here);
462*67e74705SXin Li         }
463*67e74705SXin Li       }
464*67e74705SXin Li     }
465*67e74705SXin Li   }
466*67e74705SXin Li   if (!InitSeq) {
467*67e74705SXin Li     if (!VerifyOnly) {
468*67e74705SXin Li       InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
469*67e74705SXin Li       if (Entity.getKind() == InitializedEntity::EK_Member)
470*67e74705SXin Li         SemaRef.Diag(Entity.getDecl()->getLocation(),
471*67e74705SXin Li                      diag::note_in_omitted_aggregate_initializer)
472*67e74705SXin Li           << /*field*/1 << Entity.getDecl();
473*67e74705SXin Li       else if (Entity.getKind() == InitializedEntity::EK_ArrayElement)
474*67e74705SXin Li         SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer)
475*67e74705SXin Li           << /*array element*/0 << Entity.getElementIndex();
476*67e74705SXin Li     }
477*67e74705SXin Li     return ExprError();
478*67e74705SXin Li   }
479*67e74705SXin Li 
480*67e74705SXin Li   return VerifyOnly ? ExprResult(static_cast<Expr *>(nullptr))
481*67e74705SXin Li                     : InitSeq.Perform(SemaRef, Entity, Kind, SubInit);
482*67e74705SXin Li }
483*67e74705SXin Li 
CheckEmptyInitializable(const InitializedEntity & Entity,SourceLocation Loc)484*67e74705SXin Li void InitListChecker::CheckEmptyInitializable(const InitializedEntity &Entity,
485*67e74705SXin Li                                               SourceLocation Loc) {
486*67e74705SXin Li   assert(VerifyOnly &&
487*67e74705SXin Li          "CheckEmptyInitializable is only inteded for verification mode.");
488*67e74705SXin Li   if (PerformEmptyInit(SemaRef, Loc, Entity, /*VerifyOnly*/true,
489*67e74705SXin Li                        TreatUnavailableAsInvalid).isInvalid())
490*67e74705SXin Li     hadError = true;
491*67e74705SXin Li }
492*67e74705SXin Li 
FillInEmptyInitForBase(unsigned Init,const CXXBaseSpecifier & Base,const InitializedEntity & ParentEntity,InitListExpr * ILE,bool & RequiresSecondPass,bool FillWithNoInit)493*67e74705SXin Li void InitListChecker::FillInEmptyInitForBase(
494*67e74705SXin Li     unsigned Init, const CXXBaseSpecifier &Base,
495*67e74705SXin Li     const InitializedEntity &ParentEntity, InitListExpr *ILE,
496*67e74705SXin Li     bool &RequiresSecondPass, bool FillWithNoInit) {
497*67e74705SXin Li   assert(Init < ILE->getNumInits() && "should have been expanded");
498*67e74705SXin Li 
499*67e74705SXin Li   InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
500*67e74705SXin Li       SemaRef.Context, &Base, false, &ParentEntity);
501*67e74705SXin Li 
502*67e74705SXin Li   if (!ILE->getInit(Init)) {
503*67e74705SXin Li     ExprResult BaseInit =
504*67e74705SXin Li         FillWithNoInit ? new (SemaRef.Context) NoInitExpr(Base.getType())
505*67e74705SXin Li                        : PerformEmptyInit(SemaRef, ILE->getLocEnd(), BaseEntity,
506*67e74705SXin Li                                           /*VerifyOnly*/ false,
507*67e74705SXin Li                                           TreatUnavailableAsInvalid);
508*67e74705SXin Li     if (BaseInit.isInvalid()) {
509*67e74705SXin Li       hadError = true;
510*67e74705SXin Li       return;
511*67e74705SXin Li     }
512*67e74705SXin Li 
513*67e74705SXin Li     ILE->setInit(Init, BaseInit.getAs<Expr>());
514*67e74705SXin Li   } else if (InitListExpr *InnerILE =
515*67e74705SXin Li                  dyn_cast<InitListExpr>(ILE->getInit(Init))) {
516*67e74705SXin Li     FillInEmptyInitializations(BaseEntity, InnerILE,
517*67e74705SXin Li                                RequiresSecondPass, FillWithNoInit);
518*67e74705SXin Li   } else if (DesignatedInitUpdateExpr *InnerDIUE =
519*67e74705SXin Li                dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
520*67e74705SXin Li     FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
521*67e74705SXin Li                                RequiresSecondPass, /*FillWithNoInit =*/true);
522*67e74705SXin Li   }
523*67e74705SXin Li }
524*67e74705SXin Li 
FillInEmptyInitForField(unsigned Init,FieldDecl * Field,const InitializedEntity & ParentEntity,InitListExpr * ILE,bool & RequiresSecondPass,bool FillWithNoInit)525*67e74705SXin Li void InitListChecker::FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
526*67e74705SXin Li                                         const InitializedEntity &ParentEntity,
527*67e74705SXin Li                                               InitListExpr *ILE,
528*67e74705SXin Li                                               bool &RequiresSecondPass,
529*67e74705SXin Li                                               bool FillWithNoInit) {
530*67e74705SXin Li   SourceLocation Loc = ILE->getLocEnd();
531*67e74705SXin Li   unsigned NumInits = ILE->getNumInits();
532*67e74705SXin Li   InitializedEntity MemberEntity
533*67e74705SXin Li     = InitializedEntity::InitializeMember(Field, &ParentEntity);
534*67e74705SXin Li 
535*67e74705SXin Li   if (const RecordType *RType = ILE->getType()->getAs<RecordType>())
536*67e74705SXin Li     if (!RType->getDecl()->isUnion())
537*67e74705SXin Li       assert(Init < NumInits && "This ILE should have been expanded");
538*67e74705SXin Li 
539*67e74705SXin Li   if (Init >= NumInits || !ILE->getInit(Init)) {
540*67e74705SXin Li     if (FillWithNoInit) {
541*67e74705SXin Li       Expr *Filler = new (SemaRef.Context) NoInitExpr(Field->getType());
542*67e74705SXin Li       if (Init < NumInits)
543*67e74705SXin Li         ILE->setInit(Init, Filler);
544*67e74705SXin Li       else
545*67e74705SXin Li         ILE->updateInit(SemaRef.Context, Init, Filler);
546*67e74705SXin Li       return;
547*67e74705SXin Li     }
548*67e74705SXin Li     // C++1y [dcl.init.aggr]p7:
549*67e74705SXin Li     //   If there are fewer initializer-clauses in the list than there are
550*67e74705SXin Li     //   members in the aggregate, then each member not explicitly initialized
551*67e74705SXin Li     //   shall be initialized from its brace-or-equal-initializer [...]
552*67e74705SXin Li     if (Field->hasInClassInitializer()) {
553*67e74705SXin Li       ExprResult DIE = SemaRef.BuildCXXDefaultInitExpr(Loc, Field);
554*67e74705SXin Li       if (DIE.isInvalid()) {
555*67e74705SXin Li         hadError = true;
556*67e74705SXin Li         return;
557*67e74705SXin Li       }
558*67e74705SXin Li       if (Init < NumInits)
559*67e74705SXin Li         ILE->setInit(Init, DIE.get());
560*67e74705SXin Li       else {
561*67e74705SXin Li         ILE->updateInit(SemaRef.Context, Init, DIE.get());
562*67e74705SXin Li         RequiresSecondPass = true;
563*67e74705SXin Li       }
564*67e74705SXin Li       return;
565*67e74705SXin Li     }
566*67e74705SXin Li 
567*67e74705SXin Li     if (Field->getType()->isReferenceType()) {
568*67e74705SXin Li       // C++ [dcl.init.aggr]p9:
569*67e74705SXin Li       //   If an incomplete or empty initializer-list leaves a
570*67e74705SXin Li       //   member of reference type uninitialized, the program is
571*67e74705SXin Li       //   ill-formed.
572*67e74705SXin Li       SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized)
573*67e74705SXin Li         << Field->getType()
574*67e74705SXin Li         << ILE->getSyntacticForm()->getSourceRange();
575*67e74705SXin Li       SemaRef.Diag(Field->getLocation(),
576*67e74705SXin Li                    diag::note_uninit_reference_member);
577*67e74705SXin Li       hadError = true;
578*67e74705SXin Li       return;
579*67e74705SXin Li     }
580*67e74705SXin Li 
581*67e74705SXin Li     ExprResult MemberInit = PerformEmptyInit(SemaRef, Loc, MemberEntity,
582*67e74705SXin Li                                              /*VerifyOnly*/false,
583*67e74705SXin Li                                              TreatUnavailableAsInvalid);
584*67e74705SXin Li     if (MemberInit.isInvalid()) {
585*67e74705SXin Li       hadError = true;
586*67e74705SXin Li       return;
587*67e74705SXin Li     }
588*67e74705SXin Li 
589*67e74705SXin Li     if (hadError) {
590*67e74705SXin Li       // Do nothing
591*67e74705SXin Li     } else if (Init < NumInits) {
592*67e74705SXin Li       ILE->setInit(Init, MemberInit.getAs<Expr>());
593*67e74705SXin Li     } else if (!isa<ImplicitValueInitExpr>(MemberInit.get())) {
594*67e74705SXin Li       // Empty initialization requires a constructor call, so
595*67e74705SXin Li       // extend the initializer list to include the constructor
596*67e74705SXin Li       // call and make a note that we'll need to take another pass
597*67e74705SXin Li       // through the initializer list.
598*67e74705SXin Li       ILE->updateInit(SemaRef.Context, Init, MemberInit.getAs<Expr>());
599*67e74705SXin Li       RequiresSecondPass = true;
600*67e74705SXin Li     }
601*67e74705SXin Li   } else if (InitListExpr *InnerILE
602*67e74705SXin Li                = dyn_cast<InitListExpr>(ILE->getInit(Init)))
603*67e74705SXin Li     FillInEmptyInitializations(MemberEntity, InnerILE,
604*67e74705SXin Li                                RequiresSecondPass, FillWithNoInit);
605*67e74705SXin Li   else if (DesignatedInitUpdateExpr *InnerDIUE
606*67e74705SXin Li                = dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init)))
607*67e74705SXin Li     FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
608*67e74705SXin Li                                RequiresSecondPass, /*FillWithNoInit =*/ true);
609*67e74705SXin Li }
610*67e74705SXin Li 
611*67e74705SXin Li /// Recursively replaces NULL values within the given initializer list
612*67e74705SXin Li /// with expressions that perform value-initialization of the
613*67e74705SXin Li /// appropriate type.
614*67e74705SXin Li void
FillInEmptyInitializations(const InitializedEntity & Entity,InitListExpr * ILE,bool & RequiresSecondPass,bool FillWithNoInit)615*67e74705SXin Li InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity,
616*67e74705SXin Li                                             InitListExpr *ILE,
617*67e74705SXin Li                                             bool &RequiresSecondPass,
618*67e74705SXin Li                                             bool FillWithNoInit) {
619*67e74705SXin Li   assert((ILE->getType() != SemaRef.Context.VoidTy) &&
620*67e74705SXin Li          "Should not have void type");
621*67e74705SXin Li 
622*67e74705SXin Li   if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) {
623*67e74705SXin Li     const RecordDecl *RDecl = RType->getDecl();
624*67e74705SXin Li     if (RDecl->isUnion() && ILE->getInitializedFieldInUnion())
625*67e74705SXin Li       FillInEmptyInitForField(0, ILE->getInitializedFieldInUnion(),
626*67e74705SXin Li                               Entity, ILE, RequiresSecondPass, FillWithNoInit);
627*67e74705SXin Li     else if (RDecl->isUnion() && isa<CXXRecordDecl>(RDecl) &&
628*67e74705SXin Li              cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) {
629*67e74705SXin Li       for (auto *Field : RDecl->fields()) {
630*67e74705SXin Li         if (Field->hasInClassInitializer()) {
631*67e74705SXin Li           FillInEmptyInitForField(0, Field, Entity, ILE, RequiresSecondPass,
632*67e74705SXin Li                                   FillWithNoInit);
633*67e74705SXin Li           break;
634*67e74705SXin Li         }
635*67e74705SXin Li       }
636*67e74705SXin Li     } else {
637*67e74705SXin Li       // The fields beyond ILE->getNumInits() are default initialized, so in
638*67e74705SXin Li       // order to leave them uninitialized, the ILE is expanded and the extra
639*67e74705SXin Li       // fields are then filled with NoInitExpr.
640*67e74705SXin Li       unsigned NumElems = numStructUnionElements(ILE->getType());
641*67e74705SXin Li       if (RDecl->hasFlexibleArrayMember())
642*67e74705SXin Li         ++NumElems;
643*67e74705SXin Li       if (ILE->getNumInits() < NumElems)
644*67e74705SXin Li         ILE->resizeInits(SemaRef.Context, NumElems);
645*67e74705SXin Li 
646*67e74705SXin Li       unsigned Init = 0;
647*67e74705SXin Li 
648*67e74705SXin Li       if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
649*67e74705SXin Li         for (auto &Base : CXXRD->bases()) {
650*67e74705SXin Li           if (hadError)
651*67e74705SXin Li             return;
652*67e74705SXin Li 
653*67e74705SXin Li           FillInEmptyInitForBase(Init, Base, Entity, ILE, RequiresSecondPass,
654*67e74705SXin Li                                  FillWithNoInit);
655*67e74705SXin Li           ++Init;
656*67e74705SXin Li         }
657*67e74705SXin Li       }
658*67e74705SXin Li 
659*67e74705SXin Li       for (auto *Field : RDecl->fields()) {
660*67e74705SXin Li         if (Field->isUnnamedBitfield())
661*67e74705SXin Li           continue;
662*67e74705SXin Li 
663*67e74705SXin Li         if (hadError)
664*67e74705SXin Li           return;
665*67e74705SXin Li 
666*67e74705SXin Li         FillInEmptyInitForField(Init, Field, Entity, ILE, RequiresSecondPass,
667*67e74705SXin Li                                 FillWithNoInit);
668*67e74705SXin Li         if (hadError)
669*67e74705SXin Li           return;
670*67e74705SXin Li 
671*67e74705SXin Li         ++Init;
672*67e74705SXin Li 
673*67e74705SXin Li         // Only look at the first initialization of a union.
674*67e74705SXin Li         if (RDecl->isUnion())
675*67e74705SXin Li           break;
676*67e74705SXin Li       }
677*67e74705SXin Li     }
678*67e74705SXin Li 
679*67e74705SXin Li     return;
680*67e74705SXin Li   }
681*67e74705SXin Li 
682*67e74705SXin Li   QualType ElementType;
683*67e74705SXin Li 
684*67e74705SXin Li   InitializedEntity ElementEntity = Entity;
685*67e74705SXin Li   unsigned NumInits = ILE->getNumInits();
686*67e74705SXin Li   unsigned NumElements = NumInits;
687*67e74705SXin Li   if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) {
688*67e74705SXin Li     ElementType = AType->getElementType();
689*67e74705SXin Li     if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType))
690*67e74705SXin Li       NumElements = CAType->getSize().getZExtValue();
691*67e74705SXin Li     ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
692*67e74705SXin Li                                                          0, Entity);
693*67e74705SXin Li   } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) {
694*67e74705SXin Li     ElementType = VType->getElementType();
695*67e74705SXin Li     NumElements = VType->getNumElements();
696*67e74705SXin Li     ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
697*67e74705SXin Li                                                          0, Entity);
698*67e74705SXin Li   } else
699*67e74705SXin Li     ElementType = ILE->getType();
700*67e74705SXin Li 
701*67e74705SXin Li   for (unsigned Init = 0; Init != NumElements; ++Init) {
702*67e74705SXin Li     if (hadError)
703*67e74705SXin Li       return;
704*67e74705SXin Li 
705*67e74705SXin Li     if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement ||
706*67e74705SXin Li         ElementEntity.getKind() == InitializedEntity::EK_VectorElement)
707*67e74705SXin Li       ElementEntity.setElementIndex(Init);
708*67e74705SXin Li 
709*67e74705SXin Li     Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : nullptr);
710*67e74705SXin Li     if (!InitExpr && Init < NumInits && ILE->hasArrayFiller())
711*67e74705SXin Li       ILE->setInit(Init, ILE->getArrayFiller());
712*67e74705SXin Li     else if (!InitExpr && !ILE->hasArrayFiller()) {
713*67e74705SXin Li       Expr *Filler = nullptr;
714*67e74705SXin Li 
715*67e74705SXin Li       if (FillWithNoInit)
716*67e74705SXin Li         Filler = new (SemaRef.Context) NoInitExpr(ElementType);
717*67e74705SXin Li       else {
718*67e74705SXin Li         ExprResult ElementInit = PerformEmptyInit(SemaRef, ILE->getLocEnd(),
719*67e74705SXin Li                                                   ElementEntity,
720*67e74705SXin Li                                                   /*VerifyOnly*/false,
721*67e74705SXin Li                                                   TreatUnavailableAsInvalid);
722*67e74705SXin Li         if (ElementInit.isInvalid()) {
723*67e74705SXin Li           hadError = true;
724*67e74705SXin Li           return;
725*67e74705SXin Li         }
726*67e74705SXin Li 
727*67e74705SXin Li         Filler = ElementInit.getAs<Expr>();
728*67e74705SXin Li       }
729*67e74705SXin Li 
730*67e74705SXin Li       if (hadError) {
731*67e74705SXin Li         // Do nothing
732*67e74705SXin Li       } else if (Init < NumInits) {
733*67e74705SXin Li         // For arrays, just set the expression used for value-initialization
734*67e74705SXin Li         // of the "holes" in the array.
735*67e74705SXin Li         if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement)
736*67e74705SXin Li           ILE->setArrayFiller(Filler);
737*67e74705SXin Li         else
738*67e74705SXin Li           ILE->setInit(Init, Filler);
739*67e74705SXin Li       } else {
740*67e74705SXin Li         // For arrays, just set the expression used for value-initialization
741*67e74705SXin Li         // of the rest of elements and exit.
742*67e74705SXin Li         if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) {
743*67e74705SXin Li           ILE->setArrayFiller(Filler);
744*67e74705SXin Li           return;
745*67e74705SXin Li         }
746*67e74705SXin Li 
747*67e74705SXin Li         if (!isa<ImplicitValueInitExpr>(Filler) && !isa<NoInitExpr>(Filler)) {
748*67e74705SXin Li           // Empty initialization requires a constructor call, so
749*67e74705SXin Li           // extend the initializer list to include the constructor
750*67e74705SXin Li           // call and make a note that we'll need to take another pass
751*67e74705SXin Li           // through the initializer list.
752*67e74705SXin Li           ILE->updateInit(SemaRef.Context, Init, Filler);
753*67e74705SXin Li           RequiresSecondPass = true;
754*67e74705SXin Li         }
755*67e74705SXin Li       }
756*67e74705SXin Li     } else if (InitListExpr *InnerILE
757*67e74705SXin Li                  = dyn_cast_or_null<InitListExpr>(InitExpr))
758*67e74705SXin Li       FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
759*67e74705SXin Li                                  FillWithNoInit);
760*67e74705SXin Li     else if (DesignatedInitUpdateExpr *InnerDIUE
761*67e74705SXin Li                  = dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr))
762*67e74705SXin Li       FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
763*67e74705SXin Li                                  RequiresSecondPass, /*FillWithNoInit =*/ true);
764*67e74705SXin Li   }
765*67e74705SXin Li }
766*67e74705SXin Li 
InitListChecker(Sema & S,const InitializedEntity & Entity,InitListExpr * IL,QualType & T,bool VerifyOnly,bool TreatUnavailableAsInvalid)767*67e74705SXin Li InitListChecker::InitListChecker(Sema &S, const InitializedEntity &Entity,
768*67e74705SXin Li                                  InitListExpr *IL, QualType &T,
769*67e74705SXin Li                                  bool VerifyOnly,
770*67e74705SXin Li                                  bool TreatUnavailableAsInvalid)
771*67e74705SXin Li   : SemaRef(S), VerifyOnly(VerifyOnly),
772*67e74705SXin Li     TreatUnavailableAsInvalid(TreatUnavailableAsInvalid) {
773*67e74705SXin Li   // FIXME: Check that IL isn't already the semantic form of some other
774*67e74705SXin Li   // InitListExpr. If it is, we'd create a broken AST.
775*67e74705SXin Li 
776*67e74705SXin Li   hadError = false;
777*67e74705SXin Li 
778*67e74705SXin Li   FullyStructuredList =
779*67e74705SXin Li       getStructuredSubobjectInit(IL, 0, T, nullptr, 0, IL->getSourceRange());
780*67e74705SXin Li   CheckExplicitInitList(Entity, IL, T, FullyStructuredList,
781*67e74705SXin Li                         /*TopLevelObject=*/true);
782*67e74705SXin Li 
783*67e74705SXin Li   if (!hadError && !VerifyOnly) {
784*67e74705SXin Li     bool RequiresSecondPass = false;
785*67e74705SXin Li     FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass);
786*67e74705SXin Li     if (RequiresSecondPass && !hadError)
787*67e74705SXin Li       FillInEmptyInitializations(Entity, FullyStructuredList,
788*67e74705SXin Li                                  RequiresSecondPass);
789*67e74705SXin Li   }
790*67e74705SXin Li }
791*67e74705SXin Li 
numArrayElements(QualType DeclType)792*67e74705SXin Li int InitListChecker::numArrayElements(QualType DeclType) {
793*67e74705SXin Li   // FIXME: use a proper constant
794*67e74705SXin Li   int maxElements = 0x7FFFFFFF;
795*67e74705SXin Li   if (const ConstantArrayType *CAT =
796*67e74705SXin Li         SemaRef.Context.getAsConstantArrayType(DeclType)) {
797*67e74705SXin Li     maxElements = static_cast<int>(CAT->getSize().getZExtValue());
798*67e74705SXin Li   }
799*67e74705SXin Li   return maxElements;
800*67e74705SXin Li }
801*67e74705SXin Li 
numStructUnionElements(QualType DeclType)802*67e74705SXin Li int InitListChecker::numStructUnionElements(QualType DeclType) {
803*67e74705SXin Li   RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl();
804*67e74705SXin Li   int InitializableMembers = 0;
805*67e74705SXin Li   if (auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
806*67e74705SXin Li     InitializableMembers += CXXRD->getNumBases();
807*67e74705SXin Li   for (const auto *Field : structDecl->fields())
808*67e74705SXin Li     if (!Field->isUnnamedBitfield())
809*67e74705SXin Li       ++InitializableMembers;
810*67e74705SXin Li 
811*67e74705SXin Li   if (structDecl->isUnion())
812*67e74705SXin Li     return std::min(InitializableMembers, 1);
813*67e74705SXin Li   return InitializableMembers - structDecl->hasFlexibleArrayMember();
814*67e74705SXin Li }
815*67e74705SXin Li 
816*67e74705SXin Li /// Check whether the range of the initializer \p ParentIList from element
817*67e74705SXin Li /// \p Index onwards can be used to initialize an object of type \p T. Update
818*67e74705SXin Li /// \p Index to indicate how many elements of the list were consumed.
819*67e74705SXin Li ///
820*67e74705SXin Li /// This also fills in \p StructuredList, from element \p StructuredIndex
821*67e74705SXin Li /// onwards, with the fully-braced, desugared form of the initialization.
CheckImplicitInitList(const InitializedEntity & Entity,InitListExpr * ParentIList,QualType T,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)822*67e74705SXin Li void InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity,
823*67e74705SXin Li                                             InitListExpr *ParentIList,
824*67e74705SXin Li                                             QualType T, unsigned &Index,
825*67e74705SXin Li                                             InitListExpr *StructuredList,
826*67e74705SXin Li                                             unsigned &StructuredIndex) {
827*67e74705SXin Li   int maxElements = 0;
828*67e74705SXin Li 
829*67e74705SXin Li   if (T->isArrayType())
830*67e74705SXin Li     maxElements = numArrayElements(T);
831*67e74705SXin Li   else if (T->isRecordType())
832*67e74705SXin Li     maxElements = numStructUnionElements(T);
833*67e74705SXin Li   else if (T->isVectorType())
834*67e74705SXin Li     maxElements = T->getAs<VectorType>()->getNumElements();
835*67e74705SXin Li   else
836*67e74705SXin Li     llvm_unreachable("CheckImplicitInitList(): Illegal type");
837*67e74705SXin Li 
838*67e74705SXin Li   if (maxElements == 0) {
839*67e74705SXin Li     if (!VerifyOnly)
840*67e74705SXin Li       SemaRef.Diag(ParentIList->getInit(Index)->getLocStart(),
841*67e74705SXin Li                    diag::err_implicit_empty_initializer);
842*67e74705SXin Li     ++Index;
843*67e74705SXin Li     hadError = true;
844*67e74705SXin Li     return;
845*67e74705SXin Li   }
846*67e74705SXin Li 
847*67e74705SXin Li   // Build a structured initializer list corresponding to this subobject.
848*67e74705SXin Li   InitListExpr *StructuredSubobjectInitList
849*67e74705SXin Li     = getStructuredSubobjectInit(ParentIList, Index, T, StructuredList,
850*67e74705SXin Li                                  StructuredIndex,
851*67e74705SXin Li           SourceRange(ParentIList->getInit(Index)->getLocStart(),
852*67e74705SXin Li                       ParentIList->getSourceRange().getEnd()));
853*67e74705SXin Li   unsigned StructuredSubobjectInitIndex = 0;
854*67e74705SXin Li 
855*67e74705SXin Li   // Check the element types and build the structural subobject.
856*67e74705SXin Li   unsigned StartIndex = Index;
857*67e74705SXin Li   CheckListElementTypes(Entity, ParentIList, T,
858*67e74705SXin Li                         /*SubobjectIsDesignatorContext=*/false, Index,
859*67e74705SXin Li                         StructuredSubobjectInitList,
860*67e74705SXin Li                         StructuredSubobjectInitIndex);
861*67e74705SXin Li 
862*67e74705SXin Li   if (!VerifyOnly) {
863*67e74705SXin Li     StructuredSubobjectInitList->setType(T);
864*67e74705SXin Li 
865*67e74705SXin Li     unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
866*67e74705SXin Li     // Update the structured sub-object initializer so that it's ending
867*67e74705SXin Li     // range corresponds with the end of the last initializer it used.
868*67e74705SXin Li     if (EndIndex < ParentIList->getNumInits() &&
869*67e74705SXin Li         ParentIList->getInit(EndIndex)) {
870*67e74705SXin Li       SourceLocation EndLoc
871*67e74705SXin Li         = ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
872*67e74705SXin Li       StructuredSubobjectInitList->setRBraceLoc(EndLoc);
873*67e74705SXin Li     }
874*67e74705SXin Li 
875*67e74705SXin Li     // Complain about missing braces.
876*67e74705SXin Li     if (T->isArrayType() || T->isRecordType()) {
877*67e74705SXin Li       SemaRef.Diag(StructuredSubobjectInitList->getLocStart(),
878*67e74705SXin Li                    diag::warn_missing_braces)
879*67e74705SXin Li           << StructuredSubobjectInitList->getSourceRange()
880*67e74705SXin Li           << FixItHint::CreateInsertion(
881*67e74705SXin Li                  StructuredSubobjectInitList->getLocStart(), "{")
882*67e74705SXin Li           << FixItHint::CreateInsertion(
883*67e74705SXin Li                  SemaRef.getLocForEndOfToken(
884*67e74705SXin Li                      StructuredSubobjectInitList->getLocEnd()),
885*67e74705SXin Li                  "}");
886*67e74705SXin Li     }
887*67e74705SXin Li   }
888*67e74705SXin Li }
889*67e74705SXin Li 
890*67e74705SXin Li /// Warn that \p Entity was of scalar type and was initialized by a
891*67e74705SXin Li /// single-element braced initializer list.
warnBracedScalarInit(Sema & S,const InitializedEntity & Entity,SourceRange Braces)892*67e74705SXin Li static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity,
893*67e74705SXin Li                                  SourceRange Braces) {
894*67e74705SXin Li   // Don't warn during template instantiation. If the initialization was
895*67e74705SXin Li   // non-dependent, we warned during the initial parse; otherwise, the
896*67e74705SXin Li   // type might not be scalar in some uses of the template.
897*67e74705SXin Li   if (!S.ActiveTemplateInstantiations.empty())
898*67e74705SXin Li     return;
899*67e74705SXin Li 
900*67e74705SXin Li   unsigned DiagID = 0;
901*67e74705SXin Li 
902*67e74705SXin Li   switch (Entity.getKind()) {
903*67e74705SXin Li   case InitializedEntity::EK_VectorElement:
904*67e74705SXin Li   case InitializedEntity::EK_ComplexElement:
905*67e74705SXin Li   case InitializedEntity::EK_ArrayElement:
906*67e74705SXin Li   case InitializedEntity::EK_Parameter:
907*67e74705SXin Li   case InitializedEntity::EK_Parameter_CF_Audited:
908*67e74705SXin Li   case InitializedEntity::EK_Result:
909*67e74705SXin Li     // Extra braces here are suspicious.
910*67e74705SXin Li     DiagID = diag::warn_braces_around_scalar_init;
911*67e74705SXin Li     break;
912*67e74705SXin Li 
913*67e74705SXin Li   case InitializedEntity::EK_Member:
914*67e74705SXin Li     // Warn on aggregate initialization but not on ctor init list or
915*67e74705SXin Li     // default member initializer.
916*67e74705SXin Li     if (Entity.getParent())
917*67e74705SXin Li       DiagID = diag::warn_braces_around_scalar_init;
918*67e74705SXin Li     break;
919*67e74705SXin Li 
920*67e74705SXin Li   case InitializedEntity::EK_Variable:
921*67e74705SXin Li   case InitializedEntity::EK_LambdaCapture:
922*67e74705SXin Li     // No warning, might be direct-list-initialization.
923*67e74705SXin Li     // FIXME: Should we warn for copy-list-initialization in these cases?
924*67e74705SXin Li     break;
925*67e74705SXin Li 
926*67e74705SXin Li   case InitializedEntity::EK_New:
927*67e74705SXin Li   case InitializedEntity::EK_Temporary:
928*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
929*67e74705SXin Li     // No warning, braces are part of the syntax of the underlying construct.
930*67e74705SXin Li     break;
931*67e74705SXin Li 
932*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
933*67e74705SXin Li     // No warning, we already warned when initializing the result.
934*67e74705SXin Li     break;
935*67e74705SXin Li 
936*67e74705SXin Li   case InitializedEntity::EK_Exception:
937*67e74705SXin Li   case InitializedEntity::EK_Base:
938*67e74705SXin Li   case InitializedEntity::EK_Delegating:
939*67e74705SXin Li   case InitializedEntity::EK_BlockElement:
940*67e74705SXin Li     llvm_unreachable("unexpected braced scalar init");
941*67e74705SXin Li   }
942*67e74705SXin Li 
943*67e74705SXin Li   if (DiagID) {
944*67e74705SXin Li     S.Diag(Braces.getBegin(), DiagID)
945*67e74705SXin Li       << Braces
946*67e74705SXin Li       << FixItHint::CreateRemoval(Braces.getBegin())
947*67e74705SXin Li       << FixItHint::CreateRemoval(Braces.getEnd());
948*67e74705SXin Li   }
949*67e74705SXin Li }
950*67e74705SXin Li 
951*67e74705SXin Li /// Check whether the initializer \p IList (that was written with explicit
952*67e74705SXin Li /// braces) can be used to initialize an object of type \p T.
953*67e74705SXin Li ///
954*67e74705SXin Li /// This also fills in \p StructuredList with the fully-braced, desugared
955*67e74705SXin Li /// form of the initialization.
CheckExplicitInitList(const InitializedEntity & Entity,InitListExpr * IList,QualType & T,InitListExpr * StructuredList,bool TopLevelObject)956*67e74705SXin Li void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
957*67e74705SXin Li                                             InitListExpr *IList, QualType &T,
958*67e74705SXin Li                                             InitListExpr *StructuredList,
959*67e74705SXin Li                                             bool TopLevelObject) {
960*67e74705SXin Li   if (!VerifyOnly) {
961*67e74705SXin Li     SyntacticToSemantic[IList] = StructuredList;
962*67e74705SXin Li     StructuredList->setSyntacticForm(IList);
963*67e74705SXin Li   }
964*67e74705SXin Li 
965*67e74705SXin Li   unsigned Index = 0, StructuredIndex = 0;
966*67e74705SXin Li   CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true,
967*67e74705SXin Li                         Index, StructuredList, StructuredIndex, TopLevelObject);
968*67e74705SXin Li   if (!VerifyOnly) {
969*67e74705SXin Li     QualType ExprTy = T;
970*67e74705SXin Li     if (!ExprTy->isArrayType())
971*67e74705SXin Li       ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context);
972*67e74705SXin Li     IList->setType(ExprTy);
973*67e74705SXin Li     StructuredList->setType(ExprTy);
974*67e74705SXin Li   }
975*67e74705SXin Li   if (hadError)
976*67e74705SXin Li     return;
977*67e74705SXin Li 
978*67e74705SXin Li   if (Index < IList->getNumInits()) {
979*67e74705SXin Li     // We have leftover initializers
980*67e74705SXin Li     if (VerifyOnly) {
981*67e74705SXin Li       if (SemaRef.getLangOpts().CPlusPlus ||
982*67e74705SXin Li           (SemaRef.getLangOpts().OpenCL &&
983*67e74705SXin Li            IList->getType()->isVectorType())) {
984*67e74705SXin Li         hadError = true;
985*67e74705SXin Li       }
986*67e74705SXin Li       return;
987*67e74705SXin Li     }
988*67e74705SXin Li 
989*67e74705SXin Li     if (StructuredIndex == 1 &&
990*67e74705SXin Li         IsStringInit(StructuredList->getInit(0), T, SemaRef.Context) ==
991*67e74705SXin Li             SIF_None) {
992*67e74705SXin Li       unsigned DK = diag::ext_excess_initializers_in_char_array_initializer;
993*67e74705SXin Li       if (SemaRef.getLangOpts().CPlusPlus) {
994*67e74705SXin Li         DK = diag::err_excess_initializers_in_char_array_initializer;
995*67e74705SXin Li         hadError = true;
996*67e74705SXin Li       }
997*67e74705SXin Li       // Special-case
998*67e74705SXin Li       SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK)
999*67e74705SXin Li         << IList->getInit(Index)->getSourceRange();
1000*67e74705SXin Li     } else if (!T->isIncompleteType()) {
1001*67e74705SXin Li       // Don't complain for incomplete types, since we'll get an error
1002*67e74705SXin Li       // elsewhere
1003*67e74705SXin Li       QualType CurrentObjectType = StructuredList->getType();
1004*67e74705SXin Li       int initKind =
1005*67e74705SXin Li         CurrentObjectType->isArrayType()? 0 :
1006*67e74705SXin Li         CurrentObjectType->isVectorType()? 1 :
1007*67e74705SXin Li         CurrentObjectType->isScalarType()? 2 :
1008*67e74705SXin Li         CurrentObjectType->isUnionType()? 3 :
1009*67e74705SXin Li         4;
1010*67e74705SXin Li 
1011*67e74705SXin Li       unsigned DK = diag::ext_excess_initializers;
1012*67e74705SXin Li       if (SemaRef.getLangOpts().CPlusPlus) {
1013*67e74705SXin Li         DK = diag::err_excess_initializers;
1014*67e74705SXin Li         hadError = true;
1015*67e74705SXin Li       }
1016*67e74705SXin Li       if (SemaRef.getLangOpts().OpenCL && initKind == 1) {
1017*67e74705SXin Li         DK = diag::err_excess_initializers;
1018*67e74705SXin Li         hadError = true;
1019*67e74705SXin Li       }
1020*67e74705SXin Li 
1021*67e74705SXin Li       SemaRef.Diag(IList->getInit(Index)->getLocStart(), DK)
1022*67e74705SXin Li         << initKind << IList->getInit(Index)->getSourceRange();
1023*67e74705SXin Li     }
1024*67e74705SXin Li   }
1025*67e74705SXin Li 
1026*67e74705SXin Li   if (!VerifyOnly && T->isScalarType() &&
1027*67e74705SXin Li       IList->getNumInits() == 1 && !isa<InitListExpr>(IList->getInit(0)))
1028*67e74705SXin Li     warnBracedScalarInit(SemaRef, Entity, IList->getSourceRange());
1029*67e74705SXin Li }
1030*67e74705SXin Li 
CheckListElementTypes(const InitializedEntity & Entity,InitListExpr * IList,QualType & DeclType,bool SubobjectIsDesignatorContext,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex,bool TopLevelObject)1031*67e74705SXin Li void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
1032*67e74705SXin Li                                             InitListExpr *IList,
1033*67e74705SXin Li                                             QualType &DeclType,
1034*67e74705SXin Li                                             bool SubobjectIsDesignatorContext,
1035*67e74705SXin Li                                             unsigned &Index,
1036*67e74705SXin Li                                             InitListExpr *StructuredList,
1037*67e74705SXin Li                                             unsigned &StructuredIndex,
1038*67e74705SXin Li                                             bool TopLevelObject) {
1039*67e74705SXin Li   if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) {
1040*67e74705SXin Li     // Explicitly braced initializer for complex type can be real+imaginary
1041*67e74705SXin Li     // parts.
1042*67e74705SXin Li     CheckComplexType(Entity, IList, DeclType, Index,
1043*67e74705SXin Li                      StructuredList, StructuredIndex);
1044*67e74705SXin Li   } else if (DeclType->isScalarType()) {
1045*67e74705SXin Li     CheckScalarType(Entity, IList, DeclType, Index,
1046*67e74705SXin Li                     StructuredList, StructuredIndex);
1047*67e74705SXin Li   } else if (DeclType->isVectorType()) {
1048*67e74705SXin Li     CheckVectorType(Entity, IList, DeclType, Index,
1049*67e74705SXin Li                     StructuredList, StructuredIndex);
1050*67e74705SXin Li   } else if (DeclType->isRecordType()) {
1051*67e74705SXin Li     assert(DeclType->isAggregateType() &&
1052*67e74705SXin Li            "non-aggregate records should be handed in CheckSubElementType");
1053*67e74705SXin Li     RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
1054*67e74705SXin Li     auto Bases =
1055*67e74705SXin Li         CXXRecordDecl::base_class_range(CXXRecordDecl::base_class_iterator(),
1056*67e74705SXin Li                                         CXXRecordDecl::base_class_iterator());
1057*67e74705SXin Li     if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1058*67e74705SXin Li       Bases = CXXRD->bases();
1059*67e74705SXin Li     CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1060*67e74705SXin Li                           SubobjectIsDesignatorContext, Index, StructuredList,
1061*67e74705SXin Li                           StructuredIndex, TopLevelObject);
1062*67e74705SXin Li   } else if (DeclType->isArrayType()) {
1063*67e74705SXin Li     llvm::APSInt Zero(
1064*67e74705SXin Li                     SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()),
1065*67e74705SXin Li                     false);
1066*67e74705SXin Li     CheckArrayType(Entity, IList, DeclType, Zero,
1067*67e74705SXin Li                    SubobjectIsDesignatorContext, Index,
1068*67e74705SXin Li                    StructuredList, StructuredIndex);
1069*67e74705SXin Li   } else if (DeclType->isVoidType() || DeclType->isFunctionType()) {
1070*67e74705SXin Li     // This type is invalid, issue a diagnostic.
1071*67e74705SXin Li     ++Index;
1072*67e74705SXin Li     if (!VerifyOnly)
1073*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type)
1074*67e74705SXin Li         << DeclType;
1075*67e74705SXin Li     hadError = true;
1076*67e74705SXin Li   } else if (DeclType->isReferenceType()) {
1077*67e74705SXin Li     CheckReferenceType(Entity, IList, DeclType, Index,
1078*67e74705SXin Li                        StructuredList, StructuredIndex);
1079*67e74705SXin Li   } else if (DeclType->isObjCObjectType()) {
1080*67e74705SXin Li     if (!VerifyOnly)
1081*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class)
1082*67e74705SXin Li         << DeclType;
1083*67e74705SXin Li     hadError = true;
1084*67e74705SXin Li   } else {
1085*67e74705SXin Li     if (!VerifyOnly)
1086*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type)
1087*67e74705SXin Li         << DeclType;
1088*67e74705SXin Li     hadError = true;
1089*67e74705SXin Li   }
1090*67e74705SXin Li }
1091*67e74705SXin Li 
CheckSubElementType(const InitializedEntity & Entity,InitListExpr * IList,QualType ElemType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1092*67e74705SXin Li void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
1093*67e74705SXin Li                                           InitListExpr *IList,
1094*67e74705SXin Li                                           QualType ElemType,
1095*67e74705SXin Li                                           unsigned &Index,
1096*67e74705SXin Li                                           InitListExpr *StructuredList,
1097*67e74705SXin Li                                           unsigned &StructuredIndex) {
1098*67e74705SXin Li   Expr *expr = IList->getInit(Index);
1099*67e74705SXin Li 
1100*67e74705SXin Li   if (ElemType->isReferenceType())
1101*67e74705SXin Li     return CheckReferenceType(Entity, IList, ElemType, Index,
1102*67e74705SXin Li                               StructuredList, StructuredIndex);
1103*67e74705SXin Li 
1104*67e74705SXin Li   if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
1105*67e74705SXin Li     if (SubInitList->getNumInits() == 1 &&
1106*67e74705SXin Li         IsStringInit(SubInitList->getInit(0), ElemType, SemaRef.Context) ==
1107*67e74705SXin Li         SIF_None) {
1108*67e74705SXin Li       expr = SubInitList->getInit(0);
1109*67e74705SXin Li     } else if (!SemaRef.getLangOpts().CPlusPlus) {
1110*67e74705SXin Li       InitListExpr *InnerStructuredList
1111*67e74705SXin Li         = getStructuredSubobjectInit(IList, Index, ElemType,
1112*67e74705SXin Li                                      StructuredList, StructuredIndex,
1113*67e74705SXin Li                                      SubInitList->getSourceRange(), true);
1114*67e74705SXin Li       CheckExplicitInitList(Entity, SubInitList, ElemType,
1115*67e74705SXin Li                             InnerStructuredList);
1116*67e74705SXin Li 
1117*67e74705SXin Li       if (!hadError && !VerifyOnly) {
1118*67e74705SXin Li         bool RequiresSecondPass = false;
1119*67e74705SXin Li         FillInEmptyInitializations(Entity, InnerStructuredList,
1120*67e74705SXin Li                                    RequiresSecondPass);
1121*67e74705SXin Li         if (RequiresSecondPass && !hadError)
1122*67e74705SXin Li           FillInEmptyInitializations(Entity, InnerStructuredList,
1123*67e74705SXin Li                                      RequiresSecondPass);
1124*67e74705SXin Li       }
1125*67e74705SXin Li       ++StructuredIndex;
1126*67e74705SXin Li       ++Index;
1127*67e74705SXin Li       return;
1128*67e74705SXin Li     }
1129*67e74705SXin Li     // C++ initialization is handled later.
1130*67e74705SXin Li   } else if (isa<ImplicitValueInitExpr>(expr)) {
1131*67e74705SXin Li     // This happens during template instantiation when we see an InitListExpr
1132*67e74705SXin Li     // that we've already checked once.
1133*67e74705SXin Li     assert(SemaRef.Context.hasSameType(expr->getType(), ElemType) &&
1134*67e74705SXin Li            "found implicit initialization for the wrong type");
1135*67e74705SXin Li     if (!VerifyOnly)
1136*67e74705SXin Li       UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1137*67e74705SXin Li     ++Index;
1138*67e74705SXin Li     return;
1139*67e74705SXin Li   }
1140*67e74705SXin Li 
1141*67e74705SXin Li   if (SemaRef.getLangOpts().CPlusPlus) {
1142*67e74705SXin Li     // C++ [dcl.init.aggr]p2:
1143*67e74705SXin Li     //   Each member is copy-initialized from the corresponding
1144*67e74705SXin Li     //   initializer-clause.
1145*67e74705SXin Li 
1146*67e74705SXin Li     // FIXME: Better EqualLoc?
1147*67e74705SXin Li     InitializationKind Kind =
1148*67e74705SXin Li       InitializationKind::CreateCopy(expr->getLocStart(), SourceLocation());
1149*67e74705SXin Li     InitializationSequence Seq(SemaRef, Entity, Kind, expr,
1150*67e74705SXin Li                                /*TopLevelOfInitList*/ true);
1151*67e74705SXin Li 
1152*67e74705SXin Li     // C++14 [dcl.init.aggr]p13:
1153*67e74705SXin Li     //   If the assignment-expression can initialize a member, the member is
1154*67e74705SXin Li     //   initialized. Otherwise [...] brace elision is assumed
1155*67e74705SXin Li     //
1156*67e74705SXin Li     // Brace elision is never performed if the element is not an
1157*67e74705SXin Li     // assignment-expression.
1158*67e74705SXin Li     if (Seq || isa<InitListExpr>(expr)) {
1159*67e74705SXin Li       if (!VerifyOnly) {
1160*67e74705SXin Li         ExprResult Result =
1161*67e74705SXin Li           Seq.Perform(SemaRef, Entity, Kind, expr);
1162*67e74705SXin Li         if (Result.isInvalid())
1163*67e74705SXin Li           hadError = true;
1164*67e74705SXin Li 
1165*67e74705SXin Li         UpdateStructuredListElement(StructuredList, StructuredIndex,
1166*67e74705SXin Li                                     Result.getAs<Expr>());
1167*67e74705SXin Li       } else if (!Seq)
1168*67e74705SXin Li         hadError = true;
1169*67e74705SXin Li       ++Index;
1170*67e74705SXin Li       return;
1171*67e74705SXin Li     }
1172*67e74705SXin Li 
1173*67e74705SXin Li     // Fall through for subaggregate initialization
1174*67e74705SXin Li   } else if (ElemType->isScalarType() || ElemType->isAtomicType()) {
1175*67e74705SXin Li     // FIXME: Need to handle atomic aggregate types with implicit init lists.
1176*67e74705SXin Li     return CheckScalarType(Entity, IList, ElemType, Index,
1177*67e74705SXin Li                            StructuredList, StructuredIndex);
1178*67e74705SXin Li   } else if (const ArrayType *arrayType =
1179*67e74705SXin Li                  SemaRef.Context.getAsArrayType(ElemType)) {
1180*67e74705SXin Li     // arrayType can be incomplete if we're initializing a flexible
1181*67e74705SXin Li     // array member.  There's nothing we can do with the completed
1182*67e74705SXin Li     // type here, though.
1183*67e74705SXin Li 
1184*67e74705SXin Li     if (IsStringInit(expr, arrayType, SemaRef.Context) == SIF_None) {
1185*67e74705SXin Li       if (!VerifyOnly) {
1186*67e74705SXin Li         CheckStringInit(expr, ElemType, arrayType, SemaRef);
1187*67e74705SXin Li         UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1188*67e74705SXin Li       }
1189*67e74705SXin Li       ++Index;
1190*67e74705SXin Li       return;
1191*67e74705SXin Li     }
1192*67e74705SXin Li 
1193*67e74705SXin Li     // Fall through for subaggregate initialization.
1194*67e74705SXin Li 
1195*67e74705SXin Li   } else {
1196*67e74705SXin Li     assert((ElemType->isRecordType() || ElemType->isVectorType() ||
1197*67e74705SXin Li             ElemType->isClkEventT()) && "Unexpected type");
1198*67e74705SXin Li 
1199*67e74705SXin Li     // C99 6.7.8p13:
1200*67e74705SXin Li     //
1201*67e74705SXin Li     //   The initializer for a structure or union object that has
1202*67e74705SXin Li     //   automatic storage duration shall be either an initializer
1203*67e74705SXin Li     //   list as described below, or a single expression that has
1204*67e74705SXin Li     //   compatible structure or union type. In the latter case, the
1205*67e74705SXin Li     //   initial value of the object, including unnamed members, is
1206*67e74705SXin Li     //   that of the expression.
1207*67e74705SXin Li     ExprResult ExprRes = expr;
1208*67e74705SXin Li     if (SemaRef.CheckSingleAssignmentConstraints(
1209*67e74705SXin Li             ElemType, ExprRes, !VerifyOnly) != Sema::Incompatible) {
1210*67e74705SXin Li       if (ExprRes.isInvalid())
1211*67e74705SXin Li         hadError = true;
1212*67e74705SXin Li       else {
1213*67e74705SXin Li         ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.get());
1214*67e74705SXin Li           if (ExprRes.isInvalid())
1215*67e74705SXin Li             hadError = true;
1216*67e74705SXin Li       }
1217*67e74705SXin Li       UpdateStructuredListElement(StructuredList, StructuredIndex,
1218*67e74705SXin Li                                   ExprRes.getAs<Expr>());
1219*67e74705SXin Li       ++Index;
1220*67e74705SXin Li       return;
1221*67e74705SXin Li     }
1222*67e74705SXin Li     ExprRes.get();
1223*67e74705SXin Li     // Fall through for subaggregate initialization
1224*67e74705SXin Li   }
1225*67e74705SXin Li 
1226*67e74705SXin Li   // C++ [dcl.init.aggr]p12:
1227*67e74705SXin Li   //
1228*67e74705SXin Li   //   [...] Otherwise, if the member is itself a non-empty
1229*67e74705SXin Li   //   subaggregate, brace elision is assumed and the initializer is
1230*67e74705SXin Li   //   considered for the initialization of the first member of
1231*67e74705SXin Li   //   the subaggregate.
1232*67e74705SXin Li   if (!SemaRef.getLangOpts().OpenCL &&
1233*67e74705SXin Li       (ElemType->isAggregateType() || ElemType->isVectorType())) {
1234*67e74705SXin Li     CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1235*67e74705SXin Li                           StructuredIndex);
1236*67e74705SXin Li     ++StructuredIndex;
1237*67e74705SXin Li   } else {
1238*67e74705SXin Li     if (!VerifyOnly) {
1239*67e74705SXin Li       // We cannot initialize this element, so let
1240*67e74705SXin Li       // PerformCopyInitialization produce the appropriate diagnostic.
1241*67e74705SXin Li       SemaRef.PerformCopyInitialization(Entity, SourceLocation(), expr,
1242*67e74705SXin Li                                         /*TopLevelOfInitList=*/true);
1243*67e74705SXin Li     }
1244*67e74705SXin Li     hadError = true;
1245*67e74705SXin Li     ++Index;
1246*67e74705SXin Li     ++StructuredIndex;
1247*67e74705SXin Li   }
1248*67e74705SXin Li }
1249*67e74705SXin Li 
CheckComplexType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1250*67e74705SXin Li void InitListChecker::CheckComplexType(const InitializedEntity &Entity,
1251*67e74705SXin Li                                        InitListExpr *IList, QualType DeclType,
1252*67e74705SXin Li                                        unsigned &Index,
1253*67e74705SXin Li                                        InitListExpr *StructuredList,
1254*67e74705SXin Li                                        unsigned &StructuredIndex) {
1255*67e74705SXin Li   assert(Index == 0 && "Index in explicit init list must be zero");
1256*67e74705SXin Li 
1257*67e74705SXin Li   // As an extension, clang supports complex initializers, which initialize
1258*67e74705SXin Li   // a complex number component-wise.  When an explicit initializer list for
1259*67e74705SXin Li   // a complex number contains two two initializers, this extension kicks in:
1260*67e74705SXin Li   // it exepcts the initializer list to contain two elements convertible to
1261*67e74705SXin Li   // the element type of the complex type. The first element initializes
1262*67e74705SXin Li   // the real part, and the second element intitializes the imaginary part.
1263*67e74705SXin Li 
1264*67e74705SXin Li   if (IList->getNumInits() != 2)
1265*67e74705SXin Li     return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1266*67e74705SXin Li                            StructuredIndex);
1267*67e74705SXin Li 
1268*67e74705SXin Li   // This is an extension in C.  (The builtin _Complex type does not exist
1269*67e74705SXin Li   // in the C++ standard.)
1270*67e74705SXin Li   if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly)
1271*67e74705SXin Li     SemaRef.Diag(IList->getLocStart(), diag::ext_complex_component_init)
1272*67e74705SXin Li       << IList->getSourceRange();
1273*67e74705SXin Li 
1274*67e74705SXin Li   // Initialize the complex number.
1275*67e74705SXin Li   QualType elementType = DeclType->getAs<ComplexType>()->getElementType();
1276*67e74705SXin Li   InitializedEntity ElementEntity =
1277*67e74705SXin Li     InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1278*67e74705SXin Li 
1279*67e74705SXin Li   for (unsigned i = 0; i < 2; ++i) {
1280*67e74705SXin Li     ElementEntity.setElementIndex(Index);
1281*67e74705SXin Li     CheckSubElementType(ElementEntity, IList, elementType, Index,
1282*67e74705SXin Li                         StructuredList, StructuredIndex);
1283*67e74705SXin Li   }
1284*67e74705SXin Li }
1285*67e74705SXin Li 
CheckScalarType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1286*67e74705SXin Li void InitListChecker::CheckScalarType(const InitializedEntity &Entity,
1287*67e74705SXin Li                                       InitListExpr *IList, QualType DeclType,
1288*67e74705SXin Li                                       unsigned &Index,
1289*67e74705SXin Li                                       InitListExpr *StructuredList,
1290*67e74705SXin Li                                       unsigned &StructuredIndex) {
1291*67e74705SXin Li   if (Index >= IList->getNumInits()) {
1292*67e74705SXin Li     if (!VerifyOnly)
1293*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(),
1294*67e74705SXin Li                    SemaRef.getLangOpts().CPlusPlus11 ?
1295*67e74705SXin Li                      diag::warn_cxx98_compat_empty_scalar_initializer :
1296*67e74705SXin Li                      diag::err_empty_scalar_initializer)
1297*67e74705SXin Li         << IList->getSourceRange();
1298*67e74705SXin Li     hadError = !SemaRef.getLangOpts().CPlusPlus11;
1299*67e74705SXin Li     ++Index;
1300*67e74705SXin Li     ++StructuredIndex;
1301*67e74705SXin Li     return;
1302*67e74705SXin Li   }
1303*67e74705SXin Li 
1304*67e74705SXin Li   Expr *expr = IList->getInit(Index);
1305*67e74705SXin Li   if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) {
1306*67e74705SXin Li     // FIXME: This is invalid, and accepting it causes overload resolution
1307*67e74705SXin Li     // to pick the wrong overload in some corner cases.
1308*67e74705SXin Li     if (!VerifyOnly)
1309*67e74705SXin Li       SemaRef.Diag(SubIList->getLocStart(),
1310*67e74705SXin Li                    diag::ext_many_braces_around_scalar_init)
1311*67e74705SXin Li         << SubIList->getSourceRange();
1312*67e74705SXin Li 
1313*67e74705SXin Li     CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1314*67e74705SXin Li                     StructuredIndex);
1315*67e74705SXin Li     return;
1316*67e74705SXin Li   } else if (isa<DesignatedInitExpr>(expr)) {
1317*67e74705SXin Li     if (!VerifyOnly)
1318*67e74705SXin Li       SemaRef.Diag(expr->getLocStart(),
1319*67e74705SXin Li                    diag::err_designator_for_scalar_init)
1320*67e74705SXin Li         << DeclType << expr->getSourceRange();
1321*67e74705SXin Li     hadError = true;
1322*67e74705SXin Li     ++Index;
1323*67e74705SXin Li     ++StructuredIndex;
1324*67e74705SXin Li     return;
1325*67e74705SXin Li   }
1326*67e74705SXin Li 
1327*67e74705SXin Li   if (VerifyOnly) {
1328*67e74705SXin Li     if (!SemaRef.CanPerformCopyInitialization(Entity,expr))
1329*67e74705SXin Li       hadError = true;
1330*67e74705SXin Li     ++Index;
1331*67e74705SXin Li     return;
1332*67e74705SXin Li   }
1333*67e74705SXin Li 
1334*67e74705SXin Li   ExprResult Result =
1335*67e74705SXin Li     SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), expr,
1336*67e74705SXin Li                                       /*TopLevelOfInitList=*/true);
1337*67e74705SXin Li 
1338*67e74705SXin Li   Expr *ResultExpr = nullptr;
1339*67e74705SXin Li 
1340*67e74705SXin Li   if (Result.isInvalid())
1341*67e74705SXin Li     hadError = true; // types weren't compatible.
1342*67e74705SXin Li   else {
1343*67e74705SXin Li     ResultExpr = Result.getAs<Expr>();
1344*67e74705SXin Li 
1345*67e74705SXin Li     if (ResultExpr != expr) {
1346*67e74705SXin Li       // The type was promoted, update initializer list.
1347*67e74705SXin Li       IList->setInit(Index, ResultExpr);
1348*67e74705SXin Li     }
1349*67e74705SXin Li   }
1350*67e74705SXin Li   if (hadError)
1351*67e74705SXin Li     ++StructuredIndex;
1352*67e74705SXin Li   else
1353*67e74705SXin Li     UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1354*67e74705SXin Li   ++Index;
1355*67e74705SXin Li }
1356*67e74705SXin Li 
CheckReferenceType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1357*67e74705SXin Li void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
1358*67e74705SXin Li                                          InitListExpr *IList, QualType DeclType,
1359*67e74705SXin Li                                          unsigned &Index,
1360*67e74705SXin Li                                          InitListExpr *StructuredList,
1361*67e74705SXin Li                                          unsigned &StructuredIndex) {
1362*67e74705SXin Li   if (Index >= IList->getNumInits()) {
1363*67e74705SXin Li     // FIXME: It would be wonderful if we could point at the actual member. In
1364*67e74705SXin Li     // general, it would be useful to pass location information down the stack,
1365*67e74705SXin Li     // so that we know the location (or decl) of the "current object" being
1366*67e74705SXin Li     // initialized.
1367*67e74705SXin Li     if (!VerifyOnly)
1368*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(),
1369*67e74705SXin Li                     diag::err_init_reference_member_uninitialized)
1370*67e74705SXin Li         << DeclType
1371*67e74705SXin Li         << IList->getSourceRange();
1372*67e74705SXin Li     hadError = true;
1373*67e74705SXin Li     ++Index;
1374*67e74705SXin Li     ++StructuredIndex;
1375*67e74705SXin Li     return;
1376*67e74705SXin Li   }
1377*67e74705SXin Li 
1378*67e74705SXin Li   Expr *expr = IList->getInit(Index);
1379*67e74705SXin Li   if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) {
1380*67e74705SXin Li     if (!VerifyOnly)
1381*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(), diag::err_init_non_aggr_init_list)
1382*67e74705SXin Li         << DeclType << IList->getSourceRange();
1383*67e74705SXin Li     hadError = true;
1384*67e74705SXin Li     ++Index;
1385*67e74705SXin Li     ++StructuredIndex;
1386*67e74705SXin Li     return;
1387*67e74705SXin Li   }
1388*67e74705SXin Li 
1389*67e74705SXin Li   if (VerifyOnly) {
1390*67e74705SXin Li     if (!SemaRef.CanPerformCopyInitialization(Entity,expr))
1391*67e74705SXin Li       hadError = true;
1392*67e74705SXin Li     ++Index;
1393*67e74705SXin Li     return;
1394*67e74705SXin Li   }
1395*67e74705SXin Li 
1396*67e74705SXin Li   ExprResult Result =
1397*67e74705SXin Li       SemaRef.PerformCopyInitialization(Entity, expr->getLocStart(), expr,
1398*67e74705SXin Li                                         /*TopLevelOfInitList=*/true);
1399*67e74705SXin Li 
1400*67e74705SXin Li   if (Result.isInvalid())
1401*67e74705SXin Li     hadError = true;
1402*67e74705SXin Li 
1403*67e74705SXin Li   expr = Result.getAs<Expr>();
1404*67e74705SXin Li   IList->setInit(Index, expr);
1405*67e74705SXin Li 
1406*67e74705SXin Li   if (hadError)
1407*67e74705SXin Li     ++StructuredIndex;
1408*67e74705SXin Li   else
1409*67e74705SXin Li     UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1410*67e74705SXin Li   ++Index;
1411*67e74705SXin Li }
1412*67e74705SXin Li 
CheckVectorType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1413*67e74705SXin Li void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
1414*67e74705SXin Li                                       InitListExpr *IList, QualType DeclType,
1415*67e74705SXin Li                                       unsigned &Index,
1416*67e74705SXin Li                                       InitListExpr *StructuredList,
1417*67e74705SXin Li                                       unsigned &StructuredIndex) {
1418*67e74705SXin Li   const VectorType *VT = DeclType->getAs<VectorType>();
1419*67e74705SXin Li   unsigned maxElements = VT->getNumElements();
1420*67e74705SXin Li   unsigned numEltsInit = 0;
1421*67e74705SXin Li   QualType elementType = VT->getElementType();
1422*67e74705SXin Li 
1423*67e74705SXin Li   if (Index >= IList->getNumInits()) {
1424*67e74705SXin Li     // Make sure the element type can be value-initialized.
1425*67e74705SXin Li     if (VerifyOnly)
1426*67e74705SXin Li       CheckEmptyInitializable(
1427*67e74705SXin Li           InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
1428*67e74705SXin Li           IList->getLocEnd());
1429*67e74705SXin Li     return;
1430*67e74705SXin Li   }
1431*67e74705SXin Li 
1432*67e74705SXin Li   if (!SemaRef.getLangOpts().OpenCL) {
1433*67e74705SXin Li     // If the initializing element is a vector, try to copy-initialize
1434*67e74705SXin Li     // instead of breaking it apart (which is doomed to failure anyway).
1435*67e74705SXin Li     Expr *Init = IList->getInit(Index);
1436*67e74705SXin Li     if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) {
1437*67e74705SXin Li       if (VerifyOnly) {
1438*67e74705SXin Li         if (!SemaRef.CanPerformCopyInitialization(Entity, Init))
1439*67e74705SXin Li           hadError = true;
1440*67e74705SXin Li         ++Index;
1441*67e74705SXin Li         return;
1442*67e74705SXin Li       }
1443*67e74705SXin Li 
1444*67e74705SXin Li   ExprResult Result =
1445*67e74705SXin Li       SemaRef.PerformCopyInitialization(Entity, Init->getLocStart(), Init,
1446*67e74705SXin Li                                         /*TopLevelOfInitList=*/true);
1447*67e74705SXin Li 
1448*67e74705SXin Li       Expr *ResultExpr = nullptr;
1449*67e74705SXin Li       if (Result.isInvalid())
1450*67e74705SXin Li         hadError = true; // types weren't compatible.
1451*67e74705SXin Li       else {
1452*67e74705SXin Li         ResultExpr = Result.getAs<Expr>();
1453*67e74705SXin Li 
1454*67e74705SXin Li         if (ResultExpr != Init) {
1455*67e74705SXin Li           // The type was promoted, update initializer list.
1456*67e74705SXin Li           IList->setInit(Index, ResultExpr);
1457*67e74705SXin Li         }
1458*67e74705SXin Li       }
1459*67e74705SXin Li       if (hadError)
1460*67e74705SXin Li         ++StructuredIndex;
1461*67e74705SXin Li       else
1462*67e74705SXin Li         UpdateStructuredListElement(StructuredList, StructuredIndex,
1463*67e74705SXin Li                                     ResultExpr);
1464*67e74705SXin Li       ++Index;
1465*67e74705SXin Li       return;
1466*67e74705SXin Li     }
1467*67e74705SXin Li 
1468*67e74705SXin Li     InitializedEntity ElementEntity =
1469*67e74705SXin Li       InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1470*67e74705SXin Li 
1471*67e74705SXin Li     for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1472*67e74705SXin Li       // Don't attempt to go past the end of the init list
1473*67e74705SXin Li       if (Index >= IList->getNumInits()) {
1474*67e74705SXin Li         if (VerifyOnly)
1475*67e74705SXin Li           CheckEmptyInitializable(ElementEntity, IList->getLocEnd());
1476*67e74705SXin Li         break;
1477*67e74705SXin Li       }
1478*67e74705SXin Li 
1479*67e74705SXin Li       ElementEntity.setElementIndex(Index);
1480*67e74705SXin Li       CheckSubElementType(ElementEntity, IList, elementType, Index,
1481*67e74705SXin Li                           StructuredList, StructuredIndex);
1482*67e74705SXin Li     }
1483*67e74705SXin Li 
1484*67e74705SXin Li     if (VerifyOnly)
1485*67e74705SXin Li       return;
1486*67e74705SXin Li 
1487*67e74705SXin Li     bool isBigEndian = SemaRef.Context.getTargetInfo().isBigEndian();
1488*67e74705SXin Li     const VectorType *T = Entity.getType()->getAs<VectorType>();
1489*67e74705SXin Li     if (isBigEndian && (T->getVectorKind() == VectorType::NeonVector ||
1490*67e74705SXin Li                         T->getVectorKind() == VectorType::NeonPolyVector)) {
1491*67e74705SXin Li       // The ability to use vector initializer lists is a GNU vector extension
1492*67e74705SXin Li       // and is unrelated to the NEON intrinsics in arm_neon.h. On little
1493*67e74705SXin Li       // endian machines it works fine, however on big endian machines it
1494*67e74705SXin Li       // exhibits surprising behaviour:
1495*67e74705SXin Li       //
1496*67e74705SXin Li       //   uint32x2_t x = {42, 64};
1497*67e74705SXin Li       //   return vget_lane_u32(x, 0); // Will return 64.
1498*67e74705SXin Li       //
1499*67e74705SXin Li       // Because of this, explicitly call out that it is non-portable.
1500*67e74705SXin Li       //
1501*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(),
1502*67e74705SXin Li                    diag::warn_neon_vector_initializer_non_portable);
1503*67e74705SXin Li 
1504*67e74705SXin Li       const char *typeCode;
1505*67e74705SXin Li       unsigned typeSize = SemaRef.Context.getTypeSize(elementType);
1506*67e74705SXin Li 
1507*67e74705SXin Li       if (elementType->isFloatingType())
1508*67e74705SXin Li         typeCode = "f";
1509*67e74705SXin Li       else if (elementType->isSignedIntegerType())
1510*67e74705SXin Li         typeCode = "s";
1511*67e74705SXin Li       else if (elementType->isUnsignedIntegerType())
1512*67e74705SXin Li         typeCode = "u";
1513*67e74705SXin Li       else
1514*67e74705SXin Li         llvm_unreachable("Invalid element type!");
1515*67e74705SXin Li 
1516*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(),
1517*67e74705SXin Li                    SemaRef.Context.getTypeSize(VT) > 64 ?
1518*67e74705SXin Li                    diag::note_neon_vector_initializer_non_portable_q :
1519*67e74705SXin Li                    diag::note_neon_vector_initializer_non_portable)
1520*67e74705SXin Li         << typeCode << typeSize;
1521*67e74705SXin Li     }
1522*67e74705SXin Li 
1523*67e74705SXin Li     return;
1524*67e74705SXin Li   }
1525*67e74705SXin Li 
1526*67e74705SXin Li   InitializedEntity ElementEntity =
1527*67e74705SXin Li     InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1528*67e74705SXin Li 
1529*67e74705SXin Li   // OpenCL initializers allows vectors to be constructed from vectors.
1530*67e74705SXin Li   for (unsigned i = 0; i < maxElements; ++i) {
1531*67e74705SXin Li     // Don't attempt to go past the end of the init list
1532*67e74705SXin Li     if (Index >= IList->getNumInits())
1533*67e74705SXin Li       break;
1534*67e74705SXin Li 
1535*67e74705SXin Li     ElementEntity.setElementIndex(Index);
1536*67e74705SXin Li 
1537*67e74705SXin Li     QualType IType = IList->getInit(Index)->getType();
1538*67e74705SXin Li     if (!IType->isVectorType()) {
1539*67e74705SXin Li       CheckSubElementType(ElementEntity, IList, elementType, Index,
1540*67e74705SXin Li                           StructuredList, StructuredIndex);
1541*67e74705SXin Li       ++numEltsInit;
1542*67e74705SXin Li     } else {
1543*67e74705SXin Li       QualType VecType;
1544*67e74705SXin Li       const VectorType *IVT = IType->getAs<VectorType>();
1545*67e74705SXin Li       unsigned numIElts = IVT->getNumElements();
1546*67e74705SXin Li 
1547*67e74705SXin Li       if (IType->isExtVectorType())
1548*67e74705SXin Li         VecType = SemaRef.Context.getExtVectorType(elementType, numIElts);
1549*67e74705SXin Li       else
1550*67e74705SXin Li         VecType = SemaRef.Context.getVectorType(elementType, numIElts,
1551*67e74705SXin Li                                                 IVT->getVectorKind());
1552*67e74705SXin Li       CheckSubElementType(ElementEntity, IList, VecType, Index,
1553*67e74705SXin Li                           StructuredList, StructuredIndex);
1554*67e74705SXin Li       numEltsInit += numIElts;
1555*67e74705SXin Li     }
1556*67e74705SXin Li   }
1557*67e74705SXin Li 
1558*67e74705SXin Li   // OpenCL requires all elements to be initialized.
1559*67e74705SXin Li   if (numEltsInit != maxElements) {
1560*67e74705SXin Li     if (!VerifyOnly)
1561*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(),
1562*67e74705SXin Li                    diag::err_vector_incorrect_num_initializers)
1563*67e74705SXin Li         << (numEltsInit < maxElements) << maxElements << numEltsInit;
1564*67e74705SXin Li     hadError = true;
1565*67e74705SXin Li   }
1566*67e74705SXin Li }
1567*67e74705SXin Li 
CheckArrayType(const InitializedEntity & Entity,InitListExpr * IList,QualType & DeclType,llvm::APSInt elementIndex,bool SubobjectIsDesignatorContext,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1568*67e74705SXin Li void InitListChecker::CheckArrayType(const InitializedEntity &Entity,
1569*67e74705SXin Li                                      InitListExpr *IList, QualType &DeclType,
1570*67e74705SXin Li                                      llvm::APSInt elementIndex,
1571*67e74705SXin Li                                      bool SubobjectIsDesignatorContext,
1572*67e74705SXin Li                                      unsigned &Index,
1573*67e74705SXin Li                                      InitListExpr *StructuredList,
1574*67e74705SXin Li                                      unsigned &StructuredIndex) {
1575*67e74705SXin Li   const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType);
1576*67e74705SXin Li 
1577*67e74705SXin Li   // Check for the special-case of initializing an array with a string.
1578*67e74705SXin Li   if (Index < IList->getNumInits()) {
1579*67e74705SXin Li     if (IsStringInit(IList->getInit(Index), arrayType, SemaRef.Context) ==
1580*67e74705SXin Li         SIF_None) {
1581*67e74705SXin Li       // We place the string literal directly into the resulting
1582*67e74705SXin Li       // initializer list. This is the only place where the structure
1583*67e74705SXin Li       // of the structured initializer list doesn't match exactly,
1584*67e74705SXin Li       // because doing so would involve allocating one character
1585*67e74705SXin Li       // constant for each string.
1586*67e74705SXin Li       if (!VerifyOnly) {
1587*67e74705SXin Li         CheckStringInit(IList->getInit(Index), DeclType, arrayType, SemaRef);
1588*67e74705SXin Li         UpdateStructuredListElement(StructuredList, StructuredIndex,
1589*67e74705SXin Li                                     IList->getInit(Index));
1590*67e74705SXin Li         StructuredList->resizeInits(SemaRef.Context, StructuredIndex);
1591*67e74705SXin Li       }
1592*67e74705SXin Li       ++Index;
1593*67e74705SXin Li       return;
1594*67e74705SXin Li     }
1595*67e74705SXin Li   }
1596*67e74705SXin Li   if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) {
1597*67e74705SXin Li     // Check for VLAs; in standard C it would be possible to check this
1598*67e74705SXin Li     // earlier, but I don't know where clang accepts VLAs (gcc accepts
1599*67e74705SXin Li     // them in all sorts of strange places).
1600*67e74705SXin Li     if (!VerifyOnly)
1601*67e74705SXin Li       SemaRef.Diag(VAT->getSizeExpr()->getLocStart(),
1602*67e74705SXin Li                     diag::err_variable_object_no_init)
1603*67e74705SXin Li         << VAT->getSizeExpr()->getSourceRange();
1604*67e74705SXin Li     hadError = true;
1605*67e74705SXin Li     ++Index;
1606*67e74705SXin Li     ++StructuredIndex;
1607*67e74705SXin Li     return;
1608*67e74705SXin Li   }
1609*67e74705SXin Li 
1610*67e74705SXin Li   // We might know the maximum number of elements in advance.
1611*67e74705SXin Li   llvm::APSInt maxElements(elementIndex.getBitWidth(),
1612*67e74705SXin Li                            elementIndex.isUnsigned());
1613*67e74705SXin Li   bool maxElementsKnown = false;
1614*67e74705SXin Li   if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) {
1615*67e74705SXin Li     maxElements = CAT->getSize();
1616*67e74705SXin Li     elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
1617*67e74705SXin Li     elementIndex.setIsUnsigned(maxElements.isUnsigned());
1618*67e74705SXin Li     maxElementsKnown = true;
1619*67e74705SXin Li   }
1620*67e74705SXin Li 
1621*67e74705SXin Li   QualType elementType = arrayType->getElementType();
1622*67e74705SXin Li   while (Index < IList->getNumInits()) {
1623*67e74705SXin Li     Expr *Init = IList->getInit(Index);
1624*67e74705SXin Li     if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
1625*67e74705SXin Li       // If we're not the subobject that matches up with the '{' for
1626*67e74705SXin Li       // the designator, we shouldn't be handling the
1627*67e74705SXin Li       // designator. Return immediately.
1628*67e74705SXin Li       if (!SubobjectIsDesignatorContext)
1629*67e74705SXin Li         return;
1630*67e74705SXin Li 
1631*67e74705SXin Li       // Handle this designated initializer. elementIndex will be
1632*67e74705SXin Li       // updated to be the next array element we'll initialize.
1633*67e74705SXin Li       if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
1634*67e74705SXin Li                                      DeclType, nullptr, &elementIndex, Index,
1635*67e74705SXin Li                                      StructuredList, StructuredIndex, true,
1636*67e74705SXin Li                                      false)) {
1637*67e74705SXin Li         hadError = true;
1638*67e74705SXin Li         continue;
1639*67e74705SXin Li       }
1640*67e74705SXin Li 
1641*67e74705SXin Li       if (elementIndex.getBitWidth() > maxElements.getBitWidth())
1642*67e74705SXin Li         maxElements = maxElements.extend(elementIndex.getBitWidth());
1643*67e74705SXin Li       else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
1644*67e74705SXin Li         elementIndex = elementIndex.extend(maxElements.getBitWidth());
1645*67e74705SXin Li       elementIndex.setIsUnsigned(maxElements.isUnsigned());
1646*67e74705SXin Li 
1647*67e74705SXin Li       // If the array is of incomplete type, keep track of the number of
1648*67e74705SXin Li       // elements in the initializer.
1649*67e74705SXin Li       if (!maxElementsKnown && elementIndex > maxElements)
1650*67e74705SXin Li         maxElements = elementIndex;
1651*67e74705SXin Li 
1652*67e74705SXin Li       continue;
1653*67e74705SXin Li     }
1654*67e74705SXin Li 
1655*67e74705SXin Li     // If we know the maximum number of elements, and we've already
1656*67e74705SXin Li     // hit it, stop consuming elements in the initializer list.
1657*67e74705SXin Li     if (maxElementsKnown && elementIndex == maxElements)
1658*67e74705SXin Li       break;
1659*67e74705SXin Li 
1660*67e74705SXin Li     InitializedEntity ElementEntity =
1661*67e74705SXin Li       InitializedEntity::InitializeElement(SemaRef.Context, StructuredIndex,
1662*67e74705SXin Li                                            Entity);
1663*67e74705SXin Li     // Check this element.
1664*67e74705SXin Li     CheckSubElementType(ElementEntity, IList, elementType, Index,
1665*67e74705SXin Li                         StructuredList, StructuredIndex);
1666*67e74705SXin Li     ++elementIndex;
1667*67e74705SXin Li 
1668*67e74705SXin Li     // If the array is of incomplete type, keep track of the number of
1669*67e74705SXin Li     // elements in the initializer.
1670*67e74705SXin Li     if (!maxElementsKnown && elementIndex > maxElements)
1671*67e74705SXin Li       maxElements = elementIndex;
1672*67e74705SXin Li   }
1673*67e74705SXin Li   if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) {
1674*67e74705SXin Li     // If this is an incomplete array type, the actual type needs to
1675*67e74705SXin Li     // be calculated here.
1676*67e74705SXin Li     llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
1677*67e74705SXin Li     if (maxElements == Zero) {
1678*67e74705SXin Li       // Sizing an array implicitly to zero is not allowed by ISO C,
1679*67e74705SXin Li       // but is supported by GNU.
1680*67e74705SXin Li       SemaRef.Diag(IList->getLocStart(),
1681*67e74705SXin Li                     diag::ext_typecheck_zero_array_size);
1682*67e74705SXin Li     }
1683*67e74705SXin Li 
1684*67e74705SXin Li     DeclType = SemaRef.Context.getConstantArrayType(elementType, maxElements,
1685*67e74705SXin Li                                                      ArrayType::Normal, 0);
1686*67e74705SXin Li   }
1687*67e74705SXin Li   if (!hadError && VerifyOnly) {
1688*67e74705SXin Li     // Check if there are any members of the array that get value-initialized.
1689*67e74705SXin Li     // If so, check if doing that is possible.
1690*67e74705SXin Li     // FIXME: This needs to detect holes left by designated initializers too.
1691*67e74705SXin Li     if (maxElementsKnown && elementIndex < maxElements)
1692*67e74705SXin Li       CheckEmptyInitializable(InitializedEntity::InitializeElement(
1693*67e74705SXin Li                                                   SemaRef.Context, 0, Entity),
1694*67e74705SXin Li                               IList->getLocEnd());
1695*67e74705SXin Li   }
1696*67e74705SXin Li }
1697*67e74705SXin Li 
CheckFlexibleArrayInit(const InitializedEntity & Entity,Expr * InitExpr,FieldDecl * Field,bool TopLevelObject)1698*67e74705SXin Li bool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity,
1699*67e74705SXin Li                                              Expr *InitExpr,
1700*67e74705SXin Li                                              FieldDecl *Field,
1701*67e74705SXin Li                                              bool TopLevelObject) {
1702*67e74705SXin Li   // Handle GNU flexible array initializers.
1703*67e74705SXin Li   unsigned FlexArrayDiag;
1704*67e74705SXin Li   if (isa<InitListExpr>(InitExpr) &&
1705*67e74705SXin Li       cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
1706*67e74705SXin Li     // Empty flexible array init always allowed as an extension
1707*67e74705SXin Li     FlexArrayDiag = diag::ext_flexible_array_init;
1708*67e74705SXin Li   } else if (SemaRef.getLangOpts().CPlusPlus) {
1709*67e74705SXin Li     // Disallow flexible array init in C++; it is not required for gcc
1710*67e74705SXin Li     // compatibility, and it needs work to IRGen correctly in general.
1711*67e74705SXin Li     FlexArrayDiag = diag::err_flexible_array_init;
1712*67e74705SXin Li   } else if (!TopLevelObject) {
1713*67e74705SXin Li     // Disallow flexible array init on non-top-level object
1714*67e74705SXin Li     FlexArrayDiag = diag::err_flexible_array_init;
1715*67e74705SXin Li   } else if (Entity.getKind() != InitializedEntity::EK_Variable) {
1716*67e74705SXin Li     // Disallow flexible array init on anything which is not a variable.
1717*67e74705SXin Li     FlexArrayDiag = diag::err_flexible_array_init;
1718*67e74705SXin Li   } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) {
1719*67e74705SXin Li     // Disallow flexible array init on local variables.
1720*67e74705SXin Li     FlexArrayDiag = diag::err_flexible_array_init;
1721*67e74705SXin Li   } else {
1722*67e74705SXin Li     // Allow other cases.
1723*67e74705SXin Li     FlexArrayDiag = diag::ext_flexible_array_init;
1724*67e74705SXin Li   }
1725*67e74705SXin Li 
1726*67e74705SXin Li   if (!VerifyOnly) {
1727*67e74705SXin Li     SemaRef.Diag(InitExpr->getLocStart(),
1728*67e74705SXin Li                  FlexArrayDiag)
1729*67e74705SXin Li       << InitExpr->getLocStart();
1730*67e74705SXin Li     SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
1731*67e74705SXin Li       << Field;
1732*67e74705SXin Li   }
1733*67e74705SXin Li 
1734*67e74705SXin Li   return FlexArrayDiag != diag::ext_flexible_array_init;
1735*67e74705SXin Li }
1736*67e74705SXin Li 
CheckStructUnionTypes(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,CXXRecordDecl::base_class_range Bases,RecordDecl::field_iterator Field,bool SubobjectIsDesignatorContext,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex,bool TopLevelObject)1737*67e74705SXin Li void InitListChecker::CheckStructUnionTypes(
1738*67e74705SXin Li     const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType,
1739*67e74705SXin Li     CXXRecordDecl::base_class_range Bases, RecordDecl::field_iterator Field,
1740*67e74705SXin Li     bool SubobjectIsDesignatorContext, unsigned &Index,
1741*67e74705SXin Li     InitListExpr *StructuredList, unsigned &StructuredIndex,
1742*67e74705SXin Li     bool TopLevelObject) {
1743*67e74705SXin Li   RecordDecl *structDecl = DeclType->getAs<RecordType>()->getDecl();
1744*67e74705SXin Li 
1745*67e74705SXin Li   // If the record is invalid, some of it's members are invalid. To avoid
1746*67e74705SXin Li   // confusion, we forgo checking the intializer for the entire record.
1747*67e74705SXin Li   if (structDecl->isInvalidDecl()) {
1748*67e74705SXin Li     // Assume it was supposed to consume a single initializer.
1749*67e74705SXin Li     ++Index;
1750*67e74705SXin Li     hadError = true;
1751*67e74705SXin Li     return;
1752*67e74705SXin Li   }
1753*67e74705SXin Li 
1754*67e74705SXin Li   if (DeclType->isUnionType() && IList->getNumInits() == 0) {
1755*67e74705SXin Li     RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
1756*67e74705SXin Li 
1757*67e74705SXin Li     // If there's a default initializer, use it.
1758*67e74705SXin Li     if (isa<CXXRecordDecl>(RD) && cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
1759*67e74705SXin Li       if (VerifyOnly)
1760*67e74705SXin Li         return;
1761*67e74705SXin Li       for (RecordDecl::field_iterator FieldEnd = RD->field_end();
1762*67e74705SXin Li            Field != FieldEnd; ++Field) {
1763*67e74705SXin Li         if (Field->hasInClassInitializer()) {
1764*67e74705SXin Li           StructuredList->setInitializedFieldInUnion(*Field);
1765*67e74705SXin Li           // FIXME: Actually build a CXXDefaultInitExpr?
1766*67e74705SXin Li           return;
1767*67e74705SXin Li         }
1768*67e74705SXin Li       }
1769*67e74705SXin Li     }
1770*67e74705SXin Li 
1771*67e74705SXin Li     // Value-initialize the first member of the union that isn't an unnamed
1772*67e74705SXin Li     // bitfield.
1773*67e74705SXin Li     for (RecordDecl::field_iterator FieldEnd = RD->field_end();
1774*67e74705SXin Li          Field != FieldEnd; ++Field) {
1775*67e74705SXin Li       if (!Field->isUnnamedBitfield()) {
1776*67e74705SXin Li         if (VerifyOnly)
1777*67e74705SXin Li           CheckEmptyInitializable(
1778*67e74705SXin Li               InitializedEntity::InitializeMember(*Field, &Entity),
1779*67e74705SXin Li               IList->getLocEnd());
1780*67e74705SXin Li         else
1781*67e74705SXin Li           StructuredList->setInitializedFieldInUnion(*Field);
1782*67e74705SXin Li         break;
1783*67e74705SXin Li       }
1784*67e74705SXin Li     }
1785*67e74705SXin Li     return;
1786*67e74705SXin Li   }
1787*67e74705SXin Li 
1788*67e74705SXin Li   bool InitializedSomething = false;
1789*67e74705SXin Li 
1790*67e74705SXin Li   // If we have any base classes, they are initialized prior to the fields.
1791*67e74705SXin Li   for (auto &Base : Bases) {
1792*67e74705SXin Li     Expr *Init = Index < IList->getNumInits() ? IList->getInit(Index) : nullptr;
1793*67e74705SXin Li     SourceLocation InitLoc = Init ? Init->getLocStart() : IList->getLocEnd();
1794*67e74705SXin Li 
1795*67e74705SXin Li     // Designated inits always initialize fields, so if we see one, all
1796*67e74705SXin Li     // remaining base classes have no explicit initializer.
1797*67e74705SXin Li     if (Init && isa<DesignatedInitExpr>(Init))
1798*67e74705SXin Li       Init = nullptr;
1799*67e74705SXin Li 
1800*67e74705SXin Li     InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
1801*67e74705SXin Li         SemaRef.Context, &Base, false, &Entity);
1802*67e74705SXin Li     if (Init) {
1803*67e74705SXin Li       CheckSubElementType(BaseEntity, IList, Base.getType(), Index,
1804*67e74705SXin Li                           StructuredList, StructuredIndex);
1805*67e74705SXin Li       InitializedSomething = true;
1806*67e74705SXin Li     } else if (VerifyOnly) {
1807*67e74705SXin Li       CheckEmptyInitializable(BaseEntity, InitLoc);
1808*67e74705SXin Li     }
1809*67e74705SXin Li   }
1810*67e74705SXin Li 
1811*67e74705SXin Li   // If structDecl is a forward declaration, this loop won't do
1812*67e74705SXin Li   // anything except look at designated initializers; That's okay,
1813*67e74705SXin Li   // because an error should get printed out elsewhere. It might be
1814*67e74705SXin Li   // worthwhile to skip over the rest of the initializer, though.
1815*67e74705SXin Li   RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
1816*67e74705SXin Li   RecordDecl::field_iterator FieldEnd = RD->field_end();
1817*67e74705SXin Li   bool CheckForMissingFields = true;
1818*67e74705SXin Li   while (Index < IList->getNumInits()) {
1819*67e74705SXin Li     Expr *Init = IList->getInit(Index);
1820*67e74705SXin Li 
1821*67e74705SXin Li     if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
1822*67e74705SXin Li       // If we're not the subobject that matches up with the '{' for
1823*67e74705SXin Li       // the designator, we shouldn't be handling the
1824*67e74705SXin Li       // designator. Return immediately.
1825*67e74705SXin Li       if (!SubobjectIsDesignatorContext)
1826*67e74705SXin Li         return;
1827*67e74705SXin Li 
1828*67e74705SXin Li       // Handle this designated initializer. Field will be updated to
1829*67e74705SXin Li       // the next field that we'll be initializing.
1830*67e74705SXin Li       if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
1831*67e74705SXin Li                                      DeclType, &Field, nullptr, Index,
1832*67e74705SXin Li                                      StructuredList, StructuredIndex,
1833*67e74705SXin Li                                      true, TopLevelObject))
1834*67e74705SXin Li         hadError = true;
1835*67e74705SXin Li 
1836*67e74705SXin Li       InitializedSomething = true;
1837*67e74705SXin Li 
1838*67e74705SXin Li       // Disable check for missing fields when designators are used.
1839*67e74705SXin Li       // This matches gcc behaviour.
1840*67e74705SXin Li       CheckForMissingFields = false;
1841*67e74705SXin Li       continue;
1842*67e74705SXin Li     }
1843*67e74705SXin Li 
1844*67e74705SXin Li     if (Field == FieldEnd) {
1845*67e74705SXin Li       // We've run out of fields. We're done.
1846*67e74705SXin Li       break;
1847*67e74705SXin Li     }
1848*67e74705SXin Li 
1849*67e74705SXin Li     // We've already initialized a member of a union. We're done.
1850*67e74705SXin Li     if (InitializedSomething && DeclType->isUnionType())
1851*67e74705SXin Li       break;
1852*67e74705SXin Li 
1853*67e74705SXin Li     // If we've hit the flexible array member at the end, we're done.
1854*67e74705SXin Li     if (Field->getType()->isIncompleteArrayType())
1855*67e74705SXin Li       break;
1856*67e74705SXin Li 
1857*67e74705SXin Li     if (Field->isUnnamedBitfield()) {
1858*67e74705SXin Li       // Don't initialize unnamed bitfields, e.g. "int : 20;"
1859*67e74705SXin Li       ++Field;
1860*67e74705SXin Li       continue;
1861*67e74705SXin Li     }
1862*67e74705SXin Li 
1863*67e74705SXin Li     // Make sure we can use this declaration.
1864*67e74705SXin Li     bool InvalidUse;
1865*67e74705SXin Li     if (VerifyOnly)
1866*67e74705SXin Li       InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
1867*67e74705SXin Li     else
1868*67e74705SXin Li       InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field,
1869*67e74705SXin Li                                           IList->getInit(Index)->getLocStart());
1870*67e74705SXin Li     if (InvalidUse) {
1871*67e74705SXin Li       ++Index;
1872*67e74705SXin Li       ++Field;
1873*67e74705SXin Li       hadError = true;
1874*67e74705SXin Li       continue;
1875*67e74705SXin Li     }
1876*67e74705SXin Li 
1877*67e74705SXin Li     InitializedEntity MemberEntity =
1878*67e74705SXin Li       InitializedEntity::InitializeMember(*Field, &Entity);
1879*67e74705SXin Li     CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
1880*67e74705SXin Li                         StructuredList, StructuredIndex);
1881*67e74705SXin Li     InitializedSomething = true;
1882*67e74705SXin Li 
1883*67e74705SXin Li     if (DeclType->isUnionType() && !VerifyOnly) {
1884*67e74705SXin Li       // Initialize the first field within the union.
1885*67e74705SXin Li       StructuredList->setInitializedFieldInUnion(*Field);
1886*67e74705SXin Li     }
1887*67e74705SXin Li 
1888*67e74705SXin Li     ++Field;
1889*67e74705SXin Li   }
1890*67e74705SXin Li 
1891*67e74705SXin Li   // Emit warnings for missing struct field initializers.
1892*67e74705SXin Li   if (!VerifyOnly && InitializedSomething && CheckForMissingFields &&
1893*67e74705SXin Li       Field != FieldEnd && !Field->getType()->isIncompleteArrayType() &&
1894*67e74705SXin Li       !DeclType->isUnionType()) {
1895*67e74705SXin Li     // It is possible we have one or more unnamed bitfields remaining.
1896*67e74705SXin Li     // Find first (if any) named field and emit warning.
1897*67e74705SXin Li     for (RecordDecl::field_iterator it = Field, end = RD->field_end();
1898*67e74705SXin Li          it != end; ++it) {
1899*67e74705SXin Li       if (!it->isUnnamedBitfield() && !it->hasInClassInitializer()) {
1900*67e74705SXin Li         SemaRef.Diag(IList->getSourceRange().getEnd(),
1901*67e74705SXin Li                      diag::warn_missing_field_initializers) << *it;
1902*67e74705SXin Li         break;
1903*67e74705SXin Li       }
1904*67e74705SXin Li     }
1905*67e74705SXin Li   }
1906*67e74705SXin Li 
1907*67e74705SXin Li   // Check that any remaining fields can be value-initialized.
1908*67e74705SXin Li   if (VerifyOnly && Field != FieldEnd && !DeclType->isUnionType() &&
1909*67e74705SXin Li       !Field->getType()->isIncompleteArrayType()) {
1910*67e74705SXin Li     // FIXME: Should check for holes left by designated initializers too.
1911*67e74705SXin Li     for (; Field != FieldEnd && !hadError; ++Field) {
1912*67e74705SXin Li       if (!Field->isUnnamedBitfield() && !Field->hasInClassInitializer())
1913*67e74705SXin Li         CheckEmptyInitializable(
1914*67e74705SXin Li             InitializedEntity::InitializeMember(*Field, &Entity),
1915*67e74705SXin Li             IList->getLocEnd());
1916*67e74705SXin Li     }
1917*67e74705SXin Li   }
1918*67e74705SXin Li 
1919*67e74705SXin Li   if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() ||
1920*67e74705SXin Li       Index >= IList->getNumInits())
1921*67e74705SXin Li     return;
1922*67e74705SXin Li 
1923*67e74705SXin Li   if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field,
1924*67e74705SXin Li                              TopLevelObject)) {
1925*67e74705SXin Li     hadError = true;
1926*67e74705SXin Li     ++Index;
1927*67e74705SXin Li     return;
1928*67e74705SXin Li   }
1929*67e74705SXin Li 
1930*67e74705SXin Li   InitializedEntity MemberEntity =
1931*67e74705SXin Li     InitializedEntity::InitializeMember(*Field, &Entity);
1932*67e74705SXin Li 
1933*67e74705SXin Li   if (isa<InitListExpr>(IList->getInit(Index)))
1934*67e74705SXin Li     CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
1935*67e74705SXin Li                         StructuredList, StructuredIndex);
1936*67e74705SXin Li   else
1937*67e74705SXin Li     CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index,
1938*67e74705SXin Li                           StructuredList, StructuredIndex);
1939*67e74705SXin Li }
1940*67e74705SXin Li 
1941*67e74705SXin Li /// \brief Expand a field designator that refers to a member of an
1942*67e74705SXin Li /// anonymous struct or union into a series of field designators that
1943*67e74705SXin Li /// refers to the field within the appropriate subobject.
1944*67e74705SXin Li ///
ExpandAnonymousFieldDesignator(Sema & SemaRef,DesignatedInitExpr * DIE,unsigned DesigIdx,IndirectFieldDecl * IndirectField)1945*67e74705SXin Li static void ExpandAnonymousFieldDesignator(Sema &SemaRef,
1946*67e74705SXin Li                                            DesignatedInitExpr *DIE,
1947*67e74705SXin Li                                            unsigned DesigIdx,
1948*67e74705SXin Li                                            IndirectFieldDecl *IndirectField) {
1949*67e74705SXin Li   typedef DesignatedInitExpr::Designator Designator;
1950*67e74705SXin Li 
1951*67e74705SXin Li   // Build the replacement designators.
1952*67e74705SXin Li   SmallVector<Designator, 4> Replacements;
1953*67e74705SXin Li   for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(),
1954*67e74705SXin Li        PE = IndirectField->chain_end(); PI != PE; ++PI) {
1955*67e74705SXin Li     if (PI + 1 == PE)
1956*67e74705SXin Li       Replacements.push_back(Designator((IdentifierInfo *)nullptr,
1957*67e74705SXin Li                                     DIE->getDesignator(DesigIdx)->getDotLoc(),
1958*67e74705SXin Li                                 DIE->getDesignator(DesigIdx)->getFieldLoc()));
1959*67e74705SXin Li     else
1960*67e74705SXin Li       Replacements.push_back(Designator((IdentifierInfo *)nullptr,
1961*67e74705SXin Li                                         SourceLocation(), SourceLocation()));
1962*67e74705SXin Li     assert(isa<FieldDecl>(*PI));
1963*67e74705SXin Li     Replacements.back().setField(cast<FieldDecl>(*PI));
1964*67e74705SXin Li   }
1965*67e74705SXin Li 
1966*67e74705SXin Li   // Expand the current designator into the set of replacement
1967*67e74705SXin Li   // designators, so we have a full subobject path down to where the
1968*67e74705SXin Li   // member of the anonymous struct/union is actually stored.
1969*67e74705SXin Li   DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0],
1970*67e74705SXin Li                         &Replacements[0] + Replacements.size());
1971*67e74705SXin Li }
1972*67e74705SXin Li 
CloneDesignatedInitExpr(Sema & SemaRef,DesignatedInitExpr * DIE)1973*67e74705SXin Li static DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef,
1974*67e74705SXin Li                                                    DesignatedInitExpr *DIE) {
1975*67e74705SXin Li   unsigned NumIndexExprs = DIE->getNumSubExprs() - 1;
1976*67e74705SXin Li   SmallVector<Expr*, 4> IndexExprs(NumIndexExprs);
1977*67e74705SXin Li   for (unsigned I = 0; I < NumIndexExprs; ++I)
1978*67e74705SXin Li     IndexExprs[I] = DIE->getSubExpr(I + 1);
1979*67e74705SXin Li   return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators(),
1980*67e74705SXin Li                                     IndexExprs,
1981*67e74705SXin Li                                     DIE->getEqualOrColonLoc(),
1982*67e74705SXin Li                                     DIE->usesGNUSyntax(), DIE->getInit());
1983*67e74705SXin Li }
1984*67e74705SXin Li 
1985*67e74705SXin Li namespace {
1986*67e74705SXin Li 
1987*67e74705SXin Li // Callback to only accept typo corrections that are for field members of
1988*67e74705SXin Li // the given struct or union.
1989*67e74705SXin Li class FieldInitializerValidatorCCC : public CorrectionCandidateCallback {
1990*67e74705SXin Li  public:
FieldInitializerValidatorCCC(RecordDecl * RD)1991*67e74705SXin Li   explicit FieldInitializerValidatorCCC(RecordDecl *RD)
1992*67e74705SXin Li       : Record(RD) {}
1993*67e74705SXin Li 
ValidateCandidate(const TypoCorrection & candidate)1994*67e74705SXin Li   bool ValidateCandidate(const TypoCorrection &candidate) override {
1995*67e74705SXin Li     FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>();
1996*67e74705SXin Li     return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record);
1997*67e74705SXin Li   }
1998*67e74705SXin Li 
1999*67e74705SXin Li  private:
2000*67e74705SXin Li   RecordDecl *Record;
2001*67e74705SXin Li };
2002*67e74705SXin Li 
2003*67e74705SXin Li } // end anonymous namespace
2004*67e74705SXin Li 
2005*67e74705SXin Li /// @brief Check the well-formedness of a C99 designated initializer.
2006*67e74705SXin Li ///
2007*67e74705SXin Li /// Determines whether the designated initializer @p DIE, which
2008*67e74705SXin Li /// resides at the given @p Index within the initializer list @p
2009*67e74705SXin Li /// IList, is well-formed for a current object of type @p DeclType
2010*67e74705SXin Li /// (C99 6.7.8). The actual subobject that this designator refers to
2011*67e74705SXin Li /// within the current subobject is returned in either
2012*67e74705SXin Li /// @p NextField or @p NextElementIndex (whichever is appropriate).
2013*67e74705SXin Li ///
2014*67e74705SXin Li /// @param IList  The initializer list in which this designated
2015*67e74705SXin Li /// initializer occurs.
2016*67e74705SXin Li ///
2017*67e74705SXin Li /// @param DIE The designated initializer expression.
2018*67e74705SXin Li ///
2019*67e74705SXin Li /// @param DesigIdx  The index of the current designator.
2020*67e74705SXin Li ///
2021*67e74705SXin Li /// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17),
2022*67e74705SXin Li /// into which the designation in @p DIE should refer.
2023*67e74705SXin Li ///
2024*67e74705SXin Li /// @param NextField  If non-NULL and the first designator in @p DIE is
2025*67e74705SXin Li /// a field, this will be set to the field declaration corresponding
2026*67e74705SXin Li /// to the field named by the designator.
2027*67e74705SXin Li ///
2028*67e74705SXin Li /// @param NextElementIndex  If non-NULL and the first designator in @p
2029*67e74705SXin Li /// DIE is an array designator or GNU array-range designator, this
2030*67e74705SXin Li /// will be set to the last index initialized by this designator.
2031*67e74705SXin Li ///
2032*67e74705SXin Li /// @param Index  Index into @p IList where the designated initializer
2033*67e74705SXin Li /// @p DIE occurs.
2034*67e74705SXin Li ///
2035*67e74705SXin Li /// @param StructuredList  The initializer list expression that
2036*67e74705SXin Li /// describes all of the subobject initializers in the order they'll
2037*67e74705SXin Li /// actually be initialized.
2038*67e74705SXin Li ///
2039*67e74705SXin Li /// @returns true if there was an error, false otherwise.
2040*67e74705SXin Li bool
CheckDesignatedInitializer(const InitializedEntity & Entity,InitListExpr * IList,DesignatedInitExpr * DIE,unsigned DesigIdx,QualType & CurrentObjectType,RecordDecl::field_iterator * NextField,llvm::APSInt * NextElementIndex,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex,bool FinishSubobjectInit,bool TopLevelObject)2041*67e74705SXin Li InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
2042*67e74705SXin Li                                             InitListExpr *IList,
2043*67e74705SXin Li                                             DesignatedInitExpr *DIE,
2044*67e74705SXin Li                                             unsigned DesigIdx,
2045*67e74705SXin Li                                             QualType &CurrentObjectType,
2046*67e74705SXin Li                                           RecordDecl::field_iterator *NextField,
2047*67e74705SXin Li                                             llvm::APSInt *NextElementIndex,
2048*67e74705SXin Li                                             unsigned &Index,
2049*67e74705SXin Li                                             InitListExpr *StructuredList,
2050*67e74705SXin Li                                             unsigned &StructuredIndex,
2051*67e74705SXin Li                                             bool FinishSubobjectInit,
2052*67e74705SXin Li                                             bool TopLevelObject) {
2053*67e74705SXin Li   if (DesigIdx == DIE->size()) {
2054*67e74705SXin Li     // Check the actual initialization for the designated object type.
2055*67e74705SXin Li     bool prevHadError = hadError;
2056*67e74705SXin Li 
2057*67e74705SXin Li     // Temporarily remove the designator expression from the
2058*67e74705SXin Li     // initializer list that the child calls see, so that we don't try
2059*67e74705SXin Li     // to re-process the designator.
2060*67e74705SXin Li     unsigned OldIndex = Index;
2061*67e74705SXin Li     IList->setInit(OldIndex, DIE->getInit());
2062*67e74705SXin Li 
2063*67e74705SXin Li     CheckSubElementType(Entity, IList, CurrentObjectType, Index,
2064*67e74705SXin Li                         StructuredList, StructuredIndex);
2065*67e74705SXin Li 
2066*67e74705SXin Li     // Restore the designated initializer expression in the syntactic
2067*67e74705SXin Li     // form of the initializer list.
2068*67e74705SXin Li     if (IList->getInit(OldIndex) != DIE->getInit())
2069*67e74705SXin Li       DIE->setInit(IList->getInit(OldIndex));
2070*67e74705SXin Li     IList->setInit(OldIndex, DIE);
2071*67e74705SXin Li 
2072*67e74705SXin Li     return hadError && !prevHadError;
2073*67e74705SXin Li   }
2074*67e74705SXin Li 
2075*67e74705SXin Li   DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx);
2076*67e74705SXin Li   bool IsFirstDesignator = (DesigIdx == 0);
2077*67e74705SXin Li   if (!VerifyOnly) {
2078*67e74705SXin Li     assert((IsFirstDesignator || StructuredList) &&
2079*67e74705SXin Li            "Need a non-designated initializer list to start from");
2080*67e74705SXin Li 
2081*67e74705SXin Li     // Determine the structural initializer list that corresponds to the
2082*67e74705SXin Li     // current subobject.
2083*67e74705SXin Li     if (IsFirstDesignator)
2084*67e74705SXin Li       StructuredList = SyntacticToSemantic.lookup(IList);
2085*67e74705SXin Li     else {
2086*67e74705SXin Li       Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2087*67e74705SXin Li           StructuredList->getInit(StructuredIndex) : nullptr;
2088*67e74705SXin Li       if (!ExistingInit && StructuredList->hasArrayFiller())
2089*67e74705SXin Li         ExistingInit = StructuredList->getArrayFiller();
2090*67e74705SXin Li 
2091*67e74705SXin Li       if (!ExistingInit)
2092*67e74705SXin Li         StructuredList =
2093*67e74705SXin Li           getStructuredSubobjectInit(IList, Index, CurrentObjectType,
2094*67e74705SXin Li                                      StructuredList, StructuredIndex,
2095*67e74705SXin Li                                      SourceRange(D->getLocStart(),
2096*67e74705SXin Li                                                  DIE->getLocEnd()));
2097*67e74705SXin Li       else if (InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2098*67e74705SXin Li         StructuredList = Result;
2099*67e74705SXin Li       else {
2100*67e74705SXin Li         if (DesignatedInitUpdateExpr *E =
2101*67e74705SXin Li                 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2102*67e74705SXin Li           StructuredList = E->getUpdater();
2103*67e74705SXin Li         else {
2104*67e74705SXin Li           DesignatedInitUpdateExpr *DIUE =
2105*67e74705SXin Li               new (SemaRef.Context) DesignatedInitUpdateExpr(SemaRef.Context,
2106*67e74705SXin Li                                         D->getLocStart(), ExistingInit,
2107*67e74705SXin Li                                         DIE->getLocEnd());
2108*67e74705SXin Li           StructuredList->updateInit(SemaRef.Context, StructuredIndex, DIUE);
2109*67e74705SXin Li           StructuredList = DIUE->getUpdater();
2110*67e74705SXin Li         }
2111*67e74705SXin Li 
2112*67e74705SXin Li         // We need to check on source range validity because the previous
2113*67e74705SXin Li         // initializer does not have to be an explicit initializer. e.g.,
2114*67e74705SXin Li         //
2115*67e74705SXin Li         // struct P { int a, b; };
2116*67e74705SXin Li         // struct PP { struct P p } l = { { .a = 2 }, .p.b = 3 };
2117*67e74705SXin Li         //
2118*67e74705SXin Li         // There is an overwrite taking place because the first braced initializer
2119*67e74705SXin Li         // list "{ .a = 2 }" already provides value for .p.b (which is zero).
2120*67e74705SXin Li         if (ExistingInit->getSourceRange().isValid()) {
2121*67e74705SXin Li           // We are creating an initializer list that initializes the
2122*67e74705SXin Li           // subobjects of the current object, but there was already an
2123*67e74705SXin Li           // initialization that completely initialized the current
2124*67e74705SXin Li           // subobject, e.g., by a compound literal:
2125*67e74705SXin Li           //
2126*67e74705SXin Li           // struct X { int a, b; };
2127*67e74705SXin Li           // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
2128*67e74705SXin Li           //
2129*67e74705SXin Li           // Here, xs[0].a == 0 and xs[0].b == 3, since the second,
2130*67e74705SXin Li           // designated initializer re-initializes the whole
2131*67e74705SXin Li           // subobject [0], overwriting previous initializers.
2132*67e74705SXin Li           SemaRef.Diag(D->getLocStart(),
2133*67e74705SXin Li                        diag::warn_subobject_initializer_overrides)
2134*67e74705SXin Li             << SourceRange(D->getLocStart(), DIE->getLocEnd());
2135*67e74705SXin Li 
2136*67e74705SXin Li           SemaRef.Diag(ExistingInit->getLocStart(),
2137*67e74705SXin Li                        diag::note_previous_initializer)
2138*67e74705SXin Li             << /*FIXME:has side effects=*/0
2139*67e74705SXin Li             << ExistingInit->getSourceRange();
2140*67e74705SXin Li         }
2141*67e74705SXin Li       }
2142*67e74705SXin Li     }
2143*67e74705SXin Li     assert(StructuredList && "Expected a structured initializer list");
2144*67e74705SXin Li   }
2145*67e74705SXin Li 
2146*67e74705SXin Li   if (D->isFieldDesignator()) {
2147*67e74705SXin Li     // C99 6.7.8p7:
2148*67e74705SXin Li     //
2149*67e74705SXin Li     //   If a designator has the form
2150*67e74705SXin Li     //
2151*67e74705SXin Li     //      . identifier
2152*67e74705SXin Li     //
2153*67e74705SXin Li     //   then the current object (defined below) shall have
2154*67e74705SXin Li     //   structure or union type and the identifier shall be the
2155*67e74705SXin Li     //   name of a member of that type.
2156*67e74705SXin Li     const RecordType *RT = CurrentObjectType->getAs<RecordType>();
2157*67e74705SXin Li     if (!RT) {
2158*67e74705SXin Li       SourceLocation Loc = D->getDotLoc();
2159*67e74705SXin Li       if (Loc.isInvalid())
2160*67e74705SXin Li         Loc = D->getFieldLoc();
2161*67e74705SXin Li       if (!VerifyOnly)
2162*67e74705SXin Li         SemaRef.Diag(Loc, diag::err_field_designator_non_aggr)
2163*67e74705SXin Li           << SemaRef.getLangOpts().CPlusPlus << CurrentObjectType;
2164*67e74705SXin Li       ++Index;
2165*67e74705SXin Li       return true;
2166*67e74705SXin Li     }
2167*67e74705SXin Li 
2168*67e74705SXin Li     FieldDecl *KnownField = D->getField();
2169*67e74705SXin Li     if (!KnownField) {
2170*67e74705SXin Li       IdentifierInfo *FieldName = D->getFieldName();
2171*67e74705SXin Li       DeclContext::lookup_result Lookup = RT->getDecl()->lookup(FieldName);
2172*67e74705SXin Li       for (NamedDecl *ND : Lookup) {
2173*67e74705SXin Li         if (auto *FD = dyn_cast<FieldDecl>(ND)) {
2174*67e74705SXin Li           KnownField = FD;
2175*67e74705SXin Li           break;
2176*67e74705SXin Li         }
2177*67e74705SXin Li         if (auto *IFD = dyn_cast<IndirectFieldDecl>(ND)) {
2178*67e74705SXin Li           // In verify mode, don't modify the original.
2179*67e74705SXin Li           if (VerifyOnly)
2180*67e74705SXin Li             DIE = CloneDesignatedInitExpr(SemaRef, DIE);
2181*67e74705SXin Li           ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IFD);
2182*67e74705SXin Li           D = DIE->getDesignator(DesigIdx);
2183*67e74705SXin Li           KnownField = cast<FieldDecl>(*IFD->chain_begin());
2184*67e74705SXin Li           break;
2185*67e74705SXin Li         }
2186*67e74705SXin Li       }
2187*67e74705SXin Li       if (!KnownField) {
2188*67e74705SXin Li         if (VerifyOnly) {
2189*67e74705SXin Li           ++Index;
2190*67e74705SXin Li           return true;  // No typo correction when just trying this out.
2191*67e74705SXin Li         }
2192*67e74705SXin Li 
2193*67e74705SXin Li         // Name lookup found something, but it wasn't a field.
2194*67e74705SXin Li         if (!Lookup.empty()) {
2195*67e74705SXin Li           SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield)
2196*67e74705SXin Li             << FieldName;
2197*67e74705SXin Li           SemaRef.Diag(Lookup.front()->getLocation(),
2198*67e74705SXin Li                        diag::note_field_designator_found);
2199*67e74705SXin Li           ++Index;
2200*67e74705SXin Li           return true;
2201*67e74705SXin Li         }
2202*67e74705SXin Li 
2203*67e74705SXin Li         // Name lookup didn't find anything.
2204*67e74705SXin Li         // Determine whether this was a typo for another field name.
2205*67e74705SXin Li         if (TypoCorrection Corrected = SemaRef.CorrectTypo(
2206*67e74705SXin Li                 DeclarationNameInfo(FieldName, D->getFieldLoc()),
2207*67e74705SXin Li                 Sema::LookupMemberName, /*Scope=*/nullptr, /*SS=*/nullptr,
2208*67e74705SXin Li                 llvm::make_unique<FieldInitializerValidatorCCC>(RT->getDecl()),
2209*67e74705SXin Li                 Sema::CTK_ErrorRecovery, RT->getDecl())) {
2210*67e74705SXin Li           SemaRef.diagnoseTypo(
2211*67e74705SXin Li               Corrected,
2212*67e74705SXin Li               SemaRef.PDiag(diag::err_field_designator_unknown_suggest)
2213*67e74705SXin Li                 << FieldName << CurrentObjectType);
2214*67e74705SXin Li           KnownField = Corrected.getCorrectionDeclAs<FieldDecl>();
2215*67e74705SXin Li           hadError = true;
2216*67e74705SXin Li         } else {
2217*67e74705SXin Li           // Typo correction didn't find anything.
2218*67e74705SXin Li           SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_unknown)
2219*67e74705SXin Li             << FieldName << CurrentObjectType;
2220*67e74705SXin Li           ++Index;
2221*67e74705SXin Li           return true;
2222*67e74705SXin Li         }
2223*67e74705SXin Li       }
2224*67e74705SXin Li     }
2225*67e74705SXin Li 
2226*67e74705SXin Li     unsigned FieldIndex = 0;
2227*67e74705SXin Li     for (auto *FI : RT->getDecl()->fields()) {
2228*67e74705SXin Li       if (FI->isUnnamedBitfield())
2229*67e74705SXin Li         continue;
2230*67e74705SXin Li       if (declaresSameEntity(KnownField, FI)) {
2231*67e74705SXin Li         KnownField = FI;
2232*67e74705SXin Li         break;
2233*67e74705SXin Li       }
2234*67e74705SXin Li       ++FieldIndex;
2235*67e74705SXin Li     }
2236*67e74705SXin Li 
2237*67e74705SXin Li     RecordDecl::field_iterator Field =
2238*67e74705SXin Li         RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
2239*67e74705SXin Li 
2240*67e74705SXin Li     // All of the fields of a union are located at the same place in
2241*67e74705SXin Li     // the initializer list.
2242*67e74705SXin Li     if (RT->getDecl()->isUnion()) {
2243*67e74705SXin Li       FieldIndex = 0;
2244*67e74705SXin Li       if (!VerifyOnly) {
2245*67e74705SXin Li         FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
2246*67e74705SXin Li         if (CurrentField && !declaresSameEntity(CurrentField, *Field)) {
2247*67e74705SXin Li           assert(StructuredList->getNumInits() == 1
2248*67e74705SXin Li                  && "A union should never have more than one initializer!");
2249*67e74705SXin Li 
2250*67e74705SXin Li           // We're about to throw away an initializer, emit warning.
2251*67e74705SXin Li           SemaRef.Diag(D->getFieldLoc(),
2252*67e74705SXin Li                        diag::warn_initializer_overrides)
2253*67e74705SXin Li             << D->getSourceRange();
2254*67e74705SXin Li           Expr *ExistingInit = StructuredList->getInit(0);
2255*67e74705SXin Li           SemaRef.Diag(ExistingInit->getLocStart(),
2256*67e74705SXin Li                        diag::note_previous_initializer)
2257*67e74705SXin Li             << /*FIXME:has side effects=*/0
2258*67e74705SXin Li             << ExistingInit->getSourceRange();
2259*67e74705SXin Li 
2260*67e74705SXin Li           // remove existing initializer
2261*67e74705SXin Li           StructuredList->resizeInits(SemaRef.Context, 0);
2262*67e74705SXin Li           StructuredList->setInitializedFieldInUnion(nullptr);
2263*67e74705SXin Li         }
2264*67e74705SXin Li 
2265*67e74705SXin Li         StructuredList->setInitializedFieldInUnion(*Field);
2266*67e74705SXin Li       }
2267*67e74705SXin Li     }
2268*67e74705SXin Li 
2269*67e74705SXin Li     // Make sure we can use this declaration.
2270*67e74705SXin Li     bool InvalidUse;
2271*67e74705SXin Li     if (VerifyOnly)
2272*67e74705SXin Li       InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
2273*67e74705SXin Li     else
2274*67e74705SXin Li       InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc());
2275*67e74705SXin Li     if (InvalidUse) {
2276*67e74705SXin Li       ++Index;
2277*67e74705SXin Li       return true;
2278*67e74705SXin Li     }
2279*67e74705SXin Li 
2280*67e74705SXin Li     if (!VerifyOnly) {
2281*67e74705SXin Li       // Update the designator with the field declaration.
2282*67e74705SXin Li       D->setField(*Field);
2283*67e74705SXin Li 
2284*67e74705SXin Li       // Make sure that our non-designated initializer list has space
2285*67e74705SXin Li       // for a subobject corresponding to this field.
2286*67e74705SXin Li       if (FieldIndex >= StructuredList->getNumInits())
2287*67e74705SXin Li         StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1);
2288*67e74705SXin Li     }
2289*67e74705SXin Li 
2290*67e74705SXin Li     // This designator names a flexible array member.
2291*67e74705SXin Li     if (Field->getType()->isIncompleteArrayType()) {
2292*67e74705SXin Li       bool Invalid = false;
2293*67e74705SXin Li       if ((DesigIdx + 1) != DIE->size()) {
2294*67e74705SXin Li         // We can't designate an object within the flexible array
2295*67e74705SXin Li         // member (because GCC doesn't allow it).
2296*67e74705SXin Li         if (!VerifyOnly) {
2297*67e74705SXin Li           DesignatedInitExpr::Designator *NextD
2298*67e74705SXin Li             = DIE->getDesignator(DesigIdx + 1);
2299*67e74705SXin Li           SemaRef.Diag(NextD->getLocStart(),
2300*67e74705SXin Li                         diag::err_designator_into_flexible_array_member)
2301*67e74705SXin Li             << SourceRange(NextD->getLocStart(),
2302*67e74705SXin Li                            DIE->getLocEnd());
2303*67e74705SXin Li           SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
2304*67e74705SXin Li             << *Field;
2305*67e74705SXin Li         }
2306*67e74705SXin Li         Invalid = true;
2307*67e74705SXin Li       }
2308*67e74705SXin Li 
2309*67e74705SXin Li       if (!hadError && !isa<InitListExpr>(DIE->getInit()) &&
2310*67e74705SXin Li           !isa<StringLiteral>(DIE->getInit())) {
2311*67e74705SXin Li         // The initializer is not an initializer list.
2312*67e74705SXin Li         if (!VerifyOnly) {
2313*67e74705SXin Li           SemaRef.Diag(DIE->getInit()->getLocStart(),
2314*67e74705SXin Li                         diag::err_flexible_array_init_needs_braces)
2315*67e74705SXin Li             << DIE->getInit()->getSourceRange();
2316*67e74705SXin Li           SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
2317*67e74705SXin Li             << *Field;
2318*67e74705SXin Li         }
2319*67e74705SXin Li         Invalid = true;
2320*67e74705SXin Li       }
2321*67e74705SXin Li 
2322*67e74705SXin Li       // Check GNU flexible array initializer.
2323*67e74705SXin Li       if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field,
2324*67e74705SXin Li                                              TopLevelObject))
2325*67e74705SXin Li         Invalid = true;
2326*67e74705SXin Li 
2327*67e74705SXin Li       if (Invalid) {
2328*67e74705SXin Li         ++Index;
2329*67e74705SXin Li         return true;
2330*67e74705SXin Li       }
2331*67e74705SXin Li 
2332*67e74705SXin Li       // Initialize the array.
2333*67e74705SXin Li       bool prevHadError = hadError;
2334*67e74705SXin Li       unsigned newStructuredIndex = FieldIndex;
2335*67e74705SXin Li       unsigned OldIndex = Index;
2336*67e74705SXin Li       IList->setInit(Index, DIE->getInit());
2337*67e74705SXin Li 
2338*67e74705SXin Li       InitializedEntity MemberEntity =
2339*67e74705SXin Li         InitializedEntity::InitializeMember(*Field, &Entity);
2340*67e74705SXin Li       CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2341*67e74705SXin Li                           StructuredList, newStructuredIndex);
2342*67e74705SXin Li 
2343*67e74705SXin Li       IList->setInit(OldIndex, DIE);
2344*67e74705SXin Li       if (hadError && !prevHadError) {
2345*67e74705SXin Li         ++Field;
2346*67e74705SXin Li         ++FieldIndex;
2347*67e74705SXin Li         if (NextField)
2348*67e74705SXin Li           *NextField = Field;
2349*67e74705SXin Li         StructuredIndex = FieldIndex;
2350*67e74705SXin Li         return true;
2351*67e74705SXin Li       }
2352*67e74705SXin Li     } else {
2353*67e74705SXin Li       // Recurse to check later designated subobjects.
2354*67e74705SXin Li       QualType FieldType = Field->getType();
2355*67e74705SXin Li       unsigned newStructuredIndex = FieldIndex;
2356*67e74705SXin Li 
2357*67e74705SXin Li       InitializedEntity MemberEntity =
2358*67e74705SXin Li         InitializedEntity::InitializeMember(*Field, &Entity);
2359*67e74705SXin Li       if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
2360*67e74705SXin Li                                      FieldType, nullptr, nullptr, Index,
2361*67e74705SXin Li                                      StructuredList, newStructuredIndex,
2362*67e74705SXin Li                                      FinishSubobjectInit, false))
2363*67e74705SXin Li         return true;
2364*67e74705SXin Li     }
2365*67e74705SXin Li 
2366*67e74705SXin Li     // Find the position of the next field to be initialized in this
2367*67e74705SXin Li     // subobject.
2368*67e74705SXin Li     ++Field;
2369*67e74705SXin Li     ++FieldIndex;
2370*67e74705SXin Li 
2371*67e74705SXin Li     // If this the first designator, our caller will continue checking
2372*67e74705SXin Li     // the rest of this struct/class/union subobject.
2373*67e74705SXin Li     if (IsFirstDesignator) {
2374*67e74705SXin Li       if (NextField)
2375*67e74705SXin Li         *NextField = Field;
2376*67e74705SXin Li       StructuredIndex = FieldIndex;
2377*67e74705SXin Li       return false;
2378*67e74705SXin Li     }
2379*67e74705SXin Li 
2380*67e74705SXin Li     if (!FinishSubobjectInit)
2381*67e74705SXin Li       return false;
2382*67e74705SXin Li 
2383*67e74705SXin Li     // We've already initialized something in the union; we're done.
2384*67e74705SXin Li     if (RT->getDecl()->isUnion())
2385*67e74705SXin Li       return hadError;
2386*67e74705SXin Li 
2387*67e74705SXin Li     // Check the remaining fields within this class/struct/union subobject.
2388*67e74705SXin Li     bool prevHadError = hadError;
2389*67e74705SXin Li 
2390*67e74705SXin Li     auto NoBases =
2391*67e74705SXin Li         CXXRecordDecl::base_class_range(CXXRecordDecl::base_class_iterator(),
2392*67e74705SXin Li                                         CXXRecordDecl::base_class_iterator());
2393*67e74705SXin Li     CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
2394*67e74705SXin Li                           false, Index, StructuredList, FieldIndex);
2395*67e74705SXin Li     return hadError && !prevHadError;
2396*67e74705SXin Li   }
2397*67e74705SXin Li 
2398*67e74705SXin Li   // C99 6.7.8p6:
2399*67e74705SXin Li   //
2400*67e74705SXin Li   //   If a designator has the form
2401*67e74705SXin Li   //
2402*67e74705SXin Li   //      [ constant-expression ]
2403*67e74705SXin Li   //
2404*67e74705SXin Li   //   then the current object (defined below) shall have array
2405*67e74705SXin Li   //   type and the expression shall be an integer constant
2406*67e74705SXin Li   //   expression. If the array is of unknown size, any
2407*67e74705SXin Li   //   nonnegative value is valid.
2408*67e74705SXin Li   //
2409*67e74705SXin Li   // Additionally, cope with the GNU extension that permits
2410*67e74705SXin Li   // designators of the form
2411*67e74705SXin Li   //
2412*67e74705SXin Li   //      [ constant-expression ... constant-expression ]
2413*67e74705SXin Li   const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType);
2414*67e74705SXin Li   if (!AT) {
2415*67e74705SXin Li     if (!VerifyOnly)
2416*67e74705SXin Li       SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array)
2417*67e74705SXin Li         << CurrentObjectType;
2418*67e74705SXin Li     ++Index;
2419*67e74705SXin Li     return true;
2420*67e74705SXin Li   }
2421*67e74705SXin Li 
2422*67e74705SXin Li   Expr *IndexExpr = nullptr;
2423*67e74705SXin Li   llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
2424*67e74705SXin Li   if (D->isArrayDesignator()) {
2425*67e74705SXin Li     IndexExpr = DIE->getArrayIndex(*D);
2426*67e74705SXin Li     DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context);
2427*67e74705SXin Li     DesignatedEndIndex = DesignatedStartIndex;
2428*67e74705SXin Li   } else {
2429*67e74705SXin Li     assert(D->isArrayRangeDesignator() && "Need array-range designator");
2430*67e74705SXin Li 
2431*67e74705SXin Li     DesignatedStartIndex =
2432*67e74705SXin Li       DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context);
2433*67e74705SXin Li     DesignatedEndIndex =
2434*67e74705SXin Li       DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context);
2435*67e74705SXin Li     IndexExpr = DIE->getArrayRangeEnd(*D);
2436*67e74705SXin Li 
2437*67e74705SXin Li     // Codegen can't handle evaluating array range designators that have side
2438*67e74705SXin Li     // effects, because we replicate the AST value for each initialized element.
2439*67e74705SXin Li     // As such, set the sawArrayRangeDesignator() bit if we initialize multiple
2440*67e74705SXin Li     // elements with something that has a side effect, so codegen can emit an
2441*67e74705SXin Li     // "error unsupported" error instead of miscompiling the app.
2442*67e74705SXin Li     if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
2443*67e74705SXin Li         DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly)
2444*67e74705SXin Li       FullyStructuredList->sawArrayRangeDesignator();
2445*67e74705SXin Li   }
2446*67e74705SXin Li 
2447*67e74705SXin Li   if (isa<ConstantArrayType>(AT)) {
2448*67e74705SXin Li     llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false);
2449*67e74705SXin Li     DesignatedStartIndex
2450*67e74705SXin Li       = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
2451*67e74705SXin Li     DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
2452*67e74705SXin Li     DesignatedEndIndex
2453*67e74705SXin Li       = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
2454*67e74705SXin Li     DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
2455*67e74705SXin Li     if (DesignatedEndIndex >= MaxElements) {
2456*67e74705SXin Li       if (!VerifyOnly)
2457*67e74705SXin Li         SemaRef.Diag(IndexExpr->getLocStart(),
2458*67e74705SXin Li                       diag::err_array_designator_too_large)
2459*67e74705SXin Li           << DesignatedEndIndex.toString(10) << MaxElements.toString(10)
2460*67e74705SXin Li           << IndexExpr->getSourceRange();
2461*67e74705SXin Li       ++Index;
2462*67e74705SXin Li       return true;
2463*67e74705SXin Li     }
2464*67e74705SXin Li   } else {
2465*67e74705SXin Li     unsigned DesignatedIndexBitWidth =
2466*67e74705SXin Li       ConstantArrayType::getMaxSizeBits(SemaRef.Context);
2467*67e74705SXin Li     DesignatedStartIndex =
2468*67e74705SXin Li       DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
2469*67e74705SXin Li     DesignatedEndIndex =
2470*67e74705SXin Li       DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
2471*67e74705SXin Li     DesignatedStartIndex.setIsUnsigned(true);
2472*67e74705SXin Li     DesignatedEndIndex.setIsUnsigned(true);
2473*67e74705SXin Li   }
2474*67e74705SXin Li 
2475*67e74705SXin Li   if (!VerifyOnly && StructuredList->isStringLiteralInit()) {
2476*67e74705SXin Li     // We're modifying a string literal init; we have to decompose the string
2477*67e74705SXin Li     // so we can modify the individual characters.
2478*67e74705SXin Li     ASTContext &Context = SemaRef.Context;
2479*67e74705SXin Li     Expr *SubExpr = StructuredList->getInit(0)->IgnoreParens();
2480*67e74705SXin Li 
2481*67e74705SXin Li     // Compute the character type
2482*67e74705SXin Li     QualType CharTy = AT->getElementType();
2483*67e74705SXin Li 
2484*67e74705SXin Li     // Compute the type of the integer literals.
2485*67e74705SXin Li     QualType PromotedCharTy = CharTy;
2486*67e74705SXin Li     if (CharTy->isPromotableIntegerType())
2487*67e74705SXin Li       PromotedCharTy = Context.getPromotedIntegerType(CharTy);
2488*67e74705SXin Li     unsigned PromotedCharTyWidth = Context.getTypeSize(PromotedCharTy);
2489*67e74705SXin Li 
2490*67e74705SXin Li     if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) {
2491*67e74705SXin Li       // Get the length of the string.
2492*67e74705SXin Li       uint64_t StrLen = SL->getLength();
2493*67e74705SXin Li       if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
2494*67e74705SXin Li         StrLen = cast<ConstantArrayType>(AT)->getSize().getZExtValue();
2495*67e74705SXin Li       StructuredList->resizeInits(Context, StrLen);
2496*67e74705SXin Li 
2497*67e74705SXin Li       // Build a literal for each character in the string, and put them into
2498*67e74705SXin Li       // the init list.
2499*67e74705SXin Li       for (unsigned i = 0, e = StrLen; i != e; ++i) {
2500*67e74705SXin Li         llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
2501*67e74705SXin Li         Expr *Init = new (Context) IntegerLiteral(
2502*67e74705SXin Li             Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
2503*67e74705SXin Li         if (CharTy != PromotedCharTy)
2504*67e74705SXin Li           Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
2505*67e74705SXin Li                                           Init, nullptr, VK_RValue);
2506*67e74705SXin Li         StructuredList->updateInit(Context, i, Init);
2507*67e74705SXin Li       }
2508*67e74705SXin Li     } else {
2509*67e74705SXin Li       ObjCEncodeExpr *E = cast<ObjCEncodeExpr>(SubExpr);
2510*67e74705SXin Li       std::string Str;
2511*67e74705SXin Li       Context.getObjCEncodingForType(E->getEncodedType(), Str);
2512*67e74705SXin Li 
2513*67e74705SXin Li       // Get the length of the string.
2514*67e74705SXin Li       uint64_t StrLen = Str.size();
2515*67e74705SXin Li       if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
2516*67e74705SXin Li         StrLen = cast<ConstantArrayType>(AT)->getSize().getZExtValue();
2517*67e74705SXin Li       StructuredList->resizeInits(Context, StrLen);
2518*67e74705SXin Li 
2519*67e74705SXin Li       // Build a literal for each character in the string, and put them into
2520*67e74705SXin Li       // the init list.
2521*67e74705SXin Li       for (unsigned i = 0, e = StrLen; i != e; ++i) {
2522*67e74705SXin Li         llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
2523*67e74705SXin Li         Expr *Init = new (Context) IntegerLiteral(
2524*67e74705SXin Li             Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
2525*67e74705SXin Li         if (CharTy != PromotedCharTy)
2526*67e74705SXin Li           Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
2527*67e74705SXin Li                                           Init, nullptr, VK_RValue);
2528*67e74705SXin Li         StructuredList->updateInit(Context, i, Init);
2529*67e74705SXin Li       }
2530*67e74705SXin Li     }
2531*67e74705SXin Li   }
2532*67e74705SXin Li 
2533*67e74705SXin Li   // Make sure that our non-designated initializer list has space
2534*67e74705SXin Li   // for a subobject corresponding to this array element.
2535*67e74705SXin Li   if (!VerifyOnly &&
2536*67e74705SXin Li       DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
2537*67e74705SXin Li     StructuredList->resizeInits(SemaRef.Context,
2538*67e74705SXin Li                                 DesignatedEndIndex.getZExtValue() + 1);
2539*67e74705SXin Li 
2540*67e74705SXin Li   // Repeatedly perform subobject initializations in the range
2541*67e74705SXin Li   // [DesignatedStartIndex, DesignatedEndIndex].
2542*67e74705SXin Li 
2543*67e74705SXin Li   // Move to the next designator
2544*67e74705SXin Li   unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
2545*67e74705SXin Li   unsigned OldIndex = Index;
2546*67e74705SXin Li 
2547*67e74705SXin Li   InitializedEntity ElementEntity =
2548*67e74705SXin Li     InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
2549*67e74705SXin Li 
2550*67e74705SXin Li   while (DesignatedStartIndex <= DesignatedEndIndex) {
2551*67e74705SXin Li     // Recurse to check later designated subobjects.
2552*67e74705SXin Li     QualType ElementType = AT->getElementType();
2553*67e74705SXin Li     Index = OldIndex;
2554*67e74705SXin Li 
2555*67e74705SXin Li     ElementEntity.setElementIndex(ElementIndex);
2556*67e74705SXin Li     if (CheckDesignatedInitializer(
2557*67e74705SXin Li             ElementEntity, IList, DIE, DesigIdx + 1, ElementType, nullptr,
2558*67e74705SXin Li             nullptr, Index, StructuredList, ElementIndex,
2559*67e74705SXin Li             FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
2560*67e74705SXin Li             false))
2561*67e74705SXin Li       return true;
2562*67e74705SXin Li 
2563*67e74705SXin Li     // Move to the next index in the array that we'll be initializing.
2564*67e74705SXin Li     ++DesignatedStartIndex;
2565*67e74705SXin Li     ElementIndex = DesignatedStartIndex.getZExtValue();
2566*67e74705SXin Li   }
2567*67e74705SXin Li 
2568*67e74705SXin Li   // If this the first designator, our caller will continue checking
2569*67e74705SXin Li   // the rest of this array subobject.
2570*67e74705SXin Li   if (IsFirstDesignator) {
2571*67e74705SXin Li     if (NextElementIndex)
2572*67e74705SXin Li       *NextElementIndex = DesignatedStartIndex;
2573*67e74705SXin Li     StructuredIndex = ElementIndex;
2574*67e74705SXin Li     return false;
2575*67e74705SXin Li   }
2576*67e74705SXin Li 
2577*67e74705SXin Li   if (!FinishSubobjectInit)
2578*67e74705SXin Li     return false;
2579*67e74705SXin Li 
2580*67e74705SXin Li   // Check the remaining elements within this array subobject.
2581*67e74705SXin Li   bool prevHadError = hadError;
2582*67e74705SXin Li   CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
2583*67e74705SXin Li                  /*SubobjectIsDesignatorContext=*/false, Index,
2584*67e74705SXin Li                  StructuredList, ElementIndex);
2585*67e74705SXin Li   return hadError && !prevHadError;
2586*67e74705SXin Li }
2587*67e74705SXin Li 
2588*67e74705SXin Li // Get the structured initializer list for a subobject of type
2589*67e74705SXin Li // @p CurrentObjectType.
2590*67e74705SXin Li InitListExpr *
getStructuredSubobjectInit(InitListExpr * IList,unsigned Index,QualType CurrentObjectType,InitListExpr * StructuredList,unsigned StructuredIndex,SourceRange InitRange,bool IsFullyOverwritten)2591*67e74705SXin Li InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
2592*67e74705SXin Li                                             QualType CurrentObjectType,
2593*67e74705SXin Li                                             InitListExpr *StructuredList,
2594*67e74705SXin Li                                             unsigned StructuredIndex,
2595*67e74705SXin Li                                             SourceRange InitRange,
2596*67e74705SXin Li                                             bool IsFullyOverwritten) {
2597*67e74705SXin Li   if (VerifyOnly)
2598*67e74705SXin Li     return nullptr; // No structured list in verification-only mode.
2599*67e74705SXin Li   Expr *ExistingInit = nullptr;
2600*67e74705SXin Li   if (!StructuredList)
2601*67e74705SXin Li     ExistingInit = SyntacticToSemantic.lookup(IList);
2602*67e74705SXin Li   else if (StructuredIndex < StructuredList->getNumInits())
2603*67e74705SXin Li     ExistingInit = StructuredList->getInit(StructuredIndex);
2604*67e74705SXin Li 
2605*67e74705SXin Li   if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
2606*67e74705SXin Li     // There might have already been initializers for subobjects of the current
2607*67e74705SXin Li     // object, but a subsequent initializer list will overwrite the entirety
2608*67e74705SXin Li     // of the current object. (See DR 253 and C99 6.7.8p21). e.g.,
2609*67e74705SXin Li     //
2610*67e74705SXin Li     // struct P { char x[6]; };
2611*67e74705SXin Li     // struct P l = { .x[2] = 'x', .x = { [0] = 'f' } };
2612*67e74705SXin Li     //
2613*67e74705SXin Li     // The first designated initializer is ignored, and l.x is just "f".
2614*67e74705SXin Li     if (!IsFullyOverwritten)
2615*67e74705SXin Li       return Result;
2616*67e74705SXin Li 
2617*67e74705SXin Li   if (ExistingInit) {
2618*67e74705SXin Li     // We are creating an initializer list that initializes the
2619*67e74705SXin Li     // subobjects of the current object, but there was already an
2620*67e74705SXin Li     // initialization that completely initialized the current
2621*67e74705SXin Li     // subobject, e.g., by a compound literal:
2622*67e74705SXin Li     //
2623*67e74705SXin Li     // struct X { int a, b; };
2624*67e74705SXin Li     // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
2625*67e74705SXin Li     //
2626*67e74705SXin Li     // Here, xs[0].a == 0 and xs[0].b == 3, since the second,
2627*67e74705SXin Li     // designated initializer re-initializes the whole
2628*67e74705SXin Li     // subobject [0], overwriting previous initializers.
2629*67e74705SXin Li     SemaRef.Diag(InitRange.getBegin(),
2630*67e74705SXin Li                  diag::warn_subobject_initializer_overrides)
2631*67e74705SXin Li       << InitRange;
2632*67e74705SXin Li     SemaRef.Diag(ExistingInit->getLocStart(),
2633*67e74705SXin Li                   diag::note_previous_initializer)
2634*67e74705SXin Li       << /*FIXME:has side effects=*/0
2635*67e74705SXin Li       << ExistingInit->getSourceRange();
2636*67e74705SXin Li   }
2637*67e74705SXin Li 
2638*67e74705SXin Li   InitListExpr *Result
2639*67e74705SXin Li     = new (SemaRef.Context) InitListExpr(SemaRef.Context,
2640*67e74705SXin Li                                          InitRange.getBegin(), None,
2641*67e74705SXin Li                                          InitRange.getEnd());
2642*67e74705SXin Li 
2643*67e74705SXin Li   QualType ResultType = CurrentObjectType;
2644*67e74705SXin Li   if (!ResultType->isArrayType())
2645*67e74705SXin Li     ResultType = ResultType.getNonLValueExprType(SemaRef.Context);
2646*67e74705SXin Li   Result->setType(ResultType);
2647*67e74705SXin Li 
2648*67e74705SXin Li   // Pre-allocate storage for the structured initializer list.
2649*67e74705SXin Li   unsigned NumElements = 0;
2650*67e74705SXin Li   unsigned NumInits = 0;
2651*67e74705SXin Li   bool GotNumInits = false;
2652*67e74705SXin Li   if (!StructuredList) {
2653*67e74705SXin Li     NumInits = IList->getNumInits();
2654*67e74705SXin Li     GotNumInits = true;
2655*67e74705SXin Li   } else if (Index < IList->getNumInits()) {
2656*67e74705SXin Li     if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) {
2657*67e74705SXin Li       NumInits = SubList->getNumInits();
2658*67e74705SXin Li       GotNumInits = true;
2659*67e74705SXin Li     }
2660*67e74705SXin Li   }
2661*67e74705SXin Li 
2662*67e74705SXin Li   if (const ArrayType *AType
2663*67e74705SXin Li       = SemaRef.Context.getAsArrayType(CurrentObjectType)) {
2664*67e74705SXin Li     if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) {
2665*67e74705SXin Li       NumElements = CAType->getSize().getZExtValue();
2666*67e74705SXin Li       // Simple heuristic so that we don't allocate a very large
2667*67e74705SXin Li       // initializer with many empty entries at the end.
2668*67e74705SXin Li       if (GotNumInits && NumElements > NumInits)
2669*67e74705SXin Li         NumElements = 0;
2670*67e74705SXin Li     }
2671*67e74705SXin Li   } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>())
2672*67e74705SXin Li     NumElements = VType->getNumElements();
2673*67e74705SXin Li   else if (const RecordType *RType = CurrentObjectType->getAs<RecordType>()) {
2674*67e74705SXin Li     RecordDecl *RDecl = RType->getDecl();
2675*67e74705SXin Li     if (RDecl->isUnion())
2676*67e74705SXin Li       NumElements = 1;
2677*67e74705SXin Li     else
2678*67e74705SXin Li       NumElements = std::distance(RDecl->field_begin(), RDecl->field_end());
2679*67e74705SXin Li   }
2680*67e74705SXin Li 
2681*67e74705SXin Li   Result->reserveInits(SemaRef.Context, NumElements);
2682*67e74705SXin Li 
2683*67e74705SXin Li   // Link this new initializer list into the structured initializer
2684*67e74705SXin Li   // lists.
2685*67e74705SXin Li   if (StructuredList)
2686*67e74705SXin Li     StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result);
2687*67e74705SXin Li   else {
2688*67e74705SXin Li     Result->setSyntacticForm(IList);
2689*67e74705SXin Li     SyntacticToSemantic[IList] = Result;
2690*67e74705SXin Li   }
2691*67e74705SXin Li 
2692*67e74705SXin Li   return Result;
2693*67e74705SXin Li }
2694*67e74705SXin Li 
2695*67e74705SXin Li /// Update the initializer at index @p StructuredIndex within the
2696*67e74705SXin Li /// structured initializer list to the value @p expr.
UpdateStructuredListElement(InitListExpr * StructuredList,unsigned & StructuredIndex,Expr * expr)2697*67e74705SXin Li void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
2698*67e74705SXin Li                                                   unsigned &StructuredIndex,
2699*67e74705SXin Li                                                   Expr *expr) {
2700*67e74705SXin Li   // No structured initializer list to update
2701*67e74705SXin Li   if (!StructuredList)
2702*67e74705SXin Li     return;
2703*67e74705SXin Li 
2704*67e74705SXin Li   if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
2705*67e74705SXin Li                                                   StructuredIndex, expr)) {
2706*67e74705SXin Li     // This initializer overwrites a previous initializer. Warn.
2707*67e74705SXin Li     // We need to check on source range validity because the previous
2708*67e74705SXin Li     // initializer does not have to be an explicit initializer.
2709*67e74705SXin Li     // struct P { int a, b; };
2710*67e74705SXin Li     // struct PP { struct P p } l = { { .a = 2 }, .p.b = 3 };
2711*67e74705SXin Li     // There is an overwrite taking place because the first braced initializer
2712*67e74705SXin Li     // list "{ .a = 2 }' already provides value for .p.b (which is zero).
2713*67e74705SXin Li     if (PrevInit->getSourceRange().isValid()) {
2714*67e74705SXin Li       SemaRef.Diag(expr->getLocStart(),
2715*67e74705SXin Li                    diag::warn_initializer_overrides)
2716*67e74705SXin Li         << expr->getSourceRange();
2717*67e74705SXin Li 
2718*67e74705SXin Li       SemaRef.Diag(PrevInit->getLocStart(),
2719*67e74705SXin Li                    diag::note_previous_initializer)
2720*67e74705SXin Li         << /*FIXME:has side effects=*/0
2721*67e74705SXin Li         << PrevInit->getSourceRange();
2722*67e74705SXin Li     }
2723*67e74705SXin Li   }
2724*67e74705SXin Li 
2725*67e74705SXin Li   ++StructuredIndex;
2726*67e74705SXin Li }
2727*67e74705SXin Li 
2728*67e74705SXin Li /// Check that the given Index expression is a valid array designator
2729*67e74705SXin Li /// value. This is essentially just a wrapper around
2730*67e74705SXin Li /// VerifyIntegerConstantExpression that also checks for negative values
2731*67e74705SXin Li /// and produces a reasonable diagnostic if there is a
2732*67e74705SXin Li /// failure. Returns the index expression, possibly with an implicit cast
2733*67e74705SXin Li /// added, on success.  If everything went okay, Value will receive the
2734*67e74705SXin Li /// value of the constant expression.
2735*67e74705SXin Li static ExprResult
CheckArrayDesignatorExpr(Sema & S,Expr * Index,llvm::APSInt & Value)2736*67e74705SXin Li CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) {
2737*67e74705SXin Li   SourceLocation Loc = Index->getLocStart();
2738*67e74705SXin Li 
2739*67e74705SXin Li   // Make sure this is an integer constant expression.
2740*67e74705SXin Li   ExprResult Result = S.VerifyIntegerConstantExpression(Index, &Value);
2741*67e74705SXin Li   if (Result.isInvalid())
2742*67e74705SXin Li     return Result;
2743*67e74705SXin Li 
2744*67e74705SXin Li   if (Value.isSigned() && Value.isNegative())
2745*67e74705SXin Li     return S.Diag(Loc, diag::err_array_designator_negative)
2746*67e74705SXin Li       << Value.toString(10) << Index->getSourceRange();
2747*67e74705SXin Li 
2748*67e74705SXin Li   Value.setIsUnsigned(true);
2749*67e74705SXin Li   return Result;
2750*67e74705SXin Li }
2751*67e74705SXin Li 
ActOnDesignatedInitializer(Designation & Desig,SourceLocation Loc,bool GNUSyntax,ExprResult Init)2752*67e74705SXin Li ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
2753*67e74705SXin Li                                             SourceLocation Loc,
2754*67e74705SXin Li                                             bool GNUSyntax,
2755*67e74705SXin Li                                             ExprResult Init) {
2756*67e74705SXin Li   typedef DesignatedInitExpr::Designator ASTDesignator;
2757*67e74705SXin Li 
2758*67e74705SXin Li   bool Invalid = false;
2759*67e74705SXin Li   SmallVector<ASTDesignator, 32> Designators;
2760*67e74705SXin Li   SmallVector<Expr *, 32> InitExpressions;
2761*67e74705SXin Li 
2762*67e74705SXin Li   // Build designators and check array designator expressions.
2763*67e74705SXin Li   for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) {
2764*67e74705SXin Li     const Designator &D = Desig.getDesignator(Idx);
2765*67e74705SXin Li     switch (D.getKind()) {
2766*67e74705SXin Li     case Designator::FieldDesignator:
2767*67e74705SXin Li       Designators.push_back(ASTDesignator(D.getField(), D.getDotLoc(),
2768*67e74705SXin Li                                           D.getFieldLoc()));
2769*67e74705SXin Li       break;
2770*67e74705SXin Li 
2771*67e74705SXin Li     case Designator::ArrayDesignator: {
2772*67e74705SXin Li       Expr *Index = static_cast<Expr *>(D.getArrayIndex());
2773*67e74705SXin Li       llvm::APSInt IndexValue;
2774*67e74705SXin Li       if (!Index->isTypeDependent() && !Index->isValueDependent())
2775*67e74705SXin Li         Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get();
2776*67e74705SXin Li       if (!Index)
2777*67e74705SXin Li         Invalid = true;
2778*67e74705SXin Li       else {
2779*67e74705SXin Li         Designators.push_back(ASTDesignator(InitExpressions.size(),
2780*67e74705SXin Li                                             D.getLBracketLoc(),
2781*67e74705SXin Li                                             D.getRBracketLoc()));
2782*67e74705SXin Li         InitExpressions.push_back(Index);
2783*67e74705SXin Li       }
2784*67e74705SXin Li       break;
2785*67e74705SXin Li     }
2786*67e74705SXin Li 
2787*67e74705SXin Li     case Designator::ArrayRangeDesignator: {
2788*67e74705SXin Li       Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart());
2789*67e74705SXin Li       Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd());
2790*67e74705SXin Li       llvm::APSInt StartValue;
2791*67e74705SXin Li       llvm::APSInt EndValue;
2792*67e74705SXin Li       bool StartDependent = StartIndex->isTypeDependent() ||
2793*67e74705SXin Li                             StartIndex->isValueDependent();
2794*67e74705SXin Li       bool EndDependent = EndIndex->isTypeDependent() ||
2795*67e74705SXin Li                           EndIndex->isValueDependent();
2796*67e74705SXin Li       if (!StartDependent)
2797*67e74705SXin Li         StartIndex =
2798*67e74705SXin Li             CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get();
2799*67e74705SXin Li       if (!EndDependent)
2800*67e74705SXin Li         EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get();
2801*67e74705SXin Li 
2802*67e74705SXin Li       if (!StartIndex || !EndIndex)
2803*67e74705SXin Li         Invalid = true;
2804*67e74705SXin Li       else {
2805*67e74705SXin Li         // Make sure we're comparing values with the same bit width.
2806*67e74705SXin Li         if (StartDependent || EndDependent) {
2807*67e74705SXin Li           // Nothing to compute.
2808*67e74705SXin Li         } else if (StartValue.getBitWidth() > EndValue.getBitWidth())
2809*67e74705SXin Li           EndValue = EndValue.extend(StartValue.getBitWidth());
2810*67e74705SXin Li         else if (StartValue.getBitWidth() < EndValue.getBitWidth())
2811*67e74705SXin Li           StartValue = StartValue.extend(EndValue.getBitWidth());
2812*67e74705SXin Li 
2813*67e74705SXin Li         if (!StartDependent && !EndDependent && EndValue < StartValue) {
2814*67e74705SXin Li           Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range)
2815*67e74705SXin Li             << StartValue.toString(10) << EndValue.toString(10)
2816*67e74705SXin Li             << StartIndex->getSourceRange() << EndIndex->getSourceRange();
2817*67e74705SXin Li           Invalid = true;
2818*67e74705SXin Li         } else {
2819*67e74705SXin Li           Designators.push_back(ASTDesignator(InitExpressions.size(),
2820*67e74705SXin Li                                               D.getLBracketLoc(),
2821*67e74705SXin Li                                               D.getEllipsisLoc(),
2822*67e74705SXin Li                                               D.getRBracketLoc()));
2823*67e74705SXin Li           InitExpressions.push_back(StartIndex);
2824*67e74705SXin Li           InitExpressions.push_back(EndIndex);
2825*67e74705SXin Li         }
2826*67e74705SXin Li       }
2827*67e74705SXin Li       break;
2828*67e74705SXin Li     }
2829*67e74705SXin Li     }
2830*67e74705SXin Li   }
2831*67e74705SXin Li 
2832*67e74705SXin Li   if (Invalid || Init.isInvalid())
2833*67e74705SXin Li     return ExprError();
2834*67e74705SXin Li 
2835*67e74705SXin Li   // Clear out the expressions within the designation.
2836*67e74705SXin Li   Desig.ClearExprs(*this);
2837*67e74705SXin Li 
2838*67e74705SXin Li   DesignatedInitExpr *DIE
2839*67e74705SXin Li     = DesignatedInitExpr::Create(Context,
2840*67e74705SXin Li                                  Designators,
2841*67e74705SXin Li                                  InitExpressions, Loc, GNUSyntax,
2842*67e74705SXin Li                                  Init.getAs<Expr>());
2843*67e74705SXin Li 
2844*67e74705SXin Li   if (!getLangOpts().C99)
2845*67e74705SXin Li     Diag(DIE->getLocStart(), diag::ext_designated_init)
2846*67e74705SXin Li       << DIE->getSourceRange();
2847*67e74705SXin Li 
2848*67e74705SXin Li   return DIE;
2849*67e74705SXin Li }
2850*67e74705SXin Li 
2851*67e74705SXin Li //===----------------------------------------------------------------------===//
2852*67e74705SXin Li // Initialization entity
2853*67e74705SXin Li //===----------------------------------------------------------------------===//
2854*67e74705SXin Li 
InitializedEntity(ASTContext & Context,unsigned Index,const InitializedEntity & Parent)2855*67e74705SXin Li InitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index,
2856*67e74705SXin Li                                      const InitializedEntity &Parent)
2857*67e74705SXin Li   : Parent(&Parent), Index(Index)
2858*67e74705SXin Li {
2859*67e74705SXin Li   if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) {
2860*67e74705SXin Li     Kind = EK_ArrayElement;
2861*67e74705SXin Li     Type = AT->getElementType();
2862*67e74705SXin Li   } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) {
2863*67e74705SXin Li     Kind = EK_VectorElement;
2864*67e74705SXin Li     Type = VT->getElementType();
2865*67e74705SXin Li   } else {
2866*67e74705SXin Li     const ComplexType *CT = Parent.getType()->getAs<ComplexType>();
2867*67e74705SXin Li     assert(CT && "Unexpected type");
2868*67e74705SXin Li     Kind = EK_ComplexElement;
2869*67e74705SXin Li     Type = CT->getElementType();
2870*67e74705SXin Li   }
2871*67e74705SXin Li }
2872*67e74705SXin Li 
2873*67e74705SXin Li InitializedEntity
InitializeBase(ASTContext & Context,const CXXBaseSpecifier * Base,bool IsInheritedVirtualBase,const InitializedEntity * Parent)2874*67e74705SXin Li InitializedEntity::InitializeBase(ASTContext &Context,
2875*67e74705SXin Li                                   const CXXBaseSpecifier *Base,
2876*67e74705SXin Li                                   bool IsInheritedVirtualBase,
2877*67e74705SXin Li                                   const InitializedEntity *Parent) {
2878*67e74705SXin Li   InitializedEntity Result;
2879*67e74705SXin Li   Result.Kind = EK_Base;
2880*67e74705SXin Li   Result.Parent = Parent;
2881*67e74705SXin Li   Result.Base = reinterpret_cast<uintptr_t>(Base);
2882*67e74705SXin Li   if (IsInheritedVirtualBase)
2883*67e74705SXin Li     Result.Base |= 0x01;
2884*67e74705SXin Li 
2885*67e74705SXin Li   Result.Type = Base->getType();
2886*67e74705SXin Li   return Result;
2887*67e74705SXin Li }
2888*67e74705SXin Li 
getName() const2889*67e74705SXin Li DeclarationName InitializedEntity::getName() const {
2890*67e74705SXin Li   switch (getKind()) {
2891*67e74705SXin Li   case EK_Parameter:
2892*67e74705SXin Li   case EK_Parameter_CF_Audited: {
2893*67e74705SXin Li     ParmVarDecl *D = reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1);
2894*67e74705SXin Li     return (D ? D->getDeclName() : DeclarationName());
2895*67e74705SXin Li   }
2896*67e74705SXin Li 
2897*67e74705SXin Li   case EK_Variable:
2898*67e74705SXin Li   case EK_Member:
2899*67e74705SXin Li     return VariableOrMember->getDeclName();
2900*67e74705SXin Li 
2901*67e74705SXin Li   case EK_LambdaCapture:
2902*67e74705SXin Li     return DeclarationName(Capture.VarID);
2903*67e74705SXin Li 
2904*67e74705SXin Li   case EK_Result:
2905*67e74705SXin Li   case EK_Exception:
2906*67e74705SXin Li   case EK_New:
2907*67e74705SXin Li   case EK_Temporary:
2908*67e74705SXin Li   case EK_Base:
2909*67e74705SXin Li   case EK_Delegating:
2910*67e74705SXin Li   case EK_ArrayElement:
2911*67e74705SXin Li   case EK_VectorElement:
2912*67e74705SXin Li   case EK_ComplexElement:
2913*67e74705SXin Li   case EK_BlockElement:
2914*67e74705SXin Li   case EK_CompoundLiteralInit:
2915*67e74705SXin Li   case EK_RelatedResult:
2916*67e74705SXin Li     return DeclarationName();
2917*67e74705SXin Li   }
2918*67e74705SXin Li 
2919*67e74705SXin Li   llvm_unreachable("Invalid EntityKind!");
2920*67e74705SXin Li }
2921*67e74705SXin Li 
getDecl() const2922*67e74705SXin Li DeclaratorDecl *InitializedEntity::getDecl() const {
2923*67e74705SXin Li   switch (getKind()) {
2924*67e74705SXin Li   case EK_Variable:
2925*67e74705SXin Li   case EK_Member:
2926*67e74705SXin Li     return VariableOrMember;
2927*67e74705SXin Li 
2928*67e74705SXin Li   case EK_Parameter:
2929*67e74705SXin Li   case EK_Parameter_CF_Audited:
2930*67e74705SXin Li     return reinterpret_cast<ParmVarDecl*>(Parameter & ~0x1);
2931*67e74705SXin Li 
2932*67e74705SXin Li   case EK_Result:
2933*67e74705SXin Li   case EK_Exception:
2934*67e74705SXin Li   case EK_New:
2935*67e74705SXin Li   case EK_Temporary:
2936*67e74705SXin Li   case EK_Base:
2937*67e74705SXin Li   case EK_Delegating:
2938*67e74705SXin Li   case EK_ArrayElement:
2939*67e74705SXin Li   case EK_VectorElement:
2940*67e74705SXin Li   case EK_ComplexElement:
2941*67e74705SXin Li   case EK_BlockElement:
2942*67e74705SXin Li   case EK_LambdaCapture:
2943*67e74705SXin Li   case EK_CompoundLiteralInit:
2944*67e74705SXin Li   case EK_RelatedResult:
2945*67e74705SXin Li     return nullptr;
2946*67e74705SXin Li   }
2947*67e74705SXin Li 
2948*67e74705SXin Li   llvm_unreachable("Invalid EntityKind!");
2949*67e74705SXin Li }
2950*67e74705SXin Li 
allowsNRVO() const2951*67e74705SXin Li bool InitializedEntity::allowsNRVO() const {
2952*67e74705SXin Li   switch (getKind()) {
2953*67e74705SXin Li   case EK_Result:
2954*67e74705SXin Li   case EK_Exception:
2955*67e74705SXin Li     return LocAndNRVO.NRVO;
2956*67e74705SXin Li 
2957*67e74705SXin Li   case EK_Variable:
2958*67e74705SXin Li   case EK_Parameter:
2959*67e74705SXin Li   case EK_Parameter_CF_Audited:
2960*67e74705SXin Li   case EK_Member:
2961*67e74705SXin Li   case EK_New:
2962*67e74705SXin Li   case EK_Temporary:
2963*67e74705SXin Li   case EK_CompoundLiteralInit:
2964*67e74705SXin Li   case EK_Base:
2965*67e74705SXin Li   case EK_Delegating:
2966*67e74705SXin Li   case EK_ArrayElement:
2967*67e74705SXin Li   case EK_VectorElement:
2968*67e74705SXin Li   case EK_ComplexElement:
2969*67e74705SXin Li   case EK_BlockElement:
2970*67e74705SXin Li   case EK_LambdaCapture:
2971*67e74705SXin Li   case EK_RelatedResult:
2972*67e74705SXin Li     break;
2973*67e74705SXin Li   }
2974*67e74705SXin Li 
2975*67e74705SXin Li   return false;
2976*67e74705SXin Li }
2977*67e74705SXin Li 
dumpImpl(raw_ostream & OS) const2978*67e74705SXin Li unsigned InitializedEntity::dumpImpl(raw_ostream &OS) const {
2979*67e74705SXin Li   assert(getParent() != this);
2980*67e74705SXin Li   unsigned Depth = getParent() ? getParent()->dumpImpl(OS) : 0;
2981*67e74705SXin Li   for (unsigned I = 0; I != Depth; ++I)
2982*67e74705SXin Li     OS << "`-";
2983*67e74705SXin Li 
2984*67e74705SXin Li   switch (getKind()) {
2985*67e74705SXin Li   case EK_Variable: OS << "Variable"; break;
2986*67e74705SXin Li   case EK_Parameter: OS << "Parameter"; break;
2987*67e74705SXin Li   case EK_Parameter_CF_Audited: OS << "CF audited function Parameter";
2988*67e74705SXin Li     break;
2989*67e74705SXin Li   case EK_Result: OS << "Result"; break;
2990*67e74705SXin Li   case EK_Exception: OS << "Exception"; break;
2991*67e74705SXin Li   case EK_Member: OS << "Member"; break;
2992*67e74705SXin Li   case EK_New: OS << "New"; break;
2993*67e74705SXin Li   case EK_Temporary: OS << "Temporary"; break;
2994*67e74705SXin Li   case EK_CompoundLiteralInit: OS << "CompoundLiteral";break;
2995*67e74705SXin Li   case EK_RelatedResult: OS << "RelatedResult"; break;
2996*67e74705SXin Li   case EK_Base: OS << "Base"; break;
2997*67e74705SXin Li   case EK_Delegating: OS << "Delegating"; break;
2998*67e74705SXin Li   case EK_ArrayElement: OS << "ArrayElement " << Index; break;
2999*67e74705SXin Li   case EK_VectorElement: OS << "VectorElement " << Index; break;
3000*67e74705SXin Li   case EK_ComplexElement: OS << "ComplexElement " << Index; break;
3001*67e74705SXin Li   case EK_BlockElement: OS << "Block"; break;
3002*67e74705SXin Li   case EK_LambdaCapture:
3003*67e74705SXin Li     OS << "LambdaCapture ";
3004*67e74705SXin Li     OS << DeclarationName(Capture.VarID);
3005*67e74705SXin Li     break;
3006*67e74705SXin Li   }
3007*67e74705SXin Li 
3008*67e74705SXin Li   if (Decl *D = getDecl()) {
3009*67e74705SXin Li     OS << " ";
3010*67e74705SXin Li     cast<NamedDecl>(D)->printQualifiedName(OS);
3011*67e74705SXin Li   }
3012*67e74705SXin Li 
3013*67e74705SXin Li   OS << " '" << getType().getAsString() << "'\n";
3014*67e74705SXin Li 
3015*67e74705SXin Li   return Depth + 1;
3016*67e74705SXin Li }
3017*67e74705SXin Li 
dump() const3018*67e74705SXin Li LLVM_DUMP_METHOD void InitializedEntity::dump() const {
3019*67e74705SXin Li   dumpImpl(llvm::errs());
3020*67e74705SXin Li }
3021*67e74705SXin Li 
3022*67e74705SXin Li //===----------------------------------------------------------------------===//
3023*67e74705SXin Li // Initialization sequence
3024*67e74705SXin Li //===----------------------------------------------------------------------===//
3025*67e74705SXin Li 
Destroy()3026*67e74705SXin Li void InitializationSequence::Step::Destroy() {
3027*67e74705SXin Li   switch (Kind) {
3028*67e74705SXin Li   case SK_ResolveAddressOfOverloadedFunction:
3029*67e74705SXin Li   case SK_CastDerivedToBaseRValue:
3030*67e74705SXin Li   case SK_CastDerivedToBaseXValue:
3031*67e74705SXin Li   case SK_CastDerivedToBaseLValue:
3032*67e74705SXin Li   case SK_BindReference:
3033*67e74705SXin Li   case SK_BindReferenceToTemporary:
3034*67e74705SXin Li   case SK_ExtraneousCopyToTemporary:
3035*67e74705SXin Li   case SK_UserConversion:
3036*67e74705SXin Li   case SK_QualificationConversionRValue:
3037*67e74705SXin Li   case SK_QualificationConversionXValue:
3038*67e74705SXin Li   case SK_QualificationConversionLValue:
3039*67e74705SXin Li   case SK_AtomicConversion:
3040*67e74705SXin Li   case SK_LValueToRValue:
3041*67e74705SXin Li   case SK_ListInitialization:
3042*67e74705SXin Li   case SK_UnwrapInitList:
3043*67e74705SXin Li   case SK_RewrapInitList:
3044*67e74705SXin Li   case SK_ConstructorInitialization:
3045*67e74705SXin Li   case SK_ConstructorInitializationFromList:
3046*67e74705SXin Li   case SK_ZeroInitialization:
3047*67e74705SXin Li   case SK_CAssignment:
3048*67e74705SXin Li   case SK_StringInit:
3049*67e74705SXin Li   case SK_ObjCObjectConversion:
3050*67e74705SXin Li   case SK_ArrayInit:
3051*67e74705SXin Li   case SK_ParenthesizedArrayInit:
3052*67e74705SXin Li   case SK_PassByIndirectCopyRestore:
3053*67e74705SXin Li   case SK_PassByIndirectRestore:
3054*67e74705SXin Li   case SK_ProduceObjCObject:
3055*67e74705SXin Li   case SK_StdInitializerList:
3056*67e74705SXin Li   case SK_StdInitializerListConstructorCall:
3057*67e74705SXin Li   case SK_OCLSamplerInit:
3058*67e74705SXin Li   case SK_OCLZeroEvent:
3059*67e74705SXin Li     break;
3060*67e74705SXin Li 
3061*67e74705SXin Li   case SK_ConversionSequence:
3062*67e74705SXin Li   case SK_ConversionSequenceNoNarrowing:
3063*67e74705SXin Li     delete ICS;
3064*67e74705SXin Li   }
3065*67e74705SXin Li }
3066*67e74705SXin Li 
isDirectReferenceBinding() const3067*67e74705SXin Li bool InitializationSequence::isDirectReferenceBinding() const {
3068*67e74705SXin Li   return !Steps.empty() && Steps.back().Kind == SK_BindReference;
3069*67e74705SXin Li }
3070*67e74705SXin Li 
isAmbiguous() const3071*67e74705SXin Li bool InitializationSequence::isAmbiguous() const {
3072*67e74705SXin Li   if (!Failed())
3073*67e74705SXin Li     return false;
3074*67e74705SXin Li 
3075*67e74705SXin Li   switch (getFailureKind()) {
3076*67e74705SXin Li   case FK_TooManyInitsForReference:
3077*67e74705SXin Li   case FK_ArrayNeedsInitList:
3078*67e74705SXin Li   case FK_ArrayNeedsInitListOrStringLiteral:
3079*67e74705SXin Li   case FK_ArrayNeedsInitListOrWideStringLiteral:
3080*67e74705SXin Li   case FK_NarrowStringIntoWideCharArray:
3081*67e74705SXin Li   case FK_WideStringIntoCharArray:
3082*67e74705SXin Li   case FK_IncompatWideStringIntoWideChar:
3083*67e74705SXin Li   case FK_AddressOfOverloadFailed: // FIXME: Could do better
3084*67e74705SXin Li   case FK_NonConstLValueReferenceBindingToTemporary:
3085*67e74705SXin Li   case FK_NonConstLValueReferenceBindingToUnrelated:
3086*67e74705SXin Li   case FK_RValueReferenceBindingToLValue:
3087*67e74705SXin Li   case FK_ReferenceInitDropsQualifiers:
3088*67e74705SXin Li   case FK_ReferenceInitFailed:
3089*67e74705SXin Li   case FK_ConversionFailed:
3090*67e74705SXin Li   case FK_ConversionFromPropertyFailed:
3091*67e74705SXin Li   case FK_TooManyInitsForScalar:
3092*67e74705SXin Li   case FK_ReferenceBindingToInitList:
3093*67e74705SXin Li   case FK_InitListBadDestinationType:
3094*67e74705SXin Li   case FK_DefaultInitOfConst:
3095*67e74705SXin Li   case FK_Incomplete:
3096*67e74705SXin Li   case FK_ArrayTypeMismatch:
3097*67e74705SXin Li   case FK_NonConstantArrayInit:
3098*67e74705SXin Li   case FK_ListInitializationFailed:
3099*67e74705SXin Li   case FK_VariableLengthArrayHasInitializer:
3100*67e74705SXin Li   case FK_PlaceholderType:
3101*67e74705SXin Li   case FK_ExplicitConstructor:
3102*67e74705SXin Li   case FK_AddressOfUnaddressableFunction:
3103*67e74705SXin Li     return false;
3104*67e74705SXin Li 
3105*67e74705SXin Li   case FK_ReferenceInitOverloadFailed:
3106*67e74705SXin Li   case FK_UserConversionOverloadFailed:
3107*67e74705SXin Li   case FK_ConstructorOverloadFailed:
3108*67e74705SXin Li   case FK_ListConstructorOverloadFailed:
3109*67e74705SXin Li     return FailedOverloadResult == OR_Ambiguous;
3110*67e74705SXin Li   }
3111*67e74705SXin Li 
3112*67e74705SXin Li   llvm_unreachable("Invalid EntityKind!");
3113*67e74705SXin Li }
3114*67e74705SXin Li 
isConstructorInitialization() const3115*67e74705SXin Li bool InitializationSequence::isConstructorInitialization() const {
3116*67e74705SXin Li   return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization;
3117*67e74705SXin Li }
3118*67e74705SXin Li 
3119*67e74705SXin Li void
3120*67e74705SXin Li InitializationSequence
AddAddressOverloadResolutionStep(FunctionDecl * Function,DeclAccessPair Found,bool HadMultipleCandidates)3121*67e74705SXin Li ::AddAddressOverloadResolutionStep(FunctionDecl *Function,
3122*67e74705SXin Li                                    DeclAccessPair Found,
3123*67e74705SXin Li                                    bool HadMultipleCandidates) {
3124*67e74705SXin Li   Step S;
3125*67e74705SXin Li   S.Kind = SK_ResolveAddressOfOverloadedFunction;
3126*67e74705SXin Li   S.Type = Function->getType();
3127*67e74705SXin Li   S.Function.HadMultipleCandidates = HadMultipleCandidates;
3128*67e74705SXin Li   S.Function.Function = Function;
3129*67e74705SXin Li   S.Function.FoundDecl = Found;
3130*67e74705SXin Li   Steps.push_back(S);
3131*67e74705SXin Li }
3132*67e74705SXin Li 
AddDerivedToBaseCastStep(QualType BaseType,ExprValueKind VK)3133*67e74705SXin Li void InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType,
3134*67e74705SXin Li                                                       ExprValueKind VK) {
3135*67e74705SXin Li   Step S;
3136*67e74705SXin Li   switch (VK) {
3137*67e74705SXin Li   case VK_RValue: S.Kind = SK_CastDerivedToBaseRValue; break;
3138*67e74705SXin Li   case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break;
3139*67e74705SXin Li   case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break;
3140*67e74705SXin Li   }
3141*67e74705SXin Li   S.Type = BaseType;
3142*67e74705SXin Li   Steps.push_back(S);
3143*67e74705SXin Li }
3144*67e74705SXin Li 
AddReferenceBindingStep(QualType T,bool BindingTemporary)3145*67e74705SXin Li void InitializationSequence::AddReferenceBindingStep(QualType T,
3146*67e74705SXin Li                                                      bool BindingTemporary) {
3147*67e74705SXin Li   Step S;
3148*67e74705SXin Li   S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference;
3149*67e74705SXin Li   S.Type = T;
3150*67e74705SXin Li   Steps.push_back(S);
3151*67e74705SXin Li }
3152*67e74705SXin Li 
AddExtraneousCopyToTemporary(QualType T)3153*67e74705SXin Li void InitializationSequence::AddExtraneousCopyToTemporary(QualType T) {
3154*67e74705SXin Li   Step S;
3155*67e74705SXin Li   S.Kind = SK_ExtraneousCopyToTemporary;
3156*67e74705SXin Li   S.Type = T;
3157*67e74705SXin Li   Steps.push_back(S);
3158*67e74705SXin Li }
3159*67e74705SXin Li 
3160*67e74705SXin Li void
AddUserConversionStep(FunctionDecl * Function,DeclAccessPair FoundDecl,QualType T,bool HadMultipleCandidates)3161*67e74705SXin Li InitializationSequence::AddUserConversionStep(FunctionDecl *Function,
3162*67e74705SXin Li                                               DeclAccessPair FoundDecl,
3163*67e74705SXin Li                                               QualType T,
3164*67e74705SXin Li                                               bool HadMultipleCandidates) {
3165*67e74705SXin Li   Step S;
3166*67e74705SXin Li   S.Kind = SK_UserConversion;
3167*67e74705SXin Li   S.Type = T;
3168*67e74705SXin Li   S.Function.HadMultipleCandidates = HadMultipleCandidates;
3169*67e74705SXin Li   S.Function.Function = Function;
3170*67e74705SXin Li   S.Function.FoundDecl = FoundDecl;
3171*67e74705SXin Li   Steps.push_back(S);
3172*67e74705SXin Li }
3173*67e74705SXin Li 
AddQualificationConversionStep(QualType Ty,ExprValueKind VK)3174*67e74705SXin Li void InitializationSequence::AddQualificationConversionStep(QualType Ty,
3175*67e74705SXin Li                                                             ExprValueKind VK) {
3176*67e74705SXin Li   Step S;
3177*67e74705SXin Li   S.Kind = SK_QualificationConversionRValue; // work around a gcc warning
3178*67e74705SXin Li   switch (VK) {
3179*67e74705SXin Li   case VK_RValue:
3180*67e74705SXin Li     S.Kind = SK_QualificationConversionRValue;
3181*67e74705SXin Li     break;
3182*67e74705SXin Li   case VK_XValue:
3183*67e74705SXin Li     S.Kind = SK_QualificationConversionXValue;
3184*67e74705SXin Li     break;
3185*67e74705SXin Li   case VK_LValue:
3186*67e74705SXin Li     S.Kind = SK_QualificationConversionLValue;
3187*67e74705SXin Li     break;
3188*67e74705SXin Li   }
3189*67e74705SXin Li   S.Type = Ty;
3190*67e74705SXin Li   Steps.push_back(S);
3191*67e74705SXin Li }
3192*67e74705SXin Li 
AddAtomicConversionStep(QualType Ty)3193*67e74705SXin Li void InitializationSequence::AddAtomicConversionStep(QualType Ty) {
3194*67e74705SXin Li   Step S;
3195*67e74705SXin Li   S.Kind = SK_AtomicConversion;
3196*67e74705SXin Li   S.Type = Ty;
3197*67e74705SXin Li   Steps.push_back(S);
3198*67e74705SXin Li }
3199*67e74705SXin Li 
AddLValueToRValueStep(QualType Ty)3200*67e74705SXin Li void InitializationSequence::AddLValueToRValueStep(QualType Ty) {
3201*67e74705SXin Li   assert(!Ty.hasQualifiers() && "rvalues may not have qualifiers");
3202*67e74705SXin Li 
3203*67e74705SXin Li   Step S;
3204*67e74705SXin Li   S.Kind = SK_LValueToRValue;
3205*67e74705SXin Li   S.Type = Ty;
3206*67e74705SXin Li   Steps.push_back(S);
3207*67e74705SXin Li }
3208*67e74705SXin Li 
AddConversionSequenceStep(const ImplicitConversionSequence & ICS,QualType T,bool TopLevelOfInitList)3209*67e74705SXin Li void InitializationSequence::AddConversionSequenceStep(
3210*67e74705SXin Li     const ImplicitConversionSequence &ICS, QualType T,
3211*67e74705SXin Li     bool TopLevelOfInitList) {
3212*67e74705SXin Li   Step S;
3213*67e74705SXin Li   S.Kind = TopLevelOfInitList ? SK_ConversionSequenceNoNarrowing
3214*67e74705SXin Li                               : SK_ConversionSequence;
3215*67e74705SXin Li   S.Type = T;
3216*67e74705SXin Li   S.ICS = new ImplicitConversionSequence(ICS);
3217*67e74705SXin Li   Steps.push_back(S);
3218*67e74705SXin Li }
3219*67e74705SXin Li 
AddListInitializationStep(QualType T)3220*67e74705SXin Li void InitializationSequence::AddListInitializationStep(QualType T) {
3221*67e74705SXin Li   Step S;
3222*67e74705SXin Li   S.Kind = SK_ListInitialization;
3223*67e74705SXin Li   S.Type = T;
3224*67e74705SXin Li   Steps.push_back(S);
3225*67e74705SXin Li }
3226*67e74705SXin Li 
AddConstructorInitializationStep(DeclAccessPair FoundDecl,CXXConstructorDecl * Constructor,QualType T,bool HadMultipleCandidates,bool FromInitList,bool AsInitList)3227*67e74705SXin Li void InitializationSequence::AddConstructorInitializationStep(
3228*67e74705SXin Li     DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T,
3229*67e74705SXin Li     bool HadMultipleCandidates, bool FromInitList, bool AsInitList) {
3230*67e74705SXin Li   Step S;
3231*67e74705SXin Li   S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall
3232*67e74705SXin Li                                      : SK_ConstructorInitializationFromList
3233*67e74705SXin Li                         : SK_ConstructorInitialization;
3234*67e74705SXin Li   S.Type = T;
3235*67e74705SXin Li   S.Function.HadMultipleCandidates = HadMultipleCandidates;
3236*67e74705SXin Li   S.Function.Function = Constructor;
3237*67e74705SXin Li   S.Function.FoundDecl = FoundDecl;
3238*67e74705SXin Li   Steps.push_back(S);
3239*67e74705SXin Li }
3240*67e74705SXin Li 
AddZeroInitializationStep(QualType T)3241*67e74705SXin Li void InitializationSequence::AddZeroInitializationStep(QualType T) {
3242*67e74705SXin Li   Step S;
3243*67e74705SXin Li   S.Kind = SK_ZeroInitialization;
3244*67e74705SXin Li   S.Type = T;
3245*67e74705SXin Li   Steps.push_back(S);
3246*67e74705SXin Li }
3247*67e74705SXin Li 
AddCAssignmentStep(QualType T)3248*67e74705SXin Li void InitializationSequence::AddCAssignmentStep(QualType T) {
3249*67e74705SXin Li   Step S;
3250*67e74705SXin Li   S.Kind = SK_CAssignment;
3251*67e74705SXin Li   S.Type = T;
3252*67e74705SXin Li   Steps.push_back(S);
3253*67e74705SXin Li }
3254*67e74705SXin Li 
AddStringInitStep(QualType T)3255*67e74705SXin Li void InitializationSequence::AddStringInitStep(QualType T) {
3256*67e74705SXin Li   Step S;
3257*67e74705SXin Li   S.Kind = SK_StringInit;
3258*67e74705SXin Li   S.Type = T;
3259*67e74705SXin Li   Steps.push_back(S);
3260*67e74705SXin Li }
3261*67e74705SXin Li 
AddObjCObjectConversionStep(QualType T)3262*67e74705SXin Li void InitializationSequence::AddObjCObjectConversionStep(QualType T) {
3263*67e74705SXin Li   Step S;
3264*67e74705SXin Li   S.Kind = SK_ObjCObjectConversion;
3265*67e74705SXin Li   S.Type = T;
3266*67e74705SXin Li   Steps.push_back(S);
3267*67e74705SXin Li }
3268*67e74705SXin Li 
AddArrayInitStep(QualType T)3269*67e74705SXin Li void InitializationSequence::AddArrayInitStep(QualType T) {
3270*67e74705SXin Li   Step S;
3271*67e74705SXin Li   S.Kind = SK_ArrayInit;
3272*67e74705SXin Li   S.Type = T;
3273*67e74705SXin Li   Steps.push_back(S);
3274*67e74705SXin Li }
3275*67e74705SXin Li 
AddParenthesizedArrayInitStep(QualType T)3276*67e74705SXin Li void InitializationSequence::AddParenthesizedArrayInitStep(QualType T) {
3277*67e74705SXin Li   Step S;
3278*67e74705SXin Li   S.Kind = SK_ParenthesizedArrayInit;
3279*67e74705SXin Li   S.Type = T;
3280*67e74705SXin Li   Steps.push_back(S);
3281*67e74705SXin Li }
3282*67e74705SXin Li 
AddPassByIndirectCopyRestoreStep(QualType type,bool shouldCopy)3283*67e74705SXin Li void InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type,
3284*67e74705SXin Li                                                               bool shouldCopy) {
3285*67e74705SXin Li   Step s;
3286*67e74705SXin Li   s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore
3287*67e74705SXin Li                        : SK_PassByIndirectRestore);
3288*67e74705SXin Li   s.Type = type;
3289*67e74705SXin Li   Steps.push_back(s);
3290*67e74705SXin Li }
3291*67e74705SXin Li 
AddProduceObjCObjectStep(QualType T)3292*67e74705SXin Li void InitializationSequence::AddProduceObjCObjectStep(QualType T) {
3293*67e74705SXin Li   Step S;
3294*67e74705SXin Li   S.Kind = SK_ProduceObjCObject;
3295*67e74705SXin Li   S.Type = T;
3296*67e74705SXin Li   Steps.push_back(S);
3297*67e74705SXin Li }
3298*67e74705SXin Li 
AddStdInitializerListConstructionStep(QualType T)3299*67e74705SXin Li void InitializationSequence::AddStdInitializerListConstructionStep(QualType T) {
3300*67e74705SXin Li   Step S;
3301*67e74705SXin Li   S.Kind = SK_StdInitializerList;
3302*67e74705SXin Li   S.Type = T;
3303*67e74705SXin Li   Steps.push_back(S);
3304*67e74705SXin Li }
3305*67e74705SXin Li 
AddOCLSamplerInitStep(QualType T)3306*67e74705SXin Li void InitializationSequence::AddOCLSamplerInitStep(QualType T) {
3307*67e74705SXin Li   Step S;
3308*67e74705SXin Li   S.Kind = SK_OCLSamplerInit;
3309*67e74705SXin Li   S.Type = T;
3310*67e74705SXin Li   Steps.push_back(S);
3311*67e74705SXin Li }
3312*67e74705SXin Li 
AddOCLZeroEventStep(QualType T)3313*67e74705SXin Li void InitializationSequence::AddOCLZeroEventStep(QualType T) {
3314*67e74705SXin Li   Step S;
3315*67e74705SXin Li   S.Kind = SK_OCLZeroEvent;
3316*67e74705SXin Li   S.Type = T;
3317*67e74705SXin Li   Steps.push_back(S);
3318*67e74705SXin Li }
3319*67e74705SXin Li 
RewrapReferenceInitList(QualType T,InitListExpr * Syntactic)3320*67e74705SXin Li void InitializationSequence::RewrapReferenceInitList(QualType T,
3321*67e74705SXin Li                                                      InitListExpr *Syntactic) {
3322*67e74705SXin Li   assert(Syntactic->getNumInits() == 1 &&
3323*67e74705SXin Li          "Can only rewrap trivial init lists.");
3324*67e74705SXin Li   Step S;
3325*67e74705SXin Li   S.Kind = SK_UnwrapInitList;
3326*67e74705SXin Li   S.Type = Syntactic->getInit(0)->getType();
3327*67e74705SXin Li   Steps.insert(Steps.begin(), S);
3328*67e74705SXin Li 
3329*67e74705SXin Li   S.Kind = SK_RewrapInitList;
3330*67e74705SXin Li   S.Type = T;
3331*67e74705SXin Li   S.WrappingSyntacticList = Syntactic;
3332*67e74705SXin Li   Steps.push_back(S);
3333*67e74705SXin Li }
3334*67e74705SXin Li 
SetOverloadFailure(FailureKind Failure,OverloadingResult Result)3335*67e74705SXin Li void InitializationSequence::SetOverloadFailure(FailureKind Failure,
3336*67e74705SXin Li                                                 OverloadingResult Result) {
3337*67e74705SXin Li   setSequenceKind(FailedSequence);
3338*67e74705SXin Li   this->Failure = Failure;
3339*67e74705SXin Li   this->FailedOverloadResult = Result;
3340*67e74705SXin Li }
3341*67e74705SXin Li 
3342*67e74705SXin Li //===----------------------------------------------------------------------===//
3343*67e74705SXin Li // Attempt initialization
3344*67e74705SXin Li //===----------------------------------------------------------------------===//
3345*67e74705SXin Li 
3346*67e74705SXin Li /// Tries to add a zero initializer. Returns true if that worked.
3347*67e74705SXin Li static bool
maybeRecoverWithZeroInitialization(Sema & S,InitializationSequence & Sequence,const InitializedEntity & Entity)3348*67e74705SXin Li maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence,
3349*67e74705SXin Li                                    const InitializedEntity &Entity) {
3350*67e74705SXin Li   if (Entity.getKind() != InitializedEntity::EK_Variable)
3351*67e74705SXin Li     return false;
3352*67e74705SXin Li 
3353*67e74705SXin Li   VarDecl *VD = cast<VarDecl>(Entity.getDecl());
3354*67e74705SXin Li   if (VD->getInit() || VD->getLocEnd().isMacroID())
3355*67e74705SXin Li     return false;
3356*67e74705SXin Li 
3357*67e74705SXin Li   QualType VariableTy = VD->getType().getCanonicalType();
3358*67e74705SXin Li   SourceLocation Loc = S.getLocForEndOfToken(VD->getLocEnd());
3359*67e74705SXin Li   std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
3360*67e74705SXin Li   if (!Init.empty()) {
3361*67e74705SXin Li     Sequence.AddZeroInitializationStep(Entity.getType());
3362*67e74705SXin Li     Sequence.SetZeroInitializationFixit(Init, Loc);
3363*67e74705SXin Li     return true;
3364*67e74705SXin Li   }
3365*67e74705SXin Li   return false;
3366*67e74705SXin Li }
3367*67e74705SXin Li 
MaybeProduceObjCObject(Sema & S,InitializationSequence & Sequence,const InitializedEntity & Entity)3368*67e74705SXin Li static void MaybeProduceObjCObject(Sema &S,
3369*67e74705SXin Li                                    InitializationSequence &Sequence,
3370*67e74705SXin Li                                    const InitializedEntity &Entity) {
3371*67e74705SXin Li   if (!S.getLangOpts().ObjCAutoRefCount) return;
3372*67e74705SXin Li 
3373*67e74705SXin Li   /// When initializing a parameter, produce the value if it's marked
3374*67e74705SXin Li   /// __attribute__((ns_consumed)).
3375*67e74705SXin Li   if (Entity.isParameterKind()) {
3376*67e74705SXin Li     if (!Entity.isParameterConsumed())
3377*67e74705SXin Li       return;
3378*67e74705SXin Li 
3379*67e74705SXin Li     assert(Entity.getType()->isObjCRetainableType() &&
3380*67e74705SXin Li            "consuming an object of unretainable type?");
3381*67e74705SXin Li     Sequence.AddProduceObjCObjectStep(Entity.getType());
3382*67e74705SXin Li 
3383*67e74705SXin Li   /// When initializing a return value, if the return type is a
3384*67e74705SXin Li   /// retainable type, then returns need to immediately retain the
3385*67e74705SXin Li   /// object.  If an autorelease is required, it will be done at the
3386*67e74705SXin Li   /// last instant.
3387*67e74705SXin Li   } else if (Entity.getKind() == InitializedEntity::EK_Result) {
3388*67e74705SXin Li     if (!Entity.getType()->isObjCRetainableType())
3389*67e74705SXin Li       return;
3390*67e74705SXin Li 
3391*67e74705SXin Li     Sequence.AddProduceObjCObjectStep(Entity.getType());
3392*67e74705SXin Li   }
3393*67e74705SXin Li }
3394*67e74705SXin Li 
3395*67e74705SXin Li static void TryListInitialization(Sema &S,
3396*67e74705SXin Li                                   const InitializedEntity &Entity,
3397*67e74705SXin Li                                   const InitializationKind &Kind,
3398*67e74705SXin Li                                   InitListExpr *InitList,
3399*67e74705SXin Li                                   InitializationSequence &Sequence,
3400*67e74705SXin Li                                   bool TreatUnavailableAsInvalid);
3401*67e74705SXin Li 
3402*67e74705SXin Li /// \brief When initializing from init list via constructor, handle
3403*67e74705SXin Li /// initialization of an object of type std::initializer_list<T>.
3404*67e74705SXin Li ///
3405*67e74705SXin Li /// \return true if we have handled initialization of an object of type
3406*67e74705SXin Li /// std::initializer_list<T>, false otherwise.
TryInitializerListConstruction(Sema & S,InitListExpr * List,QualType DestType,InitializationSequence & Sequence,bool TreatUnavailableAsInvalid)3407*67e74705SXin Li static bool TryInitializerListConstruction(Sema &S,
3408*67e74705SXin Li                                            InitListExpr *List,
3409*67e74705SXin Li                                            QualType DestType,
3410*67e74705SXin Li                                            InitializationSequence &Sequence,
3411*67e74705SXin Li                                            bool TreatUnavailableAsInvalid) {
3412*67e74705SXin Li   QualType E;
3413*67e74705SXin Li   if (!S.isStdInitializerList(DestType, &E))
3414*67e74705SXin Li     return false;
3415*67e74705SXin Li 
3416*67e74705SXin Li   if (!S.isCompleteType(List->getExprLoc(), E)) {
3417*67e74705SXin Li     Sequence.setIncompleteTypeFailure(E);
3418*67e74705SXin Li     return true;
3419*67e74705SXin Li   }
3420*67e74705SXin Li 
3421*67e74705SXin Li   // Try initializing a temporary array from the init list.
3422*67e74705SXin Li   QualType ArrayType = S.Context.getConstantArrayType(
3423*67e74705SXin Li       E.withConst(), llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
3424*67e74705SXin Li                                  List->getNumInits()),
3425*67e74705SXin Li       clang::ArrayType::Normal, 0);
3426*67e74705SXin Li   InitializedEntity HiddenArray =
3427*67e74705SXin Li       InitializedEntity::InitializeTemporary(ArrayType);
3428*67e74705SXin Li   InitializationKind Kind =
3429*67e74705SXin Li       InitializationKind::CreateDirectList(List->getExprLoc());
3430*67e74705SXin Li   TryListInitialization(S, HiddenArray, Kind, List, Sequence,
3431*67e74705SXin Li                         TreatUnavailableAsInvalid);
3432*67e74705SXin Li   if (Sequence)
3433*67e74705SXin Li     Sequence.AddStdInitializerListConstructionStep(DestType);
3434*67e74705SXin Li   return true;
3435*67e74705SXin Li }
3436*67e74705SXin Li 
3437*67e74705SXin Li static OverloadingResult
ResolveConstructorOverload(Sema & S,SourceLocation DeclLoc,MultiExprArg Args,OverloadCandidateSet & CandidateSet,DeclContext::lookup_result Ctors,OverloadCandidateSet::iterator & Best,bool CopyInitializing,bool AllowExplicit,bool OnlyListConstructors,bool IsListInit)3438*67e74705SXin Li ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc,
3439*67e74705SXin Li                            MultiExprArg Args,
3440*67e74705SXin Li                            OverloadCandidateSet &CandidateSet,
3441*67e74705SXin Li                            DeclContext::lookup_result Ctors,
3442*67e74705SXin Li                            OverloadCandidateSet::iterator &Best,
3443*67e74705SXin Li                            bool CopyInitializing, bool AllowExplicit,
3444*67e74705SXin Li                            bool OnlyListConstructors, bool IsListInit) {
3445*67e74705SXin Li   CandidateSet.clear();
3446*67e74705SXin Li 
3447*67e74705SXin Li   for (NamedDecl *D : Ctors) {
3448*67e74705SXin Li     auto Info = getConstructorInfo(D);
3449*67e74705SXin Li     if (!Info.Constructor)
3450*67e74705SXin Li       continue;
3451*67e74705SXin Li 
3452*67e74705SXin Li     bool SuppressUserConversions = false;
3453*67e74705SXin Li 
3454*67e74705SXin Li     if (!Info.ConstructorTmpl) {
3455*67e74705SXin Li       // C++11 [over.best.ics]p4:
3456*67e74705SXin Li       //   ... and the constructor or user-defined conversion function is a
3457*67e74705SXin Li       //   candidate by
3458*67e74705SXin Li       //   - 13.3.1.3, when the argument is the temporary in the second step
3459*67e74705SXin Li       //     of a class copy-initialization, or
3460*67e74705SXin Li       //   - 13.3.1.4, 13.3.1.5, or 13.3.1.6 (in all cases),
3461*67e74705SXin Li       //   user-defined conversion sequences are not considered.
3462*67e74705SXin Li       // FIXME: This breaks backward compatibility, e.g. PR12117. As a
3463*67e74705SXin Li       //        temporary fix, let's re-instate the third bullet above until
3464*67e74705SXin Li       //        there is a resolution in the standard, i.e.,
3465*67e74705SXin Li       //   - 13.3.1.7 when the initializer list has exactly one element that is
3466*67e74705SXin Li       //     itself an initializer list and a conversion to some class X or
3467*67e74705SXin Li       //     reference to (possibly cv-qualified) X is considered for the first
3468*67e74705SXin Li       //     parameter of a constructor of X.
3469*67e74705SXin Li       if ((CopyInitializing ||
3470*67e74705SXin Li            (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
3471*67e74705SXin Li           Info.Constructor->isCopyOrMoveConstructor())
3472*67e74705SXin Li         SuppressUserConversions = true;
3473*67e74705SXin Li     }
3474*67e74705SXin Li 
3475*67e74705SXin Li     if (!Info.Constructor->isInvalidDecl() &&
3476*67e74705SXin Li         (AllowExplicit || !Info.Constructor->isExplicit()) &&
3477*67e74705SXin Li         (!OnlyListConstructors || S.isInitListConstructor(Info.Constructor))) {
3478*67e74705SXin Li       if (Info.ConstructorTmpl)
3479*67e74705SXin Li         S.AddTemplateOverloadCandidate(Info.ConstructorTmpl, Info.FoundDecl,
3480*67e74705SXin Li                                        /*ExplicitArgs*/ nullptr, Args,
3481*67e74705SXin Li                                        CandidateSet, SuppressUserConversions);
3482*67e74705SXin Li       else {
3483*67e74705SXin Li         // C++ [over.match.copy]p1:
3484*67e74705SXin Li         //   - When initializing a temporary to be bound to the first parameter
3485*67e74705SXin Li         //     of a constructor that takes a reference to possibly cv-qualified
3486*67e74705SXin Li         //     T as its first argument, called with a single argument in the
3487*67e74705SXin Li         //     context of direct-initialization, explicit conversion functions
3488*67e74705SXin Li         //     are also considered.
3489*67e74705SXin Li         bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
3490*67e74705SXin Li                                  Args.size() == 1 &&
3491*67e74705SXin Li                                  Info.Constructor->isCopyOrMoveConstructor();
3492*67e74705SXin Li         S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, Args,
3493*67e74705SXin Li                                CandidateSet, SuppressUserConversions,
3494*67e74705SXin Li                                /*PartialOverloading=*/false,
3495*67e74705SXin Li                                /*AllowExplicit=*/AllowExplicitConv);
3496*67e74705SXin Li       }
3497*67e74705SXin Li     }
3498*67e74705SXin Li   }
3499*67e74705SXin Li 
3500*67e74705SXin Li   // Perform overload resolution and return the result.
3501*67e74705SXin Li   return CandidateSet.BestViableFunction(S, DeclLoc, Best);
3502*67e74705SXin Li }
3503*67e74705SXin Li 
3504*67e74705SXin Li /// \brief Attempt initialization by constructor (C++ [dcl.init]), which
3505*67e74705SXin Li /// enumerates the constructors of the initialized entity and performs overload
3506*67e74705SXin Li /// resolution to select the best.
3507*67e74705SXin Li /// \param IsListInit     Is this list-initialization?
3508*67e74705SXin Li /// \param IsInitListCopy Is this non-list-initialization resulting from a
3509*67e74705SXin Li ///                       list-initialization from {x} where x is the same
3510*67e74705SXin Li ///                       type as the entity?
TryConstructorInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,QualType DestType,InitializationSequence & Sequence,bool IsListInit=false,bool IsInitListCopy=false)3511*67e74705SXin Li static void TryConstructorInitialization(Sema &S,
3512*67e74705SXin Li                                          const InitializedEntity &Entity,
3513*67e74705SXin Li                                          const InitializationKind &Kind,
3514*67e74705SXin Li                                          MultiExprArg Args, QualType DestType,
3515*67e74705SXin Li                                          InitializationSequence &Sequence,
3516*67e74705SXin Li                                          bool IsListInit = false,
3517*67e74705SXin Li                                          bool IsInitListCopy = false) {
3518*67e74705SXin Li   assert((!IsListInit || (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
3519*67e74705SXin Li          "IsListInit must come with a single initializer list argument.");
3520*67e74705SXin Li 
3521*67e74705SXin Li   // The type we're constructing needs to be complete.
3522*67e74705SXin Li   if (!S.isCompleteType(Kind.getLocation(), DestType)) {
3523*67e74705SXin Li     Sequence.setIncompleteTypeFailure(DestType);
3524*67e74705SXin Li     return;
3525*67e74705SXin Li   }
3526*67e74705SXin Li 
3527*67e74705SXin Li   const RecordType *DestRecordType = DestType->getAs<RecordType>();
3528*67e74705SXin Li   assert(DestRecordType && "Constructor initialization requires record type");
3529*67e74705SXin Li   CXXRecordDecl *DestRecordDecl
3530*67e74705SXin Li     = cast<CXXRecordDecl>(DestRecordType->getDecl());
3531*67e74705SXin Li 
3532*67e74705SXin Li   // Build the candidate set directly in the initialization sequence
3533*67e74705SXin Li   // structure, so that it will persist if we fail.
3534*67e74705SXin Li   OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
3535*67e74705SXin Li 
3536*67e74705SXin Li   // Determine whether we are allowed to call explicit constructors or
3537*67e74705SXin Li   // explicit conversion operators.
3538*67e74705SXin Li   bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
3539*67e74705SXin Li   bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy;
3540*67e74705SXin Li 
3541*67e74705SXin Li   //   - Otherwise, if T is a class type, constructors are considered. The
3542*67e74705SXin Li   //     applicable constructors are enumerated, and the best one is chosen
3543*67e74705SXin Li   //     through overload resolution.
3544*67e74705SXin Li   DeclContext::lookup_result Ctors = S.LookupConstructors(DestRecordDecl);
3545*67e74705SXin Li 
3546*67e74705SXin Li   OverloadingResult Result = OR_No_Viable_Function;
3547*67e74705SXin Li   OverloadCandidateSet::iterator Best;
3548*67e74705SXin Li   bool AsInitializerList = false;
3549*67e74705SXin Li 
3550*67e74705SXin Li   // C++11 [over.match.list]p1, per DR1467:
3551*67e74705SXin Li   //   When objects of non-aggregate type T are list-initialized, such that
3552*67e74705SXin Li   //   8.5.4 [dcl.init.list] specifies that overload resolution is performed
3553*67e74705SXin Li   //   according to the rules in this section, overload resolution selects
3554*67e74705SXin Li   //   the constructor in two phases:
3555*67e74705SXin Li   //
3556*67e74705SXin Li   //   - Initially, the candidate functions are the initializer-list
3557*67e74705SXin Li   //     constructors of the class T and the argument list consists of the
3558*67e74705SXin Li   //     initializer list as a single argument.
3559*67e74705SXin Li   if (IsListInit) {
3560*67e74705SXin Li     InitListExpr *ILE = cast<InitListExpr>(Args[0]);
3561*67e74705SXin Li     AsInitializerList = true;
3562*67e74705SXin Li 
3563*67e74705SXin Li     // If the initializer list has no elements and T has a default constructor,
3564*67e74705SXin Li     // the first phase is omitted.
3565*67e74705SXin Li     if (ILE->getNumInits() != 0 || !DestRecordDecl->hasDefaultConstructor())
3566*67e74705SXin Li       Result = ResolveConstructorOverload(S, Kind.getLocation(), Args,
3567*67e74705SXin Li                                           CandidateSet, Ctors, Best,
3568*67e74705SXin Li                                           CopyInitialization, AllowExplicit,
3569*67e74705SXin Li                                           /*OnlyListConstructor=*/true,
3570*67e74705SXin Li                                           IsListInit);
3571*67e74705SXin Li 
3572*67e74705SXin Li     // Time to unwrap the init list.
3573*67e74705SXin Li     Args = MultiExprArg(ILE->getInits(), ILE->getNumInits());
3574*67e74705SXin Li   }
3575*67e74705SXin Li 
3576*67e74705SXin Li   // C++11 [over.match.list]p1:
3577*67e74705SXin Li   //   - If no viable initializer-list constructor is found, overload resolution
3578*67e74705SXin Li   //     is performed again, where the candidate functions are all the
3579*67e74705SXin Li   //     constructors of the class T and the argument list consists of the
3580*67e74705SXin Li   //     elements of the initializer list.
3581*67e74705SXin Li   if (Result == OR_No_Viable_Function) {
3582*67e74705SXin Li     AsInitializerList = false;
3583*67e74705SXin Li     Result = ResolveConstructorOverload(S, Kind.getLocation(), Args,
3584*67e74705SXin Li                                         CandidateSet, Ctors, Best,
3585*67e74705SXin Li                                         CopyInitialization, AllowExplicit,
3586*67e74705SXin Li                                         /*OnlyListConstructors=*/false,
3587*67e74705SXin Li                                         IsListInit);
3588*67e74705SXin Li   }
3589*67e74705SXin Li   if (Result) {
3590*67e74705SXin Li     Sequence.SetOverloadFailure(IsListInit ?
3591*67e74705SXin Li                       InitializationSequence::FK_ListConstructorOverloadFailed :
3592*67e74705SXin Li                       InitializationSequence::FK_ConstructorOverloadFailed,
3593*67e74705SXin Li                                 Result);
3594*67e74705SXin Li     return;
3595*67e74705SXin Li   }
3596*67e74705SXin Li 
3597*67e74705SXin Li   // C++11 [dcl.init]p6:
3598*67e74705SXin Li   //   If a program calls for the default initialization of an object
3599*67e74705SXin Li   //   of a const-qualified type T, T shall be a class type with a
3600*67e74705SXin Li   //   user-provided default constructor.
3601*67e74705SXin Li   // C++ core issue 253 proposal:
3602*67e74705SXin Li   //   If the implicit default constructor initializes all subobjects, no
3603*67e74705SXin Li   //   initializer should be required.
3604*67e74705SXin Li   // The 253 proposal is for example needed to process libstdc++ headers in 5.x.
3605*67e74705SXin Li   CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
3606*67e74705SXin Li   if (Kind.getKind() == InitializationKind::IK_Default &&
3607*67e74705SXin Li       Entity.getType().isConstQualified()) {
3608*67e74705SXin Li     if (!CtorDecl->getParent()->allowConstDefaultInit()) {
3609*67e74705SXin Li       if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
3610*67e74705SXin Li         Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
3611*67e74705SXin Li       return;
3612*67e74705SXin Li     }
3613*67e74705SXin Li   }
3614*67e74705SXin Li 
3615*67e74705SXin Li   // C++11 [over.match.list]p1:
3616*67e74705SXin Li   //   In copy-list-initialization, if an explicit constructor is chosen, the
3617*67e74705SXin Li   //   initializer is ill-formed.
3618*67e74705SXin Li   if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
3619*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor);
3620*67e74705SXin Li     return;
3621*67e74705SXin Li   }
3622*67e74705SXin Li 
3623*67e74705SXin Li   // Add the constructor initialization step. Any cv-qualification conversion is
3624*67e74705SXin Li   // subsumed by the initialization.
3625*67e74705SXin Li   bool HadMultipleCandidates = (CandidateSet.size() > 1);
3626*67e74705SXin Li   Sequence.AddConstructorInitializationStep(
3627*67e74705SXin Li       Best->FoundDecl, CtorDecl, DestType, HadMultipleCandidates,
3628*67e74705SXin Li       IsListInit | IsInitListCopy, AsInitializerList);
3629*67e74705SXin Li }
3630*67e74705SXin Li 
3631*67e74705SXin Li static bool
ResolveOverloadedFunctionForReferenceBinding(Sema & S,Expr * Initializer,QualType & SourceType,QualType & UnqualifiedSourceType,QualType UnqualifiedTargetType,InitializationSequence & Sequence)3632*67e74705SXin Li ResolveOverloadedFunctionForReferenceBinding(Sema &S,
3633*67e74705SXin Li                                              Expr *Initializer,
3634*67e74705SXin Li                                              QualType &SourceType,
3635*67e74705SXin Li                                              QualType &UnqualifiedSourceType,
3636*67e74705SXin Li                                              QualType UnqualifiedTargetType,
3637*67e74705SXin Li                                              InitializationSequence &Sequence) {
3638*67e74705SXin Li   if (S.Context.getCanonicalType(UnqualifiedSourceType) ==
3639*67e74705SXin Li         S.Context.OverloadTy) {
3640*67e74705SXin Li     DeclAccessPair Found;
3641*67e74705SXin Li     bool HadMultipleCandidates = false;
3642*67e74705SXin Li     if (FunctionDecl *Fn
3643*67e74705SXin Li         = S.ResolveAddressOfOverloadedFunction(Initializer,
3644*67e74705SXin Li                                                UnqualifiedTargetType,
3645*67e74705SXin Li                                                false, Found,
3646*67e74705SXin Li                                                &HadMultipleCandidates)) {
3647*67e74705SXin Li       Sequence.AddAddressOverloadResolutionStep(Fn, Found,
3648*67e74705SXin Li                                                 HadMultipleCandidates);
3649*67e74705SXin Li       SourceType = Fn->getType();
3650*67e74705SXin Li       UnqualifiedSourceType = SourceType.getUnqualifiedType();
3651*67e74705SXin Li     } else if (!UnqualifiedTargetType->isRecordType()) {
3652*67e74705SXin Li       Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
3653*67e74705SXin Li       return true;
3654*67e74705SXin Li     }
3655*67e74705SXin Li   }
3656*67e74705SXin Li   return false;
3657*67e74705SXin Li }
3658*67e74705SXin Li 
3659*67e74705SXin Li static void TryReferenceInitializationCore(Sema &S,
3660*67e74705SXin Li                                            const InitializedEntity &Entity,
3661*67e74705SXin Li                                            const InitializationKind &Kind,
3662*67e74705SXin Li                                            Expr *Initializer,
3663*67e74705SXin Li                                            QualType cv1T1, QualType T1,
3664*67e74705SXin Li                                            Qualifiers T1Quals,
3665*67e74705SXin Li                                            QualType cv2T2, QualType T2,
3666*67e74705SXin Li                                            Qualifiers T2Quals,
3667*67e74705SXin Li                                            InitializationSequence &Sequence);
3668*67e74705SXin Li 
3669*67e74705SXin Li static void TryValueInitialization(Sema &S,
3670*67e74705SXin Li                                    const InitializedEntity &Entity,
3671*67e74705SXin Li                                    const InitializationKind &Kind,
3672*67e74705SXin Li                                    InitializationSequence &Sequence,
3673*67e74705SXin Li                                    InitListExpr *InitList = nullptr);
3674*67e74705SXin Li 
3675*67e74705SXin Li /// \brief Attempt list initialization of a reference.
TryReferenceListInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitListExpr * InitList,InitializationSequence & Sequence,bool TreatUnavailableAsInvalid)3676*67e74705SXin Li static void TryReferenceListInitialization(Sema &S,
3677*67e74705SXin Li                                            const InitializedEntity &Entity,
3678*67e74705SXin Li                                            const InitializationKind &Kind,
3679*67e74705SXin Li                                            InitListExpr *InitList,
3680*67e74705SXin Li                                            InitializationSequence &Sequence,
3681*67e74705SXin Li                                            bool TreatUnavailableAsInvalid) {
3682*67e74705SXin Li   // First, catch C++03 where this isn't possible.
3683*67e74705SXin Li   if (!S.getLangOpts().CPlusPlus11) {
3684*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
3685*67e74705SXin Li     return;
3686*67e74705SXin Li   }
3687*67e74705SXin Li   // Can't reference initialize a compound literal.
3688*67e74705SXin Li   if (Entity.getKind() == InitializedEntity::EK_CompoundLiteralInit) {
3689*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
3690*67e74705SXin Li     return;
3691*67e74705SXin Li   }
3692*67e74705SXin Li 
3693*67e74705SXin Li   QualType DestType = Entity.getType();
3694*67e74705SXin Li   QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
3695*67e74705SXin Li   Qualifiers T1Quals;
3696*67e74705SXin Li   QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
3697*67e74705SXin Li 
3698*67e74705SXin Li   // Reference initialization via an initializer list works thus:
3699*67e74705SXin Li   // If the initializer list consists of a single element that is
3700*67e74705SXin Li   // reference-related to the referenced type, bind directly to that element
3701*67e74705SXin Li   // (possibly creating temporaries).
3702*67e74705SXin Li   // Otherwise, initialize a temporary with the initializer list and
3703*67e74705SXin Li   // bind to that.
3704*67e74705SXin Li   if (InitList->getNumInits() == 1) {
3705*67e74705SXin Li     Expr *Initializer = InitList->getInit(0);
3706*67e74705SXin Li     QualType cv2T2 = Initializer->getType();
3707*67e74705SXin Li     Qualifiers T2Quals;
3708*67e74705SXin Li     QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
3709*67e74705SXin Li 
3710*67e74705SXin Li     // If this fails, creating a temporary wouldn't work either.
3711*67e74705SXin Li     if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
3712*67e74705SXin Li                                                      T1, Sequence))
3713*67e74705SXin Li       return;
3714*67e74705SXin Li 
3715*67e74705SXin Li     SourceLocation DeclLoc = Initializer->getLocStart();
3716*67e74705SXin Li     bool dummy1, dummy2, dummy3;
3717*67e74705SXin Li     Sema::ReferenceCompareResult RefRelationship
3718*67e74705SXin Li       = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, dummy1,
3719*67e74705SXin Li                                        dummy2, dummy3);
3720*67e74705SXin Li     if (RefRelationship >= Sema::Ref_Related) {
3721*67e74705SXin Li       // Try to bind the reference here.
3722*67e74705SXin Li       TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
3723*67e74705SXin Li                                      T1Quals, cv2T2, T2, T2Quals, Sequence);
3724*67e74705SXin Li       if (Sequence)
3725*67e74705SXin Li         Sequence.RewrapReferenceInitList(cv1T1, InitList);
3726*67e74705SXin Li       return;
3727*67e74705SXin Li     }
3728*67e74705SXin Li 
3729*67e74705SXin Li     // Update the initializer if we've resolved an overloaded function.
3730*67e74705SXin Li     if (Sequence.step_begin() != Sequence.step_end())
3731*67e74705SXin Li       Sequence.RewrapReferenceInitList(cv1T1, InitList);
3732*67e74705SXin Li   }
3733*67e74705SXin Li 
3734*67e74705SXin Li   // Not reference-related. Create a temporary and bind to that.
3735*67e74705SXin Li   InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1);
3736*67e74705SXin Li 
3737*67e74705SXin Li   TryListInitialization(S, TempEntity, Kind, InitList, Sequence,
3738*67e74705SXin Li                         TreatUnavailableAsInvalid);
3739*67e74705SXin Li   if (Sequence) {
3740*67e74705SXin Li     if (DestType->isRValueReferenceType() ||
3741*67e74705SXin Li         (T1Quals.hasConst() && !T1Quals.hasVolatile()))
3742*67e74705SXin Li       Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true);
3743*67e74705SXin Li     else
3744*67e74705SXin Li       Sequence.SetFailed(
3745*67e74705SXin Li           InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary);
3746*67e74705SXin Li   }
3747*67e74705SXin Li }
3748*67e74705SXin Li 
3749*67e74705SXin Li /// \brief Attempt list initialization (C++0x [dcl.init.list])
TryListInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitListExpr * InitList,InitializationSequence & Sequence,bool TreatUnavailableAsInvalid)3750*67e74705SXin Li static void TryListInitialization(Sema &S,
3751*67e74705SXin Li                                   const InitializedEntity &Entity,
3752*67e74705SXin Li                                   const InitializationKind &Kind,
3753*67e74705SXin Li                                   InitListExpr *InitList,
3754*67e74705SXin Li                                   InitializationSequence &Sequence,
3755*67e74705SXin Li                                   bool TreatUnavailableAsInvalid) {
3756*67e74705SXin Li   QualType DestType = Entity.getType();
3757*67e74705SXin Li 
3758*67e74705SXin Li   // C++ doesn't allow scalar initialization with more than one argument.
3759*67e74705SXin Li   // But C99 complex numbers are scalars and it makes sense there.
3760*67e74705SXin Li   if (S.getLangOpts().CPlusPlus && DestType->isScalarType() &&
3761*67e74705SXin Li       !DestType->isAnyComplexType() && InitList->getNumInits() > 1) {
3762*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar);
3763*67e74705SXin Li     return;
3764*67e74705SXin Li   }
3765*67e74705SXin Li   if (DestType->isReferenceType()) {
3766*67e74705SXin Li     TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence,
3767*67e74705SXin Li                                    TreatUnavailableAsInvalid);
3768*67e74705SXin Li     return;
3769*67e74705SXin Li   }
3770*67e74705SXin Li 
3771*67e74705SXin Li   if (DestType->isRecordType() &&
3772*67e74705SXin Li       !S.isCompleteType(InitList->getLocStart(), DestType)) {
3773*67e74705SXin Li     Sequence.setIncompleteTypeFailure(DestType);
3774*67e74705SXin Li     return;
3775*67e74705SXin Li   }
3776*67e74705SXin Li 
3777*67e74705SXin Li   // C++11 [dcl.init.list]p3, per DR1467:
3778*67e74705SXin Li   // - If T is a class type and the initializer list has a single element of
3779*67e74705SXin Li   //   type cv U, where U is T or a class derived from T, the object is
3780*67e74705SXin Li   //   initialized from that element (by copy-initialization for
3781*67e74705SXin Li   //   copy-list-initialization, or by direct-initialization for
3782*67e74705SXin Li   //   direct-list-initialization).
3783*67e74705SXin Li   // - Otherwise, if T is a character array and the initializer list has a
3784*67e74705SXin Li   //   single element that is an appropriately-typed string literal
3785*67e74705SXin Li   //   (8.5.2 [dcl.init.string]), initialization is performed as described
3786*67e74705SXin Li   //   in that section.
3787*67e74705SXin Li   // - Otherwise, if T is an aggregate, [...] (continue below).
3788*67e74705SXin Li   if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1) {
3789*67e74705SXin Li     if (DestType->isRecordType()) {
3790*67e74705SXin Li       QualType InitType = InitList->getInit(0)->getType();
3791*67e74705SXin Li       if (S.Context.hasSameUnqualifiedType(InitType, DestType) ||
3792*67e74705SXin Li           S.IsDerivedFrom(InitList->getLocStart(), InitType, DestType)) {
3793*67e74705SXin Li         Expr *InitAsExpr = InitList->getInit(0);
3794*67e74705SXin Li         TryConstructorInitialization(S, Entity, Kind, InitAsExpr, DestType,
3795*67e74705SXin Li                                      Sequence, /*InitListSyntax*/ false,
3796*67e74705SXin Li                                      /*IsInitListCopy*/ true);
3797*67e74705SXin Li         return;
3798*67e74705SXin Li       }
3799*67e74705SXin Li     }
3800*67e74705SXin Li     if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) {
3801*67e74705SXin Li       Expr *SubInit[1] = {InitList->getInit(0)};
3802*67e74705SXin Li       if (!isa<VariableArrayType>(DestAT) &&
3803*67e74705SXin Li           IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) {
3804*67e74705SXin Li         InitializationKind SubKind =
3805*67e74705SXin Li             Kind.getKind() == InitializationKind::IK_DirectList
3806*67e74705SXin Li                 ? InitializationKind::CreateDirect(Kind.getLocation(),
3807*67e74705SXin Li                                                    InitList->getLBraceLoc(),
3808*67e74705SXin Li                                                    InitList->getRBraceLoc())
3809*67e74705SXin Li                 : Kind;
3810*67e74705SXin Li         Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
3811*67e74705SXin Li                                 /*TopLevelOfInitList*/ true,
3812*67e74705SXin Li                                 TreatUnavailableAsInvalid);
3813*67e74705SXin Li 
3814*67e74705SXin Li         // TryStringLiteralInitialization() (in InitializeFrom()) will fail if
3815*67e74705SXin Li         // the element is not an appropriately-typed string literal, in which
3816*67e74705SXin Li         // case we should proceed as in C++11 (below).
3817*67e74705SXin Li         if (Sequence) {
3818*67e74705SXin Li           Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
3819*67e74705SXin Li           return;
3820*67e74705SXin Li         }
3821*67e74705SXin Li       }
3822*67e74705SXin Li     }
3823*67e74705SXin Li   }
3824*67e74705SXin Li 
3825*67e74705SXin Li   // C++11 [dcl.init.list]p3:
3826*67e74705SXin Li   //   - If T is an aggregate, aggregate initialization is performed.
3827*67e74705SXin Li   if ((DestType->isRecordType() && !DestType->isAggregateType()) ||
3828*67e74705SXin Li       (S.getLangOpts().CPlusPlus11 &&
3829*67e74705SXin Li        S.isStdInitializerList(DestType, nullptr))) {
3830*67e74705SXin Li     if (S.getLangOpts().CPlusPlus11) {
3831*67e74705SXin Li       //   - Otherwise, if the initializer list has no elements and T is a
3832*67e74705SXin Li       //     class type with a default constructor, the object is
3833*67e74705SXin Li       //     value-initialized.
3834*67e74705SXin Li       if (InitList->getNumInits() == 0) {
3835*67e74705SXin Li         CXXRecordDecl *RD = DestType->getAsCXXRecordDecl();
3836*67e74705SXin Li         if (RD->hasDefaultConstructor()) {
3837*67e74705SXin Li           TryValueInitialization(S, Entity, Kind, Sequence, InitList);
3838*67e74705SXin Li           return;
3839*67e74705SXin Li         }
3840*67e74705SXin Li       }
3841*67e74705SXin Li 
3842*67e74705SXin Li       //   - Otherwise, if T is a specialization of std::initializer_list<E>,
3843*67e74705SXin Li       //     an initializer_list object constructed [...]
3844*67e74705SXin Li       if (TryInitializerListConstruction(S, InitList, DestType, Sequence,
3845*67e74705SXin Li                                          TreatUnavailableAsInvalid))
3846*67e74705SXin Li         return;
3847*67e74705SXin Li 
3848*67e74705SXin Li       //   - Otherwise, if T is a class type, constructors are considered.
3849*67e74705SXin Li       Expr *InitListAsExpr = InitList;
3850*67e74705SXin Li       TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
3851*67e74705SXin Li                                    Sequence, /*InitListSyntax*/ true);
3852*67e74705SXin Li     } else
3853*67e74705SXin Li       Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType);
3854*67e74705SXin Li     return;
3855*67e74705SXin Li   }
3856*67e74705SXin Li 
3857*67e74705SXin Li   if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() &&
3858*67e74705SXin Li       InitList->getNumInits() == 1) {
3859*67e74705SXin Li     Expr *E = InitList->getInit(0);
3860*67e74705SXin Li 
3861*67e74705SXin Li     //   - Otherwise, if T is an enumeration with a fixed underlying type,
3862*67e74705SXin Li     //     the initializer-list has a single element v, and the initialization
3863*67e74705SXin Li     //     is direct-list-initialization, the object is initialized with the
3864*67e74705SXin Li     //     value T(v); if a narrowing conversion is required to convert v to
3865*67e74705SXin Li     //     the underlying type of T, the program is ill-formed.
3866*67e74705SXin Li     auto *ET = DestType->getAs<EnumType>();
3867*67e74705SXin Li     if (S.getLangOpts().CPlusPlus1z &&
3868*67e74705SXin Li         Kind.getKind() == InitializationKind::IK_DirectList &&
3869*67e74705SXin Li         ET && ET->getDecl()->isFixed() &&
3870*67e74705SXin Li         !S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
3871*67e74705SXin Li         (E->getType()->isIntegralOrEnumerationType() ||
3872*67e74705SXin Li          E->getType()->isFloatingType())) {
3873*67e74705SXin Li       // There are two ways that T(v) can work when T is an enumeration type.
3874*67e74705SXin Li       // If there is either an implicit conversion sequence from v to T or
3875*67e74705SXin Li       // a conversion function that can convert from v to T, then we use that.
3876*67e74705SXin Li       // Otherwise, if v is of integral, enumeration, or floating-point type,
3877*67e74705SXin Li       // it is converted to the enumeration type via its underlying type.
3878*67e74705SXin Li       // There is no overlap possible between these two cases (except when the
3879*67e74705SXin Li       // source value is already of the destination type), and the first
3880*67e74705SXin Li       // case is handled by the general case for single-element lists below.
3881*67e74705SXin Li       ImplicitConversionSequence ICS;
3882*67e74705SXin Li       ICS.setStandard();
3883*67e74705SXin Li       ICS.Standard.setAsIdentityConversion();
3884*67e74705SXin Li       // If E is of a floating-point type, then the conversion is ill-formed
3885*67e74705SXin Li       // due to narrowing, but go through the motions in order to produce the
3886*67e74705SXin Li       // right diagnostic.
3887*67e74705SXin Li       ICS.Standard.Second = E->getType()->isFloatingType()
3888*67e74705SXin Li                                 ? ICK_Floating_Integral
3889*67e74705SXin Li                                 : ICK_Integral_Conversion;
3890*67e74705SXin Li       ICS.Standard.setFromType(E->getType());
3891*67e74705SXin Li       ICS.Standard.setToType(0, E->getType());
3892*67e74705SXin Li       ICS.Standard.setToType(1, DestType);
3893*67e74705SXin Li       ICS.Standard.setToType(2, DestType);
3894*67e74705SXin Li       Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2),
3895*67e74705SXin Li                                          /*TopLevelOfInitList*/true);
3896*67e74705SXin Li       Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
3897*67e74705SXin Li       return;
3898*67e74705SXin Li     }
3899*67e74705SXin Li 
3900*67e74705SXin Li     //   - Otherwise, if the initializer list has a single element of type E
3901*67e74705SXin Li     //     [...references are handled above...], the object or reference is
3902*67e74705SXin Li     //     initialized from that element (by copy-initialization for
3903*67e74705SXin Li     //     copy-list-initialization, or by direct-initialization for
3904*67e74705SXin Li     //     direct-list-initialization); if a narrowing conversion is required
3905*67e74705SXin Li     //     to convert the element to T, the program is ill-formed.
3906*67e74705SXin Li     //
3907*67e74705SXin Li     // Per core-24034, this is direct-initialization if we were performing
3908*67e74705SXin Li     // direct-list-initialization and copy-initialization otherwise.
3909*67e74705SXin Li     // We can't use InitListChecker for this, because it always performs
3910*67e74705SXin Li     // copy-initialization. This only matters if we might use an 'explicit'
3911*67e74705SXin Li     // conversion operator, so we only need to handle the cases where the source
3912*67e74705SXin Li     // is of record type.
3913*67e74705SXin Li     if (InitList->getInit(0)->getType()->isRecordType()) {
3914*67e74705SXin Li       InitializationKind SubKind =
3915*67e74705SXin Li           Kind.getKind() == InitializationKind::IK_DirectList
3916*67e74705SXin Li               ? InitializationKind::CreateDirect(Kind.getLocation(),
3917*67e74705SXin Li                                                  InitList->getLBraceLoc(),
3918*67e74705SXin Li                                                  InitList->getRBraceLoc())
3919*67e74705SXin Li               : Kind;
3920*67e74705SXin Li       Expr *SubInit[1] = { InitList->getInit(0) };
3921*67e74705SXin Li       Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
3922*67e74705SXin Li                               /*TopLevelOfInitList*/true,
3923*67e74705SXin Li                               TreatUnavailableAsInvalid);
3924*67e74705SXin Li       if (Sequence)
3925*67e74705SXin Li         Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
3926*67e74705SXin Li       return;
3927*67e74705SXin Li     }
3928*67e74705SXin Li   }
3929*67e74705SXin Li 
3930*67e74705SXin Li   InitListChecker CheckInitList(S, Entity, InitList,
3931*67e74705SXin Li           DestType, /*VerifyOnly=*/true, TreatUnavailableAsInvalid);
3932*67e74705SXin Li   if (CheckInitList.HadError()) {
3933*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed);
3934*67e74705SXin Li     return;
3935*67e74705SXin Li   }
3936*67e74705SXin Li 
3937*67e74705SXin Li   // Add the list initialization step with the built init list.
3938*67e74705SXin Li   Sequence.AddListInitializationStep(DestType);
3939*67e74705SXin Li }
3940*67e74705SXin Li 
3941*67e74705SXin Li /// \brief Try a reference initialization that involves calling a conversion
3942*67e74705SXin Li /// function.
TryRefInitWithConversionFunction(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,bool AllowRValues,InitializationSequence & Sequence)3943*67e74705SXin Li static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
3944*67e74705SXin Li                                              const InitializedEntity &Entity,
3945*67e74705SXin Li                                              const InitializationKind &Kind,
3946*67e74705SXin Li                                              Expr *Initializer,
3947*67e74705SXin Li                                              bool AllowRValues,
3948*67e74705SXin Li                                              InitializationSequence &Sequence) {
3949*67e74705SXin Li   QualType DestType = Entity.getType();
3950*67e74705SXin Li   QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
3951*67e74705SXin Li   QualType T1 = cv1T1.getUnqualifiedType();
3952*67e74705SXin Li   QualType cv2T2 = Initializer->getType();
3953*67e74705SXin Li   QualType T2 = cv2T2.getUnqualifiedType();
3954*67e74705SXin Li 
3955*67e74705SXin Li   bool DerivedToBase;
3956*67e74705SXin Li   bool ObjCConversion;
3957*67e74705SXin Li   bool ObjCLifetimeConversion;
3958*67e74705SXin Li   assert(!S.CompareReferenceRelationship(Initializer->getLocStart(),
3959*67e74705SXin Li                                          T1, T2, DerivedToBase,
3960*67e74705SXin Li                                          ObjCConversion,
3961*67e74705SXin Li                                          ObjCLifetimeConversion) &&
3962*67e74705SXin Li          "Must have incompatible references when binding via conversion");
3963*67e74705SXin Li   (void)DerivedToBase;
3964*67e74705SXin Li   (void)ObjCConversion;
3965*67e74705SXin Li   (void)ObjCLifetimeConversion;
3966*67e74705SXin Li 
3967*67e74705SXin Li   // Build the candidate set directly in the initialization sequence
3968*67e74705SXin Li   // structure, so that it will persist if we fail.
3969*67e74705SXin Li   OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
3970*67e74705SXin Li   CandidateSet.clear();
3971*67e74705SXin Li 
3972*67e74705SXin Li   // Determine whether we are allowed to call explicit constructors or
3973*67e74705SXin Li   // explicit conversion operators.
3974*67e74705SXin Li   bool AllowExplicit = Kind.AllowExplicit();
3975*67e74705SXin Li   bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
3976*67e74705SXin Li 
3977*67e74705SXin Li   const RecordType *T1RecordType = nullptr;
3978*67e74705SXin Li   if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) &&
3979*67e74705SXin Li       S.isCompleteType(Kind.getLocation(), T1)) {
3980*67e74705SXin Li     // The type we're converting to is a class type. Enumerate its constructors
3981*67e74705SXin Li     // to see if there is a suitable conversion.
3982*67e74705SXin Li     CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl());
3983*67e74705SXin Li 
3984*67e74705SXin Li     for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) {
3985*67e74705SXin Li       auto Info = getConstructorInfo(D);
3986*67e74705SXin Li       if (!Info.Constructor)
3987*67e74705SXin Li         continue;
3988*67e74705SXin Li 
3989*67e74705SXin Li       if (!Info.Constructor->isInvalidDecl() &&
3990*67e74705SXin Li           Info.Constructor->isConvertingConstructor(AllowExplicit)) {
3991*67e74705SXin Li         if (Info.ConstructorTmpl)
3992*67e74705SXin Li           S.AddTemplateOverloadCandidate(Info.ConstructorTmpl, Info.FoundDecl,
3993*67e74705SXin Li                                          /*ExplicitArgs*/ nullptr,
3994*67e74705SXin Li                                          Initializer, CandidateSet,
3995*67e74705SXin Li                                          /*SuppressUserConversions=*/true);
3996*67e74705SXin Li         else
3997*67e74705SXin Li           S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
3998*67e74705SXin Li                                  Initializer, CandidateSet,
3999*67e74705SXin Li                                  /*SuppressUserConversions=*/true);
4000*67e74705SXin Li       }
4001*67e74705SXin Li     }
4002*67e74705SXin Li   }
4003*67e74705SXin Li   if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl())
4004*67e74705SXin Li     return OR_No_Viable_Function;
4005*67e74705SXin Li 
4006*67e74705SXin Li   const RecordType *T2RecordType = nullptr;
4007*67e74705SXin Li   if ((T2RecordType = T2->getAs<RecordType>()) &&
4008*67e74705SXin Li       S.isCompleteType(Kind.getLocation(), T2)) {
4009*67e74705SXin Li     // The type we're converting from is a class type, enumerate its conversion
4010*67e74705SXin Li     // functions.
4011*67e74705SXin Li     CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
4012*67e74705SXin Li 
4013*67e74705SXin Li     const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
4014*67e74705SXin Li     for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4015*67e74705SXin Li       NamedDecl *D = *I;
4016*67e74705SXin Li       CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4017*67e74705SXin Li       if (isa<UsingShadowDecl>(D))
4018*67e74705SXin Li         D = cast<UsingShadowDecl>(D)->getTargetDecl();
4019*67e74705SXin Li 
4020*67e74705SXin Li       FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4021*67e74705SXin Li       CXXConversionDecl *Conv;
4022*67e74705SXin Li       if (ConvTemplate)
4023*67e74705SXin Li         Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4024*67e74705SXin Li       else
4025*67e74705SXin Li         Conv = cast<CXXConversionDecl>(D);
4026*67e74705SXin Li 
4027*67e74705SXin Li       // If the conversion function doesn't return a reference type,
4028*67e74705SXin Li       // it can't be considered for this conversion unless we're allowed to
4029*67e74705SXin Li       // consider rvalues.
4030*67e74705SXin Li       // FIXME: Do we need to make sure that we only consider conversion
4031*67e74705SXin Li       // candidates with reference-compatible results? That might be needed to
4032*67e74705SXin Li       // break recursion.
4033*67e74705SXin Li       if ((AllowExplicitConvs || !Conv->isExplicit()) &&
4034*67e74705SXin Li           (AllowRValues || Conv->getConversionType()->isLValueReferenceType())){
4035*67e74705SXin Li         if (ConvTemplate)
4036*67e74705SXin Li           S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(),
4037*67e74705SXin Li                                            ActingDC, Initializer,
4038*67e74705SXin Li                                            DestType, CandidateSet,
4039*67e74705SXin Li                                            /*AllowObjCConversionOnExplicit=*/
4040*67e74705SXin Li                                              false);
4041*67e74705SXin Li         else
4042*67e74705SXin Li           S.AddConversionCandidate(Conv, I.getPair(), ActingDC,
4043*67e74705SXin Li                                    Initializer, DestType, CandidateSet,
4044*67e74705SXin Li                                    /*AllowObjCConversionOnExplicit=*/false);
4045*67e74705SXin Li       }
4046*67e74705SXin Li     }
4047*67e74705SXin Li   }
4048*67e74705SXin Li   if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl())
4049*67e74705SXin Li     return OR_No_Viable_Function;
4050*67e74705SXin Li 
4051*67e74705SXin Li   SourceLocation DeclLoc = Initializer->getLocStart();
4052*67e74705SXin Li 
4053*67e74705SXin Li   // Perform overload resolution. If it fails, return the failed result.
4054*67e74705SXin Li   OverloadCandidateSet::iterator Best;
4055*67e74705SXin Li   if (OverloadingResult Result
4056*67e74705SXin Li         = CandidateSet.BestViableFunction(S, DeclLoc, Best, true))
4057*67e74705SXin Li     return Result;
4058*67e74705SXin Li 
4059*67e74705SXin Li   FunctionDecl *Function = Best->Function;
4060*67e74705SXin Li   // This is the overload that will be used for this initialization step if we
4061*67e74705SXin Li   // use this initialization. Mark it as referenced.
4062*67e74705SXin Li   Function->setReferenced();
4063*67e74705SXin Li 
4064*67e74705SXin Li   // Compute the returned type of the conversion.
4065*67e74705SXin Li   if (isa<CXXConversionDecl>(Function))
4066*67e74705SXin Li     T2 = Function->getReturnType();
4067*67e74705SXin Li   else
4068*67e74705SXin Li     T2 = cv1T1;
4069*67e74705SXin Li 
4070*67e74705SXin Li   // Add the user-defined conversion step.
4071*67e74705SXin Li   bool HadMultipleCandidates = (CandidateSet.size() > 1);
4072*67e74705SXin Li   Sequence.AddUserConversionStep(Function, Best->FoundDecl,
4073*67e74705SXin Li                                  T2.getNonLValueExprType(S.Context),
4074*67e74705SXin Li                                  HadMultipleCandidates);
4075*67e74705SXin Li 
4076*67e74705SXin Li   // Determine whether we need to perform derived-to-base or
4077*67e74705SXin Li   // cv-qualification adjustments.
4078*67e74705SXin Li   ExprValueKind VK = VK_RValue;
4079*67e74705SXin Li   if (T2->isLValueReferenceType())
4080*67e74705SXin Li     VK = VK_LValue;
4081*67e74705SXin Li   else if (const RValueReferenceType *RRef = T2->getAs<RValueReferenceType>())
4082*67e74705SXin Li     VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue;
4083*67e74705SXin Li 
4084*67e74705SXin Li   bool NewDerivedToBase = false;
4085*67e74705SXin Li   bool NewObjCConversion = false;
4086*67e74705SXin Li   bool NewObjCLifetimeConversion = false;
4087*67e74705SXin Li   Sema::ReferenceCompareResult NewRefRelationship
4088*67e74705SXin Li     = S.CompareReferenceRelationship(DeclLoc, T1,
4089*67e74705SXin Li                                      T2.getNonLValueExprType(S.Context),
4090*67e74705SXin Li                                      NewDerivedToBase, NewObjCConversion,
4091*67e74705SXin Li                                      NewObjCLifetimeConversion);
4092*67e74705SXin Li   if (NewRefRelationship == Sema::Ref_Incompatible) {
4093*67e74705SXin Li     // If the type we've converted to is not reference-related to the
4094*67e74705SXin Li     // type we're looking for, then there is another conversion step
4095*67e74705SXin Li     // we need to perform to produce a temporary of the right type
4096*67e74705SXin Li     // that we'll be binding to.
4097*67e74705SXin Li     ImplicitConversionSequence ICS;
4098*67e74705SXin Li     ICS.setStandard();
4099*67e74705SXin Li     ICS.Standard = Best->FinalConversion;
4100*67e74705SXin Li     T2 = ICS.Standard.getToType(2);
4101*67e74705SXin Li     Sequence.AddConversionSequenceStep(ICS, T2);
4102*67e74705SXin Li   } else if (NewDerivedToBase)
4103*67e74705SXin Li     Sequence.AddDerivedToBaseCastStep(
4104*67e74705SXin Li                                 S.Context.getQualifiedType(T1,
4105*67e74705SXin Li                                   T2.getNonReferenceType().getQualifiers()),
4106*67e74705SXin Li                                       VK);
4107*67e74705SXin Li   else if (NewObjCConversion)
4108*67e74705SXin Li     Sequence.AddObjCObjectConversionStep(
4109*67e74705SXin Li                                 S.Context.getQualifiedType(T1,
4110*67e74705SXin Li                                   T2.getNonReferenceType().getQualifiers()));
4111*67e74705SXin Li 
4112*67e74705SXin Li   if (cv1T1.getQualifiers() != T2.getNonReferenceType().getQualifiers())
4113*67e74705SXin Li     Sequence.AddQualificationConversionStep(cv1T1, VK);
4114*67e74705SXin Li 
4115*67e74705SXin Li   Sequence.AddReferenceBindingStep(cv1T1, !T2->isReferenceType());
4116*67e74705SXin Li   return OR_Success;
4117*67e74705SXin Li }
4118*67e74705SXin Li 
4119*67e74705SXin Li static void CheckCXX98CompatAccessibleCopy(Sema &S,
4120*67e74705SXin Li                                            const InitializedEntity &Entity,
4121*67e74705SXin Li                                            Expr *CurInitExpr);
4122*67e74705SXin Li 
4123*67e74705SXin Li /// \brief Attempt reference initialization (C++0x [dcl.init.ref])
TryReferenceInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,InitializationSequence & Sequence)4124*67e74705SXin Li static void TryReferenceInitialization(Sema &S,
4125*67e74705SXin Li                                        const InitializedEntity &Entity,
4126*67e74705SXin Li                                        const InitializationKind &Kind,
4127*67e74705SXin Li                                        Expr *Initializer,
4128*67e74705SXin Li                                        InitializationSequence &Sequence) {
4129*67e74705SXin Li   QualType DestType = Entity.getType();
4130*67e74705SXin Li   QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
4131*67e74705SXin Li   Qualifiers T1Quals;
4132*67e74705SXin Li   QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
4133*67e74705SXin Li   QualType cv2T2 = Initializer->getType();
4134*67e74705SXin Li   Qualifiers T2Quals;
4135*67e74705SXin Li   QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
4136*67e74705SXin Li 
4137*67e74705SXin Li   // If the initializer is the address of an overloaded function, try
4138*67e74705SXin Li   // to resolve the overloaded function. If all goes well, T2 is the
4139*67e74705SXin Li   // type of the resulting function.
4140*67e74705SXin Li   if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
4141*67e74705SXin Li                                                    T1, Sequence))
4142*67e74705SXin Li     return;
4143*67e74705SXin Li 
4144*67e74705SXin Li   // Delegate everything else to a subfunction.
4145*67e74705SXin Li   TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4146*67e74705SXin Li                                  T1Quals, cv2T2, T2, T2Quals, Sequence);
4147*67e74705SXin Li }
4148*67e74705SXin Li 
4149*67e74705SXin Li /// Converts the target of reference initialization so that it has the
4150*67e74705SXin Li /// appropriate qualifiers and value kind.
4151*67e74705SXin Li ///
4152*67e74705SXin Li /// In this case, 'x' is an 'int' lvalue, but it needs to be 'const int'.
4153*67e74705SXin Li /// \code
4154*67e74705SXin Li ///   int x;
4155*67e74705SXin Li ///   const int &r = x;
4156*67e74705SXin Li /// \endcode
4157*67e74705SXin Li ///
4158*67e74705SXin Li /// In this case the reference is binding to a bitfield lvalue, which isn't
4159*67e74705SXin Li /// valid. Perform a load to create a lifetime-extended temporary instead.
4160*67e74705SXin Li /// \code
4161*67e74705SXin Li ///   const int &r = someStruct.bitfield;
4162*67e74705SXin Li /// \endcode
4163*67e74705SXin Li static ExprValueKind
convertQualifiersAndValueKindIfNecessary(Sema & S,InitializationSequence & Sequence,Expr * Initializer,QualType cv1T1,Qualifiers T1Quals,Qualifiers T2Quals,bool IsLValueRef)4164*67e74705SXin Li convertQualifiersAndValueKindIfNecessary(Sema &S,
4165*67e74705SXin Li                                          InitializationSequence &Sequence,
4166*67e74705SXin Li                                          Expr *Initializer,
4167*67e74705SXin Li                                          QualType cv1T1,
4168*67e74705SXin Li                                          Qualifiers T1Quals,
4169*67e74705SXin Li                                          Qualifiers T2Quals,
4170*67e74705SXin Li                                          bool IsLValueRef) {
4171*67e74705SXin Li   bool IsNonAddressableType = Initializer->refersToBitField() ||
4172*67e74705SXin Li                               Initializer->refersToVectorElement();
4173*67e74705SXin Li 
4174*67e74705SXin Li   if (IsNonAddressableType) {
4175*67e74705SXin Li     // C++11 [dcl.init.ref]p5: [...] Otherwise, the reference shall be an
4176*67e74705SXin Li     // lvalue reference to a non-volatile const type, or the reference shall be
4177*67e74705SXin Li     // an rvalue reference.
4178*67e74705SXin Li     //
4179*67e74705SXin Li     // If not, we can't make a temporary and bind to that. Give up and allow the
4180*67e74705SXin Li     // error to be diagnosed later.
4181*67e74705SXin Li     if (IsLValueRef && (!T1Quals.hasConst() || T1Quals.hasVolatile())) {
4182*67e74705SXin Li       assert(Initializer->isGLValue());
4183*67e74705SXin Li       return Initializer->getValueKind();
4184*67e74705SXin Li     }
4185*67e74705SXin Li 
4186*67e74705SXin Li     // Force a load so we can materialize a temporary.
4187*67e74705SXin Li     Sequence.AddLValueToRValueStep(cv1T1.getUnqualifiedType());
4188*67e74705SXin Li     return VK_RValue;
4189*67e74705SXin Li   }
4190*67e74705SXin Li 
4191*67e74705SXin Li   if (T1Quals != T2Quals) {
4192*67e74705SXin Li     Sequence.AddQualificationConversionStep(cv1T1,
4193*67e74705SXin Li                                             Initializer->getValueKind());
4194*67e74705SXin Li   }
4195*67e74705SXin Li 
4196*67e74705SXin Li   return Initializer->getValueKind();
4197*67e74705SXin Li }
4198*67e74705SXin Li 
4199*67e74705SXin Li /// \brief Reference initialization without resolving overloaded functions.
TryReferenceInitializationCore(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,QualType cv1T1,QualType T1,Qualifiers T1Quals,QualType cv2T2,QualType T2,Qualifiers T2Quals,InitializationSequence & Sequence)4200*67e74705SXin Li static void TryReferenceInitializationCore(Sema &S,
4201*67e74705SXin Li                                            const InitializedEntity &Entity,
4202*67e74705SXin Li                                            const InitializationKind &Kind,
4203*67e74705SXin Li                                            Expr *Initializer,
4204*67e74705SXin Li                                            QualType cv1T1, QualType T1,
4205*67e74705SXin Li                                            Qualifiers T1Quals,
4206*67e74705SXin Li                                            QualType cv2T2, QualType T2,
4207*67e74705SXin Li                                            Qualifiers T2Quals,
4208*67e74705SXin Li                                            InitializationSequence &Sequence) {
4209*67e74705SXin Li   QualType DestType = Entity.getType();
4210*67e74705SXin Li   SourceLocation DeclLoc = Initializer->getLocStart();
4211*67e74705SXin Li   // Compute some basic properties of the types and the initializer.
4212*67e74705SXin Li   bool isLValueRef = DestType->isLValueReferenceType();
4213*67e74705SXin Li   bool isRValueRef = !isLValueRef;
4214*67e74705SXin Li   bool DerivedToBase = false;
4215*67e74705SXin Li   bool ObjCConversion = false;
4216*67e74705SXin Li   bool ObjCLifetimeConversion = false;
4217*67e74705SXin Li   Expr::Classification InitCategory = Initializer->Classify(S.Context);
4218*67e74705SXin Li   Sema::ReferenceCompareResult RefRelationship
4219*67e74705SXin Li     = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, DerivedToBase,
4220*67e74705SXin Li                                      ObjCConversion, ObjCLifetimeConversion);
4221*67e74705SXin Li 
4222*67e74705SXin Li   // C++0x [dcl.init.ref]p5:
4223*67e74705SXin Li   //   A reference to type "cv1 T1" is initialized by an expression of type
4224*67e74705SXin Li   //   "cv2 T2" as follows:
4225*67e74705SXin Li   //
4226*67e74705SXin Li   //     - If the reference is an lvalue reference and the initializer
4227*67e74705SXin Li   //       expression
4228*67e74705SXin Li   // Note the analogous bullet points for rvalue refs to functions. Because
4229*67e74705SXin Li   // there are no function rvalues in C++, rvalue refs to functions are treated
4230*67e74705SXin Li   // like lvalue refs.
4231*67e74705SXin Li   OverloadingResult ConvOvlResult = OR_Success;
4232*67e74705SXin Li   bool T1Function = T1->isFunctionType();
4233*67e74705SXin Li   if (isLValueRef || T1Function) {
4234*67e74705SXin Li     if (InitCategory.isLValue() &&
4235*67e74705SXin Li         (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification ||
4236*67e74705SXin Li          (Kind.isCStyleOrFunctionalCast() &&
4237*67e74705SXin Li           RefRelationship == Sema::Ref_Related))) {
4238*67e74705SXin Li       //   - is an lvalue (but is not a bit-field), and "cv1 T1" is
4239*67e74705SXin Li       //     reference-compatible with "cv2 T2," or
4240*67e74705SXin Li       //
4241*67e74705SXin Li       // Per C++ [over.best.ics]p2, we don't diagnose whether the lvalue is a
4242*67e74705SXin Li       // bit-field when we're determining whether the reference initialization
4243*67e74705SXin Li       // can occur. However, we do pay attention to whether it is a bit-field
4244*67e74705SXin Li       // to decide whether we're actually binding to a temporary created from
4245*67e74705SXin Li       // the bit-field.
4246*67e74705SXin Li       if (DerivedToBase)
4247*67e74705SXin Li         Sequence.AddDerivedToBaseCastStep(
4248*67e74705SXin Li                          S.Context.getQualifiedType(T1, T2Quals),
4249*67e74705SXin Li                          VK_LValue);
4250*67e74705SXin Li       else if (ObjCConversion)
4251*67e74705SXin Li         Sequence.AddObjCObjectConversionStep(
4252*67e74705SXin Li                                      S.Context.getQualifiedType(T1, T2Quals));
4253*67e74705SXin Li 
4254*67e74705SXin Li       ExprValueKind ValueKind =
4255*67e74705SXin Li         convertQualifiersAndValueKindIfNecessary(S, Sequence, Initializer,
4256*67e74705SXin Li                                                  cv1T1, T1Quals, T2Quals,
4257*67e74705SXin Li                                                  isLValueRef);
4258*67e74705SXin Li       Sequence.AddReferenceBindingStep(cv1T1, ValueKind == VK_RValue);
4259*67e74705SXin Li       return;
4260*67e74705SXin Li     }
4261*67e74705SXin Li 
4262*67e74705SXin Li     //     - has a class type (i.e., T2 is a class type), where T1 is not
4263*67e74705SXin Li     //       reference-related to T2, and can be implicitly converted to an
4264*67e74705SXin Li     //       lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible
4265*67e74705SXin Li     //       with "cv3 T3" (this conversion is selected by enumerating the
4266*67e74705SXin Li     //       applicable conversion functions (13.3.1.6) and choosing the best
4267*67e74705SXin Li     //       one through overload resolution (13.3)),
4268*67e74705SXin Li     // If we have an rvalue ref to function type here, the rhs must be
4269*67e74705SXin Li     // an rvalue. DR1287 removed the "implicitly" here.
4270*67e74705SXin Li     if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() &&
4271*67e74705SXin Li         (isLValueRef || InitCategory.isRValue())) {
4272*67e74705SXin Li       ConvOvlResult = TryRefInitWithConversionFunction(
4273*67e74705SXin Li           S, Entity, Kind, Initializer, /*AllowRValues*/isRValueRef, Sequence);
4274*67e74705SXin Li       if (ConvOvlResult == OR_Success)
4275*67e74705SXin Li         return;
4276*67e74705SXin Li       if (ConvOvlResult != OR_No_Viable_Function)
4277*67e74705SXin Li         Sequence.SetOverloadFailure(
4278*67e74705SXin Li             InitializationSequence::FK_ReferenceInitOverloadFailed,
4279*67e74705SXin Li             ConvOvlResult);
4280*67e74705SXin Li     }
4281*67e74705SXin Li   }
4282*67e74705SXin Li 
4283*67e74705SXin Li   //     - Otherwise, the reference shall be an lvalue reference to a
4284*67e74705SXin Li   //       non-volatile const type (i.e., cv1 shall be const), or the reference
4285*67e74705SXin Li   //       shall be an rvalue reference.
4286*67e74705SXin Li   if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) {
4287*67e74705SXin Li     if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
4288*67e74705SXin Li       Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
4289*67e74705SXin Li     else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
4290*67e74705SXin Li       Sequence.SetOverloadFailure(
4291*67e74705SXin Li                         InitializationSequence::FK_ReferenceInitOverloadFailed,
4292*67e74705SXin Li                                   ConvOvlResult);
4293*67e74705SXin Li     else
4294*67e74705SXin Li       Sequence.SetFailed(InitCategory.isLValue()
4295*67e74705SXin Li         ? (RefRelationship == Sema::Ref_Related
4296*67e74705SXin Li              ? InitializationSequence::FK_ReferenceInitDropsQualifiers
4297*67e74705SXin Li              : InitializationSequence::FK_NonConstLValueReferenceBindingToUnrelated)
4298*67e74705SXin Li         : InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary);
4299*67e74705SXin Li 
4300*67e74705SXin Li     return;
4301*67e74705SXin Li   }
4302*67e74705SXin Li 
4303*67e74705SXin Li   //    - If the initializer expression
4304*67e74705SXin Li   //      - is an xvalue, class prvalue, array prvalue, or function lvalue and
4305*67e74705SXin Li   //        "cv1 T1" is reference-compatible with "cv2 T2"
4306*67e74705SXin Li   // Note: functions are handled below.
4307*67e74705SXin Li   if (!T1Function &&
4308*67e74705SXin Li       (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification ||
4309*67e74705SXin Li        (Kind.isCStyleOrFunctionalCast() &&
4310*67e74705SXin Li         RefRelationship == Sema::Ref_Related)) &&
4311*67e74705SXin Li       (InitCategory.isXValue() ||
4312*67e74705SXin Li        (InitCategory.isPRValue() && T2->isRecordType()) ||
4313*67e74705SXin Li        (InitCategory.isPRValue() && T2->isArrayType()))) {
4314*67e74705SXin Li     ExprValueKind ValueKind = InitCategory.isXValue()? VK_XValue : VK_RValue;
4315*67e74705SXin Li     if (InitCategory.isPRValue() && T2->isRecordType()) {
4316*67e74705SXin Li       // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the
4317*67e74705SXin Li       // compiler the freedom to perform a copy here or bind to the
4318*67e74705SXin Li       // object, while C++0x requires that we bind directly to the
4319*67e74705SXin Li       // object. Hence, we always bind to the object without making an
4320*67e74705SXin Li       // extra copy. However, in C++03 requires that we check for the
4321*67e74705SXin Li       // presence of a suitable copy constructor:
4322*67e74705SXin Li       //
4323*67e74705SXin Li       //   The constructor that would be used to make the copy shall
4324*67e74705SXin Li       //   be callable whether or not the copy is actually done.
4325*67e74705SXin Li       if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt)
4326*67e74705SXin Li         Sequence.AddExtraneousCopyToTemporary(cv2T2);
4327*67e74705SXin Li       else if (S.getLangOpts().CPlusPlus11)
4328*67e74705SXin Li         CheckCXX98CompatAccessibleCopy(S, Entity, Initializer);
4329*67e74705SXin Li     }
4330*67e74705SXin Li 
4331*67e74705SXin Li     if (DerivedToBase)
4332*67e74705SXin Li       Sequence.AddDerivedToBaseCastStep(S.Context.getQualifiedType(T1, T2Quals),
4333*67e74705SXin Li                                         ValueKind);
4334*67e74705SXin Li     else if (ObjCConversion)
4335*67e74705SXin Li       Sequence.AddObjCObjectConversionStep(
4336*67e74705SXin Li                                        S.Context.getQualifiedType(T1, T2Quals));
4337*67e74705SXin Li 
4338*67e74705SXin Li     ValueKind = convertQualifiersAndValueKindIfNecessary(S, Sequence,
4339*67e74705SXin Li                                                          Initializer, cv1T1,
4340*67e74705SXin Li                                                          T1Quals, T2Quals,
4341*67e74705SXin Li                                                          isLValueRef);
4342*67e74705SXin Li 
4343*67e74705SXin Li     Sequence.AddReferenceBindingStep(cv1T1, ValueKind == VK_RValue);
4344*67e74705SXin Li     return;
4345*67e74705SXin Li   }
4346*67e74705SXin Li 
4347*67e74705SXin Li   //       - has a class type (i.e., T2 is a class type), where T1 is not
4348*67e74705SXin Li   //         reference-related to T2, and can be implicitly converted to an
4349*67e74705SXin Li   //         xvalue, class prvalue, or function lvalue of type "cv3 T3",
4350*67e74705SXin Li   //         where "cv1 T1" is reference-compatible with "cv3 T3",
4351*67e74705SXin Li   //
4352*67e74705SXin Li   // DR1287 removes the "implicitly" here.
4353*67e74705SXin Li   if (T2->isRecordType()) {
4354*67e74705SXin Li     if (RefRelationship == Sema::Ref_Incompatible) {
4355*67e74705SXin Li       ConvOvlResult = TryRefInitWithConversionFunction(
4356*67e74705SXin Li           S, Entity, Kind, Initializer, /*AllowRValues*/true, Sequence);
4357*67e74705SXin Li       if (ConvOvlResult)
4358*67e74705SXin Li         Sequence.SetOverloadFailure(
4359*67e74705SXin Li             InitializationSequence::FK_ReferenceInitOverloadFailed,
4360*67e74705SXin Li             ConvOvlResult);
4361*67e74705SXin Li 
4362*67e74705SXin Li       return;
4363*67e74705SXin Li     }
4364*67e74705SXin Li 
4365*67e74705SXin Li     if ((RefRelationship == Sema::Ref_Compatible ||
4366*67e74705SXin Li          RefRelationship == Sema::Ref_Compatible_With_Added_Qualification) &&
4367*67e74705SXin Li         isRValueRef && InitCategory.isLValue()) {
4368*67e74705SXin Li       Sequence.SetFailed(
4369*67e74705SXin Li         InitializationSequence::FK_RValueReferenceBindingToLValue);
4370*67e74705SXin Li       return;
4371*67e74705SXin Li     }
4372*67e74705SXin Li 
4373*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
4374*67e74705SXin Li     return;
4375*67e74705SXin Li   }
4376*67e74705SXin Li 
4377*67e74705SXin Li   //      - Otherwise, a temporary of type "cv1 T1" is created and initialized
4378*67e74705SXin Li   //        from the initializer expression using the rules for a non-reference
4379*67e74705SXin Li   //        copy-initialization (8.5). The reference is then bound to the
4380*67e74705SXin Li   //        temporary. [...]
4381*67e74705SXin Li 
4382*67e74705SXin Li   InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(cv1T1);
4383*67e74705SXin Li 
4384*67e74705SXin Li   // FIXME: Why do we use an implicit conversion here rather than trying
4385*67e74705SXin Li   // copy-initialization?
4386*67e74705SXin Li   ImplicitConversionSequence ICS
4387*67e74705SXin Li     = S.TryImplicitConversion(Initializer, TempEntity.getType(),
4388*67e74705SXin Li                               /*SuppressUserConversions=*/false,
4389*67e74705SXin Li                               /*AllowExplicit=*/false,
4390*67e74705SXin Li                               /*FIXME:InOverloadResolution=*/false,
4391*67e74705SXin Li                               /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
4392*67e74705SXin Li                               /*AllowObjCWritebackConversion=*/false);
4393*67e74705SXin Li 
4394*67e74705SXin Li   if (ICS.isBad()) {
4395*67e74705SXin Li     // FIXME: Use the conversion function set stored in ICS to turn
4396*67e74705SXin Li     // this into an overloading ambiguity diagnostic. However, we need
4397*67e74705SXin Li     // to keep that set as an OverloadCandidateSet rather than as some
4398*67e74705SXin Li     // other kind of set.
4399*67e74705SXin Li     if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
4400*67e74705SXin Li       Sequence.SetOverloadFailure(
4401*67e74705SXin Li                         InitializationSequence::FK_ReferenceInitOverloadFailed,
4402*67e74705SXin Li                                   ConvOvlResult);
4403*67e74705SXin Li     else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
4404*67e74705SXin Li       Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
4405*67e74705SXin Li     else
4406*67e74705SXin Li       Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed);
4407*67e74705SXin Li     return;
4408*67e74705SXin Li   } else {
4409*67e74705SXin Li     Sequence.AddConversionSequenceStep(ICS, TempEntity.getType());
4410*67e74705SXin Li   }
4411*67e74705SXin Li 
4412*67e74705SXin Li   //        [...] If T1 is reference-related to T2, cv1 must be the
4413*67e74705SXin Li   //        same cv-qualification as, or greater cv-qualification
4414*67e74705SXin Li   //        than, cv2; otherwise, the program is ill-formed.
4415*67e74705SXin Li   unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
4416*67e74705SXin Li   unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
4417*67e74705SXin Li   if (RefRelationship == Sema::Ref_Related &&
4418*67e74705SXin Li       (T1CVRQuals | T2CVRQuals) != T1CVRQuals) {
4419*67e74705SXin Li     Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
4420*67e74705SXin Li     return;
4421*67e74705SXin Li   }
4422*67e74705SXin Li 
4423*67e74705SXin Li   //   [...] If T1 is reference-related to T2 and the reference is an rvalue
4424*67e74705SXin Li   //   reference, the initializer expression shall not be an lvalue.
4425*67e74705SXin Li   if (RefRelationship >= Sema::Ref_Related && !isLValueRef &&
4426*67e74705SXin Li       InitCategory.isLValue()) {
4427*67e74705SXin Li     Sequence.SetFailed(
4428*67e74705SXin Li                     InitializationSequence::FK_RValueReferenceBindingToLValue);
4429*67e74705SXin Li     return;
4430*67e74705SXin Li   }
4431*67e74705SXin Li 
4432*67e74705SXin Li   Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true);
4433*67e74705SXin Li }
4434*67e74705SXin Li 
4435*67e74705SXin Li /// \brief Attempt character array initialization from a string literal
4436*67e74705SXin Li /// (C++ [dcl.init.string], C99 6.7.8).
TryStringLiteralInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,InitializationSequence & Sequence)4437*67e74705SXin Li static void TryStringLiteralInitialization(Sema &S,
4438*67e74705SXin Li                                            const InitializedEntity &Entity,
4439*67e74705SXin Li                                            const InitializationKind &Kind,
4440*67e74705SXin Li                                            Expr *Initializer,
4441*67e74705SXin Li                                        InitializationSequence &Sequence) {
4442*67e74705SXin Li   Sequence.AddStringInitStep(Entity.getType());
4443*67e74705SXin Li }
4444*67e74705SXin Li 
4445*67e74705SXin Li /// \brief Attempt value initialization (C++ [dcl.init]p7).
TryValueInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitializationSequence & Sequence,InitListExpr * InitList)4446*67e74705SXin Li static void TryValueInitialization(Sema &S,
4447*67e74705SXin Li                                    const InitializedEntity &Entity,
4448*67e74705SXin Li                                    const InitializationKind &Kind,
4449*67e74705SXin Li                                    InitializationSequence &Sequence,
4450*67e74705SXin Li                                    InitListExpr *InitList) {
4451*67e74705SXin Li   assert((!InitList || InitList->getNumInits() == 0) &&
4452*67e74705SXin Li          "Shouldn't use value-init for non-empty init lists");
4453*67e74705SXin Li 
4454*67e74705SXin Li   // C++98 [dcl.init]p5, C++11 [dcl.init]p7:
4455*67e74705SXin Li   //
4456*67e74705SXin Li   //   To value-initialize an object of type T means:
4457*67e74705SXin Li   QualType T = Entity.getType();
4458*67e74705SXin Li 
4459*67e74705SXin Li   //     -- if T is an array type, then each element is value-initialized;
4460*67e74705SXin Li   T = S.Context.getBaseElementType(T);
4461*67e74705SXin Li 
4462*67e74705SXin Li   if (const RecordType *RT = T->getAs<RecordType>()) {
4463*67e74705SXin Li     if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
4464*67e74705SXin Li       bool NeedZeroInitialization = true;
4465*67e74705SXin Li       if (!S.getLangOpts().CPlusPlus11) {
4466*67e74705SXin Li         // C++98:
4467*67e74705SXin Li         // -- if T is a class type (clause 9) with a user-declared constructor
4468*67e74705SXin Li         //    (12.1), then the default constructor for T is called (and the
4469*67e74705SXin Li         //    initialization is ill-formed if T has no accessible default
4470*67e74705SXin Li         //    constructor);
4471*67e74705SXin Li         if (ClassDecl->hasUserDeclaredConstructor())
4472*67e74705SXin Li           NeedZeroInitialization = false;
4473*67e74705SXin Li       } else {
4474*67e74705SXin Li         // C++11:
4475*67e74705SXin Li         // -- if T is a class type (clause 9) with either no default constructor
4476*67e74705SXin Li         //    (12.1 [class.ctor]) or a default constructor that is user-provided
4477*67e74705SXin Li         //    or deleted, then the object is default-initialized;
4478*67e74705SXin Li         CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl);
4479*67e74705SXin Li         if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted())
4480*67e74705SXin Li           NeedZeroInitialization = false;
4481*67e74705SXin Li       }
4482*67e74705SXin Li 
4483*67e74705SXin Li       // -- if T is a (possibly cv-qualified) non-union class type without a
4484*67e74705SXin Li       //    user-provided or deleted default constructor, then the object is
4485*67e74705SXin Li       //    zero-initialized and, if T has a non-trivial default constructor,
4486*67e74705SXin Li       //    default-initialized;
4487*67e74705SXin Li       // The 'non-union' here was removed by DR1502. The 'non-trivial default
4488*67e74705SXin Li       // constructor' part was removed by DR1507.
4489*67e74705SXin Li       if (NeedZeroInitialization)
4490*67e74705SXin Li         Sequence.AddZeroInitializationStep(Entity.getType());
4491*67e74705SXin Li 
4492*67e74705SXin Li       // C++03:
4493*67e74705SXin Li       // -- if T is a non-union class type without a user-declared constructor,
4494*67e74705SXin Li       //    then every non-static data member and base class component of T is
4495*67e74705SXin Li       //    value-initialized;
4496*67e74705SXin Li       // [...] A program that calls for [...] value-initialization of an
4497*67e74705SXin Li       // entity of reference type is ill-formed.
4498*67e74705SXin Li       //
4499*67e74705SXin Li       // C++11 doesn't need this handling, because value-initialization does not
4500*67e74705SXin Li       // occur recursively there, and the implicit default constructor is
4501*67e74705SXin Li       // defined as deleted in the problematic cases.
4502*67e74705SXin Li       if (!S.getLangOpts().CPlusPlus11 &&
4503*67e74705SXin Li           ClassDecl->hasUninitializedReferenceMember()) {
4504*67e74705SXin Li         Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForReference);
4505*67e74705SXin Li         return;
4506*67e74705SXin Li       }
4507*67e74705SXin Li 
4508*67e74705SXin Li       // If this is list-value-initialization, pass the empty init list on when
4509*67e74705SXin Li       // building the constructor call. This affects the semantics of a few
4510*67e74705SXin Li       // things (such as whether an explicit default constructor can be called).
4511*67e74705SXin Li       Expr *InitListAsExpr = InitList;
4512*67e74705SXin Li       MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);
4513*67e74705SXin Li       bool InitListSyntax = InitList;
4514*67e74705SXin Li 
4515*67e74705SXin Li       return TryConstructorInitialization(S, Entity, Kind, Args, T, Sequence,
4516*67e74705SXin Li                                           InitListSyntax);
4517*67e74705SXin Li     }
4518*67e74705SXin Li   }
4519*67e74705SXin Li 
4520*67e74705SXin Li   Sequence.AddZeroInitializationStep(Entity.getType());
4521*67e74705SXin Li }
4522*67e74705SXin Li 
4523*67e74705SXin Li /// \brief Attempt default initialization (C++ [dcl.init]p6).
TryDefaultInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitializationSequence & Sequence)4524*67e74705SXin Li static void TryDefaultInitialization(Sema &S,
4525*67e74705SXin Li                                      const InitializedEntity &Entity,
4526*67e74705SXin Li                                      const InitializationKind &Kind,
4527*67e74705SXin Li                                      InitializationSequence &Sequence) {
4528*67e74705SXin Li   assert(Kind.getKind() == InitializationKind::IK_Default);
4529*67e74705SXin Li 
4530*67e74705SXin Li   // C++ [dcl.init]p6:
4531*67e74705SXin Li   //   To default-initialize an object of type T means:
4532*67e74705SXin Li   //     - if T is an array type, each element is default-initialized;
4533*67e74705SXin Li   QualType DestType = S.Context.getBaseElementType(Entity.getType());
4534*67e74705SXin Li 
4535*67e74705SXin Li   //     - if T is a (possibly cv-qualified) class type (Clause 9), the default
4536*67e74705SXin Li   //       constructor for T is called (and the initialization is ill-formed if
4537*67e74705SXin Li   //       T has no accessible default constructor);
4538*67e74705SXin Li   if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {
4539*67e74705SXin Li     TryConstructorInitialization(S, Entity, Kind, None, DestType, Sequence);
4540*67e74705SXin Li     return;
4541*67e74705SXin Li   }
4542*67e74705SXin Li 
4543*67e74705SXin Li   //     - otherwise, no initialization is performed.
4544*67e74705SXin Li 
4545*67e74705SXin Li   //   If a program calls for the default initialization of an object of
4546*67e74705SXin Li   //   a const-qualified type T, T shall be a class type with a user-provided
4547*67e74705SXin Li   //   default constructor.
4548*67e74705SXin Li   if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
4549*67e74705SXin Li     if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
4550*67e74705SXin Li       Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
4551*67e74705SXin Li     return;
4552*67e74705SXin Li   }
4553*67e74705SXin Li 
4554*67e74705SXin Li   // If the destination type has a lifetime property, zero-initialize it.
4555*67e74705SXin Li   if (DestType.getQualifiers().hasObjCLifetime()) {
4556*67e74705SXin Li     Sequence.AddZeroInitializationStep(Entity.getType());
4557*67e74705SXin Li     return;
4558*67e74705SXin Li   }
4559*67e74705SXin Li }
4560*67e74705SXin Li 
4561*67e74705SXin Li /// \brief Attempt a user-defined conversion between two types (C++ [dcl.init]),
4562*67e74705SXin Li /// which enumerates all conversion functions and performs overload resolution
4563*67e74705SXin Li /// to select the best.
TryUserDefinedConversion(Sema & S,QualType DestType,const InitializationKind & Kind,Expr * Initializer,InitializationSequence & Sequence,bool TopLevelOfInitList)4564*67e74705SXin Li static void TryUserDefinedConversion(Sema &S,
4565*67e74705SXin Li                                      QualType DestType,
4566*67e74705SXin Li                                      const InitializationKind &Kind,
4567*67e74705SXin Li                                      Expr *Initializer,
4568*67e74705SXin Li                                      InitializationSequence &Sequence,
4569*67e74705SXin Li                                      bool TopLevelOfInitList) {
4570*67e74705SXin Li   assert(!DestType->isReferenceType() && "References are handled elsewhere");
4571*67e74705SXin Li   QualType SourceType = Initializer->getType();
4572*67e74705SXin Li   assert((DestType->isRecordType() || SourceType->isRecordType()) &&
4573*67e74705SXin Li          "Must have a class type to perform a user-defined conversion");
4574*67e74705SXin Li 
4575*67e74705SXin Li   // Build the candidate set directly in the initialization sequence
4576*67e74705SXin Li   // structure, so that it will persist if we fail.
4577*67e74705SXin Li   OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4578*67e74705SXin Li   CandidateSet.clear();
4579*67e74705SXin Li 
4580*67e74705SXin Li   // Determine whether we are allowed to call explicit constructors or
4581*67e74705SXin Li   // explicit conversion operators.
4582*67e74705SXin Li   bool AllowExplicit = Kind.AllowExplicit();
4583*67e74705SXin Li 
4584*67e74705SXin Li   if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) {
4585*67e74705SXin Li     // The type we're converting to is a class type. Enumerate its constructors
4586*67e74705SXin Li     // to see if there is a suitable conversion.
4587*67e74705SXin Li     CXXRecordDecl *DestRecordDecl
4588*67e74705SXin Li       = cast<CXXRecordDecl>(DestRecordType->getDecl());
4589*67e74705SXin Li 
4590*67e74705SXin Li     // Try to complete the type we're converting to.
4591*67e74705SXin Li     if (S.isCompleteType(Kind.getLocation(), DestType)) {
4592*67e74705SXin Li       DeclContext::lookup_result R = S.LookupConstructors(DestRecordDecl);
4593*67e74705SXin Li       // The container holding the constructors can under certain conditions
4594*67e74705SXin Li       // be changed while iterating. To be safe we copy the lookup results
4595*67e74705SXin Li       // to a new container.
4596*67e74705SXin Li       SmallVector<NamedDecl*, 8> CopyOfCon(R.begin(), R.end());
4597*67e74705SXin Li       for (SmallVectorImpl<NamedDecl *>::iterator
4598*67e74705SXin Li              Con = CopyOfCon.begin(), ConEnd = CopyOfCon.end();
4599*67e74705SXin Li            Con != ConEnd; ++Con) {
4600*67e74705SXin Li         NamedDecl *D = *Con;
4601*67e74705SXin Li         auto Info = getConstructorInfo(D);
4602*67e74705SXin Li         if (!Info.Constructor)
4603*67e74705SXin Li           continue;
4604*67e74705SXin Li 
4605*67e74705SXin Li         if (!Info.Constructor->isInvalidDecl() &&
4606*67e74705SXin Li             Info.Constructor->isConvertingConstructor(AllowExplicit)) {
4607*67e74705SXin Li           if (Info.ConstructorTmpl)
4608*67e74705SXin Li             S.AddTemplateOverloadCandidate(Info.ConstructorTmpl, Info.FoundDecl,
4609*67e74705SXin Li                                            /*ExplicitArgs*/ nullptr,
4610*67e74705SXin Li                                            Initializer, CandidateSet,
4611*67e74705SXin Li                                            /*SuppressUserConversions=*/true);
4612*67e74705SXin Li           else
4613*67e74705SXin Li             S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
4614*67e74705SXin Li                                    Initializer, CandidateSet,
4615*67e74705SXin Li                                    /*SuppressUserConversions=*/true);
4616*67e74705SXin Li         }
4617*67e74705SXin Li       }
4618*67e74705SXin Li     }
4619*67e74705SXin Li   }
4620*67e74705SXin Li 
4621*67e74705SXin Li   SourceLocation DeclLoc = Initializer->getLocStart();
4622*67e74705SXin Li 
4623*67e74705SXin Li   if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) {
4624*67e74705SXin Li     // The type we're converting from is a class type, enumerate its conversion
4625*67e74705SXin Li     // functions.
4626*67e74705SXin Li 
4627*67e74705SXin Li     // We can only enumerate the conversion functions for a complete type; if
4628*67e74705SXin Li     // the type isn't complete, simply skip this step.
4629*67e74705SXin Li     if (S.isCompleteType(DeclLoc, SourceType)) {
4630*67e74705SXin Li       CXXRecordDecl *SourceRecordDecl
4631*67e74705SXin Li         = cast<CXXRecordDecl>(SourceRecordType->getDecl());
4632*67e74705SXin Li 
4633*67e74705SXin Li       const auto &Conversions =
4634*67e74705SXin Li           SourceRecordDecl->getVisibleConversionFunctions();
4635*67e74705SXin Li       for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4636*67e74705SXin Li         NamedDecl *D = *I;
4637*67e74705SXin Li         CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4638*67e74705SXin Li         if (isa<UsingShadowDecl>(D))
4639*67e74705SXin Li           D = cast<UsingShadowDecl>(D)->getTargetDecl();
4640*67e74705SXin Li 
4641*67e74705SXin Li         FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4642*67e74705SXin Li         CXXConversionDecl *Conv;
4643*67e74705SXin Li         if (ConvTemplate)
4644*67e74705SXin Li           Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4645*67e74705SXin Li         else
4646*67e74705SXin Li           Conv = cast<CXXConversionDecl>(D);
4647*67e74705SXin Li 
4648*67e74705SXin Li         if (AllowExplicit || !Conv->isExplicit()) {
4649*67e74705SXin Li           if (ConvTemplate)
4650*67e74705SXin Li             S.AddTemplateConversionCandidate(ConvTemplate, I.getPair(),
4651*67e74705SXin Li                                              ActingDC, Initializer, DestType,
4652*67e74705SXin Li                                              CandidateSet, AllowExplicit);
4653*67e74705SXin Li           else
4654*67e74705SXin Li             S.AddConversionCandidate(Conv, I.getPair(), ActingDC,
4655*67e74705SXin Li                                      Initializer, DestType, CandidateSet,
4656*67e74705SXin Li                                      AllowExplicit);
4657*67e74705SXin Li         }
4658*67e74705SXin Li       }
4659*67e74705SXin Li     }
4660*67e74705SXin Li   }
4661*67e74705SXin Li 
4662*67e74705SXin Li   // Perform overload resolution. If it fails, return the failed result.
4663*67e74705SXin Li   OverloadCandidateSet::iterator Best;
4664*67e74705SXin Li   if (OverloadingResult Result
4665*67e74705SXin Li         = CandidateSet.BestViableFunction(S, DeclLoc, Best, true)) {
4666*67e74705SXin Li     Sequence.SetOverloadFailure(
4667*67e74705SXin Li                         InitializationSequence::FK_UserConversionOverloadFailed,
4668*67e74705SXin Li                                 Result);
4669*67e74705SXin Li     return;
4670*67e74705SXin Li   }
4671*67e74705SXin Li 
4672*67e74705SXin Li   FunctionDecl *Function = Best->Function;
4673*67e74705SXin Li   Function->setReferenced();
4674*67e74705SXin Li   bool HadMultipleCandidates = (CandidateSet.size() > 1);
4675*67e74705SXin Li 
4676*67e74705SXin Li   if (isa<CXXConstructorDecl>(Function)) {
4677*67e74705SXin Li     // Add the user-defined conversion step. Any cv-qualification conversion is
4678*67e74705SXin Li     // subsumed by the initialization. Per DR5, the created temporary is of the
4679*67e74705SXin Li     // cv-unqualified type of the destination.
4680*67e74705SXin Li     Sequence.AddUserConversionStep(Function, Best->FoundDecl,
4681*67e74705SXin Li                                    DestType.getUnqualifiedType(),
4682*67e74705SXin Li                                    HadMultipleCandidates);
4683*67e74705SXin Li     return;
4684*67e74705SXin Li   }
4685*67e74705SXin Li 
4686*67e74705SXin Li   // Add the user-defined conversion step that calls the conversion function.
4687*67e74705SXin Li   QualType ConvType = Function->getCallResultType();
4688*67e74705SXin Li   if (ConvType->getAs<RecordType>()) {
4689*67e74705SXin Li     // If we're converting to a class type, there may be an copy of
4690*67e74705SXin Li     // the resulting temporary object (possible to create an object of
4691*67e74705SXin Li     // a base class type). That copy is not a separate conversion, so
4692*67e74705SXin Li     // we just make a note of the actual destination type (possibly a
4693*67e74705SXin Li     // base class of the type returned by the conversion function) and
4694*67e74705SXin Li     // let the user-defined conversion step handle the conversion.
4695*67e74705SXin Li     Sequence.AddUserConversionStep(Function, Best->FoundDecl, DestType,
4696*67e74705SXin Li                                    HadMultipleCandidates);
4697*67e74705SXin Li     return;
4698*67e74705SXin Li   }
4699*67e74705SXin Li 
4700*67e74705SXin Li   Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
4701*67e74705SXin Li                                  HadMultipleCandidates);
4702*67e74705SXin Li 
4703*67e74705SXin Li   // If the conversion following the call to the conversion function
4704*67e74705SXin Li   // is interesting, add it as a separate step.
4705*67e74705SXin Li   if (Best->FinalConversion.First || Best->FinalConversion.Second ||
4706*67e74705SXin Li       Best->FinalConversion.Third) {
4707*67e74705SXin Li     ImplicitConversionSequence ICS;
4708*67e74705SXin Li     ICS.setStandard();
4709*67e74705SXin Li     ICS.Standard = Best->FinalConversion;
4710*67e74705SXin Li     Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
4711*67e74705SXin Li   }
4712*67e74705SXin Li }
4713*67e74705SXin Li 
4714*67e74705SXin Li /// An egregious hack for compatibility with libstdc++-4.2: in <tr1/hashtable>,
4715*67e74705SXin Li /// a function with a pointer return type contains a 'return false;' statement.
4716*67e74705SXin Li /// In C++11, 'false' is not a null pointer, so this breaks the build of any
4717*67e74705SXin Li /// code using that header.
4718*67e74705SXin Li ///
4719*67e74705SXin Li /// Work around this by treating 'return false;' as zero-initializing the result
4720*67e74705SXin Li /// if it's used in a pointer-returning function in a system header.
isLibstdcxxPointerReturnFalseHack(Sema & S,const InitializedEntity & Entity,const Expr * Init)4721*67e74705SXin Li static bool isLibstdcxxPointerReturnFalseHack(Sema &S,
4722*67e74705SXin Li                                               const InitializedEntity &Entity,
4723*67e74705SXin Li                                               const Expr *Init) {
4724*67e74705SXin Li   return S.getLangOpts().CPlusPlus11 &&
4725*67e74705SXin Li          Entity.getKind() == InitializedEntity::EK_Result &&
4726*67e74705SXin Li          Entity.getType()->isPointerType() &&
4727*67e74705SXin Li          isa<CXXBoolLiteralExpr>(Init) &&
4728*67e74705SXin Li          !cast<CXXBoolLiteralExpr>(Init)->getValue() &&
4729*67e74705SXin Li          S.getSourceManager().isInSystemHeader(Init->getExprLoc());
4730*67e74705SXin Li }
4731*67e74705SXin Li 
4732*67e74705SXin Li /// The non-zero enum values here are indexes into diagnostic alternatives.
4733*67e74705SXin Li enum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar };
4734*67e74705SXin Li 
4735*67e74705SXin Li /// Determines whether this expression is an acceptable ICR source.
isInvalidICRSource(ASTContext & C,Expr * e,bool isAddressOf,bool & isWeakAccess)4736*67e74705SXin Li static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e,
4737*67e74705SXin Li                                          bool isAddressOf, bool &isWeakAccess) {
4738*67e74705SXin Li   // Skip parens.
4739*67e74705SXin Li   e = e->IgnoreParens();
4740*67e74705SXin Li 
4741*67e74705SXin Li   // Skip address-of nodes.
4742*67e74705SXin Li   if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
4743*67e74705SXin Li     if (op->getOpcode() == UO_AddrOf)
4744*67e74705SXin Li       return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true,
4745*67e74705SXin Li                                 isWeakAccess);
4746*67e74705SXin Li 
4747*67e74705SXin Li   // Skip certain casts.
4748*67e74705SXin Li   } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
4749*67e74705SXin Li     switch (ce->getCastKind()) {
4750*67e74705SXin Li     case CK_Dependent:
4751*67e74705SXin Li     case CK_BitCast:
4752*67e74705SXin Li     case CK_LValueBitCast:
4753*67e74705SXin Li     case CK_NoOp:
4754*67e74705SXin Li       return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess);
4755*67e74705SXin Li 
4756*67e74705SXin Li     case CK_ArrayToPointerDecay:
4757*67e74705SXin Li       return IIK_nonscalar;
4758*67e74705SXin Li 
4759*67e74705SXin Li     case CK_NullToPointer:
4760*67e74705SXin Li       return IIK_okay;
4761*67e74705SXin Li 
4762*67e74705SXin Li     default:
4763*67e74705SXin Li       break;
4764*67e74705SXin Li     }
4765*67e74705SXin Li 
4766*67e74705SXin Li   // If we have a declaration reference, it had better be a local variable.
4767*67e74705SXin Li   } else if (isa<DeclRefExpr>(e)) {
4768*67e74705SXin Li     // set isWeakAccess to true, to mean that there will be an implicit
4769*67e74705SXin Li     // load which requires a cleanup.
4770*67e74705SXin Li     if (e->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
4771*67e74705SXin Li       isWeakAccess = true;
4772*67e74705SXin Li 
4773*67e74705SXin Li     if (!isAddressOf) return IIK_nonlocal;
4774*67e74705SXin Li 
4775*67e74705SXin Li     VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
4776*67e74705SXin Li     if (!var) return IIK_nonlocal;
4777*67e74705SXin Li 
4778*67e74705SXin Li     return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
4779*67e74705SXin Li 
4780*67e74705SXin Li   // If we have a conditional operator, check both sides.
4781*67e74705SXin Li   } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
4782*67e74705SXin Li     if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf,
4783*67e74705SXin Li                                                 isWeakAccess))
4784*67e74705SXin Li       return iik;
4785*67e74705SXin Li 
4786*67e74705SXin Li     return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess);
4787*67e74705SXin Li 
4788*67e74705SXin Li   // These are never scalar.
4789*67e74705SXin Li   } else if (isa<ArraySubscriptExpr>(e)) {
4790*67e74705SXin Li     return IIK_nonscalar;
4791*67e74705SXin Li 
4792*67e74705SXin Li   // Otherwise, it needs to be a null pointer constant.
4793*67e74705SXin Li   } else {
4794*67e74705SXin Li     return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull)
4795*67e74705SXin Li             ? IIK_okay : IIK_nonlocal);
4796*67e74705SXin Li   }
4797*67e74705SXin Li 
4798*67e74705SXin Li   return IIK_nonlocal;
4799*67e74705SXin Li }
4800*67e74705SXin Li 
4801*67e74705SXin Li /// Check whether the given expression is a valid operand for an
4802*67e74705SXin Li /// indirect copy/restore.
checkIndirectCopyRestoreSource(Sema & S,Expr * src)4803*67e74705SXin Li static void checkIndirectCopyRestoreSource(Sema &S, Expr *src) {
4804*67e74705SXin Li   assert(src->isRValue());
4805*67e74705SXin Li   bool isWeakAccess = false;
4806*67e74705SXin Li   InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess);
4807*67e74705SXin Li   // If isWeakAccess to true, there will be an implicit
4808*67e74705SXin Li   // load which requires a cleanup.
4809*67e74705SXin Li   if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess)
4810*67e74705SXin Li     S.Cleanup.setExprNeedsCleanups(true);
4811*67e74705SXin Li 
4812*67e74705SXin Li   if (iik == IIK_okay) return;
4813*67e74705SXin Li 
4814*67e74705SXin Li   S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
4815*67e74705SXin Li     << ((unsigned) iik - 1)  // shift index into diagnostic explanations
4816*67e74705SXin Li     << src->getSourceRange();
4817*67e74705SXin Li }
4818*67e74705SXin Li 
4819*67e74705SXin Li /// \brief Determine whether we have compatible array types for the
4820*67e74705SXin Li /// purposes of GNU by-copy array initialization.
hasCompatibleArrayTypes(ASTContext & Context,const ArrayType * Dest,const ArrayType * Source)4821*67e74705SXin Li static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest,
4822*67e74705SXin Li                                     const ArrayType *Source) {
4823*67e74705SXin Li   // If the source and destination array types are equivalent, we're
4824*67e74705SXin Li   // done.
4825*67e74705SXin Li   if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0)))
4826*67e74705SXin Li     return true;
4827*67e74705SXin Li 
4828*67e74705SXin Li   // Make sure that the element types are the same.
4829*67e74705SXin Li   if (!Context.hasSameType(Dest->getElementType(), Source->getElementType()))
4830*67e74705SXin Li     return false;
4831*67e74705SXin Li 
4832*67e74705SXin Li   // The only mismatch we allow is when the destination is an
4833*67e74705SXin Li   // incomplete array type and the source is a constant array type.
4834*67e74705SXin Li   return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
4835*67e74705SXin Li }
4836*67e74705SXin Li 
tryObjCWritebackConversion(Sema & S,InitializationSequence & Sequence,const InitializedEntity & Entity,Expr * Initializer)4837*67e74705SXin Li static bool tryObjCWritebackConversion(Sema &S,
4838*67e74705SXin Li                                        InitializationSequence &Sequence,
4839*67e74705SXin Li                                        const InitializedEntity &Entity,
4840*67e74705SXin Li                                        Expr *Initializer) {
4841*67e74705SXin Li   bool ArrayDecay = false;
4842*67e74705SXin Li   QualType ArgType = Initializer->getType();
4843*67e74705SXin Li   QualType ArgPointee;
4844*67e74705SXin Li   if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
4845*67e74705SXin Li     ArrayDecay = true;
4846*67e74705SXin Li     ArgPointee = ArgArrayType->getElementType();
4847*67e74705SXin Li     ArgType = S.Context.getPointerType(ArgPointee);
4848*67e74705SXin Li   }
4849*67e74705SXin Li 
4850*67e74705SXin Li   // Handle write-back conversion.
4851*67e74705SXin Li   QualType ConvertedArgType;
4852*67e74705SXin Li   if (!S.isObjCWritebackConversion(ArgType, Entity.getType(),
4853*67e74705SXin Li                                    ConvertedArgType))
4854*67e74705SXin Li     return false;
4855*67e74705SXin Li 
4856*67e74705SXin Li   // We should copy unless we're passing to an argument explicitly
4857*67e74705SXin Li   // marked 'out'.
4858*67e74705SXin Li   bool ShouldCopy = true;
4859*67e74705SXin Li   if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
4860*67e74705SXin Li     ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
4861*67e74705SXin Li 
4862*67e74705SXin Li   // Do we need an lvalue conversion?
4863*67e74705SXin Li   if (ArrayDecay || Initializer->isGLValue()) {
4864*67e74705SXin Li     ImplicitConversionSequence ICS;
4865*67e74705SXin Li     ICS.setStandard();
4866*67e74705SXin Li     ICS.Standard.setAsIdentityConversion();
4867*67e74705SXin Li 
4868*67e74705SXin Li     QualType ResultType;
4869*67e74705SXin Li     if (ArrayDecay) {
4870*67e74705SXin Li       ICS.Standard.First = ICK_Array_To_Pointer;
4871*67e74705SXin Li       ResultType = S.Context.getPointerType(ArgPointee);
4872*67e74705SXin Li     } else {
4873*67e74705SXin Li       ICS.Standard.First = ICK_Lvalue_To_Rvalue;
4874*67e74705SXin Li       ResultType = Initializer->getType().getNonLValueExprType(S.Context);
4875*67e74705SXin Li     }
4876*67e74705SXin Li 
4877*67e74705SXin Li     Sequence.AddConversionSequenceStep(ICS, ResultType);
4878*67e74705SXin Li   }
4879*67e74705SXin Li 
4880*67e74705SXin Li   Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
4881*67e74705SXin Li   return true;
4882*67e74705SXin Li }
4883*67e74705SXin Li 
TryOCLSamplerInitialization(Sema & S,InitializationSequence & Sequence,QualType DestType,Expr * Initializer)4884*67e74705SXin Li static bool TryOCLSamplerInitialization(Sema &S,
4885*67e74705SXin Li                                         InitializationSequence &Sequence,
4886*67e74705SXin Li                                         QualType DestType,
4887*67e74705SXin Li                                         Expr *Initializer) {
4888*67e74705SXin Li   if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
4889*67e74705SXin Li     !Initializer->isIntegerConstantExpr(S.getASTContext()))
4890*67e74705SXin Li     return false;
4891*67e74705SXin Li 
4892*67e74705SXin Li   Sequence.AddOCLSamplerInitStep(DestType);
4893*67e74705SXin Li   return true;
4894*67e74705SXin Li }
4895*67e74705SXin Li 
4896*67e74705SXin Li //
4897*67e74705SXin Li // OpenCL 1.2 spec, s6.12.10
4898*67e74705SXin Li //
4899*67e74705SXin Li // The event argument can also be used to associate the
4900*67e74705SXin Li // async_work_group_copy with a previous async copy allowing
4901*67e74705SXin Li // an event to be shared by multiple async copies; otherwise
4902*67e74705SXin Li // event should be zero.
4903*67e74705SXin Li //
TryOCLZeroEventInitialization(Sema & S,InitializationSequence & Sequence,QualType DestType,Expr * Initializer)4904*67e74705SXin Li static bool TryOCLZeroEventInitialization(Sema &S,
4905*67e74705SXin Li                                           InitializationSequence &Sequence,
4906*67e74705SXin Li                                           QualType DestType,
4907*67e74705SXin Li                                           Expr *Initializer) {
4908*67e74705SXin Li   if (!S.getLangOpts().OpenCL || !DestType->isEventT() ||
4909*67e74705SXin Li       !Initializer->isIntegerConstantExpr(S.getASTContext()) ||
4910*67e74705SXin Li       (Initializer->EvaluateKnownConstInt(S.getASTContext()) != 0))
4911*67e74705SXin Li     return false;
4912*67e74705SXin Li 
4913*67e74705SXin Li   Sequence.AddOCLZeroEventStep(DestType);
4914*67e74705SXin Li   return true;
4915*67e74705SXin Li }
4916*67e74705SXin Li 
InitializationSequence(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,bool TopLevelOfInitList,bool TreatUnavailableAsInvalid)4917*67e74705SXin Li InitializationSequence::InitializationSequence(Sema &S,
4918*67e74705SXin Li                                                const InitializedEntity &Entity,
4919*67e74705SXin Li                                                const InitializationKind &Kind,
4920*67e74705SXin Li                                                MultiExprArg Args,
4921*67e74705SXin Li                                                bool TopLevelOfInitList,
4922*67e74705SXin Li                                                bool TreatUnavailableAsInvalid)
4923*67e74705SXin Li     : FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) {
4924*67e74705SXin Li   InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList,
4925*67e74705SXin Li                  TreatUnavailableAsInvalid);
4926*67e74705SXin Li }
4927*67e74705SXin Li 
4928*67e74705SXin Li /// Tries to get a FunctionDecl out of `E`. If it succeeds and we can take the
4929*67e74705SXin Li /// address of that function, this returns true. Otherwise, it returns false.
isExprAnUnaddressableFunction(Sema & S,const Expr * E)4930*67e74705SXin Li static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E) {
4931*67e74705SXin Li   auto *DRE = dyn_cast<DeclRefExpr>(E);
4932*67e74705SXin Li   if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
4933*67e74705SXin Li     return false;
4934*67e74705SXin Li 
4935*67e74705SXin Li   return !S.checkAddressOfFunctionIsAvailable(
4936*67e74705SXin Li       cast<FunctionDecl>(DRE->getDecl()));
4937*67e74705SXin Li }
4938*67e74705SXin Li 
InitializeFrom(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,bool TopLevelOfInitList,bool TreatUnavailableAsInvalid)4939*67e74705SXin Li void InitializationSequence::InitializeFrom(Sema &S,
4940*67e74705SXin Li                                             const InitializedEntity &Entity,
4941*67e74705SXin Li                                             const InitializationKind &Kind,
4942*67e74705SXin Li                                             MultiExprArg Args,
4943*67e74705SXin Li                                             bool TopLevelOfInitList,
4944*67e74705SXin Li                                             bool TreatUnavailableAsInvalid) {
4945*67e74705SXin Li   ASTContext &Context = S.Context;
4946*67e74705SXin Li 
4947*67e74705SXin Li   // Eliminate non-overload placeholder types in the arguments.  We
4948*67e74705SXin Li   // need to do this before checking whether types are dependent
4949*67e74705SXin Li   // because lowering a pseudo-object expression might well give us
4950*67e74705SXin Li   // something of dependent type.
4951*67e74705SXin Li   for (unsigned I = 0, E = Args.size(); I != E; ++I)
4952*67e74705SXin Li     if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
4953*67e74705SXin Li       // FIXME: should we be doing this here?
4954*67e74705SXin Li       ExprResult result = S.CheckPlaceholderExpr(Args[I]);
4955*67e74705SXin Li       if (result.isInvalid()) {
4956*67e74705SXin Li         SetFailed(FK_PlaceholderType);
4957*67e74705SXin Li         return;
4958*67e74705SXin Li       }
4959*67e74705SXin Li       Args[I] = result.get();
4960*67e74705SXin Li     }
4961*67e74705SXin Li 
4962*67e74705SXin Li   // C++0x [dcl.init]p16:
4963*67e74705SXin Li   //   The semantics of initializers are as follows. The destination type is
4964*67e74705SXin Li   //   the type of the object or reference being initialized and the source
4965*67e74705SXin Li   //   type is the type of the initializer expression. The source type is not
4966*67e74705SXin Li   //   defined when the initializer is a braced-init-list or when it is a
4967*67e74705SXin Li   //   parenthesized list of expressions.
4968*67e74705SXin Li   QualType DestType = Entity.getType();
4969*67e74705SXin Li 
4970*67e74705SXin Li   if (DestType->isDependentType() ||
4971*67e74705SXin Li       Expr::hasAnyTypeDependentArguments(Args)) {
4972*67e74705SXin Li     SequenceKind = DependentSequence;
4973*67e74705SXin Li     return;
4974*67e74705SXin Li   }
4975*67e74705SXin Li 
4976*67e74705SXin Li   // Almost everything is a normal sequence.
4977*67e74705SXin Li   setSequenceKind(NormalSequence);
4978*67e74705SXin Li 
4979*67e74705SXin Li   QualType SourceType;
4980*67e74705SXin Li   Expr *Initializer = nullptr;
4981*67e74705SXin Li   if (Args.size() == 1) {
4982*67e74705SXin Li     Initializer = Args[0];
4983*67e74705SXin Li     if (S.getLangOpts().ObjC1) {
4984*67e74705SXin Li       if (S.CheckObjCBridgeRelatedConversions(Initializer->getLocStart(),
4985*67e74705SXin Li                                               DestType, Initializer->getType(),
4986*67e74705SXin Li                                               Initializer) ||
4987*67e74705SXin Li           S.ConversionToObjCStringLiteralCheck(DestType, Initializer))
4988*67e74705SXin Li         Args[0] = Initializer;
4989*67e74705SXin Li     }
4990*67e74705SXin Li     if (!isa<InitListExpr>(Initializer))
4991*67e74705SXin Li       SourceType = Initializer->getType();
4992*67e74705SXin Li   }
4993*67e74705SXin Li 
4994*67e74705SXin Li   //     - If the initializer is a (non-parenthesized) braced-init-list, the
4995*67e74705SXin Li   //       object is list-initialized (8.5.4).
4996*67e74705SXin Li   if (Kind.getKind() != InitializationKind::IK_Direct) {
4997*67e74705SXin Li     if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) {
4998*67e74705SXin Li       TryListInitialization(S, Entity, Kind, InitList, *this,
4999*67e74705SXin Li                             TreatUnavailableAsInvalid);
5000*67e74705SXin Li       return;
5001*67e74705SXin Li     }
5002*67e74705SXin Li   }
5003*67e74705SXin Li 
5004*67e74705SXin Li   //     - If the destination type is a reference type, see 8.5.3.
5005*67e74705SXin Li   if (DestType->isReferenceType()) {
5006*67e74705SXin Li     // C++0x [dcl.init.ref]p1:
5007*67e74705SXin Li     //   A variable declared to be a T& or T&&, that is, "reference to type T"
5008*67e74705SXin Li     //   (8.3.2), shall be initialized by an object, or function, of type T or
5009*67e74705SXin Li     //   by an object that can be converted into a T.
5010*67e74705SXin Li     // (Therefore, multiple arguments are not permitted.)
5011*67e74705SXin Li     if (Args.size() != 1)
5012*67e74705SXin Li       SetFailed(FK_TooManyInitsForReference);
5013*67e74705SXin Li     else
5014*67e74705SXin Li       TryReferenceInitialization(S, Entity, Kind, Args[0], *this);
5015*67e74705SXin Li     return;
5016*67e74705SXin Li   }
5017*67e74705SXin Li 
5018*67e74705SXin Li   //     - If the initializer is (), the object is value-initialized.
5019*67e74705SXin Li   if (Kind.getKind() == InitializationKind::IK_Value ||
5020*67e74705SXin Li       (Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) {
5021*67e74705SXin Li     TryValueInitialization(S, Entity, Kind, *this);
5022*67e74705SXin Li     return;
5023*67e74705SXin Li   }
5024*67e74705SXin Li 
5025*67e74705SXin Li   // Handle default initialization.
5026*67e74705SXin Li   if (Kind.getKind() == InitializationKind::IK_Default) {
5027*67e74705SXin Li     TryDefaultInitialization(S, Entity, Kind, *this);
5028*67e74705SXin Li     return;
5029*67e74705SXin Li   }
5030*67e74705SXin Li 
5031*67e74705SXin Li   //     - If the destination type is an array of characters, an array of
5032*67e74705SXin Li   //       char16_t, an array of char32_t, or an array of wchar_t, and the
5033*67e74705SXin Li   //       initializer is a string literal, see 8.5.2.
5034*67e74705SXin Li   //     - Otherwise, if the destination type is an array, the program is
5035*67e74705SXin Li   //       ill-formed.
5036*67e74705SXin Li   if (const ArrayType *DestAT = Context.getAsArrayType(DestType)) {
5037*67e74705SXin Li     if (Initializer && isa<VariableArrayType>(DestAT)) {
5038*67e74705SXin Li       SetFailed(FK_VariableLengthArrayHasInitializer);
5039*67e74705SXin Li       return;
5040*67e74705SXin Li     }
5041*67e74705SXin Li 
5042*67e74705SXin Li     if (Initializer) {
5043*67e74705SXin Li       switch (IsStringInit(Initializer, DestAT, Context)) {
5044*67e74705SXin Li       case SIF_None:
5045*67e74705SXin Li         TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this);
5046*67e74705SXin Li         return;
5047*67e74705SXin Li       case SIF_NarrowStringIntoWideChar:
5048*67e74705SXin Li         SetFailed(FK_NarrowStringIntoWideCharArray);
5049*67e74705SXin Li         return;
5050*67e74705SXin Li       case SIF_WideStringIntoChar:
5051*67e74705SXin Li         SetFailed(FK_WideStringIntoCharArray);
5052*67e74705SXin Li         return;
5053*67e74705SXin Li       case SIF_IncompatWideStringIntoWideChar:
5054*67e74705SXin Li         SetFailed(FK_IncompatWideStringIntoWideChar);
5055*67e74705SXin Li         return;
5056*67e74705SXin Li       case SIF_Other:
5057*67e74705SXin Li         break;
5058*67e74705SXin Li       }
5059*67e74705SXin Li     }
5060*67e74705SXin Li 
5061*67e74705SXin Li     // Note: as an GNU C extension, we allow initialization of an
5062*67e74705SXin Li     // array from a compound literal that creates an array of the same
5063*67e74705SXin Li     // type, so long as the initializer has no side effects.
5064*67e74705SXin Li     if (!S.getLangOpts().CPlusPlus && Initializer &&
5065*67e74705SXin Li         isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) &&
5066*67e74705SXin Li         Initializer->getType()->isArrayType()) {
5067*67e74705SXin Li       const ArrayType *SourceAT
5068*67e74705SXin Li         = Context.getAsArrayType(Initializer->getType());
5069*67e74705SXin Li       if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT))
5070*67e74705SXin Li         SetFailed(FK_ArrayTypeMismatch);
5071*67e74705SXin Li       else if (Initializer->HasSideEffects(S.Context))
5072*67e74705SXin Li         SetFailed(FK_NonConstantArrayInit);
5073*67e74705SXin Li       else {
5074*67e74705SXin Li         AddArrayInitStep(DestType);
5075*67e74705SXin Li       }
5076*67e74705SXin Li     }
5077*67e74705SXin Li     // Note: as a GNU C++ extension, we allow list-initialization of a
5078*67e74705SXin Li     // class member of array type from a parenthesized initializer list.
5079*67e74705SXin Li     else if (S.getLangOpts().CPlusPlus &&
5080*67e74705SXin Li              Entity.getKind() == InitializedEntity::EK_Member &&
5081*67e74705SXin Li              Initializer && isa<InitListExpr>(Initializer)) {
5082*67e74705SXin Li       TryListInitialization(S, Entity, Kind, cast<InitListExpr>(Initializer),
5083*67e74705SXin Li                             *this, TreatUnavailableAsInvalid);
5084*67e74705SXin Li       AddParenthesizedArrayInitStep(DestType);
5085*67e74705SXin Li     } else if (DestAT->getElementType()->isCharType())
5086*67e74705SXin Li       SetFailed(FK_ArrayNeedsInitListOrStringLiteral);
5087*67e74705SXin Li     else if (IsWideCharCompatible(DestAT->getElementType(), Context))
5088*67e74705SXin Li       SetFailed(FK_ArrayNeedsInitListOrWideStringLiteral);
5089*67e74705SXin Li     else
5090*67e74705SXin Li       SetFailed(FK_ArrayNeedsInitList);
5091*67e74705SXin Li 
5092*67e74705SXin Li     return;
5093*67e74705SXin Li   }
5094*67e74705SXin Li 
5095*67e74705SXin Li   // Determine whether we should consider writeback conversions for
5096*67e74705SXin Li   // Objective-C ARC.
5097*67e74705SXin Li   bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount &&
5098*67e74705SXin Li          Entity.isParameterKind();
5099*67e74705SXin Li 
5100*67e74705SXin Li   // We're at the end of the line for C: it's either a write-back conversion
5101*67e74705SXin Li   // or it's a C assignment. There's no need to check anything else.
5102*67e74705SXin Li   if (!S.getLangOpts().CPlusPlus) {
5103*67e74705SXin Li     // If allowed, check whether this is an Objective-C writeback conversion.
5104*67e74705SXin Li     if (allowObjCWritebackConversion &&
5105*67e74705SXin Li         tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
5106*67e74705SXin Li       return;
5107*67e74705SXin Li     }
5108*67e74705SXin Li 
5109*67e74705SXin Li     if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
5110*67e74705SXin Li       return;
5111*67e74705SXin Li 
5112*67e74705SXin Li     if (TryOCLZeroEventInitialization(S, *this, DestType, Initializer))
5113*67e74705SXin Li       return;
5114*67e74705SXin Li 
5115*67e74705SXin Li     // Handle initialization in C
5116*67e74705SXin Li     AddCAssignmentStep(DestType);
5117*67e74705SXin Li     MaybeProduceObjCObject(S, *this, Entity);
5118*67e74705SXin Li     return;
5119*67e74705SXin Li   }
5120*67e74705SXin Li 
5121*67e74705SXin Li   assert(S.getLangOpts().CPlusPlus);
5122*67e74705SXin Li 
5123*67e74705SXin Li   //     - If the destination type is a (possibly cv-qualified) class type:
5124*67e74705SXin Li   if (DestType->isRecordType()) {
5125*67e74705SXin Li     //     - If the initialization is direct-initialization, or if it is
5126*67e74705SXin Li     //       copy-initialization where the cv-unqualified version of the
5127*67e74705SXin Li     //       source type is the same class as, or a derived class of, the
5128*67e74705SXin Li     //       class of the destination, constructors are considered. [...]
5129*67e74705SXin Li     if (Kind.getKind() == InitializationKind::IK_Direct ||
5130*67e74705SXin Li         (Kind.getKind() == InitializationKind::IK_Copy &&
5131*67e74705SXin Li          (Context.hasSameUnqualifiedType(SourceType, DestType) ||
5132*67e74705SXin Li           S.IsDerivedFrom(Initializer->getLocStart(), SourceType, DestType))))
5133*67e74705SXin Li       TryConstructorInitialization(S, Entity, Kind, Args,
5134*67e74705SXin Li                                    DestType, *this);
5135*67e74705SXin Li     //     - Otherwise (i.e., for the remaining copy-initialization cases),
5136*67e74705SXin Li     //       user-defined conversion sequences that can convert from the source
5137*67e74705SXin Li     //       type to the destination type or (when a conversion function is
5138*67e74705SXin Li     //       used) to a derived class thereof are enumerated as described in
5139*67e74705SXin Li     //       13.3.1.4, and the best one is chosen through overload resolution
5140*67e74705SXin Li     //       (13.3).
5141*67e74705SXin Li     else
5142*67e74705SXin Li       TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
5143*67e74705SXin Li                                TopLevelOfInitList);
5144*67e74705SXin Li     return;
5145*67e74705SXin Li   }
5146*67e74705SXin Li 
5147*67e74705SXin Li   if (Args.size() > 1) {
5148*67e74705SXin Li     SetFailed(FK_TooManyInitsForScalar);
5149*67e74705SXin Li     return;
5150*67e74705SXin Li   }
5151*67e74705SXin Li   assert(Args.size() == 1 && "Zero-argument case handled above");
5152*67e74705SXin Li 
5153*67e74705SXin Li   //    - Otherwise, if the source type is a (possibly cv-qualified) class
5154*67e74705SXin Li   //      type, conversion functions are considered.
5155*67e74705SXin Li   if (!SourceType.isNull() && SourceType->isRecordType()) {
5156*67e74705SXin Li     // For a conversion to _Atomic(T) from either T or a class type derived
5157*67e74705SXin Li     // from T, initialize the T object then convert to _Atomic type.
5158*67e74705SXin Li     bool NeedAtomicConversion = false;
5159*67e74705SXin Li     if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) {
5160*67e74705SXin Li       if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) ||
5161*67e74705SXin Li           S.IsDerivedFrom(Initializer->getLocStart(), SourceType,
5162*67e74705SXin Li                           Atomic->getValueType())) {
5163*67e74705SXin Li         DestType = Atomic->getValueType();
5164*67e74705SXin Li         NeedAtomicConversion = true;
5165*67e74705SXin Li       }
5166*67e74705SXin Li     }
5167*67e74705SXin Li 
5168*67e74705SXin Li     TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
5169*67e74705SXin Li                              TopLevelOfInitList);
5170*67e74705SXin Li     MaybeProduceObjCObject(S, *this, Entity);
5171*67e74705SXin Li     if (!Failed() && NeedAtomicConversion)
5172*67e74705SXin Li       AddAtomicConversionStep(Entity.getType());
5173*67e74705SXin Li     return;
5174*67e74705SXin Li   }
5175*67e74705SXin Li 
5176*67e74705SXin Li   //    - Otherwise, the initial value of the object being initialized is the
5177*67e74705SXin Li   //      (possibly converted) value of the initializer expression. Standard
5178*67e74705SXin Li   //      conversions (Clause 4) will be used, if necessary, to convert the
5179*67e74705SXin Li   //      initializer expression to the cv-unqualified version of the
5180*67e74705SXin Li   //      destination type; no user-defined conversions are considered.
5181*67e74705SXin Li 
5182*67e74705SXin Li   ImplicitConversionSequence ICS
5183*67e74705SXin Li     = S.TryImplicitConversion(Initializer, DestType,
5184*67e74705SXin Li                               /*SuppressUserConversions*/true,
5185*67e74705SXin Li                               /*AllowExplicitConversions*/ false,
5186*67e74705SXin Li                               /*InOverloadResolution*/ false,
5187*67e74705SXin Li                               /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
5188*67e74705SXin Li                               allowObjCWritebackConversion);
5189*67e74705SXin Li 
5190*67e74705SXin Li   if (ICS.isStandard() &&
5191*67e74705SXin Li       ICS.Standard.Second == ICK_Writeback_Conversion) {
5192*67e74705SXin Li     // Objective-C ARC writeback conversion.
5193*67e74705SXin Li 
5194*67e74705SXin Li     // We should copy unless we're passing to an argument explicitly
5195*67e74705SXin Li     // marked 'out'.
5196*67e74705SXin Li     bool ShouldCopy = true;
5197*67e74705SXin Li     if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
5198*67e74705SXin Li       ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
5199*67e74705SXin Li 
5200*67e74705SXin Li     // If there was an lvalue adjustment, add it as a separate conversion.
5201*67e74705SXin Li     if (ICS.Standard.First == ICK_Array_To_Pointer ||
5202*67e74705SXin Li         ICS.Standard.First == ICK_Lvalue_To_Rvalue) {
5203*67e74705SXin Li       ImplicitConversionSequence LvalueICS;
5204*67e74705SXin Li       LvalueICS.setStandard();
5205*67e74705SXin Li       LvalueICS.Standard.setAsIdentityConversion();
5206*67e74705SXin Li       LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
5207*67e74705SXin Li       LvalueICS.Standard.First = ICS.Standard.First;
5208*67e74705SXin Li       AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
5209*67e74705SXin Li     }
5210*67e74705SXin Li 
5211*67e74705SXin Li     AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy);
5212*67e74705SXin Li   } else if (ICS.isBad()) {
5213*67e74705SXin Li     DeclAccessPair dap;
5214*67e74705SXin Li     if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer)) {
5215*67e74705SXin Li       AddZeroInitializationStep(Entity.getType());
5216*67e74705SXin Li     } else if (Initializer->getType() == Context.OverloadTy &&
5217*67e74705SXin Li                !S.ResolveAddressOfOverloadedFunction(Initializer, DestType,
5218*67e74705SXin Li                                                      false, dap))
5219*67e74705SXin Li       SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
5220*67e74705SXin Li     else if (Initializer->getType()->isFunctionType() &&
5221*67e74705SXin Li              isExprAnUnaddressableFunction(S, Initializer))
5222*67e74705SXin Li       SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction);
5223*67e74705SXin Li     else
5224*67e74705SXin Li       SetFailed(InitializationSequence::FK_ConversionFailed);
5225*67e74705SXin Li   } else {
5226*67e74705SXin Li     AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
5227*67e74705SXin Li 
5228*67e74705SXin Li     MaybeProduceObjCObject(S, *this, Entity);
5229*67e74705SXin Li   }
5230*67e74705SXin Li }
5231*67e74705SXin Li 
~InitializationSequence()5232*67e74705SXin Li InitializationSequence::~InitializationSequence() {
5233*67e74705SXin Li   for (auto &S : Steps)
5234*67e74705SXin Li     S.Destroy();
5235*67e74705SXin Li }
5236*67e74705SXin Li 
5237*67e74705SXin Li //===----------------------------------------------------------------------===//
5238*67e74705SXin Li // Perform initialization
5239*67e74705SXin Li //===----------------------------------------------------------------------===//
5240*67e74705SXin Li static Sema::AssignmentAction
getAssignmentAction(const InitializedEntity & Entity,bool Diagnose=false)5241*67e74705SXin Li getAssignmentAction(const InitializedEntity &Entity, bool Diagnose = false) {
5242*67e74705SXin Li   switch(Entity.getKind()) {
5243*67e74705SXin Li   case InitializedEntity::EK_Variable:
5244*67e74705SXin Li   case InitializedEntity::EK_New:
5245*67e74705SXin Li   case InitializedEntity::EK_Exception:
5246*67e74705SXin Li   case InitializedEntity::EK_Base:
5247*67e74705SXin Li   case InitializedEntity::EK_Delegating:
5248*67e74705SXin Li     return Sema::AA_Initializing;
5249*67e74705SXin Li 
5250*67e74705SXin Li   case InitializedEntity::EK_Parameter:
5251*67e74705SXin Li     if (Entity.getDecl() &&
5252*67e74705SXin Li         isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
5253*67e74705SXin Li       return Sema::AA_Sending;
5254*67e74705SXin Li 
5255*67e74705SXin Li     return Sema::AA_Passing;
5256*67e74705SXin Li 
5257*67e74705SXin Li   case InitializedEntity::EK_Parameter_CF_Audited:
5258*67e74705SXin Li     if (Entity.getDecl() &&
5259*67e74705SXin Li       isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
5260*67e74705SXin Li       return Sema::AA_Sending;
5261*67e74705SXin Li 
5262*67e74705SXin Li     return !Diagnose ? Sema::AA_Passing : Sema::AA_Passing_CFAudited;
5263*67e74705SXin Li 
5264*67e74705SXin Li   case InitializedEntity::EK_Result:
5265*67e74705SXin Li     return Sema::AA_Returning;
5266*67e74705SXin Li 
5267*67e74705SXin Li   case InitializedEntity::EK_Temporary:
5268*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
5269*67e74705SXin Li     // FIXME: Can we tell apart casting vs. converting?
5270*67e74705SXin Li     return Sema::AA_Casting;
5271*67e74705SXin Li 
5272*67e74705SXin Li   case InitializedEntity::EK_Member:
5273*67e74705SXin Li   case InitializedEntity::EK_ArrayElement:
5274*67e74705SXin Li   case InitializedEntity::EK_VectorElement:
5275*67e74705SXin Li   case InitializedEntity::EK_ComplexElement:
5276*67e74705SXin Li   case InitializedEntity::EK_BlockElement:
5277*67e74705SXin Li   case InitializedEntity::EK_LambdaCapture:
5278*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
5279*67e74705SXin Li     return Sema::AA_Initializing;
5280*67e74705SXin Li   }
5281*67e74705SXin Li 
5282*67e74705SXin Li   llvm_unreachable("Invalid EntityKind!");
5283*67e74705SXin Li }
5284*67e74705SXin Li 
5285*67e74705SXin Li /// \brief Whether we should bind a created object as a temporary when
5286*67e74705SXin Li /// initializing the given entity.
shouldBindAsTemporary(const InitializedEntity & Entity)5287*67e74705SXin Li static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
5288*67e74705SXin Li   switch (Entity.getKind()) {
5289*67e74705SXin Li   case InitializedEntity::EK_ArrayElement:
5290*67e74705SXin Li   case InitializedEntity::EK_Member:
5291*67e74705SXin Li   case InitializedEntity::EK_Result:
5292*67e74705SXin Li   case InitializedEntity::EK_New:
5293*67e74705SXin Li   case InitializedEntity::EK_Variable:
5294*67e74705SXin Li   case InitializedEntity::EK_Base:
5295*67e74705SXin Li   case InitializedEntity::EK_Delegating:
5296*67e74705SXin Li   case InitializedEntity::EK_VectorElement:
5297*67e74705SXin Li   case InitializedEntity::EK_ComplexElement:
5298*67e74705SXin Li   case InitializedEntity::EK_Exception:
5299*67e74705SXin Li   case InitializedEntity::EK_BlockElement:
5300*67e74705SXin Li   case InitializedEntity::EK_LambdaCapture:
5301*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
5302*67e74705SXin Li     return false;
5303*67e74705SXin Li 
5304*67e74705SXin Li   case InitializedEntity::EK_Parameter:
5305*67e74705SXin Li   case InitializedEntity::EK_Parameter_CF_Audited:
5306*67e74705SXin Li   case InitializedEntity::EK_Temporary:
5307*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
5308*67e74705SXin Li     return true;
5309*67e74705SXin Li   }
5310*67e74705SXin Li 
5311*67e74705SXin Li   llvm_unreachable("missed an InitializedEntity kind?");
5312*67e74705SXin Li }
5313*67e74705SXin Li 
5314*67e74705SXin Li /// \brief Whether the given entity, when initialized with an object
5315*67e74705SXin Li /// created for that initialization, requires destruction.
shouldDestroyTemporary(const InitializedEntity & Entity)5316*67e74705SXin Li static bool shouldDestroyTemporary(const InitializedEntity &Entity) {
5317*67e74705SXin Li   switch (Entity.getKind()) {
5318*67e74705SXin Li     case InitializedEntity::EK_Result:
5319*67e74705SXin Li     case InitializedEntity::EK_New:
5320*67e74705SXin Li     case InitializedEntity::EK_Base:
5321*67e74705SXin Li     case InitializedEntity::EK_Delegating:
5322*67e74705SXin Li     case InitializedEntity::EK_VectorElement:
5323*67e74705SXin Li     case InitializedEntity::EK_ComplexElement:
5324*67e74705SXin Li     case InitializedEntity::EK_BlockElement:
5325*67e74705SXin Li     case InitializedEntity::EK_LambdaCapture:
5326*67e74705SXin Li       return false;
5327*67e74705SXin Li 
5328*67e74705SXin Li     case InitializedEntity::EK_Member:
5329*67e74705SXin Li     case InitializedEntity::EK_Variable:
5330*67e74705SXin Li     case InitializedEntity::EK_Parameter:
5331*67e74705SXin Li     case InitializedEntity::EK_Parameter_CF_Audited:
5332*67e74705SXin Li     case InitializedEntity::EK_Temporary:
5333*67e74705SXin Li     case InitializedEntity::EK_ArrayElement:
5334*67e74705SXin Li     case InitializedEntity::EK_Exception:
5335*67e74705SXin Li     case InitializedEntity::EK_CompoundLiteralInit:
5336*67e74705SXin Li     case InitializedEntity::EK_RelatedResult:
5337*67e74705SXin Li       return true;
5338*67e74705SXin Li   }
5339*67e74705SXin Li 
5340*67e74705SXin Li   llvm_unreachable("missed an InitializedEntity kind?");
5341*67e74705SXin Li }
5342*67e74705SXin Li 
5343*67e74705SXin Li /// \brief Look for copy and move constructors and constructor templates, for
5344*67e74705SXin Li /// copying an object via direct-initialization (per C++11 [dcl.init]p16).
LookupCopyAndMoveConstructors(Sema & S,OverloadCandidateSet & CandidateSet,CXXRecordDecl * Class,Expr * CurInitExpr)5345*67e74705SXin Li static void LookupCopyAndMoveConstructors(Sema &S,
5346*67e74705SXin Li                                           OverloadCandidateSet &CandidateSet,
5347*67e74705SXin Li                                           CXXRecordDecl *Class,
5348*67e74705SXin Li                                           Expr *CurInitExpr) {
5349*67e74705SXin Li   DeclContext::lookup_result R = S.LookupConstructors(Class);
5350*67e74705SXin Li   // The container holding the constructors can under certain conditions
5351*67e74705SXin Li   // be changed while iterating (e.g. because of deserialization).
5352*67e74705SXin Li   // To be safe we copy the lookup results to a new container.
5353*67e74705SXin Li   SmallVector<NamedDecl*, 16> Ctors(R.begin(), R.end());
5354*67e74705SXin Li   for (SmallVectorImpl<NamedDecl *>::iterator
5355*67e74705SXin Li          CI = Ctors.begin(), CE = Ctors.end(); CI != CE; ++CI) {
5356*67e74705SXin Li     NamedDecl *D = *CI;
5357*67e74705SXin Li     auto Info = getConstructorInfo(D);
5358*67e74705SXin Li     if (!Info.Constructor)
5359*67e74705SXin Li       continue;
5360*67e74705SXin Li 
5361*67e74705SXin Li     if (!Info.ConstructorTmpl) {
5362*67e74705SXin Li       // Handle copy/move constructors, only.
5363*67e74705SXin Li       if (Info.Constructor->isInvalidDecl() ||
5364*67e74705SXin Li           !Info.Constructor->isCopyOrMoveConstructor() ||
5365*67e74705SXin Li           !Info.Constructor->isConvertingConstructor(/*AllowExplicit=*/true))
5366*67e74705SXin Li         continue;
5367*67e74705SXin Li 
5368*67e74705SXin Li       S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
5369*67e74705SXin Li                              CurInitExpr, CandidateSet);
5370*67e74705SXin Li       continue;
5371*67e74705SXin Li     }
5372*67e74705SXin Li 
5373*67e74705SXin Li     // Handle constructor templates.
5374*67e74705SXin Li     if (Info.ConstructorTmpl->isInvalidDecl())
5375*67e74705SXin Li       continue;
5376*67e74705SXin Li 
5377*67e74705SXin Li     if (!Info.Constructor->isConvertingConstructor(/*AllowExplicit=*/true))
5378*67e74705SXin Li       continue;
5379*67e74705SXin Li 
5380*67e74705SXin Li     // FIXME: Do we need to limit this to copy-constructor-like
5381*67e74705SXin Li     // candidates?
5382*67e74705SXin Li     S.AddTemplateOverloadCandidate(Info.ConstructorTmpl, Info.FoundDecl,
5383*67e74705SXin Li                                    nullptr, CurInitExpr, CandidateSet, true);
5384*67e74705SXin Li   }
5385*67e74705SXin Li }
5386*67e74705SXin Li 
5387*67e74705SXin Li /// \brief Get the location at which initialization diagnostics should appear.
getInitializationLoc(const InitializedEntity & Entity,Expr * Initializer)5388*67e74705SXin Li static SourceLocation getInitializationLoc(const InitializedEntity &Entity,
5389*67e74705SXin Li                                            Expr *Initializer) {
5390*67e74705SXin Li   switch (Entity.getKind()) {
5391*67e74705SXin Li   case InitializedEntity::EK_Result:
5392*67e74705SXin Li     return Entity.getReturnLoc();
5393*67e74705SXin Li 
5394*67e74705SXin Li   case InitializedEntity::EK_Exception:
5395*67e74705SXin Li     return Entity.getThrowLoc();
5396*67e74705SXin Li 
5397*67e74705SXin Li   case InitializedEntity::EK_Variable:
5398*67e74705SXin Li     return Entity.getDecl()->getLocation();
5399*67e74705SXin Li 
5400*67e74705SXin Li   case InitializedEntity::EK_LambdaCapture:
5401*67e74705SXin Li     return Entity.getCaptureLoc();
5402*67e74705SXin Li 
5403*67e74705SXin Li   case InitializedEntity::EK_ArrayElement:
5404*67e74705SXin Li   case InitializedEntity::EK_Member:
5405*67e74705SXin Li   case InitializedEntity::EK_Parameter:
5406*67e74705SXin Li   case InitializedEntity::EK_Parameter_CF_Audited:
5407*67e74705SXin Li   case InitializedEntity::EK_Temporary:
5408*67e74705SXin Li   case InitializedEntity::EK_New:
5409*67e74705SXin Li   case InitializedEntity::EK_Base:
5410*67e74705SXin Li   case InitializedEntity::EK_Delegating:
5411*67e74705SXin Li   case InitializedEntity::EK_VectorElement:
5412*67e74705SXin Li   case InitializedEntity::EK_ComplexElement:
5413*67e74705SXin Li   case InitializedEntity::EK_BlockElement:
5414*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
5415*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
5416*67e74705SXin Li     return Initializer->getLocStart();
5417*67e74705SXin Li   }
5418*67e74705SXin Li   llvm_unreachable("missed an InitializedEntity kind?");
5419*67e74705SXin Li }
5420*67e74705SXin Li 
5421*67e74705SXin Li /// \brief Make a (potentially elidable) temporary copy of the object
5422*67e74705SXin Li /// provided by the given initializer by calling the appropriate copy
5423*67e74705SXin Li /// constructor.
5424*67e74705SXin Li ///
5425*67e74705SXin Li /// \param S The Sema object used for type-checking.
5426*67e74705SXin Li ///
5427*67e74705SXin Li /// \param T The type of the temporary object, which must either be
5428*67e74705SXin Li /// the type of the initializer expression or a superclass thereof.
5429*67e74705SXin Li ///
5430*67e74705SXin Li /// \param Entity The entity being initialized.
5431*67e74705SXin Li ///
5432*67e74705SXin Li /// \param CurInit The initializer expression.
5433*67e74705SXin Li ///
5434*67e74705SXin Li /// \param IsExtraneousCopy Whether this is an "extraneous" copy that
5435*67e74705SXin Li /// is permitted in C++03 (but not C++0x) when binding a reference to
5436*67e74705SXin Li /// an rvalue.
5437*67e74705SXin Li ///
5438*67e74705SXin Li /// \returns An expression that copies the initializer expression into
5439*67e74705SXin Li /// a temporary object, or an error expression if a copy could not be
5440*67e74705SXin Li /// created.
CopyObject(Sema & S,QualType T,const InitializedEntity & Entity,ExprResult CurInit,bool IsExtraneousCopy)5441*67e74705SXin Li static ExprResult CopyObject(Sema &S,
5442*67e74705SXin Li                              QualType T,
5443*67e74705SXin Li                              const InitializedEntity &Entity,
5444*67e74705SXin Li                              ExprResult CurInit,
5445*67e74705SXin Li                              bool IsExtraneousCopy) {
5446*67e74705SXin Li   if (CurInit.isInvalid())
5447*67e74705SXin Li     return CurInit;
5448*67e74705SXin Li   // Determine which class type we're copying to.
5449*67e74705SXin Li   Expr *CurInitExpr = (Expr *)CurInit.get();
5450*67e74705SXin Li   CXXRecordDecl *Class = nullptr;
5451*67e74705SXin Li   if (const RecordType *Record = T->getAs<RecordType>())
5452*67e74705SXin Li     Class = cast<CXXRecordDecl>(Record->getDecl());
5453*67e74705SXin Li   if (!Class)
5454*67e74705SXin Li     return CurInit;
5455*67e74705SXin Li 
5456*67e74705SXin Li   // C++0x [class.copy]p32:
5457*67e74705SXin Li   //   When certain criteria are met, an implementation is allowed to
5458*67e74705SXin Li   //   omit the copy/move construction of a class object, even if the
5459*67e74705SXin Li   //   copy/move constructor and/or destructor for the object have
5460*67e74705SXin Li   //   side effects. [...]
5461*67e74705SXin Li   //     - when a temporary class object that has not been bound to a
5462*67e74705SXin Li   //       reference (12.2) would be copied/moved to a class object
5463*67e74705SXin Li   //       with the same cv-unqualified type, the copy/move operation
5464*67e74705SXin Li   //       can be omitted by constructing the temporary object
5465*67e74705SXin Li   //       directly into the target of the omitted copy/move
5466*67e74705SXin Li   //
5467*67e74705SXin Li   // Note that the other three bullets are handled elsewhere. Copy
5468*67e74705SXin Li   // elision for return statements and throw expressions are handled as part
5469*67e74705SXin Li   // of constructor initialization, while copy elision for exception handlers
5470*67e74705SXin Li   // is handled by the run-time.
5471*67e74705SXin Li   bool Elidable = CurInitExpr->isTemporaryObject(S.Context, Class);
5472*67e74705SXin Li   SourceLocation Loc = getInitializationLoc(Entity, CurInit.get());
5473*67e74705SXin Li 
5474*67e74705SXin Li   // Make sure that the type we are copying is complete.
5475*67e74705SXin Li   if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))
5476*67e74705SXin Li     return CurInit;
5477*67e74705SXin Li 
5478*67e74705SXin Li   // Perform overload resolution using the class's copy/move constructors.
5479*67e74705SXin Li   // Only consider constructors and constructor templates. Per
5480*67e74705SXin Li   // C++0x [dcl.init]p16, second bullet to class types, this initialization
5481*67e74705SXin Li   // is direct-initialization.
5482*67e74705SXin Li   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5483*67e74705SXin Li   LookupCopyAndMoveConstructors(S, CandidateSet, Class, CurInitExpr);
5484*67e74705SXin Li 
5485*67e74705SXin Li   bool HadMultipleCandidates = (CandidateSet.size() > 1);
5486*67e74705SXin Li 
5487*67e74705SXin Li   OverloadCandidateSet::iterator Best;
5488*67e74705SXin Li   switch (CandidateSet.BestViableFunction(S, Loc, Best)) {
5489*67e74705SXin Li   case OR_Success:
5490*67e74705SXin Li     break;
5491*67e74705SXin Li 
5492*67e74705SXin Li   case OR_No_Viable_Function:
5493*67e74705SXin Li     S.Diag(Loc, IsExtraneousCopy && !S.isSFINAEContext()
5494*67e74705SXin Li            ? diag::ext_rvalue_to_reference_temp_copy_no_viable
5495*67e74705SXin Li            : diag::err_temp_copy_no_viable)
5496*67e74705SXin Li       << (int)Entity.getKind() << CurInitExpr->getType()
5497*67e74705SXin Li       << CurInitExpr->getSourceRange();
5498*67e74705SXin Li     CandidateSet.NoteCandidates(S, OCD_AllCandidates, CurInitExpr);
5499*67e74705SXin Li     if (!IsExtraneousCopy || S.isSFINAEContext())
5500*67e74705SXin Li       return ExprError();
5501*67e74705SXin Li     return CurInit;
5502*67e74705SXin Li 
5503*67e74705SXin Li   case OR_Ambiguous:
5504*67e74705SXin Li     S.Diag(Loc, diag::err_temp_copy_ambiguous)
5505*67e74705SXin Li       << (int)Entity.getKind() << CurInitExpr->getType()
5506*67e74705SXin Li       << CurInitExpr->getSourceRange();
5507*67e74705SXin Li     CandidateSet.NoteCandidates(S, OCD_ViableCandidates, CurInitExpr);
5508*67e74705SXin Li     return ExprError();
5509*67e74705SXin Li 
5510*67e74705SXin Li   case OR_Deleted:
5511*67e74705SXin Li     S.Diag(Loc, diag::err_temp_copy_deleted)
5512*67e74705SXin Li       << (int)Entity.getKind() << CurInitExpr->getType()
5513*67e74705SXin Li       << CurInitExpr->getSourceRange();
5514*67e74705SXin Li     S.NoteDeletedFunction(Best->Function);
5515*67e74705SXin Li     return ExprError();
5516*67e74705SXin Li   }
5517*67e74705SXin Li 
5518*67e74705SXin Li   CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function);
5519*67e74705SXin Li   SmallVector<Expr*, 8> ConstructorArgs;
5520*67e74705SXin Li   CurInit.get(); // Ownership transferred into MultiExprArg, below.
5521*67e74705SXin Li 
5522*67e74705SXin Li   S.CheckConstructorAccess(Loc, Constructor, Best->FoundDecl, Entity,
5523*67e74705SXin Li                            IsExtraneousCopy);
5524*67e74705SXin Li 
5525*67e74705SXin Li   if (IsExtraneousCopy) {
5526*67e74705SXin Li     // If this is a totally extraneous copy for C++03 reference
5527*67e74705SXin Li     // binding purposes, just return the original initialization
5528*67e74705SXin Li     // expression. We don't generate an (elided) copy operation here
5529*67e74705SXin Li     // because doing so would require us to pass down a flag to avoid
5530*67e74705SXin Li     // infinite recursion, where each step adds another extraneous,
5531*67e74705SXin Li     // elidable copy.
5532*67e74705SXin Li 
5533*67e74705SXin Li     // Instantiate the default arguments of any extra parameters in
5534*67e74705SXin Li     // the selected copy constructor, as if we were going to create a
5535*67e74705SXin Li     // proper call to the copy constructor.
5536*67e74705SXin Li     for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
5537*67e74705SXin Li       ParmVarDecl *Parm = Constructor->getParamDecl(I);
5538*67e74705SXin Li       if (S.RequireCompleteType(Loc, Parm->getType(),
5539*67e74705SXin Li                                 diag::err_call_incomplete_argument))
5540*67e74705SXin Li         break;
5541*67e74705SXin Li 
5542*67e74705SXin Li       // Build the default argument expression; we don't actually care
5543*67e74705SXin Li       // if this succeeds or not, because this routine will complain
5544*67e74705SXin Li       // if there was a problem.
5545*67e74705SXin Li       S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm);
5546*67e74705SXin Li     }
5547*67e74705SXin Li 
5548*67e74705SXin Li     return CurInitExpr;
5549*67e74705SXin Li   }
5550*67e74705SXin Li 
5551*67e74705SXin Li   // Determine the arguments required to actually perform the
5552*67e74705SXin Li   // constructor call (we might have derived-to-base conversions, or
5553*67e74705SXin Li   // the copy constructor may have default arguments).
5554*67e74705SXin Li   if (S.CompleteConstructorCall(Constructor, CurInitExpr, Loc, ConstructorArgs))
5555*67e74705SXin Li     return ExprError();
5556*67e74705SXin Li 
5557*67e74705SXin Li   // Actually perform the constructor call.
5558*67e74705SXin Li   CurInit = S.BuildCXXConstructExpr(Loc, T, Best->FoundDecl, Constructor,
5559*67e74705SXin Li                                     Elidable,
5560*67e74705SXin Li                                     ConstructorArgs,
5561*67e74705SXin Li                                     HadMultipleCandidates,
5562*67e74705SXin Li                                     /*ListInit*/ false,
5563*67e74705SXin Li                                     /*StdInitListInit*/ false,
5564*67e74705SXin Li                                     /*ZeroInit*/ false,
5565*67e74705SXin Li                                     CXXConstructExpr::CK_Complete,
5566*67e74705SXin Li                                     SourceRange());
5567*67e74705SXin Li 
5568*67e74705SXin Li   // If we're supposed to bind temporaries, do so.
5569*67e74705SXin Li   if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity))
5570*67e74705SXin Li     CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
5571*67e74705SXin Li   return CurInit;
5572*67e74705SXin Li }
5573*67e74705SXin Li 
5574*67e74705SXin Li /// \brief Check whether elidable copy construction for binding a reference to
5575*67e74705SXin Li /// a temporary would have succeeded if we were building in C++98 mode, for
5576*67e74705SXin Li /// -Wc++98-compat.
CheckCXX98CompatAccessibleCopy(Sema & S,const InitializedEntity & Entity,Expr * CurInitExpr)5577*67e74705SXin Li static void CheckCXX98CompatAccessibleCopy(Sema &S,
5578*67e74705SXin Li                                            const InitializedEntity &Entity,
5579*67e74705SXin Li                                            Expr *CurInitExpr) {
5580*67e74705SXin Li   assert(S.getLangOpts().CPlusPlus11);
5581*67e74705SXin Li 
5582*67e74705SXin Li   const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>();
5583*67e74705SXin Li   if (!Record)
5584*67e74705SXin Li     return;
5585*67e74705SXin Li 
5586*67e74705SXin Li   SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr);
5587*67e74705SXin Li   if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))
5588*67e74705SXin Li     return;
5589*67e74705SXin Li 
5590*67e74705SXin Li   // Find constructors which would have been considered.
5591*67e74705SXin Li   OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
5592*67e74705SXin Li   LookupCopyAndMoveConstructors(
5593*67e74705SXin Li       S, CandidateSet, cast<CXXRecordDecl>(Record->getDecl()), CurInitExpr);
5594*67e74705SXin Li 
5595*67e74705SXin Li   // Perform overload resolution.
5596*67e74705SXin Li   OverloadCandidateSet::iterator Best;
5597*67e74705SXin Li   OverloadingResult OR = CandidateSet.BestViableFunction(S, Loc, Best);
5598*67e74705SXin Li 
5599*67e74705SXin Li   PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
5600*67e74705SXin Li     << OR << (int)Entity.getKind() << CurInitExpr->getType()
5601*67e74705SXin Li     << CurInitExpr->getSourceRange();
5602*67e74705SXin Li 
5603*67e74705SXin Li   switch (OR) {
5604*67e74705SXin Li   case OR_Success:
5605*67e74705SXin Li     S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function),
5606*67e74705SXin Li                              Best->FoundDecl, Entity, Diag);
5607*67e74705SXin Li     // FIXME: Check default arguments as far as that's possible.
5608*67e74705SXin Li     break;
5609*67e74705SXin Li 
5610*67e74705SXin Li   case OR_No_Viable_Function:
5611*67e74705SXin Li     S.Diag(Loc, Diag);
5612*67e74705SXin Li     CandidateSet.NoteCandidates(S, OCD_AllCandidates, CurInitExpr);
5613*67e74705SXin Li     break;
5614*67e74705SXin Li 
5615*67e74705SXin Li   case OR_Ambiguous:
5616*67e74705SXin Li     S.Diag(Loc, Diag);
5617*67e74705SXin Li     CandidateSet.NoteCandidates(S, OCD_ViableCandidates, CurInitExpr);
5618*67e74705SXin Li     break;
5619*67e74705SXin Li 
5620*67e74705SXin Li   case OR_Deleted:
5621*67e74705SXin Li     S.Diag(Loc, Diag);
5622*67e74705SXin Li     S.NoteDeletedFunction(Best->Function);
5623*67e74705SXin Li     break;
5624*67e74705SXin Li   }
5625*67e74705SXin Li }
5626*67e74705SXin Li 
PrintInitLocationNote(Sema & S,const InitializedEntity & Entity)5627*67e74705SXin Li void InitializationSequence::PrintInitLocationNote(Sema &S,
5628*67e74705SXin Li                                               const InitializedEntity &Entity) {
5629*67e74705SXin Li   if (Entity.isParameterKind() && Entity.getDecl()) {
5630*67e74705SXin Li     if (Entity.getDecl()->getLocation().isInvalid())
5631*67e74705SXin Li       return;
5632*67e74705SXin Li 
5633*67e74705SXin Li     if (Entity.getDecl()->getDeclName())
5634*67e74705SXin Li       S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here)
5635*67e74705SXin Li         << Entity.getDecl()->getDeclName();
5636*67e74705SXin Li     else
5637*67e74705SXin Li       S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here);
5638*67e74705SXin Li   }
5639*67e74705SXin Li   else if (Entity.getKind() == InitializedEntity::EK_RelatedResult &&
5640*67e74705SXin Li            Entity.getMethodDecl())
5641*67e74705SXin Li     S.Diag(Entity.getMethodDecl()->getLocation(),
5642*67e74705SXin Li            diag::note_method_return_type_change)
5643*67e74705SXin Li       << Entity.getMethodDecl()->getDeclName();
5644*67e74705SXin Li }
5645*67e74705SXin Li 
isReferenceBinding(const InitializationSequence::Step & s)5646*67e74705SXin Li static bool isReferenceBinding(const InitializationSequence::Step &s) {
5647*67e74705SXin Li   return s.Kind == InitializationSequence::SK_BindReference ||
5648*67e74705SXin Li          s.Kind == InitializationSequence::SK_BindReferenceToTemporary;
5649*67e74705SXin Li }
5650*67e74705SXin Li 
5651*67e74705SXin Li /// Returns true if the parameters describe a constructor initialization of
5652*67e74705SXin Li /// an explicit temporary object, e.g. "Point(x, y)".
isExplicitTemporary(const InitializedEntity & Entity,const InitializationKind & Kind,unsigned NumArgs)5653*67e74705SXin Li static bool isExplicitTemporary(const InitializedEntity &Entity,
5654*67e74705SXin Li                                 const InitializationKind &Kind,
5655*67e74705SXin Li                                 unsigned NumArgs) {
5656*67e74705SXin Li   switch (Entity.getKind()) {
5657*67e74705SXin Li   case InitializedEntity::EK_Temporary:
5658*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
5659*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
5660*67e74705SXin Li     break;
5661*67e74705SXin Li   default:
5662*67e74705SXin Li     return false;
5663*67e74705SXin Li   }
5664*67e74705SXin Li 
5665*67e74705SXin Li   switch (Kind.getKind()) {
5666*67e74705SXin Li   case InitializationKind::IK_DirectList:
5667*67e74705SXin Li     return true;
5668*67e74705SXin Li   // FIXME: Hack to work around cast weirdness.
5669*67e74705SXin Li   case InitializationKind::IK_Direct:
5670*67e74705SXin Li   case InitializationKind::IK_Value:
5671*67e74705SXin Li     return NumArgs != 1;
5672*67e74705SXin Li   default:
5673*67e74705SXin Li     return false;
5674*67e74705SXin Li   }
5675*67e74705SXin Li }
5676*67e74705SXin Li 
5677*67e74705SXin Li static ExprResult
PerformConstructorInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,const InitializationSequence::Step & Step,bool & ConstructorInitRequiresZeroInit,bool IsListInitialization,bool IsStdInitListInitialization,SourceLocation LBraceLoc,SourceLocation RBraceLoc)5678*67e74705SXin Li PerformConstructorInitialization(Sema &S,
5679*67e74705SXin Li                                  const InitializedEntity &Entity,
5680*67e74705SXin Li                                  const InitializationKind &Kind,
5681*67e74705SXin Li                                  MultiExprArg Args,
5682*67e74705SXin Li                                  const InitializationSequence::Step& Step,
5683*67e74705SXin Li                                  bool &ConstructorInitRequiresZeroInit,
5684*67e74705SXin Li                                  bool IsListInitialization,
5685*67e74705SXin Li                                  bool IsStdInitListInitialization,
5686*67e74705SXin Li                                  SourceLocation LBraceLoc,
5687*67e74705SXin Li                                  SourceLocation RBraceLoc) {
5688*67e74705SXin Li   unsigned NumArgs = Args.size();
5689*67e74705SXin Li   CXXConstructorDecl *Constructor
5690*67e74705SXin Li     = cast<CXXConstructorDecl>(Step.Function.Function);
5691*67e74705SXin Li   bool HadMultipleCandidates = Step.Function.HadMultipleCandidates;
5692*67e74705SXin Li 
5693*67e74705SXin Li   // Build a call to the selected constructor.
5694*67e74705SXin Li   SmallVector<Expr*, 8> ConstructorArgs;
5695*67e74705SXin Li   SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
5696*67e74705SXin Li                          ? Kind.getEqualLoc()
5697*67e74705SXin Li                          : Kind.getLocation();
5698*67e74705SXin Li 
5699*67e74705SXin Li   if (Kind.getKind() == InitializationKind::IK_Default) {
5700*67e74705SXin Li     // Force even a trivial, implicit default constructor to be
5701*67e74705SXin Li     // semantically checked. We do this explicitly because we don't build
5702*67e74705SXin Li     // the definition for completely trivial constructors.
5703*67e74705SXin Li     assert(Constructor->getParent() && "No parent class for constructor.");
5704*67e74705SXin Li     if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
5705*67e74705SXin Li         Constructor->isTrivial() && !Constructor->isUsed(false))
5706*67e74705SXin Li       S.DefineImplicitDefaultConstructor(Loc, Constructor);
5707*67e74705SXin Li   }
5708*67e74705SXin Li 
5709*67e74705SXin Li   ExprResult CurInit((Expr *)nullptr);
5710*67e74705SXin Li 
5711*67e74705SXin Li   // C++ [over.match.copy]p1:
5712*67e74705SXin Li   //   - When initializing a temporary to be bound to the first parameter
5713*67e74705SXin Li   //     of a constructor that takes a reference to possibly cv-qualified
5714*67e74705SXin Li   //     T as its first argument, called with a single argument in the
5715*67e74705SXin Li   //     context of direct-initialization, explicit conversion functions
5716*67e74705SXin Li   //     are also considered.
5717*67e74705SXin Li   bool AllowExplicitConv = Kind.AllowExplicit() && !Kind.isCopyInit() &&
5718*67e74705SXin Li                            Args.size() == 1 &&
5719*67e74705SXin Li                            Constructor->isCopyOrMoveConstructor();
5720*67e74705SXin Li 
5721*67e74705SXin Li   // Determine the arguments required to actually perform the constructor
5722*67e74705SXin Li   // call.
5723*67e74705SXin Li   if (S.CompleteConstructorCall(Constructor, Args,
5724*67e74705SXin Li                                 Loc, ConstructorArgs,
5725*67e74705SXin Li                                 AllowExplicitConv,
5726*67e74705SXin Li                                 IsListInitialization))
5727*67e74705SXin Li     return ExprError();
5728*67e74705SXin Li 
5729*67e74705SXin Li 
5730*67e74705SXin Li   if (isExplicitTemporary(Entity, Kind, NumArgs)) {
5731*67e74705SXin Li     // An explicitly-constructed temporary, e.g., X(1, 2).
5732*67e74705SXin Li     if (S.DiagnoseUseOfDecl(Constructor, Loc))
5733*67e74705SXin Li       return ExprError();
5734*67e74705SXin Li 
5735*67e74705SXin Li     TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
5736*67e74705SXin Li     if (!TSInfo)
5737*67e74705SXin Li       TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc);
5738*67e74705SXin Li     SourceRange ParenOrBraceRange =
5739*67e74705SXin Li       (Kind.getKind() == InitializationKind::IK_DirectList)
5740*67e74705SXin Li       ? SourceRange(LBraceLoc, RBraceLoc)
5741*67e74705SXin Li       : Kind.getParenRange();
5742*67e74705SXin Li 
5743*67e74705SXin Li     if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
5744*67e74705SXin Li             Step.Function.FoundDecl.getDecl())) {
5745*67e74705SXin Li       Constructor = S.findInheritingConstructor(Loc, Constructor, Shadow);
5746*67e74705SXin Li       if (S.DiagnoseUseOfDecl(Constructor, Loc))
5747*67e74705SXin Li         return ExprError();
5748*67e74705SXin Li     }
5749*67e74705SXin Li     S.MarkFunctionReferenced(Loc, Constructor);
5750*67e74705SXin Li 
5751*67e74705SXin Li     CurInit = new (S.Context) CXXTemporaryObjectExpr(
5752*67e74705SXin Li         S.Context, Constructor, TSInfo,
5753*67e74705SXin Li         ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
5754*67e74705SXin Li         IsListInitialization, IsStdInitListInitialization,
5755*67e74705SXin Li         ConstructorInitRequiresZeroInit);
5756*67e74705SXin Li   } else {
5757*67e74705SXin Li     CXXConstructExpr::ConstructionKind ConstructKind =
5758*67e74705SXin Li       CXXConstructExpr::CK_Complete;
5759*67e74705SXin Li 
5760*67e74705SXin Li     if (Entity.getKind() == InitializedEntity::EK_Base) {
5761*67e74705SXin Li       ConstructKind = Entity.getBaseSpecifier()->isVirtual() ?
5762*67e74705SXin Li         CXXConstructExpr::CK_VirtualBase :
5763*67e74705SXin Li         CXXConstructExpr::CK_NonVirtualBase;
5764*67e74705SXin Li     } else if (Entity.getKind() == InitializedEntity::EK_Delegating) {
5765*67e74705SXin Li       ConstructKind = CXXConstructExpr::CK_Delegating;
5766*67e74705SXin Li     }
5767*67e74705SXin Li 
5768*67e74705SXin Li     // Only get the parenthesis or brace range if it is a list initialization or
5769*67e74705SXin Li     // direct construction.
5770*67e74705SXin Li     SourceRange ParenOrBraceRange;
5771*67e74705SXin Li     if (IsListInitialization)
5772*67e74705SXin Li       ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc);
5773*67e74705SXin Li     else if (Kind.getKind() == InitializationKind::IK_Direct)
5774*67e74705SXin Li       ParenOrBraceRange = Kind.getParenRange();
5775*67e74705SXin Li 
5776*67e74705SXin Li     // If the entity allows NRVO, mark the construction as elidable
5777*67e74705SXin Li     // unconditionally.
5778*67e74705SXin Li     if (Entity.allowsNRVO())
5779*67e74705SXin Li       CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(),
5780*67e74705SXin Li                                         Step.Function.FoundDecl,
5781*67e74705SXin Li                                         Constructor, /*Elidable=*/true,
5782*67e74705SXin Li                                         ConstructorArgs,
5783*67e74705SXin Li                                         HadMultipleCandidates,
5784*67e74705SXin Li                                         IsListInitialization,
5785*67e74705SXin Li                                         IsStdInitListInitialization,
5786*67e74705SXin Li                                         ConstructorInitRequiresZeroInit,
5787*67e74705SXin Li                                         ConstructKind,
5788*67e74705SXin Li                                         ParenOrBraceRange);
5789*67e74705SXin Li     else
5790*67e74705SXin Li       CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(),
5791*67e74705SXin Li                                         Step.Function.FoundDecl,
5792*67e74705SXin Li                                         Constructor,
5793*67e74705SXin Li                                         ConstructorArgs,
5794*67e74705SXin Li                                         HadMultipleCandidates,
5795*67e74705SXin Li                                         IsListInitialization,
5796*67e74705SXin Li                                         IsStdInitListInitialization,
5797*67e74705SXin Li                                         ConstructorInitRequiresZeroInit,
5798*67e74705SXin Li                                         ConstructKind,
5799*67e74705SXin Li                                         ParenOrBraceRange);
5800*67e74705SXin Li   }
5801*67e74705SXin Li   if (CurInit.isInvalid())
5802*67e74705SXin Li     return ExprError();
5803*67e74705SXin Li 
5804*67e74705SXin Li   // Only check access if all of that succeeded.
5805*67e74705SXin Li   S.CheckConstructorAccess(Loc, Constructor, Step.Function.FoundDecl, Entity);
5806*67e74705SXin Li   if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
5807*67e74705SXin Li     return ExprError();
5808*67e74705SXin Li 
5809*67e74705SXin Li   if (shouldBindAsTemporary(Entity))
5810*67e74705SXin Li     CurInit = S.MaybeBindToTemporary(CurInit.get());
5811*67e74705SXin Li 
5812*67e74705SXin Li   return CurInit;
5813*67e74705SXin Li }
5814*67e74705SXin Li 
5815*67e74705SXin Li /// Determine whether the specified InitializedEntity definitely has a lifetime
5816*67e74705SXin Li /// longer than the current full-expression. Conservatively returns false if
5817*67e74705SXin Li /// it's unclear.
5818*67e74705SXin Li static bool
InitializedEntityOutlivesFullExpression(const InitializedEntity & Entity)5819*67e74705SXin Li InitializedEntityOutlivesFullExpression(const InitializedEntity &Entity) {
5820*67e74705SXin Li   const InitializedEntity *Top = &Entity;
5821*67e74705SXin Li   while (Top->getParent())
5822*67e74705SXin Li     Top = Top->getParent();
5823*67e74705SXin Li 
5824*67e74705SXin Li   switch (Top->getKind()) {
5825*67e74705SXin Li   case InitializedEntity::EK_Variable:
5826*67e74705SXin Li   case InitializedEntity::EK_Result:
5827*67e74705SXin Li   case InitializedEntity::EK_Exception:
5828*67e74705SXin Li   case InitializedEntity::EK_Member:
5829*67e74705SXin Li   case InitializedEntity::EK_New:
5830*67e74705SXin Li   case InitializedEntity::EK_Base:
5831*67e74705SXin Li   case InitializedEntity::EK_Delegating:
5832*67e74705SXin Li     return true;
5833*67e74705SXin Li 
5834*67e74705SXin Li   case InitializedEntity::EK_ArrayElement:
5835*67e74705SXin Li   case InitializedEntity::EK_VectorElement:
5836*67e74705SXin Li   case InitializedEntity::EK_BlockElement:
5837*67e74705SXin Li   case InitializedEntity::EK_ComplexElement:
5838*67e74705SXin Li     // Could not determine what the full initialization is. Assume it might not
5839*67e74705SXin Li     // outlive the full-expression.
5840*67e74705SXin Li     return false;
5841*67e74705SXin Li 
5842*67e74705SXin Li   case InitializedEntity::EK_Parameter:
5843*67e74705SXin Li   case InitializedEntity::EK_Parameter_CF_Audited:
5844*67e74705SXin Li   case InitializedEntity::EK_Temporary:
5845*67e74705SXin Li   case InitializedEntity::EK_LambdaCapture:
5846*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
5847*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
5848*67e74705SXin Li     // The entity being initialized might not outlive the full-expression.
5849*67e74705SXin Li     return false;
5850*67e74705SXin Li   }
5851*67e74705SXin Li 
5852*67e74705SXin Li   llvm_unreachable("unknown entity kind");
5853*67e74705SXin Li }
5854*67e74705SXin Li 
5855*67e74705SXin Li /// Determine the declaration which an initialized entity ultimately refers to,
5856*67e74705SXin Li /// for the purpose of lifetime-extending a temporary bound to a reference in
5857*67e74705SXin Li /// the initialization of \p Entity.
getEntityForTemporaryLifetimeExtension(const InitializedEntity * Entity,const InitializedEntity * FallbackDecl=nullptr)5858*67e74705SXin Li static const InitializedEntity *getEntityForTemporaryLifetimeExtension(
5859*67e74705SXin Li     const InitializedEntity *Entity,
5860*67e74705SXin Li     const InitializedEntity *FallbackDecl = nullptr) {
5861*67e74705SXin Li   // C++11 [class.temporary]p5:
5862*67e74705SXin Li   switch (Entity->getKind()) {
5863*67e74705SXin Li   case InitializedEntity::EK_Variable:
5864*67e74705SXin Li     //   The temporary [...] persists for the lifetime of the reference
5865*67e74705SXin Li     return Entity;
5866*67e74705SXin Li 
5867*67e74705SXin Li   case InitializedEntity::EK_Member:
5868*67e74705SXin Li     // For subobjects, we look at the complete object.
5869*67e74705SXin Li     if (Entity->getParent())
5870*67e74705SXin Li       return getEntityForTemporaryLifetimeExtension(Entity->getParent(),
5871*67e74705SXin Li                                                     Entity);
5872*67e74705SXin Li 
5873*67e74705SXin Li     //   except:
5874*67e74705SXin Li     //   -- A temporary bound to a reference member in a constructor's
5875*67e74705SXin Li     //      ctor-initializer persists until the constructor exits.
5876*67e74705SXin Li     return Entity;
5877*67e74705SXin Li 
5878*67e74705SXin Li   case InitializedEntity::EK_Parameter:
5879*67e74705SXin Li   case InitializedEntity::EK_Parameter_CF_Audited:
5880*67e74705SXin Li     //   -- A temporary bound to a reference parameter in a function call
5881*67e74705SXin Li     //      persists until the completion of the full-expression containing
5882*67e74705SXin Li     //      the call.
5883*67e74705SXin Li   case InitializedEntity::EK_Result:
5884*67e74705SXin Li     //   -- The lifetime of a temporary bound to the returned value in a
5885*67e74705SXin Li     //      function return statement is not extended; the temporary is
5886*67e74705SXin Li     //      destroyed at the end of the full-expression in the return statement.
5887*67e74705SXin Li   case InitializedEntity::EK_New:
5888*67e74705SXin Li     //   -- A temporary bound to a reference in a new-initializer persists
5889*67e74705SXin Li     //      until the completion of the full-expression containing the
5890*67e74705SXin Li     //      new-initializer.
5891*67e74705SXin Li     return nullptr;
5892*67e74705SXin Li 
5893*67e74705SXin Li   case InitializedEntity::EK_Temporary:
5894*67e74705SXin Li   case InitializedEntity::EK_CompoundLiteralInit:
5895*67e74705SXin Li   case InitializedEntity::EK_RelatedResult:
5896*67e74705SXin Li     // We don't yet know the storage duration of the surrounding temporary.
5897*67e74705SXin Li     // Assume it's got full-expression duration for now, it will patch up our
5898*67e74705SXin Li     // storage duration if that's not correct.
5899*67e74705SXin Li     return nullptr;
5900*67e74705SXin Li 
5901*67e74705SXin Li   case InitializedEntity::EK_ArrayElement:
5902*67e74705SXin Li     // For subobjects, we look at the complete object.
5903*67e74705SXin Li     return getEntityForTemporaryLifetimeExtension(Entity->getParent(),
5904*67e74705SXin Li                                                   FallbackDecl);
5905*67e74705SXin Li 
5906*67e74705SXin Li   case InitializedEntity::EK_Base:
5907*67e74705SXin Li     // For subobjects, we look at the complete object.
5908*67e74705SXin Li     if (Entity->getParent())
5909*67e74705SXin Li       return getEntityForTemporaryLifetimeExtension(Entity->getParent(),
5910*67e74705SXin Li                                                     Entity);
5911*67e74705SXin Li     // Fall through.
5912*67e74705SXin Li   case InitializedEntity::EK_Delegating:
5913*67e74705SXin Li     // We can reach this case for aggregate initialization in a constructor:
5914*67e74705SXin Li     //   struct A { int &&r; };
5915*67e74705SXin Li     //   struct B : A { B() : A{0} {} };
5916*67e74705SXin Li     // In this case, use the innermost field decl as the context.
5917*67e74705SXin Li     return FallbackDecl;
5918*67e74705SXin Li 
5919*67e74705SXin Li   case InitializedEntity::EK_BlockElement:
5920*67e74705SXin Li   case InitializedEntity::EK_LambdaCapture:
5921*67e74705SXin Li   case InitializedEntity::EK_Exception:
5922*67e74705SXin Li   case InitializedEntity::EK_VectorElement:
5923*67e74705SXin Li   case InitializedEntity::EK_ComplexElement:
5924*67e74705SXin Li     return nullptr;
5925*67e74705SXin Li   }
5926*67e74705SXin Li   llvm_unreachable("unknown entity kind");
5927*67e74705SXin Li }
5928*67e74705SXin Li 
5929*67e74705SXin Li static void performLifetimeExtension(Expr *Init,
5930*67e74705SXin Li                                      const InitializedEntity *ExtendingEntity);
5931*67e74705SXin Li 
5932*67e74705SXin Li /// Update a glvalue expression that is used as the initializer of a reference
5933*67e74705SXin Li /// to note that its lifetime is extended.
5934*67e74705SXin Li /// \return \c true if any temporary had its lifetime extended.
5935*67e74705SXin Li static bool
performReferenceExtension(Expr * Init,const InitializedEntity * ExtendingEntity)5936*67e74705SXin Li performReferenceExtension(Expr *Init,
5937*67e74705SXin Li                           const InitializedEntity *ExtendingEntity) {
5938*67e74705SXin Li   // Walk past any constructs which we can lifetime-extend across.
5939*67e74705SXin Li   Expr *Old;
5940*67e74705SXin Li   do {
5941*67e74705SXin Li     Old = Init;
5942*67e74705SXin Li 
5943*67e74705SXin Li     if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
5944*67e74705SXin Li       if (ILE->getNumInits() == 1 && ILE->isGLValue()) {
5945*67e74705SXin Li         // This is just redundant braces around an initializer. Step over it.
5946*67e74705SXin Li         Init = ILE->getInit(0);
5947*67e74705SXin Li       }
5948*67e74705SXin Li     }
5949*67e74705SXin Li 
5950*67e74705SXin Li     // Step over any subobject adjustments; we may have a materialized
5951*67e74705SXin Li     // temporary inside them.
5952*67e74705SXin Li     SmallVector<const Expr *, 2> CommaLHSs;
5953*67e74705SXin Li     SmallVector<SubobjectAdjustment, 2> Adjustments;
5954*67e74705SXin Li     Init = const_cast<Expr *>(
5955*67e74705SXin Li         Init->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments));
5956*67e74705SXin Li 
5957*67e74705SXin Li     // Per current approach for DR1376, look through casts to reference type
5958*67e74705SXin Li     // when performing lifetime extension.
5959*67e74705SXin Li     if (CastExpr *CE = dyn_cast<CastExpr>(Init))
5960*67e74705SXin Li       if (CE->getSubExpr()->isGLValue())
5961*67e74705SXin Li         Init = CE->getSubExpr();
5962*67e74705SXin Li 
5963*67e74705SXin Li     // FIXME: Per DR1213, subscripting on an array temporary produces an xvalue.
5964*67e74705SXin Li     // It's unclear if binding a reference to that xvalue extends the array
5965*67e74705SXin Li     // temporary.
5966*67e74705SXin Li   } while (Init != Old);
5967*67e74705SXin Li 
5968*67e74705SXin Li   if (MaterializeTemporaryExpr *ME = dyn_cast<MaterializeTemporaryExpr>(Init)) {
5969*67e74705SXin Li     // Update the storage duration of the materialized temporary.
5970*67e74705SXin Li     // FIXME: Rebuild the expression instead of mutating it.
5971*67e74705SXin Li     ME->setExtendingDecl(ExtendingEntity->getDecl(),
5972*67e74705SXin Li                          ExtendingEntity->allocateManglingNumber());
5973*67e74705SXin Li     performLifetimeExtension(ME->GetTemporaryExpr(), ExtendingEntity);
5974*67e74705SXin Li     return true;
5975*67e74705SXin Li   }
5976*67e74705SXin Li 
5977*67e74705SXin Li   return false;
5978*67e74705SXin Li }
5979*67e74705SXin Li 
5980*67e74705SXin Li /// Update a prvalue expression that is going to be materialized as a
5981*67e74705SXin Li /// lifetime-extended temporary.
performLifetimeExtension(Expr * Init,const InitializedEntity * ExtendingEntity)5982*67e74705SXin Li static void performLifetimeExtension(Expr *Init,
5983*67e74705SXin Li                                      const InitializedEntity *ExtendingEntity) {
5984*67e74705SXin Li   // Dig out the expression which constructs the extended temporary.
5985*67e74705SXin Li   SmallVector<const Expr *, 2> CommaLHSs;
5986*67e74705SXin Li   SmallVector<SubobjectAdjustment, 2> Adjustments;
5987*67e74705SXin Li   Init = const_cast<Expr *>(
5988*67e74705SXin Li       Init->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments));
5989*67e74705SXin Li 
5990*67e74705SXin Li   if (CXXBindTemporaryExpr *BTE = dyn_cast<CXXBindTemporaryExpr>(Init))
5991*67e74705SXin Li     Init = BTE->getSubExpr();
5992*67e74705SXin Li 
5993*67e74705SXin Li   if (CXXStdInitializerListExpr *ILE =
5994*67e74705SXin Li           dyn_cast<CXXStdInitializerListExpr>(Init)) {
5995*67e74705SXin Li     performReferenceExtension(ILE->getSubExpr(), ExtendingEntity);
5996*67e74705SXin Li     return;
5997*67e74705SXin Li   }
5998*67e74705SXin Li 
5999*67e74705SXin Li   if (InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
6000*67e74705SXin Li     if (ILE->getType()->isArrayType()) {
6001*67e74705SXin Li       for (unsigned I = 0, N = ILE->getNumInits(); I != N; ++I)
6002*67e74705SXin Li         performLifetimeExtension(ILE->getInit(I), ExtendingEntity);
6003*67e74705SXin Li       return;
6004*67e74705SXin Li     }
6005*67e74705SXin Li 
6006*67e74705SXin Li     if (CXXRecordDecl *RD = ILE->getType()->getAsCXXRecordDecl()) {
6007*67e74705SXin Li       assert(RD->isAggregate() && "aggregate init on non-aggregate");
6008*67e74705SXin Li 
6009*67e74705SXin Li       // If we lifetime-extend a braced initializer which is initializing an
6010*67e74705SXin Li       // aggregate, and that aggregate contains reference members which are
6011*67e74705SXin Li       // bound to temporaries, those temporaries are also lifetime-extended.
6012*67e74705SXin Li       if (RD->isUnion() && ILE->getInitializedFieldInUnion() &&
6013*67e74705SXin Li           ILE->getInitializedFieldInUnion()->getType()->isReferenceType())
6014*67e74705SXin Li         performReferenceExtension(ILE->getInit(0), ExtendingEntity);
6015*67e74705SXin Li       else {
6016*67e74705SXin Li         unsigned Index = 0;
6017*67e74705SXin Li         for (const auto *I : RD->fields()) {
6018*67e74705SXin Li           if (Index >= ILE->getNumInits())
6019*67e74705SXin Li             break;
6020*67e74705SXin Li           if (I->isUnnamedBitfield())
6021*67e74705SXin Li             continue;
6022*67e74705SXin Li           Expr *SubInit = ILE->getInit(Index);
6023*67e74705SXin Li           if (I->getType()->isReferenceType())
6024*67e74705SXin Li             performReferenceExtension(SubInit, ExtendingEntity);
6025*67e74705SXin Li           else if (isa<InitListExpr>(SubInit) ||
6026*67e74705SXin Li                    isa<CXXStdInitializerListExpr>(SubInit))
6027*67e74705SXin Li             // This may be either aggregate-initialization of a member or
6028*67e74705SXin Li             // initialization of a std::initializer_list object. Either way,
6029*67e74705SXin Li             // we should recursively lifetime-extend that initializer.
6030*67e74705SXin Li             performLifetimeExtension(SubInit, ExtendingEntity);
6031*67e74705SXin Li           ++Index;
6032*67e74705SXin Li         }
6033*67e74705SXin Li       }
6034*67e74705SXin Li     }
6035*67e74705SXin Li   }
6036*67e74705SXin Li }
6037*67e74705SXin Li 
warnOnLifetimeExtension(Sema & S,const InitializedEntity & Entity,const Expr * Init,bool IsInitializerList,const ValueDecl * ExtendingDecl)6038*67e74705SXin Li static void warnOnLifetimeExtension(Sema &S, const InitializedEntity &Entity,
6039*67e74705SXin Li                                     const Expr *Init, bool IsInitializerList,
6040*67e74705SXin Li                                     const ValueDecl *ExtendingDecl) {
6041*67e74705SXin Li   // Warn if a field lifetime-extends a temporary.
6042*67e74705SXin Li   if (isa<FieldDecl>(ExtendingDecl)) {
6043*67e74705SXin Li     if (IsInitializerList) {
6044*67e74705SXin Li       S.Diag(Init->getExprLoc(), diag::warn_dangling_std_initializer_list)
6045*67e74705SXin Li         << /*at end of constructor*/true;
6046*67e74705SXin Li       return;
6047*67e74705SXin Li     }
6048*67e74705SXin Li 
6049*67e74705SXin Li     bool IsSubobjectMember = false;
6050*67e74705SXin Li     for (const InitializedEntity *Ent = Entity.getParent(); Ent;
6051*67e74705SXin Li          Ent = Ent->getParent()) {
6052*67e74705SXin Li       if (Ent->getKind() != InitializedEntity::EK_Base) {
6053*67e74705SXin Li         IsSubobjectMember = true;
6054*67e74705SXin Li         break;
6055*67e74705SXin Li       }
6056*67e74705SXin Li     }
6057*67e74705SXin Li     S.Diag(Init->getExprLoc(),
6058*67e74705SXin Li            diag::warn_bind_ref_member_to_temporary)
6059*67e74705SXin Li       << ExtendingDecl << Init->getSourceRange()
6060*67e74705SXin Li       << IsSubobjectMember << IsInitializerList;
6061*67e74705SXin Li     if (IsSubobjectMember)
6062*67e74705SXin Li       S.Diag(ExtendingDecl->getLocation(),
6063*67e74705SXin Li              diag::note_ref_subobject_of_member_declared_here);
6064*67e74705SXin Li     else
6065*67e74705SXin Li       S.Diag(ExtendingDecl->getLocation(),
6066*67e74705SXin Li              diag::note_ref_or_ptr_member_declared_here)
6067*67e74705SXin Li         << /*is pointer*/false;
6068*67e74705SXin Li   }
6069*67e74705SXin Li }
6070*67e74705SXin Li 
6071*67e74705SXin Li static void DiagnoseNarrowingInInitList(Sema &S,
6072*67e74705SXin Li                                         const ImplicitConversionSequence &ICS,
6073*67e74705SXin Li                                         QualType PreNarrowingType,
6074*67e74705SXin Li                                         QualType EntityType,
6075*67e74705SXin Li                                         const Expr *PostInit);
6076*67e74705SXin Li 
6077*67e74705SXin Li /// Provide warnings when std::move is used on construction.
CheckMoveOnConstruction(Sema & S,const Expr * InitExpr,bool IsReturnStmt)6078*67e74705SXin Li static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr,
6079*67e74705SXin Li                                     bool IsReturnStmt) {
6080*67e74705SXin Li   if (!InitExpr)
6081*67e74705SXin Li     return;
6082*67e74705SXin Li 
6083*67e74705SXin Li   if (!S.ActiveTemplateInstantiations.empty())
6084*67e74705SXin Li     return;
6085*67e74705SXin Li 
6086*67e74705SXin Li   QualType DestType = InitExpr->getType();
6087*67e74705SXin Li   if (!DestType->isRecordType())
6088*67e74705SXin Li     return;
6089*67e74705SXin Li 
6090*67e74705SXin Li   unsigned DiagID = 0;
6091*67e74705SXin Li   if (IsReturnStmt) {
6092*67e74705SXin Li     const CXXConstructExpr *CCE =
6093*67e74705SXin Li         dyn_cast<CXXConstructExpr>(InitExpr->IgnoreParens());
6094*67e74705SXin Li     if (!CCE || CCE->getNumArgs() != 1)
6095*67e74705SXin Li       return;
6096*67e74705SXin Li 
6097*67e74705SXin Li     if (!CCE->getConstructor()->isCopyOrMoveConstructor())
6098*67e74705SXin Li       return;
6099*67e74705SXin Li 
6100*67e74705SXin Li     InitExpr = CCE->getArg(0)->IgnoreImpCasts();
6101*67e74705SXin Li   }
6102*67e74705SXin Li 
6103*67e74705SXin Li   // Find the std::move call and get the argument.
6104*67e74705SXin Li   const CallExpr *CE = dyn_cast<CallExpr>(InitExpr->IgnoreParens());
6105*67e74705SXin Li   if (!CE || CE->getNumArgs() != 1)
6106*67e74705SXin Li     return;
6107*67e74705SXin Li 
6108*67e74705SXin Li   const FunctionDecl *MoveFunction = CE->getDirectCallee();
6109*67e74705SXin Li   if (!MoveFunction || !MoveFunction->isInStdNamespace() ||
6110*67e74705SXin Li       !MoveFunction->getIdentifier() ||
6111*67e74705SXin Li       !MoveFunction->getIdentifier()->isStr("move"))
6112*67e74705SXin Li     return;
6113*67e74705SXin Li 
6114*67e74705SXin Li   const Expr *Arg = CE->getArg(0)->IgnoreImplicit();
6115*67e74705SXin Li 
6116*67e74705SXin Li   if (IsReturnStmt) {
6117*67e74705SXin Li     const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts());
6118*67e74705SXin Li     if (!DRE || DRE->refersToEnclosingVariableOrCapture())
6119*67e74705SXin Li       return;
6120*67e74705SXin Li 
6121*67e74705SXin Li     const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
6122*67e74705SXin Li     if (!VD || !VD->hasLocalStorage())
6123*67e74705SXin Li       return;
6124*67e74705SXin Li 
6125*67e74705SXin Li     QualType SourceType = VD->getType();
6126*67e74705SXin Li     if (!SourceType->isRecordType())
6127*67e74705SXin Li       return;
6128*67e74705SXin Li 
6129*67e74705SXin Li     if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
6130*67e74705SXin Li       return;
6131*67e74705SXin Li     }
6132*67e74705SXin Li 
6133*67e74705SXin Li     // If we're returning a function parameter, copy elision
6134*67e74705SXin Li     // is not possible.
6135*67e74705SXin Li     if (isa<ParmVarDecl>(VD))
6136*67e74705SXin Li       DiagID = diag::warn_redundant_move_on_return;
6137*67e74705SXin Li     else
6138*67e74705SXin Li       DiagID = diag::warn_pessimizing_move_on_return;
6139*67e74705SXin Li   } else {
6140*67e74705SXin Li     DiagID = diag::warn_pessimizing_move_on_initialization;
6141*67e74705SXin Li     const Expr *ArgStripped = Arg->IgnoreImplicit()->IgnoreParens();
6142*67e74705SXin Li     if (!ArgStripped->isRValue() || !ArgStripped->getType()->isRecordType())
6143*67e74705SXin Li       return;
6144*67e74705SXin Li   }
6145*67e74705SXin Li 
6146*67e74705SXin Li   S.Diag(CE->getLocStart(), DiagID);
6147*67e74705SXin Li 
6148*67e74705SXin Li   // Get all the locations for a fix-it.  Don't emit the fix-it if any location
6149*67e74705SXin Li   // is within a macro.
6150*67e74705SXin Li   SourceLocation CallBegin = CE->getCallee()->getLocStart();
6151*67e74705SXin Li   if (CallBegin.isMacroID())
6152*67e74705SXin Li     return;
6153*67e74705SXin Li   SourceLocation RParen = CE->getRParenLoc();
6154*67e74705SXin Li   if (RParen.isMacroID())
6155*67e74705SXin Li     return;
6156*67e74705SXin Li   SourceLocation LParen;
6157*67e74705SXin Li   SourceLocation ArgLoc = Arg->getLocStart();
6158*67e74705SXin Li 
6159*67e74705SXin Li   // Special testing for the argument location.  Since the fix-it needs the
6160*67e74705SXin Li   // location right before the argument, the argument location can be in a
6161*67e74705SXin Li   // macro only if it is at the beginning of the macro.
6162*67e74705SXin Li   while (ArgLoc.isMacroID() &&
6163*67e74705SXin Li          S.getSourceManager().isAtStartOfImmediateMacroExpansion(ArgLoc)) {
6164*67e74705SXin Li     ArgLoc = S.getSourceManager().getImmediateExpansionRange(ArgLoc).first;
6165*67e74705SXin Li   }
6166*67e74705SXin Li 
6167*67e74705SXin Li   if (LParen.isMacroID())
6168*67e74705SXin Li     return;
6169*67e74705SXin Li 
6170*67e74705SXin Li   LParen = ArgLoc.getLocWithOffset(-1);
6171*67e74705SXin Li 
6172*67e74705SXin Li   S.Diag(CE->getLocStart(), diag::note_remove_move)
6173*67e74705SXin Li       << FixItHint::CreateRemoval(SourceRange(CallBegin, LParen))
6174*67e74705SXin Li       << FixItHint::CreateRemoval(SourceRange(RParen, RParen));
6175*67e74705SXin Li }
6176*67e74705SXin Li 
CheckForNullPointerDereference(Sema & S,const Expr * E)6177*67e74705SXin Li static void CheckForNullPointerDereference(Sema &S, const Expr *E) {
6178*67e74705SXin Li   // Check to see if we are dereferencing a null pointer.  If so, this is
6179*67e74705SXin Li   // undefined behavior, so warn about it.  This only handles the pattern
6180*67e74705SXin Li   // "*null", which is a very syntactic check.
6181*67e74705SXin Li   if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts()))
6182*67e74705SXin Li     if (UO->getOpcode() == UO_Deref &&
6183*67e74705SXin Li         UO->getSubExpr()->IgnoreParenCasts()->
6184*67e74705SXin Li         isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) {
6185*67e74705SXin Li     S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
6186*67e74705SXin Li                           S.PDiag(diag::warn_binding_null_to_reference)
6187*67e74705SXin Li                             << UO->getSubExpr()->getSourceRange());
6188*67e74705SXin Li   }
6189*67e74705SXin Li }
6190*67e74705SXin Li 
6191*67e74705SXin Li MaterializeTemporaryExpr *
CreateMaterializeTemporaryExpr(QualType T,Expr * Temporary,bool BoundToLvalueReference)6192*67e74705SXin Li Sema::CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary,
6193*67e74705SXin Li                                      bool BoundToLvalueReference) {
6194*67e74705SXin Li   auto MTE = new (Context)
6195*67e74705SXin Li       MaterializeTemporaryExpr(T, Temporary, BoundToLvalueReference);
6196*67e74705SXin Li 
6197*67e74705SXin Li   // Order an ExprWithCleanups for lifetime marks.
6198*67e74705SXin Li   //
6199*67e74705SXin Li   // TODO: It'll be good to have a single place to check the access of the
6200*67e74705SXin Li   // destructor and generate ExprWithCleanups for various uses. Currently these
6201*67e74705SXin Li   // are done in both CreateMaterializeTemporaryExpr and MaybeBindToTemporary,
6202*67e74705SXin Li   // but there may be a chance to merge them.
6203*67e74705SXin Li   Cleanup.setExprNeedsCleanups(false);
6204*67e74705SXin Li   return MTE;
6205*67e74705SXin Li }
6206*67e74705SXin Li 
6207*67e74705SXin Li ExprResult
Perform(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,QualType * ResultType)6208*67e74705SXin Li InitializationSequence::Perform(Sema &S,
6209*67e74705SXin Li                                 const InitializedEntity &Entity,
6210*67e74705SXin Li                                 const InitializationKind &Kind,
6211*67e74705SXin Li                                 MultiExprArg Args,
6212*67e74705SXin Li                                 QualType *ResultType) {
6213*67e74705SXin Li   if (Failed()) {
6214*67e74705SXin Li     Diagnose(S, Entity, Kind, Args);
6215*67e74705SXin Li     return ExprError();
6216*67e74705SXin Li   }
6217*67e74705SXin Li   if (!ZeroInitializationFixit.empty()) {
6218*67e74705SXin Li     unsigned DiagID = diag::err_default_init_const;
6219*67e74705SXin Li     if (Decl *D = Entity.getDecl())
6220*67e74705SXin Li       if (S.getLangOpts().MSVCCompat && D->hasAttr<SelectAnyAttr>())
6221*67e74705SXin Li         DiagID = diag::ext_default_init_const;
6222*67e74705SXin Li 
6223*67e74705SXin Li     // The initialization would have succeeded with this fixit. Since the fixit
6224*67e74705SXin Li     // is on the error, we need to build a valid AST in this case, so this isn't
6225*67e74705SXin Li     // handled in the Failed() branch above.
6226*67e74705SXin Li     QualType DestType = Entity.getType();
6227*67e74705SXin Li     S.Diag(Kind.getLocation(), DiagID)
6228*67e74705SXin Li         << DestType << (bool)DestType->getAs<RecordType>()
6229*67e74705SXin Li         << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
6230*67e74705SXin Li                                       ZeroInitializationFixit);
6231*67e74705SXin Li   }
6232*67e74705SXin Li 
6233*67e74705SXin Li   if (getKind() == DependentSequence) {
6234*67e74705SXin Li     // If the declaration is a non-dependent, incomplete array type
6235*67e74705SXin Li     // that has an initializer, then its type will be completed once
6236*67e74705SXin Li     // the initializer is instantiated.
6237*67e74705SXin Li     if (ResultType && !Entity.getType()->isDependentType() &&
6238*67e74705SXin Li         Args.size() == 1) {
6239*67e74705SXin Li       QualType DeclType = Entity.getType();
6240*67e74705SXin Li       if (const IncompleteArrayType *ArrayT
6241*67e74705SXin Li                            = S.Context.getAsIncompleteArrayType(DeclType)) {
6242*67e74705SXin Li         // FIXME: We don't currently have the ability to accurately
6243*67e74705SXin Li         // compute the length of an initializer list without
6244*67e74705SXin Li         // performing full type-checking of the initializer list
6245*67e74705SXin Li         // (since we have to determine where braces are implicitly
6246*67e74705SXin Li         // introduced and such).  So, we fall back to making the array
6247*67e74705SXin Li         // type a dependently-sized array type with no specified
6248*67e74705SXin Li         // bound.
6249*67e74705SXin Li         if (isa<InitListExpr>((Expr *)Args[0])) {
6250*67e74705SXin Li           SourceRange Brackets;
6251*67e74705SXin Li 
6252*67e74705SXin Li           // Scavange the location of the brackets from the entity, if we can.
6253*67e74705SXin Li           if (DeclaratorDecl *DD = Entity.getDecl()) {
6254*67e74705SXin Li             if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) {
6255*67e74705SXin Li               TypeLoc TL = TInfo->getTypeLoc();
6256*67e74705SXin Li               if (IncompleteArrayTypeLoc ArrayLoc =
6257*67e74705SXin Li                       TL.getAs<IncompleteArrayTypeLoc>())
6258*67e74705SXin Li                 Brackets = ArrayLoc.getBracketsRange();
6259*67e74705SXin Li             }
6260*67e74705SXin Li           }
6261*67e74705SXin Li 
6262*67e74705SXin Li           *ResultType
6263*67e74705SXin Li             = S.Context.getDependentSizedArrayType(ArrayT->getElementType(),
6264*67e74705SXin Li                                                    /*NumElts=*/nullptr,
6265*67e74705SXin Li                                                    ArrayT->getSizeModifier(),
6266*67e74705SXin Li                                        ArrayT->getIndexTypeCVRQualifiers(),
6267*67e74705SXin Li                                                    Brackets);
6268*67e74705SXin Li         }
6269*67e74705SXin Li 
6270*67e74705SXin Li       }
6271*67e74705SXin Li     }
6272*67e74705SXin Li     if (Kind.getKind() == InitializationKind::IK_Direct &&
6273*67e74705SXin Li         !Kind.isExplicitCast()) {
6274*67e74705SXin Li       // Rebuild the ParenListExpr.
6275*67e74705SXin Li       SourceRange ParenRange = Kind.getParenRange();
6276*67e74705SXin Li       return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(),
6277*67e74705SXin Li                                   Args);
6278*67e74705SXin Li     }
6279*67e74705SXin Li     assert(Kind.getKind() == InitializationKind::IK_Copy ||
6280*67e74705SXin Li            Kind.isExplicitCast() ||
6281*67e74705SXin Li            Kind.getKind() == InitializationKind::IK_DirectList);
6282*67e74705SXin Li     return ExprResult(Args[0]);
6283*67e74705SXin Li   }
6284*67e74705SXin Li 
6285*67e74705SXin Li   // No steps means no initialization.
6286*67e74705SXin Li   if (Steps.empty())
6287*67e74705SXin Li     return ExprResult((Expr *)nullptr);
6288*67e74705SXin Li 
6289*67e74705SXin Li   if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() &&
6290*67e74705SXin Li       Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
6291*67e74705SXin Li       !Entity.isParameterKind()) {
6292*67e74705SXin Li     // Produce a C++98 compatibility warning if we are initializing a reference
6293*67e74705SXin Li     // from an initializer list. For parameters, we produce a better warning
6294*67e74705SXin Li     // elsewhere.
6295*67e74705SXin Li     Expr *Init = Args[0];
6296*67e74705SXin Li     S.Diag(Init->getLocStart(), diag::warn_cxx98_compat_reference_list_init)
6297*67e74705SXin Li       << Init->getSourceRange();
6298*67e74705SXin Li   }
6299*67e74705SXin Li 
6300*67e74705SXin Li   // Diagnose cases where we initialize a pointer to an array temporary, and the
6301*67e74705SXin Li   // pointer obviously outlives the temporary.
6302*67e74705SXin Li   if (Args.size() == 1 && Args[0]->getType()->isArrayType() &&
6303*67e74705SXin Li       Entity.getType()->isPointerType() &&
6304*67e74705SXin Li       InitializedEntityOutlivesFullExpression(Entity)) {
6305*67e74705SXin Li     Expr *Init = Args[0];
6306*67e74705SXin Li     Expr::LValueClassification Kind = Init->ClassifyLValue(S.Context);
6307*67e74705SXin Li     if (Kind == Expr::LV_ClassTemporary || Kind == Expr::LV_ArrayTemporary)
6308*67e74705SXin Li       S.Diag(Init->getLocStart(), diag::warn_temporary_array_to_pointer_decay)
6309*67e74705SXin Li         << Init->getSourceRange();
6310*67e74705SXin Li   }
6311*67e74705SXin Li 
6312*67e74705SXin Li   QualType DestType = Entity.getType().getNonReferenceType();
6313*67e74705SXin Li   // FIXME: Ugly hack around the fact that Entity.getType() is not
6314*67e74705SXin Li   // the same as Entity.getDecl()->getType() in cases involving type merging,
6315*67e74705SXin Li   //  and we want latter when it makes sense.
6316*67e74705SXin Li   if (ResultType)
6317*67e74705SXin Li     *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() :
6318*67e74705SXin Li                                      Entity.getType();
6319*67e74705SXin Li 
6320*67e74705SXin Li   ExprResult CurInit((Expr *)nullptr);
6321*67e74705SXin Li 
6322*67e74705SXin Li   // For initialization steps that start with a single initializer,
6323*67e74705SXin Li   // grab the only argument out the Args and place it into the "current"
6324*67e74705SXin Li   // initializer.
6325*67e74705SXin Li   switch (Steps.front().Kind) {
6326*67e74705SXin Li   case SK_ResolveAddressOfOverloadedFunction:
6327*67e74705SXin Li   case SK_CastDerivedToBaseRValue:
6328*67e74705SXin Li   case SK_CastDerivedToBaseXValue:
6329*67e74705SXin Li   case SK_CastDerivedToBaseLValue:
6330*67e74705SXin Li   case SK_BindReference:
6331*67e74705SXin Li   case SK_BindReferenceToTemporary:
6332*67e74705SXin Li   case SK_ExtraneousCopyToTemporary:
6333*67e74705SXin Li   case SK_UserConversion:
6334*67e74705SXin Li   case SK_QualificationConversionLValue:
6335*67e74705SXin Li   case SK_QualificationConversionXValue:
6336*67e74705SXin Li   case SK_QualificationConversionRValue:
6337*67e74705SXin Li   case SK_AtomicConversion:
6338*67e74705SXin Li   case SK_LValueToRValue:
6339*67e74705SXin Li   case SK_ConversionSequence:
6340*67e74705SXin Li   case SK_ConversionSequenceNoNarrowing:
6341*67e74705SXin Li   case SK_ListInitialization:
6342*67e74705SXin Li   case SK_UnwrapInitList:
6343*67e74705SXin Li   case SK_RewrapInitList:
6344*67e74705SXin Li   case SK_CAssignment:
6345*67e74705SXin Li   case SK_StringInit:
6346*67e74705SXin Li   case SK_ObjCObjectConversion:
6347*67e74705SXin Li   case SK_ArrayInit:
6348*67e74705SXin Li   case SK_ParenthesizedArrayInit:
6349*67e74705SXin Li   case SK_PassByIndirectCopyRestore:
6350*67e74705SXin Li   case SK_PassByIndirectRestore:
6351*67e74705SXin Li   case SK_ProduceObjCObject:
6352*67e74705SXin Li   case SK_StdInitializerList:
6353*67e74705SXin Li   case SK_OCLSamplerInit:
6354*67e74705SXin Li   case SK_OCLZeroEvent: {
6355*67e74705SXin Li     assert(Args.size() == 1);
6356*67e74705SXin Li     CurInit = Args[0];
6357*67e74705SXin Li     if (!CurInit.get()) return ExprError();
6358*67e74705SXin Li     break;
6359*67e74705SXin Li   }
6360*67e74705SXin Li 
6361*67e74705SXin Li   case SK_ConstructorInitialization:
6362*67e74705SXin Li   case SK_ConstructorInitializationFromList:
6363*67e74705SXin Li   case SK_StdInitializerListConstructorCall:
6364*67e74705SXin Li   case SK_ZeroInitialization:
6365*67e74705SXin Li     break;
6366*67e74705SXin Li   }
6367*67e74705SXin Li 
6368*67e74705SXin Li   // Walk through the computed steps for the initialization sequence,
6369*67e74705SXin Li   // performing the specified conversions along the way.
6370*67e74705SXin Li   bool ConstructorInitRequiresZeroInit = false;
6371*67e74705SXin Li   for (step_iterator Step = step_begin(), StepEnd = step_end();
6372*67e74705SXin Li        Step != StepEnd; ++Step) {
6373*67e74705SXin Li     if (CurInit.isInvalid())
6374*67e74705SXin Li       return ExprError();
6375*67e74705SXin Li 
6376*67e74705SXin Li     QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType();
6377*67e74705SXin Li 
6378*67e74705SXin Li     switch (Step->Kind) {
6379*67e74705SXin Li     case SK_ResolveAddressOfOverloadedFunction:
6380*67e74705SXin Li       // Overload resolution determined which function invoke; update the
6381*67e74705SXin Li       // initializer to reflect that choice.
6382*67e74705SXin Li       S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl);
6383*67e74705SXin Li       if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()))
6384*67e74705SXin Li         return ExprError();
6385*67e74705SXin Li       CurInit = S.FixOverloadedFunctionReference(CurInit,
6386*67e74705SXin Li                                                  Step->Function.FoundDecl,
6387*67e74705SXin Li                                                  Step->Function.Function);
6388*67e74705SXin Li       break;
6389*67e74705SXin Li 
6390*67e74705SXin Li     case SK_CastDerivedToBaseRValue:
6391*67e74705SXin Li     case SK_CastDerivedToBaseXValue:
6392*67e74705SXin Li     case SK_CastDerivedToBaseLValue: {
6393*67e74705SXin Li       // We have a derived-to-base cast that produces either an rvalue or an
6394*67e74705SXin Li       // lvalue. Perform that cast.
6395*67e74705SXin Li 
6396*67e74705SXin Li       CXXCastPath BasePath;
6397*67e74705SXin Li 
6398*67e74705SXin Li       // Casts to inaccessible base classes are allowed with C-style casts.
6399*67e74705SXin Li       bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
6400*67e74705SXin Li       if (S.CheckDerivedToBaseConversion(SourceType, Step->Type,
6401*67e74705SXin Li                                          CurInit.get()->getLocStart(),
6402*67e74705SXin Li                                          CurInit.get()->getSourceRange(),
6403*67e74705SXin Li                                          &BasePath, IgnoreBaseAccess))
6404*67e74705SXin Li         return ExprError();
6405*67e74705SXin Li 
6406*67e74705SXin Li       ExprValueKind VK =
6407*67e74705SXin Li           Step->Kind == SK_CastDerivedToBaseLValue ?
6408*67e74705SXin Li               VK_LValue :
6409*67e74705SXin Li               (Step->Kind == SK_CastDerivedToBaseXValue ?
6410*67e74705SXin Li                    VK_XValue :
6411*67e74705SXin Li                    VK_RValue);
6412*67e74705SXin Li       CurInit =
6413*67e74705SXin Li           ImplicitCastExpr::Create(S.Context, Step->Type, CK_DerivedToBase,
6414*67e74705SXin Li                                    CurInit.get(), &BasePath, VK);
6415*67e74705SXin Li       break;
6416*67e74705SXin Li     }
6417*67e74705SXin Li 
6418*67e74705SXin Li     case SK_BindReference:
6419*67e74705SXin Li       // References cannot bind to bit-fields (C++ [dcl.init.ref]p5).
6420*67e74705SXin Li       if (CurInit.get()->refersToBitField()) {
6421*67e74705SXin Li         // We don't necessarily have an unambiguous source bit-field.
6422*67e74705SXin Li         FieldDecl *BitField = CurInit.get()->getSourceBitField();
6423*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
6424*67e74705SXin Li           << Entity.getType().isVolatileQualified()
6425*67e74705SXin Li           << (BitField ? BitField->getDeclName() : DeclarationName())
6426*67e74705SXin Li           << (BitField != nullptr)
6427*67e74705SXin Li           << CurInit.get()->getSourceRange();
6428*67e74705SXin Li         if (BitField)
6429*67e74705SXin Li           S.Diag(BitField->getLocation(), diag::note_bitfield_decl);
6430*67e74705SXin Li 
6431*67e74705SXin Li         return ExprError();
6432*67e74705SXin Li       }
6433*67e74705SXin Li 
6434*67e74705SXin Li       if (CurInit.get()->refersToVectorElement()) {
6435*67e74705SXin Li         // References cannot bind to vector elements.
6436*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
6437*67e74705SXin Li           << Entity.getType().isVolatileQualified()
6438*67e74705SXin Li           << CurInit.get()->getSourceRange();
6439*67e74705SXin Li         PrintInitLocationNote(S, Entity);
6440*67e74705SXin Li         return ExprError();
6441*67e74705SXin Li       }
6442*67e74705SXin Li 
6443*67e74705SXin Li       // Reference binding does not have any corresponding ASTs.
6444*67e74705SXin Li 
6445*67e74705SXin Li       // Check exception specifications
6446*67e74705SXin Li       if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
6447*67e74705SXin Li         return ExprError();
6448*67e74705SXin Li 
6449*67e74705SXin Li       // Even though we didn't materialize a temporary, the binding may still
6450*67e74705SXin Li       // extend the lifetime of a temporary. This happens if we bind a reference
6451*67e74705SXin Li       // to the result of a cast to reference type.
6452*67e74705SXin Li       if (const InitializedEntity *ExtendingEntity =
6453*67e74705SXin Li               getEntityForTemporaryLifetimeExtension(&Entity))
6454*67e74705SXin Li         if (performReferenceExtension(CurInit.get(), ExtendingEntity))
6455*67e74705SXin Li           warnOnLifetimeExtension(S, Entity, CurInit.get(),
6456*67e74705SXin Li                                   /*IsInitializerList=*/false,
6457*67e74705SXin Li                                   ExtendingEntity->getDecl());
6458*67e74705SXin Li 
6459*67e74705SXin Li       CheckForNullPointerDereference(S, CurInit.get());
6460*67e74705SXin Li       break;
6461*67e74705SXin Li 
6462*67e74705SXin Li     case SK_BindReferenceToTemporary: {
6463*67e74705SXin Li       // Make sure the "temporary" is actually an rvalue.
6464*67e74705SXin Li       assert(CurInit.get()->isRValue() && "not a temporary");
6465*67e74705SXin Li 
6466*67e74705SXin Li       // Check exception specifications
6467*67e74705SXin Li       if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
6468*67e74705SXin Li         return ExprError();
6469*67e74705SXin Li 
6470*67e74705SXin Li       // Materialize the temporary into memory.
6471*67e74705SXin Li       MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
6472*67e74705SXin Li           Entity.getType().getNonReferenceType(), CurInit.get(),
6473*67e74705SXin Li           Entity.getType()->isLValueReferenceType());
6474*67e74705SXin Li 
6475*67e74705SXin Li       // Maybe lifetime-extend the temporary's subobjects to match the
6476*67e74705SXin Li       // entity's lifetime.
6477*67e74705SXin Li       if (const InitializedEntity *ExtendingEntity =
6478*67e74705SXin Li               getEntityForTemporaryLifetimeExtension(&Entity))
6479*67e74705SXin Li         if (performReferenceExtension(MTE, ExtendingEntity))
6480*67e74705SXin Li           warnOnLifetimeExtension(S, Entity, CurInit.get(), /*IsInitializerList=*/false,
6481*67e74705SXin Li                                   ExtendingEntity->getDecl());
6482*67e74705SXin Li 
6483*67e74705SXin Li       // If we're binding to an Objective-C object that has lifetime, we
6484*67e74705SXin Li       // need cleanups. Likewise if we're extending this temporary to automatic
6485*67e74705SXin Li       // storage duration -- we need to register its cleanup during the
6486*67e74705SXin Li       // full-expression's cleanups.
6487*67e74705SXin Li       if ((S.getLangOpts().ObjCAutoRefCount &&
6488*67e74705SXin Li            MTE->getType()->isObjCLifetimeType()) ||
6489*67e74705SXin Li           (MTE->getStorageDuration() == SD_Automatic &&
6490*67e74705SXin Li            MTE->getType().isDestructedType()))
6491*67e74705SXin Li         S.Cleanup.setExprNeedsCleanups(true);
6492*67e74705SXin Li 
6493*67e74705SXin Li       CurInit = MTE;
6494*67e74705SXin Li       break;
6495*67e74705SXin Li     }
6496*67e74705SXin Li 
6497*67e74705SXin Li     case SK_ExtraneousCopyToTemporary:
6498*67e74705SXin Li       CurInit = CopyObject(S, Step->Type, Entity, CurInit,
6499*67e74705SXin Li                            /*IsExtraneousCopy=*/true);
6500*67e74705SXin Li       break;
6501*67e74705SXin Li 
6502*67e74705SXin Li     case SK_UserConversion: {
6503*67e74705SXin Li       // We have a user-defined conversion that invokes either a constructor
6504*67e74705SXin Li       // or a conversion function.
6505*67e74705SXin Li       CastKind CastKind;
6506*67e74705SXin Li       bool IsCopy = false;
6507*67e74705SXin Li       FunctionDecl *Fn = Step->Function.Function;
6508*67e74705SXin Li       DeclAccessPair FoundFn = Step->Function.FoundDecl;
6509*67e74705SXin Li       bool HadMultipleCandidates = Step->Function.HadMultipleCandidates;
6510*67e74705SXin Li       bool CreatedObject = false;
6511*67e74705SXin Li       if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
6512*67e74705SXin Li         // Build a call to the selected constructor.
6513*67e74705SXin Li         SmallVector<Expr*, 8> ConstructorArgs;
6514*67e74705SXin Li         SourceLocation Loc = CurInit.get()->getLocStart();
6515*67e74705SXin Li         CurInit.get(); // Ownership transferred into MultiExprArg, below.
6516*67e74705SXin Li 
6517*67e74705SXin Li         // Determine the arguments required to actually perform the constructor
6518*67e74705SXin Li         // call.
6519*67e74705SXin Li         Expr *Arg = CurInit.get();
6520*67e74705SXin Li         if (S.CompleteConstructorCall(Constructor,
6521*67e74705SXin Li                                       MultiExprArg(&Arg, 1),
6522*67e74705SXin Li                                       Loc, ConstructorArgs))
6523*67e74705SXin Li           return ExprError();
6524*67e74705SXin Li 
6525*67e74705SXin Li         // Build an expression that constructs a temporary.
6526*67e74705SXin Li         CurInit = S.BuildCXXConstructExpr(Loc, Step->Type,
6527*67e74705SXin Li                                           FoundFn, Constructor,
6528*67e74705SXin Li                                           ConstructorArgs,
6529*67e74705SXin Li                                           HadMultipleCandidates,
6530*67e74705SXin Li                                           /*ListInit*/ false,
6531*67e74705SXin Li                                           /*StdInitListInit*/ false,
6532*67e74705SXin Li                                           /*ZeroInit*/ false,
6533*67e74705SXin Li                                           CXXConstructExpr::CK_Complete,
6534*67e74705SXin Li                                           SourceRange());
6535*67e74705SXin Li         if (CurInit.isInvalid())
6536*67e74705SXin Li           return ExprError();
6537*67e74705SXin Li 
6538*67e74705SXin Li         S.CheckConstructorAccess(Kind.getLocation(), Constructor, FoundFn,
6539*67e74705SXin Li                                  Entity);
6540*67e74705SXin Li         if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
6541*67e74705SXin Li           return ExprError();
6542*67e74705SXin Li 
6543*67e74705SXin Li         CastKind = CK_ConstructorConversion;
6544*67e74705SXin Li         QualType Class = S.Context.getTypeDeclType(Constructor->getParent());
6545*67e74705SXin Li         if (S.Context.hasSameUnqualifiedType(SourceType, Class) ||
6546*67e74705SXin Li             S.IsDerivedFrom(Loc, SourceType, Class))
6547*67e74705SXin Li           IsCopy = true;
6548*67e74705SXin Li 
6549*67e74705SXin Li         CreatedObject = true;
6550*67e74705SXin Li       } else {
6551*67e74705SXin Li         // Build a call to the conversion function.
6552*67e74705SXin Li         CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn);
6553*67e74705SXin Li         S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr,
6554*67e74705SXin Li                                     FoundFn);
6555*67e74705SXin Li         if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
6556*67e74705SXin Li           return ExprError();
6557*67e74705SXin Li 
6558*67e74705SXin Li         // FIXME: Should we move this initialization into a separate
6559*67e74705SXin Li         // derived-to-base conversion? I believe the answer is "no", because
6560*67e74705SXin Li         // we don't want to turn off access control here for c-style casts.
6561*67e74705SXin Li         ExprResult CurInitExprRes =
6562*67e74705SXin Li           S.PerformObjectArgumentInitialization(CurInit.get(),
6563*67e74705SXin Li                                                 /*Qualifier=*/nullptr,
6564*67e74705SXin Li                                                 FoundFn, Conversion);
6565*67e74705SXin Li         if(CurInitExprRes.isInvalid())
6566*67e74705SXin Li           return ExprError();
6567*67e74705SXin Li         CurInit = CurInitExprRes;
6568*67e74705SXin Li 
6569*67e74705SXin Li         // Build the actual call to the conversion function.
6570*67e74705SXin Li         CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion,
6571*67e74705SXin Li                                            HadMultipleCandidates);
6572*67e74705SXin Li         if (CurInit.isInvalid() || !CurInit.get())
6573*67e74705SXin Li           return ExprError();
6574*67e74705SXin Li 
6575*67e74705SXin Li         CastKind = CK_UserDefinedConversion;
6576*67e74705SXin Li 
6577*67e74705SXin Li         CreatedObject = Conversion->getReturnType()->isRecordType();
6578*67e74705SXin Li       }
6579*67e74705SXin Li 
6580*67e74705SXin Li       bool RequiresCopy = !IsCopy && !isReferenceBinding(Steps.back());
6581*67e74705SXin Li       bool MaybeBindToTemp = RequiresCopy || shouldBindAsTemporary(Entity);
6582*67e74705SXin Li 
6583*67e74705SXin Li       if (!MaybeBindToTemp && CreatedObject && shouldDestroyTemporary(Entity)) {
6584*67e74705SXin Li         QualType T = CurInit.get()->getType();
6585*67e74705SXin Li         if (const RecordType *Record = T->getAs<RecordType>()) {
6586*67e74705SXin Li           CXXDestructorDecl *Destructor
6587*67e74705SXin Li             = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl()));
6588*67e74705SXin Li           S.CheckDestructorAccess(CurInit.get()->getLocStart(), Destructor,
6589*67e74705SXin Li                                   S.PDiag(diag::err_access_dtor_temp) << T);
6590*67e74705SXin Li           S.MarkFunctionReferenced(CurInit.get()->getLocStart(), Destructor);
6591*67e74705SXin Li           if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getLocStart()))
6592*67e74705SXin Li             return ExprError();
6593*67e74705SXin Li         }
6594*67e74705SXin Li       }
6595*67e74705SXin Li 
6596*67e74705SXin Li       CurInit = ImplicitCastExpr::Create(S.Context, CurInit.get()->getType(),
6597*67e74705SXin Li                                          CastKind, CurInit.get(), nullptr,
6598*67e74705SXin Li                                          CurInit.get()->getValueKind());
6599*67e74705SXin Li       if (MaybeBindToTemp)
6600*67e74705SXin Li         CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
6601*67e74705SXin Li       if (RequiresCopy)
6602*67e74705SXin Li         CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity,
6603*67e74705SXin Li                              CurInit, /*IsExtraneousCopy=*/false);
6604*67e74705SXin Li       break;
6605*67e74705SXin Li     }
6606*67e74705SXin Li 
6607*67e74705SXin Li     case SK_QualificationConversionLValue:
6608*67e74705SXin Li     case SK_QualificationConversionXValue:
6609*67e74705SXin Li     case SK_QualificationConversionRValue: {
6610*67e74705SXin Li       // Perform a qualification conversion; these can never go wrong.
6611*67e74705SXin Li       ExprValueKind VK =
6612*67e74705SXin Li           Step->Kind == SK_QualificationConversionLValue ?
6613*67e74705SXin Li               VK_LValue :
6614*67e74705SXin Li               (Step->Kind == SK_QualificationConversionXValue ?
6615*67e74705SXin Li                    VK_XValue :
6616*67e74705SXin Li                    VK_RValue);
6617*67e74705SXin Li       CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type, CK_NoOp, VK);
6618*67e74705SXin Li       break;
6619*67e74705SXin Li     }
6620*67e74705SXin Li 
6621*67e74705SXin Li     case SK_AtomicConversion: {
6622*67e74705SXin Li       assert(CurInit.get()->isRValue() && "cannot convert glvalue to atomic");
6623*67e74705SXin Li       CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
6624*67e74705SXin Li                                     CK_NonAtomicToAtomic, VK_RValue);
6625*67e74705SXin Li       break;
6626*67e74705SXin Li     }
6627*67e74705SXin Li 
6628*67e74705SXin Li     case SK_LValueToRValue: {
6629*67e74705SXin Li       assert(CurInit.get()->isGLValue() && "cannot load from a prvalue");
6630*67e74705SXin Li       CurInit = ImplicitCastExpr::Create(S.Context, Step->Type,
6631*67e74705SXin Li                                          CK_LValueToRValue, CurInit.get(),
6632*67e74705SXin Li                                          /*BasePath=*/nullptr, VK_RValue);
6633*67e74705SXin Li       break;
6634*67e74705SXin Li     }
6635*67e74705SXin Li 
6636*67e74705SXin Li     case SK_ConversionSequence:
6637*67e74705SXin Li     case SK_ConversionSequenceNoNarrowing: {
6638*67e74705SXin Li       Sema::CheckedConversionKind CCK
6639*67e74705SXin Li         = Kind.isCStyleCast()? Sema::CCK_CStyleCast
6640*67e74705SXin Li         : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast
6641*67e74705SXin Li         : Kind.isExplicitCast()? Sema::CCK_OtherCast
6642*67e74705SXin Li         : Sema::CCK_ImplicitConversion;
6643*67e74705SXin Li       ExprResult CurInitExprRes =
6644*67e74705SXin Li         S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS,
6645*67e74705SXin Li                                     getAssignmentAction(Entity), CCK);
6646*67e74705SXin Li       if (CurInitExprRes.isInvalid())
6647*67e74705SXin Li         return ExprError();
6648*67e74705SXin Li       CurInit = CurInitExprRes;
6649*67e74705SXin Li 
6650*67e74705SXin Li       if (Step->Kind == SK_ConversionSequenceNoNarrowing &&
6651*67e74705SXin Li           S.getLangOpts().CPlusPlus && !CurInit.get()->isValueDependent())
6652*67e74705SXin Li         DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
6653*67e74705SXin Li                                     CurInit.get());
6654*67e74705SXin Li       break;
6655*67e74705SXin Li     }
6656*67e74705SXin Li 
6657*67e74705SXin Li     case SK_ListInitialization: {
6658*67e74705SXin Li       InitListExpr *InitList = cast<InitListExpr>(CurInit.get());
6659*67e74705SXin Li       // If we're not initializing the top-level entity, we need to create an
6660*67e74705SXin Li       // InitializeTemporary entity for our target type.
6661*67e74705SXin Li       QualType Ty = Step->Type;
6662*67e74705SXin Li       bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty);
6663*67e74705SXin Li       InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty);
6664*67e74705SXin Li       InitializedEntity InitEntity = IsTemporary ? TempEntity : Entity;
6665*67e74705SXin Li       InitListChecker PerformInitList(S, InitEntity,
6666*67e74705SXin Li           InitList, Ty, /*VerifyOnly=*/false,
6667*67e74705SXin Li           /*TreatUnavailableAsInvalid=*/false);
6668*67e74705SXin Li       if (PerformInitList.HadError())
6669*67e74705SXin Li         return ExprError();
6670*67e74705SXin Li 
6671*67e74705SXin Li       // Hack: We must update *ResultType if available in order to set the
6672*67e74705SXin Li       // bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'.
6673*67e74705SXin Li       // Worst case: 'const int (&arref)[] = {1, 2, 3};'.
6674*67e74705SXin Li       if (ResultType &&
6675*67e74705SXin Li           ResultType->getNonReferenceType()->isIncompleteArrayType()) {
6676*67e74705SXin Li         if ((*ResultType)->isRValueReferenceType())
6677*67e74705SXin Li           Ty = S.Context.getRValueReferenceType(Ty);
6678*67e74705SXin Li         else if ((*ResultType)->isLValueReferenceType())
6679*67e74705SXin Li           Ty = S.Context.getLValueReferenceType(Ty,
6680*67e74705SXin Li             (*ResultType)->getAs<LValueReferenceType>()->isSpelledAsLValue());
6681*67e74705SXin Li         *ResultType = Ty;
6682*67e74705SXin Li       }
6683*67e74705SXin Li 
6684*67e74705SXin Li       InitListExpr *StructuredInitList =
6685*67e74705SXin Li           PerformInitList.getFullyStructuredList();
6686*67e74705SXin Li       CurInit.get();
6687*67e74705SXin Li       CurInit = shouldBindAsTemporary(InitEntity)
6688*67e74705SXin Li           ? S.MaybeBindToTemporary(StructuredInitList)
6689*67e74705SXin Li           : StructuredInitList;
6690*67e74705SXin Li       break;
6691*67e74705SXin Li     }
6692*67e74705SXin Li 
6693*67e74705SXin Li     case SK_ConstructorInitializationFromList: {
6694*67e74705SXin Li       // When an initializer list is passed for a parameter of type "reference
6695*67e74705SXin Li       // to object", we don't get an EK_Temporary entity, but instead an
6696*67e74705SXin Li       // EK_Parameter entity with reference type.
6697*67e74705SXin Li       // FIXME: This is a hack. What we really should do is create a user
6698*67e74705SXin Li       // conversion step for this case, but this makes it considerably more
6699*67e74705SXin Li       // complicated. For now, this will do.
6700*67e74705SXin Li       InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
6701*67e74705SXin Li                                         Entity.getType().getNonReferenceType());
6702*67e74705SXin Li       bool UseTemporary = Entity.getType()->isReferenceType();
6703*67e74705SXin Li       assert(Args.size() == 1 && "expected a single argument for list init");
6704*67e74705SXin Li       InitListExpr *InitList = cast<InitListExpr>(Args[0]);
6705*67e74705SXin Li       S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
6706*67e74705SXin Li         << InitList->getSourceRange();
6707*67e74705SXin Li       MultiExprArg Arg(InitList->getInits(), InitList->getNumInits());
6708*67e74705SXin Li       CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity :
6709*67e74705SXin Li                                                                    Entity,
6710*67e74705SXin Li                                                  Kind, Arg, *Step,
6711*67e74705SXin Li                                                ConstructorInitRequiresZeroInit,
6712*67e74705SXin Li                                                /*IsListInitialization*/true,
6713*67e74705SXin Li                                                /*IsStdInitListInit*/false,
6714*67e74705SXin Li                                                InitList->getLBraceLoc(),
6715*67e74705SXin Li                                                InitList->getRBraceLoc());
6716*67e74705SXin Li       break;
6717*67e74705SXin Li     }
6718*67e74705SXin Li 
6719*67e74705SXin Li     case SK_UnwrapInitList:
6720*67e74705SXin Li       CurInit = cast<InitListExpr>(CurInit.get())->getInit(0);
6721*67e74705SXin Li       break;
6722*67e74705SXin Li 
6723*67e74705SXin Li     case SK_RewrapInitList: {
6724*67e74705SXin Li       Expr *E = CurInit.get();
6725*67e74705SXin Li       InitListExpr *Syntactic = Step->WrappingSyntacticList;
6726*67e74705SXin Li       InitListExpr *ILE = new (S.Context) InitListExpr(S.Context,
6727*67e74705SXin Li           Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc());
6728*67e74705SXin Li       ILE->setSyntacticForm(Syntactic);
6729*67e74705SXin Li       ILE->setType(E->getType());
6730*67e74705SXin Li       ILE->setValueKind(E->getValueKind());
6731*67e74705SXin Li       CurInit = ILE;
6732*67e74705SXin Li       break;
6733*67e74705SXin Li     }
6734*67e74705SXin Li 
6735*67e74705SXin Li     case SK_ConstructorInitialization:
6736*67e74705SXin Li     case SK_StdInitializerListConstructorCall: {
6737*67e74705SXin Li       // When an initializer list is passed for a parameter of type "reference
6738*67e74705SXin Li       // to object", we don't get an EK_Temporary entity, but instead an
6739*67e74705SXin Li       // EK_Parameter entity with reference type.
6740*67e74705SXin Li       // FIXME: This is a hack. What we really should do is create a user
6741*67e74705SXin Li       // conversion step for this case, but this makes it considerably more
6742*67e74705SXin Li       // complicated. For now, this will do.
6743*67e74705SXin Li       InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
6744*67e74705SXin Li                                         Entity.getType().getNonReferenceType());
6745*67e74705SXin Li       bool UseTemporary = Entity.getType()->isReferenceType();
6746*67e74705SXin Li       bool IsStdInitListInit =
6747*67e74705SXin Li           Step->Kind == SK_StdInitializerListConstructorCall;
6748*67e74705SXin Li       CurInit = PerformConstructorInitialization(
6749*67e74705SXin Li           S, UseTemporary ? TempEntity : Entity, Kind, Args, *Step,
6750*67e74705SXin Li           ConstructorInitRequiresZeroInit,
6751*67e74705SXin Li           /*IsListInitialization*/IsStdInitListInit,
6752*67e74705SXin Li           /*IsStdInitListInitialization*/IsStdInitListInit,
6753*67e74705SXin Li           /*LBraceLoc*/SourceLocation(),
6754*67e74705SXin Li           /*RBraceLoc*/SourceLocation());
6755*67e74705SXin Li       break;
6756*67e74705SXin Li     }
6757*67e74705SXin Li 
6758*67e74705SXin Li     case SK_ZeroInitialization: {
6759*67e74705SXin Li       step_iterator NextStep = Step;
6760*67e74705SXin Li       ++NextStep;
6761*67e74705SXin Li       if (NextStep != StepEnd &&
6762*67e74705SXin Li           (NextStep->Kind == SK_ConstructorInitialization ||
6763*67e74705SXin Li            NextStep->Kind == SK_ConstructorInitializationFromList)) {
6764*67e74705SXin Li         // The need for zero-initialization is recorded directly into
6765*67e74705SXin Li         // the call to the object's constructor within the next step.
6766*67e74705SXin Li         ConstructorInitRequiresZeroInit = true;
6767*67e74705SXin Li       } else if (Kind.getKind() == InitializationKind::IK_Value &&
6768*67e74705SXin Li                  S.getLangOpts().CPlusPlus &&
6769*67e74705SXin Li                  !Kind.isImplicitValueInit()) {
6770*67e74705SXin Li         TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
6771*67e74705SXin Li         if (!TSInfo)
6772*67e74705SXin Li           TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type,
6773*67e74705SXin Li                                                     Kind.getRange().getBegin());
6774*67e74705SXin Li 
6775*67e74705SXin Li         CurInit = new (S.Context) CXXScalarValueInitExpr(
6776*67e74705SXin Li             TSInfo->getType().getNonLValueExprType(S.Context), TSInfo,
6777*67e74705SXin Li             Kind.getRange().getEnd());
6778*67e74705SXin Li       } else {
6779*67e74705SXin Li         CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type);
6780*67e74705SXin Li       }
6781*67e74705SXin Li       break;
6782*67e74705SXin Li     }
6783*67e74705SXin Li 
6784*67e74705SXin Li     case SK_CAssignment: {
6785*67e74705SXin Li       QualType SourceType = CurInit.get()->getType();
6786*67e74705SXin Li       // Save off the initial CurInit in case we need to emit a diagnostic
6787*67e74705SXin Li       ExprResult InitialCurInit = CurInit;
6788*67e74705SXin Li       ExprResult Result = CurInit;
6789*67e74705SXin Li       Sema::AssignConvertType ConvTy =
6790*67e74705SXin Li         S.CheckSingleAssignmentConstraints(Step->Type, Result, true,
6791*67e74705SXin Li             Entity.getKind() == InitializedEntity::EK_Parameter_CF_Audited);
6792*67e74705SXin Li       if (Result.isInvalid())
6793*67e74705SXin Li         return ExprError();
6794*67e74705SXin Li       CurInit = Result;
6795*67e74705SXin Li 
6796*67e74705SXin Li       // If this is a call, allow conversion to a transparent union.
6797*67e74705SXin Li       ExprResult CurInitExprRes = CurInit;
6798*67e74705SXin Li       if (ConvTy != Sema::Compatible &&
6799*67e74705SXin Li           Entity.isParameterKind() &&
6800*67e74705SXin Li           S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes)
6801*67e74705SXin Li             == Sema::Compatible)
6802*67e74705SXin Li         ConvTy = Sema::Compatible;
6803*67e74705SXin Li       if (CurInitExprRes.isInvalid())
6804*67e74705SXin Li         return ExprError();
6805*67e74705SXin Li       CurInit = CurInitExprRes;
6806*67e74705SXin Li 
6807*67e74705SXin Li       bool Complained;
6808*67e74705SXin Li       if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
6809*67e74705SXin Li                                      Step->Type, SourceType,
6810*67e74705SXin Li                                      InitialCurInit.get(),
6811*67e74705SXin Li                                      getAssignmentAction(Entity, true),
6812*67e74705SXin Li                                      &Complained)) {
6813*67e74705SXin Li         PrintInitLocationNote(S, Entity);
6814*67e74705SXin Li         return ExprError();
6815*67e74705SXin Li       } else if (Complained)
6816*67e74705SXin Li         PrintInitLocationNote(S, Entity);
6817*67e74705SXin Li       break;
6818*67e74705SXin Li     }
6819*67e74705SXin Li 
6820*67e74705SXin Li     case SK_StringInit: {
6821*67e74705SXin Li       QualType Ty = Step->Type;
6822*67e74705SXin Li       CheckStringInit(CurInit.get(), ResultType ? *ResultType : Ty,
6823*67e74705SXin Li                       S.Context.getAsArrayType(Ty), S);
6824*67e74705SXin Li       break;
6825*67e74705SXin Li     }
6826*67e74705SXin Li 
6827*67e74705SXin Li     case SK_ObjCObjectConversion:
6828*67e74705SXin Li       CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
6829*67e74705SXin Li                           CK_ObjCObjectLValueCast,
6830*67e74705SXin Li                           CurInit.get()->getValueKind());
6831*67e74705SXin Li       break;
6832*67e74705SXin Li 
6833*67e74705SXin Li     case SK_ArrayInit:
6834*67e74705SXin Li       // Okay: we checked everything before creating this step. Note that
6835*67e74705SXin Li       // this is a GNU extension.
6836*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::ext_array_init_copy)
6837*67e74705SXin Li         << Step->Type << CurInit.get()->getType()
6838*67e74705SXin Li         << CurInit.get()->getSourceRange();
6839*67e74705SXin Li 
6840*67e74705SXin Li       // If the destination type is an incomplete array type, update the
6841*67e74705SXin Li       // type accordingly.
6842*67e74705SXin Li       if (ResultType) {
6843*67e74705SXin Li         if (const IncompleteArrayType *IncompleteDest
6844*67e74705SXin Li                            = S.Context.getAsIncompleteArrayType(Step->Type)) {
6845*67e74705SXin Li           if (const ConstantArrayType *ConstantSource
6846*67e74705SXin Li                  = S.Context.getAsConstantArrayType(CurInit.get()->getType())) {
6847*67e74705SXin Li             *ResultType = S.Context.getConstantArrayType(
6848*67e74705SXin Li                                              IncompleteDest->getElementType(),
6849*67e74705SXin Li                                              ConstantSource->getSize(),
6850*67e74705SXin Li                                              ArrayType::Normal, 0);
6851*67e74705SXin Li           }
6852*67e74705SXin Li         }
6853*67e74705SXin Li       }
6854*67e74705SXin Li       break;
6855*67e74705SXin Li 
6856*67e74705SXin Li     case SK_ParenthesizedArrayInit:
6857*67e74705SXin Li       // Okay: we checked everything before creating this step. Note that
6858*67e74705SXin Li       // this is a GNU extension.
6859*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::ext_array_init_parens)
6860*67e74705SXin Li         << CurInit.get()->getSourceRange();
6861*67e74705SXin Li       break;
6862*67e74705SXin Li 
6863*67e74705SXin Li     case SK_PassByIndirectCopyRestore:
6864*67e74705SXin Li     case SK_PassByIndirectRestore:
6865*67e74705SXin Li       checkIndirectCopyRestoreSource(S, CurInit.get());
6866*67e74705SXin Li       CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr(
6867*67e74705SXin Li           CurInit.get(), Step->Type,
6868*67e74705SXin Li           Step->Kind == SK_PassByIndirectCopyRestore);
6869*67e74705SXin Li       break;
6870*67e74705SXin Li 
6871*67e74705SXin Li     case SK_ProduceObjCObject:
6872*67e74705SXin Li       CurInit =
6873*67e74705SXin Li           ImplicitCastExpr::Create(S.Context, Step->Type, CK_ARCProduceObject,
6874*67e74705SXin Li                                    CurInit.get(), nullptr, VK_RValue);
6875*67e74705SXin Li       break;
6876*67e74705SXin Li 
6877*67e74705SXin Li     case SK_StdInitializerList: {
6878*67e74705SXin Li       S.Diag(CurInit.get()->getExprLoc(),
6879*67e74705SXin Li              diag::warn_cxx98_compat_initializer_list_init)
6880*67e74705SXin Li         << CurInit.get()->getSourceRange();
6881*67e74705SXin Li 
6882*67e74705SXin Li       // Materialize the temporary into memory.
6883*67e74705SXin Li       MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
6884*67e74705SXin Li           CurInit.get()->getType(), CurInit.get(),
6885*67e74705SXin Li           /*BoundToLvalueReference=*/false);
6886*67e74705SXin Li 
6887*67e74705SXin Li       // Maybe lifetime-extend the array temporary's subobjects to match the
6888*67e74705SXin Li       // entity's lifetime.
6889*67e74705SXin Li       if (const InitializedEntity *ExtendingEntity =
6890*67e74705SXin Li               getEntityForTemporaryLifetimeExtension(&Entity))
6891*67e74705SXin Li         if (performReferenceExtension(MTE, ExtendingEntity))
6892*67e74705SXin Li           warnOnLifetimeExtension(S, Entity, CurInit.get(),
6893*67e74705SXin Li                                   /*IsInitializerList=*/true,
6894*67e74705SXin Li                                   ExtendingEntity->getDecl());
6895*67e74705SXin Li 
6896*67e74705SXin Li       // Wrap it in a construction of a std::initializer_list<T>.
6897*67e74705SXin Li       CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
6898*67e74705SXin Li 
6899*67e74705SXin Li       // Bind the result, in case the library has given initializer_list a
6900*67e74705SXin Li       // non-trivial destructor.
6901*67e74705SXin Li       if (shouldBindAsTemporary(Entity))
6902*67e74705SXin Li         CurInit = S.MaybeBindToTemporary(CurInit.get());
6903*67e74705SXin Li       break;
6904*67e74705SXin Li     }
6905*67e74705SXin Li 
6906*67e74705SXin Li     case SK_OCLSamplerInit: {
6907*67e74705SXin Li       assert(Step->Type->isSamplerT() &&
6908*67e74705SXin Li              "Sampler initialization on non-sampler type.");
6909*67e74705SXin Li 
6910*67e74705SXin Li       QualType SourceType = CurInit.get()->getType();
6911*67e74705SXin Li 
6912*67e74705SXin Li       if (Entity.isParameterKind()) {
6913*67e74705SXin Li         if (!SourceType->isSamplerT())
6914*67e74705SXin Li           S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
6915*67e74705SXin Li             << SourceType;
6916*67e74705SXin Li       } else if (Entity.getKind() != InitializedEntity::EK_Variable) {
6917*67e74705SXin Li         llvm_unreachable("Invalid EntityKind!");
6918*67e74705SXin Li       }
6919*67e74705SXin Li 
6920*67e74705SXin Li       break;
6921*67e74705SXin Li     }
6922*67e74705SXin Li     case SK_OCLZeroEvent: {
6923*67e74705SXin Li       assert(Step->Type->isEventT() &&
6924*67e74705SXin Li              "Event initialization on non-event type.");
6925*67e74705SXin Li 
6926*67e74705SXin Li       CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
6927*67e74705SXin Li                                     CK_ZeroToOCLEvent,
6928*67e74705SXin Li                                     CurInit.get()->getValueKind());
6929*67e74705SXin Li       break;
6930*67e74705SXin Li     }
6931*67e74705SXin Li     }
6932*67e74705SXin Li   }
6933*67e74705SXin Li 
6934*67e74705SXin Li   // Diagnose non-fatal problems with the completed initialization.
6935*67e74705SXin Li   if (Entity.getKind() == InitializedEntity::EK_Member &&
6936*67e74705SXin Li       cast<FieldDecl>(Entity.getDecl())->isBitField())
6937*67e74705SXin Li     S.CheckBitFieldInitialization(Kind.getLocation(),
6938*67e74705SXin Li                                   cast<FieldDecl>(Entity.getDecl()),
6939*67e74705SXin Li                                   CurInit.get());
6940*67e74705SXin Li 
6941*67e74705SXin Li   // Check for std::move on construction.
6942*67e74705SXin Li   if (const Expr *E = CurInit.get()) {
6943*67e74705SXin Li     CheckMoveOnConstruction(S, E,
6944*67e74705SXin Li                             Entity.getKind() == InitializedEntity::EK_Result);
6945*67e74705SXin Li   }
6946*67e74705SXin Li 
6947*67e74705SXin Li   return CurInit;
6948*67e74705SXin Li }
6949*67e74705SXin Li 
6950*67e74705SXin Li /// Somewhere within T there is an uninitialized reference subobject.
6951*67e74705SXin Li /// Dig it out and diagnose it.
DiagnoseUninitializedReference(Sema & S,SourceLocation Loc,QualType T)6952*67e74705SXin Li static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc,
6953*67e74705SXin Li                                            QualType T) {
6954*67e74705SXin Li   if (T->isReferenceType()) {
6955*67e74705SXin Li     S.Diag(Loc, diag::err_reference_without_init)
6956*67e74705SXin Li       << T.getNonReferenceType();
6957*67e74705SXin Li     return true;
6958*67e74705SXin Li   }
6959*67e74705SXin Li 
6960*67e74705SXin Li   CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
6961*67e74705SXin Li   if (!RD || !RD->hasUninitializedReferenceMember())
6962*67e74705SXin Li     return false;
6963*67e74705SXin Li 
6964*67e74705SXin Li   for (const auto *FI : RD->fields()) {
6965*67e74705SXin Li     if (FI->isUnnamedBitfield())
6966*67e74705SXin Li       continue;
6967*67e74705SXin Li 
6968*67e74705SXin Li     if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) {
6969*67e74705SXin Li       S.Diag(Loc, diag::note_value_initialization_here) << RD;
6970*67e74705SXin Li       return true;
6971*67e74705SXin Li     }
6972*67e74705SXin Li   }
6973*67e74705SXin Li 
6974*67e74705SXin Li   for (const auto &BI : RD->bases()) {
6975*67e74705SXin Li     if (DiagnoseUninitializedReference(S, BI.getLocStart(), BI.getType())) {
6976*67e74705SXin Li       S.Diag(Loc, diag::note_value_initialization_here) << RD;
6977*67e74705SXin Li       return true;
6978*67e74705SXin Li     }
6979*67e74705SXin Li   }
6980*67e74705SXin Li 
6981*67e74705SXin Li   return false;
6982*67e74705SXin Li }
6983*67e74705SXin Li 
6984*67e74705SXin Li 
6985*67e74705SXin Li //===----------------------------------------------------------------------===//
6986*67e74705SXin Li // Diagnose initialization failures
6987*67e74705SXin Li //===----------------------------------------------------------------------===//
6988*67e74705SXin Li 
6989*67e74705SXin Li /// Emit notes associated with an initialization that failed due to a
6990*67e74705SXin Li /// "simple" conversion failure.
emitBadConversionNotes(Sema & S,const InitializedEntity & entity,Expr * op)6991*67e74705SXin Li static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity,
6992*67e74705SXin Li                                    Expr *op) {
6993*67e74705SXin Li   QualType destType = entity.getType();
6994*67e74705SXin Li   if (destType.getNonReferenceType()->isObjCObjectPointerType() &&
6995*67e74705SXin Li       op->getType()->isObjCObjectPointerType()) {
6996*67e74705SXin Li 
6997*67e74705SXin Li     // Emit a possible note about the conversion failing because the
6998*67e74705SXin Li     // operand is a message send with a related result type.
6999*67e74705SXin Li     S.EmitRelatedResultTypeNote(op);
7000*67e74705SXin Li 
7001*67e74705SXin Li     // Emit a possible note about a return failing because we're
7002*67e74705SXin Li     // expecting a related result type.
7003*67e74705SXin Li     if (entity.getKind() == InitializedEntity::EK_Result)
7004*67e74705SXin Li       S.EmitRelatedResultTypeNoteForReturn(destType);
7005*67e74705SXin Li   }
7006*67e74705SXin Li }
7007*67e74705SXin Li 
diagnoseListInit(Sema & S,const InitializedEntity & Entity,InitListExpr * InitList)7008*67e74705SXin Li static void diagnoseListInit(Sema &S, const InitializedEntity &Entity,
7009*67e74705SXin Li                              InitListExpr *InitList) {
7010*67e74705SXin Li   QualType DestType = Entity.getType();
7011*67e74705SXin Li 
7012*67e74705SXin Li   QualType E;
7013*67e74705SXin Li   if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) {
7014*67e74705SXin Li     QualType ArrayType = S.Context.getConstantArrayType(
7015*67e74705SXin Li         E.withConst(),
7016*67e74705SXin Li         llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
7017*67e74705SXin Li                     InitList->getNumInits()),
7018*67e74705SXin Li         clang::ArrayType::Normal, 0);
7019*67e74705SXin Li     InitializedEntity HiddenArray =
7020*67e74705SXin Li         InitializedEntity::InitializeTemporary(ArrayType);
7021*67e74705SXin Li     return diagnoseListInit(S, HiddenArray, InitList);
7022*67e74705SXin Li   }
7023*67e74705SXin Li 
7024*67e74705SXin Li   if (DestType->isReferenceType()) {
7025*67e74705SXin Li     // A list-initialization failure for a reference means that we tried to
7026*67e74705SXin Li     // create a temporary of the inner type (per [dcl.init.list]p3.6) and the
7027*67e74705SXin Li     // inner initialization failed.
7028*67e74705SXin Li     QualType T = DestType->getAs<ReferenceType>()->getPointeeType();
7029*67e74705SXin Li     diagnoseListInit(S, InitializedEntity::InitializeTemporary(T), InitList);
7030*67e74705SXin Li     SourceLocation Loc = InitList->getLocStart();
7031*67e74705SXin Li     if (auto *D = Entity.getDecl())
7032*67e74705SXin Li       Loc = D->getLocation();
7033*67e74705SXin Li     S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
7034*67e74705SXin Li     return;
7035*67e74705SXin Li   }
7036*67e74705SXin Li 
7037*67e74705SXin Li   InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
7038*67e74705SXin Li                                    /*VerifyOnly=*/false,
7039*67e74705SXin Li                                    /*TreatUnavailableAsInvalid=*/false);
7040*67e74705SXin Li   assert(DiagnoseInitList.HadError() &&
7041*67e74705SXin Li          "Inconsistent init list check result.");
7042*67e74705SXin Li }
7043*67e74705SXin Li 
Diagnose(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,ArrayRef<Expr * > Args)7044*67e74705SXin Li bool InitializationSequence::Diagnose(Sema &S,
7045*67e74705SXin Li                                       const InitializedEntity &Entity,
7046*67e74705SXin Li                                       const InitializationKind &Kind,
7047*67e74705SXin Li                                       ArrayRef<Expr *> Args) {
7048*67e74705SXin Li   if (!Failed())
7049*67e74705SXin Li     return false;
7050*67e74705SXin Li 
7051*67e74705SXin Li   QualType DestType = Entity.getType();
7052*67e74705SXin Li   switch (Failure) {
7053*67e74705SXin Li   case FK_TooManyInitsForReference:
7054*67e74705SXin Li     // FIXME: Customize for the initialized entity?
7055*67e74705SXin Li     if (Args.empty()) {
7056*67e74705SXin Li       // Dig out the reference subobject which is uninitialized and diagnose it.
7057*67e74705SXin Li       // If this is value-initialization, this could be nested some way within
7058*67e74705SXin Li       // the target type.
7059*67e74705SXin Li       assert(Kind.getKind() == InitializationKind::IK_Value ||
7060*67e74705SXin Li              DestType->isReferenceType());
7061*67e74705SXin Li       bool Diagnosed =
7062*67e74705SXin Li         DiagnoseUninitializedReference(S, Kind.getLocation(), DestType);
7063*67e74705SXin Li       assert(Diagnosed && "couldn't find uninitialized reference to diagnose");
7064*67e74705SXin Li       (void)Diagnosed;
7065*67e74705SXin Li     } else  // FIXME: diagnostic below could be better!
7066*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
7067*67e74705SXin Li         << SourceRange(Args.front()->getLocStart(), Args.back()->getLocEnd());
7068*67e74705SXin Li     break;
7069*67e74705SXin Li 
7070*67e74705SXin Li   case FK_ArrayNeedsInitList:
7071*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
7072*67e74705SXin Li     break;
7073*67e74705SXin Li   case FK_ArrayNeedsInitListOrStringLiteral:
7074*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
7075*67e74705SXin Li     break;
7076*67e74705SXin Li   case FK_ArrayNeedsInitListOrWideStringLiteral:
7077*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
7078*67e74705SXin Li     break;
7079*67e74705SXin Li   case FK_NarrowStringIntoWideCharArray:
7080*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
7081*67e74705SXin Li     break;
7082*67e74705SXin Li   case FK_WideStringIntoCharArray:
7083*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
7084*67e74705SXin Li     break;
7085*67e74705SXin Li   case FK_IncompatWideStringIntoWideChar:
7086*67e74705SXin Li     S.Diag(Kind.getLocation(),
7087*67e74705SXin Li            diag::err_array_init_incompat_wide_string_into_wchar);
7088*67e74705SXin Li     break;
7089*67e74705SXin Li   case FK_ArrayTypeMismatch:
7090*67e74705SXin Li   case FK_NonConstantArrayInit:
7091*67e74705SXin Li     S.Diag(Kind.getLocation(),
7092*67e74705SXin Li            (Failure == FK_ArrayTypeMismatch
7093*67e74705SXin Li               ? diag::err_array_init_different_type
7094*67e74705SXin Li               : diag::err_array_init_non_constant_array))
7095*67e74705SXin Li       << DestType.getNonReferenceType()
7096*67e74705SXin Li       << Args[0]->getType()
7097*67e74705SXin Li       << Args[0]->getSourceRange();
7098*67e74705SXin Li     break;
7099*67e74705SXin Li 
7100*67e74705SXin Li   case FK_VariableLengthArrayHasInitializer:
7101*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_variable_object_no_init)
7102*67e74705SXin Li       << Args[0]->getSourceRange();
7103*67e74705SXin Li     break;
7104*67e74705SXin Li 
7105*67e74705SXin Li   case FK_AddressOfOverloadFailed: {
7106*67e74705SXin Li     DeclAccessPair Found;
7107*67e74705SXin Li     S.ResolveAddressOfOverloadedFunction(Args[0],
7108*67e74705SXin Li                                          DestType.getNonReferenceType(),
7109*67e74705SXin Li                                          true,
7110*67e74705SXin Li                                          Found);
7111*67e74705SXin Li     break;
7112*67e74705SXin Li   }
7113*67e74705SXin Li 
7114*67e74705SXin Li   case FK_AddressOfUnaddressableFunction: {
7115*67e74705SXin Li     auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(Args[0])->getDecl());
7116*67e74705SXin Li     S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
7117*67e74705SXin Li                                         Args[0]->getLocStart());
7118*67e74705SXin Li     break;
7119*67e74705SXin Li   }
7120*67e74705SXin Li 
7121*67e74705SXin Li   case FK_ReferenceInitOverloadFailed:
7122*67e74705SXin Li   case FK_UserConversionOverloadFailed:
7123*67e74705SXin Li     switch (FailedOverloadResult) {
7124*67e74705SXin Li     case OR_Ambiguous:
7125*67e74705SXin Li       if (Failure == FK_UserConversionOverloadFailed)
7126*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_typecheck_ambiguous_condition)
7127*67e74705SXin Li           << Args[0]->getType() << DestType
7128*67e74705SXin Li           << Args[0]->getSourceRange();
7129*67e74705SXin Li       else
7130*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_ref_init_ambiguous)
7131*67e74705SXin Li           << DestType << Args[0]->getType()
7132*67e74705SXin Li           << Args[0]->getSourceRange();
7133*67e74705SXin Li 
7134*67e74705SXin Li       FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args);
7135*67e74705SXin Li       break;
7136*67e74705SXin Li 
7137*67e74705SXin Li     case OR_No_Viable_Function:
7138*67e74705SXin Li       if (!S.RequireCompleteType(Kind.getLocation(),
7139*67e74705SXin Li                                  DestType.getNonReferenceType(),
7140*67e74705SXin Li                           diag::err_typecheck_nonviable_condition_incomplete,
7141*67e74705SXin Li                                Args[0]->getType(), Args[0]->getSourceRange()))
7142*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
7143*67e74705SXin Li           << (Entity.getKind() == InitializedEntity::EK_Result)
7144*67e74705SXin Li           << Args[0]->getType() << Args[0]->getSourceRange()
7145*67e74705SXin Li           << DestType.getNonReferenceType();
7146*67e74705SXin Li 
7147*67e74705SXin Li       FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args);
7148*67e74705SXin Li       break;
7149*67e74705SXin Li 
7150*67e74705SXin Li     case OR_Deleted: {
7151*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
7152*67e74705SXin Li         << Args[0]->getType() << DestType.getNonReferenceType()
7153*67e74705SXin Li         << Args[0]->getSourceRange();
7154*67e74705SXin Li       OverloadCandidateSet::iterator Best;
7155*67e74705SXin Li       OverloadingResult Ovl
7156*67e74705SXin Li         = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best,
7157*67e74705SXin Li                                                 true);
7158*67e74705SXin Li       if (Ovl == OR_Deleted) {
7159*67e74705SXin Li         S.NoteDeletedFunction(Best->Function);
7160*67e74705SXin Li       } else {
7161*67e74705SXin Li         llvm_unreachable("Inconsistent overload resolution?");
7162*67e74705SXin Li       }
7163*67e74705SXin Li       break;
7164*67e74705SXin Li     }
7165*67e74705SXin Li 
7166*67e74705SXin Li     case OR_Success:
7167*67e74705SXin Li       llvm_unreachable("Conversion did not fail!");
7168*67e74705SXin Li     }
7169*67e74705SXin Li     break;
7170*67e74705SXin Li 
7171*67e74705SXin Li   case FK_NonConstLValueReferenceBindingToTemporary:
7172*67e74705SXin Li     if (isa<InitListExpr>(Args[0])) {
7173*67e74705SXin Li       S.Diag(Kind.getLocation(),
7174*67e74705SXin Li              diag::err_lvalue_reference_bind_to_initlist)
7175*67e74705SXin Li       << DestType.getNonReferenceType().isVolatileQualified()
7176*67e74705SXin Li       << DestType.getNonReferenceType()
7177*67e74705SXin Li       << Args[0]->getSourceRange();
7178*67e74705SXin Li       break;
7179*67e74705SXin Li     }
7180*67e74705SXin Li     // Intentional fallthrough
7181*67e74705SXin Li 
7182*67e74705SXin Li   case FK_NonConstLValueReferenceBindingToUnrelated:
7183*67e74705SXin Li     S.Diag(Kind.getLocation(),
7184*67e74705SXin Li            Failure == FK_NonConstLValueReferenceBindingToTemporary
7185*67e74705SXin Li              ? diag::err_lvalue_reference_bind_to_temporary
7186*67e74705SXin Li              : diag::err_lvalue_reference_bind_to_unrelated)
7187*67e74705SXin Li       << DestType.getNonReferenceType().isVolatileQualified()
7188*67e74705SXin Li       << DestType.getNonReferenceType()
7189*67e74705SXin Li       << Args[0]->getType()
7190*67e74705SXin Li       << Args[0]->getSourceRange();
7191*67e74705SXin Li     break;
7192*67e74705SXin Li 
7193*67e74705SXin Li   case FK_RValueReferenceBindingToLValue:
7194*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
7195*67e74705SXin Li       << DestType.getNonReferenceType() << Args[0]->getType()
7196*67e74705SXin Li       << Args[0]->getSourceRange();
7197*67e74705SXin Li     break;
7198*67e74705SXin Li 
7199*67e74705SXin Li   case FK_ReferenceInitDropsQualifiers: {
7200*67e74705SXin Li     QualType SourceType = Args[0]->getType();
7201*67e74705SXin Li     QualType NonRefType = DestType.getNonReferenceType();
7202*67e74705SXin Li     Qualifiers DroppedQualifiers =
7203*67e74705SXin Li         SourceType.getQualifiers() - NonRefType.getQualifiers();
7204*67e74705SXin Li 
7205*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
7206*67e74705SXin Li       << SourceType
7207*67e74705SXin Li       << NonRefType
7208*67e74705SXin Li       << DroppedQualifiers.getCVRQualifiers()
7209*67e74705SXin Li       << Args[0]->getSourceRange();
7210*67e74705SXin Li     break;
7211*67e74705SXin Li   }
7212*67e74705SXin Li 
7213*67e74705SXin Li   case FK_ReferenceInitFailed:
7214*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_reference_bind_failed)
7215*67e74705SXin Li       << DestType.getNonReferenceType()
7216*67e74705SXin Li       << Args[0]->isLValue()
7217*67e74705SXin Li       << Args[0]->getType()
7218*67e74705SXin Li       << Args[0]->getSourceRange();
7219*67e74705SXin Li     emitBadConversionNotes(S, Entity, Args[0]);
7220*67e74705SXin Li     break;
7221*67e74705SXin Li 
7222*67e74705SXin Li   case FK_ConversionFailed: {
7223*67e74705SXin Li     QualType FromType = Args[0]->getType();
7224*67e74705SXin Li     PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
7225*67e74705SXin Li       << (int)Entity.getKind()
7226*67e74705SXin Li       << DestType
7227*67e74705SXin Li       << Args[0]->isLValue()
7228*67e74705SXin Li       << FromType
7229*67e74705SXin Li       << Args[0]->getSourceRange();
7230*67e74705SXin Li     S.HandleFunctionTypeMismatch(PDiag, FromType, DestType);
7231*67e74705SXin Li     S.Diag(Kind.getLocation(), PDiag);
7232*67e74705SXin Li     emitBadConversionNotes(S, Entity, Args[0]);
7233*67e74705SXin Li     break;
7234*67e74705SXin Li   }
7235*67e74705SXin Li 
7236*67e74705SXin Li   case FK_ConversionFromPropertyFailed:
7237*67e74705SXin Li     // No-op. This error has already been reported.
7238*67e74705SXin Li     break;
7239*67e74705SXin Li 
7240*67e74705SXin Li   case FK_TooManyInitsForScalar: {
7241*67e74705SXin Li     SourceRange R;
7242*67e74705SXin Li 
7243*67e74705SXin Li     auto *InitList = dyn_cast<InitListExpr>(Args[0]);
7244*67e74705SXin Li     if (InitList && InitList->getNumInits() >= 1) {
7245*67e74705SXin Li       R = SourceRange(InitList->getInit(0)->getLocEnd(), InitList->getLocEnd());
7246*67e74705SXin Li     } else {
7247*67e74705SXin Li       assert(Args.size() > 1 && "Expected multiple initializers!");
7248*67e74705SXin Li       R = SourceRange(Args.front()->getLocEnd(), Args.back()->getLocEnd());
7249*67e74705SXin Li     }
7250*67e74705SXin Li 
7251*67e74705SXin Li     R.setBegin(S.getLocForEndOfToken(R.getBegin()));
7252*67e74705SXin Li     if (Kind.isCStyleOrFunctionalCast())
7253*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
7254*67e74705SXin Li         << R;
7255*67e74705SXin Li     else
7256*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::err_excess_initializers)
7257*67e74705SXin Li         << /*scalar=*/2 << R;
7258*67e74705SXin Li     break;
7259*67e74705SXin Li   }
7260*67e74705SXin Li 
7261*67e74705SXin Li   case FK_ReferenceBindingToInitList:
7262*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
7263*67e74705SXin Li       << DestType.getNonReferenceType() << Args[0]->getSourceRange();
7264*67e74705SXin Li     break;
7265*67e74705SXin Li 
7266*67e74705SXin Li   case FK_InitListBadDestinationType:
7267*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
7268*67e74705SXin Li       << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange();
7269*67e74705SXin Li     break;
7270*67e74705SXin Li 
7271*67e74705SXin Li   case FK_ListConstructorOverloadFailed:
7272*67e74705SXin Li   case FK_ConstructorOverloadFailed: {
7273*67e74705SXin Li     SourceRange ArgsRange;
7274*67e74705SXin Li     if (Args.size())
7275*67e74705SXin Li       ArgsRange = SourceRange(Args.front()->getLocStart(),
7276*67e74705SXin Li                               Args.back()->getLocEnd());
7277*67e74705SXin Li 
7278*67e74705SXin Li     if (Failure == FK_ListConstructorOverloadFailed) {
7279*67e74705SXin Li       assert(Args.size() == 1 &&
7280*67e74705SXin Li              "List construction from other than 1 argument.");
7281*67e74705SXin Li       InitListExpr *InitList = cast<InitListExpr>(Args[0]);
7282*67e74705SXin Li       Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
7283*67e74705SXin Li     }
7284*67e74705SXin Li 
7285*67e74705SXin Li     // FIXME: Using "DestType" for the entity we're printing is probably
7286*67e74705SXin Li     // bad.
7287*67e74705SXin Li     switch (FailedOverloadResult) {
7288*67e74705SXin Li       case OR_Ambiguous:
7289*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_ovl_ambiguous_init)
7290*67e74705SXin Li           << DestType << ArgsRange;
7291*67e74705SXin Li         FailedCandidateSet.NoteCandidates(S, OCD_ViableCandidates, Args);
7292*67e74705SXin Li         break;
7293*67e74705SXin Li 
7294*67e74705SXin Li       case OR_No_Viable_Function:
7295*67e74705SXin Li         if (Kind.getKind() == InitializationKind::IK_Default &&
7296*67e74705SXin Li             (Entity.getKind() == InitializedEntity::EK_Base ||
7297*67e74705SXin Li              Entity.getKind() == InitializedEntity::EK_Member) &&
7298*67e74705SXin Li             isa<CXXConstructorDecl>(S.CurContext)) {
7299*67e74705SXin Li           // This is implicit default initialization of a member or
7300*67e74705SXin Li           // base within a constructor. If no viable function was
7301*67e74705SXin Li           // found, notify the user that they need to explicitly
7302*67e74705SXin Li           // initialize this base/member.
7303*67e74705SXin Li           CXXConstructorDecl *Constructor
7304*67e74705SXin Li             = cast<CXXConstructorDecl>(S.CurContext);
7305*67e74705SXin Li           const CXXRecordDecl *InheritedFrom = nullptr;
7306*67e74705SXin Li           if (auto Inherited = Constructor->getInheritedConstructor())
7307*67e74705SXin Li             InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
7308*67e74705SXin Li           if (Entity.getKind() == InitializedEntity::EK_Base) {
7309*67e74705SXin Li             S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
7310*67e74705SXin Li               << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
7311*67e74705SXin Li               << S.Context.getTypeDeclType(Constructor->getParent())
7312*67e74705SXin Li               << /*base=*/0
7313*67e74705SXin Li               << Entity.getType()
7314*67e74705SXin Li               << InheritedFrom;
7315*67e74705SXin Li 
7316*67e74705SXin Li             RecordDecl *BaseDecl
7317*67e74705SXin Li               = Entity.getBaseSpecifier()->getType()->getAs<RecordType>()
7318*67e74705SXin Li                                                                   ->getDecl();
7319*67e74705SXin Li             S.Diag(BaseDecl->getLocation(), diag::note_previous_decl)
7320*67e74705SXin Li               << S.Context.getTagDeclType(BaseDecl);
7321*67e74705SXin Li           } else {
7322*67e74705SXin Li             S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
7323*67e74705SXin Li               << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
7324*67e74705SXin Li               << S.Context.getTypeDeclType(Constructor->getParent())
7325*67e74705SXin Li               << /*member=*/1
7326*67e74705SXin Li               << Entity.getName()
7327*67e74705SXin Li               << InheritedFrom;
7328*67e74705SXin Li             S.Diag(Entity.getDecl()->getLocation(),
7329*67e74705SXin Li                    diag::note_member_declared_at);
7330*67e74705SXin Li 
7331*67e74705SXin Li             if (const RecordType *Record
7332*67e74705SXin Li                                  = Entity.getType()->getAs<RecordType>())
7333*67e74705SXin Li               S.Diag(Record->getDecl()->getLocation(),
7334*67e74705SXin Li                      diag::note_previous_decl)
7335*67e74705SXin Li                 << S.Context.getTagDeclType(Record->getDecl());
7336*67e74705SXin Li           }
7337*67e74705SXin Li           break;
7338*67e74705SXin Li         }
7339*67e74705SXin Li 
7340*67e74705SXin Li         S.Diag(Kind.getLocation(), diag::err_ovl_no_viable_function_in_init)
7341*67e74705SXin Li           << DestType << ArgsRange;
7342*67e74705SXin Li         FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args);
7343*67e74705SXin Li         break;
7344*67e74705SXin Li 
7345*67e74705SXin Li       case OR_Deleted: {
7346*67e74705SXin Li         OverloadCandidateSet::iterator Best;
7347*67e74705SXin Li         OverloadingResult Ovl
7348*67e74705SXin Li           = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
7349*67e74705SXin Li         if (Ovl != OR_Deleted) {
7350*67e74705SXin Li           S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
7351*67e74705SXin Li             << true << DestType << ArgsRange;
7352*67e74705SXin Li           llvm_unreachable("Inconsistent overload resolution?");
7353*67e74705SXin Li           break;
7354*67e74705SXin Li         }
7355*67e74705SXin Li 
7356*67e74705SXin Li         // If this is a defaulted or implicitly-declared function, then
7357*67e74705SXin Li         // it was implicitly deleted. Make it clear that the deletion was
7358*67e74705SXin Li         // implicit.
7359*67e74705SXin Li         if (S.isImplicitlyDeleted(Best->Function))
7360*67e74705SXin Li           S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
7361*67e74705SXin Li             << S.getSpecialMember(cast<CXXMethodDecl>(Best->Function))
7362*67e74705SXin Li             << DestType << ArgsRange;
7363*67e74705SXin Li         else
7364*67e74705SXin Li           S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
7365*67e74705SXin Li             << true << DestType << ArgsRange;
7366*67e74705SXin Li 
7367*67e74705SXin Li         S.NoteDeletedFunction(Best->Function);
7368*67e74705SXin Li         break;
7369*67e74705SXin Li       }
7370*67e74705SXin Li 
7371*67e74705SXin Li       case OR_Success:
7372*67e74705SXin Li         llvm_unreachable("Conversion did not fail!");
7373*67e74705SXin Li     }
7374*67e74705SXin Li   }
7375*67e74705SXin Li   break;
7376*67e74705SXin Li 
7377*67e74705SXin Li   case FK_DefaultInitOfConst:
7378*67e74705SXin Li     if (Entity.getKind() == InitializedEntity::EK_Member &&
7379*67e74705SXin Li         isa<CXXConstructorDecl>(S.CurContext)) {
7380*67e74705SXin Li       // This is implicit default-initialization of a const member in
7381*67e74705SXin Li       // a constructor. Complain that it needs to be explicitly
7382*67e74705SXin Li       // initialized.
7383*67e74705SXin Li       CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext);
7384*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
7385*67e74705SXin Li         << (Constructor->getInheritedConstructor() ? 2 :
7386*67e74705SXin Li             Constructor->isImplicit() ? 1 : 0)
7387*67e74705SXin Li         << S.Context.getTypeDeclType(Constructor->getParent())
7388*67e74705SXin Li         << /*const=*/1
7389*67e74705SXin Li         << Entity.getName();
7390*67e74705SXin Li       S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl)
7391*67e74705SXin Li         << Entity.getName();
7392*67e74705SXin Li     } else {
7393*67e74705SXin Li       S.Diag(Kind.getLocation(), diag::err_default_init_const)
7394*67e74705SXin Li           << DestType << (bool)DestType->getAs<RecordType>();
7395*67e74705SXin Li     }
7396*67e74705SXin Li     break;
7397*67e74705SXin Li 
7398*67e74705SXin Li   case FK_Incomplete:
7399*67e74705SXin Li     S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
7400*67e74705SXin Li                           diag::err_init_incomplete_type);
7401*67e74705SXin Li     break;
7402*67e74705SXin Li 
7403*67e74705SXin Li   case FK_ListInitializationFailed: {
7404*67e74705SXin Li     // Run the init list checker again to emit diagnostics.
7405*67e74705SXin Li     InitListExpr *InitList = cast<InitListExpr>(Args[0]);
7406*67e74705SXin Li     diagnoseListInit(S, Entity, InitList);
7407*67e74705SXin Li     break;
7408*67e74705SXin Li   }
7409*67e74705SXin Li 
7410*67e74705SXin Li   case FK_PlaceholderType: {
7411*67e74705SXin Li     // FIXME: Already diagnosed!
7412*67e74705SXin Li     break;
7413*67e74705SXin Li   }
7414*67e74705SXin Li 
7415*67e74705SXin Li   case FK_ExplicitConstructor: {
7416*67e74705SXin Li     S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
7417*67e74705SXin Li       << Args[0]->getSourceRange();
7418*67e74705SXin Li     OverloadCandidateSet::iterator Best;
7419*67e74705SXin Li     OverloadingResult Ovl
7420*67e74705SXin Li       = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
7421*67e74705SXin Li     (void)Ovl;
7422*67e74705SXin Li     assert(Ovl == OR_Success && "Inconsistent overload resolution");
7423*67e74705SXin Li     CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
7424*67e74705SXin Li     S.Diag(CtorDecl->getLocation(), diag::note_constructor_declared_here);
7425*67e74705SXin Li     break;
7426*67e74705SXin Li   }
7427*67e74705SXin Li   }
7428*67e74705SXin Li 
7429*67e74705SXin Li   PrintInitLocationNote(S, Entity);
7430*67e74705SXin Li   return true;
7431*67e74705SXin Li }
7432*67e74705SXin Li 
dump(raw_ostream & OS) const7433*67e74705SXin Li void InitializationSequence::dump(raw_ostream &OS) const {
7434*67e74705SXin Li   switch (SequenceKind) {
7435*67e74705SXin Li   case FailedSequence: {
7436*67e74705SXin Li     OS << "Failed sequence: ";
7437*67e74705SXin Li     switch (Failure) {
7438*67e74705SXin Li     case FK_TooManyInitsForReference:
7439*67e74705SXin Li       OS << "too many initializers for reference";
7440*67e74705SXin Li       break;
7441*67e74705SXin Li 
7442*67e74705SXin Li     case FK_ArrayNeedsInitList:
7443*67e74705SXin Li       OS << "array requires initializer list";
7444*67e74705SXin Li       break;
7445*67e74705SXin Li 
7446*67e74705SXin Li     case FK_AddressOfUnaddressableFunction:
7447*67e74705SXin Li       OS << "address of unaddressable function was taken";
7448*67e74705SXin Li       break;
7449*67e74705SXin Li 
7450*67e74705SXin Li     case FK_ArrayNeedsInitListOrStringLiteral:
7451*67e74705SXin Li       OS << "array requires initializer list or string literal";
7452*67e74705SXin Li       break;
7453*67e74705SXin Li 
7454*67e74705SXin Li     case FK_ArrayNeedsInitListOrWideStringLiteral:
7455*67e74705SXin Li       OS << "array requires initializer list or wide string literal";
7456*67e74705SXin Li       break;
7457*67e74705SXin Li 
7458*67e74705SXin Li     case FK_NarrowStringIntoWideCharArray:
7459*67e74705SXin Li       OS << "narrow string into wide char array";
7460*67e74705SXin Li       break;
7461*67e74705SXin Li 
7462*67e74705SXin Li     case FK_WideStringIntoCharArray:
7463*67e74705SXin Li       OS << "wide string into char array";
7464*67e74705SXin Li       break;
7465*67e74705SXin Li 
7466*67e74705SXin Li     case FK_IncompatWideStringIntoWideChar:
7467*67e74705SXin Li       OS << "incompatible wide string into wide char array";
7468*67e74705SXin Li       break;
7469*67e74705SXin Li 
7470*67e74705SXin Li     case FK_ArrayTypeMismatch:
7471*67e74705SXin Li       OS << "array type mismatch";
7472*67e74705SXin Li       break;
7473*67e74705SXin Li 
7474*67e74705SXin Li     case FK_NonConstantArrayInit:
7475*67e74705SXin Li       OS << "non-constant array initializer";
7476*67e74705SXin Li       break;
7477*67e74705SXin Li 
7478*67e74705SXin Li     case FK_AddressOfOverloadFailed:
7479*67e74705SXin Li       OS << "address of overloaded function failed";
7480*67e74705SXin Li       break;
7481*67e74705SXin Li 
7482*67e74705SXin Li     case FK_ReferenceInitOverloadFailed:
7483*67e74705SXin Li       OS << "overload resolution for reference initialization failed";
7484*67e74705SXin Li       break;
7485*67e74705SXin Li 
7486*67e74705SXin Li     case FK_NonConstLValueReferenceBindingToTemporary:
7487*67e74705SXin Li       OS << "non-const lvalue reference bound to temporary";
7488*67e74705SXin Li       break;
7489*67e74705SXin Li 
7490*67e74705SXin Li     case FK_NonConstLValueReferenceBindingToUnrelated:
7491*67e74705SXin Li       OS << "non-const lvalue reference bound to unrelated type";
7492*67e74705SXin Li       break;
7493*67e74705SXin Li 
7494*67e74705SXin Li     case FK_RValueReferenceBindingToLValue:
7495*67e74705SXin Li       OS << "rvalue reference bound to an lvalue";
7496*67e74705SXin Li       break;
7497*67e74705SXin Li 
7498*67e74705SXin Li     case FK_ReferenceInitDropsQualifiers:
7499*67e74705SXin Li       OS << "reference initialization drops qualifiers";
7500*67e74705SXin Li       break;
7501*67e74705SXin Li 
7502*67e74705SXin Li     case FK_ReferenceInitFailed:
7503*67e74705SXin Li       OS << "reference initialization failed";
7504*67e74705SXin Li       break;
7505*67e74705SXin Li 
7506*67e74705SXin Li     case FK_ConversionFailed:
7507*67e74705SXin Li       OS << "conversion failed";
7508*67e74705SXin Li       break;
7509*67e74705SXin Li 
7510*67e74705SXin Li     case FK_ConversionFromPropertyFailed:
7511*67e74705SXin Li       OS << "conversion from property failed";
7512*67e74705SXin Li       break;
7513*67e74705SXin Li 
7514*67e74705SXin Li     case FK_TooManyInitsForScalar:
7515*67e74705SXin Li       OS << "too many initializers for scalar";
7516*67e74705SXin Li       break;
7517*67e74705SXin Li 
7518*67e74705SXin Li     case FK_ReferenceBindingToInitList:
7519*67e74705SXin Li       OS << "referencing binding to initializer list";
7520*67e74705SXin Li       break;
7521*67e74705SXin Li 
7522*67e74705SXin Li     case FK_InitListBadDestinationType:
7523*67e74705SXin Li       OS << "initializer list for non-aggregate, non-scalar type";
7524*67e74705SXin Li       break;
7525*67e74705SXin Li 
7526*67e74705SXin Li     case FK_UserConversionOverloadFailed:
7527*67e74705SXin Li       OS << "overloading failed for user-defined conversion";
7528*67e74705SXin Li       break;
7529*67e74705SXin Li 
7530*67e74705SXin Li     case FK_ConstructorOverloadFailed:
7531*67e74705SXin Li       OS << "constructor overloading failed";
7532*67e74705SXin Li       break;
7533*67e74705SXin Li 
7534*67e74705SXin Li     case FK_DefaultInitOfConst:
7535*67e74705SXin Li       OS << "default initialization of a const variable";
7536*67e74705SXin Li       break;
7537*67e74705SXin Li 
7538*67e74705SXin Li     case FK_Incomplete:
7539*67e74705SXin Li       OS << "initialization of incomplete type";
7540*67e74705SXin Li       break;
7541*67e74705SXin Li 
7542*67e74705SXin Li     case FK_ListInitializationFailed:
7543*67e74705SXin Li       OS << "list initialization checker failure";
7544*67e74705SXin Li       break;
7545*67e74705SXin Li 
7546*67e74705SXin Li     case FK_VariableLengthArrayHasInitializer:
7547*67e74705SXin Li       OS << "variable length array has an initializer";
7548*67e74705SXin Li       break;
7549*67e74705SXin Li 
7550*67e74705SXin Li     case FK_PlaceholderType:
7551*67e74705SXin Li       OS << "initializer expression isn't contextually valid";
7552*67e74705SXin Li       break;
7553*67e74705SXin Li 
7554*67e74705SXin Li     case FK_ListConstructorOverloadFailed:
7555*67e74705SXin Li       OS << "list constructor overloading failed";
7556*67e74705SXin Li       break;
7557*67e74705SXin Li 
7558*67e74705SXin Li     case FK_ExplicitConstructor:
7559*67e74705SXin Li       OS << "list copy initialization chose explicit constructor";
7560*67e74705SXin Li       break;
7561*67e74705SXin Li     }
7562*67e74705SXin Li     OS << '\n';
7563*67e74705SXin Li     return;
7564*67e74705SXin Li   }
7565*67e74705SXin Li 
7566*67e74705SXin Li   case DependentSequence:
7567*67e74705SXin Li     OS << "Dependent sequence\n";
7568*67e74705SXin Li     return;
7569*67e74705SXin Li 
7570*67e74705SXin Li   case NormalSequence:
7571*67e74705SXin Li     OS << "Normal sequence: ";
7572*67e74705SXin Li     break;
7573*67e74705SXin Li   }
7574*67e74705SXin Li 
7575*67e74705SXin Li   for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
7576*67e74705SXin Li     if (S != step_begin()) {
7577*67e74705SXin Li       OS << " -> ";
7578*67e74705SXin Li     }
7579*67e74705SXin Li 
7580*67e74705SXin Li     switch (S->Kind) {
7581*67e74705SXin Li     case SK_ResolveAddressOfOverloadedFunction:
7582*67e74705SXin Li       OS << "resolve address of overloaded function";
7583*67e74705SXin Li       break;
7584*67e74705SXin Li 
7585*67e74705SXin Li     case SK_CastDerivedToBaseRValue:
7586*67e74705SXin Li       OS << "derived-to-base case (rvalue" << S->Type.getAsString() << ")";
7587*67e74705SXin Li       break;
7588*67e74705SXin Li 
7589*67e74705SXin Li     case SK_CastDerivedToBaseXValue:
7590*67e74705SXin Li       OS << "derived-to-base case (xvalue" << S->Type.getAsString() << ")";
7591*67e74705SXin Li       break;
7592*67e74705SXin Li 
7593*67e74705SXin Li     case SK_CastDerivedToBaseLValue:
7594*67e74705SXin Li       OS << "derived-to-base case (lvalue" << S->Type.getAsString() << ")";
7595*67e74705SXin Li       break;
7596*67e74705SXin Li 
7597*67e74705SXin Li     case SK_BindReference:
7598*67e74705SXin Li       OS << "bind reference to lvalue";
7599*67e74705SXin Li       break;
7600*67e74705SXin Li 
7601*67e74705SXin Li     case SK_BindReferenceToTemporary:
7602*67e74705SXin Li       OS << "bind reference to a temporary";
7603*67e74705SXin Li       break;
7604*67e74705SXin Li 
7605*67e74705SXin Li     case SK_ExtraneousCopyToTemporary:
7606*67e74705SXin Li       OS << "extraneous C++03 copy to temporary";
7607*67e74705SXin Li       break;
7608*67e74705SXin Li 
7609*67e74705SXin Li     case SK_UserConversion:
7610*67e74705SXin Li       OS << "user-defined conversion via " << *S->Function.Function;
7611*67e74705SXin Li       break;
7612*67e74705SXin Li 
7613*67e74705SXin Li     case SK_QualificationConversionRValue:
7614*67e74705SXin Li       OS << "qualification conversion (rvalue)";
7615*67e74705SXin Li       break;
7616*67e74705SXin Li 
7617*67e74705SXin Li     case SK_QualificationConversionXValue:
7618*67e74705SXin Li       OS << "qualification conversion (xvalue)";
7619*67e74705SXin Li       break;
7620*67e74705SXin Li 
7621*67e74705SXin Li     case SK_QualificationConversionLValue:
7622*67e74705SXin Li       OS << "qualification conversion (lvalue)";
7623*67e74705SXin Li       break;
7624*67e74705SXin Li 
7625*67e74705SXin Li     case SK_AtomicConversion:
7626*67e74705SXin Li       OS << "non-atomic-to-atomic conversion";
7627*67e74705SXin Li       break;
7628*67e74705SXin Li 
7629*67e74705SXin Li     case SK_LValueToRValue:
7630*67e74705SXin Li       OS << "load (lvalue to rvalue)";
7631*67e74705SXin Li       break;
7632*67e74705SXin Li 
7633*67e74705SXin Li     case SK_ConversionSequence:
7634*67e74705SXin Li       OS << "implicit conversion sequence (";
7635*67e74705SXin Li       S->ICS->dump(); // FIXME: use OS
7636*67e74705SXin Li       OS << ")";
7637*67e74705SXin Li       break;
7638*67e74705SXin Li 
7639*67e74705SXin Li     case SK_ConversionSequenceNoNarrowing:
7640*67e74705SXin Li       OS << "implicit conversion sequence with narrowing prohibited (";
7641*67e74705SXin Li       S->ICS->dump(); // FIXME: use OS
7642*67e74705SXin Li       OS << ")";
7643*67e74705SXin Li       break;
7644*67e74705SXin Li 
7645*67e74705SXin Li     case SK_ListInitialization:
7646*67e74705SXin Li       OS << "list aggregate initialization";
7647*67e74705SXin Li       break;
7648*67e74705SXin Li 
7649*67e74705SXin Li     case SK_UnwrapInitList:
7650*67e74705SXin Li       OS << "unwrap reference initializer list";
7651*67e74705SXin Li       break;
7652*67e74705SXin Li 
7653*67e74705SXin Li     case SK_RewrapInitList:
7654*67e74705SXin Li       OS << "rewrap reference initializer list";
7655*67e74705SXin Li       break;
7656*67e74705SXin Li 
7657*67e74705SXin Li     case SK_ConstructorInitialization:
7658*67e74705SXin Li       OS << "constructor initialization";
7659*67e74705SXin Li       break;
7660*67e74705SXin Li 
7661*67e74705SXin Li     case SK_ConstructorInitializationFromList:
7662*67e74705SXin Li       OS << "list initialization via constructor";
7663*67e74705SXin Li       break;
7664*67e74705SXin Li 
7665*67e74705SXin Li     case SK_ZeroInitialization:
7666*67e74705SXin Li       OS << "zero initialization";
7667*67e74705SXin Li       break;
7668*67e74705SXin Li 
7669*67e74705SXin Li     case SK_CAssignment:
7670*67e74705SXin Li       OS << "C assignment";
7671*67e74705SXin Li       break;
7672*67e74705SXin Li 
7673*67e74705SXin Li     case SK_StringInit:
7674*67e74705SXin Li       OS << "string initialization";
7675*67e74705SXin Li       break;
7676*67e74705SXin Li 
7677*67e74705SXin Li     case SK_ObjCObjectConversion:
7678*67e74705SXin Li       OS << "Objective-C object conversion";
7679*67e74705SXin Li       break;
7680*67e74705SXin Li 
7681*67e74705SXin Li     case SK_ArrayInit:
7682*67e74705SXin Li       OS << "array initialization";
7683*67e74705SXin Li       break;
7684*67e74705SXin Li 
7685*67e74705SXin Li     case SK_ParenthesizedArrayInit:
7686*67e74705SXin Li       OS << "parenthesized array initialization";
7687*67e74705SXin Li       break;
7688*67e74705SXin Li 
7689*67e74705SXin Li     case SK_PassByIndirectCopyRestore:
7690*67e74705SXin Li       OS << "pass by indirect copy and restore";
7691*67e74705SXin Li       break;
7692*67e74705SXin Li 
7693*67e74705SXin Li     case SK_PassByIndirectRestore:
7694*67e74705SXin Li       OS << "pass by indirect restore";
7695*67e74705SXin Li       break;
7696*67e74705SXin Li 
7697*67e74705SXin Li     case SK_ProduceObjCObject:
7698*67e74705SXin Li       OS << "Objective-C object retension";
7699*67e74705SXin Li       break;
7700*67e74705SXin Li 
7701*67e74705SXin Li     case SK_StdInitializerList:
7702*67e74705SXin Li       OS << "std::initializer_list from initializer list";
7703*67e74705SXin Li       break;
7704*67e74705SXin Li 
7705*67e74705SXin Li     case SK_StdInitializerListConstructorCall:
7706*67e74705SXin Li       OS << "list initialization from std::initializer_list";
7707*67e74705SXin Li       break;
7708*67e74705SXin Li 
7709*67e74705SXin Li     case SK_OCLSamplerInit:
7710*67e74705SXin Li       OS << "OpenCL sampler_t from integer constant";
7711*67e74705SXin Li       break;
7712*67e74705SXin Li 
7713*67e74705SXin Li     case SK_OCLZeroEvent:
7714*67e74705SXin Li       OS << "OpenCL event_t from zero";
7715*67e74705SXin Li       break;
7716*67e74705SXin Li     }
7717*67e74705SXin Li 
7718*67e74705SXin Li     OS << " [" << S->Type.getAsString() << ']';
7719*67e74705SXin Li   }
7720*67e74705SXin Li 
7721*67e74705SXin Li   OS << '\n';
7722*67e74705SXin Li }
7723*67e74705SXin Li 
dump() const7724*67e74705SXin Li void InitializationSequence::dump() const {
7725*67e74705SXin Li   dump(llvm::errs());
7726*67e74705SXin Li }
7727*67e74705SXin Li 
DiagnoseNarrowingInInitList(Sema & S,const ImplicitConversionSequence & ICS,QualType PreNarrowingType,QualType EntityType,const Expr * PostInit)7728*67e74705SXin Li static void DiagnoseNarrowingInInitList(Sema &S,
7729*67e74705SXin Li                                         const ImplicitConversionSequence &ICS,
7730*67e74705SXin Li                                         QualType PreNarrowingType,
7731*67e74705SXin Li                                         QualType EntityType,
7732*67e74705SXin Li                                         const Expr *PostInit) {
7733*67e74705SXin Li   const StandardConversionSequence *SCS = nullptr;
7734*67e74705SXin Li   switch (ICS.getKind()) {
7735*67e74705SXin Li   case ImplicitConversionSequence::StandardConversion:
7736*67e74705SXin Li     SCS = &ICS.Standard;
7737*67e74705SXin Li     break;
7738*67e74705SXin Li   case ImplicitConversionSequence::UserDefinedConversion:
7739*67e74705SXin Li     SCS = &ICS.UserDefined.After;
7740*67e74705SXin Li     break;
7741*67e74705SXin Li   case ImplicitConversionSequence::AmbiguousConversion:
7742*67e74705SXin Li   case ImplicitConversionSequence::EllipsisConversion:
7743*67e74705SXin Li   case ImplicitConversionSequence::BadConversion:
7744*67e74705SXin Li     return;
7745*67e74705SXin Li   }
7746*67e74705SXin Li 
7747*67e74705SXin Li   // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.
7748*67e74705SXin Li   APValue ConstantValue;
7749*67e74705SXin Li   QualType ConstantType;
7750*67e74705SXin Li   switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue,
7751*67e74705SXin Li                                 ConstantType)) {
7752*67e74705SXin Li   case NK_Not_Narrowing:
7753*67e74705SXin Li     // No narrowing occurred.
7754*67e74705SXin Li     return;
7755*67e74705SXin Li 
7756*67e74705SXin Li   case NK_Type_Narrowing:
7757*67e74705SXin Li     // This was a floating-to-integer conversion, which is always considered a
7758*67e74705SXin Li     // narrowing conversion even if the value is a constant and can be
7759*67e74705SXin Li     // represented exactly as an integer.
7760*67e74705SXin Li     S.Diag(PostInit->getLocStart(),
7761*67e74705SXin Li            (S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11)
7762*67e74705SXin Li                ? diag::warn_init_list_type_narrowing
7763*67e74705SXin Li                : diag::ext_init_list_type_narrowing)
7764*67e74705SXin Li       << PostInit->getSourceRange()
7765*67e74705SXin Li       << PreNarrowingType.getLocalUnqualifiedType()
7766*67e74705SXin Li       << EntityType.getLocalUnqualifiedType();
7767*67e74705SXin Li     break;
7768*67e74705SXin Li 
7769*67e74705SXin Li   case NK_Constant_Narrowing:
7770*67e74705SXin Li     // A constant value was narrowed.
7771*67e74705SXin Li     S.Diag(PostInit->getLocStart(),
7772*67e74705SXin Li            (S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11)
7773*67e74705SXin Li                ? diag::warn_init_list_constant_narrowing
7774*67e74705SXin Li                : diag::ext_init_list_constant_narrowing)
7775*67e74705SXin Li       << PostInit->getSourceRange()
7776*67e74705SXin Li       << ConstantValue.getAsString(S.getASTContext(), ConstantType)
7777*67e74705SXin Li       << EntityType.getLocalUnqualifiedType();
7778*67e74705SXin Li     break;
7779*67e74705SXin Li 
7780*67e74705SXin Li   case NK_Variable_Narrowing:
7781*67e74705SXin Li     // A variable's value may have been narrowed.
7782*67e74705SXin Li     S.Diag(PostInit->getLocStart(),
7783*67e74705SXin Li            (S.getLangOpts().MicrosoftExt || !S.getLangOpts().CPlusPlus11)
7784*67e74705SXin Li                ? diag::warn_init_list_variable_narrowing
7785*67e74705SXin Li                : diag::ext_init_list_variable_narrowing)
7786*67e74705SXin Li       << PostInit->getSourceRange()
7787*67e74705SXin Li       << PreNarrowingType.getLocalUnqualifiedType()
7788*67e74705SXin Li       << EntityType.getLocalUnqualifiedType();
7789*67e74705SXin Li     break;
7790*67e74705SXin Li   }
7791*67e74705SXin Li 
7792*67e74705SXin Li   SmallString<128> StaticCast;
7793*67e74705SXin Li   llvm::raw_svector_ostream OS(StaticCast);
7794*67e74705SXin Li   OS << "static_cast<";
7795*67e74705SXin Li   if (const TypedefType *TT = EntityType->getAs<TypedefType>()) {
7796*67e74705SXin Li     // It's important to use the typedef's name if there is one so that the
7797*67e74705SXin Li     // fixit doesn't break code using types like int64_t.
7798*67e74705SXin Li     //
7799*67e74705SXin Li     // FIXME: This will break if the typedef requires qualification.  But
7800*67e74705SXin Li     // getQualifiedNameAsString() includes non-machine-parsable components.
7801*67e74705SXin Li     OS << *TT->getDecl();
7802*67e74705SXin Li   } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>())
7803*67e74705SXin Li     OS << BT->getName(S.getLangOpts());
7804*67e74705SXin Li   else {
7805*67e74705SXin Li     // Oops, we didn't find the actual type of the variable.  Don't emit a fixit
7806*67e74705SXin Li     // with a broken cast.
7807*67e74705SXin Li     return;
7808*67e74705SXin Li   }
7809*67e74705SXin Li   OS << ">(";
7810*67e74705SXin Li   S.Diag(PostInit->getLocStart(), diag::note_init_list_narrowing_silence)
7811*67e74705SXin Li       << PostInit->getSourceRange()
7812*67e74705SXin Li       << FixItHint::CreateInsertion(PostInit->getLocStart(), OS.str())
7813*67e74705SXin Li       << FixItHint::CreateInsertion(
7814*67e74705SXin Li              S.getLocForEndOfToken(PostInit->getLocEnd()), ")");
7815*67e74705SXin Li }
7816*67e74705SXin Li 
7817*67e74705SXin Li //===----------------------------------------------------------------------===//
7818*67e74705SXin Li // Initialization helper functions
7819*67e74705SXin Li //===----------------------------------------------------------------------===//
7820*67e74705SXin Li bool
CanPerformCopyInitialization(const InitializedEntity & Entity,ExprResult Init)7821*67e74705SXin Li Sema::CanPerformCopyInitialization(const InitializedEntity &Entity,
7822*67e74705SXin Li                                    ExprResult Init) {
7823*67e74705SXin Li   if (Init.isInvalid())
7824*67e74705SXin Li     return false;
7825*67e74705SXin Li 
7826*67e74705SXin Li   Expr *InitE = Init.get();
7827*67e74705SXin Li   assert(InitE && "No initialization expression");
7828*67e74705SXin Li 
7829*67e74705SXin Li   InitializationKind Kind
7830*67e74705SXin Li     = InitializationKind::CreateCopy(InitE->getLocStart(), SourceLocation());
7831*67e74705SXin Li   InitializationSequence Seq(*this, Entity, Kind, InitE);
7832*67e74705SXin Li   return !Seq.Failed();
7833*67e74705SXin Li }
7834*67e74705SXin Li 
7835*67e74705SXin Li ExprResult
PerformCopyInitialization(const InitializedEntity & Entity,SourceLocation EqualLoc,ExprResult Init,bool TopLevelOfInitList,bool AllowExplicit)7836*67e74705SXin Li Sema::PerformCopyInitialization(const InitializedEntity &Entity,
7837*67e74705SXin Li                                 SourceLocation EqualLoc,
7838*67e74705SXin Li                                 ExprResult Init,
7839*67e74705SXin Li                                 bool TopLevelOfInitList,
7840*67e74705SXin Li                                 bool AllowExplicit) {
7841*67e74705SXin Li   if (Init.isInvalid())
7842*67e74705SXin Li     return ExprError();
7843*67e74705SXin Li 
7844*67e74705SXin Li   Expr *InitE = Init.get();
7845*67e74705SXin Li   assert(InitE && "No initialization expression?");
7846*67e74705SXin Li 
7847*67e74705SXin Li   if (EqualLoc.isInvalid())
7848*67e74705SXin Li     EqualLoc = InitE->getLocStart();
7849*67e74705SXin Li 
7850*67e74705SXin Li   InitializationKind Kind = InitializationKind::CreateCopy(InitE->getLocStart(),
7851*67e74705SXin Li                                                            EqualLoc,
7852*67e74705SXin Li                                                            AllowExplicit);
7853*67e74705SXin Li   InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList);
7854*67e74705SXin Li 
7855*67e74705SXin Li   ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
7856*67e74705SXin Li 
7857*67e74705SXin Li   return Result;
7858*67e74705SXin Li }
7859