1 //===--- SemaInit.cpp - Semantic Analysis for Initializers ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements semantic analysis for initializers.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "CheckExprLifetime.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/DeclObjC.h"
16 #include "clang/AST/Expr.h"
17 #include "clang/AST/ExprCXX.h"
18 #include "clang/AST/ExprObjC.h"
19 #include "clang/AST/ExprOpenMP.h"
20 #include "clang/AST/IgnoreExpr.h"
21 #include "clang/AST/TypeLoc.h"
22 #include "clang/Basic/CharInfo.h"
23 #include "clang/Basic/SourceManager.h"
24 #include "clang/Basic/Specifiers.h"
25 #include "clang/Basic/TargetInfo.h"
26 #include "clang/Sema/Designator.h"
27 #include "clang/Sema/EnterExpressionEvaluationContext.h"
28 #include "clang/Sema/Initialization.h"
29 #include "clang/Sema/Lookup.h"
30 #include "clang/Sema/Ownership.h"
31 #include "clang/Sema/SemaInternal.h"
32 #include "clang/Sema/SemaObjC.h"
33 #include "llvm/ADT/APInt.h"
34 #include "llvm/ADT/FoldingSet.h"
35 #include "llvm/ADT/PointerIntPair.h"
36 #include "llvm/ADT/STLForwardCompat.h"
37 #include "llvm/ADT/SmallString.h"
38 #include "llvm/ADT/SmallVector.h"
39 #include "llvm/ADT/StringExtras.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include "llvm/Support/raw_ostream.h"
42
43 using namespace clang;
44
45 //===----------------------------------------------------------------------===//
46 // Sema Initialization Checking
47 //===----------------------------------------------------------------------===//
48
49 /// Check whether T is compatible with a wide character type (wchar_t,
50 /// char16_t or char32_t).
IsWideCharCompatible(QualType T,ASTContext & Context)51 static bool IsWideCharCompatible(QualType T, ASTContext &Context) {
52 if (Context.typesAreCompatible(Context.getWideCharType(), T))
53 return true;
54 if (Context.getLangOpts().CPlusPlus || Context.getLangOpts().C11) {
55 return Context.typesAreCompatible(Context.Char16Ty, T) ||
56 Context.typesAreCompatible(Context.Char32Ty, T);
57 }
58 return false;
59 }
60
61 enum StringInitFailureKind {
62 SIF_None,
63 SIF_NarrowStringIntoWideChar,
64 SIF_WideStringIntoChar,
65 SIF_IncompatWideStringIntoWideChar,
66 SIF_UTF8StringIntoPlainChar,
67 SIF_PlainStringIntoUTF8Char,
68 SIF_Other
69 };
70
71 /// Check whether the array of type AT can be initialized by the Init
72 /// expression by means of string initialization. Returns SIF_None if so,
73 /// otherwise returns a StringInitFailureKind that describes why the
74 /// initialization would not work.
IsStringInit(Expr * Init,const ArrayType * AT,ASTContext & Context)75 static StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT,
76 ASTContext &Context) {
77 if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT))
78 return SIF_Other;
79
80 // See if this is a string literal or @encode.
81 Init = Init->IgnoreParens();
82
83 // Handle @encode, which is a narrow string.
84 if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType())
85 return SIF_None;
86
87 // Otherwise we can only handle string literals.
88 StringLiteral *SL = dyn_cast<StringLiteral>(Init);
89 if (!SL)
90 return SIF_Other;
91
92 const QualType ElemTy =
93 Context.getCanonicalType(AT->getElementType()).getUnqualifiedType();
94
95 auto IsCharOrUnsignedChar = [](const QualType &T) {
96 const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr());
97 return BT && BT->isCharType() && BT->getKind() != BuiltinType::SChar;
98 };
99
100 switch (SL->getKind()) {
101 case StringLiteralKind::UTF8:
102 // char8_t array can be initialized with a UTF-8 string.
103 // - C++20 [dcl.init.string] (DR)
104 // Additionally, an array of char or unsigned char may be initialized
105 // by a UTF-8 string literal.
106 if (ElemTy->isChar8Type() ||
107 (Context.getLangOpts().Char8 &&
108 IsCharOrUnsignedChar(ElemTy.getCanonicalType())))
109 return SIF_None;
110 [[fallthrough]];
111 case StringLiteralKind::Ordinary:
112 // char array can be initialized with a narrow string.
113 // Only allow char x[] = "foo"; not char x[] = L"foo";
114 if (ElemTy->isCharType())
115 return (SL->getKind() == StringLiteralKind::UTF8 &&
116 Context.getLangOpts().Char8)
117 ? SIF_UTF8StringIntoPlainChar
118 : SIF_None;
119 if (ElemTy->isChar8Type())
120 return SIF_PlainStringIntoUTF8Char;
121 if (IsWideCharCompatible(ElemTy, Context))
122 return SIF_NarrowStringIntoWideChar;
123 return SIF_Other;
124 // C99 6.7.8p15 (with correction from DR343), or C11 6.7.9p15:
125 // "An array with element type compatible with a qualified or unqualified
126 // version of wchar_t, char16_t, or char32_t may be initialized by a wide
127 // string literal with the corresponding encoding prefix (L, u, or U,
128 // respectively), optionally enclosed in braces.
129 case StringLiteralKind::UTF16:
130 if (Context.typesAreCompatible(Context.Char16Ty, ElemTy))
131 return SIF_None;
132 if (ElemTy->isCharType() || ElemTy->isChar8Type())
133 return SIF_WideStringIntoChar;
134 if (IsWideCharCompatible(ElemTy, Context))
135 return SIF_IncompatWideStringIntoWideChar;
136 return SIF_Other;
137 case StringLiteralKind::UTF32:
138 if (Context.typesAreCompatible(Context.Char32Ty, ElemTy))
139 return SIF_None;
140 if (ElemTy->isCharType() || ElemTy->isChar8Type())
141 return SIF_WideStringIntoChar;
142 if (IsWideCharCompatible(ElemTy, Context))
143 return SIF_IncompatWideStringIntoWideChar;
144 return SIF_Other;
145 case StringLiteralKind::Wide:
146 if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy))
147 return SIF_None;
148 if (ElemTy->isCharType() || ElemTy->isChar8Type())
149 return SIF_WideStringIntoChar;
150 if (IsWideCharCompatible(ElemTy, Context))
151 return SIF_IncompatWideStringIntoWideChar;
152 return SIF_Other;
153 case StringLiteralKind::Unevaluated:
154 assert(false && "Unevaluated string literal in initialization");
155 break;
156 }
157
158 llvm_unreachable("missed a StringLiteral kind?");
159 }
160
IsStringInit(Expr * init,QualType declType,ASTContext & Context)161 static StringInitFailureKind IsStringInit(Expr *init, QualType declType,
162 ASTContext &Context) {
163 const ArrayType *arrayType = Context.getAsArrayType(declType);
164 if (!arrayType)
165 return SIF_Other;
166 return IsStringInit(init, arrayType, Context);
167 }
168
IsStringInit(Expr * Init,const ArrayType * AT)169 bool Sema::IsStringInit(Expr *Init, const ArrayType *AT) {
170 return ::IsStringInit(Init, AT, Context) == SIF_None;
171 }
172
173 /// Update the type of a string literal, including any surrounding parentheses,
174 /// to match the type of the object which it is initializing.
updateStringLiteralType(Expr * E,QualType Ty)175 static void updateStringLiteralType(Expr *E, QualType Ty) {
176 while (true) {
177 E->setType(Ty);
178 E->setValueKind(VK_PRValue);
179 if (isa<StringLiteral>(E) || isa<ObjCEncodeExpr>(E))
180 break;
181 E = IgnoreParensSingleStep(E);
182 }
183 }
184
185 /// Fix a compound literal initializing an array so it's correctly marked
186 /// as an rvalue.
updateGNUCompoundLiteralRValue(Expr * E)187 static void updateGNUCompoundLiteralRValue(Expr *E) {
188 while (true) {
189 E->setValueKind(VK_PRValue);
190 if (isa<CompoundLiteralExpr>(E))
191 break;
192 E = IgnoreParensSingleStep(E);
193 }
194 }
195
initializingConstexprVariable(const InitializedEntity & Entity)196 static bool initializingConstexprVariable(const InitializedEntity &Entity) {
197 Decl *D = Entity.getDecl();
198 const InitializedEntity *Parent = &Entity;
199
200 while (Parent) {
201 D = Parent->getDecl();
202 Parent = Parent->getParent();
203 }
204
205 if (const auto *VD = dyn_cast_if_present<VarDecl>(D); VD && VD->isConstexpr())
206 return true;
207
208 return false;
209 }
210
211 static void CheckC23ConstexprInitStringLiteral(const StringLiteral *SE,
212 Sema &SemaRef, QualType &TT);
213
CheckStringInit(Expr * Str,QualType & DeclT,const ArrayType * AT,Sema & S,bool CheckC23ConstexprInit=false)214 static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
215 Sema &S, bool CheckC23ConstexprInit = false) {
216 // Get the length of the string as parsed.
217 auto *ConstantArrayTy =
218 cast<ConstantArrayType>(Str->getType()->getAsArrayTypeUnsafe());
219 uint64_t StrLength = ConstantArrayTy->getZExtSize();
220
221 if (CheckC23ConstexprInit)
222 if (const StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens()))
223 CheckC23ConstexprInitStringLiteral(SL, S, DeclT);
224
225 if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
226 // C99 6.7.8p14. We have an array of character type with unknown size
227 // being initialized to a string literal.
228 llvm::APInt ConstVal(32, StrLength);
229 // Return a new array type (C99 6.7.8p22).
230 DeclT = S.Context.getConstantArrayType(
231 IAT->getElementType(), ConstVal, nullptr, ArraySizeModifier::Normal, 0);
232 updateStringLiteralType(Str, DeclT);
233 return;
234 }
235
236 const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
237
238 // We have an array of character type with known size. However,
239 // the size may be smaller or larger than the string we are initializing.
240 // FIXME: Avoid truncation for 64-bit length strings.
241 if (S.getLangOpts().CPlusPlus) {
242 if (StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens())) {
243 // For Pascal strings it's OK to strip off the terminating null character,
244 // so the example below is valid:
245 //
246 // unsigned char a[2] = "\pa";
247 if (SL->isPascal())
248 StrLength--;
249 }
250
251 // [dcl.init.string]p2
252 if (StrLength > CAT->getZExtSize())
253 S.Diag(Str->getBeginLoc(),
254 diag::err_initializer_string_for_char_array_too_long)
255 << CAT->getZExtSize() << StrLength << Str->getSourceRange();
256 } else {
257 // C99 6.7.8p14.
258 if (StrLength - 1 > CAT->getZExtSize())
259 S.Diag(Str->getBeginLoc(),
260 diag::ext_initializer_string_for_char_array_too_long)
261 << Str->getSourceRange();
262 }
263
264 // Set the type to the actual size that we are initializing. If we have
265 // something like:
266 // char x[1] = "foo";
267 // then this will set the string literal's type to char[1].
268 updateStringLiteralType(Str, DeclT);
269 }
270
271 //===----------------------------------------------------------------------===//
272 // Semantic checking for initializer lists.
273 //===----------------------------------------------------------------------===//
274
275 namespace {
276
277 /// Semantic checking for initializer lists.
278 ///
279 /// The InitListChecker class contains a set of routines that each
280 /// handle the initialization of a certain kind of entity, e.g.,
281 /// arrays, vectors, struct/union types, scalars, etc. The
282 /// InitListChecker itself performs a recursive walk of the subobject
283 /// structure of the type to be initialized, while stepping through
284 /// the initializer list one element at a time. The IList and Index
285 /// parameters to each of the Check* routines contain the active
286 /// (syntactic) initializer list and the index into that initializer
287 /// list that represents the current initializer. Each routine is
288 /// responsible for moving that Index forward as it consumes elements.
289 ///
290 /// Each Check* routine also has a StructuredList/StructuredIndex
291 /// arguments, which contains the current "structured" (semantic)
292 /// initializer list and the index into that initializer list where we
293 /// are copying initializers as we map them over to the semantic
294 /// list. Once we have completed our recursive walk of the subobject
295 /// structure, we will have constructed a full semantic initializer
296 /// list.
297 ///
298 /// C99 designators cause changes in the initializer list traversal,
299 /// because they make the initialization "jump" into a specific
300 /// subobject and then continue the initialization from that
301 /// point. CheckDesignatedInitializer() recursively steps into the
302 /// designated subobject and manages backing out the recursion to
303 /// initialize the subobjects after the one designated.
304 ///
305 /// If an initializer list contains any designators, we build a placeholder
306 /// structured list even in 'verify only' mode, so that we can track which
307 /// elements need 'empty' initializtion.
308 class InitListChecker {
309 Sema &SemaRef;
310 bool hadError = false;
311 bool VerifyOnly; // No diagnostics.
312 bool TreatUnavailableAsInvalid; // Used only in VerifyOnly mode.
313 bool InOverloadResolution;
314 InitListExpr *FullyStructuredList = nullptr;
315 NoInitExpr *DummyExpr = nullptr;
316 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes = nullptr;
317 EmbedExpr *CurEmbed = nullptr; // Save current embed we're processing.
318 unsigned CurEmbedIndex = 0;
319
getDummyInit()320 NoInitExpr *getDummyInit() {
321 if (!DummyExpr)
322 DummyExpr = new (SemaRef.Context) NoInitExpr(SemaRef.Context.VoidTy);
323 return DummyExpr;
324 }
325
326 void CheckImplicitInitList(const InitializedEntity &Entity,
327 InitListExpr *ParentIList, QualType T,
328 unsigned &Index, InitListExpr *StructuredList,
329 unsigned &StructuredIndex);
330 void CheckExplicitInitList(const InitializedEntity &Entity,
331 InitListExpr *IList, QualType &T,
332 InitListExpr *StructuredList,
333 bool TopLevelObject = false);
334 void CheckListElementTypes(const InitializedEntity &Entity,
335 InitListExpr *IList, QualType &DeclType,
336 bool SubobjectIsDesignatorContext,
337 unsigned &Index,
338 InitListExpr *StructuredList,
339 unsigned &StructuredIndex,
340 bool TopLevelObject = false);
341 void CheckSubElementType(const InitializedEntity &Entity,
342 InitListExpr *IList, QualType ElemType,
343 unsigned &Index,
344 InitListExpr *StructuredList,
345 unsigned &StructuredIndex,
346 bool DirectlyDesignated = false);
347 void CheckComplexType(const InitializedEntity &Entity,
348 InitListExpr *IList, QualType DeclType,
349 unsigned &Index,
350 InitListExpr *StructuredList,
351 unsigned &StructuredIndex);
352 void CheckScalarType(const InitializedEntity &Entity,
353 InitListExpr *IList, QualType DeclType,
354 unsigned &Index,
355 InitListExpr *StructuredList,
356 unsigned &StructuredIndex);
357 void CheckReferenceType(const InitializedEntity &Entity,
358 InitListExpr *IList, QualType DeclType,
359 unsigned &Index,
360 InitListExpr *StructuredList,
361 unsigned &StructuredIndex);
362 void CheckVectorType(const InitializedEntity &Entity,
363 InitListExpr *IList, QualType DeclType, unsigned &Index,
364 InitListExpr *StructuredList,
365 unsigned &StructuredIndex);
366 void CheckStructUnionTypes(const InitializedEntity &Entity,
367 InitListExpr *IList, QualType DeclType,
368 CXXRecordDecl::base_class_const_range Bases,
369 RecordDecl::field_iterator Field,
370 bool SubobjectIsDesignatorContext, unsigned &Index,
371 InitListExpr *StructuredList,
372 unsigned &StructuredIndex,
373 bool TopLevelObject = false);
374 void CheckArrayType(const InitializedEntity &Entity,
375 InitListExpr *IList, QualType &DeclType,
376 llvm::APSInt elementIndex,
377 bool SubobjectIsDesignatorContext, unsigned &Index,
378 InitListExpr *StructuredList,
379 unsigned &StructuredIndex);
380 bool CheckDesignatedInitializer(const InitializedEntity &Entity,
381 InitListExpr *IList, DesignatedInitExpr *DIE,
382 unsigned DesigIdx,
383 QualType &CurrentObjectType,
384 RecordDecl::field_iterator *NextField,
385 llvm::APSInt *NextElementIndex,
386 unsigned &Index,
387 InitListExpr *StructuredList,
388 unsigned &StructuredIndex,
389 bool FinishSubobjectInit,
390 bool TopLevelObject);
391 InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
392 QualType CurrentObjectType,
393 InitListExpr *StructuredList,
394 unsigned StructuredIndex,
395 SourceRange InitRange,
396 bool IsFullyOverwritten = false);
397 void UpdateStructuredListElement(InitListExpr *StructuredList,
398 unsigned &StructuredIndex,
399 Expr *expr);
400 InitListExpr *createInitListExpr(QualType CurrentObjectType,
401 SourceRange InitRange,
402 unsigned ExpectedNumInits);
403 int numArrayElements(QualType DeclType);
404 int numStructUnionElements(QualType DeclType);
405 static RecordDecl *getRecordDecl(QualType DeclType);
406
407 ExprResult PerformEmptyInit(SourceLocation Loc,
408 const InitializedEntity &Entity);
409
410 /// Diagnose that OldInit (or part thereof) has been overridden by NewInit.
diagnoseInitOverride(Expr * OldInit,SourceRange NewInitRange,bool UnionOverride=false,bool FullyOverwritten=true)411 void diagnoseInitOverride(Expr *OldInit, SourceRange NewInitRange,
412 bool UnionOverride = false,
413 bool FullyOverwritten = true) {
414 // Overriding an initializer via a designator is valid with C99 designated
415 // initializers, but ill-formed with C++20 designated initializers.
416 unsigned DiagID =
417 SemaRef.getLangOpts().CPlusPlus
418 ? (UnionOverride ? diag::ext_initializer_union_overrides
419 : diag::ext_initializer_overrides)
420 : diag::warn_initializer_overrides;
421
422 if (InOverloadResolution && SemaRef.getLangOpts().CPlusPlus) {
423 // In overload resolution, we have to strictly enforce the rules, and so
424 // don't allow any overriding of prior initializers. This matters for a
425 // case such as:
426 //
427 // union U { int a, b; };
428 // struct S { int a, b; };
429 // void f(U), f(S);
430 //
431 // Here, f({.a = 1, .b = 2}) is required to call the struct overload. For
432 // consistency, we disallow all overriding of prior initializers in
433 // overload resolution, not only overriding of union members.
434 hadError = true;
435 } else if (OldInit->getType().isDestructedType() && !FullyOverwritten) {
436 // If we'll be keeping around the old initializer but overwriting part of
437 // the object it initialized, and that object is not trivially
438 // destructible, this can leak. Don't allow that, not even as an
439 // extension.
440 //
441 // FIXME: It might be reasonable to allow this in cases where the part of
442 // the initializer that we're overriding has trivial destruction.
443 DiagID = diag::err_initializer_overrides_destructed;
444 } else if (!OldInit->getSourceRange().isValid()) {
445 // We need to check on source range validity because the previous
446 // initializer does not have to be an explicit initializer. e.g.,
447 //
448 // struct P { int a, b; };
449 // struct PP { struct P p } l = { { .a = 2 }, .p.b = 3 };
450 //
451 // There is an overwrite taking place because the first braced initializer
452 // list "{ .a = 2 }" already provides value for .p.b (which is zero).
453 //
454 // Such overwrites are harmless, so we don't diagnose them. (Note that in
455 // C++, this cannot be reached unless we've already seen and diagnosed a
456 // different conformance issue, such as a mixture of designated and
457 // non-designated initializers or a multi-level designator.)
458 return;
459 }
460
461 if (!VerifyOnly) {
462 SemaRef.Diag(NewInitRange.getBegin(), DiagID)
463 << NewInitRange << FullyOverwritten << OldInit->getType();
464 SemaRef.Diag(OldInit->getBeginLoc(), diag::note_previous_initializer)
465 << (OldInit->HasSideEffects(SemaRef.Context) && FullyOverwritten)
466 << OldInit->getSourceRange();
467 }
468 }
469
470 // Explanation on the "FillWithNoInit" mode:
471 //
472 // Assume we have the following definitions (Case#1):
473 // struct P { char x[6][6]; } xp = { .x[1] = "bar" };
474 // struct PP { struct P lp; } l = { .lp = xp, .lp.x[1][2] = 'f' };
475 //
476 // l.lp.x[1][0..1] should not be filled with implicit initializers because the
477 // "base" initializer "xp" will provide values for them; l.lp.x[1] will be "baf".
478 //
479 // But if we have (Case#2):
480 // struct PP l = { .lp = xp, .lp.x[1] = { [2] = 'f' } };
481 //
482 // l.lp.x[1][0..1] are implicitly initialized and do not use values from the
483 // "base" initializer; l.lp.x[1] will be "\0\0f\0\0\0".
484 //
485 // To distinguish Case#1 from Case#2, and also to avoid leaving many "holes"
486 // in the InitListExpr, the "holes" in Case#1 are filled not with empty
487 // initializers but with special "NoInitExpr" place holders, which tells the
488 // CodeGen not to generate any initializers for these parts.
489 void FillInEmptyInitForBase(unsigned Init, const CXXBaseSpecifier &Base,
490 const InitializedEntity &ParentEntity,
491 InitListExpr *ILE, bool &RequiresSecondPass,
492 bool FillWithNoInit);
493 void FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
494 const InitializedEntity &ParentEntity,
495 InitListExpr *ILE, bool &RequiresSecondPass,
496 bool FillWithNoInit = false);
497 void FillInEmptyInitializations(const InitializedEntity &Entity,
498 InitListExpr *ILE, bool &RequiresSecondPass,
499 InitListExpr *OuterILE, unsigned OuterIndex,
500 bool FillWithNoInit = false);
501 bool CheckFlexibleArrayInit(const InitializedEntity &Entity,
502 Expr *InitExpr, FieldDecl *Field,
503 bool TopLevelObject);
504 void CheckEmptyInitializable(const InitializedEntity &Entity,
505 SourceLocation Loc);
506
HandleEmbed(EmbedExpr * Embed,const InitializedEntity & Entity)507 Expr *HandleEmbed(EmbedExpr *Embed, const InitializedEntity &Entity) {
508 Expr *Result = nullptr;
509 // Undrestand which part of embed we'd like to reference.
510 if (!CurEmbed) {
511 CurEmbed = Embed;
512 CurEmbedIndex = 0;
513 }
514 // Reference just one if we're initializing a single scalar.
515 uint64_t ElsCount = 1;
516 // Otherwise try to fill whole array with embed data.
517 if (Entity.getKind() == InitializedEntity::EK_ArrayElement) {
518 auto *AType =
519 SemaRef.Context.getAsArrayType(Entity.getParent()->getType());
520 assert(AType && "expected array type when initializing array");
521 ElsCount = Embed->getDataElementCount();
522 if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
523 ElsCount = std::min(CAType->getSize().getZExtValue(),
524 ElsCount - CurEmbedIndex);
525 if (ElsCount == Embed->getDataElementCount()) {
526 CurEmbed = nullptr;
527 CurEmbedIndex = 0;
528 return Embed;
529 }
530 }
531
532 Result = new (SemaRef.Context)
533 EmbedExpr(SemaRef.Context, Embed->getLocation(), Embed->getData(),
534 CurEmbedIndex, ElsCount);
535 CurEmbedIndex += ElsCount;
536 if (CurEmbedIndex >= Embed->getDataElementCount()) {
537 CurEmbed = nullptr;
538 CurEmbedIndex = 0;
539 }
540 return Result;
541 }
542
543 public:
544 InitListChecker(
545 Sema &S, const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
546 bool VerifyOnly, bool TreatUnavailableAsInvalid,
547 bool InOverloadResolution = false,
548 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes = nullptr);
InitListChecker(Sema & S,const InitializedEntity & Entity,InitListExpr * IL,QualType & T,SmallVectorImpl<QualType> & AggrDeductionCandidateParamTypes)549 InitListChecker(Sema &S, const InitializedEntity &Entity, InitListExpr *IL,
550 QualType &T,
551 SmallVectorImpl<QualType> &AggrDeductionCandidateParamTypes)
552 : InitListChecker(S, Entity, IL, T, /*VerifyOnly=*/true,
553 /*TreatUnavailableAsInvalid=*/false,
554 /*InOverloadResolution=*/false,
555 &AggrDeductionCandidateParamTypes) {}
556
HadError()557 bool HadError() { return hadError; }
558
559 // Retrieves the fully-structured initializer list used for
560 // semantic analysis and code generation.
getFullyStructuredList() const561 InitListExpr *getFullyStructuredList() const { return FullyStructuredList; }
562 };
563
564 } // end anonymous namespace
565
PerformEmptyInit(SourceLocation Loc,const InitializedEntity & Entity)566 ExprResult InitListChecker::PerformEmptyInit(SourceLocation Loc,
567 const InitializedEntity &Entity) {
568 InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc,
569 true);
570 MultiExprArg SubInit;
571 Expr *InitExpr;
572 InitListExpr DummyInitList(SemaRef.Context, Loc, std::nullopt, Loc);
573
574 // C++ [dcl.init.aggr]p7:
575 // If there are fewer initializer-clauses in the list than there are
576 // members in the aggregate, then each member not explicitly initialized
577 // ...
578 bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
579 Entity.getType()->getBaseElementTypeUnsafe()->isRecordType();
580 if (EmptyInitList) {
581 // C++1y / DR1070:
582 // shall be initialized [...] from an empty initializer list.
583 //
584 // We apply the resolution of this DR to C++11 but not C++98, since C++98
585 // does not have useful semantics for initialization from an init list.
586 // We treat this as copy-initialization, because aggregate initialization
587 // always performs copy-initialization on its elements.
588 //
589 // Only do this if we're initializing a class type, to avoid filling in
590 // the initializer list where possible.
591 InitExpr = VerifyOnly
592 ? &DummyInitList
593 : new (SemaRef.Context)
594 InitListExpr(SemaRef.Context, Loc, std::nullopt, Loc);
595 InitExpr->setType(SemaRef.Context.VoidTy);
596 SubInit = InitExpr;
597 Kind = InitializationKind::CreateCopy(Loc, Loc);
598 } else {
599 // C++03:
600 // shall be value-initialized.
601 }
602
603 InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit);
604 // libstdc++4.6 marks the vector default constructor as explicit in
605 // _GLIBCXX_DEBUG mode, so recover using the C++03 logic in that case.
606 // stlport does so too. Look for std::__debug for libstdc++, and for
607 // std:: for stlport. This is effectively a compiler-side implementation of
608 // LWG2193.
609 if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() ==
610 InitializationSequence::FK_ExplicitConstructor) {
611 OverloadCandidateSet::iterator Best;
612 OverloadingResult O =
613 InitSeq.getFailedCandidateSet()
614 .BestViableFunction(SemaRef, Kind.getLocation(), Best);
615 (void)O;
616 assert(O == OR_Success && "Inconsistent overload resolution");
617 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
618 CXXRecordDecl *R = CtorDecl->getParent();
619
620 if (CtorDecl->getMinRequiredArguments() == 0 &&
621 CtorDecl->isExplicit() && R->getDeclName() &&
622 SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) {
623 bool IsInStd = false;
624 for (NamespaceDecl *ND = dyn_cast<NamespaceDecl>(R->getDeclContext());
625 ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
626 if (SemaRef.getStdNamespace()->InEnclosingNamespaceSetOf(ND))
627 IsInStd = true;
628 }
629
630 if (IsInStd && llvm::StringSwitch<bool>(R->getName())
631 .Cases("basic_string", "deque", "forward_list", true)
632 .Cases("list", "map", "multimap", "multiset", true)
633 .Cases("priority_queue", "queue", "set", "stack", true)
634 .Cases("unordered_map", "unordered_set", "vector", true)
635 .Default(false)) {
636 InitSeq.InitializeFrom(
637 SemaRef, Entity,
638 InitializationKind::CreateValue(Loc, Loc, Loc, true),
639 MultiExprArg(), /*TopLevelOfInitList=*/false,
640 TreatUnavailableAsInvalid);
641 // Emit a warning for this. System header warnings aren't shown
642 // by default, but people working on system headers should see it.
643 if (!VerifyOnly) {
644 SemaRef.Diag(CtorDecl->getLocation(),
645 diag::warn_invalid_initializer_from_system_header);
646 if (Entity.getKind() == InitializedEntity::EK_Member)
647 SemaRef.Diag(Entity.getDecl()->getLocation(),
648 diag::note_used_in_initialization_here);
649 else if (Entity.getKind() == InitializedEntity::EK_ArrayElement)
650 SemaRef.Diag(Loc, diag::note_used_in_initialization_here);
651 }
652 }
653 }
654 }
655 if (!InitSeq) {
656 if (!VerifyOnly) {
657 InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
658 if (Entity.getKind() == InitializedEntity::EK_Member)
659 SemaRef.Diag(Entity.getDecl()->getLocation(),
660 diag::note_in_omitted_aggregate_initializer)
661 << /*field*/1 << Entity.getDecl();
662 else if (Entity.getKind() == InitializedEntity::EK_ArrayElement) {
663 bool IsTrailingArrayNewMember =
664 Entity.getParent() &&
665 Entity.getParent()->isVariableLengthArrayNew();
666 SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer)
667 << (IsTrailingArrayNewMember ? 2 : /*array element*/0)
668 << Entity.getElementIndex();
669 }
670 }
671 hadError = true;
672 return ExprError();
673 }
674
675 return VerifyOnly ? ExprResult()
676 : InitSeq.Perform(SemaRef, Entity, Kind, SubInit);
677 }
678
CheckEmptyInitializable(const InitializedEntity & Entity,SourceLocation Loc)679 void InitListChecker::CheckEmptyInitializable(const InitializedEntity &Entity,
680 SourceLocation Loc) {
681 // If we're building a fully-structured list, we'll check this at the end
682 // once we know which elements are actually initialized. Otherwise, we know
683 // that there are no designators so we can just check now.
684 if (FullyStructuredList)
685 return;
686 PerformEmptyInit(Loc, Entity);
687 }
688
FillInEmptyInitForBase(unsigned Init,const CXXBaseSpecifier & Base,const InitializedEntity & ParentEntity,InitListExpr * ILE,bool & RequiresSecondPass,bool FillWithNoInit)689 void InitListChecker::FillInEmptyInitForBase(
690 unsigned Init, const CXXBaseSpecifier &Base,
691 const InitializedEntity &ParentEntity, InitListExpr *ILE,
692 bool &RequiresSecondPass, bool FillWithNoInit) {
693 InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
694 SemaRef.Context, &Base, false, &ParentEntity);
695
696 if (Init >= ILE->getNumInits() || !ILE->getInit(Init)) {
697 ExprResult BaseInit = FillWithNoInit
698 ? new (SemaRef.Context) NoInitExpr(Base.getType())
699 : PerformEmptyInit(ILE->getEndLoc(), BaseEntity);
700 if (BaseInit.isInvalid()) {
701 hadError = true;
702 return;
703 }
704
705 if (!VerifyOnly) {
706 assert(Init < ILE->getNumInits() && "should have been expanded");
707 ILE->setInit(Init, BaseInit.getAs<Expr>());
708 }
709 } else if (InitListExpr *InnerILE =
710 dyn_cast<InitListExpr>(ILE->getInit(Init))) {
711 FillInEmptyInitializations(BaseEntity, InnerILE, RequiresSecondPass,
712 ILE, Init, FillWithNoInit);
713 } else if (DesignatedInitUpdateExpr *InnerDIUE =
714 dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
715 FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
716 RequiresSecondPass, ILE, Init,
717 /*FillWithNoInit =*/true);
718 }
719 }
720
FillInEmptyInitForField(unsigned Init,FieldDecl * Field,const InitializedEntity & ParentEntity,InitListExpr * ILE,bool & RequiresSecondPass,bool FillWithNoInit)721 void InitListChecker::FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
722 const InitializedEntity &ParentEntity,
723 InitListExpr *ILE,
724 bool &RequiresSecondPass,
725 bool FillWithNoInit) {
726 SourceLocation Loc = ILE->getEndLoc();
727 unsigned NumInits = ILE->getNumInits();
728 InitializedEntity MemberEntity
729 = InitializedEntity::InitializeMember(Field, &ParentEntity);
730
731 if (Init >= NumInits || !ILE->getInit(Init)) {
732 if (const RecordType *RType = ILE->getType()->getAs<RecordType>())
733 if (!RType->getDecl()->isUnion())
734 assert((Init < NumInits || VerifyOnly) &&
735 "This ILE should have been expanded");
736
737 if (FillWithNoInit) {
738 assert(!VerifyOnly && "should not fill with no-init in verify-only mode");
739 Expr *Filler = new (SemaRef.Context) NoInitExpr(Field->getType());
740 if (Init < NumInits)
741 ILE->setInit(Init, Filler);
742 else
743 ILE->updateInit(SemaRef.Context, Init, Filler);
744 return;
745 }
746 // C++1y [dcl.init.aggr]p7:
747 // If there are fewer initializer-clauses in the list than there are
748 // members in the aggregate, then each member not explicitly initialized
749 // shall be initialized from its brace-or-equal-initializer [...]
750 if (Field->hasInClassInitializer()) {
751 if (VerifyOnly)
752 return;
753
754 ExprResult DIE = SemaRef.BuildCXXDefaultInitExpr(Loc, Field);
755 if (DIE.isInvalid()) {
756 hadError = true;
757 return;
758 }
759 SemaRef.checkInitializerLifetime(MemberEntity, DIE.get());
760 if (Init < NumInits)
761 ILE->setInit(Init, DIE.get());
762 else {
763 ILE->updateInit(SemaRef.Context, Init, DIE.get());
764 RequiresSecondPass = true;
765 }
766 return;
767 }
768
769 if (Field->getType()->isReferenceType()) {
770 if (!VerifyOnly) {
771 // C++ [dcl.init.aggr]p9:
772 // If an incomplete or empty initializer-list leaves a
773 // member of reference type uninitialized, the program is
774 // ill-formed.
775 SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized)
776 << Field->getType()
777 << (ILE->isSyntacticForm() ? ILE : ILE->getSyntacticForm())
778 ->getSourceRange();
779 SemaRef.Diag(Field->getLocation(), diag::note_uninit_reference_member);
780 }
781 hadError = true;
782 return;
783 }
784
785 ExprResult MemberInit = PerformEmptyInit(Loc, MemberEntity);
786 if (MemberInit.isInvalid()) {
787 hadError = true;
788 return;
789 }
790
791 if (hadError || VerifyOnly) {
792 // Do nothing
793 } else if (Init < NumInits) {
794 ILE->setInit(Init, MemberInit.getAs<Expr>());
795 } else if (!isa<ImplicitValueInitExpr>(MemberInit.get())) {
796 // Empty initialization requires a constructor call, so
797 // extend the initializer list to include the constructor
798 // call and make a note that we'll need to take another pass
799 // through the initializer list.
800 ILE->updateInit(SemaRef.Context, Init, MemberInit.getAs<Expr>());
801 RequiresSecondPass = true;
802 }
803 } else if (InitListExpr *InnerILE
804 = dyn_cast<InitListExpr>(ILE->getInit(Init))) {
805 FillInEmptyInitializations(MemberEntity, InnerILE,
806 RequiresSecondPass, ILE, Init, FillWithNoInit);
807 } else if (DesignatedInitUpdateExpr *InnerDIUE =
808 dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
809 FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
810 RequiresSecondPass, ILE, Init,
811 /*FillWithNoInit =*/true);
812 }
813 }
814
815 /// Recursively replaces NULL values within the given initializer list
816 /// with expressions that perform value-initialization of the
817 /// appropriate type, and finish off the InitListExpr formation.
818 void
FillInEmptyInitializations(const InitializedEntity & Entity,InitListExpr * ILE,bool & RequiresSecondPass,InitListExpr * OuterILE,unsigned OuterIndex,bool FillWithNoInit)819 InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity,
820 InitListExpr *ILE,
821 bool &RequiresSecondPass,
822 InitListExpr *OuterILE,
823 unsigned OuterIndex,
824 bool FillWithNoInit) {
825 assert((ILE->getType() != SemaRef.Context.VoidTy) &&
826 "Should not have void type");
827
828 // We don't need to do any checks when just filling NoInitExprs; that can't
829 // fail.
830 if (FillWithNoInit && VerifyOnly)
831 return;
832
833 // If this is a nested initializer list, we might have changed its contents
834 // (and therefore some of its properties, such as instantiation-dependence)
835 // while filling it in. Inform the outer initializer list so that its state
836 // can be updated to match.
837 // FIXME: We should fully build the inner initializers before constructing
838 // the outer InitListExpr instead of mutating AST nodes after they have
839 // been used as subexpressions of other nodes.
840 struct UpdateOuterILEWithUpdatedInit {
841 InitListExpr *Outer;
842 unsigned OuterIndex;
843 ~UpdateOuterILEWithUpdatedInit() {
844 if (Outer)
845 Outer->setInit(OuterIndex, Outer->getInit(OuterIndex));
846 }
847 } UpdateOuterRAII = {OuterILE, OuterIndex};
848
849 // A transparent ILE is not performing aggregate initialization and should
850 // not be filled in.
851 if (ILE->isTransparent())
852 return;
853
854 if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) {
855 const RecordDecl *RDecl = RType->getDecl();
856 if (RDecl->isUnion() && ILE->getInitializedFieldInUnion()) {
857 FillInEmptyInitForField(0, ILE->getInitializedFieldInUnion(), Entity, ILE,
858 RequiresSecondPass, FillWithNoInit);
859 } else {
860 assert((!RDecl->isUnion() || !isa<CXXRecordDecl>(RDecl) ||
861 !cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) &&
862 "We should have computed initialized fields already");
863 // The fields beyond ILE->getNumInits() are default initialized, so in
864 // order to leave them uninitialized, the ILE is expanded and the extra
865 // fields are then filled with NoInitExpr.
866 unsigned NumElems = numStructUnionElements(ILE->getType());
867 if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember())
868 ++NumElems;
869 if (!VerifyOnly && ILE->getNumInits() < NumElems)
870 ILE->resizeInits(SemaRef.Context, NumElems);
871
872 unsigned Init = 0;
873
874 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
875 for (auto &Base : CXXRD->bases()) {
876 if (hadError)
877 return;
878
879 FillInEmptyInitForBase(Init, Base, Entity, ILE, RequiresSecondPass,
880 FillWithNoInit);
881 ++Init;
882 }
883 }
884
885 for (auto *Field : RDecl->fields()) {
886 if (Field->isUnnamedBitField())
887 continue;
888
889 if (hadError)
890 return;
891
892 FillInEmptyInitForField(Init, Field, Entity, ILE, RequiresSecondPass,
893 FillWithNoInit);
894 if (hadError)
895 return;
896
897 ++Init;
898
899 // Only look at the first initialization of a union.
900 if (RDecl->isUnion())
901 break;
902 }
903 }
904
905 return;
906 }
907
908 QualType ElementType;
909
910 InitializedEntity ElementEntity = Entity;
911 unsigned NumInits = ILE->getNumInits();
912 uint64_t NumElements = NumInits;
913 if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) {
914 ElementType = AType->getElementType();
915 if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
916 NumElements = CAType->getZExtSize();
917 // For an array new with an unknown bound, ask for one additional element
918 // in order to populate the array filler.
919 if (Entity.isVariableLengthArrayNew())
920 ++NumElements;
921 ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
922 0, Entity);
923 } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) {
924 ElementType = VType->getElementType();
925 NumElements = VType->getNumElements();
926 ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
927 0, Entity);
928 } else
929 ElementType = ILE->getType();
930
931 bool SkipEmptyInitChecks = false;
932 for (uint64_t Init = 0; Init != NumElements; ++Init) {
933 if (hadError)
934 return;
935
936 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement ||
937 ElementEntity.getKind() == InitializedEntity::EK_VectorElement)
938 ElementEntity.setElementIndex(Init);
939
940 if (Init >= NumInits && (ILE->hasArrayFiller() || SkipEmptyInitChecks))
941 return;
942
943 Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : nullptr);
944 if (!InitExpr && Init < NumInits && ILE->hasArrayFiller())
945 ILE->setInit(Init, ILE->getArrayFiller());
946 else if (!InitExpr && !ILE->hasArrayFiller()) {
947 // In VerifyOnly mode, there's no point performing empty initialization
948 // more than once.
949 if (SkipEmptyInitChecks)
950 continue;
951
952 Expr *Filler = nullptr;
953
954 if (FillWithNoInit)
955 Filler = new (SemaRef.Context) NoInitExpr(ElementType);
956 else {
957 ExprResult ElementInit =
958 PerformEmptyInit(ILE->getEndLoc(), ElementEntity);
959 if (ElementInit.isInvalid()) {
960 hadError = true;
961 return;
962 }
963
964 Filler = ElementInit.getAs<Expr>();
965 }
966
967 if (hadError) {
968 // Do nothing
969 } else if (VerifyOnly) {
970 SkipEmptyInitChecks = true;
971 } else if (Init < NumInits) {
972 // For arrays, just set the expression used for value-initialization
973 // of the "holes" in the array.
974 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement)
975 ILE->setArrayFiller(Filler);
976 else
977 ILE->setInit(Init, Filler);
978 } else {
979 // For arrays, just set the expression used for value-initialization
980 // of the rest of elements and exit.
981 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) {
982 ILE->setArrayFiller(Filler);
983 return;
984 }
985
986 if (!isa<ImplicitValueInitExpr>(Filler) && !isa<NoInitExpr>(Filler)) {
987 // Empty initialization requires a constructor call, so
988 // extend the initializer list to include the constructor
989 // call and make a note that we'll need to take another pass
990 // through the initializer list.
991 ILE->updateInit(SemaRef.Context, Init, Filler);
992 RequiresSecondPass = true;
993 }
994 }
995 } else if (InitListExpr *InnerILE
996 = dyn_cast_or_null<InitListExpr>(InitExpr)) {
997 FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
998 ILE, Init, FillWithNoInit);
999 } else if (DesignatedInitUpdateExpr *InnerDIUE =
1000 dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr)) {
1001 FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
1002 RequiresSecondPass, ILE, Init,
1003 /*FillWithNoInit =*/true);
1004 }
1005 }
1006 }
1007
hasAnyDesignatedInits(const InitListExpr * IL)1008 static bool hasAnyDesignatedInits(const InitListExpr *IL) {
1009 for (const Stmt *Init : *IL)
1010 if (isa_and_nonnull<DesignatedInitExpr>(Init))
1011 return true;
1012 return false;
1013 }
1014
InitListChecker(Sema & S,const InitializedEntity & Entity,InitListExpr * IL,QualType & T,bool VerifyOnly,bool TreatUnavailableAsInvalid,bool InOverloadResolution,SmallVectorImpl<QualType> * AggrDeductionCandidateParamTypes)1015 InitListChecker::InitListChecker(
1016 Sema &S, const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
1017 bool VerifyOnly, bool TreatUnavailableAsInvalid, bool InOverloadResolution,
1018 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes)
1019 : SemaRef(S), VerifyOnly(VerifyOnly),
1020 TreatUnavailableAsInvalid(TreatUnavailableAsInvalid),
1021 InOverloadResolution(InOverloadResolution),
1022 AggrDeductionCandidateParamTypes(AggrDeductionCandidateParamTypes) {
1023 if (!VerifyOnly || hasAnyDesignatedInits(IL)) {
1024 FullyStructuredList =
1025 createInitListExpr(T, IL->getSourceRange(), IL->getNumInits());
1026
1027 // FIXME: Check that IL isn't already the semantic form of some other
1028 // InitListExpr. If it is, we'd create a broken AST.
1029 if (!VerifyOnly)
1030 FullyStructuredList->setSyntacticForm(IL);
1031 }
1032
1033 CheckExplicitInitList(Entity, IL, T, FullyStructuredList,
1034 /*TopLevelObject=*/true);
1035
1036 if (!hadError && !AggrDeductionCandidateParamTypes && FullyStructuredList) {
1037 bool RequiresSecondPass = false;
1038 FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass,
1039 /*OuterILE=*/nullptr, /*OuterIndex=*/0);
1040 if (RequiresSecondPass && !hadError)
1041 FillInEmptyInitializations(Entity, FullyStructuredList,
1042 RequiresSecondPass, nullptr, 0);
1043 }
1044 if (hadError && FullyStructuredList)
1045 FullyStructuredList->markError();
1046 }
1047
numArrayElements(QualType DeclType)1048 int InitListChecker::numArrayElements(QualType DeclType) {
1049 // FIXME: use a proper constant
1050 int maxElements = 0x7FFFFFFF;
1051 if (const ConstantArrayType *CAT =
1052 SemaRef.Context.getAsConstantArrayType(DeclType)) {
1053 maxElements = static_cast<int>(CAT->getZExtSize());
1054 }
1055 return maxElements;
1056 }
1057
numStructUnionElements(QualType DeclType)1058 int InitListChecker::numStructUnionElements(QualType DeclType) {
1059 RecordDecl *structDecl = DeclType->castAs<RecordType>()->getDecl();
1060 int InitializableMembers = 0;
1061 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
1062 InitializableMembers += CXXRD->getNumBases();
1063 for (const auto *Field : structDecl->fields())
1064 if (!Field->isUnnamedBitField())
1065 ++InitializableMembers;
1066
1067 if (structDecl->isUnion())
1068 return std::min(InitializableMembers, 1);
1069 return InitializableMembers - structDecl->hasFlexibleArrayMember();
1070 }
1071
getRecordDecl(QualType DeclType)1072 RecordDecl *InitListChecker::getRecordDecl(QualType DeclType) {
1073 if (const auto *RT = DeclType->getAs<RecordType>())
1074 return RT->getDecl();
1075 if (const auto *Inject = DeclType->getAs<InjectedClassNameType>())
1076 return Inject->getDecl();
1077 return nullptr;
1078 }
1079
1080 /// Determine whether Entity is an entity for which it is idiomatic to elide
1081 /// the braces in aggregate initialization.
isIdiomaticBraceElisionEntity(const InitializedEntity & Entity)1082 static bool isIdiomaticBraceElisionEntity(const InitializedEntity &Entity) {
1083 // Recursive initialization of the one and only field within an aggregate
1084 // class is considered idiomatic. This case arises in particular for
1085 // initialization of std::array, where the C++ standard suggests the idiom of
1086 //
1087 // std::array<T, N> arr = {1, 2, 3};
1088 //
1089 // (where std::array is an aggregate struct containing a single array field.
1090
1091 if (!Entity.getParent())
1092 return false;
1093
1094 // Allows elide brace initialization for aggregates with empty base.
1095 if (Entity.getKind() == InitializedEntity::EK_Base) {
1096 auto *ParentRD =
1097 Entity.getParent()->getType()->castAs<RecordType>()->getDecl();
1098 CXXRecordDecl *CXXRD = cast<CXXRecordDecl>(ParentRD);
1099 return CXXRD->getNumBases() == 1 && CXXRD->field_empty();
1100 }
1101
1102 // Allow brace elision if the only subobject is a field.
1103 if (Entity.getKind() == InitializedEntity::EK_Member) {
1104 auto *ParentRD =
1105 Entity.getParent()->getType()->castAs<RecordType>()->getDecl();
1106 if (CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ParentRD)) {
1107 if (CXXRD->getNumBases()) {
1108 return false;
1109 }
1110 }
1111 auto FieldIt = ParentRD->field_begin();
1112 assert(FieldIt != ParentRD->field_end() &&
1113 "no fields but have initializer for member?");
1114 return ++FieldIt == ParentRD->field_end();
1115 }
1116
1117 return false;
1118 }
1119
1120 /// Check whether the range of the initializer \p ParentIList from element
1121 /// \p Index onwards can be used to initialize an object of type \p T. Update
1122 /// \p Index to indicate how many elements of the list were consumed.
1123 ///
1124 /// This also fills in \p StructuredList, from element \p StructuredIndex
1125 /// onwards, with the fully-braced, desugared form of the initialization.
CheckImplicitInitList(const InitializedEntity & Entity,InitListExpr * ParentIList,QualType T,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1126 void InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity,
1127 InitListExpr *ParentIList,
1128 QualType T, unsigned &Index,
1129 InitListExpr *StructuredList,
1130 unsigned &StructuredIndex) {
1131 int maxElements = 0;
1132
1133 if (T->isArrayType())
1134 maxElements = numArrayElements(T);
1135 else if (T->isRecordType())
1136 maxElements = numStructUnionElements(T);
1137 else if (T->isVectorType())
1138 maxElements = T->castAs<VectorType>()->getNumElements();
1139 else
1140 llvm_unreachable("CheckImplicitInitList(): Illegal type");
1141
1142 if (maxElements == 0) {
1143 if (!VerifyOnly)
1144 SemaRef.Diag(ParentIList->getInit(Index)->getBeginLoc(),
1145 diag::err_implicit_empty_initializer);
1146 ++Index;
1147 hadError = true;
1148 return;
1149 }
1150
1151 // Build a structured initializer list corresponding to this subobject.
1152 InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(
1153 ParentIList, Index, T, StructuredList, StructuredIndex,
1154 SourceRange(ParentIList->getInit(Index)->getBeginLoc(),
1155 ParentIList->getSourceRange().getEnd()));
1156 unsigned StructuredSubobjectInitIndex = 0;
1157
1158 // Check the element types and build the structural subobject.
1159 unsigned StartIndex = Index;
1160 CheckListElementTypes(Entity, ParentIList, T,
1161 /*SubobjectIsDesignatorContext=*/false, Index,
1162 StructuredSubobjectInitList,
1163 StructuredSubobjectInitIndex);
1164
1165 if (StructuredSubobjectInitList) {
1166 StructuredSubobjectInitList->setType(T);
1167
1168 unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
1169 // Update the structured sub-object initializer so that it's ending
1170 // range corresponds with the end of the last initializer it used.
1171 if (EndIndex < ParentIList->getNumInits() &&
1172 ParentIList->getInit(EndIndex)) {
1173 SourceLocation EndLoc
1174 = ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
1175 StructuredSubobjectInitList->setRBraceLoc(EndLoc);
1176 }
1177
1178 // Complain about missing braces.
1179 if (!VerifyOnly && (T->isArrayType() || T->isRecordType()) &&
1180 !ParentIList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
1181 !isIdiomaticBraceElisionEntity(Entity)) {
1182 SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1183 diag::warn_missing_braces)
1184 << StructuredSubobjectInitList->getSourceRange()
1185 << FixItHint::CreateInsertion(
1186 StructuredSubobjectInitList->getBeginLoc(), "{")
1187 << FixItHint::CreateInsertion(
1188 SemaRef.getLocForEndOfToken(
1189 StructuredSubobjectInitList->getEndLoc()),
1190 "}");
1191 }
1192
1193 // Warn if this type won't be an aggregate in future versions of C++.
1194 auto *CXXRD = T->getAsCXXRecordDecl();
1195 if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1196 SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1197 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1198 << StructuredSubobjectInitList->getSourceRange() << T;
1199 }
1200 }
1201 }
1202
1203 /// Warn that \p Entity was of scalar type and was initialized by a
1204 /// single-element braced initializer list.
warnBracedScalarInit(Sema & S,const InitializedEntity & Entity,SourceRange Braces)1205 static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity,
1206 SourceRange Braces) {
1207 // Don't warn during template instantiation. If the initialization was
1208 // non-dependent, we warned during the initial parse; otherwise, the
1209 // type might not be scalar in some uses of the template.
1210 if (S.inTemplateInstantiation())
1211 return;
1212
1213 unsigned DiagID = 0;
1214
1215 switch (Entity.getKind()) {
1216 case InitializedEntity::EK_VectorElement:
1217 case InitializedEntity::EK_ComplexElement:
1218 case InitializedEntity::EK_ArrayElement:
1219 case InitializedEntity::EK_Parameter:
1220 case InitializedEntity::EK_Parameter_CF_Audited:
1221 case InitializedEntity::EK_TemplateParameter:
1222 case InitializedEntity::EK_Result:
1223 case InitializedEntity::EK_ParenAggInitMember:
1224 // Extra braces here are suspicious.
1225 DiagID = diag::warn_braces_around_init;
1226 break;
1227
1228 case InitializedEntity::EK_Member:
1229 // Warn on aggregate initialization but not on ctor init list or
1230 // default member initializer.
1231 if (Entity.getParent())
1232 DiagID = diag::warn_braces_around_init;
1233 break;
1234
1235 case InitializedEntity::EK_Variable:
1236 case InitializedEntity::EK_LambdaCapture:
1237 // No warning, might be direct-list-initialization.
1238 // FIXME: Should we warn for copy-list-initialization in these cases?
1239 break;
1240
1241 case InitializedEntity::EK_New:
1242 case InitializedEntity::EK_Temporary:
1243 case InitializedEntity::EK_CompoundLiteralInit:
1244 // No warning, braces are part of the syntax of the underlying construct.
1245 break;
1246
1247 case InitializedEntity::EK_RelatedResult:
1248 // No warning, we already warned when initializing the result.
1249 break;
1250
1251 case InitializedEntity::EK_Exception:
1252 case InitializedEntity::EK_Base:
1253 case InitializedEntity::EK_Delegating:
1254 case InitializedEntity::EK_BlockElement:
1255 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
1256 case InitializedEntity::EK_Binding:
1257 case InitializedEntity::EK_StmtExprResult:
1258 llvm_unreachable("unexpected braced scalar init");
1259 }
1260
1261 if (DiagID) {
1262 S.Diag(Braces.getBegin(), DiagID)
1263 << Entity.getType()->isSizelessBuiltinType() << Braces
1264 << FixItHint::CreateRemoval(Braces.getBegin())
1265 << FixItHint::CreateRemoval(Braces.getEnd());
1266 }
1267 }
1268
1269 /// Check whether the initializer \p IList (that was written with explicit
1270 /// braces) can be used to initialize an object of type \p T.
1271 ///
1272 /// This also fills in \p StructuredList with the fully-braced, desugared
1273 /// form of the initialization.
CheckExplicitInitList(const InitializedEntity & Entity,InitListExpr * IList,QualType & T,InitListExpr * StructuredList,bool TopLevelObject)1274 void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
1275 InitListExpr *IList, QualType &T,
1276 InitListExpr *StructuredList,
1277 bool TopLevelObject) {
1278 unsigned Index = 0, StructuredIndex = 0;
1279 CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true,
1280 Index, StructuredList, StructuredIndex, TopLevelObject);
1281 if (StructuredList) {
1282 QualType ExprTy = T;
1283 if (!ExprTy->isArrayType())
1284 ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context);
1285 if (!VerifyOnly)
1286 IList->setType(ExprTy);
1287 StructuredList->setType(ExprTy);
1288 }
1289 if (hadError)
1290 return;
1291
1292 // Don't complain for incomplete types, since we'll get an error elsewhere.
1293 if (Index < IList->getNumInits() && !T->isIncompleteType()) {
1294 // We have leftover initializers
1295 bool ExtraInitsIsError = SemaRef.getLangOpts().CPlusPlus ||
1296 (SemaRef.getLangOpts().OpenCL && T->isVectorType());
1297 hadError = ExtraInitsIsError;
1298 if (VerifyOnly) {
1299 return;
1300 } else if (StructuredIndex == 1 &&
1301 IsStringInit(StructuredList->getInit(0), T, SemaRef.Context) ==
1302 SIF_None) {
1303 unsigned DK =
1304 ExtraInitsIsError
1305 ? diag::err_excess_initializers_in_char_array_initializer
1306 : diag::ext_excess_initializers_in_char_array_initializer;
1307 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1308 << IList->getInit(Index)->getSourceRange();
1309 } else if (T->isSizelessBuiltinType()) {
1310 unsigned DK = ExtraInitsIsError
1311 ? diag::err_excess_initializers_for_sizeless_type
1312 : diag::ext_excess_initializers_for_sizeless_type;
1313 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1314 << T << IList->getInit(Index)->getSourceRange();
1315 } else {
1316 int initKind = T->isArrayType() ? 0 :
1317 T->isVectorType() ? 1 :
1318 T->isScalarType() ? 2 :
1319 T->isUnionType() ? 3 :
1320 4;
1321
1322 unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
1323 : diag::ext_excess_initializers;
1324 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1325 << initKind << IList->getInit(Index)->getSourceRange();
1326 }
1327 }
1328
1329 if (!VerifyOnly) {
1330 if (T->isScalarType() && IList->getNumInits() == 1 &&
1331 !isa<InitListExpr>(IList->getInit(0)))
1332 warnBracedScalarInit(SemaRef, Entity, IList->getSourceRange());
1333
1334 // Warn if this is a class type that won't be an aggregate in future
1335 // versions of C++.
1336 auto *CXXRD = T->getAsCXXRecordDecl();
1337 if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1338 // Don't warn if there's an equivalent default constructor that would be
1339 // used instead.
1340 bool HasEquivCtor = false;
1341 if (IList->getNumInits() == 0) {
1342 auto *CD = SemaRef.LookupDefaultConstructor(CXXRD);
1343 HasEquivCtor = CD && !CD->isDeleted();
1344 }
1345
1346 if (!HasEquivCtor) {
1347 SemaRef.Diag(IList->getBeginLoc(),
1348 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1349 << IList->getSourceRange() << T;
1350 }
1351 }
1352 }
1353 }
1354
CheckListElementTypes(const InitializedEntity & Entity,InitListExpr * IList,QualType & DeclType,bool SubobjectIsDesignatorContext,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex,bool TopLevelObject)1355 void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
1356 InitListExpr *IList,
1357 QualType &DeclType,
1358 bool SubobjectIsDesignatorContext,
1359 unsigned &Index,
1360 InitListExpr *StructuredList,
1361 unsigned &StructuredIndex,
1362 bool TopLevelObject) {
1363 if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) {
1364 // Explicitly braced initializer for complex type can be real+imaginary
1365 // parts.
1366 CheckComplexType(Entity, IList, DeclType, Index,
1367 StructuredList, StructuredIndex);
1368 } else if (DeclType->isScalarType()) {
1369 CheckScalarType(Entity, IList, DeclType, Index,
1370 StructuredList, StructuredIndex);
1371 } else if (DeclType->isVectorType()) {
1372 CheckVectorType(Entity, IList, DeclType, Index,
1373 StructuredList, StructuredIndex);
1374 } else if (const RecordDecl *RD = getRecordDecl(DeclType)) {
1375 auto Bases =
1376 CXXRecordDecl::base_class_const_range(CXXRecordDecl::base_class_const_iterator(),
1377 CXXRecordDecl::base_class_const_iterator());
1378 if (DeclType->isRecordType()) {
1379 assert(DeclType->isAggregateType() &&
1380 "non-aggregate records should be handed in CheckSubElementType");
1381 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1382 Bases = CXXRD->bases();
1383 } else {
1384 Bases = cast<CXXRecordDecl>(RD)->bases();
1385 }
1386 CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1387 SubobjectIsDesignatorContext, Index, StructuredList,
1388 StructuredIndex, TopLevelObject);
1389 } else if (DeclType->isArrayType()) {
1390 llvm::APSInt Zero(
1391 SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()),
1392 false);
1393 CheckArrayType(Entity, IList, DeclType, Zero,
1394 SubobjectIsDesignatorContext, Index,
1395 StructuredList, StructuredIndex);
1396 } else if (DeclType->isVoidType() || DeclType->isFunctionType()) {
1397 // This type is invalid, issue a diagnostic.
1398 ++Index;
1399 if (!VerifyOnly)
1400 SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1401 << DeclType;
1402 hadError = true;
1403 } else if (DeclType->isReferenceType()) {
1404 CheckReferenceType(Entity, IList, DeclType, Index,
1405 StructuredList, StructuredIndex);
1406 } else if (DeclType->isObjCObjectType()) {
1407 if (!VerifyOnly)
1408 SemaRef.Diag(IList->getBeginLoc(), diag::err_init_objc_class) << DeclType;
1409 hadError = true;
1410 } else if (DeclType->isOCLIntelSubgroupAVCType() ||
1411 DeclType->isSizelessBuiltinType()) {
1412 // Checks for scalar type are sufficient for these types too.
1413 CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1414 StructuredIndex);
1415 } else if (DeclType->isDependentType()) {
1416 // C++ [over.match.class.deduct]p1.5:
1417 // brace elision is not considered for any aggregate element that has a
1418 // dependent non-array type or an array type with a value-dependent bound
1419 ++Index;
1420 assert(AggrDeductionCandidateParamTypes);
1421 AggrDeductionCandidateParamTypes->push_back(DeclType);
1422 } else {
1423 if (!VerifyOnly)
1424 SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1425 << DeclType;
1426 hadError = true;
1427 }
1428 }
1429
CheckSubElementType(const InitializedEntity & Entity,InitListExpr * IList,QualType ElemType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex,bool DirectlyDesignated)1430 void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
1431 InitListExpr *IList,
1432 QualType ElemType,
1433 unsigned &Index,
1434 InitListExpr *StructuredList,
1435 unsigned &StructuredIndex,
1436 bool DirectlyDesignated) {
1437 Expr *expr = IList->getInit(Index);
1438
1439 if (ElemType->isReferenceType())
1440 return CheckReferenceType(Entity, IList, ElemType, Index,
1441 StructuredList, StructuredIndex);
1442
1443 if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
1444 if (SubInitList->getNumInits() == 1 &&
1445 IsStringInit(SubInitList->getInit(0), ElemType, SemaRef.Context) ==
1446 SIF_None) {
1447 // FIXME: It would be more faithful and no less correct to include an
1448 // InitListExpr in the semantic form of the initializer list in this case.
1449 expr = SubInitList->getInit(0);
1450 }
1451 // Nested aggregate initialization and C++ initialization are handled later.
1452 } else if (isa<ImplicitValueInitExpr>(expr)) {
1453 // This happens during template instantiation when we see an InitListExpr
1454 // that we've already checked once.
1455 assert(SemaRef.Context.hasSameType(expr->getType(), ElemType) &&
1456 "found implicit initialization for the wrong type");
1457 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1458 ++Index;
1459 return;
1460 }
1461
1462 if (SemaRef.getLangOpts().CPlusPlus || isa<InitListExpr>(expr)) {
1463 // C++ [dcl.init.aggr]p2:
1464 // Each member is copy-initialized from the corresponding
1465 // initializer-clause.
1466
1467 // FIXME: Better EqualLoc?
1468 InitializationKind Kind =
1469 InitializationKind::CreateCopy(expr->getBeginLoc(), SourceLocation());
1470
1471 // Vector elements can be initialized from other vectors in which case
1472 // we need initialization entity with a type of a vector (and not a vector
1473 // element!) initializing multiple vector elements.
1474 auto TmpEntity =
1475 (ElemType->isExtVectorType() && !Entity.getType()->isExtVectorType())
1476 ? InitializedEntity::InitializeTemporary(ElemType)
1477 : Entity;
1478
1479 if (TmpEntity.getType()->isDependentType()) {
1480 // C++ [over.match.class.deduct]p1.5:
1481 // brace elision is not considered for any aggregate element that has a
1482 // dependent non-array type or an array type with a value-dependent
1483 // bound
1484 assert(AggrDeductionCandidateParamTypes);
1485
1486 // In the presence of a braced-init-list within the initializer, we should
1487 // not perform brace-elision, even if brace elision would otherwise be
1488 // applicable. For example, given:
1489 //
1490 // template <class T> struct Foo {
1491 // T t[2];
1492 // };
1493 //
1494 // Foo t = {{1, 2}};
1495 //
1496 // we don't want the (T, T) but rather (T [2]) in terms of the initializer
1497 // {{1, 2}}.
1498 if (isa<InitListExpr, DesignatedInitExpr>(expr) ||
1499 !isa_and_present<ConstantArrayType>(
1500 SemaRef.Context.getAsArrayType(ElemType))) {
1501 ++Index;
1502 AggrDeductionCandidateParamTypes->push_back(ElemType);
1503 return;
1504 }
1505 } else {
1506 InitializationSequence Seq(SemaRef, TmpEntity, Kind, expr,
1507 /*TopLevelOfInitList*/ true);
1508 // C++14 [dcl.init.aggr]p13:
1509 // If the assignment-expression can initialize a member, the member is
1510 // initialized. Otherwise [...] brace elision is assumed
1511 //
1512 // Brace elision is never performed if the element is not an
1513 // assignment-expression.
1514 if (Seq || isa<InitListExpr>(expr)) {
1515 if (auto *Embed = dyn_cast<EmbedExpr>(expr)) {
1516 expr = HandleEmbed(Embed, Entity);
1517 }
1518 if (!VerifyOnly) {
1519 ExprResult Result = Seq.Perform(SemaRef, TmpEntity, Kind, expr);
1520 if (Result.isInvalid())
1521 hadError = true;
1522
1523 UpdateStructuredListElement(StructuredList, StructuredIndex,
1524 Result.getAs<Expr>());
1525 } else if (!Seq) {
1526 hadError = true;
1527 } else if (StructuredList) {
1528 UpdateStructuredListElement(StructuredList, StructuredIndex,
1529 getDummyInit());
1530 }
1531 if (!CurEmbed)
1532 ++Index;
1533 if (AggrDeductionCandidateParamTypes)
1534 AggrDeductionCandidateParamTypes->push_back(ElemType);
1535 return;
1536 }
1537 }
1538
1539 // Fall through for subaggregate initialization
1540 } else if (ElemType->isScalarType() || ElemType->isAtomicType()) {
1541 // FIXME: Need to handle atomic aggregate types with implicit init lists.
1542 return CheckScalarType(Entity, IList, ElemType, Index,
1543 StructuredList, StructuredIndex);
1544 } else if (const ArrayType *arrayType =
1545 SemaRef.Context.getAsArrayType(ElemType)) {
1546 // arrayType can be incomplete if we're initializing a flexible
1547 // array member. There's nothing we can do with the completed
1548 // type here, though.
1549
1550 if (IsStringInit(expr, arrayType, SemaRef.Context) == SIF_None) {
1551 // FIXME: Should we do this checking in verify-only mode?
1552 if (!VerifyOnly)
1553 CheckStringInit(expr, ElemType, arrayType, SemaRef,
1554 SemaRef.getLangOpts().C23 &&
1555 initializingConstexprVariable(Entity));
1556 if (StructuredList)
1557 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1558 ++Index;
1559 return;
1560 }
1561
1562 // Fall through for subaggregate initialization.
1563
1564 } else {
1565 assert((ElemType->isRecordType() || ElemType->isVectorType() ||
1566 ElemType->isOpenCLSpecificType()) && "Unexpected type");
1567
1568 // C99 6.7.8p13:
1569 //
1570 // The initializer for a structure or union object that has
1571 // automatic storage duration shall be either an initializer
1572 // list as described below, or a single expression that has
1573 // compatible structure or union type. In the latter case, the
1574 // initial value of the object, including unnamed members, is
1575 // that of the expression.
1576 ExprResult ExprRes = expr;
1577 if (SemaRef.CheckSingleAssignmentConstraints(
1578 ElemType, ExprRes, !VerifyOnly) != Sema::Incompatible) {
1579 if (ExprRes.isInvalid())
1580 hadError = true;
1581 else {
1582 ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.get());
1583 if (ExprRes.isInvalid())
1584 hadError = true;
1585 }
1586 UpdateStructuredListElement(StructuredList, StructuredIndex,
1587 ExprRes.getAs<Expr>());
1588 ++Index;
1589 return;
1590 }
1591 ExprRes.get();
1592 // Fall through for subaggregate initialization
1593 }
1594
1595 // C++ [dcl.init.aggr]p12:
1596 //
1597 // [...] Otherwise, if the member is itself a non-empty
1598 // subaggregate, brace elision is assumed and the initializer is
1599 // considered for the initialization of the first member of
1600 // the subaggregate.
1601 // OpenCL vector initializer is handled elsewhere.
1602 if ((!SemaRef.getLangOpts().OpenCL && ElemType->isVectorType()) ||
1603 ElemType->isAggregateType()) {
1604 CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1605 StructuredIndex);
1606 ++StructuredIndex;
1607
1608 // In C++20, brace elision is not permitted for a designated initializer.
1609 if (DirectlyDesignated && SemaRef.getLangOpts().CPlusPlus && !hadError) {
1610 if (InOverloadResolution)
1611 hadError = true;
1612 if (!VerifyOnly) {
1613 SemaRef.Diag(expr->getBeginLoc(),
1614 diag::ext_designated_init_brace_elision)
1615 << expr->getSourceRange()
1616 << FixItHint::CreateInsertion(expr->getBeginLoc(), "{")
1617 << FixItHint::CreateInsertion(
1618 SemaRef.getLocForEndOfToken(expr->getEndLoc()), "}");
1619 }
1620 }
1621 } else {
1622 if (!VerifyOnly) {
1623 // We cannot initialize this element, so let PerformCopyInitialization
1624 // produce the appropriate diagnostic. We already checked that this
1625 // initialization will fail.
1626 ExprResult Copy =
1627 SemaRef.PerformCopyInitialization(Entity, SourceLocation(), expr,
1628 /*TopLevelOfInitList=*/true);
1629 (void)Copy;
1630 assert(Copy.isInvalid() &&
1631 "expected non-aggregate initialization to fail");
1632 }
1633 hadError = true;
1634 ++Index;
1635 ++StructuredIndex;
1636 }
1637 }
1638
CheckComplexType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1639 void InitListChecker::CheckComplexType(const InitializedEntity &Entity,
1640 InitListExpr *IList, QualType DeclType,
1641 unsigned &Index,
1642 InitListExpr *StructuredList,
1643 unsigned &StructuredIndex) {
1644 assert(Index == 0 && "Index in explicit init list must be zero");
1645
1646 // As an extension, clang supports complex initializers, which initialize
1647 // a complex number component-wise. When an explicit initializer list for
1648 // a complex number contains two initializers, this extension kicks in:
1649 // it expects the initializer list to contain two elements convertible to
1650 // the element type of the complex type. The first element initializes
1651 // the real part, and the second element intitializes the imaginary part.
1652
1653 if (IList->getNumInits() < 2)
1654 return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1655 StructuredIndex);
1656
1657 // This is an extension in C. (The builtin _Complex type does not exist
1658 // in the C++ standard.)
1659 if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly)
1660 SemaRef.Diag(IList->getBeginLoc(), diag::ext_complex_component_init)
1661 << IList->getSourceRange();
1662
1663 // Initialize the complex number.
1664 QualType elementType = DeclType->castAs<ComplexType>()->getElementType();
1665 InitializedEntity ElementEntity =
1666 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1667
1668 for (unsigned i = 0; i < 2; ++i) {
1669 ElementEntity.setElementIndex(Index);
1670 CheckSubElementType(ElementEntity, IList, elementType, Index,
1671 StructuredList, StructuredIndex);
1672 }
1673 }
1674
CheckScalarType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1675 void InitListChecker::CheckScalarType(const InitializedEntity &Entity,
1676 InitListExpr *IList, QualType DeclType,
1677 unsigned &Index,
1678 InitListExpr *StructuredList,
1679 unsigned &StructuredIndex) {
1680 if (Index >= IList->getNumInits()) {
1681 if (!VerifyOnly) {
1682 if (SemaRef.getLangOpts().CPlusPlus) {
1683 if (DeclType->isSizelessBuiltinType())
1684 SemaRef.Diag(IList->getBeginLoc(),
1685 SemaRef.getLangOpts().CPlusPlus11
1686 ? diag::warn_cxx98_compat_empty_sizeless_initializer
1687 : diag::err_empty_sizeless_initializer)
1688 << DeclType << IList->getSourceRange();
1689 else
1690 SemaRef.Diag(IList->getBeginLoc(),
1691 SemaRef.getLangOpts().CPlusPlus11
1692 ? diag::warn_cxx98_compat_empty_scalar_initializer
1693 : diag::err_empty_scalar_initializer)
1694 << IList->getSourceRange();
1695 }
1696 }
1697 hadError =
1698 SemaRef.getLangOpts().CPlusPlus && !SemaRef.getLangOpts().CPlusPlus11;
1699 ++Index;
1700 ++StructuredIndex;
1701 return;
1702 }
1703
1704 Expr *expr = IList->getInit(Index);
1705 if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) {
1706 // FIXME: This is invalid, and accepting it causes overload resolution
1707 // to pick the wrong overload in some corner cases.
1708 if (!VerifyOnly)
1709 SemaRef.Diag(SubIList->getBeginLoc(), diag::ext_many_braces_around_init)
1710 << DeclType->isSizelessBuiltinType() << SubIList->getSourceRange();
1711
1712 CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1713 StructuredIndex);
1714 return;
1715 } else if (isa<DesignatedInitExpr>(expr)) {
1716 if (!VerifyOnly)
1717 SemaRef.Diag(expr->getBeginLoc(),
1718 diag::err_designator_for_scalar_or_sizeless_init)
1719 << DeclType->isSizelessBuiltinType() << DeclType
1720 << expr->getSourceRange();
1721 hadError = true;
1722 ++Index;
1723 ++StructuredIndex;
1724 return;
1725 } else if (auto *Embed = dyn_cast<EmbedExpr>(expr)) {
1726 expr = HandleEmbed(Embed, Entity);
1727 }
1728
1729 ExprResult Result;
1730 if (VerifyOnly) {
1731 if (SemaRef.CanPerformCopyInitialization(Entity, expr))
1732 Result = getDummyInit();
1733 else
1734 Result = ExprError();
1735 } else {
1736 Result =
1737 SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1738 /*TopLevelOfInitList=*/true);
1739 }
1740
1741 Expr *ResultExpr = nullptr;
1742
1743 if (Result.isInvalid())
1744 hadError = true; // types weren't compatible.
1745 else {
1746 ResultExpr = Result.getAs<Expr>();
1747
1748 if (ResultExpr != expr && !VerifyOnly && !CurEmbed) {
1749 // The type was promoted, update initializer list.
1750 // FIXME: Why are we updating the syntactic init list?
1751 IList->setInit(Index, ResultExpr);
1752 }
1753 }
1754
1755 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1756 if (!CurEmbed)
1757 ++Index;
1758 if (AggrDeductionCandidateParamTypes)
1759 AggrDeductionCandidateParamTypes->push_back(DeclType);
1760 }
1761
CheckReferenceType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1762 void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
1763 InitListExpr *IList, QualType DeclType,
1764 unsigned &Index,
1765 InitListExpr *StructuredList,
1766 unsigned &StructuredIndex) {
1767 if (Index >= IList->getNumInits()) {
1768 // FIXME: It would be wonderful if we could point at the actual member. In
1769 // general, it would be useful to pass location information down the stack,
1770 // so that we know the location (or decl) of the "current object" being
1771 // initialized.
1772 if (!VerifyOnly)
1773 SemaRef.Diag(IList->getBeginLoc(),
1774 diag::err_init_reference_member_uninitialized)
1775 << DeclType << IList->getSourceRange();
1776 hadError = true;
1777 ++Index;
1778 ++StructuredIndex;
1779 return;
1780 }
1781
1782 Expr *expr = IList->getInit(Index);
1783 if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) {
1784 if (!VerifyOnly)
1785 SemaRef.Diag(IList->getBeginLoc(), diag::err_init_non_aggr_init_list)
1786 << DeclType << IList->getSourceRange();
1787 hadError = true;
1788 ++Index;
1789 ++StructuredIndex;
1790 return;
1791 }
1792
1793 ExprResult Result;
1794 if (VerifyOnly) {
1795 if (SemaRef.CanPerformCopyInitialization(Entity,expr))
1796 Result = getDummyInit();
1797 else
1798 Result = ExprError();
1799 } else {
1800 Result =
1801 SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1802 /*TopLevelOfInitList=*/true);
1803 }
1804
1805 if (Result.isInvalid())
1806 hadError = true;
1807
1808 expr = Result.getAs<Expr>();
1809 // FIXME: Why are we updating the syntactic init list?
1810 if (!VerifyOnly && expr)
1811 IList->setInit(Index, expr);
1812
1813 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1814 ++Index;
1815 if (AggrDeductionCandidateParamTypes)
1816 AggrDeductionCandidateParamTypes->push_back(DeclType);
1817 }
1818
CheckVectorType(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)1819 void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
1820 InitListExpr *IList, QualType DeclType,
1821 unsigned &Index,
1822 InitListExpr *StructuredList,
1823 unsigned &StructuredIndex) {
1824 const VectorType *VT = DeclType->castAs<VectorType>();
1825 unsigned maxElements = VT->getNumElements();
1826 unsigned numEltsInit = 0;
1827 QualType elementType = VT->getElementType();
1828
1829 if (Index >= IList->getNumInits()) {
1830 // Make sure the element type can be value-initialized.
1831 CheckEmptyInitializable(
1832 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
1833 IList->getEndLoc());
1834 return;
1835 }
1836
1837 if (!SemaRef.getLangOpts().OpenCL && !SemaRef.getLangOpts().HLSL ) {
1838 // If the initializing element is a vector, try to copy-initialize
1839 // instead of breaking it apart (which is doomed to failure anyway).
1840 Expr *Init = IList->getInit(Index);
1841 if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) {
1842 ExprResult Result;
1843 if (VerifyOnly) {
1844 if (SemaRef.CanPerformCopyInitialization(Entity, Init))
1845 Result = getDummyInit();
1846 else
1847 Result = ExprError();
1848 } else {
1849 Result =
1850 SemaRef.PerformCopyInitialization(Entity, Init->getBeginLoc(), Init,
1851 /*TopLevelOfInitList=*/true);
1852 }
1853
1854 Expr *ResultExpr = nullptr;
1855 if (Result.isInvalid())
1856 hadError = true; // types weren't compatible.
1857 else {
1858 ResultExpr = Result.getAs<Expr>();
1859
1860 if (ResultExpr != Init && !VerifyOnly) {
1861 // The type was promoted, update initializer list.
1862 // FIXME: Why are we updating the syntactic init list?
1863 IList->setInit(Index, ResultExpr);
1864 }
1865 }
1866 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1867 ++Index;
1868 if (AggrDeductionCandidateParamTypes)
1869 AggrDeductionCandidateParamTypes->push_back(elementType);
1870 return;
1871 }
1872
1873 InitializedEntity ElementEntity =
1874 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1875
1876 for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1877 // Don't attempt to go past the end of the init list
1878 if (Index >= IList->getNumInits()) {
1879 CheckEmptyInitializable(ElementEntity, IList->getEndLoc());
1880 break;
1881 }
1882
1883 ElementEntity.setElementIndex(Index);
1884 CheckSubElementType(ElementEntity, IList, elementType, Index,
1885 StructuredList, StructuredIndex);
1886 }
1887
1888 if (VerifyOnly)
1889 return;
1890
1891 bool isBigEndian = SemaRef.Context.getTargetInfo().isBigEndian();
1892 const VectorType *T = Entity.getType()->castAs<VectorType>();
1893 if (isBigEndian && (T->getVectorKind() == VectorKind::Neon ||
1894 T->getVectorKind() == VectorKind::NeonPoly)) {
1895 // The ability to use vector initializer lists is a GNU vector extension
1896 // and is unrelated to the NEON intrinsics in arm_neon.h. On little
1897 // endian machines it works fine, however on big endian machines it
1898 // exhibits surprising behaviour:
1899 //
1900 // uint32x2_t x = {42, 64};
1901 // return vget_lane_u32(x, 0); // Will return 64.
1902 //
1903 // Because of this, explicitly call out that it is non-portable.
1904 //
1905 SemaRef.Diag(IList->getBeginLoc(),
1906 diag::warn_neon_vector_initializer_non_portable);
1907
1908 const char *typeCode;
1909 unsigned typeSize = SemaRef.Context.getTypeSize(elementType);
1910
1911 if (elementType->isFloatingType())
1912 typeCode = "f";
1913 else if (elementType->isSignedIntegerType())
1914 typeCode = "s";
1915 else if (elementType->isUnsignedIntegerType())
1916 typeCode = "u";
1917 else
1918 llvm_unreachable("Invalid element type!");
1919
1920 SemaRef.Diag(IList->getBeginLoc(),
1921 SemaRef.Context.getTypeSize(VT) > 64
1922 ? diag::note_neon_vector_initializer_non_portable_q
1923 : diag::note_neon_vector_initializer_non_portable)
1924 << typeCode << typeSize;
1925 }
1926
1927 return;
1928 }
1929
1930 InitializedEntity ElementEntity =
1931 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
1932
1933 // OpenCL and HLSL initializers allow vectors to be constructed from vectors.
1934 for (unsigned i = 0; i < maxElements; ++i) {
1935 // Don't attempt to go past the end of the init list
1936 if (Index >= IList->getNumInits())
1937 break;
1938
1939 ElementEntity.setElementIndex(Index);
1940
1941 QualType IType = IList->getInit(Index)->getType();
1942 if (!IType->isVectorType()) {
1943 CheckSubElementType(ElementEntity, IList, elementType, Index,
1944 StructuredList, StructuredIndex);
1945 ++numEltsInit;
1946 } else {
1947 QualType VecType;
1948 const VectorType *IVT = IType->castAs<VectorType>();
1949 unsigned numIElts = IVT->getNumElements();
1950
1951 if (IType->isExtVectorType())
1952 VecType = SemaRef.Context.getExtVectorType(elementType, numIElts);
1953 else
1954 VecType = SemaRef.Context.getVectorType(elementType, numIElts,
1955 IVT->getVectorKind());
1956 CheckSubElementType(ElementEntity, IList, VecType, Index,
1957 StructuredList, StructuredIndex);
1958 numEltsInit += numIElts;
1959 }
1960 }
1961
1962 // OpenCL and HLSL require all elements to be initialized.
1963 if (numEltsInit != maxElements) {
1964 if (!VerifyOnly)
1965 SemaRef.Diag(IList->getBeginLoc(),
1966 diag::err_vector_incorrect_num_initializers)
1967 << (numEltsInit < maxElements) << maxElements << numEltsInit;
1968 hadError = true;
1969 }
1970 }
1971
1972 /// Check if the type of a class element has an accessible destructor, and marks
1973 /// it referenced. Returns true if we shouldn't form a reference to the
1974 /// destructor.
1975 ///
1976 /// Aggregate initialization requires a class element's destructor be
1977 /// accessible per 11.6.1 [dcl.init.aggr]:
1978 ///
1979 /// The destructor for each element of class type is potentially invoked
1980 /// (15.4 [class.dtor]) from the context where the aggregate initialization
1981 /// occurs.
checkDestructorReference(QualType ElementType,SourceLocation Loc,Sema & SemaRef)1982 static bool checkDestructorReference(QualType ElementType, SourceLocation Loc,
1983 Sema &SemaRef) {
1984 auto *CXXRD = ElementType->getAsCXXRecordDecl();
1985 if (!CXXRD)
1986 return false;
1987
1988 CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(CXXRD);
1989 SemaRef.CheckDestructorAccess(Loc, Destructor,
1990 SemaRef.PDiag(diag::err_access_dtor_temp)
1991 << ElementType);
1992 SemaRef.MarkFunctionReferenced(Loc, Destructor);
1993 return SemaRef.DiagnoseUseOfDecl(Destructor, Loc);
1994 }
1995
1996 static bool
canInitializeArrayWithEmbedDataString(ArrayRef<Expr * > ExprList,const InitializedEntity & Entity,ASTContext & Context)1997 canInitializeArrayWithEmbedDataString(ArrayRef<Expr *> ExprList,
1998 const InitializedEntity &Entity,
1999 ASTContext &Context) {
2000 QualType InitType = Entity.getType();
2001 const InitializedEntity *Parent = &Entity;
2002
2003 while (Parent) {
2004 InitType = Parent->getType();
2005 Parent = Parent->getParent();
2006 }
2007
2008 // Only one initializer, it's an embed and the types match;
2009 EmbedExpr *EE =
2010 ExprList.size() == 1
2011 ? dyn_cast_if_present<EmbedExpr>(ExprList[0]->IgnoreParens())
2012 : nullptr;
2013 if (!EE)
2014 return false;
2015
2016 if (InitType->isArrayType()) {
2017 const ArrayType *InitArrayType = InitType->getAsArrayTypeUnsafe();
2018 QualType InitElementTy = InitArrayType->getElementType();
2019 QualType EmbedExprElementTy = EE->getDataStringLiteral()->getType();
2020 const bool TypesMatch =
2021 Context.typesAreCompatible(InitElementTy, EmbedExprElementTy) ||
2022 (InitElementTy->isCharType() && EmbedExprElementTy->isCharType());
2023 if (TypesMatch)
2024 return true;
2025 }
2026 return false;
2027 }
2028
CheckArrayType(const InitializedEntity & Entity,InitListExpr * IList,QualType & DeclType,llvm::APSInt elementIndex,bool SubobjectIsDesignatorContext,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex)2029 void InitListChecker::CheckArrayType(const InitializedEntity &Entity,
2030 InitListExpr *IList, QualType &DeclType,
2031 llvm::APSInt elementIndex,
2032 bool SubobjectIsDesignatorContext,
2033 unsigned &Index,
2034 InitListExpr *StructuredList,
2035 unsigned &StructuredIndex) {
2036 const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType);
2037
2038 if (!VerifyOnly) {
2039 if (checkDestructorReference(arrayType->getElementType(),
2040 IList->getEndLoc(), SemaRef)) {
2041 hadError = true;
2042 return;
2043 }
2044 }
2045
2046 if (canInitializeArrayWithEmbedDataString(IList->inits(), Entity,
2047 SemaRef.Context)) {
2048 EmbedExpr *Embed = cast<EmbedExpr>(IList->inits()[0]);
2049 IList->setInit(0, Embed->getDataStringLiteral());
2050 }
2051
2052 // Check for the special-case of initializing an array with a string.
2053 if (Index < IList->getNumInits()) {
2054 if (IsStringInit(IList->getInit(Index), arrayType, SemaRef.Context) ==
2055 SIF_None) {
2056 // We place the string literal directly into the resulting
2057 // initializer list. This is the only place where the structure
2058 // of the structured initializer list doesn't match exactly,
2059 // because doing so would involve allocating one character
2060 // constant for each string.
2061 // FIXME: Should we do these checks in verify-only mode too?
2062 if (!VerifyOnly)
2063 CheckStringInit(IList->getInit(Index), DeclType, arrayType, SemaRef,
2064 SemaRef.getLangOpts().C23 &&
2065 initializingConstexprVariable(Entity));
2066 if (StructuredList) {
2067 UpdateStructuredListElement(StructuredList, StructuredIndex,
2068 IList->getInit(Index));
2069 StructuredList->resizeInits(SemaRef.Context, StructuredIndex);
2070 }
2071 ++Index;
2072 if (AggrDeductionCandidateParamTypes)
2073 AggrDeductionCandidateParamTypes->push_back(DeclType);
2074 return;
2075 }
2076 }
2077 if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) {
2078 // Check for VLAs; in standard C it would be possible to check this
2079 // earlier, but I don't know where clang accepts VLAs (gcc accepts
2080 // them in all sorts of strange places).
2081 bool HasErr = IList->getNumInits() != 0 || SemaRef.getLangOpts().CPlusPlus;
2082 if (!VerifyOnly) {
2083 // C23 6.7.10p4: An entity of variable length array type shall not be
2084 // initialized except by an empty initializer.
2085 //
2086 // The C extension warnings are issued from ParseBraceInitializer() and
2087 // do not need to be issued here. However, we continue to issue an error
2088 // in the case there are initializers or we are compiling C++. We allow
2089 // use of VLAs in C++, but it's not clear we want to allow {} to zero
2090 // init a VLA in C++ in all cases (such as with non-trivial constructors).
2091 // FIXME: should we allow this construct in C++ when it makes sense to do
2092 // so?
2093 if (HasErr)
2094 SemaRef.Diag(VAT->getSizeExpr()->getBeginLoc(),
2095 diag::err_variable_object_no_init)
2096 << VAT->getSizeExpr()->getSourceRange();
2097 }
2098 hadError = HasErr;
2099 ++Index;
2100 ++StructuredIndex;
2101 return;
2102 }
2103
2104 // We might know the maximum number of elements in advance.
2105 llvm::APSInt maxElements(elementIndex.getBitWidth(),
2106 elementIndex.isUnsigned());
2107 bool maxElementsKnown = false;
2108 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) {
2109 maxElements = CAT->getSize();
2110 elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
2111 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2112 maxElementsKnown = true;
2113 }
2114
2115 QualType elementType = arrayType->getElementType();
2116 while (Index < IList->getNumInits()) {
2117 Expr *Init = IList->getInit(Index);
2118 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
2119 // If we're not the subobject that matches up with the '{' for
2120 // the designator, we shouldn't be handling the
2121 // designator. Return immediately.
2122 if (!SubobjectIsDesignatorContext)
2123 return;
2124
2125 // Handle this designated initializer. elementIndex will be
2126 // updated to be the next array element we'll initialize.
2127 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
2128 DeclType, nullptr, &elementIndex, Index,
2129 StructuredList, StructuredIndex, true,
2130 false)) {
2131 hadError = true;
2132 continue;
2133 }
2134
2135 if (elementIndex.getBitWidth() > maxElements.getBitWidth())
2136 maxElements = maxElements.extend(elementIndex.getBitWidth());
2137 else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
2138 elementIndex = elementIndex.extend(maxElements.getBitWidth());
2139 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2140
2141 // If the array is of incomplete type, keep track of the number of
2142 // elements in the initializer.
2143 if (!maxElementsKnown && elementIndex > maxElements)
2144 maxElements = elementIndex;
2145
2146 continue;
2147 }
2148
2149 // If we know the maximum number of elements, and we've already
2150 // hit it, stop consuming elements in the initializer list.
2151 if (maxElementsKnown && elementIndex == maxElements)
2152 break;
2153
2154 InitializedEntity ElementEntity = InitializedEntity::InitializeElement(
2155 SemaRef.Context, StructuredIndex, Entity);
2156
2157 unsigned EmbedElementIndexBeforeInit = CurEmbedIndex;
2158 // Check this element.
2159 CheckSubElementType(ElementEntity, IList, elementType, Index,
2160 StructuredList, StructuredIndex);
2161 ++elementIndex;
2162 if ((CurEmbed || isa<EmbedExpr>(Init)) && elementType->isScalarType()) {
2163 if (CurEmbed) {
2164 elementIndex =
2165 elementIndex + CurEmbedIndex - EmbedElementIndexBeforeInit - 1;
2166 } else {
2167 auto Embed = cast<EmbedExpr>(Init);
2168 elementIndex = elementIndex + Embed->getDataElementCount() -
2169 EmbedElementIndexBeforeInit - 1;
2170 }
2171 }
2172
2173 // If the array is of incomplete type, keep track of the number of
2174 // elements in the initializer.
2175 if (!maxElementsKnown && elementIndex > maxElements)
2176 maxElements = elementIndex;
2177 }
2178 if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) {
2179 // If this is an incomplete array type, the actual type needs to
2180 // be calculated here.
2181 llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
2182 if (maxElements == Zero && !Entity.isVariableLengthArrayNew()) {
2183 // Sizing an array implicitly to zero is not allowed by ISO C,
2184 // but is supported by GNU.
2185 SemaRef.Diag(IList->getBeginLoc(), diag::ext_typecheck_zero_array_size);
2186 }
2187
2188 DeclType = SemaRef.Context.getConstantArrayType(
2189 elementType, maxElements, nullptr, ArraySizeModifier::Normal, 0);
2190 }
2191 if (!hadError) {
2192 // If there are any members of the array that get value-initialized, check
2193 // that is possible. That happens if we know the bound and don't have
2194 // enough elements, or if we're performing an array new with an unknown
2195 // bound.
2196 if ((maxElementsKnown && elementIndex < maxElements) ||
2197 Entity.isVariableLengthArrayNew())
2198 CheckEmptyInitializable(
2199 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity),
2200 IList->getEndLoc());
2201 }
2202 }
2203
CheckFlexibleArrayInit(const InitializedEntity & Entity,Expr * InitExpr,FieldDecl * Field,bool TopLevelObject)2204 bool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity,
2205 Expr *InitExpr,
2206 FieldDecl *Field,
2207 bool TopLevelObject) {
2208 // Handle GNU flexible array initializers.
2209 unsigned FlexArrayDiag;
2210 if (isa<InitListExpr>(InitExpr) &&
2211 cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
2212 // Empty flexible array init always allowed as an extension
2213 FlexArrayDiag = diag::ext_flexible_array_init;
2214 } else if (!TopLevelObject) {
2215 // Disallow flexible array init on non-top-level object
2216 FlexArrayDiag = diag::err_flexible_array_init;
2217 } else if (Entity.getKind() != InitializedEntity::EK_Variable) {
2218 // Disallow flexible array init on anything which is not a variable.
2219 FlexArrayDiag = diag::err_flexible_array_init;
2220 } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) {
2221 // Disallow flexible array init on local variables.
2222 FlexArrayDiag = diag::err_flexible_array_init;
2223 } else {
2224 // Allow other cases.
2225 FlexArrayDiag = diag::ext_flexible_array_init;
2226 }
2227
2228 if (!VerifyOnly) {
2229 SemaRef.Diag(InitExpr->getBeginLoc(), FlexArrayDiag)
2230 << InitExpr->getBeginLoc();
2231 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
2232 << Field;
2233 }
2234
2235 return FlexArrayDiag != diag::ext_flexible_array_init;
2236 }
2237
CheckStructUnionTypes(const InitializedEntity & Entity,InitListExpr * IList,QualType DeclType,CXXRecordDecl::base_class_const_range Bases,RecordDecl::field_iterator Field,bool SubobjectIsDesignatorContext,unsigned & Index,InitListExpr * StructuredList,unsigned & StructuredIndex,bool TopLevelObject)2238 void InitListChecker::CheckStructUnionTypes(
2239 const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType,
2240 CXXRecordDecl::base_class_const_range Bases, RecordDecl::field_iterator Field,
2241 bool SubobjectIsDesignatorContext, unsigned &Index,
2242 InitListExpr *StructuredList, unsigned &StructuredIndex,
2243 bool TopLevelObject) {
2244 const RecordDecl *RD = getRecordDecl(DeclType);
2245
2246 // If the record is invalid, some of it's members are invalid. To avoid
2247 // confusion, we forgo checking the initializer for the entire record.
2248 if (RD->isInvalidDecl()) {
2249 // Assume it was supposed to consume a single initializer.
2250 ++Index;
2251 hadError = true;
2252 return;
2253 }
2254
2255 if (RD->isUnion() && IList->getNumInits() == 0) {
2256 if (!VerifyOnly)
2257 for (FieldDecl *FD : RD->fields()) {
2258 QualType ET = SemaRef.Context.getBaseElementType(FD->getType());
2259 if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
2260 hadError = true;
2261 return;
2262 }
2263 }
2264
2265 // If there's a default initializer, use it.
2266 if (isa<CXXRecordDecl>(RD) &&
2267 cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
2268 if (!StructuredList)
2269 return;
2270 for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2271 Field != FieldEnd; ++Field) {
2272 if (Field->hasInClassInitializer() ||
2273 (Field->isAnonymousStructOrUnion() &&
2274 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
2275 StructuredList->setInitializedFieldInUnion(*Field);
2276 // FIXME: Actually build a CXXDefaultInitExpr?
2277 return;
2278 }
2279 }
2280 llvm_unreachable("Couldn't find in-class initializer");
2281 }
2282
2283 // Value-initialize the first member of the union that isn't an unnamed
2284 // bitfield.
2285 for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2286 Field != FieldEnd; ++Field) {
2287 if (!Field->isUnnamedBitField()) {
2288 CheckEmptyInitializable(
2289 InitializedEntity::InitializeMember(*Field, &Entity),
2290 IList->getEndLoc());
2291 if (StructuredList)
2292 StructuredList->setInitializedFieldInUnion(*Field);
2293 break;
2294 }
2295 }
2296 return;
2297 }
2298
2299 bool InitializedSomething = false;
2300
2301 // If we have any base classes, they are initialized prior to the fields.
2302 for (auto I = Bases.begin(), E = Bases.end(); I != E; ++I) {
2303 auto &Base = *I;
2304 Expr *Init = Index < IList->getNumInits() ? IList->getInit(Index) : nullptr;
2305
2306 // Designated inits always initialize fields, so if we see one, all
2307 // remaining base classes have no explicit initializer.
2308 if (isa_and_nonnull<DesignatedInitExpr>(Init))
2309 Init = nullptr;
2310
2311 // C++ [over.match.class.deduct]p1.6:
2312 // each non-trailing aggregate element that is a pack expansion is assumed
2313 // to correspond to no elements of the initializer list, and (1.7) a
2314 // trailing aggregate element that is a pack expansion is assumed to
2315 // correspond to all remaining elements of the initializer list (if any).
2316
2317 // C++ [over.match.class.deduct]p1.9:
2318 // ... except that additional parameter packs of the form P_j... are
2319 // inserted into the parameter list in their original aggregate element
2320 // position corresponding to each non-trailing aggregate element of
2321 // type P_j that was skipped because it was a parameter pack, and the
2322 // trailing sequence of parameters corresponding to a trailing
2323 // aggregate element that is a pack expansion (if any) is replaced
2324 // by a single parameter of the form T_n....
2325 if (AggrDeductionCandidateParamTypes && Base.isPackExpansion()) {
2326 AggrDeductionCandidateParamTypes->push_back(
2327 SemaRef.Context.getPackExpansionType(Base.getType(), std::nullopt));
2328
2329 // Trailing pack expansion
2330 if (I + 1 == E && RD->field_empty()) {
2331 if (Index < IList->getNumInits())
2332 Index = IList->getNumInits();
2333 return;
2334 }
2335
2336 continue;
2337 }
2338
2339 SourceLocation InitLoc = Init ? Init->getBeginLoc() : IList->getEndLoc();
2340 InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
2341 SemaRef.Context, &Base, false, &Entity);
2342 if (Init) {
2343 CheckSubElementType(BaseEntity, IList, Base.getType(), Index,
2344 StructuredList, StructuredIndex);
2345 InitializedSomething = true;
2346 } else {
2347 CheckEmptyInitializable(BaseEntity, InitLoc);
2348 }
2349
2350 if (!VerifyOnly)
2351 if (checkDestructorReference(Base.getType(), InitLoc, SemaRef)) {
2352 hadError = true;
2353 return;
2354 }
2355 }
2356
2357 // If structDecl is a forward declaration, this loop won't do
2358 // anything except look at designated initializers; That's okay,
2359 // because an error should get printed out elsewhere. It might be
2360 // worthwhile to skip over the rest of the initializer, though.
2361 RecordDecl::field_iterator FieldEnd = RD->field_end();
2362 size_t NumRecordDecls = llvm::count_if(RD->decls(), [&](const Decl *D) {
2363 return isa<FieldDecl>(D) || isa<RecordDecl>(D);
2364 });
2365 bool HasDesignatedInit = false;
2366
2367 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
2368
2369 while (Index < IList->getNumInits()) {
2370 Expr *Init = IList->getInit(Index);
2371 SourceLocation InitLoc = Init->getBeginLoc();
2372
2373 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
2374 // If we're not the subobject that matches up with the '{' for
2375 // the designator, we shouldn't be handling the
2376 // designator. Return immediately.
2377 if (!SubobjectIsDesignatorContext)
2378 return;
2379
2380 HasDesignatedInit = true;
2381
2382 // Handle this designated initializer. Field will be updated to
2383 // the next field that we'll be initializing.
2384 bool DesignatedInitFailed = CheckDesignatedInitializer(
2385 Entity, IList, DIE, 0, DeclType, &Field, nullptr, Index,
2386 StructuredList, StructuredIndex, true, TopLevelObject);
2387 if (DesignatedInitFailed)
2388 hadError = true;
2389
2390 // Find the field named by the designated initializer.
2391 DesignatedInitExpr::Designator *D = DIE->getDesignator(0);
2392 if (!VerifyOnly && D->isFieldDesignator()) {
2393 FieldDecl *F = D->getFieldDecl();
2394 InitializedFields.insert(F);
2395 if (!DesignatedInitFailed) {
2396 QualType ET = SemaRef.Context.getBaseElementType(F->getType());
2397 if (checkDestructorReference(ET, InitLoc, SemaRef)) {
2398 hadError = true;
2399 return;
2400 }
2401 }
2402 }
2403
2404 InitializedSomething = true;
2405 continue;
2406 }
2407
2408 // Check if this is an initializer of forms:
2409 //
2410 // struct foo f = {};
2411 // struct foo g = {0};
2412 //
2413 // These are okay for randomized structures. [C99 6.7.8p19]
2414 //
2415 // Also, if there is only one element in the structure, we allow something
2416 // like this, because it's really not randomized in the traditional sense.
2417 //
2418 // struct foo h = {bar};
2419 auto IsZeroInitializer = [&](const Expr *I) {
2420 if (IList->getNumInits() == 1) {
2421 if (NumRecordDecls == 1)
2422 return true;
2423 if (const auto *IL = dyn_cast<IntegerLiteral>(I))
2424 return IL->getValue().isZero();
2425 }
2426 return false;
2427 };
2428
2429 // Don't allow non-designated initializers on randomized structures.
2430 if (RD->isRandomized() && !IsZeroInitializer(Init)) {
2431 if (!VerifyOnly)
2432 SemaRef.Diag(InitLoc, diag::err_non_designated_init_used);
2433 hadError = true;
2434 break;
2435 }
2436
2437 if (Field == FieldEnd) {
2438 // We've run out of fields. We're done.
2439 break;
2440 }
2441
2442 // We've already initialized a member of a union. We can stop entirely.
2443 if (InitializedSomething && RD->isUnion())
2444 return;
2445
2446 // Stop if we've hit a flexible array member.
2447 if (Field->getType()->isIncompleteArrayType())
2448 break;
2449
2450 if (Field->isUnnamedBitField()) {
2451 // Don't initialize unnamed bitfields, e.g. "int : 20;"
2452 ++Field;
2453 continue;
2454 }
2455
2456 // Make sure we can use this declaration.
2457 bool InvalidUse;
2458 if (VerifyOnly)
2459 InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
2460 else
2461 InvalidUse = SemaRef.DiagnoseUseOfDecl(
2462 *Field, IList->getInit(Index)->getBeginLoc());
2463 if (InvalidUse) {
2464 ++Index;
2465 ++Field;
2466 hadError = true;
2467 continue;
2468 }
2469
2470 if (!VerifyOnly) {
2471 QualType ET = SemaRef.Context.getBaseElementType(Field->getType());
2472 if (checkDestructorReference(ET, InitLoc, SemaRef)) {
2473 hadError = true;
2474 return;
2475 }
2476 }
2477
2478 InitializedEntity MemberEntity =
2479 InitializedEntity::InitializeMember(*Field, &Entity);
2480 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2481 StructuredList, StructuredIndex);
2482 InitializedSomething = true;
2483 InitializedFields.insert(*Field);
2484
2485 if (RD->isUnion() && StructuredList) {
2486 // Initialize the first field within the union.
2487 StructuredList->setInitializedFieldInUnion(*Field);
2488 }
2489
2490 ++Field;
2491 }
2492
2493 // Emit warnings for missing struct field initializers.
2494 // This check is disabled for designated initializers in C.
2495 // This matches gcc behaviour.
2496 bool IsCDesignatedInitializer =
2497 HasDesignatedInit && !SemaRef.getLangOpts().CPlusPlus;
2498 if (!VerifyOnly && InitializedSomething && !RD->isUnion() &&
2499 !IList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
2500 !IsCDesignatedInitializer) {
2501 // It is possible we have one or more unnamed bitfields remaining.
2502 // Find first (if any) named field and emit warning.
2503 for (RecordDecl::field_iterator it = HasDesignatedInit ? RD->field_begin()
2504 : Field,
2505 end = RD->field_end();
2506 it != end; ++it) {
2507 if (HasDesignatedInit && InitializedFields.count(*it))
2508 continue;
2509
2510 if (!it->isUnnamedBitField() && !it->hasInClassInitializer() &&
2511 !it->getType()->isIncompleteArrayType()) {
2512 auto Diag = HasDesignatedInit
2513 ? diag::warn_missing_designated_field_initializers
2514 : diag::warn_missing_field_initializers;
2515 SemaRef.Diag(IList->getSourceRange().getEnd(), Diag) << *it;
2516 break;
2517 }
2518 }
2519 }
2520
2521 // Check that any remaining fields can be value-initialized if we're not
2522 // building a structured list. (If we are, we'll check this later.)
2523 if (!StructuredList && Field != FieldEnd && !RD->isUnion() &&
2524 !Field->getType()->isIncompleteArrayType()) {
2525 for (; Field != FieldEnd && !hadError; ++Field) {
2526 if (!Field->isUnnamedBitField() && !Field->hasInClassInitializer())
2527 CheckEmptyInitializable(
2528 InitializedEntity::InitializeMember(*Field, &Entity),
2529 IList->getEndLoc());
2530 }
2531 }
2532
2533 // Check that the types of the remaining fields have accessible destructors.
2534 if (!VerifyOnly) {
2535 // If the initializer expression has a designated initializer, check the
2536 // elements for which a designated initializer is not provided too.
2537 RecordDecl::field_iterator I = HasDesignatedInit ? RD->field_begin()
2538 : Field;
2539 for (RecordDecl::field_iterator E = RD->field_end(); I != E; ++I) {
2540 QualType ET = SemaRef.Context.getBaseElementType(I->getType());
2541 if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
2542 hadError = true;
2543 return;
2544 }
2545 }
2546 }
2547
2548 if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() ||
2549 Index >= IList->getNumInits())
2550 return;
2551
2552 if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field,
2553 TopLevelObject)) {
2554 hadError = true;
2555 ++Index;
2556 return;
2557 }
2558
2559 InitializedEntity MemberEntity =
2560 InitializedEntity::InitializeMember(*Field, &Entity);
2561
2562 if (isa<InitListExpr>(IList->getInit(Index)) ||
2563 AggrDeductionCandidateParamTypes)
2564 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2565 StructuredList, StructuredIndex);
2566 else
2567 CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index,
2568 StructuredList, StructuredIndex);
2569
2570 if (RD->isUnion() && StructuredList) {
2571 // Initialize the first field within the union.
2572 StructuredList->setInitializedFieldInUnion(*Field);
2573 }
2574 }
2575
2576 /// Expand a field designator that refers to a member of an
2577 /// anonymous struct or union into a series of field designators that
2578 /// refers to the field within the appropriate subobject.
2579 ///
ExpandAnonymousFieldDesignator(Sema & SemaRef,DesignatedInitExpr * DIE,unsigned DesigIdx,IndirectFieldDecl * IndirectField)2580 static void ExpandAnonymousFieldDesignator(Sema &SemaRef,
2581 DesignatedInitExpr *DIE,
2582 unsigned DesigIdx,
2583 IndirectFieldDecl *IndirectField) {
2584 typedef DesignatedInitExpr::Designator Designator;
2585
2586 // Build the replacement designators.
2587 SmallVector<Designator, 4> Replacements;
2588 for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(),
2589 PE = IndirectField->chain_end(); PI != PE; ++PI) {
2590 if (PI + 1 == PE)
2591 Replacements.push_back(Designator::CreateFieldDesignator(
2592 (IdentifierInfo *)nullptr, DIE->getDesignator(DesigIdx)->getDotLoc(),
2593 DIE->getDesignator(DesigIdx)->getFieldLoc()));
2594 else
2595 Replacements.push_back(Designator::CreateFieldDesignator(
2596 (IdentifierInfo *)nullptr, SourceLocation(), SourceLocation()));
2597 assert(isa<FieldDecl>(*PI));
2598 Replacements.back().setFieldDecl(cast<FieldDecl>(*PI));
2599 }
2600
2601 // Expand the current designator into the set of replacement
2602 // designators, so we have a full subobject path down to where the
2603 // member of the anonymous struct/union is actually stored.
2604 DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0],
2605 &Replacements[0] + Replacements.size());
2606 }
2607
CloneDesignatedInitExpr(Sema & SemaRef,DesignatedInitExpr * DIE)2608 static DesignatedInitExpr *CloneDesignatedInitExpr(Sema &SemaRef,
2609 DesignatedInitExpr *DIE) {
2610 unsigned NumIndexExprs = DIE->getNumSubExprs() - 1;
2611 SmallVector<Expr*, 4> IndexExprs(NumIndexExprs);
2612 for (unsigned I = 0; I < NumIndexExprs; ++I)
2613 IndexExprs[I] = DIE->getSubExpr(I + 1);
2614 return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators(),
2615 IndexExprs,
2616 DIE->getEqualOrColonLoc(),
2617 DIE->usesGNUSyntax(), DIE->getInit());
2618 }
2619
2620 namespace {
2621
2622 // Callback to only accept typo corrections that are for field members of
2623 // the given struct or union.
2624 class FieldInitializerValidatorCCC final : public CorrectionCandidateCallback {
2625 public:
FieldInitializerValidatorCCC(const RecordDecl * RD)2626 explicit FieldInitializerValidatorCCC(const RecordDecl *RD)
2627 : Record(RD) {}
2628
ValidateCandidate(const TypoCorrection & candidate)2629 bool ValidateCandidate(const TypoCorrection &candidate) override {
2630 FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>();
2631 return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record);
2632 }
2633
clone()2634 std::unique_ptr<CorrectionCandidateCallback> clone() override {
2635 return std::make_unique<FieldInitializerValidatorCCC>(*this);
2636 }
2637
2638 private:
2639 const RecordDecl *Record;
2640 };
2641
2642 } // end anonymous namespace
2643
2644 /// Check the well-formedness of a C99 designated initializer.
2645 ///
2646 /// Determines whether the designated initializer @p DIE, which
2647 /// resides at the given @p Index within the initializer list @p
2648 /// IList, is well-formed for a current object of type @p DeclType
2649 /// (C99 6.7.8). The actual subobject that this designator refers to
2650 /// within the current subobject is returned in either
2651 /// @p NextField or @p NextElementIndex (whichever is appropriate).
2652 ///
2653 /// @param IList The initializer list in which this designated
2654 /// initializer occurs.
2655 ///
2656 /// @param DIE The designated initializer expression.
2657 ///
2658 /// @param DesigIdx The index of the current designator.
2659 ///
2660 /// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17),
2661 /// into which the designation in @p DIE should refer.
2662 ///
2663 /// @param NextField If non-NULL and the first designator in @p DIE is
2664 /// a field, this will be set to the field declaration corresponding
2665 /// to the field named by the designator. On input, this is expected to be
2666 /// the next field that would be initialized in the absence of designation,
2667 /// if the complete object being initialized is a struct.
2668 ///
2669 /// @param NextElementIndex If non-NULL and the first designator in @p
2670 /// DIE is an array designator or GNU array-range designator, this
2671 /// will be set to the last index initialized by this designator.
2672 ///
2673 /// @param Index Index into @p IList where the designated initializer
2674 /// @p DIE occurs.
2675 ///
2676 /// @param StructuredList The initializer list expression that
2677 /// describes all of the subobject initializers in the order they'll
2678 /// actually be initialized.
2679 ///
2680 /// @returns true if there was an error, false otherwise.
2681 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)2682 InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
2683 InitListExpr *IList,
2684 DesignatedInitExpr *DIE,
2685 unsigned DesigIdx,
2686 QualType &CurrentObjectType,
2687 RecordDecl::field_iterator *NextField,
2688 llvm::APSInt *NextElementIndex,
2689 unsigned &Index,
2690 InitListExpr *StructuredList,
2691 unsigned &StructuredIndex,
2692 bool FinishSubobjectInit,
2693 bool TopLevelObject) {
2694 if (DesigIdx == DIE->size()) {
2695 // C++20 designated initialization can result in direct-list-initialization
2696 // of the designated subobject. This is the only way that we can end up
2697 // performing direct initialization as part of aggregate initialization, so
2698 // it needs special handling.
2699 if (DIE->isDirectInit()) {
2700 Expr *Init = DIE->getInit();
2701 assert(isa<InitListExpr>(Init) &&
2702 "designator result in direct non-list initialization?");
2703 InitializationKind Kind = InitializationKind::CreateDirectList(
2704 DIE->getBeginLoc(), Init->getBeginLoc(), Init->getEndLoc());
2705 InitializationSequence Seq(SemaRef, Entity, Kind, Init,
2706 /*TopLevelOfInitList*/ true);
2707 if (StructuredList) {
2708 ExprResult Result = VerifyOnly
2709 ? getDummyInit()
2710 : Seq.Perform(SemaRef, Entity, Kind, Init);
2711 UpdateStructuredListElement(StructuredList, StructuredIndex,
2712 Result.get());
2713 }
2714 ++Index;
2715 if (AggrDeductionCandidateParamTypes)
2716 AggrDeductionCandidateParamTypes->push_back(CurrentObjectType);
2717 return !Seq;
2718 }
2719
2720 // Check the actual initialization for the designated object type.
2721 bool prevHadError = hadError;
2722
2723 // Temporarily remove the designator expression from the
2724 // initializer list that the child calls see, so that we don't try
2725 // to re-process the designator.
2726 unsigned OldIndex = Index;
2727 IList->setInit(OldIndex, DIE->getInit());
2728
2729 CheckSubElementType(Entity, IList, CurrentObjectType, Index, StructuredList,
2730 StructuredIndex, /*DirectlyDesignated=*/true);
2731
2732 // Restore the designated initializer expression in the syntactic
2733 // form of the initializer list.
2734 if (IList->getInit(OldIndex) != DIE->getInit())
2735 DIE->setInit(IList->getInit(OldIndex));
2736 IList->setInit(OldIndex, DIE);
2737
2738 return hadError && !prevHadError;
2739 }
2740
2741 DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx);
2742 bool IsFirstDesignator = (DesigIdx == 0);
2743 if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
2744 // Determine the structural initializer list that corresponds to the
2745 // current subobject.
2746 if (IsFirstDesignator)
2747 StructuredList = FullyStructuredList;
2748 else {
2749 Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2750 StructuredList->getInit(StructuredIndex) : nullptr;
2751 if (!ExistingInit && StructuredList->hasArrayFiller())
2752 ExistingInit = StructuredList->getArrayFiller();
2753
2754 if (!ExistingInit)
2755 StructuredList = getStructuredSubobjectInit(
2756 IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
2757 SourceRange(D->getBeginLoc(), DIE->getEndLoc()));
2758 else if (InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2759 StructuredList = Result;
2760 else {
2761 // We are creating an initializer list that initializes the
2762 // subobjects of the current object, but there was already an
2763 // initialization that completely initialized the current
2764 // subobject, e.g., by a compound literal:
2765 //
2766 // struct X { int a, b; };
2767 // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
2768 //
2769 // Here, xs[0].a == 1 and xs[0].b == 3, since the second,
2770 // designated initializer re-initializes only its current object
2771 // subobject [0].b.
2772 diagnoseInitOverride(ExistingInit,
2773 SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
2774 /*UnionOverride=*/false,
2775 /*FullyOverwritten=*/false);
2776
2777 if (!VerifyOnly) {
2778 if (DesignatedInitUpdateExpr *E =
2779 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2780 StructuredList = E->getUpdater();
2781 else {
2782 DesignatedInitUpdateExpr *DIUE = new (SemaRef.Context)
2783 DesignatedInitUpdateExpr(SemaRef.Context, D->getBeginLoc(),
2784 ExistingInit, DIE->getEndLoc());
2785 StructuredList->updateInit(SemaRef.Context, StructuredIndex, DIUE);
2786 StructuredList = DIUE->getUpdater();
2787 }
2788 } else {
2789 // We don't need to track the structured representation of a
2790 // designated init update of an already-fully-initialized object in
2791 // verify-only mode. The only reason we would need the structure is
2792 // to determine where the uninitialized "holes" are, and in this
2793 // case, we know there aren't any and we can't introduce any.
2794 StructuredList = nullptr;
2795 }
2796 }
2797 }
2798 }
2799
2800 if (D->isFieldDesignator()) {
2801 // C99 6.7.8p7:
2802 //
2803 // If a designator has the form
2804 //
2805 // . identifier
2806 //
2807 // then the current object (defined below) shall have
2808 // structure or union type and the identifier shall be the
2809 // name of a member of that type.
2810 RecordDecl *RD = getRecordDecl(CurrentObjectType);
2811 if (!RD) {
2812 SourceLocation Loc = D->getDotLoc();
2813 if (Loc.isInvalid())
2814 Loc = D->getFieldLoc();
2815 if (!VerifyOnly)
2816 SemaRef.Diag(Loc, diag::err_field_designator_non_aggr)
2817 << SemaRef.getLangOpts().CPlusPlus << CurrentObjectType;
2818 ++Index;
2819 return true;
2820 }
2821
2822 FieldDecl *KnownField = D->getFieldDecl();
2823 if (!KnownField) {
2824 const IdentifierInfo *FieldName = D->getFieldName();
2825 ValueDecl *VD = SemaRef.tryLookupUnambiguousFieldDecl(RD, FieldName);
2826 if (auto *FD = dyn_cast_if_present<FieldDecl>(VD)) {
2827 KnownField = FD;
2828 } else if (auto *IFD = dyn_cast_if_present<IndirectFieldDecl>(VD)) {
2829 // In verify mode, don't modify the original.
2830 if (VerifyOnly)
2831 DIE = CloneDesignatedInitExpr(SemaRef, DIE);
2832 ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IFD);
2833 D = DIE->getDesignator(DesigIdx);
2834 KnownField = cast<FieldDecl>(*IFD->chain_begin());
2835 }
2836 if (!KnownField) {
2837 if (VerifyOnly) {
2838 ++Index;
2839 return true; // No typo correction when just trying this out.
2840 }
2841
2842 // We found a placeholder variable
2843 if (SemaRef.DiagRedefinedPlaceholderFieldDecl(DIE->getBeginLoc(), RD,
2844 FieldName)) {
2845 ++Index;
2846 return true;
2847 }
2848 // Name lookup found something, but it wasn't a field.
2849 if (DeclContextLookupResult Lookup = RD->lookup(FieldName);
2850 !Lookup.empty()) {
2851 SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield)
2852 << FieldName;
2853 SemaRef.Diag(Lookup.front()->getLocation(),
2854 diag::note_field_designator_found);
2855 ++Index;
2856 return true;
2857 }
2858
2859 // Name lookup didn't find anything.
2860 // Determine whether this was a typo for another field name.
2861 FieldInitializerValidatorCCC CCC(RD);
2862 if (TypoCorrection Corrected = SemaRef.CorrectTypo(
2863 DeclarationNameInfo(FieldName, D->getFieldLoc()),
2864 Sema::LookupMemberName, /*Scope=*/nullptr, /*SS=*/nullptr, CCC,
2865 Sema::CTK_ErrorRecovery, RD)) {
2866 SemaRef.diagnoseTypo(
2867 Corrected,
2868 SemaRef.PDiag(diag::err_field_designator_unknown_suggest)
2869 << FieldName << CurrentObjectType);
2870 KnownField = Corrected.getCorrectionDeclAs<FieldDecl>();
2871 hadError = true;
2872 } else {
2873 // Typo correction didn't find anything.
2874 SourceLocation Loc = D->getFieldLoc();
2875
2876 // The loc can be invalid with a "null" designator (i.e. an anonymous
2877 // union/struct). Do our best to approximate the location.
2878 if (Loc.isInvalid())
2879 Loc = IList->getBeginLoc();
2880
2881 SemaRef.Diag(Loc, diag::err_field_designator_unknown)
2882 << FieldName << CurrentObjectType << DIE->getSourceRange();
2883 ++Index;
2884 return true;
2885 }
2886 }
2887 }
2888
2889 unsigned NumBases = 0;
2890 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2891 NumBases = CXXRD->getNumBases();
2892
2893 unsigned FieldIndex = NumBases;
2894
2895 for (auto *FI : RD->fields()) {
2896 if (FI->isUnnamedBitField())
2897 continue;
2898 if (declaresSameEntity(KnownField, FI)) {
2899 KnownField = FI;
2900 break;
2901 }
2902 ++FieldIndex;
2903 }
2904
2905 RecordDecl::field_iterator Field =
2906 RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
2907
2908 // All of the fields of a union are located at the same place in
2909 // the initializer list.
2910 if (RD->isUnion()) {
2911 FieldIndex = 0;
2912 if (StructuredList) {
2913 FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
2914 if (CurrentField && !declaresSameEntity(CurrentField, *Field)) {
2915 assert(StructuredList->getNumInits() == 1
2916 && "A union should never have more than one initializer!");
2917
2918 Expr *ExistingInit = StructuredList->getInit(0);
2919 if (ExistingInit) {
2920 // We're about to throw away an initializer, emit warning.
2921 diagnoseInitOverride(
2922 ExistingInit, SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
2923 /*UnionOverride=*/true,
2924 /*FullyOverwritten=*/SemaRef.getLangOpts().CPlusPlus ? false
2925 : true);
2926 }
2927
2928 // remove existing initializer
2929 StructuredList->resizeInits(SemaRef.Context, 0);
2930 StructuredList->setInitializedFieldInUnion(nullptr);
2931 }
2932
2933 StructuredList->setInitializedFieldInUnion(*Field);
2934 }
2935 }
2936
2937 // Make sure we can use this declaration.
2938 bool InvalidUse;
2939 if (VerifyOnly)
2940 InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
2941 else
2942 InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc());
2943 if (InvalidUse) {
2944 ++Index;
2945 return true;
2946 }
2947
2948 // C++20 [dcl.init.list]p3:
2949 // The ordered identifiers in the designators of the designated-
2950 // initializer-list shall form a subsequence of the ordered identifiers
2951 // in the direct non-static data members of T.
2952 //
2953 // Note that this is not a condition on forming the aggregate
2954 // initialization, only on actually performing initialization,
2955 // so it is not checked in VerifyOnly mode.
2956 //
2957 // FIXME: This is the only reordering diagnostic we produce, and it only
2958 // catches cases where we have a top-level field designator that jumps
2959 // backwards. This is the only such case that is reachable in an
2960 // otherwise-valid C++20 program, so is the only case that's required for
2961 // conformance, but for consistency, we should diagnose all the other
2962 // cases where a designator takes us backwards too.
2963 if (IsFirstDesignator && !VerifyOnly && SemaRef.getLangOpts().CPlusPlus &&
2964 NextField &&
2965 (*NextField == RD->field_end() ||
2966 (*NextField)->getFieldIndex() > Field->getFieldIndex() + 1)) {
2967 // Find the field that we just initialized.
2968 FieldDecl *PrevField = nullptr;
2969 for (auto FI = RD->field_begin(); FI != RD->field_end(); ++FI) {
2970 if (FI->isUnnamedBitField())
2971 continue;
2972 if (*NextField != RD->field_end() &&
2973 declaresSameEntity(*FI, **NextField))
2974 break;
2975 PrevField = *FI;
2976 }
2977
2978 if (PrevField &&
2979 PrevField->getFieldIndex() > KnownField->getFieldIndex()) {
2980 SemaRef.Diag(DIE->getInit()->getBeginLoc(),
2981 diag::ext_designated_init_reordered)
2982 << KnownField << PrevField << DIE->getSourceRange();
2983
2984 unsigned OldIndex = StructuredIndex - 1;
2985 if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
2986 if (Expr *PrevInit = StructuredList->getInit(OldIndex)) {
2987 SemaRef.Diag(PrevInit->getBeginLoc(),
2988 diag::note_previous_field_init)
2989 << PrevField << PrevInit->getSourceRange();
2990 }
2991 }
2992 }
2993 }
2994
2995
2996 // Update the designator with the field declaration.
2997 if (!VerifyOnly)
2998 D->setFieldDecl(*Field);
2999
3000 // Make sure that our non-designated initializer list has space
3001 // for a subobject corresponding to this field.
3002 if (StructuredList && FieldIndex >= StructuredList->getNumInits())
3003 StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1);
3004
3005 // This designator names a flexible array member.
3006 if (Field->getType()->isIncompleteArrayType()) {
3007 bool Invalid = false;
3008 if ((DesigIdx + 1) != DIE->size()) {
3009 // We can't designate an object within the flexible array
3010 // member (because GCC doesn't allow it).
3011 if (!VerifyOnly) {
3012 DesignatedInitExpr::Designator *NextD
3013 = DIE->getDesignator(DesigIdx + 1);
3014 SemaRef.Diag(NextD->getBeginLoc(),
3015 diag::err_designator_into_flexible_array_member)
3016 << SourceRange(NextD->getBeginLoc(), DIE->getEndLoc());
3017 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
3018 << *Field;
3019 }
3020 Invalid = true;
3021 }
3022
3023 if (!hadError && !isa<InitListExpr>(DIE->getInit()) &&
3024 !isa<StringLiteral>(DIE->getInit())) {
3025 // The initializer is not an initializer list.
3026 if (!VerifyOnly) {
3027 SemaRef.Diag(DIE->getInit()->getBeginLoc(),
3028 diag::err_flexible_array_init_needs_braces)
3029 << DIE->getInit()->getSourceRange();
3030 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
3031 << *Field;
3032 }
3033 Invalid = true;
3034 }
3035
3036 // Check GNU flexible array initializer.
3037 if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field,
3038 TopLevelObject))
3039 Invalid = true;
3040
3041 if (Invalid) {
3042 ++Index;
3043 return true;
3044 }
3045
3046 // Initialize the array.
3047 bool prevHadError = hadError;
3048 unsigned newStructuredIndex = FieldIndex;
3049 unsigned OldIndex = Index;
3050 IList->setInit(Index, DIE->getInit());
3051
3052 InitializedEntity MemberEntity =
3053 InitializedEntity::InitializeMember(*Field, &Entity);
3054 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
3055 StructuredList, newStructuredIndex);
3056
3057 IList->setInit(OldIndex, DIE);
3058 if (hadError && !prevHadError) {
3059 ++Field;
3060 ++FieldIndex;
3061 if (NextField)
3062 *NextField = Field;
3063 StructuredIndex = FieldIndex;
3064 return true;
3065 }
3066 } else {
3067 // Recurse to check later designated subobjects.
3068 QualType FieldType = Field->getType();
3069 unsigned newStructuredIndex = FieldIndex;
3070
3071 InitializedEntity MemberEntity =
3072 InitializedEntity::InitializeMember(*Field, &Entity);
3073 if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
3074 FieldType, nullptr, nullptr, Index,
3075 StructuredList, newStructuredIndex,
3076 FinishSubobjectInit, false))
3077 return true;
3078 }
3079
3080 // Find the position of the next field to be initialized in this
3081 // subobject.
3082 ++Field;
3083 ++FieldIndex;
3084
3085 // If this the first designator, our caller will continue checking
3086 // the rest of this struct/class/union subobject.
3087 if (IsFirstDesignator) {
3088 if (Field != RD->field_end() && Field->isUnnamedBitField())
3089 ++Field;
3090
3091 if (NextField)
3092 *NextField = Field;
3093
3094 StructuredIndex = FieldIndex;
3095 return false;
3096 }
3097
3098 if (!FinishSubobjectInit)
3099 return false;
3100
3101 // We've already initialized something in the union; we're done.
3102 if (RD->isUnion())
3103 return hadError;
3104
3105 // Check the remaining fields within this class/struct/union subobject.
3106 bool prevHadError = hadError;
3107
3108 auto NoBases =
3109 CXXRecordDecl::base_class_range(CXXRecordDecl::base_class_iterator(),
3110 CXXRecordDecl::base_class_iterator());
3111 CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
3112 false, Index, StructuredList, FieldIndex);
3113 return hadError && !prevHadError;
3114 }
3115
3116 // C99 6.7.8p6:
3117 //
3118 // If a designator has the form
3119 //
3120 // [ constant-expression ]
3121 //
3122 // then the current object (defined below) shall have array
3123 // type and the expression shall be an integer constant
3124 // expression. If the array is of unknown size, any
3125 // nonnegative value is valid.
3126 //
3127 // Additionally, cope with the GNU extension that permits
3128 // designators of the form
3129 //
3130 // [ constant-expression ... constant-expression ]
3131 const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType);
3132 if (!AT) {
3133 if (!VerifyOnly)
3134 SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array)
3135 << CurrentObjectType;
3136 ++Index;
3137 return true;
3138 }
3139
3140 Expr *IndexExpr = nullptr;
3141 llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
3142 if (D->isArrayDesignator()) {
3143 IndexExpr = DIE->getArrayIndex(*D);
3144 DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context);
3145 DesignatedEndIndex = DesignatedStartIndex;
3146 } else {
3147 assert(D->isArrayRangeDesignator() && "Need array-range designator");
3148
3149 DesignatedStartIndex =
3150 DIE->getArrayRangeStart(*D)->EvaluateKnownConstInt(SemaRef.Context);
3151 DesignatedEndIndex =
3152 DIE->getArrayRangeEnd(*D)->EvaluateKnownConstInt(SemaRef.Context);
3153 IndexExpr = DIE->getArrayRangeEnd(*D);
3154
3155 // Codegen can't handle evaluating array range designators that have side
3156 // effects, because we replicate the AST value for each initialized element.
3157 // As such, set the sawArrayRangeDesignator() bit if we initialize multiple
3158 // elements with something that has a side effect, so codegen can emit an
3159 // "error unsupported" error instead of miscompiling the app.
3160 if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
3161 DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly)
3162 FullyStructuredList->sawArrayRangeDesignator();
3163 }
3164
3165 if (isa<ConstantArrayType>(AT)) {
3166 llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false);
3167 DesignatedStartIndex
3168 = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
3169 DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
3170 DesignatedEndIndex
3171 = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
3172 DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
3173 if (DesignatedEndIndex >= MaxElements) {
3174 if (!VerifyOnly)
3175 SemaRef.Diag(IndexExpr->getBeginLoc(),
3176 diag::err_array_designator_too_large)
3177 << toString(DesignatedEndIndex, 10) << toString(MaxElements, 10)
3178 << IndexExpr->getSourceRange();
3179 ++Index;
3180 return true;
3181 }
3182 } else {
3183 unsigned DesignatedIndexBitWidth =
3184 ConstantArrayType::getMaxSizeBits(SemaRef.Context);
3185 DesignatedStartIndex =
3186 DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
3187 DesignatedEndIndex =
3188 DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
3189 DesignatedStartIndex.setIsUnsigned(true);
3190 DesignatedEndIndex.setIsUnsigned(true);
3191 }
3192
3193 bool IsStringLiteralInitUpdate =
3194 StructuredList && StructuredList->isStringLiteralInit();
3195 if (IsStringLiteralInitUpdate && VerifyOnly) {
3196 // We're just verifying an update to a string literal init. We don't need
3197 // to split the string up into individual characters to do that.
3198 StructuredList = nullptr;
3199 } else if (IsStringLiteralInitUpdate) {
3200 // We're modifying a string literal init; we have to decompose the string
3201 // so we can modify the individual characters.
3202 ASTContext &Context = SemaRef.Context;
3203 Expr *SubExpr = StructuredList->getInit(0)->IgnoreParenImpCasts();
3204
3205 // Compute the character type
3206 QualType CharTy = AT->getElementType();
3207
3208 // Compute the type of the integer literals.
3209 QualType PromotedCharTy = CharTy;
3210 if (Context.isPromotableIntegerType(CharTy))
3211 PromotedCharTy = Context.getPromotedIntegerType(CharTy);
3212 unsigned PromotedCharTyWidth = Context.getTypeSize(PromotedCharTy);
3213
3214 if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) {
3215 // Get the length of the string.
3216 uint64_t StrLen = SL->getLength();
3217 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3218 StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3219 StructuredList->resizeInits(Context, StrLen);
3220
3221 // Build a literal for each character in the string, and put them into
3222 // the init list.
3223 for (unsigned i = 0, e = StrLen; i != e; ++i) {
3224 llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
3225 Expr *Init = new (Context) IntegerLiteral(
3226 Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
3227 if (CharTy != PromotedCharTy)
3228 Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
3229 Init, nullptr, VK_PRValue,
3230 FPOptionsOverride());
3231 StructuredList->updateInit(Context, i, Init);
3232 }
3233 } else {
3234 ObjCEncodeExpr *E = cast<ObjCEncodeExpr>(SubExpr);
3235 std::string Str;
3236 Context.getObjCEncodingForType(E->getEncodedType(), Str);
3237
3238 // Get the length of the string.
3239 uint64_t StrLen = Str.size();
3240 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3241 StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3242 StructuredList->resizeInits(Context, StrLen);
3243
3244 // Build a literal for each character in the string, and put them into
3245 // the init list.
3246 for (unsigned i = 0, e = StrLen; i != e; ++i) {
3247 llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
3248 Expr *Init = new (Context) IntegerLiteral(
3249 Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
3250 if (CharTy != PromotedCharTy)
3251 Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
3252 Init, nullptr, VK_PRValue,
3253 FPOptionsOverride());
3254 StructuredList->updateInit(Context, i, Init);
3255 }
3256 }
3257 }
3258
3259 // Make sure that our non-designated initializer list has space
3260 // for a subobject corresponding to this array element.
3261 if (StructuredList &&
3262 DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
3263 StructuredList->resizeInits(SemaRef.Context,
3264 DesignatedEndIndex.getZExtValue() + 1);
3265
3266 // Repeatedly perform subobject initializations in the range
3267 // [DesignatedStartIndex, DesignatedEndIndex].
3268
3269 // Move to the next designator
3270 unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
3271 unsigned OldIndex = Index;
3272
3273 InitializedEntity ElementEntity =
3274 InitializedEntity::InitializeElement(SemaRef.Context, 0, Entity);
3275
3276 while (DesignatedStartIndex <= DesignatedEndIndex) {
3277 // Recurse to check later designated subobjects.
3278 QualType ElementType = AT->getElementType();
3279 Index = OldIndex;
3280
3281 ElementEntity.setElementIndex(ElementIndex);
3282 if (CheckDesignatedInitializer(
3283 ElementEntity, IList, DIE, DesigIdx + 1, ElementType, nullptr,
3284 nullptr, Index, StructuredList, ElementIndex,
3285 FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
3286 false))
3287 return true;
3288
3289 // Move to the next index in the array that we'll be initializing.
3290 ++DesignatedStartIndex;
3291 ElementIndex = DesignatedStartIndex.getZExtValue();
3292 }
3293
3294 // If this the first designator, our caller will continue checking
3295 // the rest of this array subobject.
3296 if (IsFirstDesignator) {
3297 if (NextElementIndex)
3298 *NextElementIndex = DesignatedStartIndex;
3299 StructuredIndex = ElementIndex;
3300 return false;
3301 }
3302
3303 if (!FinishSubobjectInit)
3304 return false;
3305
3306 // Check the remaining elements within this array subobject.
3307 bool prevHadError = hadError;
3308 CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
3309 /*SubobjectIsDesignatorContext=*/false, Index,
3310 StructuredList, ElementIndex);
3311 return hadError && !prevHadError;
3312 }
3313
3314 // Get the structured initializer list for a subobject of type
3315 // @p CurrentObjectType.
3316 InitListExpr *
getStructuredSubobjectInit(InitListExpr * IList,unsigned Index,QualType CurrentObjectType,InitListExpr * StructuredList,unsigned StructuredIndex,SourceRange InitRange,bool IsFullyOverwritten)3317 InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
3318 QualType CurrentObjectType,
3319 InitListExpr *StructuredList,
3320 unsigned StructuredIndex,
3321 SourceRange InitRange,
3322 bool IsFullyOverwritten) {
3323 if (!StructuredList)
3324 return nullptr;
3325
3326 Expr *ExistingInit = nullptr;
3327 if (StructuredIndex < StructuredList->getNumInits())
3328 ExistingInit = StructuredList->getInit(StructuredIndex);
3329
3330 if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
3331 // There might have already been initializers for subobjects of the current
3332 // object, but a subsequent initializer list will overwrite the entirety
3333 // of the current object. (See DR 253 and C99 6.7.8p21). e.g.,
3334 //
3335 // struct P { char x[6]; };
3336 // struct P l = { .x[2] = 'x', .x = { [0] = 'f' } };
3337 //
3338 // The first designated initializer is ignored, and l.x is just "f".
3339 if (!IsFullyOverwritten)
3340 return Result;
3341
3342 if (ExistingInit) {
3343 // We are creating an initializer list that initializes the
3344 // subobjects of the current object, but there was already an
3345 // initialization that completely initialized the current
3346 // subobject:
3347 //
3348 // struct X { int a, b; };
3349 // struct X xs[] = { [0] = { 1, 2 }, [0].b = 3 };
3350 //
3351 // Here, xs[0].a == 1 and xs[0].b == 3, since the second,
3352 // designated initializer overwrites the [0].b initializer
3353 // from the prior initialization.
3354 //
3355 // When the existing initializer is an expression rather than an
3356 // initializer list, we cannot decompose and update it in this way.
3357 // For example:
3358 //
3359 // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
3360 //
3361 // This case is handled by CheckDesignatedInitializer.
3362 diagnoseInitOverride(ExistingInit, InitRange);
3363 }
3364
3365 unsigned ExpectedNumInits = 0;
3366 if (Index < IList->getNumInits()) {
3367 if (auto *Init = dyn_cast_or_null<InitListExpr>(IList->getInit(Index)))
3368 ExpectedNumInits = Init->getNumInits();
3369 else
3370 ExpectedNumInits = IList->getNumInits() - Index;
3371 }
3372
3373 InitListExpr *Result =
3374 createInitListExpr(CurrentObjectType, InitRange, ExpectedNumInits);
3375
3376 // Link this new initializer list into the structured initializer
3377 // lists.
3378 StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result);
3379 return Result;
3380 }
3381
3382 InitListExpr *
createInitListExpr(QualType CurrentObjectType,SourceRange InitRange,unsigned ExpectedNumInits)3383 InitListChecker::createInitListExpr(QualType CurrentObjectType,
3384 SourceRange InitRange,
3385 unsigned ExpectedNumInits) {
3386 InitListExpr *Result = new (SemaRef.Context) InitListExpr(
3387 SemaRef.Context, InitRange.getBegin(), std::nullopt, InitRange.getEnd());
3388
3389 QualType ResultType = CurrentObjectType;
3390 if (!ResultType->isArrayType())
3391 ResultType = ResultType.getNonLValueExprType(SemaRef.Context);
3392 Result->setType(ResultType);
3393
3394 // Pre-allocate storage for the structured initializer list.
3395 unsigned NumElements = 0;
3396
3397 if (const ArrayType *AType
3398 = SemaRef.Context.getAsArrayType(CurrentObjectType)) {
3399 if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) {
3400 NumElements = CAType->getZExtSize();
3401 // Simple heuristic so that we don't allocate a very large
3402 // initializer with many empty entries at the end.
3403 if (NumElements > ExpectedNumInits)
3404 NumElements = 0;
3405 }
3406 } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) {
3407 NumElements = VType->getNumElements();
3408 } else if (CurrentObjectType->isRecordType()) {
3409 NumElements = numStructUnionElements(CurrentObjectType);
3410 } else if (CurrentObjectType->isDependentType()) {
3411 NumElements = 1;
3412 }
3413
3414 Result->reserveInits(SemaRef.Context, NumElements);
3415
3416 return Result;
3417 }
3418
3419 /// Update the initializer at index @p StructuredIndex within the
3420 /// structured initializer list to the value @p expr.
UpdateStructuredListElement(InitListExpr * StructuredList,unsigned & StructuredIndex,Expr * expr)3421 void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
3422 unsigned &StructuredIndex,
3423 Expr *expr) {
3424 // No structured initializer list to update
3425 if (!StructuredList)
3426 return;
3427
3428 if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
3429 StructuredIndex, expr)) {
3430 // This initializer overwrites a previous initializer.
3431 // No need to diagnose when `expr` is nullptr because a more relevant
3432 // diagnostic has already been issued and this diagnostic is potentially
3433 // noise.
3434 if (expr)
3435 diagnoseInitOverride(PrevInit, expr->getSourceRange());
3436 }
3437
3438 ++StructuredIndex;
3439 }
3440
CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity & Entity,InitListExpr * From)3441 bool Sema::CanPerformAggregateInitializationForOverloadResolution(
3442 const InitializedEntity &Entity, InitListExpr *From) {
3443 QualType Type = Entity.getType();
3444 InitListChecker Check(*this, Entity, From, Type, /*VerifyOnly=*/true,
3445 /*TreatUnavailableAsInvalid=*/false,
3446 /*InOverloadResolution=*/true);
3447 return !Check.HadError();
3448 }
3449
3450 /// Check that the given Index expression is a valid array designator
3451 /// value. This is essentially just a wrapper around
3452 /// VerifyIntegerConstantExpression that also checks for negative values
3453 /// and produces a reasonable diagnostic if there is a
3454 /// failure. Returns the index expression, possibly with an implicit cast
3455 /// added, on success. If everything went okay, Value will receive the
3456 /// value of the constant expression.
3457 static ExprResult
CheckArrayDesignatorExpr(Sema & S,Expr * Index,llvm::APSInt & Value)3458 CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) {
3459 SourceLocation Loc = Index->getBeginLoc();
3460
3461 // Make sure this is an integer constant expression.
3462 ExprResult Result =
3463 S.VerifyIntegerConstantExpression(Index, &Value, Sema::AllowFold);
3464 if (Result.isInvalid())
3465 return Result;
3466
3467 if (Value.isSigned() && Value.isNegative())
3468 return S.Diag(Loc, diag::err_array_designator_negative)
3469 << toString(Value, 10) << Index->getSourceRange();
3470
3471 Value.setIsUnsigned(true);
3472 return Result;
3473 }
3474
ActOnDesignatedInitializer(Designation & Desig,SourceLocation EqualOrColonLoc,bool GNUSyntax,ExprResult Init)3475 ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
3476 SourceLocation EqualOrColonLoc,
3477 bool GNUSyntax,
3478 ExprResult Init) {
3479 typedef DesignatedInitExpr::Designator ASTDesignator;
3480
3481 bool Invalid = false;
3482 SmallVector<ASTDesignator, 32> Designators;
3483 SmallVector<Expr *, 32> InitExpressions;
3484
3485 // Build designators and check array designator expressions.
3486 for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) {
3487 const Designator &D = Desig.getDesignator(Idx);
3488
3489 if (D.isFieldDesignator()) {
3490 Designators.push_back(ASTDesignator::CreateFieldDesignator(
3491 D.getFieldDecl(), D.getDotLoc(), D.getFieldLoc()));
3492 } else if (D.isArrayDesignator()) {
3493 Expr *Index = static_cast<Expr *>(D.getArrayIndex());
3494 llvm::APSInt IndexValue;
3495 if (!Index->isTypeDependent() && !Index->isValueDependent())
3496 Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get();
3497 if (!Index)
3498 Invalid = true;
3499 else {
3500 Designators.push_back(ASTDesignator::CreateArrayDesignator(
3501 InitExpressions.size(), D.getLBracketLoc(), D.getRBracketLoc()));
3502 InitExpressions.push_back(Index);
3503 }
3504 } else if (D.isArrayRangeDesignator()) {
3505 Expr *StartIndex = static_cast<Expr *>(D.getArrayRangeStart());
3506 Expr *EndIndex = static_cast<Expr *>(D.getArrayRangeEnd());
3507 llvm::APSInt StartValue;
3508 llvm::APSInt EndValue;
3509 bool StartDependent = StartIndex->isTypeDependent() ||
3510 StartIndex->isValueDependent();
3511 bool EndDependent = EndIndex->isTypeDependent() ||
3512 EndIndex->isValueDependent();
3513 if (!StartDependent)
3514 StartIndex =
3515 CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get();
3516 if (!EndDependent)
3517 EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get();
3518
3519 if (!StartIndex || !EndIndex)
3520 Invalid = true;
3521 else {
3522 // Make sure we're comparing values with the same bit width.
3523 if (StartDependent || EndDependent) {
3524 // Nothing to compute.
3525 } else if (StartValue.getBitWidth() > EndValue.getBitWidth())
3526 EndValue = EndValue.extend(StartValue.getBitWidth());
3527 else if (StartValue.getBitWidth() < EndValue.getBitWidth())
3528 StartValue = StartValue.extend(EndValue.getBitWidth());
3529
3530 if (!StartDependent && !EndDependent && EndValue < StartValue) {
3531 Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range)
3532 << toString(StartValue, 10) << toString(EndValue, 10)
3533 << StartIndex->getSourceRange() << EndIndex->getSourceRange();
3534 Invalid = true;
3535 } else {
3536 Designators.push_back(ASTDesignator::CreateArrayRangeDesignator(
3537 InitExpressions.size(), D.getLBracketLoc(), D.getEllipsisLoc(),
3538 D.getRBracketLoc()));
3539 InitExpressions.push_back(StartIndex);
3540 InitExpressions.push_back(EndIndex);
3541 }
3542 }
3543 }
3544 }
3545
3546 if (Invalid || Init.isInvalid())
3547 return ExprError();
3548
3549 return DesignatedInitExpr::Create(Context, Designators, InitExpressions,
3550 EqualOrColonLoc, GNUSyntax,
3551 Init.getAs<Expr>());
3552 }
3553
3554 //===----------------------------------------------------------------------===//
3555 // Initialization entity
3556 //===----------------------------------------------------------------------===//
3557
InitializedEntity(ASTContext & Context,unsigned Index,const InitializedEntity & Parent)3558 InitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index,
3559 const InitializedEntity &Parent)
3560 : Parent(&Parent), Index(Index)
3561 {
3562 if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) {
3563 Kind = EK_ArrayElement;
3564 Type = AT->getElementType();
3565 } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) {
3566 Kind = EK_VectorElement;
3567 Type = VT->getElementType();
3568 } else {
3569 const ComplexType *CT = Parent.getType()->getAs<ComplexType>();
3570 assert(CT && "Unexpected type");
3571 Kind = EK_ComplexElement;
3572 Type = CT->getElementType();
3573 }
3574 }
3575
3576 InitializedEntity
InitializeBase(ASTContext & Context,const CXXBaseSpecifier * Base,bool IsInheritedVirtualBase,const InitializedEntity * Parent)3577 InitializedEntity::InitializeBase(ASTContext &Context,
3578 const CXXBaseSpecifier *Base,
3579 bool IsInheritedVirtualBase,
3580 const InitializedEntity *Parent) {
3581 InitializedEntity Result;
3582 Result.Kind = EK_Base;
3583 Result.Parent = Parent;
3584 Result.Base = {Base, IsInheritedVirtualBase};
3585 Result.Type = Base->getType();
3586 return Result;
3587 }
3588
getName() const3589 DeclarationName InitializedEntity::getName() const {
3590 switch (getKind()) {
3591 case EK_Parameter:
3592 case EK_Parameter_CF_Audited: {
3593 ParmVarDecl *D = Parameter.getPointer();
3594 return (D ? D->getDeclName() : DeclarationName());
3595 }
3596
3597 case EK_Variable:
3598 case EK_Member:
3599 case EK_ParenAggInitMember:
3600 case EK_Binding:
3601 case EK_TemplateParameter:
3602 return Variable.VariableOrMember->getDeclName();
3603
3604 case EK_LambdaCapture:
3605 return DeclarationName(Capture.VarID);
3606
3607 case EK_Result:
3608 case EK_StmtExprResult:
3609 case EK_Exception:
3610 case EK_New:
3611 case EK_Temporary:
3612 case EK_Base:
3613 case EK_Delegating:
3614 case EK_ArrayElement:
3615 case EK_VectorElement:
3616 case EK_ComplexElement:
3617 case EK_BlockElement:
3618 case EK_LambdaToBlockConversionBlockElement:
3619 case EK_CompoundLiteralInit:
3620 case EK_RelatedResult:
3621 return DeclarationName();
3622 }
3623
3624 llvm_unreachable("Invalid EntityKind!");
3625 }
3626
getDecl() const3627 ValueDecl *InitializedEntity::getDecl() const {
3628 switch (getKind()) {
3629 case EK_Variable:
3630 case EK_Member:
3631 case EK_ParenAggInitMember:
3632 case EK_Binding:
3633 case EK_TemplateParameter:
3634 return Variable.VariableOrMember;
3635
3636 case EK_Parameter:
3637 case EK_Parameter_CF_Audited:
3638 return Parameter.getPointer();
3639
3640 case EK_Result:
3641 case EK_StmtExprResult:
3642 case EK_Exception:
3643 case EK_New:
3644 case EK_Temporary:
3645 case EK_Base:
3646 case EK_Delegating:
3647 case EK_ArrayElement:
3648 case EK_VectorElement:
3649 case EK_ComplexElement:
3650 case EK_BlockElement:
3651 case EK_LambdaToBlockConversionBlockElement:
3652 case EK_LambdaCapture:
3653 case EK_CompoundLiteralInit:
3654 case EK_RelatedResult:
3655 return nullptr;
3656 }
3657
3658 llvm_unreachable("Invalid EntityKind!");
3659 }
3660
allowsNRVO() const3661 bool InitializedEntity::allowsNRVO() const {
3662 switch (getKind()) {
3663 case EK_Result:
3664 case EK_Exception:
3665 return LocAndNRVO.NRVO;
3666
3667 case EK_StmtExprResult:
3668 case EK_Variable:
3669 case EK_Parameter:
3670 case EK_Parameter_CF_Audited:
3671 case EK_TemplateParameter:
3672 case EK_Member:
3673 case EK_ParenAggInitMember:
3674 case EK_Binding:
3675 case EK_New:
3676 case EK_Temporary:
3677 case EK_CompoundLiteralInit:
3678 case EK_Base:
3679 case EK_Delegating:
3680 case EK_ArrayElement:
3681 case EK_VectorElement:
3682 case EK_ComplexElement:
3683 case EK_BlockElement:
3684 case EK_LambdaToBlockConversionBlockElement:
3685 case EK_LambdaCapture:
3686 case EK_RelatedResult:
3687 break;
3688 }
3689
3690 return false;
3691 }
3692
dumpImpl(raw_ostream & OS) const3693 unsigned InitializedEntity::dumpImpl(raw_ostream &OS) const {
3694 assert(getParent() != this);
3695 unsigned Depth = getParent() ? getParent()->dumpImpl(OS) : 0;
3696 for (unsigned I = 0; I != Depth; ++I)
3697 OS << "`-";
3698
3699 switch (getKind()) {
3700 case EK_Variable: OS << "Variable"; break;
3701 case EK_Parameter: OS << "Parameter"; break;
3702 case EK_Parameter_CF_Audited: OS << "CF audited function Parameter";
3703 break;
3704 case EK_TemplateParameter: OS << "TemplateParameter"; break;
3705 case EK_Result: OS << "Result"; break;
3706 case EK_StmtExprResult: OS << "StmtExprResult"; break;
3707 case EK_Exception: OS << "Exception"; break;
3708 case EK_Member:
3709 case EK_ParenAggInitMember:
3710 OS << "Member";
3711 break;
3712 case EK_Binding: OS << "Binding"; break;
3713 case EK_New: OS << "New"; break;
3714 case EK_Temporary: OS << "Temporary"; break;
3715 case EK_CompoundLiteralInit: OS << "CompoundLiteral";break;
3716 case EK_RelatedResult: OS << "RelatedResult"; break;
3717 case EK_Base: OS << "Base"; break;
3718 case EK_Delegating: OS << "Delegating"; break;
3719 case EK_ArrayElement: OS << "ArrayElement " << Index; break;
3720 case EK_VectorElement: OS << "VectorElement " << Index; break;
3721 case EK_ComplexElement: OS << "ComplexElement " << Index; break;
3722 case EK_BlockElement: OS << "Block"; break;
3723 case EK_LambdaToBlockConversionBlockElement:
3724 OS << "Block (lambda)";
3725 break;
3726 case EK_LambdaCapture:
3727 OS << "LambdaCapture ";
3728 OS << DeclarationName(Capture.VarID);
3729 break;
3730 }
3731
3732 if (auto *D = getDecl()) {
3733 OS << " ";
3734 D->printQualifiedName(OS);
3735 }
3736
3737 OS << " '" << getType() << "'\n";
3738
3739 return Depth + 1;
3740 }
3741
dump() const3742 LLVM_DUMP_METHOD void InitializedEntity::dump() const {
3743 dumpImpl(llvm::errs());
3744 }
3745
3746 //===----------------------------------------------------------------------===//
3747 // Initialization sequence
3748 //===----------------------------------------------------------------------===//
3749
Destroy()3750 void InitializationSequence::Step::Destroy() {
3751 switch (Kind) {
3752 case SK_ResolveAddressOfOverloadedFunction:
3753 case SK_CastDerivedToBasePRValue:
3754 case SK_CastDerivedToBaseXValue:
3755 case SK_CastDerivedToBaseLValue:
3756 case SK_BindReference:
3757 case SK_BindReferenceToTemporary:
3758 case SK_FinalCopy:
3759 case SK_ExtraneousCopyToTemporary:
3760 case SK_UserConversion:
3761 case SK_QualificationConversionPRValue:
3762 case SK_QualificationConversionXValue:
3763 case SK_QualificationConversionLValue:
3764 case SK_FunctionReferenceConversion:
3765 case SK_AtomicConversion:
3766 case SK_ListInitialization:
3767 case SK_UnwrapInitList:
3768 case SK_RewrapInitList:
3769 case SK_ConstructorInitialization:
3770 case SK_ConstructorInitializationFromList:
3771 case SK_ZeroInitialization:
3772 case SK_CAssignment:
3773 case SK_StringInit:
3774 case SK_ObjCObjectConversion:
3775 case SK_ArrayLoopIndex:
3776 case SK_ArrayLoopInit:
3777 case SK_ArrayInit:
3778 case SK_GNUArrayInit:
3779 case SK_ParenthesizedArrayInit:
3780 case SK_PassByIndirectCopyRestore:
3781 case SK_PassByIndirectRestore:
3782 case SK_ProduceObjCObject:
3783 case SK_StdInitializerList:
3784 case SK_StdInitializerListConstructorCall:
3785 case SK_OCLSamplerInit:
3786 case SK_OCLZeroOpaqueType:
3787 case SK_ParenthesizedListInit:
3788 break;
3789
3790 case SK_ConversionSequence:
3791 case SK_ConversionSequenceNoNarrowing:
3792 delete ICS;
3793 }
3794 }
3795
isDirectReferenceBinding() const3796 bool InitializationSequence::isDirectReferenceBinding() const {
3797 // There can be some lvalue adjustments after the SK_BindReference step.
3798 for (const Step &S : llvm::reverse(Steps)) {
3799 if (S.Kind == SK_BindReference)
3800 return true;
3801 if (S.Kind == SK_BindReferenceToTemporary)
3802 return false;
3803 }
3804 return false;
3805 }
3806
isAmbiguous() const3807 bool InitializationSequence::isAmbiguous() const {
3808 if (!Failed())
3809 return false;
3810
3811 switch (getFailureKind()) {
3812 case FK_TooManyInitsForReference:
3813 case FK_ParenthesizedListInitForReference:
3814 case FK_ArrayNeedsInitList:
3815 case FK_ArrayNeedsInitListOrStringLiteral:
3816 case FK_ArrayNeedsInitListOrWideStringLiteral:
3817 case FK_NarrowStringIntoWideCharArray:
3818 case FK_WideStringIntoCharArray:
3819 case FK_IncompatWideStringIntoWideChar:
3820 case FK_PlainStringIntoUTF8Char:
3821 case FK_UTF8StringIntoPlainChar:
3822 case FK_AddressOfOverloadFailed: // FIXME: Could do better
3823 case FK_NonConstLValueReferenceBindingToTemporary:
3824 case FK_NonConstLValueReferenceBindingToBitfield:
3825 case FK_NonConstLValueReferenceBindingToVectorElement:
3826 case FK_NonConstLValueReferenceBindingToMatrixElement:
3827 case FK_NonConstLValueReferenceBindingToUnrelated:
3828 case FK_RValueReferenceBindingToLValue:
3829 case FK_ReferenceAddrspaceMismatchTemporary:
3830 case FK_ReferenceInitDropsQualifiers:
3831 case FK_ReferenceInitFailed:
3832 case FK_ConversionFailed:
3833 case FK_ConversionFromPropertyFailed:
3834 case FK_TooManyInitsForScalar:
3835 case FK_ParenthesizedListInitForScalar:
3836 case FK_ReferenceBindingToInitList:
3837 case FK_InitListBadDestinationType:
3838 case FK_DefaultInitOfConst:
3839 case FK_Incomplete:
3840 case FK_ArrayTypeMismatch:
3841 case FK_NonConstantArrayInit:
3842 case FK_ListInitializationFailed:
3843 case FK_VariableLengthArrayHasInitializer:
3844 case FK_PlaceholderType:
3845 case FK_ExplicitConstructor:
3846 case FK_AddressOfUnaddressableFunction:
3847 case FK_ParenthesizedListInitFailed:
3848 case FK_DesignatedInitForNonAggregate:
3849 return false;
3850
3851 case FK_ReferenceInitOverloadFailed:
3852 case FK_UserConversionOverloadFailed:
3853 case FK_ConstructorOverloadFailed:
3854 case FK_ListConstructorOverloadFailed:
3855 return FailedOverloadResult == OR_Ambiguous;
3856 }
3857
3858 llvm_unreachable("Invalid EntityKind!");
3859 }
3860
isConstructorInitialization() const3861 bool InitializationSequence::isConstructorInitialization() const {
3862 return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization;
3863 }
3864
3865 void
3866 InitializationSequence
AddAddressOverloadResolutionStep(FunctionDecl * Function,DeclAccessPair Found,bool HadMultipleCandidates)3867 ::AddAddressOverloadResolutionStep(FunctionDecl *Function,
3868 DeclAccessPair Found,
3869 bool HadMultipleCandidates) {
3870 Step S;
3871 S.Kind = SK_ResolveAddressOfOverloadedFunction;
3872 S.Type = Function->getType();
3873 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3874 S.Function.Function = Function;
3875 S.Function.FoundDecl = Found;
3876 Steps.push_back(S);
3877 }
3878
AddDerivedToBaseCastStep(QualType BaseType,ExprValueKind VK)3879 void InitializationSequence::AddDerivedToBaseCastStep(QualType BaseType,
3880 ExprValueKind VK) {
3881 Step S;
3882 switch (VK) {
3883 case VK_PRValue:
3884 S.Kind = SK_CastDerivedToBasePRValue;
3885 break;
3886 case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break;
3887 case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break;
3888 }
3889 S.Type = BaseType;
3890 Steps.push_back(S);
3891 }
3892
AddReferenceBindingStep(QualType T,bool BindingTemporary)3893 void InitializationSequence::AddReferenceBindingStep(QualType T,
3894 bool BindingTemporary) {
3895 Step S;
3896 S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference;
3897 S.Type = T;
3898 Steps.push_back(S);
3899 }
3900
AddFinalCopy(QualType T)3901 void InitializationSequence::AddFinalCopy(QualType T) {
3902 Step S;
3903 S.Kind = SK_FinalCopy;
3904 S.Type = T;
3905 Steps.push_back(S);
3906 }
3907
AddExtraneousCopyToTemporary(QualType T)3908 void InitializationSequence::AddExtraneousCopyToTemporary(QualType T) {
3909 Step S;
3910 S.Kind = SK_ExtraneousCopyToTemporary;
3911 S.Type = T;
3912 Steps.push_back(S);
3913 }
3914
3915 void
AddUserConversionStep(FunctionDecl * Function,DeclAccessPair FoundDecl,QualType T,bool HadMultipleCandidates)3916 InitializationSequence::AddUserConversionStep(FunctionDecl *Function,
3917 DeclAccessPair FoundDecl,
3918 QualType T,
3919 bool HadMultipleCandidates) {
3920 Step S;
3921 S.Kind = SK_UserConversion;
3922 S.Type = T;
3923 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3924 S.Function.Function = Function;
3925 S.Function.FoundDecl = FoundDecl;
3926 Steps.push_back(S);
3927 }
3928
AddQualificationConversionStep(QualType Ty,ExprValueKind VK)3929 void InitializationSequence::AddQualificationConversionStep(QualType Ty,
3930 ExprValueKind VK) {
3931 Step S;
3932 S.Kind = SK_QualificationConversionPRValue; // work around a gcc warning
3933 switch (VK) {
3934 case VK_PRValue:
3935 S.Kind = SK_QualificationConversionPRValue;
3936 break;
3937 case VK_XValue:
3938 S.Kind = SK_QualificationConversionXValue;
3939 break;
3940 case VK_LValue:
3941 S.Kind = SK_QualificationConversionLValue;
3942 break;
3943 }
3944 S.Type = Ty;
3945 Steps.push_back(S);
3946 }
3947
AddFunctionReferenceConversionStep(QualType Ty)3948 void InitializationSequence::AddFunctionReferenceConversionStep(QualType Ty) {
3949 Step S;
3950 S.Kind = SK_FunctionReferenceConversion;
3951 S.Type = Ty;
3952 Steps.push_back(S);
3953 }
3954
AddAtomicConversionStep(QualType Ty)3955 void InitializationSequence::AddAtomicConversionStep(QualType Ty) {
3956 Step S;
3957 S.Kind = SK_AtomicConversion;
3958 S.Type = Ty;
3959 Steps.push_back(S);
3960 }
3961
AddConversionSequenceStep(const ImplicitConversionSequence & ICS,QualType T,bool TopLevelOfInitList)3962 void InitializationSequence::AddConversionSequenceStep(
3963 const ImplicitConversionSequence &ICS, QualType T,
3964 bool TopLevelOfInitList) {
3965 Step S;
3966 S.Kind = TopLevelOfInitList ? SK_ConversionSequenceNoNarrowing
3967 : SK_ConversionSequence;
3968 S.Type = T;
3969 S.ICS = new ImplicitConversionSequence(ICS);
3970 Steps.push_back(S);
3971 }
3972
AddListInitializationStep(QualType T)3973 void InitializationSequence::AddListInitializationStep(QualType T) {
3974 Step S;
3975 S.Kind = SK_ListInitialization;
3976 S.Type = T;
3977 Steps.push_back(S);
3978 }
3979
AddConstructorInitializationStep(DeclAccessPair FoundDecl,CXXConstructorDecl * Constructor,QualType T,bool HadMultipleCandidates,bool FromInitList,bool AsInitList)3980 void InitializationSequence::AddConstructorInitializationStep(
3981 DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T,
3982 bool HadMultipleCandidates, bool FromInitList, bool AsInitList) {
3983 Step S;
3984 S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall
3985 : SK_ConstructorInitializationFromList
3986 : SK_ConstructorInitialization;
3987 S.Type = T;
3988 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3989 S.Function.Function = Constructor;
3990 S.Function.FoundDecl = FoundDecl;
3991 Steps.push_back(S);
3992 }
3993
AddZeroInitializationStep(QualType T)3994 void InitializationSequence::AddZeroInitializationStep(QualType T) {
3995 Step S;
3996 S.Kind = SK_ZeroInitialization;
3997 S.Type = T;
3998 Steps.push_back(S);
3999 }
4000
AddCAssignmentStep(QualType T)4001 void InitializationSequence::AddCAssignmentStep(QualType T) {
4002 Step S;
4003 S.Kind = SK_CAssignment;
4004 S.Type = T;
4005 Steps.push_back(S);
4006 }
4007
AddStringInitStep(QualType T)4008 void InitializationSequence::AddStringInitStep(QualType T) {
4009 Step S;
4010 S.Kind = SK_StringInit;
4011 S.Type = T;
4012 Steps.push_back(S);
4013 }
4014
AddObjCObjectConversionStep(QualType T)4015 void InitializationSequence::AddObjCObjectConversionStep(QualType T) {
4016 Step S;
4017 S.Kind = SK_ObjCObjectConversion;
4018 S.Type = T;
4019 Steps.push_back(S);
4020 }
4021
AddArrayInitStep(QualType T,bool IsGNUExtension)4022 void InitializationSequence::AddArrayInitStep(QualType T, bool IsGNUExtension) {
4023 Step S;
4024 S.Kind = IsGNUExtension ? SK_GNUArrayInit : SK_ArrayInit;
4025 S.Type = T;
4026 Steps.push_back(S);
4027 }
4028
AddArrayInitLoopStep(QualType T,QualType EltT)4029 void InitializationSequence::AddArrayInitLoopStep(QualType T, QualType EltT) {
4030 Step S;
4031 S.Kind = SK_ArrayLoopIndex;
4032 S.Type = EltT;
4033 Steps.insert(Steps.begin(), S);
4034
4035 S.Kind = SK_ArrayLoopInit;
4036 S.Type = T;
4037 Steps.push_back(S);
4038 }
4039
AddParenthesizedArrayInitStep(QualType T)4040 void InitializationSequence::AddParenthesizedArrayInitStep(QualType T) {
4041 Step S;
4042 S.Kind = SK_ParenthesizedArrayInit;
4043 S.Type = T;
4044 Steps.push_back(S);
4045 }
4046
AddPassByIndirectCopyRestoreStep(QualType type,bool shouldCopy)4047 void InitializationSequence::AddPassByIndirectCopyRestoreStep(QualType type,
4048 bool shouldCopy) {
4049 Step s;
4050 s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore
4051 : SK_PassByIndirectRestore);
4052 s.Type = type;
4053 Steps.push_back(s);
4054 }
4055
AddProduceObjCObjectStep(QualType T)4056 void InitializationSequence::AddProduceObjCObjectStep(QualType T) {
4057 Step S;
4058 S.Kind = SK_ProduceObjCObject;
4059 S.Type = T;
4060 Steps.push_back(S);
4061 }
4062
AddStdInitializerListConstructionStep(QualType T)4063 void InitializationSequence::AddStdInitializerListConstructionStep(QualType T) {
4064 Step S;
4065 S.Kind = SK_StdInitializerList;
4066 S.Type = T;
4067 Steps.push_back(S);
4068 }
4069
AddOCLSamplerInitStep(QualType T)4070 void InitializationSequence::AddOCLSamplerInitStep(QualType T) {
4071 Step S;
4072 S.Kind = SK_OCLSamplerInit;
4073 S.Type = T;
4074 Steps.push_back(S);
4075 }
4076
AddOCLZeroOpaqueTypeStep(QualType T)4077 void InitializationSequence::AddOCLZeroOpaqueTypeStep(QualType T) {
4078 Step S;
4079 S.Kind = SK_OCLZeroOpaqueType;
4080 S.Type = T;
4081 Steps.push_back(S);
4082 }
4083
AddParenthesizedListInitStep(QualType T)4084 void InitializationSequence::AddParenthesizedListInitStep(QualType T) {
4085 Step S;
4086 S.Kind = SK_ParenthesizedListInit;
4087 S.Type = T;
4088 Steps.push_back(S);
4089 }
4090
RewrapReferenceInitList(QualType T,InitListExpr * Syntactic)4091 void InitializationSequence::RewrapReferenceInitList(QualType T,
4092 InitListExpr *Syntactic) {
4093 assert(Syntactic->getNumInits() == 1 &&
4094 "Can only rewrap trivial init lists.");
4095 Step S;
4096 S.Kind = SK_UnwrapInitList;
4097 S.Type = Syntactic->getInit(0)->getType();
4098 Steps.insert(Steps.begin(), S);
4099
4100 S.Kind = SK_RewrapInitList;
4101 S.Type = T;
4102 S.WrappingSyntacticList = Syntactic;
4103 Steps.push_back(S);
4104 }
4105
SetOverloadFailure(FailureKind Failure,OverloadingResult Result)4106 void InitializationSequence::SetOverloadFailure(FailureKind Failure,
4107 OverloadingResult Result) {
4108 setSequenceKind(FailedSequence);
4109 this->Failure = Failure;
4110 this->FailedOverloadResult = Result;
4111 }
4112
4113 //===----------------------------------------------------------------------===//
4114 // Attempt initialization
4115 //===----------------------------------------------------------------------===//
4116
4117 /// Tries to add a zero initializer. Returns true if that worked.
4118 static bool
maybeRecoverWithZeroInitialization(Sema & S,InitializationSequence & Sequence,const InitializedEntity & Entity)4119 maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence,
4120 const InitializedEntity &Entity) {
4121 if (Entity.getKind() != InitializedEntity::EK_Variable)
4122 return false;
4123
4124 VarDecl *VD = cast<VarDecl>(Entity.getDecl());
4125 if (VD->getInit() || VD->getEndLoc().isMacroID())
4126 return false;
4127
4128 QualType VariableTy = VD->getType().getCanonicalType();
4129 SourceLocation Loc = S.getLocForEndOfToken(VD->getEndLoc());
4130 std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
4131 if (!Init.empty()) {
4132 Sequence.AddZeroInitializationStep(Entity.getType());
4133 Sequence.SetZeroInitializationFixit(Init, Loc);
4134 return true;
4135 }
4136 return false;
4137 }
4138
MaybeProduceObjCObject(Sema & S,InitializationSequence & Sequence,const InitializedEntity & Entity)4139 static void MaybeProduceObjCObject(Sema &S,
4140 InitializationSequence &Sequence,
4141 const InitializedEntity &Entity) {
4142 if (!S.getLangOpts().ObjCAutoRefCount) return;
4143
4144 /// When initializing a parameter, produce the value if it's marked
4145 /// __attribute__((ns_consumed)).
4146 if (Entity.isParameterKind()) {
4147 if (!Entity.isParameterConsumed())
4148 return;
4149
4150 assert(Entity.getType()->isObjCRetainableType() &&
4151 "consuming an object of unretainable type?");
4152 Sequence.AddProduceObjCObjectStep(Entity.getType());
4153
4154 /// When initializing a return value, if the return type is a
4155 /// retainable type, then returns need to immediately retain the
4156 /// object. If an autorelease is required, it will be done at the
4157 /// last instant.
4158 } else if (Entity.getKind() == InitializedEntity::EK_Result ||
4159 Entity.getKind() == InitializedEntity::EK_StmtExprResult) {
4160 if (!Entity.getType()->isObjCRetainableType())
4161 return;
4162
4163 Sequence.AddProduceObjCObjectStep(Entity.getType());
4164 }
4165 }
4166
4167 static void TryListInitialization(Sema &S,
4168 const InitializedEntity &Entity,
4169 const InitializationKind &Kind,
4170 InitListExpr *InitList,
4171 InitializationSequence &Sequence,
4172 bool TreatUnavailableAsInvalid);
4173
4174 /// When initializing from init list via constructor, handle
4175 /// initialization of an object of type std::initializer_list<T>.
4176 ///
4177 /// \return true if we have handled initialization of an object of type
4178 /// std::initializer_list<T>, false otherwise.
TryInitializerListConstruction(Sema & S,InitListExpr * List,QualType DestType,InitializationSequence & Sequence,bool TreatUnavailableAsInvalid)4179 static bool TryInitializerListConstruction(Sema &S,
4180 InitListExpr *List,
4181 QualType DestType,
4182 InitializationSequence &Sequence,
4183 bool TreatUnavailableAsInvalid) {
4184 QualType E;
4185 if (!S.isStdInitializerList(DestType, &E))
4186 return false;
4187
4188 if (!S.isCompleteType(List->getExprLoc(), E)) {
4189 Sequence.setIncompleteTypeFailure(E);
4190 return true;
4191 }
4192
4193 // Try initializing a temporary array from the init list.
4194 QualType ArrayType = S.Context.getConstantArrayType(
4195 E.withConst(),
4196 llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
4197 List->getNumInits()),
4198 nullptr, clang::ArraySizeModifier::Normal, 0);
4199 InitializedEntity HiddenArray =
4200 InitializedEntity::InitializeTemporary(ArrayType);
4201 InitializationKind Kind = InitializationKind::CreateDirectList(
4202 List->getExprLoc(), List->getBeginLoc(), List->getEndLoc());
4203 TryListInitialization(S, HiddenArray, Kind, List, Sequence,
4204 TreatUnavailableAsInvalid);
4205 if (Sequence)
4206 Sequence.AddStdInitializerListConstructionStep(DestType);
4207 return true;
4208 }
4209
4210 /// Determine if the constructor has the signature of a copy or move
4211 /// constructor for the type T of the class in which it was found. That is,
4212 /// determine if its first parameter is of type T or reference to (possibly
4213 /// cv-qualified) T.
hasCopyOrMoveCtorParam(ASTContext & Ctx,const ConstructorInfo & Info)4214 static bool hasCopyOrMoveCtorParam(ASTContext &Ctx,
4215 const ConstructorInfo &Info) {
4216 if (Info.Constructor->getNumParams() == 0)
4217 return false;
4218
4219 QualType ParmT =
4220 Info.Constructor->getParamDecl(0)->getType().getNonReferenceType();
4221 QualType ClassT =
4222 Ctx.getRecordType(cast<CXXRecordDecl>(Info.FoundDecl->getDeclContext()));
4223
4224 return Ctx.hasSameUnqualifiedType(ParmT, ClassT);
4225 }
4226
ResolveConstructorOverload(Sema & S,SourceLocation DeclLoc,MultiExprArg Args,OverloadCandidateSet & CandidateSet,QualType DestType,DeclContext::lookup_result Ctors,OverloadCandidateSet::iterator & Best,bool CopyInitializing,bool AllowExplicit,bool OnlyListConstructors,bool IsListInit,bool RequireActualConstructor,bool SecondStepOfCopyInit=false)4227 static OverloadingResult ResolveConstructorOverload(
4228 Sema &S, SourceLocation DeclLoc, MultiExprArg Args,
4229 OverloadCandidateSet &CandidateSet, QualType DestType,
4230 DeclContext::lookup_result Ctors, OverloadCandidateSet::iterator &Best,
4231 bool CopyInitializing, bool AllowExplicit, bool OnlyListConstructors,
4232 bool IsListInit, bool RequireActualConstructor,
4233 bool SecondStepOfCopyInit = false) {
4234 CandidateSet.clear(OverloadCandidateSet::CSK_InitByConstructor);
4235 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
4236
4237 for (NamedDecl *D : Ctors) {
4238 auto Info = getConstructorInfo(D);
4239 if (!Info.Constructor || Info.Constructor->isInvalidDecl())
4240 continue;
4241
4242 if (OnlyListConstructors && !S.isInitListConstructor(Info.Constructor))
4243 continue;
4244
4245 // C++11 [over.best.ics]p4:
4246 // ... and the constructor or user-defined conversion function is a
4247 // candidate by
4248 // - 13.3.1.3, when the argument is the temporary in the second step
4249 // of a class copy-initialization, or
4250 // - 13.3.1.4, 13.3.1.5, or 13.3.1.6 (in all cases), [not handled here]
4251 // - the second phase of 13.3.1.7 when the initializer list has exactly
4252 // one element that is itself an initializer list, and the target is
4253 // the first parameter of a constructor of class X, and the conversion
4254 // is to X or reference to (possibly cv-qualified X),
4255 // user-defined conversion sequences are not considered.
4256 bool SuppressUserConversions =
4257 SecondStepOfCopyInit ||
4258 (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
4259 hasCopyOrMoveCtorParam(S.Context, Info));
4260
4261 if (Info.ConstructorTmpl)
4262 S.AddTemplateOverloadCandidate(
4263 Info.ConstructorTmpl, Info.FoundDecl,
4264 /*ExplicitArgs*/ nullptr, Args, CandidateSet, SuppressUserConversions,
4265 /*PartialOverloading=*/false, AllowExplicit);
4266 else {
4267 // C++ [over.match.copy]p1:
4268 // - When initializing a temporary to be bound to the first parameter
4269 // of a constructor [for type T] that takes a reference to possibly
4270 // cv-qualified T as its first argument, called with a single
4271 // argument in the context of direct-initialization, explicit
4272 // conversion functions are also considered.
4273 // FIXME: What if a constructor template instantiates to such a signature?
4274 bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
4275 Args.size() == 1 &&
4276 hasCopyOrMoveCtorParam(S.Context, Info);
4277 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, Args,
4278 CandidateSet, SuppressUserConversions,
4279 /*PartialOverloading=*/false, AllowExplicit,
4280 AllowExplicitConv);
4281 }
4282 }
4283
4284 // FIXME: Work around a bug in C++17 guaranteed copy elision.
4285 //
4286 // When initializing an object of class type T by constructor
4287 // ([over.match.ctor]) or by list-initialization ([over.match.list])
4288 // from a single expression of class type U, conversion functions of
4289 // U that convert to the non-reference type cv T are candidates.
4290 // Explicit conversion functions are only candidates during
4291 // direct-initialization.
4292 //
4293 // Note: SecondStepOfCopyInit is only ever true in this case when
4294 // evaluating whether to produce a C++98 compatibility warning.
4295 if (S.getLangOpts().CPlusPlus17 && Args.size() == 1 &&
4296 !RequireActualConstructor && !SecondStepOfCopyInit) {
4297 Expr *Initializer = Args[0];
4298 auto *SourceRD = Initializer->getType()->getAsCXXRecordDecl();
4299 if (SourceRD && S.isCompleteType(DeclLoc, Initializer->getType())) {
4300 const auto &Conversions = SourceRD->getVisibleConversionFunctions();
4301 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4302 NamedDecl *D = *I;
4303 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4304 D = D->getUnderlyingDecl();
4305
4306 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4307 CXXConversionDecl *Conv;
4308 if (ConvTemplate)
4309 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4310 else
4311 Conv = cast<CXXConversionDecl>(D);
4312
4313 if (ConvTemplate)
4314 S.AddTemplateConversionCandidate(
4315 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
4316 CandidateSet, AllowExplicit, AllowExplicit,
4317 /*AllowResultConversion*/ false);
4318 else
4319 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
4320 DestType, CandidateSet, AllowExplicit,
4321 AllowExplicit,
4322 /*AllowResultConversion*/ false);
4323 }
4324 }
4325 }
4326
4327 // Perform overload resolution and return the result.
4328 return CandidateSet.BestViableFunction(S, DeclLoc, Best);
4329 }
4330
4331 /// Attempt initialization by constructor (C++ [dcl.init]), which
4332 /// enumerates the constructors of the initialized entity and performs overload
4333 /// resolution to select the best.
4334 /// \param DestType The destination class type.
4335 /// \param DestArrayType The destination type, which is either DestType or
4336 /// a (possibly multidimensional) array of DestType.
4337 /// \param IsListInit Is this list-initialization?
4338 /// \param IsInitListCopy Is this non-list-initialization resulting from a
4339 /// list-initialization from {x} where x is the same
4340 /// type as the entity?
TryConstructorInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,QualType DestType,QualType DestArrayType,InitializationSequence & Sequence,bool IsListInit=false,bool IsInitListCopy=false)4341 static void TryConstructorInitialization(Sema &S,
4342 const InitializedEntity &Entity,
4343 const InitializationKind &Kind,
4344 MultiExprArg Args, QualType DestType,
4345 QualType DestArrayType,
4346 InitializationSequence &Sequence,
4347 bool IsListInit = false,
4348 bool IsInitListCopy = false) {
4349 assert(((!IsListInit && !IsInitListCopy) ||
4350 (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
4351 "IsListInit/IsInitListCopy must come with a single initializer list "
4352 "argument.");
4353 InitListExpr *ILE =
4354 (IsListInit || IsInitListCopy) ? cast<InitListExpr>(Args[0]) : nullptr;
4355 MultiExprArg UnwrappedArgs =
4356 ILE ? MultiExprArg(ILE->getInits(), ILE->getNumInits()) : Args;
4357
4358 // The type we're constructing needs to be complete.
4359 if (!S.isCompleteType(Kind.getLocation(), DestType)) {
4360 Sequence.setIncompleteTypeFailure(DestType);
4361 return;
4362 }
4363
4364 bool RequireActualConstructor =
4365 !(Entity.getKind() != InitializedEntity::EK_Base &&
4366 Entity.getKind() != InitializedEntity::EK_Delegating &&
4367 Entity.getKind() !=
4368 InitializedEntity::EK_LambdaToBlockConversionBlockElement);
4369
4370 // C++17 [dcl.init]p17:
4371 // - If the initializer expression is a prvalue and the cv-unqualified
4372 // version of the source type is the same class as the class of the
4373 // destination, the initializer expression is used to initialize the
4374 // destination object.
4375 // Per DR (no number yet), this does not apply when initializing a base
4376 // class or delegating to another constructor from a mem-initializer.
4377 // ObjC++: Lambda captured by the block in the lambda to block conversion
4378 // should avoid copy elision.
4379 if (S.getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
4380 UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
4381 S.Context.hasSameUnqualifiedType(UnwrappedArgs[0]->getType(), DestType)) {
4382 // Convert qualifications if necessary.
4383 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4384 if (ILE)
4385 Sequence.RewrapReferenceInitList(DestType, ILE);
4386 return;
4387 }
4388
4389 const RecordType *DestRecordType = DestType->getAs<RecordType>();
4390 assert(DestRecordType && "Constructor initialization requires record type");
4391 CXXRecordDecl *DestRecordDecl
4392 = cast<CXXRecordDecl>(DestRecordType->getDecl());
4393
4394 // Build the candidate set directly in the initialization sequence
4395 // structure, so that it will persist if we fail.
4396 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4397
4398 // Determine whether we are allowed to call explicit constructors or
4399 // explicit conversion operators.
4400 bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
4401 bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy;
4402
4403 // - Otherwise, if T is a class type, constructors are considered. The
4404 // applicable constructors are enumerated, and the best one is chosen
4405 // through overload resolution.
4406 DeclContext::lookup_result Ctors = S.LookupConstructors(DestRecordDecl);
4407
4408 OverloadingResult Result = OR_No_Viable_Function;
4409 OverloadCandidateSet::iterator Best;
4410 bool AsInitializerList = false;
4411
4412 // C++11 [over.match.list]p1, per DR1467:
4413 // When objects of non-aggregate type T are list-initialized, such that
4414 // 8.5.4 [dcl.init.list] specifies that overload resolution is performed
4415 // according to the rules in this section, overload resolution selects
4416 // the constructor in two phases:
4417 //
4418 // - Initially, the candidate functions are the initializer-list
4419 // constructors of the class T and the argument list consists of the
4420 // initializer list as a single argument.
4421 if (IsListInit) {
4422 AsInitializerList = true;
4423
4424 // If the initializer list has no elements and T has a default constructor,
4425 // the first phase is omitted.
4426 if (!(UnwrappedArgs.empty() && S.LookupDefaultConstructor(DestRecordDecl)))
4427 Result = ResolveConstructorOverload(
4428 S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
4429 CopyInitialization, AllowExplicit,
4430 /*OnlyListConstructors=*/true, IsListInit, RequireActualConstructor);
4431 }
4432
4433 // C++11 [over.match.list]p1:
4434 // - If no viable initializer-list constructor is found, overload resolution
4435 // is performed again, where the candidate functions are all the
4436 // constructors of the class T and the argument list consists of the
4437 // elements of the initializer list.
4438 if (Result == OR_No_Viable_Function) {
4439 AsInitializerList = false;
4440 Result = ResolveConstructorOverload(
4441 S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4442 Best, CopyInitialization, AllowExplicit,
4443 /*OnlyListConstructors=*/false, IsListInit, RequireActualConstructor);
4444 }
4445 if (Result) {
4446 Sequence.SetOverloadFailure(
4447 IsListInit ? InitializationSequence::FK_ListConstructorOverloadFailed
4448 : InitializationSequence::FK_ConstructorOverloadFailed,
4449 Result);
4450
4451 if (Result != OR_Deleted)
4452 return;
4453 }
4454
4455 bool HadMultipleCandidates = (CandidateSet.size() > 1);
4456
4457 // In C++17, ResolveConstructorOverload can select a conversion function
4458 // instead of a constructor.
4459 if (auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4460 // Add the user-defined conversion step that calls the conversion function.
4461 QualType ConvType = CD->getConversionType();
4462 assert(S.Context.hasSameUnqualifiedType(ConvType, DestType) &&
4463 "should not have selected this conversion function");
4464 Sequence.AddUserConversionStep(CD, Best->FoundDecl, ConvType,
4465 HadMultipleCandidates);
4466 if (!S.Context.hasSameType(ConvType, DestType))
4467 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4468 if (IsListInit)
4469 Sequence.RewrapReferenceInitList(Entity.getType(), ILE);
4470 return;
4471 }
4472
4473 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
4474 if (Result != OR_Deleted) {
4475 // C++11 [dcl.init]p6:
4476 // If a program calls for the default initialization of an object
4477 // of a const-qualified type T, T shall be a class type with a
4478 // user-provided default constructor.
4479 // C++ core issue 253 proposal:
4480 // If the implicit default constructor initializes all subobjects, no
4481 // initializer should be required.
4482 // The 253 proposal is for example needed to process libstdc++ headers
4483 // in 5.x.
4484 if (Kind.getKind() == InitializationKind::IK_Default &&
4485 Entity.getType().isConstQualified()) {
4486 if (!CtorDecl->getParent()->allowConstDefaultInit()) {
4487 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
4488 Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
4489 return;
4490 }
4491 }
4492
4493 // C++11 [over.match.list]p1:
4494 // In copy-list-initialization, if an explicit constructor is chosen, the
4495 // initializer is ill-formed.
4496 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
4497 Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor);
4498 return;
4499 }
4500 }
4501
4502 // [class.copy.elision]p3:
4503 // In some copy-initialization contexts, a two-stage overload resolution
4504 // is performed.
4505 // If the first overload resolution selects a deleted function, we also
4506 // need the initialization sequence to decide whether to perform the second
4507 // overload resolution.
4508 // For deleted functions in other contexts, there is no need to get the
4509 // initialization sequence.
4510 if (Result == OR_Deleted && Kind.getKind() != InitializationKind::IK_Copy)
4511 return;
4512
4513 // Add the constructor initialization step. Any cv-qualification conversion is
4514 // subsumed by the initialization.
4515 Sequence.AddConstructorInitializationStep(
4516 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4517 IsListInit | IsInitListCopy, AsInitializerList);
4518 }
4519
4520 static bool
ResolveOverloadedFunctionForReferenceBinding(Sema & S,Expr * Initializer,QualType & SourceType,QualType & UnqualifiedSourceType,QualType UnqualifiedTargetType,InitializationSequence & Sequence)4521 ResolveOverloadedFunctionForReferenceBinding(Sema &S,
4522 Expr *Initializer,
4523 QualType &SourceType,
4524 QualType &UnqualifiedSourceType,
4525 QualType UnqualifiedTargetType,
4526 InitializationSequence &Sequence) {
4527 if (S.Context.getCanonicalType(UnqualifiedSourceType) ==
4528 S.Context.OverloadTy) {
4529 DeclAccessPair Found;
4530 bool HadMultipleCandidates = false;
4531 if (FunctionDecl *Fn
4532 = S.ResolveAddressOfOverloadedFunction(Initializer,
4533 UnqualifiedTargetType,
4534 false, Found,
4535 &HadMultipleCandidates)) {
4536 Sequence.AddAddressOverloadResolutionStep(Fn, Found,
4537 HadMultipleCandidates);
4538 SourceType = Fn->getType();
4539 UnqualifiedSourceType = SourceType.getUnqualifiedType();
4540 } else if (!UnqualifiedTargetType->isRecordType()) {
4541 Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
4542 return true;
4543 }
4544 }
4545 return false;
4546 }
4547
4548 static void TryReferenceInitializationCore(Sema &S,
4549 const InitializedEntity &Entity,
4550 const InitializationKind &Kind,
4551 Expr *Initializer,
4552 QualType cv1T1, QualType T1,
4553 Qualifiers T1Quals,
4554 QualType cv2T2, QualType T2,
4555 Qualifiers T2Quals,
4556 InitializationSequence &Sequence,
4557 bool TopLevelOfInitList);
4558
4559 static void TryValueInitialization(Sema &S,
4560 const InitializedEntity &Entity,
4561 const InitializationKind &Kind,
4562 InitializationSequence &Sequence,
4563 InitListExpr *InitList = nullptr);
4564
4565 /// Attempt list initialization of a reference.
TryReferenceListInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitListExpr * InitList,InitializationSequence & Sequence,bool TreatUnavailableAsInvalid)4566 static void TryReferenceListInitialization(Sema &S,
4567 const InitializedEntity &Entity,
4568 const InitializationKind &Kind,
4569 InitListExpr *InitList,
4570 InitializationSequence &Sequence,
4571 bool TreatUnavailableAsInvalid) {
4572 // First, catch C++03 where this isn't possible.
4573 if (!S.getLangOpts().CPlusPlus11) {
4574 Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
4575 return;
4576 }
4577 // Can't reference initialize a compound literal.
4578 if (Entity.getKind() == InitializedEntity::EK_CompoundLiteralInit) {
4579 Sequence.SetFailed(InitializationSequence::FK_ReferenceBindingToInitList);
4580 return;
4581 }
4582
4583 QualType DestType = Entity.getType();
4584 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
4585 Qualifiers T1Quals;
4586 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
4587
4588 // Reference initialization via an initializer list works thus:
4589 // If the initializer list consists of a single element that is
4590 // reference-related to the referenced type, bind directly to that element
4591 // (possibly creating temporaries).
4592 // Otherwise, initialize a temporary with the initializer list and
4593 // bind to that.
4594 if (InitList->getNumInits() == 1) {
4595 Expr *Initializer = InitList->getInit(0);
4596 QualType cv2T2 = S.getCompletedType(Initializer);
4597 Qualifiers T2Quals;
4598 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
4599
4600 // If this fails, creating a temporary wouldn't work either.
4601 if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
4602 T1, Sequence))
4603 return;
4604
4605 SourceLocation DeclLoc = Initializer->getBeginLoc();
4606 Sema::ReferenceCompareResult RefRelationship
4607 = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2);
4608 if (RefRelationship >= Sema::Ref_Related) {
4609 // Try to bind the reference here.
4610 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4611 T1Quals, cv2T2, T2, T2Quals, Sequence,
4612 /*TopLevelOfInitList=*/true);
4613 if (Sequence)
4614 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4615 return;
4616 }
4617
4618 // Update the initializer if we've resolved an overloaded function.
4619 if (Sequence.step_begin() != Sequence.step_end())
4620 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4621 }
4622 // Perform address space compatibility check.
4623 QualType cv1T1IgnoreAS = cv1T1;
4624 if (T1Quals.hasAddressSpace()) {
4625 Qualifiers T2Quals;
4626 (void)S.Context.getUnqualifiedArrayType(InitList->getType(), T2Quals);
4627 if (!T1Quals.isAddressSpaceSupersetOf(T2Quals)) {
4628 Sequence.SetFailed(
4629 InitializationSequence::FK_ReferenceInitDropsQualifiers);
4630 return;
4631 }
4632 // Ignore address space of reference type at this point and perform address
4633 // space conversion after the reference binding step.
4634 cv1T1IgnoreAS =
4635 S.Context.getQualifiedType(T1, T1Quals.withoutAddressSpace());
4636 }
4637 // Not reference-related. Create a temporary and bind to that.
4638 InitializedEntity TempEntity =
4639 InitializedEntity::InitializeTemporary(cv1T1IgnoreAS);
4640
4641 TryListInitialization(S, TempEntity, Kind, InitList, Sequence,
4642 TreatUnavailableAsInvalid);
4643 if (Sequence) {
4644 if (DestType->isRValueReferenceType() ||
4645 (T1Quals.hasConst() && !T1Quals.hasVolatile())) {
4646 if (S.getLangOpts().CPlusPlus20 &&
4647 isa<IncompleteArrayType>(T1->getUnqualifiedDesugaredType()) &&
4648 DestType->isRValueReferenceType()) {
4649 // C++20 [dcl.init.list]p3.10:
4650 // List-initialization of an object or reference of type T is defined as
4651 // follows:
4652 // ..., unless T is “reference to array of unknown bound of U”, in which
4653 // case the type of the prvalue is the type of x in the declaration U
4654 // x[] H, where H is the initializer list.
4655 Sequence.AddQualificationConversionStep(cv1T1, clang::VK_PRValue);
4656 }
4657 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS,
4658 /*BindingTemporary=*/true);
4659 if (T1Quals.hasAddressSpace())
4660 Sequence.AddQualificationConversionStep(
4661 cv1T1, DestType->isRValueReferenceType() ? VK_XValue : VK_LValue);
4662 } else
4663 Sequence.SetFailed(
4664 InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary);
4665 }
4666 }
4667
4668 /// Attempt list initialization (C++0x [dcl.init.list])
TryListInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitListExpr * InitList,InitializationSequence & Sequence,bool TreatUnavailableAsInvalid)4669 static void TryListInitialization(Sema &S,
4670 const InitializedEntity &Entity,
4671 const InitializationKind &Kind,
4672 InitListExpr *InitList,
4673 InitializationSequence &Sequence,
4674 bool TreatUnavailableAsInvalid) {
4675 QualType DestType = Entity.getType();
4676
4677 // C++ doesn't allow scalar initialization with more than one argument.
4678 // But C99 complex numbers are scalars and it makes sense there.
4679 if (S.getLangOpts().CPlusPlus && DestType->isScalarType() &&
4680 !DestType->isAnyComplexType() && InitList->getNumInits() > 1) {
4681 Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForScalar);
4682 return;
4683 }
4684 if (DestType->isReferenceType()) {
4685 TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence,
4686 TreatUnavailableAsInvalid);
4687 return;
4688 }
4689
4690 if (DestType->isRecordType() &&
4691 !S.isCompleteType(InitList->getBeginLoc(), DestType)) {
4692 Sequence.setIncompleteTypeFailure(DestType);
4693 return;
4694 }
4695
4696 // C++20 [dcl.init.list]p3:
4697 // - If the braced-init-list contains a designated-initializer-list, T shall
4698 // be an aggregate class. [...] Aggregate initialization is performed.
4699 //
4700 // We allow arrays here too in order to support array designators.
4701 //
4702 // FIXME: This check should precede the handling of reference initialization.
4703 // We follow other compilers in allowing things like 'Aggr &&a = {.x = 1};'
4704 // as a tentative DR resolution.
4705 bool IsDesignatedInit = InitList->hasDesignatedInit();
4706 if (!DestType->isAggregateType() && IsDesignatedInit) {
4707 Sequence.SetFailed(
4708 InitializationSequence::FK_DesignatedInitForNonAggregate);
4709 return;
4710 }
4711
4712 // C++11 [dcl.init.list]p3, per DR1467:
4713 // - If T is a class type and the initializer list has a single element of
4714 // type cv U, where U is T or a class derived from T, the object is
4715 // initialized from that element (by copy-initialization for
4716 // copy-list-initialization, or by direct-initialization for
4717 // direct-list-initialization).
4718 // - Otherwise, if T is a character array and the initializer list has a
4719 // single element that is an appropriately-typed string literal
4720 // (8.5.2 [dcl.init.string]), initialization is performed as described
4721 // in that section.
4722 // - Otherwise, if T is an aggregate, [...] (continue below).
4723 if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1 &&
4724 !IsDesignatedInit) {
4725 if (DestType->isRecordType()) {
4726 QualType InitType = InitList->getInit(0)->getType();
4727 if (S.Context.hasSameUnqualifiedType(InitType, DestType) ||
4728 S.IsDerivedFrom(InitList->getBeginLoc(), InitType, DestType)) {
4729 Expr *InitListAsExpr = InitList;
4730 TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
4731 DestType, Sequence,
4732 /*InitListSyntax*/false,
4733 /*IsInitListCopy*/true);
4734 return;
4735 }
4736 }
4737 if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) {
4738 Expr *SubInit[1] = {InitList->getInit(0)};
4739 if (!isa<VariableArrayType>(DestAT) &&
4740 IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) {
4741 InitializationKind SubKind =
4742 Kind.getKind() == InitializationKind::IK_DirectList
4743 ? InitializationKind::CreateDirect(Kind.getLocation(),
4744 InitList->getLBraceLoc(),
4745 InitList->getRBraceLoc())
4746 : Kind;
4747 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
4748 /*TopLevelOfInitList*/ true,
4749 TreatUnavailableAsInvalid);
4750
4751 // TryStringLiteralInitialization() (in InitializeFrom()) will fail if
4752 // the element is not an appropriately-typed string literal, in which
4753 // case we should proceed as in C++11 (below).
4754 if (Sequence) {
4755 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4756 return;
4757 }
4758 }
4759 }
4760 }
4761
4762 // C++11 [dcl.init.list]p3:
4763 // - If T is an aggregate, aggregate initialization is performed.
4764 if ((DestType->isRecordType() && !DestType->isAggregateType()) ||
4765 (S.getLangOpts().CPlusPlus11 &&
4766 S.isStdInitializerList(DestType, nullptr) && !IsDesignatedInit)) {
4767 if (S.getLangOpts().CPlusPlus11) {
4768 // - Otherwise, if the initializer list has no elements and T is a
4769 // class type with a default constructor, the object is
4770 // value-initialized.
4771 if (InitList->getNumInits() == 0) {
4772 CXXRecordDecl *RD = DestType->getAsCXXRecordDecl();
4773 if (S.LookupDefaultConstructor(RD)) {
4774 TryValueInitialization(S, Entity, Kind, Sequence, InitList);
4775 return;
4776 }
4777 }
4778
4779 // - Otherwise, if T is a specialization of std::initializer_list<E>,
4780 // an initializer_list object constructed [...]
4781 if (TryInitializerListConstruction(S, InitList, DestType, Sequence,
4782 TreatUnavailableAsInvalid))
4783 return;
4784
4785 // - Otherwise, if T is a class type, constructors are considered.
4786 Expr *InitListAsExpr = InitList;
4787 TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
4788 DestType, Sequence, /*InitListSyntax*/true);
4789 } else
4790 Sequence.SetFailed(InitializationSequence::FK_InitListBadDestinationType);
4791 return;
4792 }
4793
4794 if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() &&
4795 InitList->getNumInits() == 1) {
4796 Expr *E = InitList->getInit(0);
4797
4798 // - Otherwise, if T is an enumeration with a fixed underlying type,
4799 // the initializer-list has a single element v, and the initialization
4800 // is direct-list-initialization, the object is initialized with the
4801 // value T(v); if a narrowing conversion is required to convert v to
4802 // the underlying type of T, the program is ill-formed.
4803 auto *ET = DestType->getAs<EnumType>();
4804 if (S.getLangOpts().CPlusPlus17 &&
4805 Kind.getKind() == InitializationKind::IK_DirectList &&
4806 ET && ET->getDecl()->isFixed() &&
4807 !S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
4808 (E->getType()->isIntegralOrUnscopedEnumerationType() ||
4809 E->getType()->isFloatingType())) {
4810 // There are two ways that T(v) can work when T is an enumeration type.
4811 // If there is either an implicit conversion sequence from v to T or
4812 // a conversion function that can convert from v to T, then we use that.
4813 // Otherwise, if v is of integral, unscoped enumeration, or floating-point
4814 // type, it is converted to the enumeration type via its underlying type.
4815 // There is no overlap possible between these two cases (except when the
4816 // source value is already of the destination type), and the first
4817 // case is handled by the general case for single-element lists below.
4818 ImplicitConversionSequence ICS;
4819 ICS.setStandard();
4820 ICS.Standard.setAsIdentityConversion();
4821 if (!E->isPRValue())
4822 ICS.Standard.First = ICK_Lvalue_To_Rvalue;
4823 // If E is of a floating-point type, then the conversion is ill-formed
4824 // due to narrowing, but go through the motions in order to produce the
4825 // right diagnostic.
4826 ICS.Standard.Second = E->getType()->isFloatingType()
4827 ? ICK_Floating_Integral
4828 : ICK_Integral_Conversion;
4829 ICS.Standard.setFromType(E->getType());
4830 ICS.Standard.setToType(0, E->getType());
4831 ICS.Standard.setToType(1, DestType);
4832 ICS.Standard.setToType(2, DestType);
4833 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2),
4834 /*TopLevelOfInitList*/true);
4835 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4836 return;
4837 }
4838
4839 // - Otherwise, if the initializer list has a single element of type E
4840 // [...references are handled above...], the object or reference is
4841 // initialized from that element (by copy-initialization for
4842 // copy-list-initialization, or by direct-initialization for
4843 // direct-list-initialization); if a narrowing conversion is required
4844 // to convert the element to T, the program is ill-formed.
4845 //
4846 // Per core-24034, this is direct-initialization if we were performing
4847 // direct-list-initialization and copy-initialization otherwise.
4848 // We can't use InitListChecker for this, because it always performs
4849 // copy-initialization. This only matters if we might use an 'explicit'
4850 // conversion operator, or for the special case conversion of nullptr_t to
4851 // bool, so we only need to handle those cases.
4852 //
4853 // FIXME: Why not do this in all cases?
4854 Expr *Init = InitList->getInit(0);
4855 if (Init->getType()->isRecordType() ||
4856 (Init->getType()->isNullPtrType() && DestType->isBooleanType())) {
4857 InitializationKind SubKind =
4858 Kind.getKind() == InitializationKind::IK_DirectList
4859 ? InitializationKind::CreateDirect(Kind.getLocation(),
4860 InitList->getLBraceLoc(),
4861 InitList->getRBraceLoc())
4862 : Kind;
4863 Expr *SubInit[1] = { Init };
4864 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
4865 /*TopLevelOfInitList*/true,
4866 TreatUnavailableAsInvalid);
4867 if (Sequence)
4868 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
4869 return;
4870 }
4871 }
4872
4873 InitListChecker CheckInitList(S, Entity, InitList,
4874 DestType, /*VerifyOnly=*/true, TreatUnavailableAsInvalid);
4875 if (CheckInitList.HadError()) {
4876 Sequence.SetFailed(InitializationSequence::FK_ListInitializationFailed);
4877 return;
4878 }
4879
4880 // Add the list initialization step with the built init list.
4881 Sequence.AddListInitializationStep(DestType);
4882 }
4883
4884 /// Try a reference initialization that involves calling a conversion
4885 /// function.
TryRefInitWithConversionFunction(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,bool AllowRValues,bool IsLValueRef,InitializationSequence & Sequence)4886 static OverloadingResult TryRefInitWithConversionFunction(
4887 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4888 Expr *Initializer, bool AllowRValues, bool IsLValueRef,
4889 InitializationSequence &Sequence) {
4890 QualType DestType = Entity.getType();
4891 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
4892 QualType T1 = cv1T1.getUnqualifiedType();
4893 QualType cv2T2 = Initializer->getType();
4894 QualType T2 = cv2T2.getUnqualifiedType();
4895
4896 assert(!S.CompareReferenceRelationship(Initializer->getBeginLoc(), T1, T2) &&
4897 "Must have incompatible references when binding via conversion");
4898
4899 // Build the candidate set directly in the initialization sequence
4900 // structure, so that it will persist if we fail.
4901 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4902 CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
4903
4904 // Determine whether we are allowed to call explicit conversion operators.
4905 // Note that none of [over.match.copy], [over.match.conv], nor
4906 // [over.match.ref] permit an explicit constructor to be chosen when
4907 // initializing a reference, not even for direct-initialization.
4908 bool AllowExplicitCtors = false;
4909 bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
4910
4911 const RecordType *T1RecordType = nullptr;
4912 if (AllowRValues && (T1RecordType = T1->getAs<RecordType>()) &&
4913 S.isCompleteType(Kind.getLocation(), T1)) {
4914 // The type we're converting to is a class type. Enumerate its constructors
4915 // to see if there is a suitable conversion.
4916 CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl());
4917
4918 for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) {
4919 auto Info = getConstructorInfo(D);
4920 if (!Info.Constructor)
4921 continue;
4922
4923 if (!Info.Constructor->isInvalidDecl() &&
4924 Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
4925 if (Info.ConstructorTmpl)
4926 S.AddTemplateOverloadCandidate(
4927 Info.ConstructorTmpl, Info.FoundDecl,
4928 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
4929 /*SuppressUserConversions=*/true,
4930 /*PartialOverloading*/ false, AllowExplicitCtors);
4931 else
4932 S.AddOverloadCandidate(
4933 Info.Constructor, Info.FoundDecl, Initializer, CandidateSet,
4934 /*SuppressUserConversions=*/true,
4935 /*PartialOverloading*/ false, AllowExplicitCtors);
4936 }
4937 }
4938 }
4939 if (T1RecordType && T1RecordType->getDecl()->isInvalidDecl())
4940 return OR_No_Viable_Function;
4941
4942 const RecordType *T2RecordType = nullptr;
4943 if ((T2RecordType = T2->getAs<RecordType>()) &&
4944 S.isCompleteType(Kind.getLocation(), T2)) {
4945 // The type we're converting from is a class type, enumerate its conversion
4946 // functions.
4947 CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
4948
4949 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
4950 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4951 NamedDecl *D = *I;
4952 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
4953 if (isa<UsingShadowDecl>(D))
4954 D = cast<UsingShadowDecl>(D)->getTargetDecl();
4955
4956 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4957 CXXConversionDecl *Conv;
4958 if (ConvTemplate)
4959 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4960 else
4961 Conv = cast<CXXConversionDecl>(D);
4962
4963 // If the conversion function doesn't return a reference type,
4964 // it can't be considered for this conversion unless we're allowed to
4965 // consider rvalues.
4966 // FIXME: Do we need to make sure that we only consider conversion
4967 // candidates with reference-compatible results? That might be needed to
4968 // break recursion.
4969 if ((AllowRValues ||
4970 Conv->getConversionType()->isLValueReferenceType())) {
4971 if (ConvTemplate)
4972 S.AddTemplateConversionCandidate(
4973 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
4974 CandidateSet,
4975 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
4976 else
4977 S.AddConversionCandidate(
4978 Conv, I.getPair(), ActingDC, Initializer, DestType, CandidateSet,
4979 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
4980 }
4981 }
4982 }
4983 if (T2RecordType && T2RecordType->getDecl()->isInvalidDecl())
4984 return OR_No_Viable_Function;
4985
4986 SourceLocation DeclLoc = Initializer->getBeginLoc();
4987
4988 // Perform overload resolution. If it fails, return the failed result.
4989 OverloadCandidateSet::iterator Best;
4990 if (OverloadingResult Result
4991 = CandidateSet.BestViableFunction(S, DeclLoc, Best))
4992 return Result;
4993
4994 FunctionDecl *Function = Best->Function;
4995 // This is the overload that will be used for this initialization step if we
4996 // use this initialization. Mark it as referenced.
4997 Function->setReferenced();
4998
4999 // Compute the returned type and value kind of the conversion.
5000 QualType cv3T3;
5001 if (isa<CXXConversionDecl>(Function))
5002 cv3T3 = Function->getReturnType();
5003 else
5004 cv3T3 = T1;
5005
5006 ExprValueKind VK = VK_PRValue;
5007 if (cv3T3->isLValueReferenceType())
5008 VK = VK_LValue;
5009 else if (const auto *RRef = cv3T3->getAs<RValueReferenceType>())
5010 VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue;
5011 cv3T3 = cv3T3.getNonLValueExprType(S.Context);
5012
5013 // Add the user-defined conversion step.
5014 bool HadMultipleCandidates = (CandidateSet.size() > 1);
5015 Sequence.AddUserConversionStep(Function, Best->FoundDecl, cv3T3,
5016 HadMultipleCandidates);
5017
5018 // Determine whether we'll need to perform derived-to-base adjustments or
5019 // other conversions.
5020 Sema::ReferenceConversions RefConv;
5021 Sema::ReferenceCompareResult NewRefRelationship =
5022 S.CompareReferenceRelationship(DeclLoc, T1, cv3T3, &RefConv);
5023
5024 // Add the final conversion sequence, if necessary.
5025 if (NewRefRelationship == Sema::Ref_Incompatible) {
5026 assert(!isa<CXXConstructorDecl>(Function) &&
5027 "should not have conversion after constructor");
5028
5029 ImplicitConversionSequence ICS;
5030 ICS.setStandard();
5031 ICS.Standard = Best->FinalConversion;
5032 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2));
5033
5034 // Every implicit conversion results in a prvalue, except for a glvalue
5035 // derived-to-base conversion, which we handle below.
5036 cv3T3 = ICS.Standard.getToType(2);
5037 VK = VK_PRValue;
5038 }
5039
5040 // If the converted initializer is a prvalue, its type T4 is adjusted to
5041 // type "cv1 T4" and the temporary materialization conversion is applied.
5042 //
5043 // We adjust the cv-qualifications to match the reference regardless of
5044 // whether we have a prvalue so that the AST records the change. In this
5045 // case, T4 is "cv3 T3".
5046 QualType cv1T4 = S.Context.getQualifiedType(cv3T3, cv1T1.getQualifiers());
5047 if (cv1T4.getQualifiers() != cv3T3.getQualifiers())
5048 Sequence.AddQualificationConversionStep(cv1T4, VK);
5049 Sequence.AddReferenceBindingStep(cv1T4, VK == VK_PRValue);
5050 VK = IsLValueRef ? VK_LValue : VK_XValue;
5051
5052 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5053 Sequence.AddDerivedToBaseCastStep(cv1T1, VK);
5054 else if (RefConv & Sema::ReferenceConversions::ObjC)
5055 Sequence.AddObjCObjectConversionStep(cv1T1);
5056 else if (RefConv & Sema::ReferenceConversions::Function)
5057 Sequence.AddFunctionReferenceConversionStep(cv1T1);
5058 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5059 if (!S.Context.hasSameType(cv1T4, cv1T1))
5060 Sequence.AddQualificationConversionStep(cv1T1, VK);
5061 }
5062
5063 return OR_Success;
5064 }
5065
5066 static void CheckCXX98CompatAccessibleCopy(Sema &S,
5067 const InitializedEntity &Entity,
5068 Expr *CurInitExpr);
5069
5070 /// Attempt reference initialization (C++0x [dcl.init.ref])
TryReferenceInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,InitializationSequence & Sequence,bool TopLevelOfInitList)5071 static void TryReferenceInitialization(Sema &S, const InitializedEntity &Entity,
5072 const InitializationKind &Kind,
5073 Expr *Initializer,
5074 InitializationSequence &Sequence,
5075 bool TopLevelOfInitList) {
5076 QualType DestType = Entity.getType();
5077 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
5078 Qualifiers T1Quals;
5079 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
5080 QualType cv2T2 = S.getCompletedType(Initializer);
5081 Qualifiers T2Quals;
5082 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
5083
5084 // If the initializer is the address of an overloaded function, try
5085 // to resolve the overloaded function. If all goes well, T2 is the
5086 // type of the resulting function.
5087 if (ResolveOverloadedFunctionForReferenceBinding(S, Initializer, cv2T2, T2,
5088 T1, Sequence))
5089 return;
5090
5091 // Delegate everything else to a subfunction.
5092 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
5093 T1Quals, cv2T2, T2, T2Quals, Sequence,
5094 TopLevelOfInitList);
5095 }
5096
5097 /// Determine whether an expression is a non-referenceable glvalue (one to
5098 /// which a reference can never bind). Attempting to bind a reference to
5099 /// such a glvalue will always create a temporary.
isNonReferenceableGLValue(Expr * E)5100 static bool isNonReferenceableGLValue(Expr *E) {
5101 return E->refersToBitField() || E->refersToVectorElement() ||
5102 E->refersToMatrixElement();
5103 }
5104
5105 /// Reference initialization without resolving overloaded functions.
5106 ///
5107 /// We also can get here in C if we call a builtin which is declared as
5108 /// a function with a parameter of reference type (such as __builtin_va_end()).
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,bool TopLevelOfInitList)5109 static void TryReferenceInitializationCore(Sema &S,
5110 const InitializedEntity &Entity,
5111 const InitializationKind &Kind,
5112 Expr *Initializer,
5113 QualType cv1T1, QualType T1,
5114 Qualifiers T1Quals,
5115 QualType cv2T2, QualType T2,
5116 Qualifiers T2Quals,
5117 InitializationSequence &Sequence,
5118 bool TopLevelOfInitList) {
5119 QualType DestType = Entity.getType();
5120 SourceLocation DeclLoc = Initializer->getBeginLoc();
5121
5122 // Compute some basic properties of the types and the initializer.
5123 bool isLValueRef = DestType->isLValueReferenceType();
5124 bool isRValueRef = !isLValueRef;
5125 Expr::Classification InitCategory = Initializer->Classify(S.Context);
5126
5127 Sema::ReferenceConversions RefConv;
5128 Sema::ReferenceCompareResult RefRelationship =
5129 S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, &RefConv);
5130
5131 // C++0x [dcl.init.ref]p5:
5132 // A reference to type "cv1 T1" is initialized by an expression of type
5133 // "cv2 T2" as follows:
5134 //
5135 // - If the reference is an lvalue reference and the initializer
5136 // expression
5137 // Note the analogous bullet points for rvalue refs to functions. Because
5138 // there are no function rvalues in C++, rvalue refs to functions are treated
5139 // like lvalue refs.
5140 OverloadingResult ConvOvlResult = OR_Success;
5141 bool T1Function = T1->isFunctionType();
5142 if (isLValueRef || T1Function) {
5143 if (InitCategory.isLValue() && !isNonReferenceableGLValue(Initializer) &&
5144 (RefRelationship == Sema::Ref_Compatible ||
5145 (Kind.isCStyleOrFunctionalCast() &&
5146 RefRelationship == Sema::Ref_Related))) {
5147 // - is an lvalue (but is not a bit-field), and "cv1 T1" is
5148 // reference-compatible with "cv2 T2," or
5149 if (RefConv & (Sema::ReferenceConversions::DerivedToBase |
5150 Sema::ReferenceConversions::ObjC)) {
5151 // If we're converting the pointee, add any qualifiers first;
5152 // these qualifiers must all be top-level, so just convert to "cv1 T2".
5153 if (RefConv & (Sema::ReferenceConversions::Qualification))
5154 Sequence.AddQualificationConversionStep(
5155 S.Context.getQualifiedType(T2, T1Quals),
5156 Initializer->getValueKind());
5157 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5158 Sequence.AddDerivedToBaseCastStep(cv1T1, VK_LValue);
5159 else
5160 Sequence.AddObjCObjectConversionStep(cv1T1);
5161 } else if (RefConv & Sema::ReferenceConversions::Qualification) {
5162 // Perform a (possibly multi-level) qualification conversion.
5163 Sequence.AddQualificationConversionStep(cv1T1,
5164 Initializer->getValueKind());
5165 } else if (RefConv & Sema::ReferenceConversions::Function) {
5166 Sequence.AddFunctionReferenceConversionStep(cv1T1);
5167 }
5168
5169 // We only create a temporary here when binding a reference to a
5170 // bit-field or vector element. Those cases are't supposed to be
5171 // handled by this bullet, but the outcome is the same either way.
5172 Sequence.AddReferenceBindingStep(cv1T1, false);
5173 return;
5174 }
5175
5176 // - has a class type (i.e., T2 is a class type), where T1 is not
5177 // reference-related to T2, and can be implicitly converted to an
5178 // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible
5179 // with "cv3 T3" (this conversion is selected by enumerating the
5180 // applicable conversion functions (13.3.1.6) and choosing the best
5181 // one through overload resolution (13.3)),
5182 // If we have an rvalue ref to function type here, the rhs must be
5183 // an rvalue. DR1287 removed the "implicitly" here.
5184 if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() &&
5185 (isLValueRef || InitCategory.isRValue())) {
5186 if (S.getLangOpts().CPlusPlus) {
5187 // Try conversion functions only for C++.
5188 ConvOvlResult = TryRefInitWithConversionFunction(
5189 S, Entity, Kind, Initializer, /*AllowRValues*/ isRValueRef,
5190 /*IsLValueRef*/ isLValueRef, Sequence);
5191 if (ConvOvlResult == OR_Success)
5192 return;
5193 if (ConvOvlResult != OR_No_Viable_Function)
5194 Sequence.SetOverloadFailure(
5195 InitializationSequence::FK_ReferenceInitOverloadFailed,
5196 ConvOvlResult);
5197 } else {
5198 ConvOvlResult = OR_No_Viable_Function;
5199 }
5200 }
5201 }
5202
5203 // - Otherwise, the reference shall be an lvalue reference to a
5204 // non-volatile const type (i.e., cv1 shall be const), or the reference
5205 // shall be an rvalue reference.
5206 // For address spaces, we interpret this to mean that an addr space
5207 // of a reference "cv1 T1" is a superset of addr space of "cv2 T2".
5208 if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile() &&
5209 T1Quals.isAddressSpaceSupersetOf(T2Quals))) {
5210 if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
5211 Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
5212 else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5213 Sequence.SetOverloadFailure(
5214 InitializationSequence::FK_ReferenceInitOverloadFailed,
5215 ConvOvlResult);
5216 else if (!InitCategory.isLValue())
5217 Sequence.SetFailed(
5218 T1Quals.isAddressSpaceSupersetOf(T2Quals)
5219 ? InitializationSequence::
5220 FK_NonConstLValueReferenceBindingToTemporary
5221 : InitializationSequence::FK_ReferenceInitDropsQualifiers);
5222 else {
5223 InitializationSequence::FailureKind FK;
5224 switch (RefRelationship) {
5225 case Sema::Ref_Compatible:
5226 if (Initializer->refersToBitField())
5227 FK = InitializationSequence::
5228 FK_NonConstLValueReferenceBindingToBitfield;
5229 else if (Initializer->refersToVectorElement())
5230 FK = InitializationSequence::
5231 FK_NonConstLValueReferenceBindingToVectorElement;
5232 else if (Initializer->refersToMatrixElement())
5233 FK = InitializationSequence::
5234 FK_NonConstLValueReferenceBindingToMatrixElement;
5235 else
5236 llvm_unreachable("unexpected kind of compatible initializer");
5237 break;
5238 case Sema::Ref_Related:
5239 FK = InitializationSequence::FK_ReferenceInitDropsQualifiers;
5240 break;
5241 case Sema::Ref_Incompatible:
5242 FK = InitializationSequence::
5243 FK_NonConstLValueReferenceBindingToUnrelated;
5244 break;
5245 }
5246 Sequence.SetFailed(FK);
5247 }
5248 return;
5249 }
5250
5251 // - If the initializer expression
5252 // - is an
5253 // [<=14] xvalue (but not a bit-field), class prvalue, array prvalue, or
5254 // [1z] rvalue (but not a bit-field) or
5255 // function lvalue and "cv1 T1" is reference-compatible with "cv2 T2"
5256 //
5257 // Note: functions are handled above and below rather than here...
5258 if (!T1Function &&
5259 (RefRelationship == Sema::Ref_Compatible ||
5260 (Kind.isCStyleOrFunctionalCast() &&
5261 RefRelationship == Sema::Ref_Related)) &&
5262 ((InitCategory.isXValue() && !isNonReferenceableGLValue(Initializer)) ||
5263 (InitCategory.isPRValue() &&
5264 (S.getLangOpts().CPlusPlus17 || T2->isRecordType() ||
5265 T2->isArrayType())))) {
5266 ExprValueKind ValueKind = InitCategory.isXValue() ? VK_XValue : VK_PRValue;
5267 if (InitCategory.isPRValue() && T2->isRecordType()) {
5268 // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the
5269 // compiler the freedom to perform a copy here or bind to the
5270 // object, while C++0x requires that we bind directly to the
5271 // object. Hence, we always bind to the object without making an
5272 // extra copy. However, in C++03 requires that we check for the
5273 // presence of a suitable copy constructor:
5274 //
5275 // The constructor that would be used to make the copy shall
5276 // be callable whether or not the copy is actually done.
5277 if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt)
5278 Sequence.AddExtraneousCopyToTemporary(cv2T2);
5279 else if (S.getLangOpts().CPlusPlus11)
5280 CheckCXX98CompatAccessibleCopy(S, Entity, Initializer);
5281 }
5282
5283 // C++1z [dcl.init.ref]/5.2.1.2:
5284 // If the converted initializer is a prvalue, its type T4 is adjusted
5285 // to type "cv1 T4" and the temporary materialization conversion is
5286 // applied.
5287 // Postpone address space conversions to after the temporary materialization
5288 // conversion to allow creating temporaries in the alloca address space.
5289 auto T1QualsIgnoreAS = T1Quals;
5290 auto T2QualsIgnoreAS = T2Quals;
5291 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5292 T1QualsIgnoreAS.removeAddressSpace();
5293 T2QualsIgnoreAS.removeAddressSpace();
5294 }
5295 QualType cv1T4 = S.Context.getQualifiedType(cv2T2, T1QualsIgnoreAS);
5296 if (T1QualsIgnoreAS != T2QualsIgnoreAS)
5297 Sequence.AddQualificationConversionStep(cv1T4, ValueKind);
5298 Sequence.AddReferenceBindingStep(cv1T4, ValueKind == VK_PRValue);
5299 ValueKind = isLValueRef ? VK_LValue : VK_XValue;
5300 // Add addr space conversion if required.
5301 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5302 auto T4Quals = cv1T4.getQualifiers();
5303 T4Quals.addAddressSpace(T1Quals.getAddressSpace());
5304 QualType cv1T4WithAS = S.Context.getQualifiedType(T2, T4Quals);
5305 Sequence.AddQualificationConversionStep(cv1T4WithAS, ValueKind);
5306 cv1T4 = cv1T4WithAS;
5307 }
5308
5309 // In any case, the reference is bound to the resulting glvalue (or to
5310 // an appropriate base class subobject).
5311 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5312 Sequence.AddDerivedToBaseCastStep(cv1T1, ValueKind);
5313 else if (RefConv & Sema::ReferenceConversions::ObjC)
5314 Sequence.AddObjCObjectConversionStep(cv1T1);
5315 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5316 if (!S.Context.hasSameType(cv1T4, cv1T1))
5317 Sequence.AddQualificationConversionStep(cv1T1, ValueKind);
5318 }
5319 return;
5320 }
5321
5322 // - has a class type (i.e., T2 is a class type), where T1 is not
5323 // reference-related to T2, and can be implicitly converted to an
5324 // xvalue, class prvalue, or function lvalue of type "cv3 T3",
5325 // where "cv1 T1" is reference-compatible with "cv3 T3",
5326 //
5327 // DR1287 removes the "implicitly" here.
5328 if (T2->isRecordType()) {
5329 if (RefRelationship == Sema::Ref_Incompatible) {
5330 ConvOvlResult = TryRefInitWithConversionFunction(
5331 S, Entity, Kind, Initializer, /*AllowRValues*/ true,
5332 /*IsLValueRef*/ isLValueRef, Sequence);
5333 if (ConvOvlResult)
5334 Sequence.SetOverloadFailure(
5335 InitializationSequence::FK_ReferenceInitOverloadFailed,
5336 ConvOvlResult);
5337
5338 return;
5339 }
5340
5341 if (RefRelationship == Sema::Ref_Compatible &&
5342 isRValueRef && InitCategory.isLValue()) {
5343 Sequence.SetFailed(
5344 InitializationSequence::FK_RValueReferenceBindingToLValue);
5345 return;
5346 }
5347
5348 Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
5349 return;
5350 }
5351
5352 // - Otherwise, a temporary of type "cv1 T1" is created and initialized
5353 // from the initializer expression using the rules for a non-reference
5354 // copy-initialization (8.5). The reference is then bound to the
5355 // temporary. [...]
5356
5357 // Ignore address space of reference type at this point and perform address
5358 // space conversion after the reference binding step.
5359 QualType cv1T1IgnoreAS =
5360 T1Quals.hasAddressSpace()
5361 ? S.Context.getQualifiedType(T1, T1Quals.withoutAddressSpace())
5362 : cv1T1;
5363
5364 InitializedEntity TempEntity =
5365 InitializedEntity::InitializeTemporary(cv1T1IgnoreAS);
5366
5367 // FIXME: Why do we use an implicit conversion here rather than trying
5368 // copy-initialization?
5369 ImplicitConversionSequence ICS
5370 = S.TryImplicitConversion(Initializer, TempEntity.getType(),
5371 /*SuppressUserConversions=*/false,
5372 Sema::AllowedExplicit::None,
5373 /*FIXME:InOverloadResolution=*/false,
5374 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
5375 /*AllowObjCWritebackConversion=*/false);
5376
5377 if (ICS.isBad()) {
5378 // FIXME: Use the conversion function set stored in ICS to turn
5379 // this into an overloading ambiguity diagnostic. However, we need
5380 // to keep that set as an OverloadCandidateSet rather than as some
5381 // other kind of set.
5382 if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5383 Sequence.SetOverloadFailure(
5384 InitializationSequence::FK_ReferenceInitOverloadFailed,
5385 ConvOvlResult);
5386 else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
5387 Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
5388 else
5389 Sequence.SetFailed(InitializationSequence::FK_ReferenceInitFailed);
5390 return;
5391 } else {
5392 Sequence.AddConversionSequenceStep(ICS, TempEntity.getType(),
5393 TopLevelOfInitList);
5394 }
5395
5396 // [...] If T1 is reference-related to T2, cv1 must be the
5397 // same cv-qualification as, or greater cv-qualification
5398 // than, cv2; otherwise, the program is ill-formed.
5399 unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
5400 unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
5401 if (RefRelationship == Sema::Ref_Related &&
5402 ((T1CVRQuals | T2CVRQuals) != T1CVRQuals ||
5403 !T1Quals.isAddressSpaceSupersetOf(T2Quals))) {
5404 Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
5405 return;
5406 }
5407
5408 // [...] If T1 is reference-related to T2 and the reference is an rvalue
5409 // reference, the initializer expression shall not be an lvalue.
5410 if (RefRelationship >= Sema::Ref_Related && !isLValueRef &&
5411 InitCategory.isLValue()) {
5412 Sequence.SetFailed(
5413 InitializationSequence::FK_RValueReferenceBindingToLValue);
5414 return;
5415 }
5416
5417 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS, /*BindingTemporary=*/true);
5418
5419 if (T1Quals.hasAddressSpace()) {
5420 if (!Qualifiers::isAddressSpaceSupersetOf(T1Quals.getAddressSpace(),
5421 LangAS::Default)) {
5422 Sequence.SetFailed(
5423 InitializationSequence::FK_ReferenceAddrspaceMismatchTemporary);
5424 return;
5425 }
5426 Sequence.AddQualificationConversionStep(cv1T1, isLValueRef ? VK_LValue
5427 : VK_XValue);
5428 }
5429 }
5430
5431 /// Attempt character array initialization from a string literal
5432 /// (C++ [dcl.init.string], C99 6.7.8).
TryStringLiteralInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,Expr * Initializer,InitializationSequence & Sequence)5433 static void TryStringLiteralInitialization(Sema &S,
5434 const InitializedEntity &Entity,
5435 const InitializationKind &Kind,
5436 Expr *Initializer,
5437 InitializationSequence &Sequence) {
5438 Sequence.AddStringInitStep(Entity.getType());
5439 }
5440
5441 /// Attempt value initialization (C++ [dcl.init]p7).
TryValueInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitializationSequence & Sequence,InitListExpr * InitList)5442 static void TryValueInitialization(Sema &S,
5443 const InitializedEntity &Entity,
5444 const InitializationKind &Kind,
5445 InitializationSequence &Sequence,
5446 InitListExpr *InitList) {
5447 assert((!InitList || InitList->getNumInits() == 0) &&
5448 "Shouldn't use value-init for non-empty init lists");
5449
5450 // C++98 [dcl.init]p5, C++11 [dcl.init]p7:
5451 //
5452 // To value-initialize an object of type T means:
5453 QualType T = Entity.getType();
5454
5455 // -- if T is an array type, then each element is value-initialized;
5456 T = S.Context.getBaseElementType(T);
5457
5458 if (const RecordType *RT = T->getAs<RecordType>()) {
5459 if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
5460 bool NeedZeroInitialization = true;
5461 // C++98:
5462 // -- if T is a class type (clause 9) with a user-declared constructor
5463 // (12.1), then the default constructor for T is called (and the
5464 // initialization is ill-formed if T has no accessible default
5465 // constructor);
5466 // C++11:
5467 // -- if T is a class type (clause 9) with either no default constructor
5468 // (12.1 [class.ctor]) or a default constructor that is user-provided
5469 // or deleted, then the object is default-initialized;
5470 //
5471 // Note that the C++11 rule is the same as the C++98 rule if there are no
5472 // defaulted or deleted constructors, so we just use it unconditionally.
5473 CXXConstructorDecl *CD = S.LookupDefaultConstructor(ClassDecl);
5474 if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted())
5475 NeedZeroInitialization = false;
5476
5477 // -- if T is a (possibly cv-qualified) non-union class type without a
5478 // user-provided or deleted default constructor, then the object is
5479 // zero-initialized and, if T has a non-trivial default constructor,
5480 // default-initialized;
5481 // The 'non-union' here was removed by DR1502. The 'non-trivial default
5482 // constructor' part was removed by DR1507.
5483 if (NeedZeroInitialization)
5484 Sequence.AddZeroInitializationStep(Entity.getType());
5485
5486 // C++03:
5487 // -- if T is a non-union class type without a user-declared constructor,
5488 // then every non-static data member and base class component of T is
5489 // value-initialized;
5490 // [...] A program that calls for [...] value-initialization of an
5491 // entity of reference type is ill-formed.
5492 //
5493 // C++11 doesn't need this handling, because value-initialization does not
5494 // occur recursively there, and the implicit default constructor is
5495 // defined as deleted in the problematic cases.
5496 if (!S.getLangOpts().CPlusPlus11 &&
5497 ClassDecl->hasUninitializedReferenceMember()) {
5498 Sequence.SetFailed(InitializationSequence::FK_TooManyInitsForReference);
5499 return;
5500 }
5501
5502 // If this is list-value-initialization, pass the empty init list on when
5503 // building the constructor call. This affects the semantics of a few
5504 // things (such as whether an explicit default constructor can be called).
5505 Expr *InitListAsExpr = InitList;
5506 MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);
5507 bool InitListSyntax = InitList;
5508
5509 // FIXME: Instead of creating a CXXConstructExpr of array type here,
5510 // wrap a class-typed CXXConstructExpr in an ArrayInitLoopExpr.
5511 return TryConstructorInitialization(
5512 S, Entity, Kind, Args, T, Entity.getType(), Sequence, InitListSyntax);
5513 }
5514 }
5515
5516 Sequence.AddZeroInitializationStep(Entity.getType());
5517 }
5518
5519 /// Attempt default initialization (C++ [dcl.init]p6).
TryDefaultInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,InitializationSequence & Sequence)5520 static void TryDefaultInitialization(Sema &S,
5521 const InitializedEntity &Entity,
5522 const InitializationKind &Kind,
5523 InitializationSequence &Sequence) {
5524 assert(Kind.getKind() == InitializationKind::IK_Default);
5525
5526 // C++ [dcl.init]p6:
5527 // To default-initialize an object of type T means:
5528 // - if T is an array type, each element is default-initialized;
5529 QualType DestType = S.Context.getBaseElementType(Entity.getType());
5530
5531 // - if T is a (possibly cv-qualified) class type (Clause 9), the default
5532 // constructor for T is called (and the initialization is ill-formed if
5533 // T has no accessible default constructor);
5534 if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {
5535 TryConstructorInitialization(S, Entity, Kind, std::nullopt, DestType,
5536 Entity.getType(), Sequence);
5537 return;
5538 }
5539
5540 // - otherwise, no initialization is performed.
5541
5542 // If a program calls for the default initialization of an object of
5543 // a const-qualified type T, T shall be a class type with a user-provided
5544 // default constructor.
5545 if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
5546 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
5547 Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
5548 return;
5549 }
5550
5551 // If the destination type has a lifetime property, zero-initialize it.
5552 if (DestType.getQualifiers().hasObjCLifetime()) {
5553 Sequence.AddZeroInitializationStep(Entity.getType());
5554 return;
5555 }
5556 }
5557
TryOrBuildParenListInitialization(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,ArrayRef<Expr * > Args,InitializationSequence & Sequence,bool VerifyOnly,ExprResult * Result=nullptr)5558 static void TryOrBuildParenListInitialization(
5559 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
5560 ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly,
5561 ExprResult *Result = nullptr) {
5562 unsigned EntityIndexToProcess = 0;
5563 SmallVector<Expr *, 4> InitExprs;
5564 QualType ResultType;
5565 Expr *ArrayFiller = nullptr;
5566 FieldDecl *InitializedFieldInUnion = nullptr;
5567
5568 auto HandleInitializedEntity = [&](const InitializedEntity &SubEntity,
5569 const InitializationKind &SubKind,
5570 Expr *Arg, Expr **InitExpr = nullptr) {
5571 InitializationSequence IS = InitializationSequence(
5572 S, SubEntity, SubKind, Arg ? MultiExprArg(Arg) : std::nullopt);
5573
5574 if (IS.Failed()) {
5575 if (!VerifyOnly) {
5576 IS.Diagnose(S, SubEntity, SubKind, Arg ? ArrayRef(Arg) : std::nullopt);
5577 } else {
5578 Sequence.SetFailed(
5579 InitializationSequence::FK_ParenthesizedListInitFailed);
5580 }
5581
5582 return false;
5583 }
5584 if (!VerifyOnly) {
5585 ExprResult ER;
5586 ER = IS.Perform(S, SubEntity, SubKind,
5587 Arg ? MultiExprArg(Arg) : std::nullopt);
5588
5589 if (ER.isInvalid())
5590 return false;
5591
5592 if (InitExpr)
5593 *InitExpr = ER.get();
5594 else
5595 InitExprs.push_back(ER.get());
5596 }
5597 return true;
5598 };
5599
5600 if (const ArrayType *AT =
5601 S.getASTContext().getAsArrayType(Entity.getType())) {
5602 SmallVector<InitializedEntity, 4> ElementEntities;
5603 uint64_t ArrayLength;
5604 // C++ [dcl.init]p16.5
5605 // if the destination type is an array, the object is initialized as
5606 // follows. Let x1, . . . , xk be the elements of the expression-list. If
5607 // the destination type is an array of unknown bound, it is defined as
5608 // having k elements.
5609 if (const ConstantArrayType *CAT =
5610 S.getASTContext().getAsConstantArrayType(Entity.getType())) {
5611 ArrayLength = CAT->getZExtSize();
5612 ResultType = Entity.getType();
5613 } else if (const VariableArrayType *VAT =
5614 S.getASTContext().getAsVariableArrayType(Entity.getType())) {
5615 // Braced-initialization of variable array types is not allowed, even if
5616 // the size is greater than or equal to the number of args, so we don't
5617 // allow them to be initialized via parenthesized aggregate initialization
5618 // either.
5619 const Expr *SE = VAT->getSizeExpr();
5620 S.Diag(SE->getBeginLoc(), diag::err_variable_object_no_init)
5621 << SE->getSourceRange();
5622 return;
5623 } else {
5624 assert(Entity.getType()->isIncompleteArrayType());
5625 ArrayLength = Args.size();
5626 }
5627 EntityIndexToProcess = ArrayLength;
5628
5629 // ...the ith array element is copy-initialized with xi for each
5630 // 1 <= i <= k
5631 for (Expr *E : Args) {
5632 InitializedEntity SubEntity = InitializedEntity::InitializeElement(
5633 S.getASTContext(), EntityIndexToProcess, Entity);
5634 InitializationKind SubKind = InitializationKind::CreateForInit(
5635 E->getExprLoc(), /*isDirectInit=*/false, E);
5636 if (!HandleInitializedEntity(SubEntity, SubKind, E))
5637 return;
5638 }
5639 // ...and value-initialized for each k < i <= n;
5640 if (ArrayLength > Args.size() || Entity.isVariableLengthArrayNew()) {
5641 InitializedEntity SubEntity = InitializedEntity::InitializeElement(
5642 S.getASTContext(), Args.size(), Entity);
5643 InitializationKind SubKind = InitializationKind::CreateValue(
5644 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
5645 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr, &ArrayFiller))
5646 return;
5647 }
5648
5649 if (ResultType.isNull()) {
5650 ResultType = S.Context.getConstantArrayType(
5651 AT->getElementType(), llvm::APInt(/*numBits=*/32, ArrayLength),
5652 /*SizeExpr=*/nullptr, ArraySizeModifier::Normal, 0);
5653 }
5654 } else if (auto *RT = Entity.getType()->getAs<RecordType>()) {
5655 bool IsUnion = RT->isUnionType();
5656 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
5657 if (RD->isInvalidDecl()) {
5658 // Exit early to avoid confusion when processing members.
5659 // We do the same for braced list initialization in
5660 // `CheckStructUnionTypes`.
5661 Sequence.SetFailed(
5662 clang::InitializationSequence::FK_ParenthesizedListInitFailed);
5663 return;
5664 }
5665
5666 if (!IsUnion) {
5667 for (const CXXBaseSpecifier &Base : RD->bases()) {
5668 InitializedEntity SubEntity = InitializedEntity::InitializeBase(
5669 S.getASTContext(), &Base, false, &Entity);
5670 if (EntityIndexToProcess < Args.size()) {
5671 // C++ [dcl.init]p16.6.2.2.
5672 // ...the object is initialized is follows. Let e1, ..., en be the
5673 // elements of the aggregate([dcl.init.aggr]). Let x1, ..., xk be
5674 // the elements of the expression-list...The element ei is
5675 // copy-initialized with xi for 1 <= i <= k.
5676 Expr *E = Args[EntityIndexToProcess];
5677 InitializationKind SubKind = InitializationKind::CreateForInit(
5678 E->getExprLoc(), /*isDirectInit=*/false, E);
5679 if (!HandleInitializedEntity(SubEntity, SubKind, E))
5680 return;
5681 } else {
5682 // We've processed all of the args, but there are still base classes
5683 // that have to be initialized.
5684 // C++ [dcl.init]p17.6.2.2
5685 // The remaining elements...otherwise are value initialzed
5686 InitializationKind SubKind = InitializationKind::CreateValue(
5687 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
5688 /*IsImplicit=*/true);
5689 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
5690 return;
5691 }
5692 EntityIndexToProcess++;
5693 }
5694 }
5695
5696 for (FieldDecl *FD : RD->fields()) {
5697 // Unnamed bitfields should not be initialized at all, either with an arg
5698 // or by default.
5699 if (FD->isUnnamedBitField())
5700 continue;
5701
5702 InitializedEntity SubEntity =
5703 InitializedEntity::InitializeMemberFromParenAggInit(FD);
5704
5705 if (EntityIndexToProcess < Args.size()) {
5706 // ...The element ei is copy-initialized with xi for 1 <= i <= k.
5707 Expr *E = Args[EntityIndexToProcess];
5708
5709 // Incomplete array types indicate flexible array members. Do not allow
5710 // paren list initializations of structs with these members, as GCC
5711 // doesn't either.
5712 if (FD->getType()->isIncompleteArrayType()) {
5713 if (!VerifyOnly) {
5714 S.Diag(E->getBeginLoc(), diag::err_flexible_array_init)
5715 << SourceRange(E->getBeginLoc(), E->getEndLoc());
5716 S.Diag(FD->getLocation(), diag::note_flexible_array_member) << FD;
5717 }
5718 Sequence.SetFailed(
5719 InitializationSequence::FK_ParenthesizedListInitFailed);
5720 return;
5721 }
5722
5723 InitializationKind SubKind = InitializationKind::CreateForInit(
5724 E->getExprLoc(), /*isDirectInit=*/false, E);
5725 if (!HandleInitializedEntity(SubEntity, SubKind, E))
5726 return;
5727
5728 // Unions should have only one initializer expression, so we bail out
5729 // after processing the first field. If there are more initializers then
5730 // it will be caught when we later check whether EntityIndexToProcess is
5731 // less than Args.size();
5732 if (IsUnion) {
5733 InitializedFieldInUnion = FD;
5734 EntityIndexToProcess = 1;
5735 break;
5736 }
5737 } else {
5738 // We've processed all of the args, but there are still members that
5739 // have to be initialized.
5740 if (FD->hasInClassInitializer()) {
5741 if (!VerifyOnly) {
5742 // C++ [dcl.init]p16.6.2.2
5743 // The remaining elements are initialized with their default
5744 // member initializers, if any
5745 ExprResult DIE = S.BuildCXXDefaultInitExpr(
5746 Kind.getParenOrBraceRange().getEnd(), FD);
5747 if (DIE.isInvalid())
5748 return;
5749 S.checkInitializerLifetime(SubEntity, DIE.get());
5750 InitExprs.push_back(DIE.get());
5751 }
5752 } else {
5753 // C++ [dcl.init]p17.6.2.2
5754 // The remaining elements...otherwise are value initialzed
5755 if (FD->getType()->isReferenceType()) {
5756 Sequence.SetFailed(
5757 InitializationSequence::FK_ParenthesizedListInitFailed);
5758 if (!VerifyOnly) {
5759 SourceRange SR = Kind.getParenOrBraceRange();
5760 S.Diag(SR.getEnd(), diag::err_init_reference_member_uninitialized)
5761 << FD->getType() << SR;
5762 S.Diag(FD->getLocation(), diag::note_uninit_reference_member);
5763 }
5764 return;
5765 }
5766 InitializationKind SubKind = InitializationKind::CreateValue(
5767 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
5768 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
5769 return;
5770 }
5771 }
5772 EntityIndexToProcess++;
5773 }
5774 ResultType = Entity.getType();
5775 }
5776
5777 // Not all of the args have been processed, so there must've been more args
5778 // than were required to initialize the element.
5779 if (EntityIndexToProcess < Args.size()) {
5780 Sequence.SetFailed(InitializationSequence::FK_ParenthesizedListInitFailed);
5781 if (!VerifyOnly) {
5782 QualType T = Entity.getType();
5783 int InitKind = T->isArrayType() ? 0 : T->isUnionType() ? 3 : 4;
5784 SourceRange ExcessInitSR(Args[EntityIndexToProcess]->getBeginLoc(),
5785 Args.back()->getEndLoc());
5786 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
5787 << InitKind << ExcessInitSR;
5788 }
5789 return;
5790 }
5791
5792 if (VerifyOnly) {
5793 Sequence.setSequenceKind(InitializationSequence::NormalSequence);
5794 Sequence.AddParenthesizedListInitStep(Entity.getType());
5795 } else if (Result) {
5796 SourceRange SR = Kind.getParenOrBraceRange();
5797 auto *CPLIE = CXXParenListInitExpr::Create(
5798 S.getASTContext(), InitExprs, ResultType, Args.size(),
5799 Kind.getLocation(), SR.getBegin(), SR.getEnd());
5800 if (ArrayFiller)
5801 CPLIE->setArrayFiller(ArrayFiller);
5802 if (InitializedFieldInUnion)
5803 CPLIE->setInitializedFieldInUnion(InitializedFieldInUnion);
5804 *Result = CPLIE;
5805 S.Diag(Kind.getLocation(),
5806 diag::warn_cxx17_compat_aggregate_init_paren_list)
5807 << Kind.getLocation() << SR << ResultType;
5808 }
5809 }
5810
5811 /// Attempt a user-defined conversion between two types (C++ [dcl.init]),
5812 /// which enumerates all conversion functions and performs overload resolution
5813 /// to select the best.
TryUserDefinedConversion(Sema & S,QualType DestType,const InitializationKind & Kind,Expr * Initializer,InitializationSequence & Sequence,bool TopLevelOfInitList)5814 static void TryUserDefinedConversion(Sema &S,
5815 QualType DestType,
5816 const InitializationKind &Kind,
5817 Expr *Initializer,
5818 InitializationSequence &Sequence,
5819 bool TopLevelOfInitList) {
5820 assert(!DestType->isReferenceType() && "References are handled elsewhere");
5821 QualType SourceType = Initializer->getType();
5822 assert((DestType->isRecordType() || SourceType->isRecordType()) &&
5823 "Must have a class type to perform a user-defined conversion");
5824
5825 // Build the candidate set directly in the initialization sequence
5826 // structure, so that it will persist if we fail.
5827 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
5828 CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
5829 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
5830
5831 // Determine whether we are allowed to call explicit constructors or
5832 // explicit conversion operators.
5833 bool AllowExplicit = Kind.AllowExplicit();
5834
5835 if (const RecordType *DestRecordType = DestType->getAs<RecordType>()) {
5836 // The type we're converting to is a class type. Enumerate its constructors
5837 // to see if there is a suitable conversion.
5838 CXXRecordDecl *DestRecordDecl
5839 = cast<CXXRecordDecl>(DestRecordType->getDecl());
5840
5841 // Try to complete the type we're converting to.
5842 if (S.isCompleteType(Kind.getLocation(), DestType)) {
5843 for (NamedDecl *D : S.LookupConstructors(DestRecordDecl)) {
5844 auto Info = getConstructorInfo(D);
5845 if (!Info.Constructor)
5846 continue;
5847
5848 if (!Info.Constructor->isInvalidDecl() &&
5849 Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
5850 if (Info.ConstructorTmpl)
5851 S.AddTemplateOverloadCandidate(
5852 Info.ConstructorTmpl, Info.FoundDecl,
5853 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
5854 /*SuppressUserConversions=*/true,
5855 /*PartialOverloading*/ false, AllowExplicit);
5856 else
5857 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
5858 Initializer, CandidateSet,
5859 /*SuppressUserConversions=*/true,
5860 /*PartialOverloading*/ false, AllowExplicit);
5861 }
5862 }
5863 }
5864 }
5865
5866 SourceLocation DeclLoc = Initializer->getBeginLoc();
5867
5868 if (const RecordType *SourceRecordType = SourceType->getAs<RecordType>()) {
5869 // The type we're converting from is a class type, enumerate its conversion
5870 // functions.
5871
5872 // We can only enumerate the conversion functions for a complete type; if
5873 // the type isn't complete, simply skip this step.
5874 if (S.isCompleteType(DeclLoc, SourceType)) {
5875 CXXRecordDecl *SourceRecordDecl
5876 = cast<CXXRecordDecl>(SourceRecordType->getDecl());
5877
5878 const auto &Conversions =
5879 SourceRecordDecl->getVisibleConversionFunctions();
5880 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5881 NamedDecl *D = *I;
5882 CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
5883 if (isa<UsingShadowDecl>(D))
5884 D = cast<UsingShadowDecl>(D)->getTargetDecl();
5885
5886 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
5887 CXXConversionDecl *Conv;
5888 if (ConvTemplate)
5889 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
5890 else
5891 Conv = cast<CXXConversionDecl>(D);
5892
5893 if (ConvTemplate)
5894 S.AddTemplateConversionCandidate(
5895 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
5896 CandidateSet, AllowExplicit, AllowExplicit);
5897 else
5898 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
5899 DestType, CandidateSet, AllowExplicit,
5900 AllowExplicit);
5901 }
5902 }
5903 }
5904
5905 // Perform overload resolution. If it fails, return the failed result.
5906 OverloadCandidateSet::iterator Best;
5907 if (OverloadingResult Result
5908 = CandidateSet.BestViableFunction(S, DeclLoc, Best)) {
5909 Sequence.SetOverloadFailure(
5910 InitializationSequence::FK_UserConversionOverloadFailed, Result);
5911
5912 // [class.copy.elision]p3:
5913 // In some copy-initialization contexts, a two-stage overload resolution
5914 // is performed.
5915 // If the first overload resolution selects a deleted function, we also
5916 // need the initialization sequence to decide whether to perform the second
5917 // overload resolution.
5918 if (!(Result == OR_Deleted &&
5919 Kind.getKind() == InitializationKind::IK_Copy))
5920 return;
5921 }
5922
5923 FunctionDecl *Function = Best->Function;
5924 Function->setReferenced();
5925 bool HadMultipleCandidates = (CandidateSet.size() > 1);
5926
5927 if (isa<CXXConstructorDecl>(Function)) {
5928 // Add the user-defined conversion step. Any cv-qualification conversion is
5929 // subsumed by the initialization. Per DR5, the created temporary is of the
5930 // cv-unqualified type of the destination.
5931 Sequence.AddUserConversionStep(Function, Best->FoundDecl,
5932 DestType.getUnqualifiedType(),
5933 HadMultipleCandidates);
5934
5935 // C++14 and before:
5936 // - if the function is a constructor, the call initializes a temporary
5937 // of the cv-unqualified version of the destination type. The [...]
5938 // temporary [...] is then used to direct-initialize, according to the
5939 // rules above, the object that is the destination of the
5940 // copy-initialization.
5941 // Note that this just performs a simple object copy from the temporary.
5942 //
5943 // C++17:
5944 // - if the function is a constructor, the call is a prvalue of the
5945 // cv-unqualified version of the destination type whose return object
5946 // is initialized by the constructor. The call is used to
5947 // direct-initialize, according to the rules above, the object that
5948 // is the destination of the copy-initialization.
5949 // Therefore we need to do nothing further.
5950 //
5951 // FIXME: Mark this copy as extraneous.
5952 if (!S.getLangOpts().CPlusPlus17)
5953 Sequence.AddFinalCopy(DestType);
5954 else if (DestType.hasQualifiers())
5955 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
5956 return;
5957 }
5958
5959 // Add the user-defined conversion step that calls the conversion function.
5960 QualType ConvType = Function->getCallResultType();
5961 Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
5962 HadMultipleCandidates);
5963
5964 if (ConvType->getAs<RecordType>()) {
5965 // The call is used to direct-initialize [...] the object that is the
5966 // destination of the copy-initialization.
5967 //
5968 // In C++17, this does not call a constructor if we enter /17.6.1:
5969 // - If the initializer expression is a prvalue and the cv-unqualified
5970 // version of the source type is the same as the class of the
5971 // destination [... do not make an extra copy]
5972 //
5973 // FIXME: Mark this copy as extraneous.
5974 if (!S.getLangOpts().CPlusPlus17 ||
5975 Function->getReturnType()->isReferenceType() ||
5976 !S.Context.hasSameUnqualifiedType(ConvType, DestType))
5977 Sequence.AddFinalCopy(DestType);
5978 else if (!S.Context.hasSameType(ConvType, DestType))
5979 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
5980 return;
5981 }
5982
5983 // If the conversion following the call to the conversion function
5984 // is interesting, add it as a separate step.
5985 if (Best->FinalConversion.First || Best->FinalConversion.Second ||
5986 Best->FinalConversion.Third) {
5987 ImplicitConversionSequence ICS;
5988 ICS.setStandard();
5989 ICS.Standard = Best->FinalConversion;
5990 Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
5991 }
5992 }
5993
5994 /// An egregious hack for compatibility with libstdc++-4.2: in <tr1/hashtable>,
5995 /// a function with a pointer return type contains a 'return false;' statement.
5996 /// In C++11, 'false' is not a null pointer, so this breaks the build of any
5997 /// code using that header.
5998 ///
5999 /// Work around this by treating 'return false;' as zero-initializing the result
6000 /// if it's used in a pointer-returning function in a system header.
isLibstdcxxPointerReturnFalseHack(Sema & S,const InitializedEntity & Entity,const Expr * Init)6001 static bool isLibstdcxxPointerReturnFalseHack(Sema &S,
6002 const InitializedEntity &Entity,
6003 const Expr *Init) {
6004 return S.getLangOpts().CPlusPlus11 &&
6005 Entity.getKind() == InitializedEntity::EK_Result &&
6006 Entity.getType()->isPointerType() &&
6007 isa<CXXBoolLiteralExpr>(Init) &&
6008 !cast<CXXBoolLiteralExpr>(Init)->getValue() &&
6009 S.getSourceManager().isInSystemHeader(Init->getExprLoc());
6010 }
6011
6012 /// The non-zero enum values here are indexes into diagnostic alternatives.
6013 enum InvalidICRKind { IIK_okay, IIK_nonlocal, IIK_nonscalar };
6014
6015 /// Determines whether this expression is an acceptable ICR source.
isInvalidICRSource(ASTContext & C,Expr * e,bool isAddressOf,bool & isWeakAccess)6016 static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e,
6017 bool isAddressOf, bool &isWeakAccess) {
6018 // Skip parens.
6019 e = e->IgnoreParens();
6020
6021 // Skip address-of nodes.
6022 if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
6023 if (op->getOpcode() == UO_AddrOf)
6024 return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true,
6025 isWeakAccess);
6026
6027 // Skip certain casts.
6028 } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
6029 switch (ce->getCastKind()) {
6030 case CK_Dependent:
6031 case CK_BitCast:
6032 case CK_LValueBitCast:
6033 case CK_NoOp:
6034 return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess);
6035
6036 case CK_ArrayToPointerDecay:
6037 return IIK_nonscalar;
6038
6039 case CK_NullToPointer:
6040 return IIK_okay;
6041
6042 default:
6043 break;
6044 }
6045
6046 // If we have a declaration reference, it had better be a local variable.
6047 } else if (isa<DeclRefExpr>(e)) {
6048 // set isWeakAccess to true, to mean that there will be an implicit
6049 // load which requires a cleanup.
6050 if (e->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
6051 isWeakAccess = true;
6052
6053 if (!isAddressOf) return IIK_nonlocal;
6054
6055 VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
6056 if (!var) return IIK_nonlocal;
6057
6058 return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
6059
6060 // If we have a conditional operator, check both sides.
6061 } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
6062 if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf,
6063 isWeakAccess))
6064 return iik;
6065
6066 return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess);
6067
6068 // These are never scalar.
6069 } else if (isa<ArraySubscriptExpr>(e)) {
6070 return IIK_nonscalar;
6071
6072 // Otherwise, it needs to be a null pointer constant.
6073 } else {
6074 return (e->isNullPointerConstant(C, Expr::NPC_ValueDependentIsNull)
6075 ? IIK_okay : IIK_nonlocal);
6076 }
6077
6078 return IIK_nonlocal;
6079 }
6080
6081 /// Check whether the given expression is a valid operand for an
6082 /// indirect copy/restore.
checkIndirectCopyRestoreSource(Sema & S,Expr * src)6083 static void checkIndirectCopyRestoreSource(Sema &S, Expr *src) {
6084 assert(src->isPRValue());
6085 bool isWeakAccess = false;
6086 InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess);
6087 // If isWeakAccess to true, there will be an implicit
6088 // load which requires a cleanup.
6089 if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess)
6090 S.Cleanup.setExprNeedsCleanups(true);
6091
6092 if (iik == IIK_okay) return;
6093
6094 S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
6095 << ((unsigned) iik - 1) // shift index into diagnostic explanations
6096 << src->getSourceRange();
6097 }
6098
6099 /// Determine whether we have compatible array types for the
6100 /// purposes of GNU by-copy array initialization.
hasCompatibleArrayTypes(ASTContext & Context,const ArrayType * Dest,const ArrayType * Source)6101 static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest,
6102 const ArrayType *Source) {
6103 // If the source and destination array types are equivalent, we're
6104 // done.
6105 if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0)))
6106 return true;
6107
6108 // Make sure that the element types are the same.
6109 if (!Context.hasSameType(Dest->getElementType(), Source->getElementType()))
6110 return false;
6111
6112 // The only mismatch we allow is when the destination is an
6113 // incomplete array type and the source is a constant array type.
6114 return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
6115 }
6116
tryObjCWritebackConversion(Sema & S,InitializationSequence & Sequence,const InitializedEntity & Entity,Expr * Initializer)6117 static bool tryObjCWritebackConversion(Sema &S,
6118 InitializationSequence &Sequence,
6119 const InitializedEntity &Entity,
6120 Expr *Initializer) {
6121 bool ArrayDecay = false;
6122 QualType ArgType = Initializer->getType();
6123 QualType ArgPointee;
6124 if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
6125 ArrayDecay = true;
6126 ArgPointee = ArgArrayType->getElementType();
6127 ArgType = S.Context.getPointerType(ArgPointee);
6128 }
6129
6130 // Handle write-back conversion.
6131 QualType ConvertedArgType;
6132 if (!S.ObjC().isObjCWritebackConversion(ArgType, Entity.getType(),
6133 ConvertedArgType))
6134 return false;
6135
6136 // We should copy unless we're passing to an argument explicitly
6137 // marked 'out'.
6138 bool ShouldCopy = true;
6139 if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
6140 ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
6141
6142 // Do we need an lvalue conversion?
6143 if (ArrayDecay || Initializer->isGLValue()) {
6144 ImplicitConversionSequence ICS;
6145 ICS.setStandard();
6146 ICS.Standard.setAsIdentityConversion();
6147
6148 QualType ResultType;
6149 if (ArrayDecay) {
6150 ICS.Standard.First = ICK_Array_To_Pointer;
6151 ResultType = S.Context.getPointerType(ArgPointee);
6152 } else {
6153 ICS.Standard.First = ICK_Lvalue_To_Rvalue;
6154 ResultType = Initializer->getType().getNonLValueExprType(S.Context);
6155 }
6156
6157 Sequence.AddConversionSequenceStep(ICS, ResultType);
6158 }
6159
6160 Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
6161 return true;
6162 }
6163
TryOCLSamplerInitialization(Sema & S,InitializationSequence & Sequence,QualType DestType,Expr * Initializer)6164 static bool TryOCLSamplerInitialization(Sema &S,
6165 InitializationSequence &Sequence,
6166 QualType DestType,
6167 Expr *Initializer) {
6168 if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
6169 (!Initializer->isIntegerConstantExpr(S.Context) &&
6170 !Initializer->getType()->isSamplerT()))
6171 return false;
6172
6173 Sequence.AddOCLSamplerInitStep(DestType);
6174 return true;
6175 }
6176
IsZeroInitializer(Expr * Initializer,Sema & S)6177 static bool IsZeroInitializer(Expr *Initializer, Sema &S) {
6178 return Initializer->isIntegerConstantExpr(S.getASTContext()) &&
6179 (Initializer->EvaluateKnownConstInt(S.getASTContext()) == 0);
6180 }
6181
TryOCLZeroOpaqueTypeInitialization(Sema & S,InitializationSequence & Sequence,QualType DestType,Expr * Initializer)6182 static bool TryOCLZeroOpaqueTypeInitialization(Sema &S,
6183 InitializationSequence &Sequence,
6184 QualType DestType,
6185 Expr *Initializer) {
6186 if (!S.getLangOpts().OpenCL)
6187 return false;
6188
6189 //
6190 // OpenCL 1.2 spec, s6.12.10
6191 //
6192 // The event argument can also be used to associate the
6193 // async_work_group_copy with a previous async copy allowing
6194 // an event to be shared by multiple async copies; otherwise
6195 // event should be zero.
6196 //
6197 if (DestType->isEventT() || DestType->isQueueT()) {
6198 if (!IsZeroInitializer(Initializer, S))
6199 return false;
6200
6201 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6202 return true;
6203 }
6204
6205 // We should allow zero initialization for all types defined in the
6206 // cl_intel_device_side_avc_motion_estimation extension, except
6207 // intel_sub_group_avc_mce_payload_t and intel_sub_group_avc_mce_result_t.
6208 if (S.getOpenCLOptions().isAvailableOption(
6209 "cl_intel_device_side_avc_motion_estimation", S.getLangOpts()) &&
6210 DestType->isOCLIntelSubgroupAVCType()) {
6211 if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
6212 DestType->isOCLIntelSubgroupAVCMceResultType())
6213 return false;
6214 if (!IsZeroInitializer(Initializer, S))
6215 return false;
6216
6217 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6218 return true;
6219 }
6220
6221 return false;
6222 }
6223
InitializationSequence(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,bool TopLevelOfInitList,bool TreatUnavailableAsInvalid)6224 InitializationSequence::InitializationSequence(
6225 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
6226 MultiExprArg Args, bool TopLevelOfInitList, bool TreatUnavailableAsInvalid)
6227 : FailedOverloadResult(OR_Success),
6228 FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) {
6229 InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList,
6230 TreatUnavailableAsInvalid);
6231 }
6232
6233 /// Tries to get a FunctionDecl out of `E`. If it succeeds and we can take the
6234 /// address of that function, this returns true. Otherwise, it returns false.
isExprAnUnaddressableFunction(Sema & S,const Expr * E)6235 static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E) {
6236 auto *DRE = dyn_cast<DeclRefExpr>(E);
6237 if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
6238 return false;
6239
6240 return !S.checkAddressOfFunctionIsAvailable(
6241 cast<FunctionDecl>(DRE->getDecl()));
6242 }
6243
6244 /// Determine whether we can perform an elementwise array copy for this kind
6245 /// of entity.
canPerformArrayCopy(const InitializedEntity & Entity)6246 static bool canPerformArrayCopy(const InitializedEntity &Entity) {
6247 switch (Entity.getKind()) {
6248 case InitializedEntity::EK_LambdaCapture:
6249 // C++ [expr.prim.lambda]p24:
6250 // For array members, the array elements are direct-initialized in
6251 // increasing subscript order.
6252 return true;
6253
6254 case InitializedEntity::EK_Variable:
6255 // C++ [dcl.decomp]p1:
6256 // [...] each element is copy-initialized or direct-initialized from the
6257 // corresponding element of the assignment-expression [...]
6258 return isa<DecompositionDecl>(Entity.getDecl());
6259
6260 case InitializedEntity::EK_Member:
6261 // C++ [class.copy.ctor]p14:
6262 // - if the member is an array, each element is direct-initialized with
6263 // the corresponding subobject of x
6264 return Entity.isImplicitMemberInitializer();
6265
6266 case InitializedEntity::EK_ArrayElement:
6267 // All the above cases are intended to apply recursively, even though none
6268 // of them actually say that.
6269 if (auto *E = Entity.getParent())
6270 return canPerformArrayCopy(*E);
6271 break;
6272
6273 default:
6274 break;
6275 }
6276
6277 return false;
6278 }
6279
InitializeFrom(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,bool TopLevelOfInitList,bool TreatUnavailableAsInvalid)6280 void InitializationSequence::InitializeFrom(Sema &S,
6281 const InitializedEntity &Entity,
6282 const InitializationKind &Kind,
6283 MultiExprArg Args,
6284 bool TopLevelOfInitList,
6285 bool TreatUnavailableAsInvalid) {
6286 ASTContext &Context = S.Context;
6287
6288 // Eliminate non-overload placeholder types in the arguments. We
6289 // need to do this before checking whether types are dependent
6290 // because lowering a pseudo-object expression might well give us
6291 // something of dependent type.
6292 for (unsigned I = 0, E = Args.size(); I != E; ++I)
6293 if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
6294 // FIXME: should we be doing this here?
6295 ExprResult result = S.CheckPlaceholderExpr(Args[I]);
6296 if (result.isInvalid()) {
6297 SetFailed(FK_PlaceholderType);
6298 return;
6299 }
6300 Args[I] = result.get();
6301 }
6302
6303 // C++0x [dcl.init]p16:
6304 // The semantics of initializers are as follows. The destination type is
6305 // the type of the object or reference being initialized and the source
6306 // type is the type of the initializer expression. The source type is not
6307 // defined when the initializer is a braced-init-list or when it is a
6308 // parenthesized list of expressions.
6309 QualType DestType = Entity.getType();
6310
6311 if (DestType->isDependentType() ||
6312 Expr::hasAnyTypeDependentArguments(Args)) {
6313 SequenceKind = DependentSequence;
6314 return;
6315 }
6316
6317 // Almost everything is a normal sequence.
6318 setSequenceKind(NormalSequence);
6319
6320 QualType SourceType;
6321 Expr *Initializer = nullptr;
6322 if (Args.size() == 1) {
6323 Initializer = Args[0];
6324 if (S.getLangOpts().ObjC) {
6325 if (S.ObjC().CheckObjCBridgeRelatedConversions(
6326 Initializer->getBeginLoc(), DestType, Initializer->getType(),
6327 Initializer) ||
6328 S.ObjC().CheckConversionToObjCLiteral(DestType, Initializer))
6329 Args[0] = Initializer;
6330 }
6331 if (!isa<InitListExpr>(Initializer))
6332 SourceType = Initializer->getType();
6333 }
6334
6335 // - If the initializer is a (non-parenthesized) braced-init-list, the
6336 // object is list-initialized (8.5.4).
6337 if (Kind.getKind() != InitializationKind::IK_Direct) {
6338 if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) {
6339 TryListInitialization(S, Entity, Kind, InitList, *this,
6340 TreatUnavailableAsInvalid);
6341 return;
6342 }
6343 }
6344
6345 // - If the destination type is a reference type, see 8.5.3.
6346 if (DestType->isReferenceType()) {
6347 // C++0x [dcl.init.ref]p1:
6348 // A variable declared to be a T& or T&&, that is, "reference to type T"
6349 // (8.3.2), shall be initialized by an object, or function, of type T or
6350 // by an object that can be converted into a T.
6351 // (Therefore, multiple arguments are not permitted.)
6352 if (Args.size() != 1)
6353 SetFailed(FK_TooManyInitsForReference);
6354 // C++17 [dcl.init.ref]p5:
6355 // A reference [...] is initialized by an expression [...] as follows:
6356 // If the initializer is not an expression, presumably we should reject,
6357 // but the standard fails to actually say so.
6358 else if (isa<InitListExpr>(Args[0]))
6359 SetFailed(FK_ParenthesizedListInitForReference);
6360 else
6361 TryReferenceInitialization(S, Entity, Kind, Args[0], *this,
6362 TopLevelOfInitList);
6363 return;
6364 }
6365
6366 // - If the initializer is (), the object is value-initialized.
6367 if (Kind.getKind() == InitializationKind::IK_Value ||
6368 (Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) {
6369 TryValueInitialization(S, Entity, Kind, *this);
6370 return;
6371 }
6372
6373 // Handle default initialization.
6374 if (Kind.getKind() == InitializationKind::IK_Default) {
6375 TryDefaultInitialization(S, Entity, Kind, *this);
6376 return;
6377 }
6378
6379 // - If the destination type is an array of characters, an array of
6380 // char16_t, an array of char32_t, or an array of wchar_t, and the
6381 // initializer is a string literal, see 8.5.2.
6382 // - Otherwise, if the destination type is an array, the program is
6383 // ill-formed.
6384 // - Except in HLSL, where non-decaying array parameters behave like
6385 // non-array types for initialization.
6386 if (DestType->isArrayType() && !DestType->isArrayParameterType()) {
6387 const ArrayType *DestAT = Context.getAsArrayType(DestType);
6388 if (Initializer && isa<VariableArrayType>(DestAT)) {
6389 SetFailed(FK_VariableLengthArrayHasInitializer);
6390 return;
6391 }
6392
6393 if (Initializer) {
6394 switch (IsStringInit(Initializer, DestAT, Context)) {
6395 case SIF_None:
6396 TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this);
6397 return;
6398 case SIF_NarrowStringIntoWideChar:
6399 SetFailed(FK_NarrowStringIntoWideCharArray);
6400 return;
6401 case SIF_WideStringIntoChar:
6402 SetFailed(FK_WideStringIntoCharArray);
6403 return;
6404 case SIF_IncompatWideStringIntoWideChar:
6405 SetFailed(FK_IncompatWideStringIntoWideChar);
6406 return;
6407 case SIF_PlainStringIntoUTF8Char:
6408 SetFailed(FK_PlainStringIntoUTF8Char);
6409 return;
6410 case SIF_UTF8StringIntoPlainChar:
6411 SetFailed(FK_UTF8StringIntoPlainChar);
6412 return;
6413 case SIF_Other:
6414 break;
6415 }
6416 }
6417
6418 // Some kinds of initialization permit an array to be initialized from
6419 // another array of the same type, and perform elementwise initialization.
6420 if (Initializer && isa<ConstantArrayType>(DestAT) &&
6421 S.Context.hasSameUnqualifiedType(Initializer->getType(),
6422 Entity.getType()) &&
6423 canPerformArrayCopy(Entity)) {
6424 // If source is a prvalue, use it directly.
6425 if (Initializer->isPRValue()) {
6426 AddArrayInitStep(DestType, /*IsGNUExtension*/false);
6427 return;
6428 }
6429
6430 // Emit element-at-a-time copy loop.
6431 InitializedEntity Element =
6432 InitializedEntity::InitializeElement(S.Context, 0, Entity);
6433 QualType InitEltT =
6434 Context.getAsArrayType(Initializer->getType())->getElementType();
6435 OpaqueValueExpr OVE(Initializer->getExprLoc(), InitEltT,
6436 Initializer->getValueKind(),
6437 Initializer->getObjectKind());
6438 Expr *OVEAsExpr = &OVE;
6439 InitializeFrom(S, Element, Kind, OVEAsExpr, TopLevelOfInitList,
6440 TreatUnavailableAsInvalid);
6441 if (!Failed())
6442 AddArrayInitLoopStep(Entity.getType(), InitEltT);
6443 return;
6444 }
6445
6446 // Note: as an GNU C extension, we allow initialization of an
6447 // array from a compound literal that creates an array of the same
6448 // type, so long as the initializer has no side effects.
6449 if (!S.getLangOpts().CPlusPlus && Initializer &&
6450 isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) &&
6451 Initializer->getType()->isArrayType()) {
6452 const ArrayType *SourceAT
6453 = Context.getAsArrayType(Initializer->getType());
6454 if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT))
6455 SetFailed(FK_ArrayTypeMismatch);
6456 else if (Initializer->HasSideEffects(S.Context))
6457 SetFailed(FK_NonConstantArrayInit);
6458 else {
6459 AddArrayInitStep(DestType, /*IsGNUExtension*/true);
6460 }
6461 }
6462 // Note: as a GNU C++ extension, we allow list-initialization of a
6463 // class member of array type from a parenthesized initializer list.
6464 else if (S.getLangOpts().CPlusPlus &&
6465 Entity.getKind() == InitializedEntity::EK_Member &&
6466 isa_and_nonnull<InitListExpr>(Initializer)) {
6467 TryListInitialization(S, Entity, Kind, cast<InitListExpr>(Initializer),
6468 *this, TreatUnavailableAsInvalid);
6469 AddParenthesizedArrayInitStep(DestType);
6470 } else if (S.getLangOpts().CPlusPlus20 && !TopLevelOfInitList &&
6471 Kind.getKind() == InitializationKind::IK_Direct)
6472 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
6473 /*VerifyOnly=*/true);
6474 else if (DestAT->getElementType()->isCharType())
6475 SetFailed(FK_ArrayNeedsInitListOrStringLiteral);
6476 else if (IsWideCharCompatible(DestAT->getElementType(), Context))
6477 SetFailed(FK_ArrayNeedsInitListOrWideStringLiteral);
6478 else
6479 SetFailed(FK_ArrayNeedsInitList);
6480
6481 return;
6482 }
6483
6484 // Determine whether we should consider writeback conversions for
6485 // Objective-C ARC.
6486 bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount &&
6487 Entity.isParameterKind();
6488
6489 if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
6490 return;
6491
6492 // We're at the end of the line for C: it's either a write-back conversion
6493 // or it's a C assignment. There's no need to check anything else.
6494 if (!S.getLangOpts().CPlusPlus) {
6495 assert(Initializer && "Initializer must be non-null");
6496 // If allowed, check whether this is an Objective-C writeback conversion.
6497 if (allowObjCWritebackConversion &&
6498 tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
6499 return;
6500 }
6501
6502 if (TryOCLZeroOpaqueTypeInitialization(S, *this, DestType, Initializer))
6503 return;
6504
6505 // Handle initialization in C
6506 AddCAssignmentStep(DestType);
6507 MaybeProduceObjCObject(S, *this, Entity);
6508 return;
6509 }
6510
6511 assert(S.getLangOpts().CPlusPlus);
6512
6513 // - If the destination type is a (possibly cv-qualified) class type:
6514 if (DestType->isRecordType()) {
6515 // - If the initialization is direct-initialization, or if it is
6516 // copy-initialization where the cv-unqualified version of the
6517 // source type is the same class as, or a derived class of, the
6518 // class of the destination, constructors are considered. [...]
6519 if (Kind.getKind() == InitializationKind::IK_Direct ||
6520 (Kind.getKind() == InitializationKind::IK_Copy &&
6521 (Context.hasSameUnqualifiedType(SourceType, DestType) ||
6522 (Initializer && S.IsDerivedFrom(Initializer->getBeginLoc(),
6523 SourceType, DestType))))) {
6524 TryConstructorInitialization(S, Entity, Kind, Args, DestType, DestType,
6525 *this);
6526
6527 // We fall back to the "no matching constructor" path if the
6528 // failed candidate set has functions other than the three default
6529 // constructors. For example, conversion function.
6530 if (const auto *RD =
6531 dyn_cast<CXXRecordDecl>(DestType->getAs<RecordType>()->getDecl());
6532 // In general, we should call isCompleteType for RD to check its
6533 // completeness, we don't call it here as it was already called in the
6534 // above TryConstructorInitialization.
6535 S.getLangOpts().CPlusPlus20 && RD && RD->hasDefinition() &&
6536 RD->isAggregate() && Failed() &&
6537 getFailureKind() == FK_ConstructorOverloadFailed) {
6538 // Do not attempt paren list initialization if overload resolution
6539 // resolves to a deleted function .
6540 //
6541 // We may reach this condition if we have a union wrapping a class with
6542 // a non-trivial copy or move constructor and we call one of those two
6543 // constructors. The union is an aggregate, but the matched constructor
6544 // is implicitly deleted, so we need to prevent aggregate initialization
6545 // (otherwise, it'll attempt aggregate initialization by initializing
6546 // the first element with a reference to the union).
6547 OverloadCandidateSet::iterator Best;
6548 OverloadingResult OR = getFailedCandidateSet().BestViableFunction(
6549 S, Kind.getLocation(), Best);
6550 if (OR != OverloadingResult::OR_Deleted) {
6551 // C++20 [dcl.init] 17.6.2.2:
6552 // - Otherwise, if no constructor is viable, the destination type is
6553 // an
6554 // aggregate class, and the initializer is a parenthesized
6555 // expression-list.
6556 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
6557 /*VerifyOnly=*/true);
6558 }
6559 }
6560 } else {
6561 // - Otherwise (i.e., for the remaining copy-initialization cases),
6562 // user-defined conversion sequences that can convert from the
6563 // source type to the destination type or (when a conversion
6564 // function is used) to a derived class thereof are enumerated as
6565 // described in 13.3.1.4, and the best one is chosen through
6566 // overload resolution (13.3).
6567 assert(Initializer && "Initializer must be non-null");
6568 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
6569 TopLevelOfInitList);
6570 }
6571 return;
6572 }
6573
6574 assert(Args.size() >= 1 && "Zero-argument case handled above");
6575
6576 // For HLSL ext vector types we allow list initialization behavior for C++
6577 // constructor syntax. This is accomplished by converting initialization
6578 // arguments an InitListExpr late.
6579 if (S.getLangOpts().HLSL && Args.size() > 1 && DestType->isExtVectorType() &&
6580 (SourceType.isNull() ||
6581 !Context.hasSameUnqualifiedType(SourceType, DestType))) {
6582
6583 llvm::SmallVector<Expr *> InitArgs;
6584 for (auto *Arg : Args) {
6585 if (Arg->getType()->isExtVectorType()) {
6586 const auto *VTy = Arg->getType()->castAs<ExtVectorType>();
6587 unsigned Elm = VTy->getNumElements();
6588 for (unsigned Idx = 0; Idx < Elm; ++Idx) {
6589 InitArgs.emplace_back(new (Context) ArraySubscriptExpr(
6590 Arg,
6591 IntegerLiteral::Create(
6592 Context, llvm::APInt(Context.getIntWidth(Context.IntTy), Idx),
6593 Context.IntTy, SourceLocation()),
6594 VTy->getElementType(), Arg->getValueKind(), Arg->getObjectKind(),
6595 SourceLocation()));
6596 }
6597 } else
6598 InitArgs.emplace_back(Arg);
6599 }
6600 InitListExpr *ILE = new (Context) InitListExpr(
6601 S.getASTContext(), SourceLocation(), InitArgs, SourceLocation());
6602 Args[0] = ILE;
6603 AddListInitializationStep(DestType);
6604 return;
6605 }
6606
6607 // The remaining cases all need a source type.
6608 if (Args.size() > 1) {
6609 SetFailed(FK_TooManyInitsForScalar);
6610 return;
6611 } else if (isa<InitListExpr>(Args[0])) {
6612 SetFailed(FK_ParenthesizedListInitForScalar);
6613 return;
6614 }
6615
6616 // - Otherwise, if the source type is a (possibly cv-qualified) class
6617 // type, conversion functions are considered.
6618 if (!SourceType.isNull() && SourceType->isRecordType()) {
6619 assert(Initializer && "Initializer must be non-null");
6620 // For a conversion to _Atomic(T) from either T or a class type derived
6621 // from T, initialize the T object then convert to _Atomic type.
6622 bool NeedAtomicConversion = false;
6623 if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) {
6624 if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) ||
6625 S.IsDerivedFrom(Initializer->getBeginLoc(), SourceType,
6626 Atomic->getValueType())) {
6627 DestType = Atomic->getValueType();
6628 NeedAtomicConversion = true;
6629 }
6630 }
6631
6632 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
6633 TopLevelOfInitList);
6634 MaybeProduceObjCObject(S, *this, Entity);
6635 if (!Failed() && NeedAtomicConversion)
6636 AddAtomicConversionStep(Entity.getType());
6637 return;
6638 }
6639
6640 // - Otherwise, if the initialization is direct-initialization, the source
6641 // type is std::nullptr_t, and the destination type is bool, the initial
6642 // value of the object being initialized is false.
6643 if (!SourceType.isNull() && SourceType->isNullPtrType() &&
6644 DestType->isBooleanType() &&
6645 Kind.getKind() == InitializationKind::IK_Direct) {
6646 AddConversionSequenceStep(
6647 ImplicitConversionSequence::getNullptrToBool(SourceType, DestType,
6648 Initializer->isGLValue()),
6649 DestType);
6650 return;
6651 }
6652
6653 // - Otherwise, the initial value of the object being initialized is the
6654 // (possibly converted) value of the initializer expression. Standard
6655 // conversions (Clause 4) will be used, if necessary, to convert the
6656 // initializer expression to the cv-unqualified version of the
6657 // destination type; no user-defined conversions are considered.
6658
6659 ImplicitConversionSequence ICS
6660 = S.TryImplicitConversion(Initializer, DestType,
6661 /*SuppressUserConversions*/true,
6662 Sema::AllowedExplicit::None,
6663 /*InOverloadResolution*/ false,
6664 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
6665 allowObjCWritebackConversion);
6666
6667 if (ICS.isStandard() &&
6668 ICS.Standard.Second == ICK_Writeback_Conversion) {
6669 // Objective-C ARC writeback conversion.
6670
6671 // We should copy unless we're passing to an argument explicitly
6672 // marked 'out'.
6673 bool ShouldCopy = true;
6674 if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
6675 ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
6676
6677 // If there was an lvalue adjustment, add it as a separate conversion.
6678 if (ICS.Standard.First == ICK_Array_To_Pointer ||
6679 ICS.Standard.First == ICK_Lvalue_To_Rvalue) {
6680 ImplicitConversionSequence LvalueICS;
6681 LvalueICS.setStandard();
6682 LvalueICS.Standard.setAsIdentityConversion();
6683 LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
6684 LvalueICS.Standard.First = ICS.Standard.First;
6685 AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
6686 }
6687
6688 AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy);
6689 } else if (ICS.isBad()) {
6690 if (isLibstdcxxPointerReturnFalseHack(S, Entity, Initializer))
6691 AddZeroInitializationStep(Entity.getType());
6692 else if (DeclAccessPair Found;
6693 Initializer->getType() == Context.OverloadTy &&
6694 !S.ResolveAddressOfOverloadedFunction(Initializer, DestType,
6695 /*Complain=*/false, Found))
6696 SetFailed(InitializationSequence::FK_AddressOfOverloadFailed);
6697 else if (Initializer->getType()->isFunctionType() &&
6698 isExprAnUnaddressableFunction(S, Initializer))
6699 SetFailed(InitializationSequence::FK_AddressOfUnaddressableFunction);
6700 else
6701 SetFailed(InitializationSequence::FK_ConversionFailed);
6702 } else {
6703 AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
6704
6705 MaybeProduceObjCObject(S, *this, Entity);
6706 }
6707 }
6708
~InitializationSequence()6709 InitializationSequence::~InitializationSequence() {
6710 for (auto &S : Steps)
6711 S.Destroy();
6712 }
6713
6714 //===----------------------------------------------------------------------===//
6715 // Perform initialization
6716 //===----------------------------------------------------------------------===//
6717 static Sema::AssignmentAction
getAssignmentAction(const InitializedEntity & Entity,bool Diagnose=false)6718 getAssignmentAction(const InitializedEntity &Entity, bool Diagnose = false) {
6719 switch(Entity.getKind()) {
6720 case InitializedEntity::EK_Variable:
6721 case InitializedEntity::EK_New:
6722 case InitializedEntity::EK_Exception:
6723 case InitializedEntity::EK_Base:
6724 case InitializedEntity::EK_Delegating:
6725 return Sema::AA_Initializing;
6726
6727 case InitializedEntity::EK_Parameter:
6728 if (Entity.getDecl() &&
6729 isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
6730 return Sema::AA_Sending;
6731
6732 return Sema::AA_Passing;
6733
6734 case InitializedEntity::EK_Parameter_CF_Audited:
6735 if (Entity.getDecl() &&
6736 isa<ObjCMethodDecl>(Entity.getDecl()->getDeclContext()))
6737 return Sema::AA_Sending;
6738
6739 return !Diagnose ? Sema::AA_Passing : Sema::AA_Passing_CFAudited;
6740
6741 case InitializedEntity::EK_Result:
6742 case InitializedEntity::EK_StmtExprResult: // FIXME: Not quite right.
6743 return Sema::AA_Returning;
6744
6745 case InitializedEntity::EK_Temporary:
6746 case InitializedEntity::EK_RelatedResult:
6747 // FIXME: Can we tell apart casting vs. converting?
6748 return Sema::AA_Casting;
6749
6750 case InitializedEntity::EK_TemplateParameter:
6751 // This is really initialization, but refer to it as conversion for
6752 // consistency with CheckConvertedConstantExpression.
6753 return Sema::AA_Converting;
6754
6755 case InitializedEntity::EK_Member:
6756 case InitializedEntity::EK_ParenAggInitMember:
6757 case InitializedEntity::EK_Binding:
6758 case InitializedEntity::EK_ArrayElement:
6759 case InitializedEntity::EK_VectorElement:
6760 case InitializedEntity::EK_ComplexElement:
6761 case InitializedEntity::EK_BlockElement:
6762 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6763 case InitializedEntity::EK_LambdaCapture:
6764 case InitializedEntity::EK_CompoundLiteralInit:
6765 return Sema::AA_Initializing;
6766 }
6767
6768 llvm_unreachable("Invalid EntityKind!");
6769 }
6770
6771 /// Whether we should bind a created object as a temporary when
6772 /// initializing the given entity.
shouldBindAsTemporary(const InitializedEntity & Entity)6773 static bool shouldBindAsTemporary(const InitializedEntity &Entity) {
6774 switch (Entity.getKind()) {
6775 case InitializedEntity::EK_ArrayElement:
6776 case InitializedEntity::EK_Member:
6777 case InitializedEntity::EK_ParenAggInitMember:
6778 case InitializedEntity::EK_Result:
6779 case InitializedEntity::EK_StmtExprResult:
6780 case InitializedEntity::EK_New:
6781 case InitializedEntity::EK_Variable:
6782 case InitializedEntity::EK_Base:
6783 case InitializedEntity::EK_Delegating:
6784 case InitializedEntity::EK_VectorElement:
6785 case InitializedEntity::EK_ComplexElement:
6786 case InitializedEntity::EK_Exception:
6787 case InitializedEntity::EK_BlockElement:
6788 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6789 case InitializedEntity::EK_LambdaCapture:
6790 case InitializedEntity::EK_CompoundLiteralInit:
6791 case InitializedEntity::EK_TemplateParameter:
6792 return false;
6793
6794 case InitializedEntity::EK_Parameter:
6795 case InitializedEntity::EK_Parameter_CF_Audited:
6796 case InitializedEntity::EK_Temporary:
6797 case InitializedEntity::EK_RelatedResult:
6798 case InitializedEntity::EK_Binding:
6799 return true;
6800 }
6801
6802 llvm_unreachable("missed an InitializedEntity kind?");
6803 }
6804
6805 /// Whether the given entity, when initialized with an object
6806 /// created for that initialization, requires destruction.
shouldDestroyEntity(const InitializedEntity & Entity)6807 static bool shouldDestroyEntity(const InitializedEntity &Entity) {
6808 switch (Entity.getKind()) {
6809 case InitializedEntity::EK_Result:
6810 case InitializedEntity::EK_StmtExprResult:
6811 case InitializedEntity::EK_New:
6812 case InitializedEntity::EK_Base:
6813 case InitializedEntity::EK_Delegating:
6814 case InitializedEntity::EK_VectorElement:
6815 case InitializedEntity::EK_ComplexElement:
6816 case InitializedEntity::EK_BlockElement:
6817 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6818 case InitializedEntity::EK_LambdaCapture:
6819 return false;
6820
6821 case InitializedEntity::EK_Member:
6822 case InitializedEntity::EK_ParenAggInitMember:
6823 case InitializedEntity::EK_Binding:
6824 case InitializedEntity::EK_Variable:
6825 case InitializedEntity::EK_Parameter:
6826 case InitializedEntity::EK_Parameter_CF_Audited:
6827 case InitializedEntity::EK_TemplateParameter:
6828 case InitializedEntity::EK_Temporary:
6829 case InitializedEntity::EK_ArrayElement:
6830 case InitializedEntity::EK_Exception:
6831 case InitializedEntity::EK_CompoundLiteralInit:
6832 case InitializedEntity::EK_RelatedResult:
6833 return true;
6834 }
6835
6836 llvm_unreachable("missed an InitializedEntity kind?");
6837 }
6838
6839 /// Get the location at which initialization diagnostics should appear.
getInitializationLoc(const InitializedEntity & Entity,Expr * Initializer)6840 static SourceLocation getInitializationLoc(const InitializedEntity &Entity,
6841 Expr *Initializer) {
6842 switch (Entity.getKind()) {
6843 case InitializedEntity::EK_Result:
6844 case InitializedEntity::EK_StmtExprResult:
6845 return Entity.getReturnLoc();
6846
6847 case InitializedEntity::EK_Exception:
6848 return Entity.getThrowLoc();
6849
6850 case InitializedEntity::EK_Variable:
6851 case InitializedEntity::EK_Binding:
6852 return Entity.getDecl()->getLocation();
6853
6854 case InitializedEntity::EK_LambdaCapture:
6855 return Entity.getCaptureLoc();
6856
6857 case InitializedEntity::EK_ArrayElement:
6858 case InitializedEntity::EK_Member:
6859 case InitializedEntity::EK_ParenAggInitMember:
6860 case InitializedEntity::EK_Parameter:
6861 case InitializedEntity::EK_Parameter_CF_Audited:
6862 case InitializedEntity::EK_TemplateParameter:
6863 case InitializedEntity::EK_Temporary:
6864 case InitializedEntity::EK_New:
6865 case InitializedEntity::EK_Base:
6866 case InitializedEntity::EK_Delegating:
6867 case InitializedEntity::EK_VectorElement:
6868 case InitializedEntity::EK_ComplexElement:
6869 case InitializedEntity::EK_BlockElement:
6870 case InitializedEntity::EK_LambdaToBlockConversionBlockElement:
6871 case InitializedEntity::EK_CompoundLiteralInit:
6872 case InitializedEntity::EK_RelatedResult:
6873 return Initializer->getBeginLoc();
6874 }
6875 llvm_unreachable("missed an InitializedEntity kind?");
6876 }
6877
6878 /// Make a (potentially elidable) temporary copy of the object
6879 /// provided by the given initializer by calling the appropriate copy
6880 /// constructor.
6881 ///
6882 /// \param S The Sema object used for type-checking.
6883 ///
6884 /// \param T The type of the temporary object, which must either be
6885 /// the type of the initializer expression or a superclass thereof.
6886 ///
6887 /// \param Entity The entity being initialized.
6888 ///
6889 /// \param CurInit The initializer expression.
6890 ///
6891 /// \param IsExtraneousCopy Whether this is an "extraneous" copy that
6892 /// is permitted in C++03 (but not C++0x) when binding a reference to
6893 /// an rvalue.
6894 ///
6895 /// \returns An expression that copies the initializer expression into
6896 /// a temporary object, or an error expression if a copy could not be
6897 /// created.
CopyObject(Sema & S,QualType T,const InitializedEntity & Entity,ExprResult CurInit,bool IsExtraneousCopy)6898 static ExprResult CopyObject(Sema &S,
6899 QualType T,
6900 const InitializedEntity &Entity,
6901 ExprResult CurInit,
6902 bool IsExtraneousCopy) {
6903 if (CurInit.isInvalid())
6904 return CurInit;
6905 // Determine which class type we're copying to.
6906 Expr *CurInitExpr = (Expr *)CurInit.get();
6907 CXXRecordDecl *Class = nullptr;
6908 if (const RecordType *Record = T->getAs<RecordType>())
6909 Class = cast<CXXRecordDecl>(Record->getDecl());
6910 if (!Class)
6911 return CurInit;
6912
6913 SourceLocation Loc = getInitializationLoc(Entity, CurInit.get());
6914
6915 // Make sure that the type we are copying is complete.
6916 if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))
6917 return CurInit;
6918
6919 // Perform overload resolution using the class's constructors. Per
6920 // C++11 [dcl.init]p16, second bullet for class types, this initialization
6921 // is direct-initialization.
6922 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
6923 DeclContext::lookup_result Ctors = S.LookupConstructors(Class);
6924
6925 OverloadCandidateSet::iterator Best;
6926 switch (ResolveConstructorOverload(
6927 S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
6928 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
6929 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
6930 /*RequireActualConstructor=*/false,
6931 /*SecondStepOfCopyInit=*/true)) {
6932 case OR_Success:
6933 break;
6934
6935 case OR_No_Viable_Function:
6936 CandidateSet.NoteCandidates(
6937 PartialDiagnosticAt(
6938 Loc, S.PDiag(IsExtraneousCopy && !S.isSFINAEContext()
6939 ? diag::ext_rvalue_to_reference_temp_copy_no_viable
6940 : diag::err_temp_copy_no_viable)
6941 << (int)Entity.getKind() << CurInitExpr->getType()
6942 << CurInitExpr->getSourceRange()),
6943 S, OCD_AllCandidates, CurInitExpr);
6944 if (!IsExtraneousCopy || S.isSFINAEContext())
6945 return ExprError();
6946 return CurInit;
6947
6948 case OR_Ambiguous:
6949 CandidateSet.NoteCandidates(
6950 PartialDiagnosticAt(Loc, S.PDiag(diag::err_temp_copy_ambiguous)
6951 << (int)Entity.getKind()
6952 << CurInitExpr->getType()
6953 << CurInitExpr->getSourceRange()),
6954 S, OCD_AmbiguousCandidates, CurInitExpr);
6955 return ExprError();
6956
6957 case OR_Deleted:
6958 S.Diag(Loc, diag::err_temp_copy_deleted)
6959 << (int)Entity.getKind() << CurInitExpr->getType()
6960 << CurInitExpr->getSourceRange();
6961 S.NoteDeletedFunction(Best->Function);
6962 return ExprError();
6963 }
6964
6965 bool HadMultipleCandidates = CandidateSet.size() > 1;
6966
6967 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function);
6968 SmallVector<Expr*, 8> ConstructorArgs;
6969 CurInit.get(); // Ownership transferred into MultiExprArg, below.
6970
6971 S.CheckConstructorAccess(Loc, Constructor, Best->FoundDecl, Entity,
6972 IsExtraneousCopy);
6973
6974 if (IsExtraneousCopy) {
6975 // If this is a totally extraneous copy for C++03 reference
6976 // binding purposes, just return the original initialization
6977 // expression. We don't generate an (elided) copy operation here
6978 // because doing so would require us to pass down a flag to avoid
6979 // infinite recursion, where each step adds another extraneous,
6980 // elidable copy.
6981
6982 // Instantiate the default arguments of any extra parameters in
6983 // the selected copy constructor, as if we were going to create a
6984 // proper call to the copy constructor.
6985 for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
6986 ParmVarDecl *Parm = Constructor->getParamDecl(I);
6987 if (S.RequireCompleteType(Loc, Parm->getType(),
6988 diag::err_call_incomplete_argument))
6989 break;
6990
6991 // Build the default argument expression; we don't actually care
6992 // if this succeeds or not, because this routine will complain
6993 // if there was a problem.
6994 S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm);
6995 }
6996
6997 return CurInitExpr;
6998 }
6999
7000 // Determine the arguments required to actually perform the
7001 // constructor call (we might have derived-to-base conversions, or
7002 // the copy constructor may have default arguments).
7003 if (S.CompleteConstructorCall(Constructor, T, CurInitExpr, Loc,
7004 ConstructorArgs))
7005 return ExprError();
7006
7007 // C++0x [class.copy]p32:
7008 // When certain criteria are met, an implementation is allowed to
7009 // omit the copy/move construction of a class object, even if the
7010 // copy/move constructor and/or destructor for the object have
7011 // side effects. [...]
7012 // - when a temporary class object that has not been bound to a
7013 // reference (12.2) would be copied/moved to a class object
7014 // with the same cv-unqualified type, the copy/move operation
7015 // can be omitted by constructing the temporary object
7016 // directly into the target of the omitted copy/move
7017 //
7018 // Note that the other three bullets are handled elsewhere. Copy
7019 // elision for return statements and throw expressions are handled as part
7020 // of constructor initialization, while copy elision for exception handlers
7021 // is handled by the run-time.
7022 //
7023 // FIXME: If the function parameter is not the same type as the temporary, we
7024 // should still be able to elide the copy, but we don't have a way to
7025 // represent in the AST how much should be elided in this case.
7026 bool Elidable =
7027 CurInitExpr->isTemporaryObject(S.Context, Class) &&
7028 S.Context.hasSameUnqualifiedType(
7029 Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
7030 CurInitExpr->getType());
7031
7032 // Actually perform the constructor call.
7033 CurInit = S.BuildCXXConstructExpr(
7034 Loc, T, Best->FoundDecl, Constructor, Elidable, ConstructorArgs,
7035 HadMultipleCandidates,
7036 /*ListInit*/ false,
7037 /*StdInitListInit*/ false,
7038 /*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
7039
7040 // If we're supposed to bind temporaries, do so.
7041 if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity))
7042 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
7043 return CurInit;
7044 }
7045
7046 /// Check whether elidable copy construction for binding a reference to
7047 /// a temporary would have succeeded if we were building in C++98 mode, for
7048 /// -Wc++98-compat.
CheckCXX98CompatAccessibleCopy(Sema & S,const InitializedEntity & Entity,Expr * CurInitExpr)7049 static void CheckCXX98CompatAccessibleCopy(Sema &S,
7050 const InitializedEntity &Entity,
7051 Expr *CurInitExpr) {
7052 assert(S.getLangOpts().CPlusPlus11);
7053
7054 const RecordType *Record = CurInitExpr->getType()->getAs<RecordType>();
7055 if (!Record)
7056 return;
7057
7058 SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr);
7059 if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))
7060 return;
7061
7062 // Find constructors which would have been considered.
7063 OverloadCandidateSet CandidateSet(Loc, OverloadCandidateSet::CSK_Normal);
7064 DeclContext::lookup_result Ctors =
7065 S.LookupConstructors(cast<CXXRecordDecl>(Record->getDecl()));
7066
7067 // Perform overload resolution.
7068 OverloadCandidateSet::iterator Best;
7069 OverloadingResult OR = ResolveConstructorOverload(
7070 S, Loc, CurInitExpr, CandidateSet, CurInitExpr->getType(), Ctors, Best,
7071 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
7072 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
7073 /*RequireActualConstructor=*/false,
7074 /*SecondStepOfCopyInit=*/true);
7075
7076 PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
7077 << OR << (int)Entity.getKind() << CurInitExpr->getType()
7078 << CurInitExpr->getSourceRange();
7079
7080 switch (OR) {
7081 case OR_Success:
7082 S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function),
7083 Best->FoundDecl, Entity, Diag);
7084 // FIXME: Check default arguments as far as that's possible.
7085 break;
7086
7087 case OR_No_Viable_Function:
7088 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7089 OCD_AllCandidates, CurInitExpr);
7090 break;
7091
7092 case OR_Ambiguous:
7093 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7094 OCD_AmbiguousCandidates, CurInitExpr);
7095 break;
7096
7097 case OR_Deleted:
7098 S.Diag(Loc, Diag);
7099 S.NoteDeletedFunction(Best->Function);
7100 break;
7101 }
7102 }
7103
PrintInitLocationNote(Sema & S,const InitializedEntity & Entity)7104 void InitializationSequence::PrintInitLocationNote(Sema &S,
7105 const InitializedEntity &Entity) {
7106 if (Entity.isParamOrTemplateParamKind() && Entity.getDecl()) {
7107 if (Entity.getDecl()->getLocation().isInvalid())
7108 return;
7109
7110 if (Entity.getDecl()->getDeclName())
7111 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here)
7112 << Entity.getDecl()->getDeclName();
7113 else
7114 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here);
7115 }
7116 else if (Entity.getKind() == InitializedEntity::EK_RelatedResult &&
7117 Entity.getMethodDecl())
7118 S.Diag(Entity.getMethodDecl()->getLocation(),
7119 diag::note_method_return_type_change)
7120 << Entity.getMethodDecl()->getDeclName();
7121 }
7122
7123 /// Returns true if the parameters describe a constructor initialization of
7124 /// an explicit temporary object, e.g. "Point(x, y)".
isExplicitTemporary(const InitializedEntity & Entity,const InitializationKind & Kind,unsigned NumArgs)7125 static bool isExplicitTemporary(const InitializedEntity &Entity,
7126 const InitializationKind &Kind,
7127 unsigned NumArgs) {
7128 switch (Entity.getKind()) {
7129 case InitializedEntity::EK_Temporary:
7130 case InitializedEntity::EK_CompoundLiteralInit:
7131 case InitializedEntity::EK_RelatedResult:
7132 break;
7133 default:
7134 return false;
7135 }
7136
7137 switch (Kind.getKind()) {
7138 case InitializationKind::IK_DirectList:
7139 return true;
7140 // FIXME: Hack to work around cast weirdness.
7141 case InitializationKind::IK_Direct:
7142 case InitializationKind::IK_Value:
7143 return NumArgs != 1;
7144 default:
7145 return false;
7146 }
7147 }
7148
7149 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)7150 PerformConstructorInitialization(Sema &S,
7151 const InitializedEntity &Entity,
7152 const InitializationKind &Kind,
7153 MultiExprArg Args,
7154 const InitializationSequence::Step& Step,
7155 bool &ConstructorInitRequiresZeroInit,
7156 bool IsListInitialization,
7157 bool IsStdInitListInitialization,
7158 SourceLocation LBraceLoc,
7159 SourceLocation RBraceLoc) {
7160 unsigned NumArgs = Args.size();
7161 CXXConstructorDecl *Constructor
7162 = cast<CXXConstructorDecl>(Step.Function.Function);
7163 bool HadMultipleCandidates = Step.Function.HadMultipleCandidates;
7164
7165 // Build a call to the selected constructor.
7166 SmallVector<Expr*, 8> ConstructorArgs;
7167 SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
7168 ? Kind.getEqualLoc()
7169 : Kind.getLocation();
7170
7171 if (Kind.getKind() == InitializationKind::IK_Default) {
7172 // Force even a trivial, implicit default constructor to be
7173 // semantically checked. We do this explicitly because we don't build
7174 // the definition for completely trivial constructors.
7175 assert(Constructor->getParent() && "No parent class for constructor.");
7176 if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
7177 Constructor->isTrivial() && !Constructor->isUsed(false)) {
7178 S.runWithSufficientStackSpace(Loc, [&] {
7179 S.DefineImplicitDefaultConstructor(Loc, Constructor);
7180 });
7181 }
7182 }
7183
7184 ExprResult CurInit((Expr *)nullptr);
7185
7186 // C++ [over.match.copy]p1:
7187 // - When initializing a temporary to be bound to the first parameter
7188 // of a constructor that takes a reference to possibly cv-qualified
7189 // T as its first argument, called with a single argument in the
7190 // context of direct-initialization, explicit conversion functions
7191 // are also considered.
7192 bool AllowExplicitConv =
7193 Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
7194 hasCopyOrMoveCtorParam(S.Context,
7195 getConstructorInfo(Step.Function.FoundDecl));
7196
7197 // A smart pointer constructed from a nullable pointer is nullable.
7198 if (NumArgs == 1 && !Kind.isExplicitCast())
7199 S.diagnoseNullableToNonnullConversion(
7200 Entity.getType(), Args.front()->getType(), Kind.getLocation());
7201
7202 // Determine the arguments required to actually perform the constructor
7203 // call.
7204 if (S.CompleteConstructorCall(Constructor, Step.Type, Args, Loc,
7205 ConstructorArgs, AllowExplicitConv,
7206 IsListInitialization))
7207 return ExprError();
7208
7209 if (isExplicitTemporary(Entity, Kind, NumArgs)) {
7210 // An explicitly-constructed temporary, e.g., X(1, 2).
7211 if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
7212 return ExprError();
7213
7214 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
7215 if (!TSInfo)
7216 TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc);
7217 SourceRange ParenOrBraceRange =
7218 (Kind.getKind() == InitializationKind::IK_DirectList)
7219 ? SourceRange(LBraceLoc, RBraceLoc)
7220 : Kind.getParenOrBraceRange();
7221
7222 CXXConstructorDecl *CalleeDecl = Constructor;
7223 if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
7224 Step.Function.FoundDecl.getDecl())) {
7225 CalleeDecl = S.findInheritingConstructor(Loc, Constructor, Shadow);
7226 }
7227 S.MarkFunctionReferenced(Loc, CalleeDecl);
7228
7229 CurInit = S.CheckForImmediateInvocation(
7230 CXXTemporaryObjectExpr::Create(
7231 S.Context, CalleeDecl,
7232 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
7233 ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
7234 IsListInitialization, IsStdInitListInitialization,
7235 ConstructorInitRequiresZeroInit),
7236 CalleeDecl);
7237 } else {
7238 CXXConstructionKind ConstructKind = CXXConstructionKind::Complete;
7239
7240 if (Entity.getKind() == InitializedEntity::EK_Base) {
7241 ConstructKind = Entity.getBaseSpecifier()->isVirtual()
7242 ? CXXConstructionKind::VirtualBase
7243 : CXXConstructionKind::NonVirtualBase;
7244 } else if (Entity.getKind() == InitializedEntity::EK_Delegating) {
7245 ConstructKind = CXXConstructionKind::Delegating;
7246 }
7247
7248 // Only get the parenthesis or brace range if it is a list initialization or
7249 // direct construction.
7250 SourceRange ParenOrBraceRange;
7251 if (IsListInitialization)
7252 ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc);
7253 else if (Kind.getKind() == InitializationKind::IK_Direct)
7254 ParenOrBraceRange = Kind.getParenOrBraceRange();
7255
7256 // If the entity allows NRVO, mark the construction as elidable
7257 // unconditionally.
7258 if (Entity.allowsNRVO())
7259 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7260 Step.Function.FoundDecl,
7261 Constructor, /*Elidable=*/true,
7262 ConstructorArgs,
7263 HadMultipleCandidates,
7264 IsListInitialization,
7265 IsStdInitListInitialization,
7266 ConstructorInitRequiresZeroInit,
7267 ConstructKind,
7268 ParenOrBraceRange);
7269 else
7270 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7271 Step.Function.FoundDecl,
7272 Constructor,
7273 ConstructorArgs,
7274 HadMultipleCandidates,
7275 IsListInitialization,
7276 IsStdInitListInitialization,
7277 ConstructorInitRequiresZeroInit,
7278 ConstructKind,
7279 ParenOrBraceRange);
7280 }
7281 if (CurInit.isInvalid())
7282 return ExprError();
7283
7284 // Only check access if all of that succeeded.
7285 S.CheckConstructorAccess(Loc, Constructor, Step.Function.FoundDecl, Entity);
7286 if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
7287 return ExprError();
7288
7289 if (const ArrayType *AT = S.Context.getAsArrayType(Entity.getType()))
7290 if (checkDestructorReference(S.Context.getBaseElementType(AT), Loc, S))
7291 return ExprError();
7292
7293 if (shouldBindAsTemporary(Entity))
7294 CurInit = S.MaybeBindToTemporary(CurInit.get());
7295
7296 return CurInit;
7297 }
7298
checkInitializerLifetime(const InitializedEntity & Entity,Expr * Init)7299 void Sema::checkInitializerLifetime(const InitializedEntity &Entity,
7300 Expr *Init) {
7301 return sema::checkExprLifetime(*this, Entity, Init);
7302 }
7303
7304 static void DiagnoseNarrowingInInitList(Sema &S,
7305 const ImplicitConversionSequence &ICS,
7306 QualType PreNarrowingType,
7307 QualType EntityType,
7308 const Expr *PostInit);
7309
7310 static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType,
7311 QualType ToType, Expr *Init);
7312
7313 /// Provide warnings when std::move is used on construction.
CheckMoveOnConstruction(Sema & S,const Expr * InitExpr,bool IsReturnStmt)7314 static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr,
7315 bool IsReturnStmt) {
7316 if (!InitExpr)
7317 return;
7318
7319 if (S.inTemplateInstantiation())
7320 return;
7321
7322 QualType DestType = InitExpr->getType();
7323 if (!DestType->isRecordType())
7324 return;
7325
7326 unsigned DiagID = 0;
7327 if (IsReturnStmt) {
7328 const CXXConstructExpr *CCE =
7329 dyn_cast<CXXConstructExpr>(InitExpr->IgnoreParens());
7330 if (!CCE || CCE->getNumArgs() != 1)
7331 return;
7332
7333 if (!CCE->getConstructor()->isCopyOrMoveConstructor())
7334 return;
7335
7336 InitExpr = CCE->getArg(0)->IgnoreImpCasts();
7337 }
7338
7339 // Find the std::move call and get the argument.
7340 const CallExpr *CE = dyn_cast<CallExpr>(InitExpr->IgnoreParens());
7341 if (!CE || !CE->isCallToStdMove())
7342 return;
7343
7344 const Expr *Arg = CE->getArg(0)->IgnoreImplicit();
7345
7346 if (IsReturnStmt) {
7347 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts());
7348 if (!DRE || DRE->refersToEnclosingVariableOrCapture())
7349 return;
7350
7351 const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
7352 if (!VD || !VD->hasLocalStorage())
7353 return;
7354
7355 // __block variables are not moved implicitly.
7356 if (VD->hasAttr<BlocksAttr>())
7357 return;
7358
7359 QualType SourceType = VD->getType();
7360 if (!SourceType->isRecordType())
7361 return;
7362
7363 if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
7364 return;
7365 }
7366
7367 // If we're returning a function parameter, copy elision
7368 // is not possible.
7369 if (isa<ParmVarDecl>(VD))
7370 DiagID = diag::warn_redundant_move_on_return;
7371 else
7372 DiagID = diag::warn_pessimizing_move_on_return;
7373 } else {
7374 DiagID = diag::warn_pessimizing_move_on_initialization;
7375 const Expr *ArgStripped = Arg->IgnoreImplicit()->IgnoreParens();
7376 if (!ArgStripped->isPRValue() || !ArgStripped->getType()->isRecordType())
7377 return;
7378 }
7379
7380 S.Diag(CE->getBeginLoc(), DiagID);
7381
7382 // Get all the locations for a fix-it. Don't emit the fix-it if any location
7383 // is within a macro.
7384 SourceLocation CallBegin = CE->getCallee()->getBeginLoc();
7385 if (CallBegin.isMacroID())
7386 return;
7387 SourceLocation RParen = CE->getRParenLoc();
7388 if (RParen.isMacroID())
7389 return;
7390 SourceLocation LParen;
7391 SourceLocation ArgLoc = Arg->getBeginLoc();
7392
7393 // Special testing for the argument location. Since the fix-it needs the
7394 // location right before the argument, the argument location can be in a
7395 // macro only if it is at the beginning of the macro.
7396 while (ArgLoc.isMacroID() &&
7397 S.getSourceManager().isAtStartOfImmediateMacroExpansion(ArgLoc)) {
7398 ArgLoc = S.getSourceManager().getImmediateExpansionRange(ArgLoc).getBegin();
7399 }
7400
7401 if (LParen.isMacroID())
7402 return;
7403
7404 LParen = ArgLoc.getLocWithOffset(-1);
7405
7406 S.Diag(CE->getBeginLoc(), diag::note_remove_move)
7407 << FixItHint::CreateRemoval(SourceRange(CallBegin, LParen))
7408 << FixItHint::CreateRemoval(SourceRange(RParen, RParen));
7409 }
7410
CheckForNullPointerDereference(Sema & S,const Expr * E)7411 static void CheckForNullPointerDereference(Sema &S, const Expr *E) {
7412 // Check to see if we are dereferencing a null pointer. If so, this is
7413 // undefined behavior, so warn about it. This only handles the pattern
7414 // "*null", which is a very syntactic check.
7415 if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts()))
7416 if (UO->getOpcode() == UO_Deref &&
7417 UO->getSubExpr()->IgnoreParenCasts()->
7418 isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) {
7419 S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
7420 S.PDiag(diag::warn_binding_null_to_reference)
7421 << UO->getSubExpr()->getSourceRange());
7422 }
7423 }
7424
7425 MaterializeTemporaryExpr *
CreateMaterializeTemporaryExpr(QualType T,Expr * Temporary,bool BoundToLvalueReference)7426 Sema::CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary,
7427 bool BoundToLvalueReference) {
7428 auto MTE = new (Context)
7429 MaterializeTemporaryExpr(T, Temporary, BoundToLvalueReference);
7430
7431 // Order an ExprWithCleanups for lifetime marks.
7432 //
7433 // TODO: It'll be good to have a single place to check the access of the
7434 // destructor and generate ExprWithCleanups for various uses. Currently these
7435 // are done in both CreateMaterializeTemporaryExpr and MaybeBindToTemporary,
7436 // but there may be a chance to merge them.
7437 Cleanup.setExprNeedsCleanups(false);
7438 if (isInLifetimeExtendingContext()) {
7439 auto &Record = ExprEvalContexts.back();
7440 Record.ForRangeLifetimeExtendTemps.push_back(MTE);
7441 }
7442 return MTE;
7443 }
7444
TemporaryMaterializationConversion(Expr * E)7445 ExprResult Sema::TemporaryMaterializationConversion(Expr *E) {
7446 // In C++98, we don't want to implicitly create an xvalue.
7447 // FIXME: This means that AST consumers need to deal with "prvalues" that
7448 // denote materialized temporaries. Maybe we should add another ValueKind
7449 // for "xvalue pretending to be a prvalue" for C++98 support.
7450 if (!E->isPRValue() || !getLangOpts().CPlusPlus11)
7451 return E;
7452
7453 // C++1z [conv.rval]/1: T shall be a complete type.
7454 // FIXME: Does this ever matter (can we form a prvalue of incomplete type)?
7455 // If so, we should check for a non-abstract class type here too.
7456 QualType T = E->getType();
7457 if (RequireCompleteType(E->getExprLoc(), T, diag::err_incomplete_type))
7458 return ExprError();
7459
7460 return CreateMaterializeTemporaryExpr(E->getType(), E, false);
7461 }
7462
PerformQualificationConversion(Expr * E,QualType Ty,ExprValueKind VK,CheckedConversionKind CCK)7463 ExprResult Sema::PerformQualificationConversion(Expr *E, QualType Ty,
7464 ExprValueKind VK,
7465 CheckedConversionKind CCK) {
7466
7467 CastKind CK = CK_NoOp;
7468
7469 if (VK == VK_PRValue) {
7470 auto PointeeTy = Ty->getPointeeType();
7471 auto ExprPointeeTy = E->getType()->getPointeeType();
7472 if (!PointeeTy.isNull() &&
7473 PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7474 CK = CK_AddressSpaceConversion;
7475 } else if (Ty.getAddressSpace() != E->getType().getAddressSpace()) {
7476 CK = CK_AddressSpaceConversion;
7477 }
7478
7479 return ImpCastExprToType(E, Ty, CK, VK, /*BasePath=*/nullptr, CCK);
7480 }
7481
Perform(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Args,QualType * ResultType)7482 ExprResult InitializationSequence::Perform(Sema &S,
7483 const InitializedEntity &Entity,
7484 const InitializationKind &Kind,
7485 MultiExprArg Args,
7486 QualType *ResultType) {
7487 if (Failed()) {
7488 Diagnose(S, Entity, Kind, Args);
7489 return ExprError();
7490 }
7491 if (!ZeroInitializationFixit.empty()) {
7492 const Decl *D = Entity.getDecl();
7493 const auto *VD = dyn_cast_or_null<VarDecl>(D);
7494 QualType DestType = Entity.getType();
7495
7496 // The initialization would have succeeded with this fixit. Since the fixit
7497 // is on the error, we need to build a valid AST in this case, so this isn't
7498 // handled in the Failed() branch above.
7499 if (!DestType->isRecordType() && VD && VD->isConstexpr()) {
7500 // Use a more useful diagnostic for constexpr variables.
7501 S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
7502 << VD
7503 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7504 ZeroInitializationFixit);
7505 } else {
7506 unsigned DiagID = diag::err_default_init_const;
7507 if (S.getLangOpts().MSVCCompat && D && D->hasAttr<SelectAnyAttr>())
7508 DiagID = diag::ext_default_init_const;
7509
7510 S.Diag(Kind.getLocation(), DiagID)
7511 << DestType << (bool)DestType->getAs<RecordType>()
7512 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7513 ZeroInitializationFixit);
7514 }
7515 }
7516
7517 if (getKind() == DependentSequence) {
7518 // If the declaration is a non-dependent, incomplete array type
7519 // that has an initializer, then its type will be completed once
7520 // the initializer is instantiated.
7521 if (ResultType && !Entity.getType()->isDependentType() &&
7522 Args.size() == 1) {
7523 QualType DeclType = Entity.getType();
7524 if (const IncompleteArrayType *ArrayT
7525 = S.Context.getAsIncompleteArrayType(DeclType)) {
7526 // FIXME: We don't currently have the ability to accurately
7527 // compute the length of an initializer list without
7528 // performing full type-checking of the initializer list
7529 // (since we have to determine where braces are implicitly
7530 // introduced and such). So, we fall back to making the array
7531 // type a dependently-sized array type with no specified
7532 // bound.
7533 if (isa<InitListExpr>((Expr *)Args[0])) {
7534 SourceRange Brackets;
7535
7536 // Scavange the location of the brackets from the entity, if we can.
7537 if (auto *DD = dyn_cast_or_null<DeclaratorDecl>(Entity.getDecl())) {
7538 if (TypeSourceInfo *TInfo = DD->getTypeSourceInfo()) {
7539 TypeLoc TL = TInfo->getTypeLoc();
7540 if (IncompleteArrayTypeLoc ArrayLoc =
7541 TL.getAs<IncompleteArrayTypeLoc>())
7542 Brackets = ArrayLoc.getBracketsRange();
7543 }
7544 }
7545
7546 *ResultType
7547 = S.Context.getDependentSizedArrayType(ArrayT->getElementType(),
7548 /*NumElts=*/nullptr,
7549 ArrayT->getSizeModifier(),
7550 ArrayT->getIndexTypeCVRQualifiers(),
7551 Brackets);
7552 }
7553
7554 }
7555 }
7556 if (Kind.getKind() == InitializationKind::IK_Direct &&
7557 !Kind.isExplicitCast()) {
7558 // Rebuild the ParenListExpr.
7559 SourceRange ParenRange = Kind.getParenOrBraceRange();
7560 return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(),
7561 Args);
7562 }
7563 assert(Kind.getKind() == InitializationKind::IK_Copy ||
7564 Kind.isExplicitCast() ||
7565 Kind.getKind() == InitializationKind::IK_DirectList);
7566 return ExprResult(Args[0]);
7567 }
7568
7569 // No steps means no initialization.
7570 if (Steps.empty())
7571 return ExprResult((Expr *)nullptr);
7572
7573 if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() &&
7574 Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
7575 !Entity.isParamOrTemplateParamKind()) {
7576 // Produce a C++98 compatibility warning if we are initializing a reference
7577 // from an initializer list. For parameters, we produce a better warning
7578 // elsewhere.
7579 Expr *Init = Args[0];
7580 S.Diag(Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7581 << Init->getSourceRange();
7582 }
7583
7584 if (S.getLangOpts().MicrosoftExt && Args.size() == 1 &&
7585 isa<PredefinedExpr>(Args[0]) && Entity.getType()->isArrayType()) {
7586 // Produce a Microsoft compatibility warning when initializing from a
7587 // predefined expression since MSVC treats predefined expressions as string
7588 // literals.
7589 Expr *Init = Args[0];
7590 S.Diag(Init->getBeginLoc(), diag::ext_init_from_predefined) << Init;
7591 }
7592
7593 // OpenCL v2.0 s6.13.11.1. atomic variables can be initialized in global scope
7594 QualType ETy = Entity.getType();
7595 bool HasGlobalAS = ETy.hasAddressSpace() &&
7596 ETy.getAddressSpace() == LangAS::opencl_global;
7597
7598 if (S.getLangOpts().OpenCLVersion >= 200 &&
7599 ETy->isAtomicType() && !HasGlobalAS &&
7600 Entity.getKind() == InitializedEntity::EK_Variable && Args.size() > 0) {
7601 S.Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
7602 << 1
7603 << SourceRange(Entity.getDecl()->getBeginLoc(), Args[0]->getEndLoc());
7604 return ExprError();
7605 }
7606
7607 QualType DestType = Entity.getType().getNonReferenceType();
7608 // FIXME: Ugly hack around the fact that Entity.getType() is not
7609 // the same as Entity.getDecl()->getType() in cases involving type merging,
7610 // and we want latter when it makes sense.
7611 if (ResultType)
7612 *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() :
7613 Entity.getType();
7614
7615 ExprResult CurInit((Expr *)nullptr);
7616 SmallVector<Expr*, 4> ArrayLoopCommonExprs;
7617
7618 // HLSL allows vector initialization to function like list initialization, but
7619 // use the syntax of a C++-like constructor.
7620 bool IsHLSLVectorInit = S.getLangOpts().HLSL && DestType->isExtVectorType() &&
7621 isa<InitListExpr>(Args[0]);
7622 (void)IsHLSLVectorInit;
7623
7624 // For initialization steps that start with a single initializer,
7625 // grab the only argument out the Args and place it into the "current"
7626 // initializer.
7627 switch (Steps.front().Kind) {
7628 case SK_ResolveAddressOfOverloadedFunction:
7629 case SK_CastDerivedToBasePRValue:
7630 case SK_CastDerivedToBaseXValue:
7631 case SK_CastDerivedToBaseLValue:
7632 case SK_BindReference:
7633 case SK_BindReferenceToTemporary:
7634 case SK_FinalCopy:
7635 case SK_ExtraneousCopyToTemporary:
7636 case SK_UserConversion:
7637 case SK_QualificationConversionLValue:
7638 case SK_QualificationConversionXValue:
7639 case SK_QualificationConversionPRValue:
7640 case SK_FunctionReferenceConversion:
7641 case SK_AtomicConversion:
7642 case SK_ConversionSequence:
7643 case SK_ConversionSequenceNoNarrowing:
7644 case SK_ListInitialization:
7645 case SK_UnwrapInitList:
7646 case SK_RewrapInitList:
7647 case SK_CAssignment:
7648 case SK_StringInit:
7649 case SK_ObjCObjectConversion:
7650 case SK_ArrayLoopIndex:
7651 case SK_ArrayLoopInit:
7652 case SK_ArrayInit:
7653 case SK_GNUArrayInit:
7654 case SK_ParenthesizedArrayInit:
7655 case SK_PassByIndirectCopyRestore:
7656 case SK_PassByIndirectRestore:
7657 case SK_ProduceObjCObject:
7658 case SK_StdInitializerList:
7659 case SK_OCLSamplerInit:
7660 case SK_OCLZeroOpaqueType: {
7661 assert(Args.size() == 1 || IsHLSLVectorInit);
7662 CurInit = Args[0];
7663 if (!CurInit.get()) return ExprError();
7664 break;
7665 }
7666
7667 case SK_ConstructorInitialization:
7668 case SK_ConstructorInitializationFromList:
7669 case SK_StdInitializerListConstructorCall:
7670 case SK_ZeroInitialization:
7671 case SK_ParenthesizedListInit:
7672 break;
7673 }
7674
7675 // Promote from an unevaluated context to an unevaluated list context in
7676 // C++11 list-initialization; we need to instantiate entities usable in
7677 // constant expressions here in order to perform narrowing checks =(
7678 EnterExpressionEvaluationContext Evaluated(
7679 S, EnterExpressionEvaluationContext::InitList,
7680 isa_and_nonnull<InitListExpr>(CurInit.get()));
7681
7682 // C++ [class.abstract]p2:
7683 // no objects of an abstract class can be created except as subobjects
7684 // of a class derived from it
7685 auto checkAbstractType = [&](QualType T) -> bool {
7686 if (Entity.getKind() == InitializedEntity::EK_Base ||
7687 Entity.getKind() == InitializedEntity::EK_Delegating)
7688 return false;
7689 return S.RequireNonAbstractType(Kind.getLocation(), T,
7690 diag::err_allocation_of_abstract_type);
7691 };
7692
7693 // Walk through the computed steps for the initialization sequence,
7694 // performing the specified conversions along the way.
7695 bool ConstructorInitRequiresZeroInit = false;
7696 for (step_iterator Step = step_begin(), StepEnd = step_end();
7697 Step != StepEnd; ++Step) {
7698 if (CurInit.isInvalid())
7699 return ExprError();
7700
7701 QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType();
7702
7703 switch (Step->Kind) {
7704 case SK_ResolveAddressOfOverloadedFunction:
7705 // Overload resolution determined which function invoke; update the
7706 // initializer to reflect that choice.
7707 S.CheckAddressOfMemberAccess(CurInit.get(), Step->Function.FoundDecl);
7708 if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()))
7709 return ExprError();
7710 CurInit = S.FixOverloadedFunctionReference(CurInit,
7711 Step->Function.FoundDecl,
7712 Step->Function.Function);
7713 // We might get back another placeholder expression if we resolved to a
7714 // builtin.
7715 if (!CurInit.isInvalid())
7716 CurInit = S.CheckPlaceholderExpr(CurInit.get());
7717 break;
7718
7719 case SK_CastDerivedToBasePRValue:
7720 case SK_CastDerivedToBaseXValue:
7721 case SK_CastDerivedToBaseLValue: {
7722 // We have a derived-to-base cast that produces either an rvalue or an
7723 // lvalue. Perform that cast.
7724
7725 CXXCastPath BasePath;
7726
7727 // Casts to inaccessible base classes are allowed with C-style casts.
7728 bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
7729 if (S.CheckDerivedToBaseConversion(
7730 SourceType, Step->Type, CurInit.get()->getBeginLoc(),
7731 CurInit.get()->getSourceRange(), &BasePath, IgnoreBaseAccess))
7732 return ExprError();
7733
7734 ExprValueKind VK =
7735 Step->Kind == SK_CastDerivedToBaseLValue
7736 ? VK_LValue
7737 : (Step->Kind == SK_CastDerivedToBaseXValue ? VK_XValue
7738 : VK_PRValue);
7739 CurInit = ImplicitCastExpr::Create(S.Context, Step->Type,
7740 CK_DerivedToBase, CurInit.get(),
7741 &BasePath, VK, FPOptionsOverride());
7742 break;
7743 }
7744
7745 case SK_BindReference:
7746 // Reference binding does not have any corresponding ASTs.
7747
7748 // Check exception specifications
7749 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
7750 return ExprError();
7751
7752 // We don't check for e.g. function pointers here, since address
7753 // availability checks should only occur when the function first decays
7754 // into a pointer or reference.
7755 if (CurInit.get()->getType()->isFunctionProtoType()) {
7756 if (auto *DRE = dyn_cast<DeclRefExpr>(CurInit.get()->IgnoreParens())) {
7757 if (auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
7758 if (!S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
7759 DRE->getBeginLoc()))
7760 return ExprError();
7761 }
7762 }
7763 }
7764
7765 CheckForNullPointerDereference(S, CurInit.get());
7766 break;
7767
7768 case SK_BindReferenceToTemporary: {
7769 // Make sure the "temporary" is actually an rvalue.
7770 assert(CurInit.get()->isPRValue() && "not a temporary");
7771
7772 // Check exception specifications
7773 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
7774 return ExprError();
7775
7776 QualType MTETy = Step->Type;
7777
7778 // When this is an incomplete array type (such as when this is
7779 // initializing an array of unknown bounds from an init list), use THAT
7780 // type instead so that we propagate the array bounds.
7781 if (MTETy->isIncompleteArrayType() &&
7782 !CurInit.get()->getType()->isIncompleteArrayType() &&
7783 S.Context.hasSameType(
7784 MTETy->getPointeeOrArrayElementType(),
7785 CurInit.get()->getType()->getPointeeOrArrayElementType()))
7786 MTETy = CurInit.get()->getType();
7787
7788 // Materialize the temporary into memory.
7789 MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
7790 MTETy, CurInit.get(), Entity.getType()->isLValueReferenceType());
7791 CurInit = MTE;
7792
7793 // If we're extending this temporary to automatic storage duration -- we
7794 // need to register its cleanup during the full-expression's cleanups.
7795 if (MTE->getStorageDuration() == SD_Automatic &&
7796 MTE->getType().isDestructedType())
7797 S.Cleanup.setExprNeedsCleanups(true);
7798 break;
7799 }
7800
7801 case SK_FinalCopy:
7802 if (checkAbstractType(Step->Type))
7803 return ExprError();
7804
7805 // If the overall initialization is initializing a temporary, we already
7806 // bound our argument if it was necessary to do so. If not (if we're
7807 // ultimately initializing a non-temporary), our argument needs to be
7808 // bound since it's initializing a function parameter.
7809 // FIXME: This is a mess. Rationalize temporary destruction.
7810 if (!shouldBindAsTemporary(Entity))
7811 CurInit = S.MaybeBindToTemporary(CurInit.get());
7812 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
7813 /*IsExtraneousCopy=*/false);
7814 break;
7815
7816 case SK_ExtraneousCopyToTemporary:
7817 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
7818 /*IsExtraneousCopy=*/true);
7819 break;
7820
7821 case SK_UserConversion: {
7822 // We have a user-defined conversion that invokes either a constructor
7823 // or a conversion function.
7824 CastKind CastKind;
7825 FunctionDecl *Fn = Step->Function.Function;
7826 DeclAccessPair FoundFn = Step->Function.FoundDecl;
7827 bool HadMultipleCandidates = Step->Function.HadMultipleCandidates;
7828 bool CreatedObject = false;
7829 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
7830 // Build a call to the selected constructor.
7831 SmallVector<Expr*, 8> ConstructorArgs;
7832 SourceLocation Loc = CurInit.get()->getBeginLoc();
7833
7834 // Determine the arguments required to actually perform the constructor
7835 // call.
7836 Expr *Arg = CurInit.get();
7837 if (S.CompleteConstructorCall(Constructor, Step->Type,
7838 MultiExprArg(&Arg, 1), Loc,
7839 ConstructorArgs))
7840 return ExprError();
7841
7842 // Build an expression that constructs a temporary.
7843 CurInit = S.BuildCXXConstructExpr(
7844 Loc, Step->Type, FoundFn, Constructor, ConstructorArgs,
7845 HadMultipleCandidates,
7846 /*ListInit*/ false,
7847 /*StdInitListInit*/ false,
7848 /*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
7849 if (CurInit.isInvalid())
7850 return ExprError();
7851
7852 S.CheckConstructorAccess(Kind.getLocation(), Constructor, FoundFn,
7853 Entity);
7854 if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
7855 return ExprError();
7856
7857 CastKind = CK_ConstructorConversion;
7858 CreatedObject = true;
7859 } else {
7860 // Build a call to the conversion function.
7861 CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn);
7862 S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr,
7863 FoundFn);
7864 if (S.DiagnoseUseOfDecl(FoundFn, Kind.getLocation()))
7865 return ExprError();
7866
7867 CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion,
7868 HadMultipleCandidates);
7869 if (CurInit.isInvalid())
7870 return ExprError();
7871
7872 CastKind = CK_UserDefinedConversion;
7873 CreatedObject = Conversion->getReturnType()->isRecordType();
7874 }
7875
7876 if (CreatedObject && checkAbstractType(CurInit.get()->getType()))
7877 return ExprError();
7878
7879 CurInit = ImplicitCastExpr::Create(
7880 S.Context, CurInit.get()->getType(), CastKind, CurInit.get(), nullptr,
7881 CurInit.get()->getValueKind(), S.CurFPFeatureOverrides());
7882
7883 if (shouldBindAsTemporary(Entity))
7884 // The overall entity is temporary, so this expression should be
7885 // destroyed at the end of its full-expression.
7886 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
7887 else if (CreatedObject && shouldDestroyEntity(Entity)) {
7888 // The object outlasts the full-expression, but we need to prepare for
7889 // a destructor being run on it.
7890 // FIXME: It makes no sense to do this here. This should happen
7891 // regardless of how we initialized the entity.
7892 QualType T = CurInit.get()->getType();
7893 if (const RecordType *Record = T->getAs<RecordType>()) {
7894 CXXDestructorDecl *Destructor
7895 = S.LookupDestructor(cast<CXXRecordDecl>(Record->getDecl()));
7896 S.CheckDestructorAccess(CurInit.get()->getBeginLoc(), Destructor,
7897 S.PDiag(diag::err_access_dtor_temp) << T);
7898 S.MarkFunctionReferenced(CurInit.get()->getBeginLoc(), Destructor);
7899 if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getBeginLoc()))
7900 return ExprError();
7901 }
7902 }
7903 break;
7904 }
7905
7906 case SK_QualificationConversionLValue:
7907 case SK_QualificationConversionXValue:
7908 case SK_QualificationConversionPRValue: {
7909 // Perform a qualification conversion; these can never go wrong.
7910 ExprValueKind VK =
7911 Step->Kind == SK_QualificationConversionLValue
7912 ? VK_LValue
7913 : (Step->Kind == SK_QualificationConversionXValue ? VK_XValue
7914 : VK_PRValue);
7915 CurInit = S.PerformQualificationConversion(CurInit.get(), Step->Type, VK);
7916 break;
7917 }
7918
7919 case SK_FunctionReferenceConversion:
7920 assert(CurInit.get()->isLValue() &&
7921 "function reference should be lvalue");
7922 CurInit =
7923 S.ImpCastExprToType(CurInit.get(), Step->Type, CK_NoOp, VK_LValue);
7924 break;
7925
7926 case SK_AtomicConversion: {
7927 assert(CurInit.get()->isPRValue() && "cannot convert glvalue to atomic");
7928 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
7929 CK_NonAtomicToAtomic, VK_PRValue);
7930 break;
7931 }
7932
7933 case SK_ConversionSequence:
7934 case SK_ConversionSequenceNoNarrowing: {
7935 if (const auto *FromPtrType =
7936 CurInit.get()->getType()->getAs<PointerType>()) {
7937 if (const auto *ToPtrType = Step->Type->getAs<PointerType>()) {
7938 if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
7939 !ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
7940 // Do not check static casts here because they are checked earlier
7941 // in Sema::ActOnCXXNamedCast()
7942 if (!Kind.isStaticCast()) {
7943 S.Diag(CurInit.get()->getExprLoc(),
7944 diag::warn_noderef_to_dereferenceable_pointer)
7945 << CurInit.get()->getSourceRange();
7946 }
7947 }
7948 }
7949 }
7950 Expr *Init = CurInit.get();
7951 CheckedConversionKind CCK =
7952 Kind.isCStyleCast() ? CheckedConversionKind::CStyleCast
7953 : Kind.isFunctionalCast() ? CheckedConversionKind::FunctionalCast
7954 : Kind.isExplicitCast() ? CheckedConversionKind::OtherCast
7955 : CheckedConversionKind::Implicit;
7956 ExprResult CurInitExprRes = S.PerformImplicitConversion(
7957 Init, Step->Type, *Step->ICS, getAssignmentAction(Entity), CCK);
7958 if (CurInitExprRes.isInvalid())
7959 return ExprError();
7960
7961 S.DiscardMisalignedMemberAddress(Step->Type.getTypePtr(), Init);
7962
7963 CurInit = CurInitExprRes;
7964
7965 if (Step->Kind == SK_ConversionSequenceNoNarrowing &&
7966 S.getLangOpts().CPlusPlus)
7967 DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
7968 CurInit.get());
7969
7970 break;
7971 }
7972
7973 case SK_ListInitialization: {
7974 if (checkAbstractType(Step->Type))
7975 return ExprError();
7976
7977 InitListExpr *InitList = cast<InitListExpr>(CurInit.get());
7978 // If we're not initializing the top-level entity, we need to create an
7979 // InitializeTemporary entity for our target type.
7980 QualType Ty = Step->Type;
7981 bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty);
7982 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(Ty);
7983 InitializedEntity InitEntity = IsTemporary ? TempEntity : Entity;
7984 InitListChecker PerformInitList(S, InitEntity,
7985 InitList, Ty, /*VerifyOnly=*/false,
7986 /*TreatUnavailableAsInvalid=*/false);
7987 if (PerformInitList.HadError())
7988 return ExprError();
7989
7990 // Hack: We must update *ResultType if available in order to set the
7991 // bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'.
7992 // Worst case: 'const int (&arref)[] = {1, 2, 3};'.
7993 if (ResultType &&
7994 ResultType->getNonReferenceType()->isIncompleteArrayType()) {
7995 if ((*ResultType)->isRValueReferenceType())
7996 Ty = S.Context.getRValueReferenceType(Ty);
7997 else if ((*ResultType)->isLValueReferenceType())
7998 Ty = S.Context.getLValueReferenceType(Ty,
7999 (*ResultType)->castAs<LValueReferenceType>()->isSpelledAsLValue());
8000 *ResultType = Ty;
8001 }
8002
8003 InitListExpr *StructuredInitList =
8004 PerformInitList.getFullyStructuredList();
8005 CurInit.get();
8006 CurInit = shouldBindAsTemporary(InitEntity)
8007 ? S.MaybeBindToTemporary(StructuredInitList)
8008 : StructuredInitList;
8009 break;
8010 }
8011
8012 case SK_ConstructorInitializationFromList: {
8013 if (checkAbstractType(Step->Type))
8014 return ExprError();
8015
8016 // When an initializer list is passed for a parameter of type "reference
8017 // to object", we don't get an EK_Temporary entity, but instead an
8018 // EK_Parameter entity with reference type.
8019 // FIXME: This is a hack. What we really should do is create a user
8020 // conversion step for this case, but this makes it considerably more
8021 // complicated. For now, this will do.
8022 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
8023 Entity.getType().getNonReferenceType());
8024 bool UseTemporary = Entity.getType()->isReferenceType();
8025 assert(Args.size() == 1 && "expected a single argument for list init");
8026 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
8027 S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8028 << InitList->getSourceRange();
8029 MultiExprArg Arg(InitList->getInits(), InitList->getNumInits());
8030 CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity :
8031 Entity,
8032 Kind, Arg, *Step,
8033 ConstructorInitRequiresZeroInit,
8034 /*IsListInitialization*/true,
8035 /*IsStdInitListInit*/false,
8036 InitList->getLBraceLoc(),
8037 InitList->getRBraceLoc());
8038 break;
8039 }
8040
8041 case SK_UnwrapInitList:
8042 CurInit = cast<InitListExpr>(CurInit.get())->getInit(0);
8043 break;
8044
8045 case SK_RewrapInitList: {
8046 Expr *E = CurInit.get();
8047 InitListExpr *Syntactic = Step->WrappingSyntacticList;
8048 InitListExpr *ILE = new (S.Context) InitListExpr(S.Context,
8049 Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc());
8050 ILE->setSyntacticForm(Syntactic);
8051 ILE->setType(E->getType());
8052 ILE->setValueKind(E->getValueKind());
8053 CurInit = ILE;
8054 break;
8055 }
8056
8057 case SK_ConstructorInitialization:
8058 case SK_StdInitializerListConstructorCall: {
8059 if (checkAbstractType(Step->Type))
8060 return ExprError();
8061
8062 // When an initializer list is passed for a parameter of type "reference
8063 // to object", we don't get an EK_Temporary entity, but instead an
8064 // EK_Parameter entity with reference type.
8065 // FIXME: This is a hack. What we really should do is create a user
8066 // conversion step for this case, but this makes it considerably more
8067 // complicated. For now, this will do.
8068 InitializedEntity TempEntity = InitializedEntity::InitializeTemporary(
8069 Entity.getType().getNonReferenceType());
8070 bool UseTemporary = Entity.getType()->isReferenceType();
8071 bool IsStdInitListInit =
8072 Step->Kind == SK_StdInitializerListConstructorCall;
8073 Expr *Source = CurInit.get();
8074 SourceRange Range = Kind.hasParenOrBraceRange()
8075 ? Kind.getParenOrBraceRange()
8076 : SourceRange();
8077 CurInit = PerformConstructorInitialization(
8078 S, UseTemporary ? TempEntity : Entity, Kind,
8079 Source ? MultiExprArg(Source) : Args, *Step,
8080 ConstructorInitRequiresZeroInit,
8081 /*IsListInitialization*/ IsStdInitListInit,
8082 /*IsStdInitListInitialization*/ IsStdInitListInit,
8083 /*LBraceLoc*/ Range.getBegin(),
8084 /*RBraceLoc*/ Range.getEnd());
8085 break;
8086 }
8087
8088 case SK_ZeroInitialization: {
8089 step_iterator NextStep = Step;
8090 ++NextStep;
8091 if (NextStep != StepEnd &&
8092 (NextStep->Kind == SK_ConstructorInitialization ||
8093 NextStep->Kind == SK_ConstructorInitializationFromList)) {
8094 // The need for zero-initialization is recorded directly into
8095 // the call to the object's constructor within the next step.
8096 ConstructorInitRequiresZeroInit = true;
8097 } else if (Kind.getKind() == InitializationKind::IK_Value &&
8098 S.getLangOpts().CPlusPlus &&
8099 !Kind.isImplicitValueInit()) {
8100 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
8101 if (!TSInfo)
8102 TSInfo = S.Context.getTrivialTypeSourceInfo(Step->Type,
8103 Kind.getRange().getBegin());
8104
8105 CurInit = new (S.Context) CXXScalarValueInitExpr(
8106 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
8107 Kind.getRange().getEnd());
8108 } else {
8109 CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type);
8110 }
8111 break;
8112 }
8113
8114 case SK_CAssignment: {
8115 QualType SourceType = CurInit.get()->getType();
8116 Expr *Init = CurInit.get();
8117
8118 // Save off the initial CurInit in case we need to emit a diagnostic
8119 ExprResult InitialCurInit = Init;
8120 ExprResult Result = Init;
8121 Sema::AssignConvertType ConvTy =
8122 S.CheckSingleAssignmentConstraints(Step->Type, Result, true,
8123 Entity.getKind() == InitializedEntity::EK_Parameter_CF_Audited);
8124 if (Result.isInvalid())
8125 return ExprError();
8126 CurInit = Result;
8127
8128 // If this is a call, allow conversion to a transparent union.
8129 ExprResult CurInitExprRes = CurInit;
8130 if (ConvTy != Sema::Compatible &&
8131 Entity.isParameterKind() &&
8132 S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExprRes)
8133 == Sema::Compatible)
8134 ConvTy = Sema::Compatible;
8135 if (CurInitExprRes.isInvalid())
8136 return ExprError();
8137 CurInit = CurInitExprRes;
8138
8139 if (S.getLangOpts().C23 && initializingConstexprVariable(Entity)) {
8140 CheckC23ConstexprInitConversion(S, SourceType, Entity.getType(),
8141 CurInit.get());
8142
8143 // C23 6.7.1p6: If an object or subobject declared with storage-class
8144 // specifier constexpr has pointer, integer, or arithmetic type, any
8145 // explicit initializer value for it shall be null, an integer
8146 // constant expression, or an arithmetic constant expression,
8147 // respectively.
8148 Expr::EvalResult ER;
8149 if (Entity.getType()->getAs<PointerType>() &&
8150 CurInit.get()->EvaluateAsRValue(ER, S.Context) &&
8151 !ER.Val.isNullPointer()) {
8152 S.Diag(Kind.getLocation(), diag::err_c23_constexpr_pointer_not_null);
8153 }
8154 }
8155
8156 bool Complained;
8157 if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
8158 Step->Type, SourceType,
8159 InitialCurInit.get(),
8160 getAssignmentAction(Entity, true),
8161 &Complained)) {
8162 PrintInitLocationNote(S, Entity);
8163 return ExprError();
8164 } else if (Complained)
8165 PrintInitLocationNote(S, Entity);
8166 break;
8167 }
8168
8169 case SK_StringInit: {
8170 QualType Ty = Step->Type;
8171 bool UpdateType = ResultType && Entity.getType()->isIncompleteArrayType();
8172 CheckStringInit(CurInit.get(), UpdateType ? *ResultType : Ty,
8173 S.Context.getAsArrayType(Ty), S,
8174 S.getLangOpts().C23 &&
8175 initializingConstexprVariable(Entity));
8176 break;
8177 }
8178
8179 case SK_ObjCObjectConversion:
8180 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8181 CK_ObjCObjectLValueCast,
8182 CurInit.get()->getValueKind());
8183 break;
8184
8185 case SK_ArrayLoopIndex: {
8186 Expr *Cur = CurInit.get();
8187 Expr *BaseExpr = new (S.Context)
8188 OpaqueValueExpr(Cur->getExprLoc(), Cur->getType(),
8189 Cur->getValueKind(), Cur->getObjectKind(), Cur);
8190 Expr *IndexExpr =
8191 new (S.Context) ArrayInitIndexExpr(S.Context.getSizeType());
8192 CurInit = S.CreateBuiltinArraySubscriptExpr(
8193 BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8194 ArrayLoopCommonExprs.push_back(BaseExpr);
8195 break;
8196 }
8197
8198 case SK_ArrayLoopInit: {
8199 assert(!ArrayLoopCommonExprs.empty() &&
8200 "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8201 Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8202 CurInit = new (S.Context) ArrayInitLoopExpr(Step->Type, Common,
8203 CurInit.get());
8204 break;
8205 }
8206
8207 case SK_GNUArrayInit:
8208 // Okay: we checked everything before creating this step. Note that
8209 // this is a GNU extension.
8210 S.Diag(Kind.getLocation(), diag::ext_array_init_copy)
8211 << Step->Type << CurInit.get()->getType()
8212 << CurInit.get()->getSourceRange();
8213 updateGNUCompoundLiteralRValue(CurInit.get());
8214 [[fallthrough]];
8215 case SK_ArrayInit:
8216 // If the destination type is an incomplete array type, update the
8217 // type accordingly.
8218 if (ResultType) {
8219 if (const IncompleteArrayType *IncompleteDest
8220 = S.Context.getAsIncompleteArrayType(Step->Type)) {
8221 if (const ConstantArrayType *ConstantSource
8222 = S.Context.getAsConstantArrayType(CurInit.get()->getType())) {
8223 *ResultType = S.Context.getConstantArrayType(
8224 IncompleteDest->getElementType(), ConstantSource->getSize(),
8225 ConstantSource->getSizeExpr(), ArraySizeModifier::Normal, 0);
8226 }
8227 }
8228 }
8229 break;
8230
8231 case SK_ParenthesizedArrayInit:
8232 // Okay: we checked everything before creating this step. Note that
8233 // this is a GNU extension.
8234 S.Diag(Kind.getLocation(), diag::ext_array_init_parens)
8235 << CurInit.get()->getSourceRange();
8236 break;
8237
8238 case SK_PassByIndirectCopyRestore:
8239 case SK_PassByIndirectRestore:
8240 checkIndirectCopyRestoreSource(S, CurInit.get());
8241 CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr(
8242 CurInit.get(), Step->Type,
8243 Step->Kind == SK_PassByIndirectCopyRestore);
8244 break;
8245
8246 case SK_ProduceObjCObject:
8247 CurInit = ImplicitCastExpr::Create(
8248 S.Context, Step->Type, CK_ARCProduceObject, CurInit.get(), nullptr,
8249 VK_PRValue, FPOptionsOverride());
8250 break;
8251
8252 case SK_StdInitializerList: {
8253 S.Diag(CurInit.get()->getExprLoc(),
8254 diag::warn_cxx98_compat_initializer_list_init)
8255 << CurInit.get()->getSourceRange();
8256
8257 // Materialize the temporary into memory.
8258 MaterializeTemporaryExpr *MTE = S.CreateMaterializeTemporaryExpr(
8259 CurInit.get()->getType(), CurInit.get(),
8260 /*BoundToLvalueReference=*/false);
8261
8262 // Wrap it in a construction of a std::initializer_list<T>.
8263 CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
8264
8265 if (!Step->Type->isDependentType()) {
8266 QualType ElementType;
8267 [[maybe_unused]] bool IsStdInitializerList =
8268 S.isStdInitializerList(Step->Type, &ElementType);
8269 assert(IsStdInitializerList &&
8270 "StdInitializerList step to non-std::initializer_list");
8271 const CXXRecordDecl *Record =
8272 Step->Type->getAsCXXRecordDecl()->getDefinition();
8273 assert(Record && Record->isCompleteDefinition() &&
8274 "std::initializer_list should have already be "
8275 "complete/instantiated by this point");
8276
8277 auto InvalidType = [&] {
8278 S.Diag(Record->getLocation(),
8279 diag::err_std_initializer_list_malformed)
8280 << Step->Type.getUnqualifiedType();
8281 return ExprError();
8282 };
8283
8284 if (Record->isUnion() || Record->getNumBases() != 0 ||
8285 Record->isPolymorphic())
8286 return InvalidType();
8287
8288 RecordDecl::field_iterator Field = Record->field_begin();
8289 if (Field == Record->field_end())
8290 return InvalidType();
8291
8292 // Start pointer
8293 if (!Field->getType()->isPointerType() ||
8294 !S.Context.hasSameType(Field->getType()->getPointeeType(),
8295 ElementType.withConst()))
8296 return InvalidType();
8297
8298 if (++Field == Record->field_end())
8299 return InvalidType();
8300
8301 // Size or end pointer
8302 if (const auto *PT = Field->getType()->getAs<PointerType>()) {
8303 if (!S.Context.hasSameType(PT->getPointeeType(),
8304 ElementType.withConst()))
8305 return InvalidType();
8306 } else {
8307 if (Field->isBitField() ||
8308 !S.Context.hasSameType(Field->getType(), S.Context.getSizeType()))
8309 return InvalidType();
8310 }
8311
8312 if (++Field != Record->field_end())
8313 return InvalidType();
8314 }
8315
8316 // Bind the result, in case the library has given initializer_list a
8317 // non-trivial destructor.
8318 if (shouldBindAsTemporary(Entity))
8319 CurInit = S.MaybeBindToTemporary(CurInit.get());
8320 break;
8321 }
8322
8323 case SK_OCLSamplerInit: {
8324 // Sampler initialization have 5 cases:
8325 // 1. function argument passing
8326 // 1a. argument is a file-scope variable
8327 // 1b. argument is a function-scope variable
8328 // 1c. argument is one of caller function's parameters
8329 // 2. variable initialization
8330 // 2a. initializing a file-scope variable
8331 // 2b. initializing a function-scope variable
8332 //
8333 // For file-scope variables, since they cannot be initialized by function
8334 // call of __translate_sampler_initializer in LLVM IR, their references
8335 // need to be replaced by a cast from their literal initializers to
8336 // sampler type. Since sampler variables can only be used in function
8337 // calls as arguments, we only need to replace them when handling the
8338 // argument passing.
8339 assert(Step->Type->isSamplerT() &&
8340 "Sampler initialization on non-sampler type.");
8341 Expr *Init = CurInit.get()->IgnoreParens();
8342 QualType SourceType = Init->getType();
8343 // Case 1
8344 if (Entity.isParameterKind()) {
8345 if (!SourceType->isSamplerT() && !SourceType->isIntegerType()) {
8346 S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8347 << SourceType;
8348 break;
8349 } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Init)) {
8350 auto Var = cast<VarDecl>(DRE->getDecl());
8351 // Case 1b and 1c
8352 // No cast from integer to sampler is needed.
8353 if (!Var->hasGlobalStorage()) {
8354 CurInit = ImplicitCastExpr::Create(
8355 S.Context, Step->Type, CK_LValueToRValue, Init,
8356 /*BasePath=*/nullptr, VK_PRValue, FPOptionsOverride());
8357 break;
8358 }
8359 // Case 1a
8360 // For function call with a file-scope sampler variable as argument,
8361 // get the integer literal.
8362 // Do not diagnose if the file-scope variable does not have initializer
8363 // since this has already been diagnosed when parsing the variable
8364 // declaration.
8365 if (!Var->getInit() || !isa<ImplicitCastExpr>(Var->getInit()))
8366 break;
8367 Init = cast<ImplicitCastExpr>(const_cast<Expr*>(
8368 Var->getInit()))->getSubExpr();
8369 SourceType = Init->getType();
8370 }
8371 } else {
8372 // Case 2
8373 // Check initializer is 32 bit integer constant.
8374 // If the initializer is taken from global variable, do not diagnose since
8375 // this has already been done when parsing the variable declaration.
8376 if (!Init->isConstantInitializer(S.Context, false))
8377 break;
8378
8379 if (!SourceType->isIntegerType() ||
8380 32 != S.Context.getIntWidth(SourceType)) {
8381 S.Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8382 << SourceType;
8383 break;
8384 }
8385
8386 Expr::EvalResult EVResult;
8387 Init->EvaluateAsInt(EVResult, S.Context);
8388 llvm::APSInt Result = EVResult.Val.getInt();
8389 const uint64_t SamplerValue = Result.getLimitedValue();
8390 // 32-bit value of sampler's initializer is interpreted as
8391 // bit-field with the following structure:
8392 // |unspecified|Filter|Addressing Mode| Normalized Coords|
8393 // |31 6|5 4|3 1| 0|
8394 // This structure corresponds to enum values of sampler properties
8395 // defined in SPIR spec v1.2 and also opencl-c.h
8396 unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8397 unsigned FilterMode = (0x30 & SamplerValue) >> 4;
8398 if (FilterMode != 1 && FilterMode != 2 &&
8399 !S.getOpenCLOptions().isAvailableOption(
8400 "cl_intel_device_side_avc_motion_estimation", S.getLangOpts()))
8401 S.Diag(Kind.getLocation(),
8402 diag::warn_sampler_initializer_invalid_bits)
8403 << "Filter Mode";
8404 if (AddressingMode > 4)
8405 S.Diag(Kind.getLocation(),
8406 diag::warn_sampler_initializer_invalid_bits)
8407 << "Addressing Mode";
8408 }
8409
8410 // Cases 1a, 2a and 2b
8411 // Insert cast from integer to sampler.
8412 CurInit = S.ImpCastExprToType(Init, S.Context.OCLSamplerTy,
8413 CK_IntToOCLSampler);
8414 break;
8415 }
8416 case SK_OCLZeroOpaqueType: {
8417 assert((Step->Type->isEventT() || Step->Type->isQueueT() ||
8418 Step->Type->isOCLIntelSubgroupAVCType()) &&
8419 "Wrong type for initialization of OpenCL opaque type.");
8420
8421 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8422 CK_ZeroToOCLOpaqueType,
8423 CurInit.get()->getValueKind());
8424 break;
8425 }
8426 case SK_ParenthesizedListInit: {
8427 CurInit = nullptr;
8428 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
8429 /*VerifyOnly=*/false, &CurInit);
8430 if (CurInit.get() && ResultType)
8431 *ResultType = CurInit.get()->getType();
8432 if (shouldBindAsTemporary(Entity))
8433 CurInit = S.MaybeBindToTemporary(CurInit.get());
8434 break;
8435 }
8436 }
8437 }
8438
8439 Expr *Init = CurInit.get();
8440 if (!Init)
8441 return ExprError();
8442
8443 // Check whether the initializer has a shorter lifetime than the initialized
8444 // entity, and if not, either lifetime-extend or warn as appropriate.
8445 S.checkInitializerLifetime(Entity, Init);
8446
8447 // Diagnose non-fatal problems with the completed initialization.
8448 if (InitializedEntity::EntityKind EK = Entity.getKind();
8449 (EK == InitializedEntity::EK_Member ||
8450 EK == InitializedEntity::EK_ParenAggInitMember) &&
8451 cast<FieldDecl>(Entity.getDecl())->isBitField())
8452 S.CheckBitFieldInitialization(Kind.getLocation(),
8453 cast<FieldDecl>(Entity.getDecl()), Init);
8454
8455 // Check for std::move on construction.
8456 CheckMoveOnConstruction(S, Init,
8457 Entity.getKind() == InitializedEntity::EK_Result);
8458
8459 return Init;
8460 }
8461
8462 /// Somewhere within T there is an uninitialized reference subobject.
8463 /// Dig it out and diagnose it.
DiagnoseUninitializedReference(Sema & S,SourceLocation Loc,QualType T)8464 static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc,
8465 QualType T) {
8466 if (T->isReferenceType()) {
8467 S.Diag(Loc, diag::err_reference_without_init)
8468 << T.getNonReferenceType();
8469 return true;
8470 }
8471
8472 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
8473 if (!RD || !RD->hasUninitializedReferenceMember())
8474 return false;
8475
8476 for (const auto *FI : RD->fields()) {
8477 if (FI->isUnnamedBitField())
8478 continue;
8479
8480 if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) {
8481 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8482 return true;
8483 }
8484 }
8485
8486 for (const auto &BI : RD->bases()) {
8487 if (DiagnoseUninitializedReference(S, BI.getBeginLoc(), BI.getType())) {
8488 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8489 return true;
8490 }
8491 }
8492
8493 return false;
8494 }
8495
8496
8497 //===----------------------------------------------------------------------===//
8498 // Diagnose initialization failures
8499 //===----------------------------------------------------------------------===//
8500
8501 /// Emit notes associated with an initialization that failed due to a
8502 /// "simple" conversion failure.
emitBadConversionNotes(Sema & S,const InitializedEntity & entity,Expr * op)8503 static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity,
8504 Expr *op) {
8505 QualType destType = entity.getType();
8506 if (destType.getNonReferenceType()->isObjCObjectPointerType() &&
8507 op->getType()->isObjCObjectPointerType()) {
8508
8509 // Emit a possible note about the conversion failing because the
8510 // operand is a message send with a related result type.
8511 S.ObjC().EmitRelatedResultTypeNote(op);
8512
8513 // Emit a possible note about a return failing because we're
8514 // expecting a related result type.
8515 if (entity.getKind() == InitializedEntity::EK_Result)
8516 S.ObjC().EmitRelatedResultTypeNoteForReturn(destType);
8517 }
8518 QualType fromType = op->getType();
8519 QualType fromPointeeType = fromType.getCanonicalType()->getPointeeType();
8520 QualType destPointeeType = destType.getCanonicalType()->getPointeeType();
8521 auto *fromDecl = fromType->getPointeeCXXRecordDecl();
8522 auto *destDecl = destType->getPointeeCXXRecordDecl();
8523 if (fromDecl && destDecl && fromDecl->getDeclKind() == Decl::CXXRecord &&
8524 destDecl->getDeclKind() == Decl::CXXRecord &&
8525 !fromDecl->isInvalidDecl() && !destDecl->isInvalidDecl() &&
8526 !fromDecl->hasDefinition() &&
8527 destPointeeType.getQualifiers().compatiblyIncludes(
8528 fromPointeeType.getQualifiers()))
8529 S.Diag(fromDecl->getLocation(), diag::note_forward_class_conversion)
8530 << S.getASTContext().getTagDeclType(fromDecl)
8531 << S.getASTContext().getTagDeclType(destDecl);
8532 }
8533
diagnoseListInit(Sema & S,const InitializedEntity & Entity,InitListExpr * InitList)8534 static void diagnoseListInit(Sema &S, const InitializedEntity &Entity,
8535 InitListExpr *InitList) {
8536 QualType DestType = Entity.getType();
8537
8538 QualType E;
8539 if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) {
8540 QualType ArrayType = S.Context.getConstantArrayType(
8541 E.withConst(),
8542 llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
8543 InitList->getNumInits()),
8544 nullptr, clang::ArraySizeModifier::Normal, 0);
8545 InitializedEntity HiddenArray =
8546 InitializedEntity::InitializeTemporary(ArrayType);
8547 return diagnoseListInit(S, HiddenArray, InitList);
8548 }
8549
8550 if (DestType->isReferenceType()) {
8551 // A list-initialization failure for a reference means that we tried to
8552 // create a temporary of the inner type (per [dcl.init.list]p3.6) and the
8553 // inner initialization failed.
8554 QualType T = DestType->castAs<ReferenceType>()->getPointeeType();
8555 diagnoseListInit(S, InitializedEntity::InitializeTemporary(T), InitList);
8556 SourceLocation Loc = InitList->getBeginLoc();
8557 if (auto *D = Entity.getDecl())
8558 Loc = D->getLocation();
8559 S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
8560 return;
8561 }
8562
8563 InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
8564 /*VerifyOnly=*/false,
8565 /*TreatUnavailableAsInvalid=*/false);
8566 assert(DiagnoseInitList.HadError() &&
8567 "Inconsistent init list check result.");
8568 }
8569
Diagnose(Sema & S,const InitializedEntity & Entity,const InitializationKind & Kind,ArrayRef<Expr * > Args)8570 bool InitializationSequence::Diagnose(Sema &S,
8571 const InitializedEntity &Entity,
8572 const InitializationKind &Kind,
8573 ArrayRef<Expr *> Args) {
8574 if (!Failed())
8575 return false;
8576
8577 QualType DestType = Entity.getType();
8578
8579 // When we want to diagnose only one element of a braced-init-list,
8580 // we need to factor it out.
8581 Expr *OnlyArg;
8582 if (Args.size() == 1) {
8583 auto *List = dyn_cast<InitListExpr>(Args[0]);
8584 if (List && List->getNumInits() == 1)
8585 OnlyArg = List->getInit(0);
8586 else
8587 OnlyArg = Args[0];
8588
8589 if (OnlyArg->getType() == S.Context.OverloadTy) {
8590 DeclAccessPair Found;
8591 if (FunctionDecl *FD = S.ResolveAddressOfOverloadedFunction(
8592 OnlyArg, DestType.getNonReferenceType(), /*Complain=*/false,
8593 Found)) {
8594 if (Expr *Resolved =
8595 S.FixOverloadedFunctionReference(OnlyArg, Found, FD).get())
8596 OnlyArg = Resolved;
8597 }
8598 }
8599 }
8600 else
8601 OnlyArg = nullptr;
8602
8603 switch (Failure) {
8604 case FK_TooManyInitsForReference:
8605 // FIXME: Customize for the initialized entity?
8606 if (Args.empty()) {
8607 // Dig out the reference subobject which is uninitialized and diagnose it.
8608 // If this is value-initialization, this could be nested some way within
8609 // the target type.
8610 assert(Kind.getKind() == InitializationKind::IK_Value ||
8611 DestType->isReferenceType());
8612 bool Diagnosed =
8613 DiagnoseUninitializedReference(S, Kind.getLocation(), DestType);
8614 assert(Diagnosed && "couldn't find uninitialized reference to diagnose");
8615 (void)Diagnosed;
8616 } else // FIXME: diagnostic below could be better!
8617 S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
8618 << SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
8619 break;
8620 case FK_ParenthesizedListInitForReference:
8621 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8622 << 1 << Entity.getType() << Args[0]->getSourceRange();
8623 break;
8624
8625 case FK_ArrayNeedsInitList:
8626 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
8627 break;
8628 case FK_ArrayNeedsInitListOrStringLiteral:
8629 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
8630 break;
8631 case FK_ArrayNeedsInitListOrWideStringLiteral:
8632 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
8633 break;
8634 case FK_NarrowStringIntoWideCharArray:
8635 S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
8636 break;
8637 case FK_WideStringIntoCharArray:
8638 S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
8639 break;
8640 case FK_IncompatWideStringIntoWideChar:
8641 S.Diag(Kind.getLocation(),
8642 diag::err_array_init_incompat_wide_string_into_wchar);
8643 break;
8644 case FK_PlainStringIntoUTF8Char:
8645 S.Diag(Kind.getLocation(),
8646 diag::err_array_init_plain_string_into_char8_t);
8647 S.Diag(Args.front()->getBeginLoc(),
8648 diag::note_array_init_plain_string_into_char8_t)
8649 << FixItHint::CreateInsertion(Args.front()->getBeginLoc(), "u8");
8650 break;
8651 case FK_UTF8StringIntoPlainChar:
8652 S.Diag(Kind.getLocation(), diag::err_array_init_utf8_string_into_char)
8653 << DestType->isSignedIntegerType() << S.getLangOpts().CPlusPlus20;
8654 break;
8655 case FK_ArrayTypeMismatch:
8656 case FK_NonConstantArrayInit:
8657 S.Diag(Kind.getLocation(),
8658 (Failure == FK_ArrayTypeMismatch
8659 ? diag::err_array_init_different_type
8660 : diag::err_array_init_non_constant_array))
8661 << DestType.getNonReferenceType()
8662 << OnlyArg->getType()
8663 << Args[0]->getSourceRange();
8664 break;
8665
8666 case FK_VariableLengthArrayHasInitializer:
8667 S.Diag(Kind.getLocation(), diag::err_variable_object_no_init)
8668 << Args[0]->getSourceRange();
8669 break;
8670
8671 case FK_AddressOfOverloadFailed: {
8672 DeclAccessPair Found;
8673 S.ResolveAddressOfOverloadedFunction(OnlyArg,
8674 DestType.getNonReferenceType(),
8675 true,
8676 Found);
8677 break;
8678 }
8679
8680 case FK_AddressOfUnaddressableFunction: {
8681 auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(OnlyArg)->getDecl());
8682 S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
8683 OnlyArg->getBeginLoc());
8684 break;
8685 }
8686
8687 case FK_ReferenceInitOverloadFailed:
8688 case FK_UserConversionOverloadFailed:
8689 switch (FailedOverloadResult) {
8690 case OR_Ambiguous:
8691
8692 FailedCandidateSet.NoteCandidates(
8693 PartialDiagnosticAt(
8694 Kind.getLocation(),
8695 Failure == FK_UserConversionOverloadFailed
8696 ? (S.PDiag(diag::err_typecheck_ambiguous_condition)
8697 << OnlyArg->getType() << DestType
8698 << Args[0]->getSourceRange())
8699 : (S.PDiag(diag::err_ref_init_ambiguous)
8700 << DestType << OnlyArg->getType()
8701 << Args[0]->getSourceRange())),
8702 S, OCD_AmbiguousCandidates, Args);
8703 break;
8704
8705 case OR_No_Viable_Function: {
8706 auto Cands = FailedCandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args);
8707 if (!S.RequireCompleteType(Kind.getLocation(),
8708 DestType.getNonReferenceType(),
8709 diag::err_typecheck_nonviable_condition_incomplete,
8710 OnlyArg->getType(), Args[0]->getSourceRange()))
8711 S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
8712 << (Entity.getKind() == InitializedEntity::EK_Result)
8713 << OnlyArg->getType() << Args[0]->getSourceRange()
8714 << DestType.getNonReferenceType();
8715
8716 FailedCandidateSet.NoteCandidates(S, Args, Cands);
8717 break;
8718 }
8719 case OR_Deleted: {
8720 OverloadCandidateSet::iterator Best;
8721 OverloadingResult Ovl
8722 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
8723
8724 StringLiteral *Msg = Best->Function->getDeletedMessage();
8725 S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
8726 << OnlyArg->getType() << DestType.getNonReferenceType()
8727 << (Msg != nullptr) << (Msg ? Msg->getString() : StringRef())
8728 << Args[0]->getSourceRange();
8729 if (Ovl == OR_Deleted) {
8730 S.NoteDeletedFunction(Best->Function);
8731 } else {
8732 llvm_unreachable("Inconsistent overload resolution?");
8733 }
8734 break;
8735 }
8736
8737 case OR_Success:
8738 llvm_unreachable("Conversion did not fail!");
8739 }
8740 break;
8741
8742 case FK_NonConstLValueReferenceBindingToTemporary:
8743 if (isa<InitListExpr>(Args[0])) {
8744 S.Diag(Kind.getLocation(),
8745 diag::err_lvalue_reference_bind_to_initlist)
8746 << DestType.getNonReferenceType().isVolatileQualified()
8747 << DestType.getNonReferenceType()
8748 << Args[0]->getSourceRange();
8749 break;
8750 }
8751 [[fallthrough]];
8752
8753 case FK_NonConstLValueReferenceBindingToUnrelated:
8754 S.Diag(Kind.getLocation(),
8755 Failure == FK_NonConstLValueReferenceBindingToTemporary
8756 ? diag::err_lvalue_reference_bind_to_temporary
8757 : diag::err_lvalue_reference_bind_to_unrelated)
8758 << DestType.getNonReferenceType().isVolatileQualified()
8759 << DestType.getNonReferenceType()
8760 << OnlyArg->getType()
8761 << Args[0]->getSourceRange();
8762 break;
8763
8764 case FK_NonConstLValueReferenceBindingToBitfield: {
8765 // We don't necessarily have an unambiguous source bit-field.
8766 FieldDecl *BitField = Args[0]->getSourceBitField();
8767 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
8768 << DestType.isVolatileQualified()
8769 << (BitField ? BitField->getDeclName() : DeclarationName())
8770 << (BitField != nullptr)
8771 << Args[0]->getSourceRange();
8772 if (BitField)
8773 S.Diag(BitField->getLocation(), diag::note_bitfield_decl);
8774 break;
8775 }
8776
8777 case FK_NonConstLValueReferenceBindingToVectorElement:
8778 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
8779 << DestType.isVolatileQualified()
8780 << Args[0]->getSourceRange();
8781 break;
8782
8783 case FK_NonConstLValueReferenceBindingToMatrixElement:
8784 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_matrix_element)
8785 << DestType.isVolatileQualified() << Args[0]->getSourceRange();
8786 break;
8787
8788 case FK_RValueReferenceBindingToLValue:
8789 S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
8790 << DestType.getNonReferenceType() << OnlyArg->getType()
8791 << Args[0]->getSourceRange();
8792 break;
8793
8794 case FK_ReferenceAddrspaceMismatchTemporary:
8795 S.Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
8796 << DestType << Args[0]->getSourceRange();
8797 break;
8798
8799 case FK_ReferenceInitDropsQualifiers: {
8800 QualType SourceType = OnlyArg->getType();
8801 QualType NonRefType = DestType.getNonReferenceType();
8802 Qualifiers DroppedQualifiers =
8803 SourceType.getQualifiers() - NonRefType.getQualifiers();
8804
8805 if (!NonRefType.getQualifiers().isAddressSpaceSupersetOf(
8806 SourceType.getQualifiers()))
8807 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8808 << NonRefType << SourceType << 1 /*addr space*/
8809 << Args[0]->getSourceRange();
8810 else if (DroppedQualifiers.hasQualifiers())
8811 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8812 << NonRefType << SourceType << 0 /*cv quals*/
8813 << Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers())
8814 << DroppedQualifiers.getCVRQualifiers() << Args[0]->getSourceRange();
8815 else
8816 // FIXME: Consider decomposing the type and explaining which qualifiers
8817 // were dropped where, or on which level a 'const' is missing, etc.
8818 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8819 << NonRefType << SourceType << 2 /*incompatible quals*/
8820 << Args[0]->getSourceRange();
8821 break;
8822 }
8823
8824 case FK_ReferenceInitFailed:
8825 S.Diag(Kind.getLocation(), diag::err_reference_bind_failed)
8826 << DestType.getNonReferenceType()
8827 << DestType.getNonReferenceType()->isIncompleteType()
8828 << OnlyArg->isLValue()
8829 << OnlyArg->getType()
8830 << Args[0]->getSourceRange();
8831 emitBadConversionNotes(S, Entity, Args[0]);
8832 break;
8833
8834 case FK_ConversionFailed: {
8835 QualType FromType = OnlyArg->getType();
8836 PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
8837 << (int)Entity.getKind()
8838 << DestType
8839 << OnlyArg->isLValue()
8840 << FromType
8841 << Args[0]->getSourceRange();
8842 S.HandleFunctionTypeMismatch(PDiag, FromType, DestType);
8843 S.Diag(Kind.getLocation(), PDiag);
8844 emitBadConversionNotes(S, Entity, Args[0]);
8845 break;
8846 }
8847
8848 case FK_ConversionFromPropertyFailed:
8849 // No-op. This error has already been reported.
8850 break;
8851
8852 case FK_TooManyInitsForScalar: {
8853 SourceRange R;
8854
8855 auto *InitList = dyn_cast<InitListExpr>(Args[0]);
8856 if (InitList && InitList->getNumInits() >= 1) {
8857 R = SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
8858 } else {
8859 assert(Args.size() > 1 && "Expected multiple initializers!");
8860 R = SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
8861 }
8862
8863 R.setBegin(S.getLocForEndOfToken(R.getBegin()));
8864 if (Kind.isCStyleOrFunctionalCast())
8865 S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
8866 << R;
8867 else
8868 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
8869 << /*scalar=*/2 << R;
8870 break;
8871 }
8872
8873 case FK_ParenthesizedListInitForScalar:
8874 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8875 << 0 << Entity.getType() << Args[0]->getSourceRange();
8876 break;
8877
8878 case FK_ReferenceBindingToInitList:
8879 S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
8880 << DestType.getNonReferenceType() << Args[0]->getSourceRange();
8881 break;
8882
8883 case FK_InitListBadDestinationType:
8884 S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
8885 << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange();
8886 break;
8887
8888 case FK_ListConstructorOverloadFailed:
8889 case FK_ConstructorOverloadFailed: {
8890 SourceRange ArgsRange;
8891 if (Args.size())
8892 ArgsRange =
8893 SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
8894
8895 if (Failure == FK_ListConstructorOverloadFailed) {
8896 assert(Args.size() == 1 &&
8897 "List construction from other than 1 argument.");
8898 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
8899 Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
8900 }
8901
8902 // FIXME: Using "DestType" for the entity we're printing is probably
8903 // bad.
8904 switch (FailedOverloadResult) {
8905 case OR_Ambiguous:
8906 FailedCandidateSet.NoteCandidates(
8907 PartialDiagnosticAt(Kind.getLocation(),
8908 S.PDiag(diag::err_ovl_ambiguous_init)
8909 << DestType << ArgsRange),
8910 S, OCD_AmbiguousCandidates, Args);
8911 break;
8912
8913 case OR_No_Viable_Function:
8914 if (Kind.getKind() == InitializationKind::IK_Default &&
8915 (Entity.getKind() == InitializedEntity::EK_Base ||
8916 Entity.getKind() == InitializedEntity::EK_Member ||
8917 Entity.getKind() == InitializedEntity::EK_ParenAggInitMember) &&
8918 isa<CXXConstructorDecl>(S.CurContext)) {
8919 // This is implicit default initialization of a member or
8920 // base within a constructor. If no viable function was
8921 // found, notify the user that they need to explicitly
8922 // initialize this base/member.
8923 CXXConstructorDecl *Constructor
8924 = cast<CXXConstructorDecl>(S.CurContext);
8925 const CXXRecordDecl *InheritedFrom = nullptr;
8926 if (auto Inherited = Constructor->getInheritedConstructor())
8927 InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
8928 if (Entity.getKind() == InitializedEntity::EK_Base) {
8929 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
8930 << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
8931 << S.Context.getTypeDeclType(Constructor->getParent())
8932 << /*base=*/0
8933 << Entity.getType()
8934 << InheritedFrom;
8935
8936 RecordDecl *BaseDecl
8937 = Entity.getBaseSpecifier()->getType()->castAs<RecordType>()
8938 ->getDecl();
8939 S.Diag(BaseDecl->getLocation(), diag::note_previous_decl)
8940 << S.Context.getTagDeclType(BaseDecl);
8941 } else {
8942 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
8943 << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
8944 << S.Context.getTypeDeclType(Constructor->getParent())
8945 << /*member=*/1
8946 << Entity.getName()
8947 << InheritedFrom;
8948 S.Diag(Entity.getDecl()->getLocation(),
8949 diag::note_member_declared_at);
8950
8951 if (const RecordType *Record
8952 = Entity.getType()->getAs<RecordType>())
8953 S.Diag(Record->getDecl()->getLocation(),
8954 diag::note_previous_decl)
8955 << S.Context.getTagDeclType(Record->getDecl());
8956 }
8957 break;
8958 }
8959
8960 FailedCandidateSet.NoteCandidates(
8961 PartialDiagnosticAt(
8962 Kind.getLocation(),
8963 S.PDiag(diag::err_ovl_no_viable_function_in_init)
8964 << DestType << ArgsRange),
8965 S, OCD_AllCandidates, Args);
8966 break;
8967
8968 case OR_Deleted: {
8969 OverloadCandidateSet::iterator Best;
8970 OverloadingResult Ovl
8971 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
8972 if (Ovl != OR_Deleted) {
8973 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
8974 << DestType << ArgsRange;
8975 llvm_unreachable("Inconsistent overload resolution?");
8976 break;
8977 }
8978
8979 // If this is a defaulted or implicitly-declared function, then
8980 // it was implicitly deleted. Make it clear that the deletion was
8981 // implicit.
8982 if (S.isImplicitlyDeleted(Best->Function))
8983 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
8984 << llvm::to_underlying(
8985 S.getSpecialMember(cast<CXXMethodDecl>(Best->Function)))
8986 << DestType << ArgsRange;
8987 else {
8988 StringLiteral *Msg = Best->Function->getDeletedMessage();
8989 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
8990 << DestType << (Msg != nullptr)
8991 << (Msg ? Msg->getString() : StringRef()) << ArgsRange;
8992 }
8993
8994 S.NoteDeletedFunction(Best->Function);
8995 break;
8996 }
8997
8998 case OR_Success:
8999 llvm_unreachable("Conversion did not fail!");
9000 }
9001 }
9002 break;
9003
9004 case FK_DefaultInitOfConst:
9005 if (Entity.getKind() == InitializedEntity::EK_Member &&
9006 isa<CXXConstructorDecl>(S.CurContext)) {
9007 // This is implicit default-initialization of a const member in
9008 // a constructor. Complain that it needs to be explicitly
9009 // initialized.
9010 CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(S.CurContext);
9011 S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
9012 << (Constructor->getInheritedConstructor() ? 2 :
9013 Constructor->isImplicit() ? 1 : 0)
9014 << S.Context.getTypeDeclType(Constructor->getParent())
9015 << /*const=*/1
9016 << Entity.getName();
9017 S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl)
9018 << Entity.getName();
9019 } else if (const auto *VD = dyn_cast_if_present<VarDecl>(Entity.getDecl());
9020 VD && VD->isConstexpr()) {
9021 S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
9022 << VD;
9023 } else {
9024 S.Diag(Kind.getLocation(), diag::err_default_init_const)
9025 << DestType << (bool)DestType->getAs<RecordType>();
9026 }
9027 break;
9028
9029 case FK_Incomplete:
9030 S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
9031 diag::err_init_incomplete_type);
9032 break;
9033
9034 case FK_ListInitializationFailed: {
9035 // Run the init list checker again to emit diagnostics.
9036 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9037 diagnoseListInit(S, Entity, InitList);
9038 break;
9039 }
9040
9041 case FK_PlaceholderType: {
9042 // FIXME: Already diagnosed!
9043 break;
9044 }
9045
9046 case FK_ExplicitConstructor: {
9047 S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9048 << Args[0]->getSourceRange();
9049 OverloadCandidateSet::iterator Best;
9050 OverloadingResult Ovl
9051 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9052 (void)Ovl;
9053 assert(Ovl == OR_Success && "Inconsistent overload resolution");
9054 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
9055 S.Diag(CtorDecl->getLocation(),
9056 diag::note_explicit_ctor_deduction_guide_here) << false;
9057 break;
9058 }
9059
9060 case FK_ParenthesizedListInitFailed:
9061 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
9062 /*VerifyOnly=*/false);
9063 break;
9064
9065 case FK_DesignatedInitForNonAggregate:
9066 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9067 S.Diag(Kind.getLocation(), diag::err_designated_init_for_non_aggregate)
9068 << Entity.getType() << InitList->getSourceRange();
9069 break;
9070 }
9071
9072 PrintInitLocationNote(S, Entity);
9073 return true;
9074 }
9075
dump(raw_ostream & OS) const9076 void InitializationSequence::dump(raw_ostream &OS) const {
9077 switch (SequenceKind) {
9078 case FailedSequence: {
9079 OS << "Failed sequence: ";
9080 switch (Failure) {
9081 case FK_TooManyInitsForReference:
9082 OS << "too many initializers for reference";
9083 break;
9084
9085 case FK_ParenthesizedListInitForReference:
9086 OS << "parenthesized list init for reference";
9087 break;
9088
9089 case FK_ArrayNeedsInitList:
9090 OS << "array requires initializer list";
9091 break;
9092
9093 case FK_AddressOfUnaddressableFunction:
9094 OS << "address of unaddressable function was taken";
9095 break;
9096
9097 case FK_ArrayNeedsInitListOrStringLiteral:
9098 OS << "array requires initializer list or string literal";
9099 break;
9100
9101 case FK_ArrayNeedsInitListOrWideStringLiteral:
9102 OS << "array requires initializer list or wide string literal";
9103 break;
9104
9105 case FK_NarrowStringIntoWideCharArray:
9106 OS << "narrow string into wide char array";
9107 break;
9108
9109 case FK_WideStringIntoCharArray:
9110 OS << "wide string into char array";
9111 break;
9112
9113 case FK_IncompatWideStringIntoWideChar:
9114 OS << "incompatible wide string into wide char array";
9115 break;
9116
9117 case FK_PlainStringIntoUTF8Char:
9118 OS << "plain string literal into char8_t array";
9119 break;
9120
9121 case FK_UTF8StringIntoPlainChar:
9122 OS << "u8 string literal into char array";
9123 break;
9124
9125 case FK_ArrayTypeMismatch:
9126 OS << "array type mismatch";
9127 break;
9128
9129 case FK_NonConstantArrayInit:
9130 OS << "non-constant array initializer";
9131 break;
9132
9133 case FK_AddressOfOverloadFailed:
9134 OS << "address of overloaded function failed";
9135 break;
9136
9137 case FK_ReferenceInitOverloadFailed:
9138 OS << "overload resolution for reference initialization failed";
9139 break;
9140
9141 case FK_NonConstLValueReferenceBindingToTemporary:
9142 OS << "non-const lvalue reference bound to temporary";
9143 break;
9144
9145 case FK_NonConstLValueReferenceBindingToBitfield:
9146 OS << "non-const lvalue reference bound to bit-field";
9147 break;
9148
9149 case FK_NonConstLValueReferenceBindingToVectorElement:
9150 OS << "non-const lvalue reference bound to vector element";
9151 break;
9152
9153 case FK_NonConstLValueReferenceBindingToMatrixElement:
9154 OS << "non-const lvalue reference bound to matrix element";
9155 break;
9156
9157 case FK_NonConstLValueReferenceBindingToUnrelated:
9158 OS << "non-const lvalue reference bound to unrelated type";
9159 break;
9160
9161 case FK_RValueReferenceBindingToLValue:
9162 OS << "rvalue reference bound to an lvalue";
9163 break;
9164
9165 case FK_ReferenceInitDropsQualifiers:
9166 OS << "reference initialization drops qualifiers";
9167 break;
9168
9169 case FK_ReferenceAddrspaceMismatchTemporary:
9170 OS << "reference with mismatching address space bound to temporary";
9171 break;
9172
9173 case FK_ReferenceInitFailed:
9174 OS << "reference initialization failed";
9175 break;
9176
9177 case FK_ConversionFailed:
9178 OS << "conversion failed";
9179 break;
9180
9181 case FK_ConversionFromPropertyFailed:
9182 OS << "conversion from property failed";
9183 break;
9184
9185 case FK_TooManyInitsForScalar:
9186 OS << "too many initializers for scalar";
9187 break;
9188
9189 case FK_ParenthesizedListInitForScalar:
9190 OS << "parenthesized list init for reference";
9191 break;
9192
9193 case FK_ReferenceBindingToInitList:
9194 OS << "referencing binding to initializer list";
9195 break;
9196
9197 case FK_InitListBadDestinationType:
9198 OS << "initializer list for non-aggregate, non-scalar type";
9199 break;
9200
9201 case FK_UserConversionOverloadFailed:
9202 OS << "overloading failed for user-defined conversion";
9203 break;
9204
9205 case FK_ConstructorOverloadFailed:
9206 OS << "constructor overloading failed";
9207 break;
9208
9209 case FK_DefaultInitOfConst:
9210 OS << "default initialization of a const variable";
9211 break;
9212
9213 case FK_Incomplete:
9214 OS << "initialization of incomplete type";
9215 break;
9216
9217 case FK_ListInitializationFailed:
9218 OS << "list initialization checker failure";
9219 break;
9220
9221 case FK_VariableLengthArrayHasInitializer:
9222 OS << "variable length array has an initializer";
9223 break;
9224
9225 case FK_PlaceholderType:
9226 OS << "initializer expression isn't contextually valid";
9227 break;
9228
9229 case FK_ListConstructorOverloadFailed:
9230 OS << "list constructor overloading failed";
9231 break;
9232
9233 case FK_ExplicitConstructor:
9234 OS << "list copy initialization chose explicit constructor";
9235 break;
9236
9237 case FK_ParenthesizedListInitFailed:
9238 OS << "parenthesized list initialization failed";
9239 break;
9240
9241 case FK_DesignatedInitForNonAggregate:
9242 OS << "designated initializer for non-aggregate type";
9243 break;
9244 }
9245 OS << '\n';
9246 return;
9247 }
9248
9249 case DependentSequence:
9250 OS << "Dependent sequence\n";
9251 return;
9252
9253 case NormalSequence:
9254 OS << "Normal sequence: ";
9255 break;
9256 }
9257
9258 for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
9259 if (S != step_begin()) {
9260 OS << " -> ";
9261 }
9262
9263 switch (S->Kind) {
9264 case SK_ResolveAddressOfOverloadedFunction:
9265 OS << "resolve address of overloaded function";
9266 break;
9267
9268 case SK_CastDerivedToBasePRValue:
9269 OS << "derived-to-base (prvalue)";
9270 break;
9271
9272 case SK_CastDerivedToBaseXValue:
9273 OS << "derived-to-base (xvalue)";
9274 break;
9275
9276 case SK_CastDerivedToBaseLValue:
9277 OS << "derived-to-base (lvalue)";
9278 break;
9279
9280 case SK_BindReference:
9281 OS << "bind reference to lvalue";
9282 break;
9283
9284 case SK_BindReferenceToTemporary:
9285 OS << "bind reference to a temporary";
9286 break;
9287
9288 case SK_FinalCopy:
9289 OS << "final copy in class direct-initialization";
9290 break;
9291
9292 case SK_ExtraneousCopyToTemporary:
9293 OS << "extraneous C++03 copy to temporary";
9294 break;
9295
9296 case SK_UserConversion:
9297 OS << "user-defined conversion via " << *S->Function.Function;
9298 break;
9299
9300 case SK_QualificationConversionPRValue:
9301 OS << "qualification conversion (prvalue)";
9302 break;
9303
9304 case SK_QualificationConversionXValue:
9305 OS << "qualification conversion (xvalue)";
9306 break;
9307
9308 case SK_QualificationConversionLValue:
9309 OS << "qualification conversion (lvalue)";
9310 break;
9311
9312 case SK_FunctionReferenceConversion:
9313 OS << "function reference conversion";
9314 break;
9315
9316 case SK_AtomicConversion:
9317 OS << "non-atomic-to-atomic conversion";
9318 break;
9319
9320 case SK_ConversionSequence:
9321 OS << "implicit conversion sequence (";
9322 S->ICS->dump(); // FIXME: use OS
9323 OS << ")";
9324 break;
9325
9326 case SK_ConversionSequenceNoNarrowing:
9327 OS << "implicit conversion sequence with narrowing prohibited (";
9328 S->ICS->dump(); // FIXME: use OS
9329 OS << ")";
9330 break;
9331
9332 case SK_ListInitialization:
9333 OS << "list aggregate initialization";
9334 break;
9335
9336 case SK_UnwrapInitList:
9337 OS << "unwrap reference initializer list";
9338 break;
9339
9340 case SK_RewrapInitList:
9341 OS << "rewrap reference initializer list";
9342 break;
9343
9344 case SK_ConstructorInitialization:
9345 OS << "constructor initialization";
9346 break;
9347
9348 case SK_ConstructorInitializationFromList:
9349 OS << "list initialization via constructor";
9350 break;
9351
9352 case SK_ZeroInitialization:
9353 OS << "zero initialization";
9354 break;
9355
9356 case SK_CAssignment:
9357 OS << "C assignment";
9358 break;
9359
9360 case SK_StringInit:
9361 OS << "string initialization";
9362 break;
9363
9364 case SK_ObjCObjectConversion:
9365 OS << "Objective-C object conversion";
9366 break;
9367
9368 case SK_ArrayLoopIndex:
9369 OS << "indexing for array initialization loop";
9370 break;
9371
9372 case SK_ArrayLoopInit:
9373 OS << "array initialization loop";
9374 break;
9375
9376 case SK_ArrayInit:
9377 OS << "array initialization";
9378 break;
9379
9380 case SK_GNUArrayInit:
9381 OS << "array initialization (GNU extension)";
9382 break;
9383
9384 case SK_ParenthesizedArrayInit:
9385 OS << "parenthesized array initialization";
9386 break;
9387
9388 case SK_PassByIndirectCopyRestore:
9389 OS << "pass by indirect copy and restore";
9390 break;
9391
9392 case SK_PassByIndirectRestore:
9393 OS << "pass by indirect restore";
9394 break;
9395
9396 case SK_ProduceObjCObject:
9397 OS << "Objective-C object retension";
9398 break;
9399
9400 case SK_StdInitializerList:
9401 OS << "std::initializer_list from initializer list";
9402 break;
9403
9404 case SK_StdInitializerListConstructorCall:
9405 OS << "list initialization from std::initializer_list";
9406 break;
9407
9408 case SK_OCLSamplerInit:
9409 OS << "OpenCL sampler_t from integer constant";
9410 break;
9411
9412 case SK_OCLZeroOpaqueType:
9413 OS << "OpenCL opaque type from zero";
9414 break;
9415 case SK_ParenthesizedListInit:
9416 OS << "initialization from a parenthesized list of values";
9417 break;
9418 }
9419
9420 OS << " [" << S->Type << ']';
9421 }
9422
9423 OS << '\n';
9424 }
9425
dump() const9426 void InitializationSequence::dump() const {
9427 dump(llvm::errs());
9428 }
9429
DiagnoseNarrowingInInitList(Sema & S,const ImplicitConversionSequence & ICS,QualType PreNarrowingType,QualType EntityType,const Expr * PostInit)9430 static void DiagnoseNarrowingInInitList(Sema &S,
9431 const ImplicitConversionSequence &ICS,
9432 QualType PreNarrowingType,
9433 QualType EntityType,
9434 const Expr *PostInit) {
9435 const StandardConversionSequence *SCS = nullptr;
9436 switch (ICS.getKind()) {
9437 case ImplicitConversionSequence::StandardConversion:
9438 SCS = &ICS.Standard;
9439 break;
9440 case ImplicitConversionSequence::UserDefinedConversion:
9441 SCS = &ICS.UserDefined.After;
9442 break;
9443 case ImplicitConversionSequence::AmbiguousConversion:
9444 case ImplicitConversionSequence::StaticObjectArgumentConversion:
9445 case ImplicitConversionSequence::EllipsisConversion:
9446 case ImplicitConversionSequence::BadConversion:
9447 return;
9448 }
9449
9450 auto MakeDiag = [&](bool IsConstRef, unsigned DefaultDiagID,
9451 unsigned ConstRefDiagID, unsigned WarnDiagID) {
9452 unsigned DiagID;
9453 auto &L = S.getLangOpts();
9454 if (L.CPlusPlus11 &&
9455 (!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015)))
9456 DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID;
9457 else
9458 DiagID = WarnDiagID;
9459 return S.Diag(PostInit->getBeginLoc(), DiagID)
9460 << PostInit->getSourceRange();
9461 };
9462
9463 // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.
9464 APValue ConstantValue;
9465 QualType ConstantType;
9466 switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue,
9467 ConstantType)) {
9468 case NK_Not_Narrowing:
9469 case NK_Dependent_Narrowing:
9470 // No narrowing occurred.
9471 return;
9472
9473 case NK_Type_Narrowing: {
9474 // This was a floating-to-integer conversion, which is always considered a
9475 // narrowing conversion even if the value is a constant and can be
9476 // represented exactly as an integer.
9477 QualType T = EntityType.getNonReferenceType();
9478 MakeDiag(T != EntityType, diag::ext_init_list_type_narrowing,
9479 diag::ext_init_list_type_narrowing_const_reference,
9480 diag::warn_init_list_type_narrowing)
9481 << PreNarrowingType.getLocalUnqualifiedType()
9482 << T.getLocalUnqualifiedType();
9483 break;
9484 }
9485
9486 case NK_Constant_Narrowing: {
9487 // A constant value was narrowed.
9488 MakeDiag(EntityType.getNonReferenceType() != EntityType,
9489 diag::ext_init_list_constant_narrowing,
9490 diag::ext_init_list_constant_narrowing_const_reference,
9491 diag::warn_init_list_constant_narrowing)
9492 << ConstantValue.getAsString(S.getASTContext(), ConstantType)
9493 << EntityType.getNonReferenceType().getLocalUnqualifiedType();
9494 break;
9495 }
9496
9497 case NK_Variable_Narrowing: {
9498 // A variable's value may have been narrowed.
9499 MakeDiag(EntityType.getNonReferenceType() != EntityType,
9500 diag::ext_init_list_variable_narrowing,
9501 diag::ext_init_list_variable_narrowing_const_reference,
9502 diag::warn_init_list_variable_narrowing)
9503 << PreNarrowingType.getLocalUnqualifiedType()
9504 << EntityType.getNonReferenceType().getLocalUnqualifiedType();
9505 break;
9506 }
9507 }
9508
9509 SmallString<128> StaticCast;
9510 llvm::raw_svector_ostream OS(StaticCast);
9511 OS << "static_cast<";
9512 if (const TypedefType *TT = EntityType->getAs<TypedefType>()) {
9513 // It's important to use the typedef's name if there is one so that the
9514 // fixit doesn't break code using types like int64_t.
9515 //
9516 // FIXME: This will break if the typedef requires qualification. But
9517 // getQualifiedNameAsString() includes non-machine-parsable components.
9518 OS << *TT->getDecl();
9519 } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>())
9520 OS << BT->getName(S.getLangOpts());
9521 else {
9522 // Oops, we didn't find the actual type of the variable. Don't emit a fixit
9523 // with a broken cast.
9524 return;
9525 }
9526 OS << ">(";
9527 S.Diag(PostInit->getBeginLoc(), diag::note_init_list_narrowing_silence)
9528 << PostInit->getSourceRange()
9529 << FixItHint::CreateInsertion(PostInit->getBeginLoc(), OS.str())
9530 << FixItHint::CreateInsertion(
9531 S.getLocForEndOfToken(PostInit->getEndLoc()), ")");
9532 }
9533
CheckC23ConstexprInitConversion(Sema & S,QualType FromType,QualType ToType,Expr * Init)9534 static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType,
9535 QualType ToType, Expr *Init) {
9536 assert(S.getLangOpts().C23);
9537 ImplicitConversionSequence ICS = S.TryImplicitConversion(
9538 Init->IgnoreParenImpCasts(), ToType, /*SuppressUserConversions*/ false,
9539 Sema::AllowedExplicit::None,
9540 /*InOverloadResolution*/ false,
9541 /*CStyle*/ false,
9542 /*AllowObjCWritebackConversion=*/false);
9543
9544 if (!ICS.isStandard())
9545 return;
9546
9547 APValue Value;
9548 QualType PreNarrowingType;
9549 // Reuse C++ narrowing check.
9550 switch (ICS.Standard.getNarrowingKind(
9551 S.Context, Init, Value, PreNarrowingType,
9552 /*IgnoreFloatToIntegralConversion*/ false)) {
9553 // The value doesn't fit.
9554 case NK_Constant_Narrowing:
9555 S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_not_representable)
9556 << Value.getAsString(S.Context, PreNarrowingType) << ToType;
9557 return;
9558
9559 // Conversion to a narrower type.
9560 case NK_Type_Narrowing:
9561 S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_type_mismatch)
9562 << ToType << FromType;
9563 return;
9564
9565 // Since we only reuse narrowing check for C23 constexpr variables here, we're
9566 // not really interested in these cases.
9567 case NK_Dependent_Narrowing:
9568 case NK_Variable_Narrowing:
9569 case NK_Not_Narrowing:
9570 return;
9571 }
9572 llvm_unreachable("unhandled case in switch");
9573 }
9574
CheckC23ConstexprInitStringLiteral(const StringLiteral * SE,Sema & SemaRef,QualType & TT)9575 static void CheckC23ConstexprInitStringLiteral(const StringLiteral *SE,
9576 Sema &SemaRef, QualType &TT) {
9577 assert(SemaRef.getLangOpts().C23);
9578 // character that string literal contains fits into TT - target type.
9579 const ArrayType *AT = SemaRef.Context.getAsArrayType(TT);
9580 QualType CharType = AT->getElementType();
9581 uint32_t BitWidth = SemaRef.Context.getTypeSize(CharType);
9582 bool isUnsigned = CharType->isUnsignedIntegerType();
9583 llvm::APSInt Value(BitWidth, isUnsigned);
9584 for (unsigned I = 0, N = SE->getLength(); I != N; ++I) {
9585 int64_t C = SE->getCodeUnitS(I, SemaRef.Context.getCharWidth());
9586 Value = C;
9587 if (Value != C) {
9588 SemaRef.Diag(SemaRef.getLocationOfStringLiteralByte(SE, I),
9589 diag::err_c23_constexpr_init_not_representable)
9590 << C << CharType;
9591 return;
9592 }
9593 }
9594 return;
9595 }
9596
9597 //===----------------------------------------------------------------------===//
9598 // Initialization helper functions
9599 //===----------------------------------------------------------------------===//
9600 bool
CanPerformCopyInitialization(const InitializedEntity & Entity,ExprResult Init)9601 Sema::CanPerformCopyInitialization(const InitializedEntity &Entity,
9602 ExprResult Init) {
9603 if (Init.isInvalid())
9604 return false;
9605
9606 Expr *InitE = Init.get();
9607 assert(InitE && "No initialization expression");
9608
9609 InitializationKind Kind =
9610 InitializationKind::CreateCopy(InitE->getBeginLoc(), SourceLocation());
9611 InitializationSequence Seq(*this, Entity, Kind, InitE);
9612 return !Seq.Failed();
9613 }
9614
9615 ExprResult
PerformCopyInitialization(const InitializedEntity & Entity,SourceLocation EqualLoc,ExprResult Init,bool TopLevelOfInitList,bool AllowExplicit)9616 Sema::PerformCopyInitialization(const InitializedEntity &Entity,
9617 SourceLocation EqualLoc,
9618 ExprResult Init,
9619 bool TopLevelOfInitList,
9620 bool AllowExplicit) {
9621 if (Init.isInvalid())
9622 return ExprError();
9623
9624 Expr *InitE = Init.get();
9625 assert(InitE && "No initialization expression?");
9626
9627 if (EqualLoc.isInvalid())
9628 EqualLoc = InitE->getBeginLoc();
9629
9630 InitializationKind Kind = InitializationKind::CreateCopy(
9631 InitE->getBeginLoc(), EqualLoc, AllowExplicit);
9632 InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList);
9633
9634 // Prevent infinite recursion when performing parameter copy-initialization.
9635 const bool ShouldTrackCopy =
9636 Entity.isParameterKind() && Seq.isConstructorInitialization();
9637 if (ShouldTrackCopy) {
9638 if (llvm::is_contained(CurrentParameterCopyTypes, Entity.getType())) {
9639 Seq.SetOverloadFailure(
9640 InitializationSequence::FK_ConstructorOverloadFailed,
9641 OR_No_Viable_Function);
9642
9643 // Try to give a meaningful diagnostic note for the problematic
9644 // constructor.
9645 const auto LastStep = Seq.step_end() - 1;
9646 assert(LastStep->Kind ==
9647 InitializationSequence::SK_ConstructorInitialization);
9648 const FunctionDecl *Function = LastStep->Function.Function;
9649 auto Candidate =
9650 llvm::find_if(Seq.getFailedCandidateSet(),
9651 [Function](const OverloadCandidate &Candidate) -> bool {
9652 return Candidate.Viable &&
9653 Candidate.Function == Function &&
9654 Candidate.Conversions.size() > 0;
9655 });
9656 if (Candidate != Seq.getFailedCandidateSet().end() &&
9657 Function->getNumParams() > 0) {
9658 Candidate->Viable = false;
9659 Candidate->FailureKind = ovl_fail_bad_conversion;
9660 Candidate->Conversions[0].setBad(BadConversionSequence::no_conversion,
9661 InitE,
9662 Function->getParamDecl(0)->getType());
9663 }
9664 }
9665 CurrentParameterCopyTypes.push_back(Entity.getType());
9666 }
9667
9668 ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
9669
9670 if (ShouldTrackCopy)
9671 CurrentParameterCopyTypes.pop_back();
9672
9673 return Result;
9674 }
9675
9676 /// Determine whether RD is, or is derived from, a specialization of CTD.
isOrIsDerivedFromSpecializationOf(CXXRecordDecl * RD,ClassTemplateDecl * CTD)9677 static bool isOrIsDerivedFromSpecializationOf(CXXRecordDecl *RD,
9678 ClassTemplateDecl *CTD) {
9679 auto NotSpecialization = [&] (const CXXRecordDecl *Candidate) {
9680 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
9681 return !CTSD || !declaresSameEntity(CTSD->getSpecializedTemplate(), CTD);
9682 };
9683 return !(NotSpecialization(RD) && RD->forallBases(NotSpecialization));
9684 }
9685
DeduceTemplateSpecializationFromInitializer(TypeSourceInfo * TSInfo,const InitializedEntity & Entity,const InitializationKind & Kind,MultiExprArg Inits)9686 QualType Sema::DeduceTemplateSpecializationFromInitializer(
9687 TypeSourceInfo *TSInfo, const InitializedEntity &Entity,
9688 const InitializationKind &Kind, MultiExprArg Inits) {
9689 auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
9690 TSInfo->getType()->getContainedDeducedType());
9691 assert(DeducedTST && "not a deduced template specialization type");
9692
9693 auto TemplateName = DeducedTST->getTemplateName();
9694 if (TemplateName.isDependent())
9695 return SubstAutoTypeDependent(TSInfo->getType());
9696
9697 // We can only perform deduction for class templates or alias templates.
9698 auto *Template =
9699 dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl());
9700 TemplateDecl *LookupTemplateDecl = Template;
9701 if (!Template) {
9702 if (auto *AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
9703 TemplateName.getAsTemplateDecl())) {
9704 Diag(Kind.getLocation(),
9705 diag::warn_cxx17_compat_ctad_for_alias_templates);
9706 LookupTemplateDecl = AliasTemplate;
9707 auto UnderlyingType = AliasTemplate->getTemplatedDecl()
9708 ->getUnderlyingType()
9709 .getCanonicalType();
9710 // C++ [over.match.class.deduct#3]: ..., the defining-type-id of A must be
9711 // of the form
9712 // [typename] [nested-name-specifier] [template] simple-template-id
9713 if (const auto *TST =
9714 UnderlyingType->getAs<TemplateSpecializationType>()) {
9715 Template = dyn_cast_or_null<ClassTemplateDecl>(
9716 TST->getTemplateName().getAsTemplateDecl());
9717 } else if (const auto *RT = UnderlyingType->getAs<RecordType>()) {
9718 // Cases where template arguments in the RHS of the alias are not
9719 // dependent. e.g.
9720 // using AliasFoo = Foo<bool>;
9721 if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(
9722 RT->getAsCXXRecordDecl()))
9723 Template = CTSD->getSpecializedTemplate();
9724 }
9725 }
9726 }
9727 if (!Template) {
9728 Diag(Kind.getLocation(),
9729 diag::err_deduced_non_class_or_alias_template_specialization_type)
9730 << (int)getTemplateNameKindForDiagnostics(TemplateName) << TemplateName;
9731 if (auto *TD = TemplateName.getAsTemplateDecl())
9732 NoteTemplateLocation(*TD);
9733 return QualType();
9734 }
9735
9736 // Can't deduce from dependent arguments.
9737 if (Expr::hasAnyTypeDependentArguments(Inits)) {
9738 Diag(TSInfo->getTypeLoc().getBeginLoc(),
9739 diag::warn_cxx14_compat_class_template_argument_deduction)
9740 << TSInfo->getTypeLoc().getSourceRange() << 0;
9741 return SubstAutoTypeDependent(TSInfo->getType());
9742 }
9743
9744 // FIXME: Perform "exact type" matching first, per CWG discussion?
9745 // Or implement this via an implied 'T(T) -> T' deduction guide?
9746
9747 // Look up deduction guides, including those synthesized from constructors.
9748 //
9749 // C++1z [over.match.class.deduct]p1:
9750 // A set of functions and function templates is formed comprising:
9751 // - For each constructor of the class template designated by the
9752 // template-name, a function template [...]
9753 // - For each deduction-guide, a function or function template [...]
9754 DeclarationNameInfo NameInfo(
9755 Context.DeclarationNames.getCXXDeductionGuideName(LookupTemplateDecl),
9756 TSInfo->getTypeLoc().getEndLoc());
9757 LookupResult Guides(*this, NameInfo, LookupOrdinaryName);
9758 LookupQualifiedName(Guides, LookupTemplateDecl->getDeclContext());
9759
9760 // FIXME: Do not diagnose inaccessible deduction guides. The standard isn't
9761 // clear on this, but they're not found by name so access does not apply.
9762 Guides.suppressDiagnostics();
9763
9764 // Figure out if this is list-initialization.
9765 InitListExpr *ListInit =
9766 (Inits.size() == 1 && Kind.getKind() != InitializationKind::IK_Direct)
9767 ? dyn_cast<InitListExpr>(Inits[0])
9768 : nullptr;
9769
9770 // C++1z [over.match.class.deduct]p1:
9771 // Initialization and overload resolution are performed as described in
9772 // [dcl.init] and [over.match.ctor], [over.match.copy], or [over.match.list]
9773 // (as appropriate for the type of initialization performed) for an object
9774 // of a hypothetical class type, where the selected functions and function
9775 // templates are considered to be the constructors of that class type
9776 //
9777 // Since we know we're initializing a class type of a type unrelated to that
9778 // of the initializer, this reduces to something fairly reasonable.
9779 OverloadCandidateSet Candidates(Kind.getLocation(),
9780 OverloadCandidateSet::CSK_Normal);
9781 OverloadCandidateSet::iterator Best;
9782
9783 bool AllowExplicit = !Kind.isCopyInit() || ListInit;
9784
9785 // Return true if the candidate is added successfully, false otherwise.
9786 auto addDeductionCandidate = [&](FunctionTemplateDecl *TD,
9787 CXXDeductionGuideDecl *GD,
9788 DeclAccessPair FoundDecl,
9789 bool OnlyListConstructors,
9790 bool AllowAggregateDeductionCandidate) {
9791 // C++ [over.match.ctor]p1: (non-list copy-initialization from non-class)
9792 // For copy-initialization, the candidate functions are all the
9793 // converting constructors (12.3.1) of that class.
9794 // C++ [over.match.copy]p1: (non-list copy-initialization from class)
9795 // The converting constructors of T are candidate functions.
9796 if (!AllowExplicit) {
9797 // Overload resolution checks whether the deduction guide is declared
9798 // explicit for us.
9799
9800 // When looking for a converting constructor, deduction guides that
9801 // could never be called with one argument are not interesting to
9802 // check or note.
9803 if (GD->getMinRequiredArguments() > 1 ||
9804 (GD->getNumParams() == 0 && !GD->isVariadic()))
9805 return;
9806 }
9807
9808 // C++ [over.match.list]p1.1: (first phase list initialization)
9809 // Initially, the candidate functions are the initializer-list
9810 // constructors of the class T
9811 if (OnlyListConstructors && !isInitListConstructor(GD))
9812 return;
9813
9814 if (!AllowAggregateDeductionCandidate &&
9815 GD->getDeductionCandidateKind() == DeductionCandidate::Aggregate)
9816 return;
9817
9818 // C++ [over.match.list]p1.2: (second phase list initialization)
9819 // the candidate functions are all the constructors of the class T
9820 // C++ [over.match.ctor]p1: (all other cases)
9821 // the candidate functions are all the constructors of the class of
9822 // the object being initialized
9823
9824 // C++ [over.best.ics]p4:
9825 // When [...] the constructor [...] is a candidate by
9826 // - [over.match.copy] (in all cases)
9827 if (TD) {
9828 SmallVector<Expr *, 8> TmpInits;
9829 for (Expr *E : Inits)
9830 if (auto *DI = dyn_cast<DesignatedInitExpr>(E))
9831 TmpInits.push_back(DI->getInit());
9832 else
9833 TmpInits.push_back(E);
9834 AddTemplateOverloadCandidate(
9835 TD, FoundDecl, /*ExplicitArgs=*/nullptr, TmpInits, Candidates,
9836 /*SuppressUserConversions=*/false,
9837 /*PartialOverloading=*/false, AllowExplicit, ADLCallKind::NotADL,
9838 /*PO=*/{}, AllowAggregateDeductionCandidate);
9839 } else {
9840 AddOverloadCandidate(GD, FoundDecl, Inits, Candidates,
9841 /*SuppressUserConversions=*/false,
9842 /*PartialOverloading=*/false, AllowExplicit);
9843 }
9844 };
9845
9846 bool FoundDeductionGuide = false;
9847
9848 auto TryToResolveOverload =
9849 [&](bool OnlyListConstructors) -> OverloadingResult {
9850 Candidates.clear(OverloadCandidateSet::CSK_Normal);
9851 bool HasAnyDeductionGuide = false;
9852
9853 auto SynthesizeAggrGuide = [&](InitListExpr *ListInit) {
9854 auto *Pattern = Template;
9855 while (Pattern->getInstantiatedFromMemberTemplate()) {
9856 if (Pattern->isMemberSpecialization())
9857 break;
9858 Pattern = Pattern->getInstantiatedFromMemberTemplate();
9859 }
9860
9861 auto *RD = cast<CXXRecordDecl>(Pattern->getTemplatedDecl());
9862 if (!(RD->getDefinition() && RD->isAggregate()))
9863 return;
9864 QualType Ty = Context.getRecordType(RD);
9865 SmallVector<QualType, 8> ElementTypes;
9866
9867 InitListChecker CheckInitList(*this, Entity, ListInit, Ty, ElementTypes);
9868 if (!CheckInitList.HadError()) {
9869 // C++ [over.match.class.deduct]p1.8:
9870 // if e_i is of array type and x_i is a braced-init-list, T_i is an
9871 // rvalue reference to the declared type of e_i and
9872 // C++ [over.match.class.deduct]p1.9:
9873 // if e_i is of array type and x_i is a string-literal, T_i is an
9874 // lvalue reference to the const-qualified declared type of e_i and
9875 // C++ [over.match.class.deduct]p1.10:
9876 // otherwise, T_i is the declared type of e_i
9877 for (int I = 0, E = ListInit->getNumInits();
9878 I < E && !isa<PackExpansionType>(ElementTypes[I]); ++I)
9879 if (ElementTypes[I]->isArrayType()) {
9880 if (isa<InitListExpr, DesignatedInitExpr>(ListInit->getInit(I)))
9881 ElementTypes[I] = Context.getRValueReferenceType(ElementTypes[I]);
9882 else if (isa<StringLiteral>(
9883 ListInit->getInit(I)->IgnoreParenImpCasts()))
9884 ElementTypes[I] =
9885 Context.getLValueReferenceType(ElementTypes[I].withConst());
9886 }
9887
9888 if (FunctionTemplateDecl *TD =
9889 DeclareAggregateDeductionGuideFromInitList(
9890 LookupTemplateDecl, ElementTypes,
9891 TSInfo->getTypeLoc().getEndLoc())) {
9892 auto *GD = cast<CXXDeductionGuideDecl>(TD->getTemplatedDecl());
9893 addDeductionCandidate(TD, GD, DeclAccessPair::make(TD, AS_public),
9894 OnlyListConstructors,
9895 /*AllowAggregateDeductionCandidate=*/true);
9896 HasAnyDeductionGuide = true;
9897 }
9898 }
9899 };
9900
9901 for (auto I = Guides.begin(), E = Guides.end(); I != E; ++I) {
9902 NamedDecl *D = (*I)->getUnderlyingDecl();
9903 if (D->isInvalidDecl())
9904 continue;
9905
9906 auto *TD = dyn_cast<FunctionTemplateDecl>(D);
9907 auto *GD = dyn_cast_if_present<CXXDeductionGuideDecl>(
9908 TD ? TD->getTemplatedDecl() : dyn_cast<FunctionDecl>(D));
9909 if (!GD)
9910 continue;
9911
9912 if (!GD->isImplicit())
9913 HasAnyDeductionGuide = true;
9914
9915 addDeductionCandidate(TD, GD, I.getPair(), OnlyListConstructors,
9916 /*AllowAggregateDeductionCandidate=*/false);
9917 }
9918
9919 // C++ [over.match.class.deduct]p1.4:
9920 // if C is defined and its definition satisfies the conditions for an
9921 // aggregate class ([dcl.init.aggr]) with the assumption that any
9922 // dependent base class has no virtual functions and no virtual base
9923 // classes, and the initializer is a non-empty braced-init-list or
9924 // parenthesized expression-list, and there are no deduction-guides for
9925 // C, the set contains an additional function template, called the
9926 // aggregate deduction candidate, defined as follows.
9927 if (getLangOpts().CPlusPlus20 && !HasAnyDeductionGuide) {
9928 if (ListInit && ListInit->getNumInits()) {
9929 SynthesizeAggrGuide(ListInit);
9930 } else if (Inits.size()) { // parenthesized expression-list
9931 // Inits are expressions inside the parentheses. We don't have
9932 // the parentheses source locations, use the begin/end of Inits as the
9933 // best heuristic.
9934 InitListExpr TempListInit(getASTContext(), Inits.front()->getBeginLoc(),
9935 Inits, Inits.back()->getEndLoc());
9936 SynthesizeAggrGuide(&TempListInit);
9937 }
9938 }
9939
9940 FoundDeductionGuide = FoundDeductionGuide || HasAnyDeductionGuide;
9941
9942 return Candidates.BestViableFunction(*this, Kind.getLocation(), Best);
9943 };
9944
9945 OverloadingResult Result = OR_No_Viable_Function;
9946
9947 // C++11 [over.match.list]p1, per DR1467: for list-initialization, first
9948 // try initializer-list constructors.
9949 if (ListInit) {
9950 bool TryListConstructors = true;
9951
9952 // Try list constructors unless the list is empty and the class has one or
9953 // more default constructors, in which case those constructors win.
9954 if (!ListInit->getNumInits()) {
9955 for (NamedDecl *D : Guides) {
9956 auto *FD = dyn_cast<FunctionDecl>(D->getUnderlyingDecl());
9957 if (FD && FD->getMinRequiredArguments() == 0) {
9958 TryListConstructors = false;
9959 break;
9960 }
9961 }
9962 } else if (ListInit->getNumInits() == 1) {
9963 // C++ [over.match.class.deduct]:
9964 // As an exception, the first phase in [over.match.list] (considering
9965 // initializer-list constructors) is omitted if the initializer list
9966 // consists of a single expression of type cv U, where U is a
9967 // specialization of C or a class derived from a specialization of C.
9968 Expr *E = ListInit->getInit(0);
9969 auto *RD = E->getType()->getAsCXXRecordDecl();
9970 if (!isa<InitListExpr>(E) && RD &&
9971 isCompleteType(Kind.getLocation(), E->getType()) &&
9972 isOrIsDerivedFromSpecializationOf(RD, Template))
9973 TryListConstructors = false;
9974 }
9975
9976 if (TryListConstructors)
9977 Result = TryToResolveOverload(/*OnlyListConstructor*/true);
9978 // Then unwrap the initializer list and try again considering all
9979 // constructors.
9980 Inits = MultiExprArg(ListInit->getInits(), ListInit->getNumInits());
9981 }
9982
9983 // If list-initialization fails, or if we're doing any other kind of
9984 // initialization, we (eventually) consider constructors.
9985 if (Result == OR_No_Viable_Function)
9986 Result = TryToResolveOverload(/*OnlyListConstructor*/false);
9987
9988 switch (Result) {
9989 case OR_Ambiguous:
9990 // FIXME: For list-initialization candidates, it'd usually be better to
9991 // list why they were not viable when given the initializer list itself as
9992 // an argument.
9993 Candidates.NoteCandidates(
9994 PartialDiagnosticAt(
9995 Kind.getLocation(),
9996 PDiag(diag::err_deduced_class_template_ctor_ambiguous)
9997 << TemplateName),
9998 *this, OCD_AmbiguousCandidates, Inits);
9999 return QualType();
10000
10001 case OR_No_Viable_Function: {
10002 CXXRecordDecl *Primary =
10003 cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
10004 bool Complete =
10005 isCompleteType(Kind.getLocation(), Context.getTypeDeclType(Primary));
10006 Candidates.NoteCandidates(
10007 PartialDiagnosticAt(
10008 Kind.getLocation(),
10009 PDiag(Complete ? diag::err_deduced_class_template_ctor_no_viable
10010 : diag::err_deduced_class_template_incomplete)
10011 << TemplateName << !Guides.empty()),
10012 *this, OCD_AllCandidates, Inits);
10013 return QualType();
10014 }
10015
10016 case OR_Deleted: {
10017 // FIXME: There are no tests for this diagnostic, and it doesn't seem
10018 // like we ever get here; attempts to trigger this seem to yield a
10019 // generic c'all to deleted function' diagnostic instead.
10020 Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
10021 << TemplateName;
10022 NoteDeletedFunction(Best->Function);
10023 return QualType();
10024 }
10025
10026 case OR_Success:
10027 // C++ [over.match.list]p1:
10028 // In copy-list-initialization, if an explicit constructor is chosen, the
10029 // initialization is ill-formed.
10030 if (Kind.isCopyInit() && ListInit &&
10031 cast<CXXDeductionGuideDecl>(Best->Function)->isExplicit()) {
10032 bool IsDeductionGuide = !Best->Function->isImplicit();
10033 Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
10034 << TemplateName << IsDeductionGuide;
10035 Diag(Best->Function->getLocation(),
10036 diag::note_explicit_ctor_deduction_guide_here)
10037 << IsDeductionGuide;
10038 return QualType();
10039 }
10040
10041 // Make sure we didn't select an unusable deduction guide, and mark it
10042 // as referenced.
10043 DiagnoseUseOfDecl(Best->FoundDecl, Kind.getLocation());
10044 MarkFunctionReferenced(Kind.getLocation(), Best->Function);
10045 break;
10046 }
10047
10048 // C++ [dcl.type.class.deduct]p1:
10049 // The placeholder is replaced by the return type of the function selected
10050 // by overload resolution for class template deduction.
10051 QualType DeducedType =
10052 SubstAutoType(TSInfo->getType(), Best->Function->getReturnType());
10053 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10054 diag::warn_cxx14_compat_class_template_argument_deduction)
10055 << TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;
10056
10057 // Warn if CTAD was used on a type that does not have any user-defined
10058 // deduction guides.
10059 if (!FoundDeductionGuide) {
10060 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10061 diag::warn_ctad_maybe_unsupported)
10062 << TemplateName;
10063 Diag(Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
10064 }
10065
10066 return DeducedType;
10067 }
10068