clang 23.0.0git
SemaInit.cpp
Go to the documentation of this file.
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"
15#include "clang/AST/DeclObjC.h"
16#include "clang/AST/Expr.h"
17#include "clang/AST/ExprCXX.h"
18#include "clang/AST/ExprObjC.h"
20#include "clang/AST/TypeBase.h"
21#include "clang/AST/TypeLoc.h"
29#include "clang/Sema/Lookup.h"
31#include "clang/Sema/SemaHLSL.h"
32#include "clang/Sema/SemaObjC.h"
33#include "llvm/ADT/APInt.h"
34#include "llvm/ADT/DenseMap.h"
35#include "llvm/ADT/FoldingSet.h"
36#include "llvm/ADT/PointerIntPair.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
43using 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).
51static 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
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.
76 ASTContext &Context) {
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.
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 =
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()) {
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]];
113 // char array can be initialized with a narrow string.
114 // Only allow char x[] = "foo"; not char x[] = L"foo";
115 if (ElemTy->isCharType())
116 return (SL->getKind() == StringLiteralKind::UTF8 &&
117 Context.getLangOpts().Char8)
119 : SIF_None;
120 if (ElemTy->isChar8Type())
122 if (IsWideCharCompatible(ElemTy, Context))
124 return SIF_Other;
125 // C99 6.7.8p15 (with correction from DR343), or C11 6.7.9p15:
126 // "An array with element type compatible with a qualified or unqualified
127 // version of wchar_t, char16_t, or char32_t may be initialized by a wide
128 // string literal with the corresponding encoding prefix (L, u, or U,
129 // respectively), optionally enclosed in braces.
131 if (Context.typesAreCompatible(Context.Char16Ty, ElemTy))
132 return SIF_None;
133 if (ElemTy->isCharType() || ElemTy->isChar8Type())
135 if (IsWideCharCompatible(ElemTy, Context))
137 return SIF_Other;
139 if (Context.typesAreCompatible(Context.Char32Ty, ElemTy))
140 return SIF_None;
141 if (ElemTy->isCharType() || ElemTy->isChar8Type())
143 if (IsWideCharCompatible(ElemTy, Context))
145 return SIF_Other;
147 if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy))
148 return SIF_None;
149 if (ElemTy->isCharType() || ElemTy->isChar8Type())
151 if (IsWideCharCompatible(ElemTy, Context))
153 return SIF_Other;
155 assert(false && "Unevaluated string literal in initialization");
156 break;
157 }
158
159 llvm_unreachable("missed a StringLiteral kind?");
160}
161
163 ASTContext &Context) {
164 const ArrayType *arrayType = Context.getAsArrayType(declType);
165 if (!arrayType)
166 return SIF_Other;
167 return IsStringInit(init, arrayType, Context);
168}
169
171 return ::IsStringInit(Init, AT, Context) == SIF_None;
172}
173
174/// Update the type of a string literal, including any surrounding parentheses,
175/// to match the type of the object which it is initializing.
177 while (true) {
178 E->setType(Ty);
181 break;
183 }
184}
185
186/// Fix a compound literal initializing an array so it's correctly marked
187/// as an rvalue.
189 while (true) {
192 break;
194 }
195}
196
198 Decl *D = Entity.getDecl();
199 const InitializedEntity *Parent = &Entity;
200
201 while (Parent) {
202 D = Parent->getDecl();
203 Parent = Parent->getParent();
204 }
205
206 if (const auto *VD = dyn_cast_if_present<VarDecl>(D); VD && VD->isConstexpr())
207 return true;
208
209 return false;
210}
211
213 Sema &SemaRef, QualType &TT);
214
215static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
216 Sema &S, const InitializedEntity &Entity,
217 bool CheckC23ConstexprInit = false) {
218 // Get the length of the string as parsed.
219 auto *ConstantArrayTy =
221 uint64_t StrLength = ConstantArrayTy->getZExtSize();
222
223 if (CheckC23ConstexprInit)
224 if (const StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens()))
226
227 if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
228 // C99 6.7.8p14. We have an array of character type with unknown size
229 // being initialized to a string literal.
230 llvm::APInt ConstVal(32, StrLength);
231 // Return a new array type (C99 6.7.8p22).
233 IAT->getElementType(), ConstVal, nullptr, ArraySizeModifier::Normal, 0);
234 updateStringLiteralType(Str, DeclT);
235 return;
236 }
237
239 uint64_t ArrayLen = CAT->getZExtSize();
240
241 // We have an array of character type with known size. However,
242 // the size may be smaller or larger than the string we are initializing.
243 // FIXME: Avoid truncation for 64-bit length strings.
244 if (S.getLangOpts().CPlusPlus) {
245 if (StringLiteral *SL = dyn_cast<StringLiteral>(Str->IgnoreParens())) {
246 // For Pascal strings it's OK to strip off the terminating null character,
247 // so the example below is valid:
248 //
249 // unsigned char a[2] = "\pa";
250 if (SL->isPascal())
251 StrLength--;
252 }
253
254 // [dcl.init.string]p2
255 if (StrLength > ArrayLen)
256 S.Diag(Str->getBeginLoc(),
257 diag::err_initializer_string_for_char_array_too_long)
258 << ArrayLen << StrLength << Str->getSourceRange();
259 } else {
260 // C99 6.7.8p14.
261 if (StrLength - 1 > ArrayLen)
262 S.Diag(Str->getBeginLoc(),
263 diag::ext_initializer_string_for_char_array_too_long)
264 << Str->getSourceRange();
265 else if (StrLength - 1 == ArrayLen) {
266 // In C, if the string literal is null-terminated explicitly, e.g., `char
267 // a[4] = "ABC\0"`, there should be no warning:
268 const auto *SL = dyn_cast<StringLiteral>(Str->IgnoreParens());
269 bool IsSLSafe = SL && SL->getLength() > 0 &&
270 SL->getCodeUnit(SL->getLength() - 1) == 0;
271
272 if (!IsSLSafe) {
273 // If the entity being initialized has the nonstring attribute, then
274 // silence the "missing nonstring" diagnostic. If there's no entity,
275 // check whether we're initializing an array of arrays; if so, walk the
276 // parents to find an entity.
277 auto FindCorrectEntity =
278 [](const InitializedEntity *Entity) -> const ValueDecl * {
279 while (Entity) {
280 if (const ValueDecl *VD = Entity->getDecl())
281 return VD;
282 if (!Entity->getType()->isArrayType())
283 return nullptr;
284 Entity = Entity->getParent();
285 }
286
287 return nullptr;
288 };
289 if (const ValueDecl *D = FindCorrectEntity(&Entity);
290 !D || !D->hasAttr<NonStringAttr>())
291 S.Diag(
292 Str->getBeginLoc(),
293 diag::
294 warn_initializer_string_for_char_array_too_long_no_nonstring)
295 << ArrayLen << StrLength << Str->getSourceRange();
296 }
297 // Always emit the C++ compatibility diagnostic.
298 S.Diag(Str->getBeginLoc(),
299 diag::warn_initializer_string_for_char_array_too_long_for_cpp)
300 << ArrayLen << StrLength << Str->getSourceRange();
301 }
302 }
303
304 // Set the type to the actual size that we are initializing. If we have
305 // something like:
306 // char x[1] = "foo";
307 // then this will set the string literal's type to char[1].
308 updateStringLiteralType(Str, DeclT);
309}
310
312 for (const FieldDecl *Field : R->fields()) {
313 if (Field->hasAttr<ExplicitInitAttr>())
314 S.Diag(Field->getLocation(), diag::note_entity_declared_at) << Field;
315 }
316}
317
318//===----------------------------------------------------------------------===//
319// Semantic checking for initializer lists.
320//===----------------------------------------------------------------------===//
321
322namespace {
323
324/// Semantic checking for initializer lists.
325///
326/// The InitListChecker class contains a set of routines that each
327/// handle the initialization of a certain kind of entity, e.g.,
328/// arrays, vectors, struct/union types, scalars, etc. The
329/// InitListChecker itself performs a recursive walk of the subobject
330/// structure of the type to be initialized, while stepping through
331/// the initializer list one element at a time. The IList and Index
332/// parameters to each of the Check* routines contain the active
333/// (syntactic) initializer list and the index into that initializer
334/// list that represents the current initializer. Each routine is
335/// responsible for moving that Index forward as it consumes elements.
336///
337/// Each Check* routine also has a StructuredList/StructuredIndex
338/// arguments, which contains the current "structured" (semantic)
339/// initializer list and the index into that initializer list where we
340/// are copying initializers as we map them over to the semantic
341/// list. Once we have completed our recursive walk of the subobject
342/// structure, we will have constructed a full semantic initializer
343/// list.
344///
345/// C99 designators cause changes in the initializer list traversal,
346/// because they make the initialization "jump" into a specific
347/// subobject and then continue the initialization from that
348/// point. CheckDesignatedInitializer() recursively steps into the
349/// designated subobject and manages backing out the recursion to
350/// initialize the subobjects after the one designated.
351///
352/// If an initializer list contains any designators, we build a placeholder
353/// structured list even in 'verify only' mode, so that we can track which
354/// elements need 'empty' initializtion.
355class InitListChecker {
356 Sema &SemaRef;
357 bool hadError = false;
358 bool VerifyOnly; // No diagnostics.
359 bool TreatUnavailableAsInvalid; // Used only in VerifyOnly mode.
360 bool InOverloadResolution;
361 InitListExpr *FullyStructuredList = nullptr;
362 NoInitExpr *DummyExpr = nullptr;
363 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes = nullptr;
364 EmbedExpr *CurEmbed = nullptr; // Save current embed we're processing.
365 unsigned CurEmbedIndex = 0;
366
367 NoInitExpr *getDummyInit() {
368 if (!DummyExpr)
369 DummyExpr = new (SemaRef.Context) NoInitExpr(SemaRef.Context.VoidTy);
370 return DummyExpr;
371 }
372
373 void CheckImplicitInitList(const InitializedEntity &Entity,
374 InitListExpr *ParentIList, QualType T,
375 unsigned &Index, InitListExpr *StructuredList,
376 unsigned &StructuredIndex);
377 void CheckExplicitInitList(const InitializedEntity &Entity,
378 InitListExpr *IList, QualType &T,
379 InitListExpr *StructuredList,
380 bool TopLevelObject = false);
381 void CheckListElementTypes(const InitializedEntity &Entity,
382 InitListExpr *IList, QualType &DeclType,
383 bool SubobjectIsDesignatorContext,
384 unsigned &Index,
385 InitListExpr *StructuredList,
386 unsigned &StructuredIndex,
387 bool TopLevelObject = false);
388 void CheckSubElementType(const InitializedEntity &Entity,
389 InitListExpr *IList, QualType ElemType,
390 unsigned &Index,
391 InitListExpr *StructuredList,
392 unsigned &StructuredIndex,
393 bool DirectlyDesignated = false);
394 void CheckComplexType(const InitializedEntity &Entity,
395 InitListExpr *IList, QualType DeclType,
396 unsigned &Index,
397 InitListExpr *StructuredList,
398 unsigned &StructuredIndex);
399 void CheckScalarType(const InitializedEntity &Entity,
400 InitListExpr *IList, QualType DeclType,
401 unsigned &Index,
402 InitListExpr *StructuredList,
403 unsigned &StructuredIndex);
404 void CheckReferenceType(const InitializedEntity &Entity,
405 InitListExpr *IList, QualType DeclType,
406 unsigned &Index,
407 InitListExpr *StructuredList,
408 unsigned &StructuredIndex);
409 void CheckMatrixType(const InitializedEntity &Entity, InitListExpr *IList,
410 QualType DeclType, unsigned &Index,
411 InitListExpr *StructuredList, unsigned &StructuredIndex);
412 void CheckVectorType(const InitializedEntity &Entity,
413 InitListExpr *IList, QualType DeclType, unsigned &Index,
414 InitListExpr *StructuredList,
415 unsigned &StructuredIndex);
416 void CheckStructUnionTypes(const InitializedEntity &Entity,
417 InitListExpr *IList, QualType DeclType,
420 bool SubobjectIsDesignatorContext, unsigned &Index,
421 InitListExpr *StructuredList,
422 unsigned &StructuredIndex,
423 bool TopLevelObject = false);
424 void CheckArrayType(const InitializedEntity &Entity,
425 InitListExpr *IList, QualType &DeclType,
426 llvm::APSInt elementIndex,
427 bool SubobjectIsDesignatorContext, unsigned &Index,
428 InitListExpr *StructuredList,
429 unsigned &StructuredIndex);
430 bool CheckDesignatedInitializer(const InitializedEntity &Entity,
431 InitListExpr *IList, DesignatedInitExpr *DIE,
432 unsigned DesigIdx,
433 QualType &CurrentObjectType,
435 llvm::APSInt *NextElementIndex,
436 unsigned &Index,
437 InitListExpr *StructuredList,
438 unsigned &StructuredIndex,
439 bool FinishSubobjectInit,
440 bool TopLevelObject);
441 InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
442 QualType CurrentObjectType,
443 InitListExpr *StructuredList,
444 unsigned StructuredIndex,
445 SourceRange InitRange,
446 bool IsFullyOverwritten = false);
447 void UpdateStructuredListElement(InitListExpr *StructuredList,
448 unsigned &StructuredIndex,
449 Expr *expr);
450 InitListExpr *createInitListExpr(QualType CurrentObjectType,
451 SourceRange InitRange,
452 unsigned ExpectedNumInits);
453 int numArrayElements(QualType DeclType);
454 int numStructUnionElements(QualType DeclType);
455
456 ExprResult PerformEmptyInit(SourceLocation Loc,
457 const InitializedEntity &Entity);
458
459 /// Diagnose that OldInit (or part thereof) has been overridden by NewInit.
460 void diagnoseInitOverride(Expr *OldInit, SourceRange NewInitRange,
461 bool UnionOverride = false,
462 bool FullyOverwritten = true) {
463 // Overriding an initializer via a designator is valid with C99 designated
464 // initializers, but ill-formed with C++20 designated initializers.
465 unsigned DiagID =
466 SemaRef.getLangOpts().CPlusPlus
467 ? (UnionOverride ? diag::ext_initializer_union_overrides
468 : diag::ext_initializer_overrides)
469 : diag::warn_initializer_overrides;
470
471 if (InOverloadResolution && SemaRef.getLangOpts().CPlusPlus) {
472 // In overload resolution, we have to strictly enforce the rules, and so
473 // don't allow any overriding of prior initializers. This matters for a
474 // case such as:
475 //
476 // union U { int a, b; };
477 // struct S { int a, b; };
478 // void f(U), f(S);
479 //
480 // Here, f({.a = 1, .b = 2}) is required to call the struct overload. For
481 // consistency, we disallow all overriding of prior initializers in
482 // overload resolution, not only overriding of union members.
483 hadError = true;
484 } else if (OldInit->getType().isDestructedType() && !FullyOverwritten) {
485 // If we'll be keeping around the old initializer but overwriting part of
486 // the object it initialized, and that object is not trivially
487 // destructible, this can leak. Don't allow that, not even as an
488 // extension.
489 //
490 // FIXME: It might be reasonable to allow this in cases where the part of
491 // the initializer that we're overriding has trivial destruction.
492 DiagID = diag::err_initializer_overrides_destructed;
493 } else if (!OldInit->getSourceRange().isValid()) {
494 // We need to check on source range validity because the previous
495 // initializer does not have to be an explicit initializer. e.g.,
496 //
497 // struct P { int a, b; };
498 // struct PP { struct P p } l = { { .a = 2 }, .p.b = 3 };
499 //
500 // There is an overwrite taking place because the first braced initializer
501 // list "{ .a = 2 }" already provides value for .p.b (which is zero).
502 //
503 // Such overwrites are harmless, so we don't diagnose them. (Note that in
504 // C++, this cannot be reached unless we've already seen and diagnosed a
505 // different conformance issue, such as a mixture of designated and
506 // non-designated initializers or a multi-level designator.)
507 return;
508 }
509
510 if (!VerifyOnly) {
511 SemaRef.Diag(NewInitRange.getBegin(), DiagID)
512 << NewInitRange << FullyOverwritten << OldInit->getType();
513 SemaRef.Diag(OldInit->getBeginLoc(), diag::note_previous_initializer)
514 << (OldInit->HasSideEffects(SemaRef.Context) && FullyOverwritten)
515 << OldInit->getSourceRange();
516 }
517 }
518
519 // Explanation on the "FillWithNoInit" mode:
520 //
521 // Assume we have the following definitions (Case#1):
522 // struct P { char x[6][6]; } xp = { .x[1] = "bar" };
523 // struct PP { struct P lp; } l = { .lp = xp, .lp.x[1][2] = 'f' };
524 //
525 // l.lp.x[1][0..1] should not be filled with implicit initializers because the
526 // "base" initializer "xp" will provide values for them; l.lp.x[1] will be "baf".
527 //
528 // But if we have (Case#2):
529 // struct PP l = { .lp = xp, .lp.x[1] = { [2] = 'f' } };
530 //
531 // l.lp.x[1][0..1] are implicitly initialized and do not use values from the
532 // "base" initializer; l.lp.x[1] will be "\0\0f\0\0\0".
533 //
534 // To distinguish Case#1 from Case#2, and also to avoid leaving many "holes"
535 // in the InitListExpr, the "holes" in Case#1 are filled not with empty
536 // initializers but with special "NoInitExpr" place holders, which tells the
537 // CodeGen not to generate any initializers for these parts.
538 void FillInEmptyInitForBase(unsigned Init, const CXXBaseSpecifier &Base,
539 const InitializedEntity &ParentEntity,
540 InitListExpr *ILE, bool &RequiresSecondPass,
541 bool FillWithNoInit);
542 void FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
543 const InitializedEntity &ParentEntity,
544 InitListExpr *ILE, bool &RequiresSecondPass,
545 bool FillWithNoInit = false);
546 void FillInEmptyInitializations(const InitializedEntity &Entity,
547 InitListExpr *ILE, bool &RequiresSecondPass,
548 InitListExpr *OuterILE, unsigned OuterIndex,
549 bool FillWithNoInit = false);
550 bool CheckFlexibleArrayInit(const InitializedEntity &Entity,
551 Expr *InitExpr, FieldDecl *Field,
552 bool TopLevelObject);
553 void CheckEmptyInitializable(const InitializedEntity &Entity,
554 SourceLocation Loc);
555
556 Expr *HandleEmbed(EmbedExpr *Embed, const InitializedEntity &Entity) {
557 Expr *Result = nullptr;
558 // Undrestand which part of embed we'd like to reference.
559 if (!CurEmbed) {
560 CurEmbed = Embed;
561 CurEmbedIndex = 0;
562 }
563 // Reference just one if we're initializing a single scalar.
564 uint64_t ElsCount = 1;
565 // Otherwise try to fill whole array with embed data.
567 unsigned ArrIndex = Entity.getElementIndex();
568 auto *AType =
569 SemaRef.Context.getAsArrayType(Entity.getParent()->getType());
570 assert(AType && "expected array type when initializing array");
571 ElsCount = Embed->getDataElementCount();
572 if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
573 ElsCount = std::min(CAType->getSize().getZExtValue() - ArrIndex,
574 ElsCount - CurEmbedIndex);
575 if (ElsCount == Embed->getDataElementCount()) {
576 CurEmbed = nullptr;
577 CurEmbedIndex = 0;
578 return Embed;
579 }
580 }
581
582 Result = new (SemaRef.Context)
583 EmbedExpr(SemaRef.Context, Embed->getLocation(), Embed->getData(),
584 CurEmbedIndex, ElsCount);
585 CurEmbedIndex += ElsCount;
586 if (CurEmbedIndex >= Embed->getDataElementCount()) {
587 CurEmbed = nullptr;
588 CurEmbedIndex = 0;
589 }
590 return Result;
591 }
592
593public:
594 InitListChecker(
595 Sema &S, const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
596 bool VerifyOnly, bool TreatUnavailableAsInvalid,
597 bool InOverloadResolution = false,
598 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes = nullptr);
599 InitListChecker(Sema &S, const InitializedEntity &Entity, InitListExpr *IL,
600 QualType &T,
601 SmallVectorImpl<QualType> &AggrDeductionCandidateParamTypes)
602 : InitListChecker(S, Entity, IL, T, /*VerifyOnly=*/true,
603 /*TreatUnavailableAsInvalid=*/false,
604 /*InOverloadResolution=*/false,
605 &AggrDeductionCandidateParamTypes) {}
606
607 bool HadError() { return hadError; }
608
609 // Retrieves the fully-structured initializer list used for
610 // semantic analysis and code generation.
611 InitListExpr *getFullyStructuredList() const { return FullyStructuredList; }
612};
613
614} // end anonymous namespace
615
616ExprResult InitListChecker::PerformEmptyInit(SourceLocation Loc,
617 const InitializedEntity &Entity) {
619 true);
620 MultiExprArg SubInit;
621 Expr *InitExpr;
622 InitListExpr DummyInitList(SemaRef.Context, Loc, {}, Loc);
623
624 // C++ [dcl.init.aggr]p7:
625 // If there are fewer initializer-clauses in the list than there are
626 // members in the aggregate, then each member not explicitly initialized
627 // ...
628 bool EmptyInitList = SemaRef.getLangOpts().CPlusPlus11 &&
630 if (EmptyInitList) {
631 // C++1y / DR1070:
632 // shall be initialized [...] from an empty initializer list.
633 //
634 // We apply the resolution of this DR to C++11 but not C++98, since C++98
635 // does not have useful semantics for initialization from an init list.
636 // We treat this as copy-initialization, because aggregate initialization
637 // always performs copy-initialization on its elements.
638 //
639 // Only do this if we're initializing a class type, to avoid filling in
640 // the initializer list where possible.
641 InitExpr = VerifyOnly ? &DummyInitList
642 : new (SemaRef.Context)
643 InitListExpr(SemaRef.Context, Loc, {}, Loc);
644 InitExpr->setType(SemaRef.Context.VoidTy);
645 SubInit = InitExpr;
647 } else {
648 // C++03:
649 // shall be value-initialized.
650 }
651
652 InitializationSequence InitSeq(SemaRef, Entity, Kind, SubInit);
653 // HACK: libstdc++ prior to 4.9 marks the vector default constructor
654 // as explicit in _GLIBCXX_DEBUG mode, so recover using the C++03 logic
655 // in that case. stlport does so too.
656 // Look for std::__debug for libstdc++, and for std:: for stlport.
657 // This is effectively a compiler-side implementation of LWG2193.
658 if (!InitSeq && EmptyInitList &&
659 InitSeq.getFailureKind() ==
661 SemaRef.getPreprocessor().NeedsStdLibCxxWorkaroundBefore(2014'04'22)) {
664 InitSeq.getFailedCandidateSet()
665 .BestViableFunction(SemaRef, Kind.getLocation(), Best);
666 (void)O;
667 assert(O == OR_Success && "Inconsistent overload resolution");
668 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
669 CXXRecordDecl *R = CtorDecl->getParent();
670
671 if (CtorDecl->getMinRequiredArguments() == 0 &&
672 CtorDecl->isExplicit() && R->getDeclName() &&
673 SemaRef.SourceMgr.isInSystemHeader(CtorDecl->getLocation())) {
674 bool IsInStd = false;
675 for (NamespaceDecl *ND = dyn_cast<NamespaceDecl>(R->getDeclContext());
676 ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
678 IsInStd = true;
679 }
680
681 if (IsInStd &&
682 llvm::StringSwitch<bool>(R->getName())
683 .Cases({"basic_string", "deque", "forward_list"}, true)
684 .Cases({"list", "map", "multimap", "multiset"}, true)
685 .Cases({"priority_queue", "queue", "set", "stack"}, true)
686 .Cases({"unordered_map", "unordered_set", "vector"}, true)
687 .Default(false)) {
688 InitSeq.InitializeFrom(
689 SemaRef, Entity,
690 InitializationKind::CreateValue(Loc, Loc, Loc, true),
691 MultiExprArg(), /*TopLevelOfInitList=*/false,
692 TreatUnavailableAsInvalid);
693 // Emit a warning for this. System header warnings aren't shown
694 // by default, but people working on system headers should see it.
695 if (!VerifyOnly) {
696 SemaRef.Diag(CtorDecl->getLocation(),
697 diag::warn_invalid_initializer_from_system_header);
699 SemaRef.Diag(Entity.getDecl()->getLocation(),
700 diag::note_used_in_initialization_here);
701 else if (Entity.getKind() == InitializedEntity::EK_ArrayElement)
702 SemaRef.Diag(Loc, diag::note_used_in_initialization_here);
703 }
704 }
705 }
706 }
707 if (!InitSeq) {
708 if (!VerifyOnly) {
709 InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
711 SemaRef.Diag(Entity.getDecl()->getLocation(),
712 diag::note_in_omitted_aggregate_initializer)
713 << /*field*/1 << Entity.getDecl();
714 else if (Entity.getKind() == InitializedEntity::EK_ArrayElement) {
715 bool IsTrailingArrayNewMember =
716 Entity.getParent() &&
718 SemaRef.Diag(Loc, diag::note_in_omitted_aggregate_initializer)
719 << (IsTrailingArrayNewMember ? 2 : /*array element*/0)
720 << Entity.getElementIndex();
721 }
722 }
723 hadError = true;
724 return ExprError();
725 }
726
727 return VerifyOnly ? ExprResult()
728 : InitSeq.Perform(SemaRef, Entity, Kind, SubInit);
729}
730
731void InitListChecker::CheckEmptyInitializable(const InitializedEntity &Entity,
732 SourceLocation Loc) {
733 // If we're building a fully-structured list, we'll check this at the end
734 // once we know which elements are actually initialized. Otherwise, we know
735 // that there are no designators so we can just check now.
736 if (FullyStructuredList)
737 return;
738 PerformEmptyInit(Loc, Entity);
739}
740
741void InitListChecker::FillInEmptyInitForBase(
742 unsigned Init, const CXXBaseSpecifier &Base,
743 const InitializedEntity &ParentEntity, InitListExpr *ILE,
744 bool &RequiresSecondPass, bool FillWithNoInit) {
746 SemaRef.Context, &Base, false, &ParentEntity);
747
748 if (Init >= ILE->getNumInits() || !ILE->getInit(Init)) {
749 ExprResult BaseInit = FillWithNoInit
750 ? new (SemaRef.Context) NoInitExpr(Base.getType())
751 : PerformEmptyInit(ILE->getEndLoc(), BaseEntity);
752 if (BaseInit.isInvalid()) {
753 hadError = true;
754 return;
755 }
756
757 if (!VerifyOnly) {
758 assert(Init < ILE->getNumInits() && "should have been expanded");
759 ILE->setInit(Init, BaseInit.getAs<Expr>());
760 }
761 } else if (InitListExpr *InnerILE =
762 dyn_cast<InitListExpr>(ILE->getInit(Init))) {
763 FillInEmptyInitializations(BaseEntity, InnerILE, RequiresSecondPass,
764 ILE, Init, FillWithNoInit);
765 } else if (DesignatedInitUpdateExpr *InnerDIUE =
766 dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
767 FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
768 RequiresSecondPass, ILE, Init,
769 /*FillWithNoInit =*/true);
770 }
771}
772
773void InitListChecker::FillInEmptyInitForField(unsigned Init, FieldDecl *Field,
774 const InitializedEntity &ParentEntity,
775 InitListExpr *ILE,
776 bool &RequiresSecondPass,
777 bool FillWithNoInit) {
778 SourceLocation Loc = ILE->getEndLoc();
779 unsigned NumInits = ILE->getNumInits();
780 InitializedEntity MemberEntity
781 = InitializedEntity::InitializeMember(Field, &ParentEntity);
782
783 if (Init >= NumInits || !ILE->getInit(Init)) {
784 if (const RecordType *RType = ILE->getType()->getAsCanonical<RecordType>())
785 if (!RType->getDecl()->isUnion())
786 assert((Init < NumInits || VerifyOnly) &&
787 "This ILE should have been expanded");
788
789 if (FillWithNoInit) {
790 assert(!VerifyOnly && "should not fill with no-init in verify-only mode");
791 Expr *Filler = new (SemaRef.Context) NoInitExpr(Field->getType());
792 if (Init < NumInits)
793 ILE->setInit(Init, Filler);
794 else
795 ILE->updateInit(SemaRef.Context, Init, Filler);
796 return;
797 }
798
799 if (!VerifyOnly && Field->hasAttr<ExplicitInitAttr>() &&
800 !SemaRef.isUnevaluatedContext()) {
801 SemaRef.Diag(ILE->getExprLoc(), diag::warn_field_requires_explicit_init)
802 << /* Var-in-Record */ 0 << Field;
803 SemaRef.Diag(Field->getLocation(), diag::note_entity_declared_at)
804 << Field;
805 }
806
807 // C++1y [dcl.init.aggr]p7:
808 // If there are fewer initializer-clauses in the list than there are
809 // members in the aggregate, then each member not explicitly initialized
810 // shall be initialized from its brace-or-equal-initializer [...]
811 if (Field->hasInClassInitializer()) {
812 if (VerifyOnly)
813 return;
814
815 ExprResult DIE;
816 {
817 // Enter a default initializer rebuild context, then we can support
818 // lifetime extension of temporary created by aggregate initialization
819 // using a default member initializer.
820 // CWG1815 (https://wg21.link/CWG1815).
821 EnterExpressionEvaluationContext RebuildDefaultInit(
824 true;
830 DIE = SemaRef.BuildCXXDefaultInitExpr(Loc, Field);
831 }
832 if (DIE.isInvalid()) {
833 hadError = true;
834 return;
835 }
836 SemaRef.checkInitializerLifetime(MemberEntity, DIE.get());
837 if (Init < NumInits)
838 ILE->setInit(Init, DIE.get());
839 else {
840 ILE->updateInit(SemaRef.Context, Init, DIE.get());
841 RequiresSecondPass = true;
842 }
843 return;
844 }
845
846 if (Field->getType()->isReferenceType()) {
847 if (!VerifyOnly) {
848 // C++ [dcl.init.aggr]p9:
849 // If an incomplete or empty initializer-list leaves a
850 // member of reference type uninitialized, the program is
851 // ill-formed.
852 SemaRef.Diag(Loc, diag::err_init_reference_member_uninitialized)
853 << Field->getType()
854 << (ILE->isSyntacticForm() ? ILE : ILE->getSyntacticForm())
855 ->getSourceRange();
856 SemaRef.Diag(Field->getLocation(), diag::note_uninit_reference_member);
857 }
858 hadError = true;
859 return;
860 }
861
862 ExprResult MemberInit = PerformEmptyInit(Loc, MemberEntity);
863 if (MemberInit.isInvalid()) {
864 hadError = true;
865 return;
866 }
867
868 if (hadError || VerifyOnly) {
869 // Do nothing
870 } else if (Init < NumInits) {
871 ILE->setInit(Init, MemberInit.getAs<Expr>());
872 } else if (!isa<ImplicitValueInitExpr>(MemberInit.get())) {
873 // Empty initialization requires a constructor call, so
874 // extend the initializer list to include the constructor
875 // call and make a note that we'll need to take another pass
876 // through the initializer list.
877 ILE->updateInit(SemaRef.Context, Init, MemberInit.getAs<Expr>());
878 RequiresSecondPass = true;
879 }
880 } else if (InitListExpr *InnerILE
881 = dyn_cast<InitListExpr>(ILE->getInit(Init))) {
882 FillInEmptyInitializations(MemberEntity, InnerILE,
883 RequiresSecondPass, ILE, Init, FillWithNoInit);
884 } else if (DesignatedInitUpdateExpr *InnerDIUE =
885 dyn_cast<DesignatedInitUpdateExpr>(ILE->getInit(Init))) {
886 FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
887 RequiresSecondPass, ILE, Init,
888 /*FillWithNoInit =*/true);
889 }
890}
891
892/// Recursively replaces NULL values within the given initializer list
893/// with expressions that perform value-initialization of the
894/// appropriate type, and finish off the InitListExpr formation.
895void
896InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity,
897 InitListExpr *ILE,
898 bool &RequiresSecondPass,
899 InitListExpr *OuterILE,
900 unsigned OuterIndex,
901 bool FillWithNoInit) {
902 assert((ILE->getType() != SemaRef.Context.VoidTy) &&
903 "Should not have void type");
904
905 // We don't need to do any checks when just filling NoInitExprs; that can't
906 // fail.
907 if (FillWithNoInit && VerifyOnly)
908 return;
909
910 // If this is a nested initializer list, we might have changed its contents
911 // (and therefore some of its properties, such as instantiation-dependence)
912 // while filling it in. Inform the outer initializer list so that its state
913 // can be updated to match.
914 // FIXME: We should fully build the inner initializers before constructing
915 // the outer InitListExpr instead of mutating AST nodes after they have
916 // been used as subexpressions of other nodes.
917 struct UpdateOuterILEWithUpdatedInit {
918 InitListExpr *Outer;
919 unsigned OuterIndex;
920 ~UpdateOuterILEWithUpdatedInit() {
921 if (Outer)
922 Outer->setInit(OuterIndex, Outer->getInit(OuterIndex));
923 }
924 } UpdateOuterRAII = {OuterILE, OuterIndex};
925
926 // A transparent ILE is not performing aggregate initialization and should
927 // not be filled in.
928 if (ILE->isTransparent())
929 return;
930
931 if (const auto *RDecl = ILE->getType()->getAsRecordDecl()) {
932 if (RDecl->isUnion() && ILE->getInitializedFieldInUnion()) {
933 FillInEmptyInitForField(0, ILE->getInitializedFieldInUnion(), Entity, ILE,
934 RequiresSecondPass, FillWithNoInit);
935 } else {
936 assert((!RDecl->isUnion() || !isa<CXXRecordDecl>(RDecl) ||
937 !cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) &&
938 "We should have computed initialized fields already");
939 // The fields beyond ILE->getNumInits() are default initialized, so in
940 // order to leave them uninitialized, the ILE is expanded and the extra
941 // fields are then filled with NoInitExpr.
942 unsigned NumElems = numStructUnionElements(ILE->getType());
943 if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember())
944 ++NumElems;
945 if (!VerifyOnly && ILE->getNumInits() < NumElems)
946 ILE->resizeInits(SemaRef.Context, NumElems);
947
948 unsigned Init = 0;
949
950 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
951 for (auto &Base : CXXRD->bases()) {
952 if (hadError)
953 return;
954
955 FillInEmptyInitForBase(Init, Base, Entity, ILE, RequiresSecondPass,
956 FillWithNoInit);
957 ++Init;
958 }
959 }
960
961 for (auto *Field : RDecl->fields()) {
962 if (Field->isUnnamedBitField())
963 continue;
964
965 if (hadError)
966 return;
967
968 FillInEmptyInitForField(Init, Field, Entity, ILE, RequiresSecondPass,
969 FillWithNoInit);
970 if (hadError)
971 return;
972
973 ++Init;
974
975 // Only look at the first initialization of a union.
976 if (RDecl->isUnion())
977 break;
978 }
979 }
980
981 return;
982 }
983
984 QualType ElementType;
985
986 InitializedEntity ElementEntity = Entity;
987 unsigned NumInits = ILE->getNumInits();
988 uint64_t NumElements = NumInits;
989 if (const ArrayType *AType = SemaRef.Context.getAsArrayType(ILE->getType())) {
990 ElementType = AType->getElementType();
991 if (const auto *CAType = dyn_cast<ConstantArrayType>(AType))
992 NumElements = CAType->getZExtSize();
993 // For an array new with an unknown bound, ask for one additional element
994 // in order to populate the array filler.
995 if (Entity.isVariableLengthArrayNew())
996 ++NumElements;
997 ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
998 0, Entity);
999 } else if (const VectorType *VType = ILE->getType()->getAs<VectorType>()) {
1000 ElementType = VType->getElementType();
1001 NumElements = VType->getNumElements();
1002 ElementEntity = InitializedEntity::InitializeElement(SemaRef.Context,
1003 0, Entity);
1004 } else
1005 ElementType = ILE->getType();
1006
1007 bool SkipEmptyInitChecks = false;
1008 for (uint64_t Init = 0; Init != NumElements; ++Init) {
1009 if (hadError)
1010 return;
1011
1012 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement ||
1013 ElementEntity.getKind() == InitializedEntity::EK_VectorElement ||
1015 ElementEntity.setElementIndex(Init);
1016
1017 if (Init >= NumInits && (ILE->hasArrayFiller() || SkipEmptyInitChecks))
1018 return;
1019
1020 Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : nullptr);
1021 if (!InitExpr && Init < NumInits && ILE->hasArrayFiller())
1022 ILE->setInit(Init, ILE->getArrayFiller());
1023 else if (!InitExpr && !ILE->hasArrayFiller()) {
1024 // In VerifyOnly mode, there's no point performing empty initialization
1025 // more than once.
1026 if (SkipEmptyInitChecks)
1027 continue;
1028
1029 Expr *Filler = nullptr;
1030
1031 if (FillWithNoInit)
1032 Filler = new (SemaRef.Context) NoInitExpr(ElementType);
1033 else {
1034 ExprResult ElementInit =
1035 PerformEmptyInit(ILE->getEndLoc(), ElementEntity);
1036 if (ElementInit.isInvalid()) {
1037 hadError = true;
1038 return;
1039 }
1040
1041 Filler = ElementInit.getAs<Expr>();
1042 }
1043
1044 if (hadError) {
1045 // Do nothing
1046 } else if (VerifyOnly) {
1047 SkipEmptyInitChecks = true;
1048 } else if (Init < NumInits) {
1049 // For arrays, just set the expression used for value-initialization
1050 // of the "holes" in the array.
1051 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement)
1052 ILE->setArrayFiller(Filler);
1053 else
1054 ILE->setInit(Init, Filler);
1055 } else {
1056 // For arrays, just set the expression used for value-initialization
1057 // of the rest of elements and exit.
1058 if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) {
1059 ILE->setArrayFiller(Filler);
1060 return;
1061 }
1062
1063 if (!isa<ImplicitValueInitExpr>(Filler) && !isa<NoInitExpr>(Filler)) {
1064 // Empty initialization requires a constructor call, so
1065 // extend the initializer list to include the constructor
1066 // call and make a note that we'll need to take another pass
1067 // through the initializer list.
1068 ILE->updateInit(SemaRef.Context, Init, Filler);
1069 RequiresSecondPass = true;
1070 }
1071 }
1072 } else if (InitListExpr *InnerILE
1073 = dyn_cast_or_null<InitListExpr>(InitExpr)) {
1074 FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
1075 ILE, Init, FillWithNoInit);
1076 } else if (DesignatedInitUpdateExpr *InnerDIUE =
1077 dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr)) {
1078 FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
1079 RequiresSecondPass, ILE, Init,
1080 /*FillWithNoInit =*/true);
1081 }
1082 }
1083}
1084
1085static bool hasAnyDesignatedInits(const InitListExpr *IL) {
1086 for (const Stmt *Init : *IL)
1087 if (isa_and_nonnull<DesignatedInitExpr>(Init))
1088 return true;
1089 return false;
1090}
1091
1092InitListChecker::InitListChecker(
1093 Sema &S, const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
1094 bool VerifyOnly, bool TreatUnavailableAsInvalid, bool InOverloadResolution,
1095 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes)
1096 : SemaRef(S), VerifyOnly(VerifyOnly),
1097 TreatUnavailableAsInvalid(TreatUnavailableAsInvalid),
1098 InOverloadResolution(InOverloadResolution),
1099 AggrDeductionCandidateParamTypes(AggrDeductionCandidateParamTypes) {
1100 if (!VerifyOnly || hasAnyDesignatedInits(IL)) {
1101 FullyStructuredList =
1102 createInitListExpr(T, IL->getSourceRange(), IL->getNumInits());
1103
1104 // FIXME: Check that IL isn't already the semantic form of some other
1105 // InitListExpr. If it is, we'd create a broken AST.
1106 if (!VerifyOnly)
1107 FullyStructuredList->setSyntacticForm(IL);
1108 }
1109
1110 CheckExplicitInitList(Entity, IL, T, FullyStructuredList,
1111 /*TopLevelObject=*/true);
1112
1113 if (!hadError && !AggrDeductionCandidateParamTypes && FullyStructuredList) {
1114 bool RequiresSecondPass = false;
1115 FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass,
1116 /*OuterILE=*/nullptr, /*OuterIndex=*/0);
1117 if (RequiresSecondPass && !hadError)
1118 FillInEmptyInitializations(Entity, FullyStructuredList,
1119 RequiresSecondPass, nullptr, 0);
1120 }
1121 if (hadError && FullyStructuredList)
1122 FullyStructuredList->markError();
1123}
1124
1125int InitListChecker::numArrayElements(QualType DeclType) {
1126 // FIXME: use a proper constant
1127 int maxElements = 0x7FFFFFFF;
1128 if (const ConstantArrayType *CAT =
1129 SemaRef.Context.getAsConstantArrayType(DeclType)) {
1130 maxElements = static_cast<int>(CAT->getZExtSize());
1131 }
1132 return maxElements;
1133}
1134
1135int InitListChecker::numStructUnionElements(QualType DeclType) {
1136 auto *structDecl = DeclType->castAsRecordDecl();
1137 int InitializableMembers = 0;
1138 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
1139 InitializableMembers += CXXRD->getNumBases();
1140 for (const auto *Field : structDecl->fields())
1141 if (!Field->isUnnamedBitField())
1142 ++InitializableMembers;
1143
1144 if (structDecl->isUnion())
1145 return std::min(InitializableMembers, 1);
1146 return InitializableMembers - structDecl->hasFlexibleArrayMember();
1147}
1148
1149/// Determine whether Entity is an entity for which it is idiomatic to elide
1150/// the braces in aggregate initialization.
1152 // Recursive initialization of the one and only field within an aggregate
1153 // class is considered idiomatic. This case arises in particular for
1154 // initialization of std::array, where the C++ standard suggests the idiom of
1155 //
1156 // std::array<T, N> arr = {1, 2, 3};
1157 //
1158 // (where std::array is an aggregate struct containing a single array field.
1159
1160 if (!Entity.getParent())
1161 return false;
1162
1163 // Allows elide brace initialization for aggregates with empty base.
1164 if (Entity.getKind() == InitializedEntity::EK_Base) {
1165 auto *ParentRD = Entity.getParent()->getType()->castAsRecordDecl();
1166 CXXRecordDecl *CXXRD = cast<CXXRecordDecl>(ParentRD);
1167 return CXXRD->getNumBases() == 1 && CXXRD->field_empty();
1168 }
1169
1170 // Allow brace elision if the only subobject is a field.
1171 if (Entity.getKind() == InitializedEntity::EK_Member) {
1172 auto *ParentRD = Entity.getParent()->getType()->castAsRecordDecl();
1173 if (CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ParentRD)) {
1174 if (CXXRD->getNumBases()) {
1175 return false;
1176 }
1177 }
1178 auto FieldIt = ParentRD->field_begin();
1179 assert(FieldIt != ParentRD->field_end() &&
1180 "no fields but have initializer for member?");
1181 return ++FieldIt == ParentRD->field_end();
1182 }
1183
1184 return false;
1185}
1186
1187/// Check whether the range of the initializer \p ParentIList from element
1188/// \p Index onwards can be used to initialize an object of type \p T. Update
1189/// \p Index to indicate how many elements of the list were consumed.
1190///
1191/// This also fills in \p StructuredList, from element \p StructuredIndex
1192/// onwards, with the fully-braced, desugared form of the initialization.
1193void InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity,
1194 InitListExpr *ParentIList,
1195 QualType T, unsigned &Index,
1196 InitListExpr *StructuredList,
1197 unsigned &StructuredIndex) {
1198 int maxElements = 0;
1199
1200 if (T->isArrayType())
1201 maxElements = numArrayElements(T);
1202 else if (T->isRecordType())
1203 maxElements = numStructUnionElements(T);
1204 else if (T->isVectorType())
1205 maxElements = T->castAs<VectorType>()->getNumElements();
1206 else
1207 llvm_unreachable("CheckImplicitInitList(): Illegal type");
1208
1209 if (maxElements == 0) {
1210 if (!VerifyOnly)
1211 SemaRef.Diag(ParentIList->getInit(Index)->getBeginLoc(),
1212 diag::err_implicit_empty_initializer);
1213 ++Index;
1214 hadError = true;
1215 return;
1216 }
1217
1218 // Build a structured initializer list corresponding to this subobject.
1219 InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(
1220 ParentIList, Index, T, StructuredList, StructuredIndex,
1221 SourceRange(ParentIList->getInit(Index)->getBeginLoc(),
1222 ParentIList->getSourceRange().getEnd()));
1223 unsigned StructuredSubobjectInitIndex = 0;
1224
1225 // Check the element types and build the structural subobject.
1226 unsigned StartIndex = Index;
1227 CheckListElementTypes(Entity, ParentIList, T,
1228 /*SubobjectIsDesignatorContext=*/false, Index,
1229 StructuredSubobjectInitList,
1230 StructuredSubobjectInitIndex);
1231
1232 if (StructuredSubobjectInitList) {
1233 StructuredSubobjectInitList->setType(T);
1234
1235 unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
1236 // Update the structured sub-object initializer so that it's ending
1237 // range corresponds with the end of the last initializer it used.
1238 if (EndIndex < ParentIList->getNumInits() &&
1239 ParentIList->getInit(EndIndex)) {
1240 SourceLocation EndLoc
1241 = ParentIList->getInit(EndIndex)->getSourceRange().getEnd();
1242 StructuredSubobjectInitList->setRBraceLoc(EndLoc);
1243 }
1244
1245 // Complain about missing braces.
1246 if (!VerifyOnly && (T->isArrayType() || T->isRecordType()) &&
1247 !ParentIList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
1249 SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1250 diag::warn_missing_braces)
1251 << StructuredSubobjectInitList->getSourceRange()
1253 StructuredSubobjectInitList->getBeginLoc(), "{")
1255 SemaRef.getLocForEndOfToken(
1256 StructuredSubobjectInitList->getEndLoc()),
1257 "}");
1258 }
1259
1260 // Warn if this type won't be an aggregate in future versions of C++.
1261 auto *CXXRD = T->getAsCXXRecordDecl();
1262 if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1263 SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(),
1264 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1265 << StructuredSubobjectInitList->getSourceRange() << T;
1266 }
1267 }
1268}
1269
1270/// Warn that \p Entity was of scalar type and was initialized by a
1271/// single-element braced initializer list.
1272static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity,
1274 // Don't warn during template instantiation. If the initialization was
1275 // non-dependent, we warned during the initial parse; otherwise, the
1276 // type might not be scalar in some uses of the template.
1278 return;
1279
1280 unsigned DiagID = 0;
1281
1282 switch (Entity.getKind()) {
1292 // Extra braces here are suspicious.
1293 DiagID = diag::warn_braces_around_init;
1294 break;
1295
1297 // Warn on aggregate initialization but not on ctor init list or
1298 // default member initializer.
1299 if (Entity.getParent())
1300 DiagID = diag::warn_braces_around_init;
1301 break;
1302
1305 // No warning, might be direct-list-initialization.
1306 // FIXME: Should we warn for copy-list-initialization in these cases?
1307 break;
1308
1312 // No warning, braces are part of the syntax of the underlying construct.
1313 break;
1314
1316 // No warning, we already warned when initializing the result.
1317 break;
1318
1326 llvm_unreachable("unexpected braced scalar init");
1327 }
1328
1329 if (DiagID) {
1330 S.Diag(Braces.getBegin(), DiagID)
1331 << Entity.getType()->isSizelessBuiltinType() << Braces
1332 << FixItHint::CreateRemoval(Braces.getBegin())
1333 << FixItHint::CreateRemoval(Braces.getEnd());
1334 }
1335}
1336
1337/// Check whether the initializer \p IList (that was written with explicit
1338/// braces) can be used to initialize an object of type \p T.
1339///
1340/// This also fills in \p StructuredList with the fully-braced, desugared
1341/// form of the initialization.
1342void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity,
1343 InitListExpr *IList, QualType &T,
1344 InitListExpr *StructuredList,
1345 bool TopLevelObject) {
1346 unsigned Index = 0, StructuredIndex = 0;
1347 CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true,
1348 Index, StructuredList, StructuredIndex, TopLevelObject);
1349 if (StructuredList) {
1350 QualType ExprTy = T;
1351 if (!ExprTy->isArrayType())
1352 ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context);
1353 if (!VerifyOnly)
1354 IList->setType(ExprTy);
1355 StructuredList->setType(ExprTy);
1356 }
1357 if (hadError)
1358 return;
1359
1360 // Don't complain for incomplete types, since we'll get an error elsewhere.
1361 if ((Index < IList->getNumInits() || CurEmbed) && !T->isIncompleteType()) {
1362 // We have leftover initializers
1363 bool ExtraInitsIsError = SemaRef.getLangOpts().CPlusPlus ||
1364 (SemaRef.getLangOpts().OpenCL && T->isVectorType());
1365 hadError = ExtraInitsIsError;
1366 if (VerifyOnly) {
1367 return;
1368 } else if (StructuredIndex == 1 &&
1369 IsStringInit(StructuredList->getInit(0), T, SemaRef.Context) ==
1370 SIF_None) {
1371 unsigned DK =
1372 ExtraInitsIsError
1373 ? diag::err_excess_initializers_in_char_array_initializer
1374 : diag::ext_excess_initializers_in_char_array_initializer;
1375 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1376 << IList->getInit(Index)->getSourceRange();
1377 } else if (T->isSizelessBuiltinType()) {
1378 unsigned DK = ExtraInitsIsError
1379 ? diag::err_excess_initializers_for_sizeless_type
1380 : diag::ext_excess_initializers_for_sizeless_type;
1381 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1382 << T << IList->getInit(Index)->getSourceRange();
1383 } else {
1384 int initKind = T->isArrayType() ? 0
1385 : T->isVectorType() ? 1
1386 : T->isMatrixType() ? 2
1387 : T->isScalarType() ? 3
1388 : T->isUnionType() ? 4
1389 : 5;
1390
1391 unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
1392 : diag::ext_excess_initializers;
1393 SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
1394 << initKind << IList->getInit(Index)->getSourceRange();
1395 }
1396 }
1397
1398 if (!VerifyOnly) {
1399 if (T->isScalarType() && IList->getNumInits() == 1 &&
1400 !isa<InitListExpr>(IList->getInit(0)))
1401 warnBracedScalarInit(SemaRef, Entity, IList->getSourceRange());
1402
1403 // Warn if this is a class type that won't be an aggregate in future
1404 // versions of C++.
1405 auto *CXXRD = T->getAsCXXRecordDecl();
1406 if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1407 // Don't warn if there's an equivalent default constructor that would be
1408 // used instead.
1409 bool HasEquivCtor = false;
1410 if (IList->getNumInits() == 0) {
1411 auto *CD = SemaRef.LookupDefaultConstructor(CXXRD);
1412 HasEquivCtor = CD && !CD->isDeleted();
1413 }
1414
1415 if (!HasEquivCtor) {
1416 SemaRef.Diag(IList->getBeginLoc(),
1417 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1418 << IList->getSourceRange() << T;
1419 }
1420 }
1421 }
1422}
1423
1424void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
1425 InitListExpr *IList,
1426 QualType &DeclType,
1427 bool SubobjectIsDesignatorContext,
1428 unsigned &Index,
1429 InitListExpr *StructuredList,
1430 unsigned &StructuredIndex,
1431 bool TopLevelObject) {
1432 if (DeclType->isAnyComplexType() && SubobjectIsDesignatorContext) {
1433 // Explicitly braced initializer for complex type can be real+imaginary
1434 // parts.
1435 CheckComplexType(Entity, IList, DeclType, Index,
1436 StructuredList, StructuredIndex);
1437 } else if (DeclType->isScalarType()) {
1438 CheckScalarType(Entity, IList, DeclType, Index,
1439 StructuredList, StructuredIndex);
1440 } else if (DeclType->isVectorType()) {
1441 CheckVectorType(Entity, IList, DeclType, Index,
1442 StructuredList, StructuredIndex);
1443 } else if (DeclType->isMatrixType()) {
1444 CheckMatrixType(Entity, IList, DeclType, Index, StructuredList,
1445 StructuredIndex);
1446 } else if (const RecordDecl *RD = DeclType->getAsRecordDecl()) {
1447 auto Bases =
1450 if (DeclType->isRecordType()) {
1451 assert(DeclType->isAggregateType() &&
1452 "non-aggregate records should be handed in CheckSubElementType");
1453 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1454 Bases = CXXRD->bases();
1455 } else {
1456 Bases = cast<CXXRecordDecl>(RD)->bases();
1457 }
1458 CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1459 SubobjectIsDesignatorContext, Index, StructuredList,
1460 StructuredIndex, TopLevelObject);
1461 } else if (DeclType->isArrayType()) {
1462 llvm::APSInt Zero(
1463 SemaRef.Context.getTypeSize(SemaRef.Context.getSizeType()),
1464 false);
1465 CheckArrayType(Entity, IList, DeclType, Zero,
1466 SubobjectIsDesignatorContext, Index,
1467 StructuredList, StructuredIndex);
1468 } else if (DeclType->isVoidType() || DeclType->isFunctionType()) {
1469 // This type is invalid, issue a diagnostic.
1470 ++Index;
1471 if (!VerifyOnly)
1472 SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1473 << DeclType;
1474 hadError = true;
1475 } else if (DeclType->isReferenceType()) {
1476 CheckReferenceType(Entity, IList, DeclType, Index,
1477 StructuredList, StructuredIndex);
1478 } else if (DeclType->isObjCObjectType()) {
1479 if (!VerifyOnly)
1480 SemaRef.Diag(IList->getBeginLoc(), diag::err_init_objc_class) << DeclType;
1481 hadError = true;
1482 } else if (DeclType->isOCLIntelSubgroupAVCType() ||
1483 DeclType->isSizelessBuiltinType()) {
1484 // Checks for scalar type are sufficient for these types too.
1485 CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1486 StructuredIndex);
1487 } else if (DeclType->isDependentType()) {
1488 // C++ [over.match.class.deduct]p1.5:
1489 // brace elision is not considered for any aggregate element that has a
1490 // dependent non-array type or an array type with a value-dependent bound
1491 ++Index;
1492 assert(AggrDeductionCandidateParamTypes);
1493 AggrDeductionCandidateParamTypes->push_back(DeclType);
1494 } else {
1495 if (!VerifyOnly)
1496 SemaRef.Diag(IList->getBeginLoc(), diag::err_illegal_initializer_type)
1497 << DeclType;
1498 hadError = true;
1499 }
1500}
1501
1502void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
1503 InitListExpr *IList,
1504 QualType ElemType,
1505 unsigned &Index,
1506 InitListExpr *StructuredList,
1507 unsigned &StructuredIndex,
1508 bool DirectlyDesignated) {
1509 Expr *expr = IList->getInit(Index);
1510
1511 if (ElemType->isReferenceType())
1512 return CheckReferenceType(Entity, IList, ElemType, Index,
1513 StructuredList, StructuredIndex);
1514
1515 if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
1516 if (SubInitList->getNumInits() == 1 &&
1517 IsStringInit(SubInitList->getInit(0), ElemType, SemaRef.Context) ==
1518 SIF_None) {
1519 // FIXME: It would be more faithful and no less correct to include an
1520 // InitListExpr in the semantic form of the initializer list in this case.
1521 expr = SubInitList->getInit(0);
1522 }
1523 // Nested aggregate initialization and C++ initialization are handled later.
1524 } else if (isa<ImplicitValueInitExpr>(expr)) {
1525 // This happens during template instantiation when we see an InitListExpr
1526 // that we've already checked once.
1527 assert(SemaRef.Context.hasSameType(expr->getType(), ElemType) &&
1528 "found implicit initialization for the wrong type");
1529 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1530 ++Index;
1531 return;
1532 }
1533
1534 if (SemaRef.getLangOpts().CPlusPlus || isa<InitListExpr>(expr)) {
1535 // C++ [dcl.init.aggr]p2:
1536 // Each member is copy-initialized from the corresponding
1537 // initializer-clause.
1538
1539 // FIXME: Better EqualLoc?
1540 InitializationKind Kind =
1541 InitializationKind::CreateCopy(expr->getBeginLoc(), SourceLocation());
1542
1543 // Vector elements can be initialized from other vectors in which case
1544 // we need initialization entity with a type of a vector (and not a vector
1545 // element!) initializing multiple vector elements.
1546 auto TmpEntity =
1547 (ElemType->isExtVectorType() && !Entity.getType()->isExtVectorType())
1549 : Entity;
1550
1551 if (TmpEntity.getType()->isDependentType()) {
1552 // C++ [over.match.class.deduct]p1.5:
1553 // brace elision is not considered for any aggregate element that has a
1554 // dependent non-array type or an array type with a value-dependent
1555 // bound
1556 assert(AggrDeductionCandidateParamTypes);
1557
1558 // In the presence of a braced-init-list within the initializer, we should
1559 // not perform brace-elision, even if brace elision would otherwise be
1560 // applicable. For example, given:
1561 //
1562 // template <class T> struct Foo {
1563 // T t[2];
1564 // };
1565 //
1566 // Foo t = {{1, 2}};
1567 //
1568 // we don't want the (T, T) but rather (T [2]) in terms of the initializer
1569 // {{1, 2}}.
1571 !isa_and_present<ConstantArrayType>(
1572 SemaRef.Context.getAsArrayType(ElemType))) {
1573 ++Index;
1574 AggrDeductionCandidateParamTypes->push_back(ElemType);
1575 return;
1576 }
1577 } else {
1578 InitializationSequence Seq(SemaRef, TmpEntity, Kind, expr,
1579 /*TopLevelOfInitList*/ true);
1580 // C++14 [dcl.init.aggr]p13:
1581 // If the assignment-expression can initialize a member, the member is
1582 // initialized. Otherwise [...] brace elision is assumed
1583 //
1584 // Brace elision is never performed if the element is not an
1585 // assignment-expression.
1586 if (Seq || isa<InitListExpr>(expr)) {
1587 if (auto *Embed = dyn_cast<EmbedExpr>(expr)) {
1588 expr = HandleEmbed(Embed, Entity);
1589 }
1590 if (!VerifyOnly) {
1591 ExprResult Result = Seq.Perform(SemaRef, TmpEntity, Kind, expr);
1592 if (Result.isInvalid())
1593 hadError = true;
1594
1595 UpdateStructuredListElement(StructuredList, StructuredIndex,
1596 Result.getAs<Expr>());
1597 } else if (!Seq) {
1598 hadError = true;
1599 } else if (StructuredList) {
1600 UpdateStructuredListElement(StructuredList, StructuredIndex,
1601 getDummyInit());
1602 }
1603 if (!CurEmbed)
1604 ++Index;
1605 if (AggrDeductionCandidateParamTypes)
1606 AggrDeductionCandidateParamTypes->push_back(ElemType);
1607 return;
1608 }
1609 }
1610
1611 // Fall through for subaggregate initialization
1612 } else if (ElemType->isScalarType() || ElemType->isAtomicType()) {
1613 // FIXME: Need to handle atomic aggregate types with implicit init lists.
1614 return CheckScalarType(Entity, IList, ElemType, Index,
1615 StructuredList, StructuredIndex);
1616 } else if (const ArrayType *arrayType =
1617 SemaRef.Context.getAsArrayType(ElemType)) {
1618 // arrayType can be incomplete if we're initializing a flexible
1619 // array member. There's nothing we can do with the completed
1620 // type here, though.
1621
1622 if (IsStringInit(expr, arrayType, SemaRef.Context) == SIF_None) {
1623 // FIXME: Should we do this checking in verify-only mode?
1624 if (!VerifyOnly)
1625 CheckStringInit(expr, ElemType, arrayType, SemaRef, Entity,
1626 SemaRef.getLangOpts().C23 &&
1628 if (StructuredList)
1629 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1630 ++Index;
1631 return;
1632 }
1633
1634 // Fall through for subaggregate initialization.
1635
1636 } else {
1637 assert((ElemType->isRecordType() || ElemType->isVectorType() ||
1638 ElemType->isOpenCLSpecificType() || ElemType->isMFloat8Type()) &&
1639 "Unexpected type");
1640
1641 // C99 6.7.8p13:
1642 //
1643 // The initializer for a structure or union object that has
1644 // automatic storage duration shall be either an initializer
1645 // list as described below, or a single expression that has
1646 // compatible structure or union type. In the latter case, the
1647 // initial value of the object, including unnamed members, is
1648 // that of the expression.
1649 ExprResult ExprRes = expr;
1650 if (SemaRef.CheckSingleAssignmentConstraints(ElemType, ExprRes,
1651 !VerifyOnly) !=
1652 AssignConvertType::Incompatible) {
1653 if (ExprRes.isInvalid())
1654 hadError = true;
1655 else {
1656 ExprRes = SemaRef.DefaultFunctionArrayLvalueConversion(ExprRes.get());
1657 if (ExprRes.isInvalid())
1658 hadError = true;
1659 }
1660 UpdateStructuredListElement(StructuredList, StructuredIndex,
1661 ExprRes.getAs<Expr>());
1662 ++Index;
1663 return;
1664 }
1665 ExprRes.get();
1666 // Fall through for subaggregate initialization
1667 }
1668
1669 // C++ [dcl.init.aggr]p12:
1670 //
1671 // [...] Otherwise, if the member is itself a non-empty
1672 // subaggregate, brace elision is assumed and the initializer is
1673 // considered for the initialization of the first member of
1674 // the subaggregate.
1675 // OpenCL vector initializer is handled elsewhere.
1676 if ((!SemaRef.getLangOpts().OpenCL && ElemType->isVectorType()) ||
1677 ElemType->isAggregateType()) {
1678 CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1679 StructuredIndex);
1680 ++StructuredIndex;
1681
1682 // In C++20, brace elision is not permitted for a designated initializer.
1683 if (DirectlyDesignated && SemaRef.getLangOpts().CPlusPlus && !hadError) {
1684 if (InOverloadResolution)
1685 hadError = true;
1686 if (!VerifyOnly) {
1687 SemaRef.Diag(expr->getBeginLoc(),
1688 diag::ext_designated_init_brace_elision)
1689 << expr->getSourceRange()
1690 << FixItHint::CreateInsertion(expr->getBeginLoc(), "{")
1692 SemaRef.getLocForEndOfToken(expr->getEndLoc()), "}");
1693 }
1694 }
1695 } else {
1696 if (!VerifyOnly) {
1697 // We cannot initialize this element, so let PerformCopyInitialization
1698 // produce the appropriate diagnostic. We already checked that this
1699 // initialization will fail.
1701 SemaRef.PerformCopyInitialization(Entity, SourceLocation(), expr,
1702 /*TopLevelOfInitList=*/true);
1703 (void)Copy;
1704 assert(Copy.isInvalid() &&
1705 "expected non-aggregate initialization to fail");
1706 }
1707 hadError = true;
1708 ++Index;
1709 ++StructuredIndex;
1710 }
1711}
1712
1713void InitListChecker::CheckComplexType(const InitializedEntity &Entity,
1714 InitListExpr *IList, QualType DeclType,
1715 unsigned &Index,
1716 InitListExpr *StructuredList,
1717 unsigned &StructuredIndex) {
1718 assert(Index == 0 && "Index in explicit init list must be zero");
1719
1720 // As an extension, clang supports complex initializers, which initialize
1721 // a complex number component-wise. When an explicit initializer list for
1722 // a complex number contains two initializers, this extension kicks in:
1723 // it expects the initializer list to contain two elements convertible to
1724 // the element type of the complex type. The first element initializes
1725 // the real part, and the second element intitializes the imaginary part.
1726
1727 if (IList->getNumInits() < 2)
1728 return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1729 StructuredIndex);
1730
1731 // This is an extension in C. (The builtin _Complex type does not exist
1732 // in the C++ standard.)
1733 if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly)
1734 SemaRef.Diag(IList->getBeginLoc(), diag::ext_complex_component_init)
1735 << IList->getSourceRange();
1736
1737 // Initialize the complex number.
1738 QualType elementType = DeclType->castAs<ComplexType>()->getElementType();
1739 InitializedEntity ElementEntity =
1741
1742 for (unsigned i = 0; i < 2; ++i) {
1743 ElementEntity.setElementIndex(Index);
1744 CheckSubElementType(ElementEntity, IList, elementType, Index,
1745 StructuredList, StructuredIndex);
1746 }
1747}
1748
1749void InitListChecker::CheckScalarType(const InitializedEntity &Entity,
1750 InitListExpr *IList, QualType DeclType,
1751 unsigned &Index,
1752 InitListExpr *StructuredList,
1753 unsigned &StructuredIndex) {
1754 if (Index >= IList->getNumInits()) {
1755 if (!VerifyOnly) {
1756 if (SemaRef.getLangOpts().CPlusPlus) {
1757 if (DeclType->isSizelessBuiltinType())
1758 SemaRef.Diag(IList->getBeginLoc(),
1759 SemaRef.getLangOpts().CPlusPlus11
1760 ? diag::warn_cxx98_compat_empty_sizeless_initializer
1761 : diag::err_empty_sizeless_initializer)
1762 << DeclType << IList->getSourceRange();
1763 else
1764 SemaRef.Diag(IList->getBeginLoc(),
1765 SemaRef.getLangOpts().CPlusPlus11
1766 ? diag::warn_cxx98_compat_empty_scalar_initializer
1767 : diag::err_empty_scalar_initializer)
1768 << IList->getSourceRange();
1769 }
1770 }
1771 hadError =
1772 SemaRef.getLangOpts().CPlusPlus && !SemaRef.getLangOpts().CPlusPlus11;
1773 ++Index;
1774 ++StructuredIndex;
1775 return;
1776 }
1777
1778 Expr *expr = IList->getInit(Index);
1779 if (InitListExpr *SubIList = dyn_cast<InitListExpr>(expr)) {
1780 // FIXME: This is invalid, and accepting it causes overload resolution
1781 // to pick the wrong overload in some corner cases.
1782 if (!VerifyOnly)
1783 SemaRef.Diag(SubIList->getBeginLoc(), diag::ext_many_braces_around_init)
1784 << DeclType->isSizelessBuiltinType() << SubIList->getSourceRange();
1785
1786 CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1787 StructuredIndex);
1788 return;
1789 } else if (isa<DesignatedInitExpr>(expr)) {
1790 if (!VerifyOnly)
1791 SemaRef.Diag(expr->getBeginLoc(),
1792 diag::err_designator_for_scalar_or_sizeless_init)
1793 << DeclType->isSizelessBuiltinType() << DeclType
1794 << expr->getSourceRange();
1795 hadError = true;
1796 ++Index;
1797 ++StructuredIndex;
1798 return;
1799 } else if (auto *Embed = dyn_cast<EmbedExpr>(expr)) {
1800 expr = HandleEmbed(Embed, Entity);
1801 }
1802
1804 if (VerifyOnly) {
1805 if (SemaRef.CanPerformCopyInitialization(Entity, expr))
1806 Result = getDummyInit();
1807 else
1808 Result = ExprError();
1809 } else {
1810 Result =
1811 SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1812 /*TopLevelOfInitList=*/true);
1813 }
1814
1815 Expr *ResultExpr = nullptr;
1816
1817 if (Result.isInvalid())
1818 hadError = true; // types weren't compatible.
1819 else {
1820 ResultExpr = Result.getAs<Expr>();
1821
1822 if (ResultExpr != expr && !VerifyOnly && !CurEmbed) {
1823 // The type was promoted, update initializer list.
1824 // FIXME: Why are we updating the syntactic init list?
1825 IList->setInit(Index, ResultExpr);
1826 }
1827 }
1828
1829 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1830 if (!CurEmbed)
1831 ++Index;
1832 if (AggrDeductionCandidateParamTypes)
1833 AggrDeductionCandidateParamTypes->push_back(DeclType);
1834}
1835
1836void InitListChecker::CheckReferenceType(const InitializedEntity &Entity,
1837 InitListExpr *IList, QualType DeclType,
1838 unsigned &Index,
1839 InitListExpr *StructuredList,
1840 unsigned &StructuredIndex) {
1841 if (Index >= IList->getNumInits()) {
1842 // FIXME: It would be wonderful if we could point at the actual member. In
1843 // general, it would be useful to pass location information down the stack,
1844 // so that we know the location (or decl) of the "current object" being
1845 // initialized.
1846 if (!VerifyOnly)
1847 SemaRef.Diag(IList->getBeginLoc(),
1848 diag::err_init_reference_member_uninitialized)
1849 << DeclType << IList->getSourceRange();
1850 hadError = true;
1851 ++Index;
1852 ++StructuredIndex;
1853 return;
1854 }
1855
1856 Expr *expr = IList->getInit(Index);
1857 if (isa<InitListExpr>(expr) && !SemaRef.getLangOpts().CPlusPlus11) {
1858 if (!VerifyOnly)
1859 SemaRef.Diag(IList->getBeginLoc(), diag::err_init_non_aggr_init_list)
1860 << DeclType << IList->getSourceRange();
1861 hadError = true;
1862 ++Index;
1863 ++StructuredIndex;
1864 return;
1865 }
1866
1868 if (VerifyOnly) {
1869 if (SemaRef.CanPerformCopyInitialization(Entity,expr))
1870 Result = getDummyInit();
1871 else
1872 Result = ExprError();
1873 } else {
1874 Result =
1875 SemaRef.PerformCopyInitialization(Entity, expr->getBeginLoc(), expr,
1876 /*TopLevelOfInitList=*/true);
1877 }
1878
1879 if (Result.isInvalid())
1880 hadError = true;
1881
1882 expr = Result.getAs<Expr>();
1883 // FIXME: Why are we updating the syntactic init list?
1884 if (!VerifyOnly && expr)
1885 IList->setInit(Index, expr);
1886
1887 UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
1888 ++Index;
1889 if (AggrDeductionCandidateParamTypes)
1890 AggrDeductionCandidateParamTypes->push_back(DeclType);
1891}
1892
1893void InitListChecker::CheckMatrixType(const InitializedEntity &Entity,
1894 InitListExpr *IList, QualType DeclType,
1895 unsigned &Index,
1896 InitListExpr *StructuredList,
1897 unsigned &StructuredIndex) {
1898 if (!SemaRef.getLangOpts().HLSL)
1899 return;
1900
1901 const ConstantMatrixType *MT = DeclType->castAs<ConstantMatrixType>();
1902
1903 // For HLSL, the error reporting for this case is handled in SemaHLSL's
1904 // initializer list diagnostics. That means the execution should require
1905 // getNumElementsFlattened to equal getNumInits. In other words the execution
1906 // should never reach this point if this condition is not true".
1907 assert(IList->getNumInits() == MT->getNumElementsFlattened() &&
1908 "Inits must equal Matrix element count");
1909
1910 QualType ElemTy = MT->getElementType();
1911
1912 Index = 0;
1913 InitializedEntity Element =
1915
1916 while (Index < IList->getNumInits()) {
1917 // Not a sublist: just consume directly.
1918 // Note: In HLSL, elements of the InitListExpr are in row-major order, so no
1919 // change is needed to the Index.
1920 Element.setElementIndex(Index);
1921 CheckSubElementType(Element, IList, ElemTy, Index, StructuredList,
1922 StructuredIndex);
1923 }
1924}
1925
1926void InitListChecker::CheckVectorType(const InitializedEntity &Entity,
1927 InitListExpr *IList, QualType DeclType,
1928 unsigned &Index,
1929 InitListExpr *StructuredList,
1930 unsigned &StructuredIndex) {
1931 const VectorType *VT = DeclType->castAs<VectorType>();
1932 unsigned maxElements = VT->getNumElements();
1933 unsigned numEltsInit = 0;
1934 QualType elementType = VT->getElementType();
1935
1936 if (Index >= IList->getNumInits()) {
1937 // Make sure the element type can be value-initialized.
1938 CheckEmptyInitializable(
1940 IList->getEndLoc());
1941 return;
1942 }
1943
1944 if (!SemaRef.getLangOpts().OpenCL && !SemaRef.getLangOpts().HLSL ) {
1945 // If the initializing element is a vector, try to copy-initialize
1946 // instead of breaking it apart (which is doomed to failure anyway).
1947 Expr *Init = IList->getInit(Index);
1948 if (!isa<InitListExpr>(Init) && Init->getType()->isVectorType()) {
1950 if (VerifyOnly) {
1951 if (SemaRef.CanPerformCopyInitialization(Entity, Init))
1952 Result = getDummyInit();
1953 else
1954 Result = ExprError();
1955 } else {
1956 Result =
1957 SemaRef.PerformCopyInitialization(Entity, Init->getBeginLoc(), Init,
1958 /*TopLevelOfInitList=*/true);
1959 }
1960
1961 Expr *ResultExpr = nullptr;
1962 if (Result.isInvalid())
1963 hadError = true; // types weren't compatible.
1964 else {
1965 ResultExpr = Result.getAs<Expr>();
1966
1967 if (ResultExpr != Init && !VerifyOnly) {
1968 // The type was promoted, update initializer list.
1969 // FIXME: Why are we updating the syntactic init list?
1970 IList->setInit(Index, ResultExpr);
1971 }
1972 }
1973 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1974 ++Index;
1975 if (AggrDeductionCandidateParamTypes)
1976 AggrDeductionCandidateParamTypes->push_back(elementType);
1977 return;
1978 }
1979
1980 InitializedEntity ElementEntity =
1982
1983 for (unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1984 // Don't attempt to go past the end of the init list
1985 if (Index >= IList->getNumInits()) {
1986 CheckEmptyInitializable(ElementEntity, IList->getEndLoc());
1987 break;
1988 }
1989
1990 ElementEntity.setElementIndex(Index);
1991 CheckSubElementType(ElementEntity, IList, elementType, Index,
1992 StructuredList, StructuredIndex);
1993 }
1994
1995 if (VerifyOnly)
1996 return;
1997
1998 bool isBigEndian = SemaRef.Context.getTargetInfo().isBigEndian();
1999 const VectorType *T = Entity.getType()->castAs<VectorType>();
2000 if (isBigEndian && (T->getVectorKind() == VectorKind::Neon ||
2001 T->getVectorKind() == VectorKind::NeonPoly)) {
2002 // The ability to use vector initializer lists is a GNU vector extension
2003 // and is unrelated to the NEON intrinsics in arm_neon.h. On little
2004 // endian machines it works fine, however on big endian machines it
2005 // exhibits surprising behaviour:
2006 //
2007 // uint32x2_t x = {42, 64};
2008 // return vget_lane_u32(x, 0); // Will return 64.
2009 //
2010 // Because of this, explicitly call out that it is non-portable.
2011 //
2012 SemaRef.Diag(IList->getBeginLoc(),
2013 diag::warn_neon_vector_initializer_non_portable);
2014
2015 const char *typeCode;
2016 unsigned typeSize = SemaRef.Context.getTypeSize(elementType);
2017
2018 if (elementType->isFloatingType())
2019 typeCode = "f";
2020 else if (elementType->isSignedIntegerType())
2021 typeCode = "s";
2022 else if (elementType->isUnsignedIntegerType())
2023 typeCode = "u";
2024 else if (elementType->isMFloat8Type())
2025 typeCode = "mf";
2026 else
2027 llvm_unreachable("Invalid element type!");
2028
2029 SemaRef.Diag(IList->getBeginLoc(),
2030 SemaRef.Context.getTypeSize(VT) > 64
2031 ? diag::note_neon_vector_initializer_non_portable_q
2032 : diag::note_neon_vector_initializer_non_portable)
2033 << typeCode << typeSize;
2034 }
2035
2036 return;
2037 }
2038
2039 InitializedEntity ElementEntity =
2041
2042 // OpenCL and HLSL initializers allow vectors to be constructed from vectors.
2043 for (unsigned i = 0; i < maxElements; ++i) {
2044 // Don't attempt to go past the end of the init list
2045 if (Index >= IList->getNumInits())
2046 break;
2047
2048 ElementEntity.setElementIndex(Index);
2049
2050 QualType IType = IList->getInit(Index)->getType();
2051 if (!IType->isVectorType()) {
2052 CheckSubElementType(ElementEntity, IList, elementType, Index,
2053 StructuredList, StructuredIndex);
2054 ++numEltsInit;
2055 } else {
2056 QualType VecType;
2057 const VectorType *IVT = IType->castAs<VectorType>();
2058 unsigned numIElts = IVT->getNumElements();
2059
2060 if (IType->isExtVectorType())
2061 VecType = SemaRef.Context.getExtVectorType(elementType, numIElts);
2062 else
2063 VecType = SemaRef.Context.getVectorType(elementType, numIElts,
2064 IVT->getVectorKind());
2065 CheckSubElementType(ElementEntity, IList, VecType, Index,
2066 StructuredList, StructuredIndex);
2067 numEltsInit += numIElts;
2068 }
2069 }
2070
2071 // OpenCL and HLSL require all elements to be initialized.
2072 if (numEltsInit != maxElements) {
2073 if (!VerifyOnly)
2074 SemaRef.Diag(IList->getBeginLoc(),
2075 diag::err_vector_incorrect_num_elements)
2076 << (numEltsInit < maxElements) << maxElements << numEltsInit
2077 << /*initialization*/ 0;
2078 hadError = true;
2079 }
2080}
2081
2082/// Check if the type of a class element has an accessible destructor, and marks
2083/// it referenced. Returns true if we shouldn't form a reference to the
2084/// destructor.
2085///
2086/// Aggregate initialization requires a class element's destructor be
2087/// accessible per 11.6.1 [dcl.init.aggr]:
2088///
2089/// The destructor for each element of class type is potentially invoked
2090/// (15.4 [class.dtor]) from the context where the aggregate initialization
2091/// occurs.
2093 Sema &SemaRef) {
2094 auto *CXXRD = ElementType->getAsCXXRecordDecl();
2095 if (!CXXRD)
2096 return false;
2097
2099 if (!Destructor)
2100 return false;
2101
2102 SemaRef.CheckDestructorAccess(Loc, Destructor,
2103 SemaRef.PDiag(diag::err_access_dtor_temp)
2104 << ElementType);
2105 SemaRef.MarkFunctionReferenced(Loc, Destructor);
2106 return SemaRef.DiagnoseUseOfDecl(Destructor, Loc);
2107}
2108
2109static bool
2111 const InitializedEntity &Entity,
2112 ASTContext &Context) {
2113 QualType InitType = Entity.getType();
2114 const InitializedEntity *Parent = &Entity;
2115
2116 while (Parent) {
2117 InitType = Parent->getType();
2118 Parent = Parent->getParent();
2119 }
2120
2121 // Only one initializer, it's an embed and the types match;
2122 EmbedExpr *EE =
2123 ExprList.size() == 1
2124 ? dyn_cast_if_present<EmbedExpr>(ExprList[0]->IgnoreParens())
2125 : nullptr;
2126 if (!EE)
2127 return false;
2128
2129 if (InitType->isArrayType()) {
2130 const ArrayType *InitArrayType = InitType->getAsArrayTypeUnsafe();
2132 return IsStringInit(SL, InitArrayType, Context) == SIF_None;
2133 }
2134 return false;
2135}
2136
2137void InitListChecker::CheckArrayType(const InitializedEntity &Entity,
2138 InitListExpr *IList, QualType &DeclType,
2139 llvm::APSInt elementIndex,
2140 bool SubobjectIsDesignatorContext,
2141 unsigned &Index,
2142 InitListExpr *StructuredList,
2143 unsigned &StructuredIndex) {
2144 const ArrayType *arrayType = SemaRef.Context.getAsArrayType(DeclType);
2145
2146 if (!VerifyOnly) {
2147 if (checkDestructorReference(arrayType->getElementType(),
2148 IList->getEndLoc(), SemaRef)) {
2149 hadError = true;
2150 return;
2151 }
2152 }
2153
2154 if (canInitializeArrayWithEmbedDataString(IList->inits(), Entity,
2155 SemaRef.Context)) {
2156 EmbedExpr *Embed = cast<EmbedExpr>(IList->inits()[0]);
2157 IList->setInit(0, Embed->getDataStringLiteral());
2158 }
2159
2160 // Check for the special-case of initializing an array with a string.
2161 if (Index < IList->getNumInits()) {
2162 if (IsStringInit(IList->getInit(Index), arrayType, SemaRef.Context) ==
2163 SIF_None) {
2164 // We place the string literal directly into the resulting
2165 // initializer list. This is the only place where the structure
2166 // of the structured initializer list doesn't match exactly,
2167 // because doing so would involve allocating one character
2168 // constant for each string.
2169 // FIXME: Should we do these checks in verify-only mode too?
2170 if (!VerifyOnly)
2172 IList->getInit(Index), DeclType, arrayType, SemaRef, Entity,
2173 SemaRef.getLangOpts().C23 && initializingConstexprVariable(Entity));
2174 if (StructuredList) {
2175 UpdateStructuredListElement(StructuredList, StructuredIndex,
2176 IList->getInit(Index));
2177 StructuredList->resizeInits(SemaRef.Context, StructuredIndex);
2178 }
2179 ++Index;
2180 if (AggrDeductionCandidateParamTypes)
2181 AggrDeductionCandidateParamTypes->push_back(DeclType);
2182 return;
2183 }
2184 }
2185 if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) {
2186 // Check for VLAs; in standard C it would be possible to check this
2187 // earlier, but I don't know where clang accepts VLAs (gcc accepts
2188 // them in all sorts of strange places).
2189 bool HasErr = IList->getNumInits() != 0 || SemaRef.getLangOpts().CPlusPlus;
2190 if (!VerifyOnly) {
2191 // C23 6.7.10p4: An entity of variable length array type shall not be
2192 // initialized except by an empty initializer.
2193 //
2194 // The C extension warnings are issued from ParseBraceInitializer() and
2195 // do not need to be issued here. However, we continue to issue an error
2196 // in the case there are initializers or we are compiling C++. We allow
2197 // use of VLAs in C++, but it's not clear we want to allow {} to zero
2198 // init a VLA in C++ in all cases (such as with non-trivial constructors).
2199 // FIXME: should we allow this construct in C++ when it makes sense to do
2200 // so?
2201 if (HasErr)
2202 SemaRef.Diag(VAT->getSizeExpr()->getBeginLoc(),
2203 diag::err_variable_object_no_init)
2204 << VAT->getSizeExpr()->getSourceRange();
2205 }
2206 hadError = HasErr;
2207 ++Index;
2208 ++StructuredIndex;
2209 return;
2210 }
2211
2212 // We might know the maximum number of elements in advance.
2213 llvm::APSInt maxElements(elementIndex.getBitWidth(),
2214 elementIndex.isUnsigned());
2215 bool maxElementsKnown = false;
2216 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(arrayType)) {
2217 maxElements = CAT->getSize();
2218 elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
2219 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2220 maxElementsKnown = true;
2221 }
2222
2223 QualType elementType = arrayType->getElementType();
2224 while (Index < IList->getNumInits()) {
2225 Expr *Init = IList->getInit(Index);
2226 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
2227 // If we're not the subobject that matches up with the '{' for
2228 // the designator, we shouldn't be handling the
2229 // designator. Return immediately.
2230 if (!SubobjectIsDesignatorContext)
2231 return;
2232
2233 // Handle this designated initializer. elementIndex will be
2234 // updated to be the next array element we'll initialize.
2235 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
2236 DeclType, nullptr, &elementIndex, Index,
2237 StructuredList, StructuredIndex, true,
2238 false)) {
2239 hadError = true;
2240 continue;
2241 }
2242
2243 if (elementIndex.getBitWidth() > maxElements.getBitWidth())
2244 maxElements = maxElements.extend(elementIndex.getBitWidth());
2245 else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
2246 elementIndex = elementIndex.extend(maxElements.getBitWidth());
2247 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2248
2249 // If the array is of incomplete type, keep track of the number of
2250 // elements in the initializer.
2251 if (!maxElementsKnown && elementIndex > maxElements)
2252 maxElements = elementIndex;
2253
2254 continue;
2255 }
2256
2257 // If we know the maximum number of elements, and we've already
2258 // hit it, stop consuming elements in the initializer list.
2259 if (maxElementsKnown && elementIndex == maxElements)
2260 break;
2261
2262 InitializedEntity ElementEntity = InitializedEntity::InitializeElement(
2263 SemaRef.Context, StructuredIndex, Entity);
2264 ElementEntity.setElementIndex(elementIndex.getExtValue());
2265
2266 unsigned EmbedElementIndexBeforeInit = CurEmbedIndex;
2267 // Check this element.
2268 CheckSubElementType(ElementEntity, IList, elementType, Index,
2269 StructuredList, StructuredIndex);
2270 ++elementIndex;
2271 if ((CurEmbed || isa<EmbedExpr>(Init)) && elementType->isScalarType()) {
2272 if (CurEmbed) {
2273 elementIndex =
2274 elementIndex + CurEmbedIndex - EmbedElementIndexBeforeInit - 1;
2275 } else {
2276 auto Embed = cast<EmbedExpr>(Init);
2277 elementIndex = elementIndex + Embed->getDataElementCount() -
2278 EmbedElementIndexBeforeInit - 1;
2279 }
2280 }
2281
2282 // If the array is of incomplete type, keep track of the number of
2283 // elements in the initializer.
2284 if (!maxElementsKnown && elementIndex > maxElements)
2285 maxElements = elementIndex;
2286 }
2287 if (!hadError && DeclType->isIncompleteArrayType() && !VerifyOnly) {
2288 // If this is an incomplete array type, the actual type needs to
2289 // be calculated here.
2290 llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
2291 if (maxElements == Zero && !Entity.isVariableLengthArrayNew()) {
2292 // Sizing an array implicitly to zero is not allowed by ISO C,
2293 // but is supported by GNU.
2294 SemaRef.Diag(IList->getBeginLoc(), diag::ext_typecheck_zero_array_size);
2295 }
2296
2297 DeclType = SemaRef.Context.getConstantArrayType(
2298 elementType, maxElements, nullptr, ArraySizeModifier::Normal, 0);
2299 }
2300 if (!hadError) {
2301 // If there are any members of the array that get value-initialized, check
2302 // that is possible. That happens if we know the bound and don't have
2303 // enough elements, or if we're performing an array new with an unknown
2304 // bound.
2305 if ((maxElementsKnown && elementIndex < maxElements) ||
2306 Entity.isVariableLengthArrayNew())
2307 CheckEmptyInitializable(
2309 IList->getEndLoc());
2310 }
2311}
2312
2313bool InitListChecker::CheckFlexibleArrayInit(const InitializedEntity &Entity,
2314 Expr *InitExpr,
2315 FieldDecl *Field,
2316 bool TopLevelObject) {
2317 // Handle GNU flexible array initializers.
2318 unsigned FlexArrayDiag;
2319 if (isa<InitListExpr>(InitExpr) &&
2320 cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
2321 // Empty flexible array init always allowed as an extension
2322 FlexArrayDiag = diag::ext_flexible_array_init;
2323 } else if (!TopLevelObject) {
2324 // Disallow flexible array init on non-top-level object
2325 FlexArrayDiag = diag::err_flexible_array_init;
2326 } else if (Entity.getKind() != InitializedEntity::EK_Variable) {
2327 // Disallow flexible array init on anything which is not a variable.
2328 FlexArrayDiag = diag::err_flexible_array_init;
2329 } else if (cast<VarDecl>(Entity.getDecl())->hasLocalStorage()) {
2330 // Disallow flexible array init on local variables.
2331 FlexArrayDiag = diag::err_flexible_array_init;
2332 } else {
2333 // Allow other cases.
2334 FlexArrayDiag = diag::ext_flexible_array_init;
2335 }
2336
2337 if (!VerifyOnly) {
2338 SemaRef.Diag(InitExpr->getBeginLoc(), FlexArrayDiag)
2339 << InitExpr->getBeginLoc();
2340 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
2341 << Field;
2342 }
2343
2344 return FlexArrayDiag != diag::ext_flexible_array_init;
2345}
2346
2347static bool isInitializedStructuredList(const InitListExpr *StructuredList) {
2348 return StructuredList && StructuredList->getNumInits() == 1U;
2349}
2350
2351void InitListChecker::CheckStructUnionTypes(
2352 const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType,
2354 bool SubobjectIsDesignatorContext, unsigned &Index,
2355 InitListExpr *StructuredList, unsigned &StructuredIndex,
2356 bool TopLevelObject) {
2357 const RecordDecl *RD = DeclType->getAsRecordDecl();
2358
2359 // If the record is invalid, some of it's members are invalid. To avoid
2360 // confusion, we forgo checking the initializer for the entire record.
2361 if (RD->isInvalidDecl()) {
2362 // Assume it was supposed to consume a single initializer.
2363 ++Index;
2364 hadError = true;
2365 return;
2366 }
2367
2368 if (RD->isUnion() && IList->getNumInits() == 0) {
2369 if (!VerifyOnly)
2370 for (FieldDecl *FD : RD->fields()) {
2371 QualType ET = SemaRef.Context.getBaseElementType(FD->getType());
2372 if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
2373 hadError = true;
2374 return;
2375 }
2376 }
2377
2378 // If there's a default initializer, use it.
2379 if (isa<CXXRecordDecl>(RD) &&
2380 cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
2381 if (!StructuredList)
2382 return;
2383 for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2384 Field != FieldEnd; ++Field) {
2385 if (Field->hasInClassInitializer() ||
2386 (Field->isAnonymousStructOrUnion() &&
2387 Field->getType()
2388 ->castAsCXXRecordDecl()
2389 ->hasInClassInitializer())) {
2390 StructuredList->setInitializedFieldInUnion(*Field);
2391 // FIXME: Actually build a CXXDefaultInitExpr?
2392 return;
2393 }
2394 }
2395 llvm_unreachable("Couldn't find in-class initializer");
2396 }
2397
2398 // Value-initialize the first member of the union that isn't an unnamed
2399 // bitfield.
2400 for (RecordDecl::field_iterator FieldEnd = RD->field_end();
2401 Field != FieldEnd; ++Field) {
2402 if (!Field->isUnnamedBitField()) {
2403 CheckEmptyInitializable(
2404 InitializedEntity::InitializeMember(*Field, &Entity),
2405 IList->getEndLoc());
2406 if (StructuredList)
2407 StructuredList->setInitializedFieldInUnion(*Field);
2408 break;
2409 }
2410 }
2411 return;
2412 }
2413
2414 bool InitializedSomething = false;
2415
2416 // If we have any base classes, they are initialized prior to the fields.
2417 for (auto I = Bases.begin(), E = Bases.end(); I != E; ++I) {
2418 auto &Base = *I;
2419 Expr *Init = Index < IList->getNumInits() ? IList->getInit(Index) : nullptr;
2420
2421 // Designated inits always initialize fields, so if we see one, all
2422 // remaining base classes have no explicit initializer.
2423 if (isa_and_nonnull<DesignatedInitExpr>(Init))
2424 Init = nullptr;
2425
2426 // C++ [over.match.class.deduct]p1.6:
2427 // each non-trailing aggregate element that is a pack expansion is assumed
2428 // to correspond to no elements of the initializer list, and (1.7) a
2429 // trailing aggregate element that is a pack expansion is assumed to
2430 // correspond to all remaining elements of the initializer list (if any).
2431
2432 // C++ [over.match.class.deduct]p1.9:
2433 // ... except that additional parameter packs of the form P_j... are
2434 // inserted into the parameter list in their original aggregate element
2435 // position corresponding to each non-trailing aggregate element of
2436 // type P_j that was skipped because it was a parameter pack, and the
2437 // trailing sequence of parameters corresponding to a trailing
2438 // aggregate element that is a pack expansion (if any) is replaced
2439 // by a single parameter of the form T_n....
2440 if (AggrDeductionCandidateParamTypes && Base.isPackExpansion()) {
2441 AggrDeductionCandidateParamTypes->push_back(
2442 SemaRef.Context.getPackExpansionType(Base.getType(), std::nullopt));
2443
2444 // Trailing pack expansion
2445 if (I + 1 == E && RD->field_empty()) {
2446 if (Index < IList->getNumInits())
2447 Index = IList->getNumInits();
2448 return;
2449 }
2450
2451 continue;
2452 }
2453
2454 SourceLocation InitLoc = Init ? Init->getBeginLoc() : IList->getEndLoc();
2455 InitializedEntity BaseEntity = InitializedEntity::InitializeBase(
2456 SemaRef.Context, &Base, false, &Entity);
2457 if (Init) {
2458 CheckSubElementType(BaseEntity, IList, Base.getType(), Index,
2459 StructuredList, StructuredIndex);
2460 InitializedSomething = true;
2461 } else {
2462 CheckEmptyInitializable(BaseEntity, InitLoc);
2463 }
2464
2465 if (!VerifyOnly)
2466 if (checkDestructorReference(Base.getType(), InitLoc, SemaRef)) {
2467 hadError = true;
2468 return;
2469 }
2470 }
2471
2472 // If structDecl is a forward declaration, this loop won't do
2473 // anything except look at designated initializers; That's okay,
2474 // because an error should get printed out elsewhere. It might be
2475 // worthwhile to skip over the rest of the initializer, though.
2476 RecordDecl::field_iterator FieldEnd = RD->field_end();
2477 size_t NumRecordDecls = llvm::count_if(RD->decls(), [&](const Decl *D) {
2478 return isa<FieldDecl>(D) || isa<RecordDecl>(D);
2479 });
2480 bool HasDesignatedInit = false;
2481
2482 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
2483
2484 while (Index < IList->getNumInits()) {
2485 Expr *Init = IList->getInit(Index);
2486 SourceLocation InitLoc = Init->getBeginLoc();
2487
2488 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(Init)) {
2489 // If we're not the subobject that matches up with the '{' for
2490 // the designator, we shouldn't be handling the
2491 // designator. Return immediately.
2492 if (!SubobjectIsDesignatorContext)
2493 return;
2494
2495 HasDesignatedInit = true;
2496
2497 // Handle this designated initializer. Field will be updated to
2498 // the next field that we'll be initializing.
2499 bool DesignatedInitFailed = CheckDesignatedInitializer(
2500 Entity, IList, DIE, 0, DeclType, &Field, nullptr, Index,
2501 StructuredList, StructuredIndex, true, TopLevelObject);
2502 if (DesignatedInitFailed)
2503 hadError = true;
2504
2505 // Find the field named by the designated initializer.
2506 DesignatedInitExpr::Designator *D = DIE->getDesignator(0);
2507 if (!VerifyOnly && D->isFieldDesignator()) {
2508 FieldDecl *F = D->getFieldDecl();
2509 InitializedFields.insert(F);
2510 if (!DesignatedInitFailed) {
2511 QualType ET = SemaRef.Context.getBaseElementType(F->getType());
2512 if (checkDestructorReference(ET, InitLoc, SemaRef)) {
2513 hadError = true;
2514 return;
2515 }
2516 }
2517 }
2518
2519 InitializedSomething = true;
2520 continue;
2521 }
2522
2523 // Check if this is an initializer of forms:
2524 //
2525 // struct foo f = {};
2526 // struct foo g = {0};
2527 //
2528 // These are okay for randomized structures. [C99 6.7.8p19]
2529 //
2530 // Also, if there is only one element in the structure, we allow something
2531 // like this, because it's really not randomized in the traditional sense.
2532 //
2533 // struct foo h = {bar};
2534 auto IsZeroInitializer = [&](const Expr *I) {
2535 if (IList->getNumInits() == 1) {
2536 if (NumRecordDecls == 1)
2537 return true;
2538 if (const auto *IL = dyn_cast<IntegerLiteral>(I))
2539 return IL->getValue().isZero();
2540 }
2541 return false;
2542 };
2543
2544 // Don't allow non-designated initializers on randomized structures.
2545 if (RD->isRandomized() && !IsZeroInitializer(Init)) {
2546 if (!VerifyOnly)
2547 SemaRef.Diag(InitLoc, diag::err_non_designated_init_used);
2548 hadError = true;
2549 break;
2550 }
2551
2552 if (Field == FieldEnd) {
2553 // We've run out of fields. We're done.
2554 break;
2555 }
2556
2557 // We've already initialized a member of a union. We can stop entirely.
2558 if (InitializedSomething && RD->isUnion())
2559 return;
2560
2561 // Stop if we've hit a flexible array member.
2562 if (Field->getType()->isIncompleteArrayType())
2563 break;
2564
2565 if (Field->isUnnamedBitField()) {
2566 // Don't initialize unnamed bitfields, e.g. "int : 20;"
2567 ++Field;
2568 continue;
2569 }
2570
2571 // Make sure we can use this declaration.
2572 bool InvalidUse;
2573 if (VerifyOnly)
2574 InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
2575 else
2576 InvalidUse = SemaRef.DiagnoseUseOfDecl(
2577 *Field, IList->getInit(Index)->getBeginLoc());
2578 if (InvalidUse) {
2579 ++Index;
2580 ++Field;
2581 hadError = true;
2582 continue;
2583 }
2584
2585 if (!VerifyOnly) {
2586 QualType ET = SemaRef.Context.getBaseElementType(Field->getType());
2587 if (checkDestructorReference(ET, InitLoc, SemaRef)) {
2588 hadError = true;
2589 return;
2590 }
2591 }
2592
2593 InitializedEntity MemberEntity =
2594 InitializedEntity::InitializeMember(*Field, &Entity);
2595 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2596 StructuredList, StructuredIndex);
2597 InitializedSomething = true;
2598 InitializedFields.insert(*Field);
2599 if (RD->isUnion() && isInitializedStructuredList(StructuredList)) {
2600 // Initialize the first field within the union.
2601 StructuredList->setInitializedFieldInUnion(*Field);
2602 }
2603
2604 ++Field;
2605 }
2606
2607 // Emit warnings for missing struct field initializers.
2608 // This check is disabled for designated initializers in C.
2609 // This matches gcc behaviour.
2610 bool IsCDesignatedInitializer =
2611 HasDesignatedInit && !SemaRef.getLangOpts().CPlusPlus;
2612 if (!VerifyOnly && InitializedSomething && !RD->isUnion() &&
2613 !IList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) &&
2614 !IsCDesignatedInitializer) {
2615 // It is possible we have one or more unnamed bitfields remaining.
2616 // Find first (if any) named field and emit warning.
2617 for (RecordDecl::field_iterator it = HasDesignatedInit ? RD->field_begin()
2618 : Field,
2619 end = RD->field_end();
2620 it != end; ++it) {
2621 if (HasDesignatedInit && InitializedFields.count(*it))
2622 continue;
2623
2624 if (!it->isUnnamedBitField() && !it->hasInClassInitializer() &&
2625 !it->getType()->isIncompleteArrayType()) {
2626 auto Diag = HasDesignatedInit
2627 ? diag::warn_missing_designated_field_initializers
2628 : diag::warn_missing_field_initializers;
2629 SemaRef.Diag(IList->getSourceRange().getEnd(), Diag) << *it;
2630 break;
2631 }
2632 }
2633 }
2634
2635 // Check that any remaining fields can be value-initialized if we're not
2636 // building a structured list. (If we are, we'll check this later.)
2637 if (!StructuredList && Field != FieldEnd && !RD->isUnion() &&
2638 !Field->getType()->isIncompleteArrayType()) {
2639 for (; Field != FieldEnd && !hadError; ++Field) {
2640 if (!Field->isUnnamedBitField() && !Field->hasInClassInitializer())
2641 CheckEmptyInitializable(
2642 InitializedEntity::InitializeMember(*Field, &Entity),
2643 IList->getEndLoc());
2644 }
2645 }
2646
2647 // Check that the types of the remaining fields have accessible destructors.
2648 if (!VerifyOnly) {
2649 // If the initializer expression has a designated initializer, check the
2650 // elements for which a designated initializer is not provided too.
2651 RecordDecl::field_iterator I = HasDesignatedInit ? RD->field_begin()
2652 : Field;
2653 for (RecordDecl::field_iterator E = RD->field_end(); I != E; ++I) {
2654 QualType ET = SemaRef.Context.getBaseElementType(I->getType());
2655 if (checkDestructorReference(ET, IList->getEndLoc(), SemaRef)) {
2656 hadError = true;
2657 return;
2658 }
2659 }
2660 }
2661
2662 if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() ||
2663 Index >= IList->getNumInits())
2664 return;
2665
2666 if (CheckFlexibleArrayInit(Entity, IList->getInit(Index), *Field,
2667 TopLevelObject)) {
2668 hadError = true;
2669 ++Index;
2670 return;
2671 }
2672
2673 InitializedEntity MemberEntity =
2674 InitializedEntity::InitializeMember(*Field, &Entity);
2675
2676 if (isa<InitListExpr>(IList->getInit(Index)) ||
2677 AggrDeductionCandidateParamTypes)
2678 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
2679 StructuredList, StructuredIndex);
2680 else
2681 CheckImplicitInitList(MemberEntity, IList, Field->getType(), Index,
2682 StructuredList, StructuredIndex);
2683
2684 if (RD->isUnion() && isInitializedStructuredList(StructuredList)) {
2685 // Initialize the first field within the union.
2686 StructuredList->setInitializedFieldInUnion(*Field);
2687 }
2688}
2689
2690/// Expand a field designator that refers to a member of an
2691/// anonymous struct or union into a series of field designators that
2692/// refers to the field within the appropriate subobject.
2693///
2695 DesignatedInitExpr *DIE,
2696 unsigned DesigIdx,
2697 IndirectFieldDecl *IndirectField) {
2699
2700 // Build the replacement designators.
2701 SmallVector<Designator, 4> Replacements;
2702 for (IndirectFieldDecl::chain_iterator PI = IndirectField->chain_begin(),
2703 PE = IndirectField->chain_end(); PI != PE; ++PI) {
2704 if (PI + 1 == PE)
2705 Replacements.push_back(Designator::CreateFieldDesignator(
2706 (IdentifierInfo *)nullptr, DIE->getDesignator(DesigIdx)->getDotLoc(),
2707 DIE->getDesignator(DesigIdx)->getFieldLoc()));
2708 else
2709 Replacements.push_back(Designator::CreateFieldDesignator(
2710 (IdentifierInfo *)nullptr, SourceLocation(), SourceLocation()));
2711 assert(isa<FieldDecl>(*PI));
2712 Replacements.back().setFieldDecl(cast<FieldDecl>(*PI));
2713 }
2714
2715 // Expand the current designator into the set of replacement
2716 // designators, so we have a full subobject path down to where the
2717 // member of the anonymous struct/union is actually stored.
2718 DIE->ExpandDesignator(SemaRef.Context, DesigIdx, &Replacements[0],
2719 &Replacements[0] + Replacements.size());
2720}
2721
2723 DesignatedInitExpr *DIE) {
2724 unsigned NumIndexExprs = DIE->getNumSubExprs() - 1;
2725 SmallVector<Expr*, 4> IndexExprs(NumIndexExprs);
2726 for (unsigned I = 0; I < NumIndexExprs; ++I)
2727 IndexExprs[I] = DIE->getSubExpr(I + 1);
2728 return DesignatedInitExpr::Create(SemaRef.Context, DIE->designators(),
2729 IndexExprs,
2730 DIE->getEqualOrColonLoc(),
2731 DIE->usesGNUSyntax(), DIE->getInit());
2732}
2733
2734namespace {
2735
2736// Callback to only accept typo corrections that are for field members of
2737// the given struct or union.
2738class FieldInitializerValidatorCCC final : public CorrectionCandidateCallback {
2739 public:
2740 explicit FieldInitializerValidatorCCC(const RecordDecl *RD)
2741 : Record(RD) {}
2742
2743 bool ValidateCandidate(const TypoCorrection &candidate) override {
2744 FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>();
2745 return FD && FD->getDeclContext()->getRedeclContext()->Equals(Record);
2746 }
2747
2748 std::unique_ptr<CorrectionCandidateCallback> clone() override {
2749 return std::make_unique<FieldInitializerValidatorCCC>(*this);
2750 }
2751
2752 private:
2753 const RecordDecl *Record;
2754};
2755
2756} // end anonymous namespace
2757
2758/// Check the well-formedness of a C99 designated initializer.
2759///
2760/// Determines whether the designated initializer @p DIE, which
2761/// resides at the given @p Index within the initializer list @p
2762/// IList, is well-formed for a current object of type @p DeclType
2763/// (C99 6.7.8). The actual subobject that this designator refers to
2764/// within the current subobject is returned in either
2765/// @p NextField or @p NextElementIndex (whichever is appropriate).
2766///
2767/// @param IList The initializer list in which this designated
2768/// initializer occurs.
2769///
2770/// @param DIE The designated initializer expression.
2771///
2772/// @param DesigIdx The index of the current designator.
2773///
2774/// @param CurrentObjectType The type of the "current object" (C99 6.7.8p17),
2775/// into which the designation in @p DIE should refer.
2776///
2777/// @param NextField If non-NULL and the first designator in @p DIE is
2778/// a field, this will be set to the field declaration corresponding
2779/// to the field named by the designator. On input, this is expected to be
2780/// the next field that would be initialized in the absence of designation,
2781/// if the complete object being initialized is a struct.
2782///
2783/// @param NextElementIndex If non-NULL and the first designator in @p
2784/// DIE is an array designator or GNU array-range designator, this
2785/// will be set to the last index initialized by this designator.
2786///
2787/// @param Index Index into @p IList where the designated initializer
2788/// @p DIE occurs.
2789///
2790/// @param StructuredList The initializer list expression that
2791/// describes all of the subobject initializers in the order they'll
2792/// actually be initialized.
2793///
2794/// @returns true if there was an error, false otherwise.
2795bool
2796InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
2797 InitListExpr *IList,
2798 DesignatedInitExpr *DIE,
2799 unsigned DesigIdx,
2800 QualType &CurrentObjectType,
2801 RecordDecl::field_iterator *NextField,
2802 llvm::APSInt *NextElementIndex,
2803 unsigned &Index,
2804 InitListExpr *StructuredList,
2805 unsigned &StructuredIndex,
2806 bool FinishSubobjectInit,
2807 bool TopLevelObject) {
2808 if (DesigIdx == DIE->size()) {
2809 // C++20 designated initialization can result in direct-list-initialization
2810 // of the designated subobject. This is the only way that we can end up
2811 // performing direct initialization as part of aggregate initialization, so
2812 // it needs special handling.
2813 if (DIE->isDirectInit()) {
2814 Expr *Init = DIE->getInit();
2815 assert(isa<InitListExpr>(Init) &&
2816 "designator result in direct non-list initialization?");
2817 InitializationKind Kind = InitializationKind::CreateDirectList(
2818 DIE->getBeginLoc(), Init->getBeginLoc(), Init->getEndLoc());
2819 InitializationSequence Seq(SemaRef, Entity, Kind, Init,
2820 /*TopLevelOfInitList*/ true);
2821 if (StructuredList) {
2822 ExprResult Result = VerifyOnly
2823 ? getDummyInit()
2824 : Seq.Perform(SemaRef, Entity, Kind, Init);
2825 UpdateStructuredListElement(StructuredList, StructuredIndex,
2826 Result.get());
2827 }
2828 ++Index;
2829 if (AggrDeductionCandidateParamTypes)
2830 AggrDeductionCandidateParamTypes->push_back(CurrentObjectType);
2831 return !Seq;
2832 }
2833
2834 // Check the actual initialization for the designated object type.
2835 bool prevHadError = hadError;
2836
2837 // Temporarily remove the designator expression from the
2838 // initializer list that the child calls see, so that we don't try
2839 // to re-process the designator.
2840 unsigned OldIndex = Index;
2841 auto *OldDIE =
2842 dyn_cast_if_present<DesignatedInitExpr>(IList->getInit(OldIndex));
2843 if (!OldDIE)
2844 OldDIE = DIE;
2845 IList->setInit(OldIndex, OldDIE->getInit());
2846
2847 CheckSubElementType(Entity, IList, CurrentObjectType, Index, StructuredList,
2848 StructuredIndex, /*DirectlyDesignated=*/true);
2849
2850 // Restore the designated initializer expression in the syntactic
2851 // form of the initializer list.
2852 if (IList->getInit(OldIndex) != OldDIE->getInit())
2853 OldDIE->setInit(IList->getInit(OldIndex));
2854 IList->setInit(OldIndex, OldDIE);
2855
2856 return hadError && !prevHadError;
2857 }
2858
2859 DesignatedInitExpr::Designator *D = DIE->getDesignator(DesigIdx);
2860 bool IsFirstDesignator = (DesigIdx == 0);
2861 if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
2862 // Determine the structural initializer list that corresponds to the
2863 // current subobject.
2864 if (IsFirstDesignator)
2865 StructuredList = FullyStructuredList;
2866 else {
2867 Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2868 StructuredList->getInit(StructuredIndex) : nullptr;
2869 if (!ExistingInit && StructuredList->hasArrayFiller())
2870 ExistingInit = StructuredList->getArrayFiller();
2871
2872 if (!ExistingInit)
2873 StructuredList = getStructuredSubobjectInit(
2874 IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
2875 SourceRange(D->getBeginLoc(), DIE->getEndLoc()));
2876 else if (InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2877 StructuredList = Result;
2878 else {
2879 // We are creating an initializer list that initializes the
2880 // subobjects of the current object, but there was already an
2881 // initialization that completely initialized the current
2882 // subobject, e.g., by a compound literal:
2883 //
2884 // struct X { int a, b; };
2885 // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
2886 //
2887 // Here, xs[0].a == 1 and xs[0].b == 3, since the second,
2888 // designated initializer re-initializes only its current object
2889 // subobject [0].b.
2890 diagnoseInitOverride(ExistingInit,
2891 SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
2892 /*UnionOverride=*/false,
2893 /*FullyOverwritten=*/false);
2894
2895 if (!VerifyOnly) {
2896 if (DesignatedInitUpdateExpr *E =
2897 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2898 StructuredList = E->getUpdater();
2899 else {
2900 DesignatedInitUpdateExpr *DIUE = new (SemaRef.Context)
2901 DesignatedInitUpdateExpr(SemaRef.Context, D->getBeginLoc(),
2902 ExistingInit, DIE->getEndLoc());
2903 StructuredList->updateInit(SemaRef.Context, StructuredIndex, DIUE);
2904 StructuredList = DIUE->getUpdater();
2905 }
2906 } else {
2907 // We don't need to track the structured representation of a
2908 // designated init update of an already-fully-initialized object in
2909 // verify-only mode. The only reason we would need the structure is
2910 // to determine where the uninitialized "holes" are, and in this
2911 // case, we know there aren't any and we can't introduce any.
2912 StructuredList = nullptr;
2913 }
2914 }
2915 }
2916 }
2917
2918 if (D->isFieldDesignator()) {
2919 // C99 6.7.8p7:
2920 //
2921 // If a designator has the form
2922 //
2923 // . identifier
2924 //
2925 // then the current object (defined below) shall have
2926 // structure or union type and the identifier shall be the
2927 // name of a member of that type.
2928 RecordDecl *RD = CurrentObjectType->getAsRecordDecl();
2929 if (!RD) {
2930 SourceLocation Loc = D->getDotLoc();
2931 if (Loc.isInvalid())
2932 Loc = D->getFieldLoc();
2933 if (!VerifyOnly)
2934 SemaRef.Diag(Loc, diag::err_field_designator_non_aggr)
2935 << SemaRef.getLangOpts().CPlusPlus << CurrentObjectType;
2936 ++Index;
2937 return true;
2938 }
2939
2940 FieldDecl *KnownField = D->getFieldDecl();
2941 if (!KnownField) {
2942 const IdentifierInfo *FieldName = D->getFieldName();
2943 ValueDecl *VD = SemaRef.tryLookupUnambiguousFieldDecl(RD, FieldName);
2944 if (auto *FD = dyn_cast_if_present<FieldDecl>(VD)) {
2945 KnownField = FD;
2946 } else if (auto *IFD = dyn_cast_if_present<IndirectFieldDecl>(VD)) {
2947 // In verify mode, don't modify the original.
2948 if (VerifyOnly)
2949 DIE = CloneDesignatedInitExpr(SemaRef, DIE);
2950 ExpandAnonymousFieldDesignator(SemaRef, DIE, DesigIdx, IFD);
2951 D = DIE->getDesignator(DesigIdx);
2952 KnownField = cast<FieldDecl>(*IFD->chain_begin());
2953 }
2954 if (!KnownField) {
2955 if (VerifyOnly) {
2956 ++Index;
2957 return true; // No typo correction when just trying this out.
2958 }
2959
2960 // We found a placeholder variable
2961 if (SemaRef.DiagRedefinedPlaceholderFieldDecl(DIE->getBeginLoc(), RD,
2962 FieldName)) {
2963 ++Index;
2964 return true;
2965 }
2966 // Name lookup found something, but it wasn't a field.
2967 if (DeclContextLookupResult Lookup = RD->lookup(FieldName);
2968 !Lookup.empty()) {
2969 SemaRef.Diag(D->getFieldLoc(), diag::err_field_designator_nonfield)
2970 << FieldName;
2971 SemaRef.Diag(Lookup.front()->getLocation(),
2972 diag::note_field_designator_found);
2973 ++Index;
2974 return true;
2975 }
2976
2977 // Name lookup didn't find anything.
2978 // Determine whether this was a typo for another field name.
2979 FieldInitializerValidatorCCC CCC(RD);
2980 if (TypoCorrection Corrected = SemaRef.CorrectTypo(
2981 DeclarationNameInfo(FieldName, D->getFieldLoc()),
2982 Sema::LookupMemberName, /*Scope=*/nullptr, /*SS=*/nullptr, CCC,
2983 CorrectTypoKind::ErrorRecovery, RD)) {
2984 SemaRef.diagnoseTypo(
2985 Corrected,
2986 SemaRef.PDiag(diag::err_field_designator_unknown_suggest)
2987 << FieldName << CurrentObjectType);
2988 KnownField = Corrected.getCorrectionDeclAs<FieldDecl>();
2989 hadError = true;
2990 } else {
2991 // Typo correction didn't find anything.
2992 SourceLocation Loc = D->getFieldLoc();
2993
2994 // The loc can be invalid with a "null" designator (i.e. an anonymous
2995 // union/struct). Do our best to approximate the location.
2996 if (Loc.isInvalid())
2997 Loc = IList->getBeginLoc();
2998
2999 SemaRef.Diag(Loc, diag::err_field_designator_unknown)
3000 << FieldName << CurrentObjectType << DIE->getSourceRange();
3001 ++Index;
3002 return true;
3003 }
3004 }
3005 }
3006
3007 unsigned NumBases = 0;
3008 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3009 NumBases = CXXRD->getNumBases();
3010
3011 unsigned FieldIndex = NumBases;
3012
3013 for (auto *FI : RD->fields()) {
3014 if (FI->isUnnamedBitField())
3015 continue;
3016 if (declaresSameEntity(KnownField, FI)) {
3017 KnownField = FI;
3018 break;
3019 }
3020 ++FieldIndex;
3021 }
3022
3024 RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
3025
3026 // All of the fields of a union are located at the same place in
3027 // the initializer list.
3028 if (RD->isUnion()) {
3029 FieldIndex = 0;
3030 if (StructuredList) {
3031 FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
3032 if (CurrentField && !declaresSameEntity(CurrentField, *Field)) {
3033 assert(StructuredList->getNumInits() == 1
3034 && "A union should never have more than one initializer!");
3035
3036 Expr *ExistingInit = StructuredList->getInit(0);
3037 if (ExistingInit) {
3038 // We're about to throw away an initializer, emit warning.
3039 diagnoseInitOverride(
3040 ExistingInit, SourceRange(D->getBeginLoc(), DIE->getEndLoc()),
3041 /*UnionOverride=*/true,
3042 /*FullyOverwritten=*/SemaRef.getLangOpts().CPlusPlus ? false
3043 : true);
3044 }
3045
3046 // remove existing initializer
3047 StructuredList->resizeInits(SemaRef.Context, 0);
3048 StructuredList->setInitializedFieldInUnion(nullptr);
3049 }
3050
3051 StructuredList->setInitializedFieldInUnion(*Field);
3052 }
3053 }
3054
3055 // Make sure we can use this declaration.
3056 bool InvalidUse;
3057 if (VerifyOnly)
3058 InvalidUse = !SemaRef.CanUseDecl(*Field, TreatUnavailableAsInvalid);
3059 else
3060 InvalidUse = SemaRef.DiagnoseUseOfDecl(*Field, D->getFieldLoc());
3061 if (InvalidUse) {
3062 ++Index;
3063 return true;
3064 }
3065
3066 // C++20 [dcl.init.list]p3:
3067 // The ordered identifiers in the designators of the designated-
3068 // initializer-list shall form a subsequence of the ordered identifiers
3069 // in the direct non-static data members of T.
3070 //
3071 // Note that this is not a condition on forming the aggregate
3072 // initialization, only on actually performing initialization,
3073 // so it is not checked in VerifyOnly mode.
3074 //
3075 // FIXME: This is the only reordering diagnostic we produce, and it only
3076 // catches cases where we have a top-level field designator that jumps
3077 // backwards. This is the only such case that is reachable in an
3078 // otherwise-valid C++20 program, so is the only case that's required for
3079 // conformance, but for consistency, we should diagnose all the other
3080 // cases where a designator takes us backwards too.
3081 if (IsFirstDesignator && !VerifyOnly && SemaRef.getLangOpts().CPlusPlus &&
3082 NextField &&
3083 (*NextField == RD->field_end() ||
3084 (*NextField)->getFieldIndex() > Field->getFieldIndex() + 1)) {
3085 // Find the field that we just initialized.
3086 FieldDecl *PrevField = nullptr;
3087 for (auto FI = RD->field_begin(); FI != RD->field_end(); ++FI) {
3088 if (FI->isUnnamedBitField())
3089 continue;
3090 if (*NextField != RD->field_end() &&
3091 declaresSameEntity(*FI, **NextField))
3092 break;
3093 PrevField = *FI;
3094 }
3095
3096 const auto GenerateDesignatedInitReorderingFixit =
3097 [&](SemaBase::SemaDiagnosticBuilder &Diag) {
3098 struct ReorderInfo {
3099 int Pos{};
3100 const Expr *InitExpr{};
3101 };
3102
3103 llvm::SmallDenseMap<IdentifierInfo *, int> MemberNameInx{};
3104 llvm::SmallVector<ReorderInfo, 16> ReorderedInitExprs{};
3105
3106 const auto *CxxRecord =
3108
3109 for (const FieldDecl *Field : CxxRecord->fields())
3110 MemberNameInx[Field->getIdentifier()] = Field->getFieldIndex();
3111
3112 for (const Expr *Init : IList->inits()) {
3113 if (const auto *DI =
3114 dyn_cast_if_present<DesignatedInitExpr>(Init)) {
3115 // We expect only one Designator
3116 if (DI->size() != 1)
3117 return;
3118
3119 const IdentifierInfo *const FieldName =
3120 DI->getDesignator(0)->getFieldName();
3121 // In case we have an unknown initializer in the source, not in
3122 // the record
3123 if (MemberNameInx.contains(FieldName))
3124 ReorderedInitExprs.emplace_back(
3125 ReorderInfo{MemberNameInx.at(FieldName), Init});
3126 }
3127 }
3128
3129 llvm::sort(ReorderedInitExprs,
3130 [](const ReorderInfo &A, const ReorderInfo &B) {
3131 return A.Pos < B.Pos;
3132 });
3133
3134 llvm::SmallString<128> FixedInitList{};
3135 SourceManager &SM = SemaRef.getSourceManager();
3136 const LangOptions &LangOpts = SemaRef.getLangOpts();
3137
3138 // In a derived Record, first n base-classes are initialized first.
3139 // They do not use designated init, so skip them
3140 const ArrayRef<clang::Expr *> IListInits =
3141 IList->inits().drop_front(CxxRecord->getNumBases());
3142 // loop over each existing expressions and apply replacement
3143 for (const auto &[OrigExpr, Repl] :
3144 llvm::zip(IListInits, ReorderedInitExprs)) {
3145 CharSourceRange CharRange = CharSourceRange::getTokenRange(
3146 Repl.InitExpr->getSourceRange());
3147 const StringRef InitText =
3148 Lexer::getSourceText(CharRange, SM, LangOpts);
3149
3150 Diag << FixItHint::CreateReplacement(OrigExpr->getSourceRange(),
3151 InitText.str());
3152 }
3153 };
3154
3155 if (PrevField &&
3156 PrevField->getFieldIndex() > KnownField->getFieldIndex()) {
3157 SemaRef.Diag(DIE->getInit()->getBeginLoc(),
3158 diag::ext_designated_init_reordered)
3159 << KnownField << PrevField << DIE->getSourceRange();
3160
3161 unsigned OldIndex = StructuredIndex - 1;
3162 if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
3163 if (Expr *PrevInit = StructuredList->getInit(OldIndex)) {
3164 auto Diag = SemaRef.Diag(PrevInit->getBeginLoc(),
3165 diag::note_previous_field_init)
3166 << PrevField << PrevInit->getSourceRange();
3167 GenerateDesignatedInitReorderingFixit(Diag);
3168 }
3169 }
3170 }
3171 }
3172
3173
3174 // Update the designator with the field declaration.
3175 if (!VerifyOnly)
3176 D->setFieldDecl(*Field);
3177
3178 // Make sure that our non-designated initializer list has space
3179 // for a subobject corresponding to this field.
3180 if (StructuredList && FieldIndex >= StructuredList->getNumInits())
3181 StructuredList->resizeInits(SemaRef.Context, FieldIndex + 1);
3182
3183 // This designator names a flexible array member.
3184 if (Field->getType()->isIncompleteArrayType()) {
3185 bool Invalid = false;
3186 if ((DesigIdx + 1) != DIE->size()) {
3187 // We can't designate an object within the flexible array
3188 // member (because GCC doesn't allow it).
3189 if (!VerifyOnly) {
3190 DesignatedInitExpr::Designator *NextD
3191 = DIE->getDesignator(DesigIdx + 1);
3192 SemaRef.Diag(NextD->getBeginLoc(),
3193 diag::err_designator_into_flexible_array_member)
3194 << SourceRange(NextD->getBeginLoc(), DIE->getEndLoc());
3195 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
3196 << *Field;
3197 }
3198 Invalid = true;
3199 }
3200
3201 if (!hadError && !isa<InitListExpr>(DIE->getInit()) &&
3202 !isa<StringLiteral>(DIE->getInit())) {
3203 // The initializer is not an initializer list.
3204 if (!VerifyOnly) {
3205 SemaRef.Diag(DIE->getInit()->getBeginLoc(),
3206 diag::err_flexible_array_init_needs_braces)
3207 << DIE->getInit()->getSourceRange();
3208 SemaRef.Diag(Field->getLocation(), diag::note_flexible_array_member)
3209 << *Field;
3210 }
3211 Invalid = true;
3212 }
3213
3214 // Check GNU flexible array initializer.
3215 if (!Invalid && CheckFlexibleArrayInit(Entity, DIE->getInit(), *Field,
3216 TopLevelObject))
3217 Invalid = true;
3218
3219 if (Invalid) {
3220 ++Index;
3221 return true;
3222 }
3223
3224 // Initialize the array.
3225 bool prevHadError = hadError;
3226 unsigned newStructuredIndex = FieldIndex;
3227 unsigned OldIndex = Index;
3228 IList->setInit(Index, DIE->getInit());
3229
3230 InitializedEntity MemberEntity =
3231 InitializedEntity::InitializeMember(*Field, &Entity);
3232 CheckSubElementType(MemberEntity, IList, Field->getType(), Index,
3233 StructuredList, newStructuredIndex);
3234
3235 IList->setInit(OldIndex, DIE);
3236 if (hadError && !prevHadError) {
3237 ++Field;
3238 ++FieldIndex;
3239 if (NextField)
3240 *NextField = Field;
3241 StructuredIndex = FieldIndex;
3242 return true;
3243 }
3244 } else {
3245 // Recurse to check later designated subobjects.
3246 QualType FieldType = Field->getType();
3247 unsigned newStructuredIndex = FieldIndex;
3248
3249 InitializedEntity MemberEntity =
3250 InitializedEntity::InitializeMember(*Field, &Entity);
3251 if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
3252 FieldType, nullptr, nullptr, Index,
3253 StructuredList, newStructuredIndex,
3254 FinishSubobjectInit, false))
3255 return true;
3256 }
3257
3258 // Find the position of the next field to be initialized in this
3259 // subobject.
3260 ++Field;
3261 ++FieldIndex;
3262
3263 // If this the first designator, our caller will continue checking
3264 // the rest of this struct/class/union subobject.
3265 if (IsFirstDesignator) {
3266 if (Field != RD->field_end() && Field->isUnnamedBitField())
3267 ++Field;
3268
3269 if (NextField)
3270 *NextField = Field;
3271
3272 StructuredIndex = FieldIndex;
3273 return false;
3274 }
3275
3276 if (!FinishSubobjectInit)
3277 return false;
3278
3279 // We've already initialized something in the union; we're done.
3280 if (RD->isUnion())
3281 return hadError;
3282
3283 // Check the remaining fields within this class/struct/union subobject.
3284 bool prevHadError = hadError;
3285
3286 auto NoBases =
3289 CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
3290 false, Index, StructuredList, FieldIndex);
3291 return hadError && !prevHadError;
3292 }
3293
3294 // C99 6.7.8p6:
3295 //
3296 // If a designator has the form
3297 //
3298 // [ constant-expression ]
3299 //
3300 // then the current object (defined below) shall have array
3301 // type and the expression shall be an integer constant
3302 // expression. If the array is of unknown size, any
3303 // nonnegative value is valid.
3304 //
3305 // Additionally, cope with the GNU extension that permits
3306 // designators of the form
3307 //
3308 // [ constant-expression ... constant-expression ]
3309 const ArrayType *AT = SemaRef.Context.getAsArrayType(CurrentObjectType);
3310 if (!AT) {
3311 if (!VerifyOnly)
3312 SemaRef.Diag(D->getLBracketLoc(), diag::err_array_designator_non_array)
3313 << CurrentObjectType;
3314 ++Index;
3315 return true;
3316 }
3317
3318 Expr *IndexExpr = nullptr;
3319 llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
3320 if (D->isArrayDesignator()) {
3321 IndexExpr = DIE->getArrayIndex(*D);
3322 DesignatedStartIndex = IndexExpr->EvaluateKnownConstInt(SemaRef.Context);
3323 DesignatedEndIndex = DesignatedStartIndex;
3324 } else {
3325 assert(D->isArrayRangeDesignator() && "Need array-range designator");
3326
3327 DesignatedStartIndex =
3329 DesignatedEndIndex =
3331 IndexExpr = DIE->getArrayRangeEnd(*D);
3332
3333 // Codegen can't handle evaluating array range designators that have side
3334 // effects, because we replicate the AST value for each initialized element.
3335 // As such, set the sawArrayRangeDesignator() bit if we initialize multiple
3336 // elements with something that has a side effect, so codegen can emit an
3337 // "error unsupported" error instead of miscompiling the app.
3338 if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
3339 DIE->getInit()->HasSideEffects(SemaRef.Context) && !VerifyOnly)
3340 FullyStructuredList->sawArrayRangeDesignator();
3341 }
3342
3343 if (isa<ConstantArrayType>(AT)) {
3344 llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false);
3345 DesignatedStartIndex
3346 = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
3347 DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
3348 DesignatedEndIndex
3349 = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
3350 DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
3351 if (DesignatedEndIndex >= MaxElements) {
3352 if (!VerifyOnly)
3353 SemaRef.Diag(IndexExpr->getBeginLoc(),
3354 diag::err_array_designator_too_large)
3355 << toString(DesignatedEndIndex, 10) << toString(MaxElements, 10)
3356 << IndexExpr->getSourceRange();
3357 ++Index;
3358 return true;
3359 }
3360 } else {
3361 unsigned DesignatedIndexBitWidth =
3363 DesignatedStartIndex =
3364 DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
3365 DesignatedEndIndex =
3366 DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
3367 DesignatedStartIndex.setIsUnsigned(true);
3368 DesignatedEndIndex.setIsUnsigned(true);
3369 }
3370
3371 bool IsStringLiteralInitUpdate =
3372 StructuredList && StructuredList->isStringLiteralInit();
3373 if (IsStringLiteralInitUpdate && VerifyOnly) {
3374 // We're just verifying an update to a string literal init. We don't need
3375 // to split the string up into individual characters to do that.
3376 StructuredList = nullptr;
3377 } else if (IsStringLiteralInitUpdate) {
3378 // We're modifying a string literal init; we have to decompose the string
3379 // so we can modify the individual characters.
3380 ASTContext &Context = SemaRef.Context;
3381 Expr *SubExpr = StructuredList->getInit(0)->IgnoreParenImpCasts();
3382
3383 // Compute the character type
3384 QualType CharTy = AT->getElementType();
3385
3386 // Compute the type of the integer literals.
3387 QualType PromotedCharTy = CharTy;
3388 if (Context.isPromotableIntegerType(CharTy))
3389 PromotedCharTy = Context.getPromotedIntegerType(CharTy);
3390 unsigned PromotedCharTyWidth = Context.getTypeSize(PromotedCharTy);
3391
3392 if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) {
3393 // Get the length of the string.
3394 uint64_t StrLen = SL->getLength();
3395 if (const auto *CAT = dyn_cast<ConstantArrayType>(AT);
3396 CAT && CAT->getSize().ult(StrLen))
3397 StrLen = CAT->getZExtSize();
3398 StructuredList->resizeInits(Context, StrLen);
3399
3400 // Build a literal for each character in the string, and put them into
3401 // the init list.
3402 for (unsigned i = 0, e = StrLen; i != e; ++i) {
3403 llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
3404 Expr *Init = new (Context) IntegerLiteral(
3405 Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
3406 if (CharTy != PromotedCharTy)
3407 Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
3408 Init, nullptr, VK_PRValue,
3409 FPOptionsOverride());
3410 StructuredList->updateInit(Context, i, Init);
3411 }
3412 } else {
3413 ObjCEncodeExpr *E = cast<ObjCEncodeExpr>(SubExpr);
3414 std::string Str;
3415 Context.getObjCEncodingForType(E->getEncodedType(), Str);
3416
3417 // Get the length of the string.
3418 uint64_t StrLen = Str.size();
3419 if (const auto *CAT = dyn_cast<ConstantArrayType>(AT);
3420 CAT && CAT->getSize().ult(StrLen))
3421 StrLen = CAT->getZExtSize();
3422 StructuredList->resizeInits(Context, StrLen);
3423
3424 // Build a literal for each character in the string, and put them into
3425 // the init list.
3426 for (unsigned i = 0, e = StrLen; i != e; ++i) {
3427 llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
3428 Expr *Init = new (Context) IntegerLiteral(
3429 Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc());
3430 if (CharTy != PromotedCharTy)
3431 Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast,
3432 Init, nullptr, VK_PRValue,
3433 FPOptionsOverride());
3434 StructuredList->updateInit(Context, i, Init);
3435 }
3436 }
3437 }
3438
3439 // Make sure that our non-designated initializer list has space
3440 // for a subobject corresponding to this array element.
3441 if (StructuredList &&
3442 DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
3443 StructuredList->resizeInits(SemaRef.Context,
3444 DesignatedEndIndex.getZExtValue() + 1);
3445
3446 // Repeatedly perform subobject initializations in the range
3447 // [DesignatedStartIndex, DesignatedEndIndex].
3448
3449 // Move to the next designator
3450 unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
3451 unsigned OldIndex = Index;
3452
3453 InitializedEntity ElementEntity =
3455
3456 while (DesignatedStartIndex <= DesignatedEndIndex) {
3457 // Recurse to check later designated subobjects.
3458 QualType ElementType = AT->getElementType();
3459 Index = OldIndex;
3460
3461 ElementEntity.setElementIndex(ElementIndex);
3462 if (CheckDesignatedInitializer(
3463 ElementEntity, IList, DIE, DesigIdx + 1, ElementType, nullptr,
3464 nullptr, Index, StructuredList, ElementIndex,
3465 FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
3466 false))
3467 return true;
3468
3469 // Move to the next index in the array that we'll be initializing.
3470 ++DesignatedStartIndex;
3471 ElementIndex = DesignatedStartIndex.getZExtValue();
3472 }
3473
3474 // If this the first designator, our caller will continue checking
3475 // the rest of this array subobject.
3476 if (IsFirstDesignator) {
3477 if (NextElementIndex)
3478 *NextElementIndex = std::move(DesignatedStartIndex);
3479 StructuredIndex = ElementIndex;
3480 return false;
3481 }
3482
3483 if (!FinishSubobjectInit)
3484 return false;
3485
3486 // Check the remaining elements within this array subobject.
3487 bool prevHadError = hadError;
3488 CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
3489 /*SubobjectIsDesignatorContext=*/false, Index,
3490 StructuredList, ElementIndex);
3491 return hadError && !prevHadError;
3492}
3493
3494// Get the structured initializer list for a subobject of type
3495// @p CurrentObjectType.
3496InitListExpr *
3497InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index,
3498 QualType CurrentObjectType,
3499 InitListExpr *StructuredList,
3500 unsigned StructuredIndex,
3501 SourceRange InitRange,
3502 bool IsFullyOverwritten) {
3503 if (!StructuredList)
3504 return nullptr;
3505
3506 Expr *ExistingInit = nullptr;
3507 if (StructuredIndex < StructuredList->getNumInits())
3508 ExistingInit = StructuredList->getInit(StructuredIndex);
3509
3510 if (InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
3511 // There might have already been initializers for subobjects of the current
3512 // object, but a subsequent initializer list will overwrite the entirety
3513 // of the current object. (See DR 253 and C99 6.7.8p21). e.g.,
3514 //
3515 // struct P { char x[6]; };
3516 // struct P l = { .x[2] = 'x', .x = { [0] = 'f' } };
3517 //
3518 // The first designated initializer is ignored, and l.x is just "f".
3519 if (!IsFullyOverwritten)
3520 return Result;
3521
3522 if (ExistingInit) {
3523 // We are creating an initializer list that initializes the
3524 // subobjects of the current object, but there was already an
3525 // initialization that completely initialized the current
3526 // subobject:
3527 //
3528 // struct X { int a, b; };
3529 // struct X xs[] = { [0] = { 1, 2 }, [0].b = 3 };
3530 //
3531 // Here, xs[0].a == 1 and xs[0].b == 3, since the second,
3532 // designated initializer overwrites the [0].b initializer
3533 // from the prior initialization.
3534 //
3535 // When the existing initializer is an expression rather than an
3536 // initializer list, we cannot decompose and update it in this way.
3537 // For example:
3538 //
3539 // struct X xs[] = { [0] = (struct X) { 1, 2 }, [0].b = 3 };
3540 //
3541 // This case is handled by CheckDesignatedInitializer.
3542 diagnoseInitOverride(ExistingInit, InitRange);
3543 }
3544
3545 unsigned ExpectedNumInits = 0;
3546 if (Index < IList->getNumInits()) {
3547 if (auto *Init = dyn_cast_or_null<InitListExpr>(IList->getInit(Index)))
3548 ExpectedNumInits = Init->getNumInits();
3549 else
3550 ExpectedNumInits = IList->getNumInits() - Index;
3551 }
3552
3553 InitListExpr *Result =
3554 createInitListExpr(CurrentObjectType, InitRange, ExpectedNumInits);
3555
3556 // Link this new initializer list into the structured initializer
3557 // lists.
3558 StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result);
3559 return Result;
3560}
3561
3562InitListExpr *
3563InitListChecker::createInitListExpr(QualType CurrentObjectType,
3564 SourceRange InitRange,
3565 unsigned ExpectedNumInits) {
3566 InitListExpr *Result = new (SemaRef.Context) InitListExpr(
3567 SemaRef.Context, InitRange.getBegin(), {}, InitRange.getEnd());
3568
3569 QualType ResultType = CurrentObjectType;
3570 if (!ResultType->isArrayType())
3571 ResultType = ResultType.getNonLValueExprType(SemaRef.Context);
3572 Result->setType(ResultType);
3573
3574 // Pre-allocate storage for the structured initializer list.
3575 unsigned NumElements = 0;
3576
3577 if (const ArrayType *AType
3578 = SemaRef.Context.getAsArrayType(CurrentObjectType)) {
3579 if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) {
3580 NumElements = CAType->getZExtSize();
3581 // Simple heuristic so that we don't allocate a very large
3582 // initializer with many empty entries at the end.
3583 if (NumElements > ExpectedNumInits)
3584 NumElements = 0;
3585 }
3586 } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) {
3587 NumElements = VType->getNumElements();
3588 } else if (CurrentObjectType->isRecordType()) {
3589 NumElements = numStructUnionElements(CurrentObjectType);
3590 } else if (CurrentObjectType->isDependentType()) {
3591 NumElements = 1;
3592 }
3593
3594 Result->reserveInits(SemaRef.Context, NumElements);
3595
3596 return Result;
3597}
3598
3599/// Update the initializer at index @p StructuredIndex within the
3600/// structured initializer list to the value @p expr.
3601void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
3602 unsigned &StructuredIndex,
3603 Expr *expr) {
3604 // No structured initializer list to update
3605 if (!StructuredList)
3606 return;
3607
3608 if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
3609 StructuredIndex, expr)) {
3610 // This initializer overwrites a previous initializer.
3611 // No need to diagnose when `expr` is nullptr because a more relevant
3612 // diagnostic has already been issued and this diagnostic is potentially
3613 // noise.
3614 if (expr)
3615 diagnoseInitOverride(PrevInit, expr->getSourceRange());
3616 }
3617
3618 ++StructuredIndex;
3619}
3620
3622 const InitializedEntity &Entity, InitListExpr *From) {
3623 QualType Type = Entity.getType();
3624 InitListChecker Check(*this, Entity, From, Type, /*VerifyOnly=*/true,
3625 /*TreatUnavailableAsInvalid=*/false,
3626 /*InOverloadResolution=*/true);
3627 return !Check.HadError();
3628}
3629
3630/// Check that the given Index expression is a valid array designator
3631/// value. This is essentially just a wrapper around
3632/// VerifyIntegerConstantExpression that also checks for negative values
3633/// and produces a reasonable diagnostic if there is a
3634/// failure. Returns the index expression, possibly with an implicit cast
3635/// added, on success. If everything went okay, Value will receive the
3636/// value of the constant expression.
3637static ExprResult
3638CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value) {
3639 SourceLocation Loc = Index->getBeginLoc();
3640
3641 // Make sure this is an integer constant expression.
3642 ExprResult Result =
3644 if (Result.isInvalid())
3645 return Result;
3646
3647 if (Value.isSigned() && Value.isNegative())
3648 return S.Diag(Loc, diag::err_array_designator_negative)
3649 << toString(Value, 10) << Index->getSourceRange();
3650
3651 Value.setIsUnsigned(true);
3652 return Result;
3653}
3654
3656 SourceLocation EqualOrColonLoc,
3657 bool GNUSyntax,
3658 ExprResult Init) {
3659 typedef DesignatedInitExpr::Designator ASTDesignator;
3660
3661 bool Invalid = false;
3663 SmallVector<Expr *, 32> InitExpressions;
3664
3665 // Build designators and check array designator expressions.
3666 for (unsigned Idx = 0; Idx < Desig.getNumDesignators(); ++Idx) {
3667 const Designator &D = Desig.getDesignator(Idx);
3668
3669 if (D.isFieldDesignator()) {
3670 Designators.push_back(ASTDesignator::CreateFieldDesignator(
3671 D.getFieldDecl(), D.getDotLoc(), D.getFieldLoc()));
3672 } else if (D.isArrayDesignator()) {
3673 Expr *Index = D.getArrayIndex();
3674 llvm::APSInt IndexValue;
3675 if (!Index->isTypeDependent() && !Index->isValueDependent())
3676 Index = CheckArrayDesignatorExpr(*this, Index, IndexValue).get();
3677 if (!Index)
3678 Invalid = true;
3679 else {
3680 Designators.push_back(ASTDesignator::CreateArrayDesignator(
3681 InitExpressions.size(), D.getLBracketLoc(), D.getRBracketLoc()));
3682 InitExpressions.push_back(Index);
3683 }
3684 } else if (D.isArrayRangeDesignator()) {
3685 Expr *StartIndex = D.getArrayRangeStart();
3686 Expr *EndIndex = D.getArrayRangeEnd();
3687 llvm::APSInt StartValue;
3688 llvm::APSInt EndValue;
3689 bool StartDependent = StartIndex->isTypeDependent() ||
3690 StartIndex->isValueDependent();
3691 bool EndDependent = EndIndex->isTypeDependent() ||
3692 EndIndex->isValueDependent();
3693 if (!StartDependent)
3694 StartIndex =
3695 CheckArrayDesignatorExpr(*this, StartIndex, StartValue).get();
3696 if (!EndDependent)
3697 EndIndex = CheckArrayDesignatorExpr(*this, EndIndex, EndValue).get();
3698
3699 if (!StartIndex || !EndIndex)
3700 Invalid = true;
3701 else {
3702 // Make sure we're comparing values with the same bit width.
3703 if (StartDependent || EndDependent) {
3704 // Nothing to compute.
3705 } else if (StartValue.getBitWidth() > EndValue.getBitWidth())
3706 EndValue = EndValue.extend(StartValue.getBitWidth());
3707 else if (StartValue.getBitWidth() < EndValue.getBitWidth())
3708 StartValue = StartValue.extend(EndValue.getBitWidth());
3709
3710 if (!StartDependent && !EndDependent && EndValue < StartValue) {
3711 Diag(D.getEllipsisLoc(), diag::err_array_designator_empty_range)
3712 << toString(StartValue, 10) << toString(EndValue, 10)
3713 << StartIndex->getSourceRange() << EndIndex->getSourceRange();
3714 Invalid = true;
3715 } else {
3716 Designators.push_back(ASTDesignator::CreateArrayRangeDesignator(
3717 InitExpressions.size(), D.getLBracketLoc(), D.getEllipsisLoc(),
3718 D.getRBracketLoc()));
3719 InitExpressions.push_back(StartIndex);
3720 InitExpressions.push_back(EndIndex);
3721 }
3722 }
3723 }
3724 }
3725
3726 if (Invalid || Init.isInvalid())
3727 return ExprError();
3728
3729 return DesignatedInitExpr::Create(Context, Designators, InitExpressions,
3730 EqualOrColonLoc, GNUSyntax,
3731 Init.getAs<Expr>());
3732}
3733
3734//===----------------------------------------------------------------------===//
3735// Initialization entity
3736//===----------------------------------------------------------------------===//
3737
3738InitializedEntity::InitializedEntity(ASTContext &Context, unsigned Index,
3739 const InitializedEntity &Parent)
3740 : Parent(&Parent), Index(Index)
3741{
3742 if (const ArrayType *AT = Context.getAsArrayType(Parent.getType())) {
3743 Kind = EK_ArrayElement;
3744 Type = AT->getElementType();
3745 } else if (const VectorType *VT = Parent.getType()->getAs<VectorType>()) {
3746 Kind = EK_VectorElement;
3747 Type = VT->getElementType();
3748 } else if (const MatrixType *MT = Parent.getType()->getAs<MatrixType>()) {
3749 Kind = EK_MatrixElement;
3750 Type = MT->getElementType();
3751 } else {
3752 const ComplexType *CT = Parent.getType()->getAs<ComplexType>();
3753 assert(CT && "Unexpected type");
3754 Kind = EK_ComplexElement;
3755 Type = CT->getElementType();
3756 }
3757}
3758
3761 const CXXBaseSpecifier *Base,
3762 bool IsInheritedVirtualBase,
3763 const InitializedEntity *Parent) {
3764 InitializedEntity Result;
3765 Result.Kind = EK_Base;
3766 Result.Parent = Parent;
3767 Result.Base = {Base, IsInheritedVirtualBase};
3768 Result.Type = Base->getType();
3769 return Result;
3770}
3771
3773 switch (getKind()) {
3774 case EK_Parameter:
3776 ParmVarDecl *D = Parameter.getPointer();
3777 return (D ? D->getDeclName() : DeclarationName());
3778 }
3779
3780 case EK_Variable:
3781 case EK_Member:
3783 case EK_Binding:
3785 return Variable.VariableOrMember->getDeclName();
3786
3787 case EK_LambdaCapture:
3788 return DeclarationName(Capture.VarID);
3789
3790 case EK_Result:
3791 case EK_StmtExprResult:
3792 case EK_Exception:
3793 case EK_New:
3794 case EK_Temporary:
3795 case EK_Base:
3796 case EK_Delegating:
3797 case EK_ArrayElement:
3798 case EK_VectorElement:
3799 case EK_MatrixElement:
3800 case EK_ComplexElement:
3801 case EK_BlockElement:
3804 case EK_RelatedResult:
3805 return DeclarationName();
3806 }
3807
3808 llvm_unreachable("Invalid EntityKind!");
3809}
3810
3812 switch (getKind()) {
3813 case EK_Variable:
3814 case EK_Member:
3816 case EK_Binding:
3818 return cast<ValueDecl>(Variable.VariableOrMember);
3819
3820 case EK_Parameter:
3822 return Parameter.getPointer();
3823
3824 case EK_Result:
3825 case EK_StmtExprResult:
3826 case EK_Exception:
3827 case EK_New:
3828 case EK_Temporary:
3829 case EK_Base:
3830 case EK_Delegating:
3831 case EK_ArrayElement:
3832 case EK_VectorElement:
3833 case EK_MatrixElement:
3834 case EK_ComplexElement:
3835 case EK_BlockElement:
3837 case EK_LambdaCapture:
3839 case EK_RelatedResult:
3840 return nullptr;
3841 }
3842
3843 llvm_unreachable("Invalid EntityKind!");
3844}
3845
3847 switch (getKind()) {
3848 case EK_Result:
3849 case EK_Exception:
3850 return LocAndNRVO.NRVO;
3851
3852 case EK_StmtExprResult:
3853 case EK_Variable:
3854 case EK_Parameter:
3857 case EK_Member:
3859 case EK_Binding:
3860 case EK_New:
3861 case EK_Temporary:
3863 case EK_Base:
3864 case EK_Delegating:
3865 case EK_ArrayElement:
3866 case EK_VectorElement:
3867 case EK_MatrixElement:
3868 case EK_ComplexElement:
3869 case EK_BlockElement:
3871 case EK_LambdaCapture:
3872 case EK_RelatedResult:
3873 break;
3874 }
3875
3876 return false;
3877}
3878
3879unsigned InitializedEntity::dumpImpl(raw_ostream &OS) const {
3880 assert(getParent() != this);
3881 unsigned Depth = getParent() ? getParent()->dumpImpl(OS) : 0;
3882 for (unsigned I = 0; I != Depth; ++I)
3883 OS << "`-";
3884
3885 switch (getKind()) {
3886 case EK_Variable: OS << "Variable"; break;
3887 case EK_Parameter: OS << "Parameter"; break;
3888 case EK_Parameter_CF_Audited: OS << "CF audited function Parameter";
3889 break;
3890 case EK_TemplateParameter: OS << "TemplateParameter"; break;
3891 case EK_Result: OS << "Result"; break;
3892 case EK_StmtExprResult: OS << "StmtExprResult"; break;
3893 case EK_Exception: OS << "Exception"; break;
3894 case EK_Member:
3896 OS << "Member";
3897 break;
3898 case EK_Binding: OS << "Binding"; break;
3899 case EK_New: OS << "New"; break;
3900 case EK_Temporary: OS << "Temporary"; break;
3901 case EK_CompoundLiteralInit: OS << "CompoundLiteral";break;
3902 case EK_RelatedResult: OS << "RelatedResult"; break;
3903 case EK_Base: OS << "Base"; break;
3904 case EK_Delegating: OS << "Delegating"; break;
3905 case EK_ArrayElement: OS << "ArrayElement " << Index; break;
3906 case EK_VectorElement: OS << "VectorElement " << Index; break;
3907 case EK_MatrixElement:
3908 OS << "MatrixElement " << Index;
3909 break;
3910 case EK_ComplexElement: OS << "ComplexElement " << Index; break;
3911 case EK_BlockElement: OS << "Block"; break;
3913 OS << "Block (lambda)";
3914 break;
3915 case EK_LambdaCapture:
3916 OS << "LambdaCapture ";
3917 OS << DeclarationName(Capture.VarID);
3918 break;
3919 }
3920
3921 if (auto *D = getDecl()) {
3922 OS << " ";
3923 D->printQualifiedName(OS);
3924 }
3925
3926 OS << " '" << getType() << "'\n";
3927
3928 return Depth + 1;
3929}
3930
3931LLVM_DUMP_METHOD void InitializedEntity::dump() const {
3932 dumpImpl(llvm::errs());
3933}
3934
3935//===----------------------------------------------------------------------===//
3936// Initialization sequence
3937//===----------------------------------------------------------------------===//
3938
3984
3986 // There can be some lvalue adjustments after the SK_BindReference step.
3987 for (const Step &S : llvm::reverse(Steps)) {
3988 if (S.Kind == SK_BindReference)
3989 return true;
3990 if (S.Kind == SK_BindReferenceToTemporary)
3991 return false;
3992 }
3993 return false;
3994}
3995
3997 if (!Failed())
3998 return false;
3999
4000 switch (getFailureKind()) {
4011 case FK_AddressOfOverloadFailed: // FIXME: Could do better
4028 case FK_Incomplete:
4033 case FK_PlaceholderType:
4039 return false;
4040
4045 return FailedOverloadResult == OR_Ambiguous;
4046 }
4047
4048 llvm_unreachable("Invalid EntityKind!");
4049}
4050
4052 return !Steps.empty() && Steps.back().Kind == SK_ConstructorInitialization;
4053}
4054
4055void
4056InitializationSequence
4057::AddAddressOverloadResolutionStep(FunctionDecl *Function,
4059 bool HadMultipleCandidates) {
4060 Step S;
4062 S.Type = Function->getType();
4063 S.Function.HadMultipleCandidates = HadMultipleCandidates;
4066 Steps.push_back(S);
4067}
4068
4070 ExprValueKind VK) {
4071 Step S;
4072 switch (VK) {
4073 case VK_PRValue:
4075 break;
4076 case VK_XValue: S.Kind = SK_CastDerivedToBaseXValue; break;
4077 case VK_LValue: S.Kind = SK_CastDerivedToBaseLValue; break;
4078 }
4079 S.Type = BaseType;
4080 Steps.push_back(S);
4081}
4082
4084 bool BindingTemporary) {
4085 Step S;
4086 S.Kind = BindingTemporary? SK_BindReferenceToTemporary : SK_BindReference;
4087 S.Type = T;
4088 Steps.push_back(S);
4089}
4090
4092 Step S;
4093 S.Kind = SK_FinalCopy;
4094 S.Type = T;
4095 Steps.push_back(S);
4096}
4097
4099 Step S;
4101 S.Type = T;
4102 Steps.push_back(S);
4103}
4104
4105void
4107 DeclAccessPair FoundDecl,
4108 QualType T,
4109 bool HadMultipleCandidates) {
4110 Step S;
4112 S.Type = T;
4113 S.Function.HadMultipleCandidates = HadMultipleCandidates;
4115 S.Function.FoundDecl = FoundDecl;
4116 Steps.push_back(S);
4117}
4118
4120 ExprValueKind VK) {
4121 Step S;
4122 S.Kind = SK_QualificationConversionPRValue; // work around a gcc warning
4123 switch (VK) {
4124 case VK_PRValue:
4126 break;
4127 case VK_XValue:
4129 break;
4130 case VK_LValue:
4132 break;
4133 }
4134 S.Type = Ty;
4135 Steps.push_back(S);
4136}
4137
4139 Step S;
4141 S.Type = Ty;
4142 Steps.push_back(S);
4143}
4144
4146 Step S;
4148 S.Type = Ty;
4149 Steps.push_back(S);
4150}
4151
4154 bool TopLevelOfInitList) {
4155 Step S;
4156 S.Kind = TopLevelOfInitList ? SK_ConversionSequenceNoNarrowing
4158 S.Type = T;
4159 S.ICS = new ImplicitConversionSequence(ICS);
4160 Steps.push_back(S);
4161}
4162
4164 Step S;
4166 S.Type = T;
4167 Steps.push_back(S);
4168}
4169
4172 bool HadMultipleCandidates, bool FromInitList, bool AsInitList) {
4173 Step S;
4174 S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall
4177 S.Type = T;
4178 S.Function.HadMultipleCandidates = HadMultipleCandidates;
4180 S.Function.FoundDecl = FoundDecl;
4181 Steps.push_back(S);
4182}
4183
4185 Step S;
4187 S.Type = T;
4188 Steps.push_back(S);
4189}
4190
4192 Step S;
4193 S.Kind = SK_CAssignment;
4194 S.Type = T;
4195 Steps.push_back(S);
4196}
4197
4199 Step S;
4200 S.Kind = SK_StringInit;
4201 S.Type = T;
4202 Steps.push_back(S);
4203}
4204
4206 Step S;
4208 S.Type = T;
4209 Steps.push_back(S);
4210}
4211
4213 Step S;
4214 S.Kind = IsGNUExtension ? SK_GNUArrayInit : SK_ArrayInit;
4215 S.Type = T;
4216 Steps.push_back(S);
4217}
4218
4220 Step S;
4222 S.Type = EltT;
4223 Steps.insert(Steps.begin(), S);
4224
4226 S.Type = T;
4227 Steps.push_back(S);
4228}
4229
4231 Step S;
4233 S.Type = T;
4234 Steps.push_back(S);
4235}
4236
4238 bool shouldCopy) {
4239 Step s;
4240 s.Kind = (shouldCopy ? SK_PassByIndirectCopyRestore
4242 s.Type = type;
4243 Steps.push_back(s);
4244}
4245
4247 Step S;
4249 S.Type = T;
4250 Steps.push_back(S);
4251}
4252
4254 Step S;
4256 S.Type = T;
4257 Steps.push_back(S);
4258}
4259
4261 Step S;
4263 S.Type = T;
4264 Steps.push_back(S);
4265}
4266
4268 Step S;
4270 S.Type = T;
4271 Steps.push_back(S);
4272}
4273
4275 Step S;
4277 S.Type = T;
4278 Steps.push_back(S);
4279}
4280
4282 InitListExpr *Syntactic) {
4283 assert(Syntactic->getNumInits() == 1 &&
4284 "Can only unwrap trivial init lists.");
4285 Step S;
4287 S.Type = Syntactic->getInit(0)->getType();
4288 Steps.insert(Steps.begin(), S);
4289}
4290
4292 InitListExpr *Syntactic) {
4293 assert(Syntactic->getNumInits() == 1 &&
4294 "Can only rewrap trivial init lists.");
4295 Step S;
4297 S.Type = Syntactic->getInit(0)->getType();
4298 Steps.insert(Steps.begin(), S);
4299
4301 S.Type = T;
4302 S.WrappingSyntacticList = Syntactic;
4303 Steps.push_back(S);
4304}
4305
4309 this->Failure = Failure;
4310 this->FailedOverloadResult = Result;
4311}
4312
4313//===----------------------------------------------------------------------===//
4314// Attempt initialization
4315//===----------------------------------------------------------------------===//
4316
4317/// Tries to add a zero initializer. Returns true if that worked.
4318static bool
4320 const InitializedEntity &Entity) {
4322 return false;
4323
4324 VarDecl *VD = cast<VarDecl>(Entity.getDecl());
4325 if (VD->getInit() || VD->getEndLoc().isMacroID())
4326 return false;
4327
4328 QualType VariableTy = VD->getType().getCanonicalType();
4330 std::string Init = S.getFixItZeroInitializerForType(VariableTy, Loc);
4331 if (!Init.empty()) {
4332 Sequence.AddZeroInitializationStep(Entity.getType());
4333 Sequence.SetZeroInitializationFixit(Init, Loc);
4334 return true;
4335 }
4336 return false;
4337}
4338
4340 InitializationSequence &Sequence,
4341 const InitializedEntity &Entity) {
4342 if (!S.getLangOpts().ObjCAutoRefCount) return;
4343
4344 /// When initializing a parameter, produce the value if it's marked
4345 /// __attribute__((ns_consumed)).
4346 if (Entity.isParameterKind()) {
4347 if (!Entity.isParameterConsumed())
4348 return;
4349
4350 assert(Entity.getType()->isObjCRetainableType() &&
4351 "consuming an object of unretainable type?");
4352 Sequence.AddProduceObjCObjectStep(Entity.getType());
4353
4354 /// When initializing a return value, if the return type is a
4355 /// retainable type, then returns need to immediately retain the
4356 /// object. If an autorelease is required, it will be done at the
4357 /// last instant.
4358 } else if (Entity.getKind() == InitializedEntity::EK_Result ||
4360 if (!Entity.getType()->isObjCRetainableType())
4361 return;
4362
4363 Sequence.AddProduceObjCObjectStep(Entity.getType());
4364 }
4365}
4366
4367/// Initialize an array from another array
4368static void TryArrayCopy(Sema &S, const InitializationKind &Kind,
4369 const InitializedEntity &Entity, Expr *Initializer,
4370 QualType DestType, InitializationSequence &Sequence,
4371 bool TreatUnavailableAsInvalid) {
4372 // If source is a prvalue, use it directly.
4373 if (Initializer->isPRValue()) {
4374 Sequence.AddArrayInitStep(DestType, /*IsGNUExtension*/ false);
4375 return;
4376 }
4377
4378 // Emit element-at-a-time copy loop.
4379 InitializedEntity Element =
4381 QualType InitEltT =
4383 OpaqueValueExpr OVE(Initializer->getExprLoc(), InitEltT,
4384 Initializer->getValueKind(),
4385 Initializer->getObjectKind());
4386 Expr *OVEAsExpr = &OVE;
4387 Sequence.InitializeFrom(S, Element, Kind, OVEAsExpr,
4388 /*TopLevelOfInitList*/ false,
4389 TreatUnavailableAsInvalid);
4390 if (Sequence)
4391 Sequence.AddArrayInitLoopStep(Entity.getType(), InitEltT);
4392}
4393
4394static void TryListInitialization(Sema &S,
4395 const InitializedEntity &Entity,
4396 const InitializationKind &Kind,
4397 InitListExpr *InitList,
4398 InitializationSequence &Sequence,
4399 bool TreatUnavailableAsInvalid);
4400
4401/// When initializing from init list via constructor, handle
4402/// initialization of an object of type std::initializer_list<T>.
4403///
4404/// \return true if we have handled initialization of an object of type
4405/// std::initializer_list<T>, false otherwise.
4407 InitListExpr *List,
4408 QualType DestType,
4409 InitializationSequence &Sequence,
4410 bool TreatUnavailableAsInvalid) {
4411 QualType E;
4412 if (!S.isStdInitializerList(DestType, &E))
4413 return false;
4414
4415 if (!S.isCompleteType(List->getExprLoc(), E)) {
4416 Sequence.setIncompleteTypeFailure(E);
4417 return true;
4418 }
4419
4420 // Try initializing a temporary array from the init list.
4422 E.withConst(),
4423 llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
4426 InitializedEntity HiddenArray =
4429 List->getExprLoc(), List->getBeginLoc(), List->getEndLoc());
4430 TryListInitialization(S, HiddenArray, Kind, List, Sequence,
4431 TreatUnavailableAsInvalid);
4432 if (Sequence)
4433 Sequence.AddStdInitializerListConstructionStep(DestType);
4434 return true;
4435}
4436
4437/// Determine if the constructor has the signature of a copy or move
4438/// constructor for the type T of the class in which it was found. That is,
4439/// determine if its first parameter is of type T or reference to (possibly
4440/// cv-qualified) T.
4442 const ConstructorInfo &Info) {
4443 if (Info.Constructor->getNumParams() == 0)
4444 return false;
4445
4446 QualType ParmT =
4448 CanQualType ClassT = Ctx.getCanonicalTagType(
4450
4451 return Ctx.hasSameUnqualifiedType(ParmT, ClassT);
4452}
4453
4455 Sema &S, SourceLocation DeclLoc, MultiExprArg Args,
4456 OverloadCandidateSet &CandidateSet, QualType DestType,
4458 bool CopyInitializing, bool AllowExplicit, bool OnlyListConstructors,
4459 bool IsListInit, bool RequireActualConstructor,
4460 bool SecondStepOfCopyInit = false) {
4462 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
4463
4464 for (NamedDecl *D : Ctors) {
4465 auto Info = getConstructorInfo(D);
4466 if (!Info.Constructor || Info.Constructor->isInvalidDecl())
4467 continue;
4468
4469 if (OnlyListConstructors && !S.isInitListConstructor(Info.Constructor))
4470 continue;
4471
4472 // C++11 [over.best.ics]p4:
4473 // ... and the constructor or user-defined conversion function is a
4474 // candidate by
4475 // - 13.3.1.3, when the argument is the temporary in the second step
4476 // of a class copy-initialization, or
4477 // - 13.3.1.4, 13.3.1.5, or 13.3.1.6 (in all cases), [not handled here]
4478 // - the second phase of 13.3.1.7 when the initializer list has exactly
4479 // one element that is itself an initializer list, and the target is
4480 // the first parameter of a constructor of class X, and the conversion
4481 // is to X or reference to (possibly cv-qualified X),
4482 // user-defined conversion sequences are not considered.
4483 bool SuppressUserConversions =
4484 SecondStepOfCopyInit ||
4485 (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
4487
4488 if (Info.ConstructorTmpl)
4490 Info.ConstructorTmpl, Info.FoundDecl,
4491 /*ExplicitArgs*/ nullptr, Args, CandidateSet, SuppressUserConversions,
4492 /*PartialOverloading=*/false, AllowExplicit);
4493 else {
4494 // C++ [over.match.copy]p1:
4495 // - When initializing a temporary to be bound to the first parameter
4496 // of a constructor [for type T] that takes a reference to possibly
4497 // cv-qualified T as its first argument, called with a single
4498 // argument in the context of direct-initialization, explicit
4499 // conversion functions are also considered.
4500 // FIXME: What if a constructor template instantiates to such a signature?
4501 bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
4502 Args.size() == 1 &&
4504 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl, Args,
4505 CandidateSet, SuppressUserConversions,
4506 /*PartialOverloading=*/false, AllowExplicit,
4507 AllowExplicitConv);
4508 }
4509 }
4510
4511 // FIXME: Work around a bug in C++17 guaranteed copy elision.
4512 //
4513 // When initializing an object of class type T by constructor
4514 // ([over.match.ctor]) or by list-initialization ([over.match.list])
4515 // from a single expression of class type U, conversion functions of
4516 // U that convert to the non-reference type cv T are candidates.
4517 // Explicit conversion functions are only candidates during
4518 // direct-initialization.
4519 //
4520 // Note: SecondStepOfCopyInit is only ever true in this case when
4521 // evaluating whether to produce a C++98 compatibility warning.
4522 if (S.getLangOpts().CPlusPlus17 && Args.size() == 1 &&
4523 !RequireActualConstructor && !SecondStepOfCopyInit) {
4524 Expr *Initializer = Args[0];
4525 auto *SourceRD = Initializer->getType()->getAsCXXRecordDecl();
4526 if (SourceRD && S.isCompleteType(DeclLoc, Initializer->getType())) {
4527 const auto &Conversions = SourceRD->getVisibleConversionFunctions();
4528 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4529 NamedDecl *D = *I;
4531 D = D->getUnderlyingDecl();
4532
4533 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
4534 CXXConversionDecl *Conv;
4535 if (ConvTemplate)
4536 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
4537 else
4538 Conv = cast<CXXConversionDecl>(D);
4539
4540 if (ConvTemplate)
4542 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
4543 CandidateSet, AllowExplicit, AllowExplicit,
4544 /*AllowResultConversion*/ false);
4545 else
4546 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
4547 DestType, CandidateSet, AllowExplicit,
4548 AllowExplicit,
4549 /*AllowResultConversion*/ false);
4550 }
4551 }
4552 }
4553
4554 // Perform overload resolution and return the result.
4555 return CandidateSet.BestViableFunction(S, DeclLoc, Best);
4556}
4557
4558/// Attempt initialization by constructor (C++ [dcl.init]), which
4559/// enumerates the constructors of the initialized entity and performs overload
4560/// resolution to select the best.
4561/// \param DestType The destination class type.
4562/// \param DestArrayType The destination type, which is either DestType or
4563/// a (possibly multidimensional) array of DestType.
4564/// \param IsListInit Is this list-initialization?
4565/// \param IsInitListCopy Is this non-list-initialization resulting from a
4566/// list-initialization from {x} where x is the same
4567/// aggregate type as the entity?
4569 const InitializedEntity &Entity,
4570 const InitializationKind &Kind,
4571 MultiExprArg Args, QualType DestType,
4572 QualType DestArrayType,
4573 InitializationSequence &Sequence,
4574 bool IsListInit = false,
4575 bool IsInitListCopy = false) {
4576 assert(((!IsListInit && !IsInitListCopy) ||
4577 (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
4578 "IsListInit/IsInitListCopy must come with a single initializer list "
4579 "argument.");
4580 InitListExpr *ILE =
4581 (IsListInit || IsInitListCopy) ? cast<InitListExpr>(Args[0]) : nullptr;
4582 MultiExprArg UnwrappedArgs =
4583 ILE ? MultiExprArg(ILE->getInits(), ILE->getNumInits()) : Args;
4584
4585 // The type we're constructing needs to be complete.
4586 if (!S.isCompleteType(Kind.getLocation(), DestType)) {
4587 Sequence.setIncompleteTypeFailure(DestType);
4588 return;
4589 }
4590
4591 bool RequireActualConstructor =
4592 !(Entity.getKind() != InitializedEntity::EK_Base &&
4594 Entity.getKind() !=
4596
4597 bool CopyElisionPossible = false;
4598 auto ElideConstructor = [&] {
4599 // Convert qualifications if necessary.
4600 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4601 if (ILE)
4602 Sequence.RewrapReferenceInitList(DestType, ILE);
4603 };
4604
4605 // C++17 [dcl.init]p17:
4606 // - If the initializer expression is a prvalue and the cv-unqualified
4607 // version of the source type is the same class as the class of the
4608 // destination, the initializer expression is used to initialize the
4609 // destination object.
4610 // Per DR (no number yet), this does not apply when initializing a base
4611 // class or delegating to another constructor from a mem-initializer.
4612 // ObjC++: Lambda captured by the block in the lambda to block conversion
4613 // should avoid copy elision.
4614 if (S.getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
4615 UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
4616 S.Context.hasSameUnqualifiedType(UnwrappedArgs[0]->getType(), DestType)) {
4617 if (ILE && !DestType->isAggregateType()) {
4618 // CWG2311: T{ prvalue_of_type_T } is not eligible for copy elision
4619 // Make this an elision if this won't call an initializer-list
4620 // constructor. (Always on an aggregate type or check constructors first.)
4621
4622 // This effectively makes our resolution as follows. The parts in angle
4623 // brackets are additions.
4624 // C++17 [over.match.list]p(1.2):
4625 // - If no viable initializer-list constructor is found <and the
4626 // initializer list does not consist of exactly a single element with
4627 // the same cv-unqualified class type as T>, [...]
4628 // C++17 [dcl.init.list]p(3.6):
4629 // - Otherwise, if T is a class type, constructors are considered. The
4630 // applicable constructors are enumerated and the best one is chosen
4631 // through overload resolution. <If no constructor is found and the
4632 // initializer list consists of exactly a single element with the same
4633 // cv-unqualified class type as T, the object is initialized from that
4634 // element (by copy-initialization for copy-list-initialization, or by
4635 // direct-initialization for direct-list-initialization). Otherwise, >
4636 // if a narrowing conversion [...]
4637 assert(!IsInitListCopy &&
4638 "IsInitListCopy only possible with aggregate types");
4639 CopyElisionPossible = true;
4640 } else {
4641 ElideConstructor();
4642 return;
4643 }
4644 }
4645
4646 auto *DestRecordDecl = DestType->castAsCXXRecordDecl();
4647 // Build the candidate set directly in the initialization sequence
4648 // structure, so that it will persist if we fail.
4649 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
4650
4651 // Determine whether we are allowed to call explicit constructors or
4652 // explicit conversion operators.
4653 bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
4654 bool CopyInitialization = Kind.getKind() == InitializationKind::IK_Copy;
4655
4656 // - Otherwise, if T is a class type, constructors are considered. The
4657 // applicable constructors are enumerated, and the best one is chosen
4658 // through overload resolution.
4659 DeclContext::lookup_result Ctors = S.LookupConstructors(DestRecordDecl);
4660
4663 bool AsInitializerList = false;
4664
4665 // C++11 [over.match.list]p1, per DR1467:
4666 // When objects of non-aggregate type T are list-initialized, such that
4667 // 8.5.4 [dcl.init.list] specifies that overload resolution is performed
4668 // according to the rules in this section, overload resolution selects
4669 // the constructor in two phases:
4670 //
4671 // - Initially, the candidate functions are the initializer-list
4672 // constructors of the class T and the argument list consists of the
4673 // initializer list as a single argument.
4674 if (IsListInit) {
4675 AsInitializerList = true;
4676
4677 // If the initializer list has no elements and T has a default constructor,
4678 // the first phase is omitted.
4679 if (!(UnwrappedArgs.empty() && S.LookupDefaultConstructor(DestRecordDecl)))
4681 S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
4682 CopyInitialization, AllowExplicit,
4683 /*OnlyListConstructors=*/true, IsListInit, RequireActualConstructor);
4684
4685 if (CopyElisionPossible && Result == OR_No_Viable_Function) {
4686 // No initializer list candidate
4687 ElideConstructor();
4688 return;
4689 }
4690 }
4691
4692 // C++11 [over.match.list]p1:
4693 // - If no viable initializer-list constructor is found, overload resolution
4694 // is performed again, where the candidate functions are all the
4695 // constructors of the class T and the argument list consists of the
4696 // elements of the initializer list.
4697 if (Result == OR_No_Viable_Function) {
4698 AsInitializerList = false;
4700 S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4701 Best, CopyInitialization, AllowExplicit,
4702 /*OnlyListConstructors=*/false, IsListInit, RequireActualConstructor);
4703 }
4704 if (Result) {
4705 Sequence.SetOverloadFailure(
4708 Result);
4709
4710 if (Result != OR_Deleted)
4711 return;
4712 }
4713
4714 bool HadMultipleCandidates = (CandidateSet.size() > 1);
4715
4716 // In C++17, ResolveConstructorOverload can select a conversion function
4717 // instead of a constructor.
4718 if (auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4719 // Add the user-defined conversion step that calls the conversion function.
4720 QualType ConvType = CD->getConversionType();
4721 assert(S.Context.hasSameUnqualifiedType(ConvType, DestType) &&
4722 "should not have selected this conversion function");
4723 Sequence.AddUserConversionStep(CD, Best->FoundDecl, ConvType,
4724 HadMultipleCandidates);
4725 if (!S.Context.hasSameType(ConvType, DestType))
4726 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4727 if (IsListInit)
4728 Sequence.RewrapReferenceInitList(Entity.getType(), ILE);
4729 return;
4730 }
4731
4732 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
4733 if (Result != OR_Deleted) {
4734 if (!IsListInit &&
4735 (Kind.getKind() == InitializationKind::IK_Default ||
4736 Kind.getKind() == InitializationKind::IK_Direct) &&
4737 !(CtorDecl->isCopyOrMoveConstructor() && CtorDecl->isImplicit()) &&
4738 DestRecordDecl->isAggregate() &&
4739 DestRecordDecl->hasUninitializedExplicitInitFields() &&
4740 !S.isUnevaluatedContext()) {
4741 S.Diag(Kind.getLocation(), diag::warn_field_requires_explicit_init)
4742 << /* Var-in-Record */ 1 << DestRecordDecl;
4743 emitUninitializedExplicitInitFields(S, DestRecordDecl);
4744 }
4745
4746 // C++11 [dcl.init]p6:
4747 // If a program calls for the default initialization of an object
4748 // of a const-qualified type T, T shall be a class type with a
4749 // user-provided default constructor.
4750 // C++ core issue 253 proposal:
4751 // If the implicit default constructor initializes all subobjects, no
4752 // initializer should be required.
4753 // The 253 proposal is for example needed to process libstdc++ headers
4754 // in 5.x.
4755 if (Kind.getKind() == InitializationKind::IK_Default &&
4756 Entity.getType().isConstQualified()) {
4757 if (!CtorDecl->getParent()->allowConstDefaultInit()) {
4758 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
4760 return;
4761 }
4762 }
4763
4764 // C++11 [over.match.list]p1:
4765 // In copy-list-initialization, if an explicit constructor is chosen, the
4766 // initializer is ill-formed.
4767 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
4769 return;
4770 }
4771 }
4772
4773 // [class.copy.elision]p3:
4774 // In some copy-initialization contexts, a two-stage overload resolution
4775 // is performed.
4776 // If the first overload resolution selects a deleted function, we also
4777 // need the initialization sequence to decide whether to perform the second
4778 // overload resolution.
4779 // For deleted functions in other contexts, there is no need to get the
4780 // initialization sequence.
4781 if (Result == OR_Deleted && Kind.getKind() != InitializationKind::IK_Copy)
4782 return;
4783
4784 // Add the constructor initialization step. Any cv-qualification conversion is
4785 // subsumed by the initialization.
4787 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4788 IsListInit | IsInitListCopy, AsInitializerList);
4789}
4790
4792 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4793 ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly,
4794 ExprResult *Result = nullptr);
4795
4796/// Attempt to initialize an object of a class type either by
4797/// direct-initialization, or by copy-initialization from an
4798/// expression of the same or derived class type. This corresponds
4799/// to the first two sub-bullets of C++2c [dcl.init.general] p16.6.
4800///
4801/// \param IsAggrListInit Is this non-list-initialization being done as
4802/// part of a list-initialization of an aggregate
4803/// from a single expression of the same or
4804/// derived class type (C++2c [dcl.init.list] p3.2)?
4806 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4807 MultiExprArg Args, QualType DestType, InitializationSequence &Sequence,
4808 bool IsAggrListInit) {
4809 // C++2c [dcl.init.general] p16.6:
4810 // * Otherwise, if the destination type is a class type:
4811 // * If the initializer expression is a prvalue and
4812 // the cv-unqualified version of the source type is the same
4813 // as the destination type, the initializer expression is used
4814 // to initialize the destination object.
4815 // * Otherwise, if the initialization is direct-initialization,
4816 // or if it is copy-initialization where the cv-unqualified
4817 // version of the source type is the same as or is derived from
4818 // the class of the destination type, constructors are considered.
4819 // The applicable constructors are enumerated, and the best one
4820 // is chosen through overload resolution. Then:
4821 // * If overload resolution is successful, the selected
4822 // constructor is called to initialize the object, with
4823 // the initializer expression or expression-list as its
4824 // argument(s).
4825 TryConstructorInitialization(S, Entity, Kind, Args, DestType, DestType,
4826 Sequence, /*IsListInit=*/false, IsAggrListInit);
4827
4828 // * Otherwise, if no constructor is viable, the destination type
4829 // is an aggregate class, and the initializer is a parenthesized
4830 // expression-list, the object is initialized as follows. [...]
4831 // Parenthesized initialization of aggregates is a C++20 feature.
4832 if (S.getLangOpts().CPlusPlus20 &&
4833 Kind.getKind() == InitializationKind::IK_Direct && Sequence.Failed() &&
4834 Sequence.getFailureKind() ==
4837 (IsAggrListInit || DestType->isAggregateType()))
4838 TryOrBuildParenListInitialization(S, Entity, Kind, Args, Sequence,
4839 /*VerifyOnly=*/true);
4840
4841 // * Otherwise, the initialization is ill-formed.
4842}
4843
4844static bool
4847 QualType &SourceType,
4848 QualType &UnqualifiedSourceType,
4849 QualType UnqualifiedTargetType,
4850 InitializationSequence &Sequence) {
4851 if (S.Context.getCanonicalType(UnqualifiedSourceType) ==
4852 S.Context.OverloadTy) {
4854 bool HadMultipleCandidates = false;
4855 if (FunctionDecl *Fn
4857 UnqualifiedTargetType,
4858 false, Found,
4859 &HadMultipleCandidates)) {
4861 HadMultipleCandidates);
4862 SourceType = Fn->getType();
4863 UnqualifiedSourceType = SourceType.getUnqualifiedType();
4864 } else if (!UnqualifiedTargetType->isRecordType()) {
4866 return true;
4867 }
4868 }
4869 return false;
4870}
4871
4872static void TryReferenceInitializationCore(Sema &S,
4873 const InitializedEntity &Entity,
4874 const InitializationKind &Kind,
4875 Expr *Initializer,
4876 QualType cv1T1, QualType T1,
4877 Qualifiers T1Quals,
4878 QualType cv2T2, QualType T2,
4879 Qualifiers T2Quals,
4880 InitializationSequence &Sequence,
4881 bool TopLevelOfInitList);
4882
4883static void TryValueInitialization(Sema &S,
4884 const InitializedEntity &Entity,
4885 const InitializationKind &Kind,
4886 InitializationSequence &Sequence,
4887 InitListExpr *InitList = nullptr);
4888
4889/// Attempt list initialization of a reference.
4891 const InitializedEntity &Entity,
4892 const InitializationKind &Kind,
4893 InitListExpr *InitList,
4894 InitializationSequence &Sequence,
4895 bool TreatUnavailableAsInvalid) {
4896 // First, catch C++03 where this isn't possible.
4897 if (!S.getLangOpts().CPlusPlus11) {
4899 return;
4900 }
4901 // Can't reference initialize a compound literal.
4904 return;
4905 }
4906
4907 QualType DestType = Entity.getType();
4908 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
4909 Qualifiers T1Quals;
4910 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
4911
4912 // Reference initialization via an initializer list works thus:
4913 // If the initializer list consists of a single element that is
4914 // reference-related to the referenced type, bind directly to that element
4915 // (possibly creating temporaries).
4916 // Otherwise, initialize a temporary with the initializer list and
4917 // bind to that.
4918 if (InitList->getNumInits() == 1) {
4919 Expr *Initializer = InitList->getInit(0);
4921 Qualifiers T2Quals;
4922 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
4923
4924 // If this fails, creating a temporary wouldn't work either.
4926 T1, Sequence))
4927 return;
4928
4929 SourceLocation DeclLoc = Initializer->getBeginLoc();
4930 Sema::ReferenceCompareResult RefRelationship
4931 = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2);
4932 if (RefRelationship >= Sema::Ref_Related) {
4933 // Try to bind the reference here.
4934 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4935 T1Quals, cv2T2, T2, T2Quals, Sequence,
4936 /*TopLevelOfInitList=*/true);
4937 if (Sequence)
4938 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4939 return;
4940 }
4941
4942 // Update the initializer if we've resolved an overloaded function.
4943 if (!Sequence.steps().empty())
4944 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4945 }
4946 // Perform address space compatibility check.
4947 QualType cv1T1IgnoreAS = cv1T1;
4948 if (T1Quals.hasAddressSpace()) {
4949 Qualifiers T2Quals;
4950 (void)S.Context.getUnqualifiedArrayType(InitList->getType(), T2Quals);
4951 if (!T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext())) {
4952 Sequence.SetFailed(
4954 return;
4955 }
4956 // Ignore address space of reference type at this point and perform address
4957 // space conversion after the reference binding step.
4958 cv1T1IgnoreAS =
4960 }
4961 // Not reference-related. Create a temporary and bind to that.
4962 InitializedEntity TempEntity =
4964
4965 TryListInitialization(S, TempEntity, Kind, InitList, Sequence,
4966 TreatUnavailableAsInvalid);
4967 if (Sequence) {
4968 if (DestType->isRValueReferenceType() ||
4969 (T1Quals.hasConst() && !T1Quals.hasVolatile())) {
4970 if (S.getLangOpts().CPlusPlus20 &&
4972 DestType->isRValueReferenceType()) {
4973 // C++20 [dcl.init.list]p3.10:
4974 // List-initialization of an object or reference of type T is defined as
4975 // follows:
4976 // ..., unless T is “reference to array of unknown bound of U”, in which
4977 // case the type of the prvalue is the type of x in the declaration U
4978 // x[] H, where H is the initializer list.
4980 }
4981 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS,
4982 /*BindingTemporary=*/true);
4983 if (T1Quals.hasAddressSpace())
4985 cv1T1, DestType->isRValueReferenceType() ? VK_XValue : VK_LValue);
4986 } else
4987 Sequence.SetFailed(
4989 }
4990}
4991
4992/// Attempt list initialization (C++0x [dcl.init.list])
4994 const InitializedEntity &Entity,
4995 const InitializationKind &Kind,
4996 InitListExpr *InitList,
4997 InitializationSequence &Sequence,
4998 bool TreatUnavailableAsInvalid) {
4999 QualType DestType = Entity.getType();
5000
5001 if (S.getLangOpts().HLSL && !S.HLSL().transformInitList(Entity, InitList)) {
5003 return;
5004 }
5005
5006 // C++ doesn't allow scalar initialization with more than one argument.
5007 // But C99 complex numbers are scalars and it makes sense there.
5008 if (S.getLangOpts().CPlusPlus && DestType->isScalarType() &&
5009 !DestType->isAnyComplexType() && InitList->getNumInits() > 1) {
5011 return;
5012 }
5013 if (DestType->isReferenceType()) {
5014 TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence,
5015 TreatUnavailableAsInvalid);
5016 return;
5017 }
5018
5019 if (DestType->isRecordType() &&
5020 !S.isCompleteType(InitList->getBeginLoc(), DestType)) {
5021 Sequence.setIncompleteTypeFailure(DestType);
5022 return;
5023 }
5024
5025 // C++20 [dcl.init.list]p3:
5026 // - If the braced-init-list contains a designated-initializer-list, T shall
5027 // be an aggregate class. [...] Aggregate initialization is performed.
5028 //
5029 // We allow arrays here too in order to support array designators.
5030 //
5031 // FIXME: This check should precede the handling of reference initialization.
5032 // We follow other compilers in allowing things like 'Aggr &&a = {.x = 1};'
5033 // as a tentative DR resolution.
5034 bool IsDesignatedInit = InitList->hasDesignatedInit();
5035 if (!DestType->isAggregateType() && IsDesignatedInit) {
5036 Sequence.SetFailed(
5038 return;
5039 }
5040
5041 // C++11 [dcl.init.list]p3, per DR1467 and DR2137:
5042 // - If T is an aggregate class and the initializer list has a single element
5043 // of type cv U, where U is T or a class derived from T, the object is
5044 // initialized from that element (by copy-initialization for
5045 // copy-list-initialization, or by direct-initialization for
5046 // direct-list-initialization).
5047 // - Otherwise, if T is a character array and the initializer list has a
5048 // single element that is an appropriately-typed string literal
5049 // (8.5.2 [dcl.init.string]), initialization is performed as described
5050 // in that section.
5051 // - Otherwise, if T is an aggregate, [...] (continue below).
5052 if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1 &&
5053 !IsDesignatedInit) {
5054 if (DestType->isRecordType() && DestType->isAggregateType()) {
5055 QualType InitType = InitList->getInit(0)->getType();
5056 if (S.Context.hasSameUnqualifiedType(InitType, DestType) ||
5057 S.IsDerivedFrom(InitList->getBeginLoc(), InitType, DestType)) {
5058 InitializationKind SubKind =
5060 ? InitializationKind::CreateDirect(Kind.getLocation(),
5061 InitList->getLBraceLoc(),
5062 InitList->getRBraceLoc())
5063 : Kind;
5064 Expr *InitListAsExpr = InitList;
5066 S, Entity, SubKind, InitListAsExpr, DestType, Sequence,
5067 /*IsAggrListInit=*/true);
5068 return;
5069 }
5070 }
5071 if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) {
5072 Expr *SubInit[1] = {InitList->getInit(0)};
5073
5074 // C++17 [dcl.struct.bind]p1:
5075 // ... If the assignment-expression in the initializer has array type A
5076 // and no ref-qualifier is present, e has type cv A and each element is
5077 // copy-initialized or direct-initialized from the corresponding element
5078 // of the assignment-expression as specified by the form of the
5079 // initializer. ...
5080 //
5081 // This is a special case not following list-initialization.
5082 if (isa<ConstantArrayType>(DestAT) &&
5084 isa<DecompositionDecl>(Entity.getDecl())) {
5085 assert(
5086 S.Context.hasSameUnqualifiedType(SubInit[0]->getType(), DestType) &&
5087 "Deduced to other type?");
5088 assert(Kind.getKind() == clang::InitializationKind::IK_DirectList &&
5089 "List-initialize structured bindings but not "
5090 "direct-list-initialization?");
5091 TryArrayCopy(S,
5092 InitializationKind::CreateDirect(Kind.getLocation(),
5093 InitList->getLBraceLoc(),
5094 InitList->getRBraceLoc()),
5095 Entity, SubInit[0], DestType, Sequence,
5096 TreatUnavailableAsInvalid);
5097 if (Sequence)
5098 Sequence.AddUnwrapInitListInitStep(InitList);
5099 return;
5100 }
5101
5102 if (!isa<VariableArrayType>(DestAT) &&
5103 IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) {
5104 InitializationKind SubKind =
5106 ? InitializationKind::CreateDirect(Kind.getLocation(),
5107 InitList->getLBraceLoc(),
5108 InitList->getRBraceLoc())
5109 : Kind;
5110 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
5111 /*TopLevelOfInitList*/ true,
5112 TreatUnavailableAsInvalid);
5113
5114 // TryStringLiteralInitialization() (in InitializeFrom()) will fail if
5115 // the element is not an appropriately-typed string literal, in which
5116 // case we should proceed as in C++11 (below).
5117 if (Sequence) {
5118 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
5119 return;
5120 }
5121 }
5122 }
5123 }
5124
5125 // C++11 [dcl.init.list]p3:
5126 // - If T is an aggregate, aggregate initialization is performed.
5127 if ((DestType->isRecordType() && !DestType->isAggregateType()) ||
5128 (S.getLangOpts().CPlusPlus11 &&
5129 S.isStdInitializerList(DestType, nullptr) && !IsDesignatedInit)) {
5130 if (S.getLangOpts().CPlusPlus11) {
5131 // - Otherwise, if the initializer list has no elements and T is a
5132 // class type with a default constructor, the object is
5133 // value-initialized.
5134 if (InitList->getNumInits() == 0) {
5135 CXXRecordDecl *RD = DestType->castAsCXXRecordDecl();
5136 if (S.LookupDefaultConstructor(RD)) {
5137 TryValueInitialization(S, Entity, Kind, Sequence, InitList);
5138 return;
5139 }
5140 }
5141
5142 // - Otherwise, if T is a specialization of std::initializer_list<E>,
5143 // an initializer_list object constructed [...]
5144 if (TryInitializerListConstruction(S, InitList, DestType, Sequence,
5145 TreatUnavailableAsInvalid))
5146 return;
5147
5148 // - Otherwise, if T is a class type, constructors are considered.
5149 Expr *InitListAsExpr = InitList;
5150 TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
5151 DestType, Sequence, /*InitListSyntax*/true);
5152 } else
5154 return;
5155 }
5156
5157 if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() &&
5158 InitList->getNumInits() == 1) {
5159 Expr *E = InitList->getInit(0);
5160
5161 // - Otherwise, if T is an enumeration with a fixed underlying type,
5162 // the initializer-list has a single element v, and the initialization
5163 // is direct-list-initialization, the object is initialized with the
5164 // value T(v); if a narrowing conversion is required to convert v to
5165 // the underlying type of T, the program is ill-formed.
5166 if (S.getLangOpts().CPlusPlus17 &&
5167 Kind.getKind() == InitializationKind::IK_DirectList &&
5168 DestType->isEnumeralType() && DestType->castAsEnumDecl()->isFixed() &&
5169 !S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
5171 E->getType()->isFloatingType())) {
5172 // There are two ways that T(v) can work when T is an enumeration type.
5173 // If there is either an implicit conversion sequence from v to T or
5174 // a conversion function that can convert from v to T, then we use that.
5175 // Otherwise, if v is of integral, unscoped enumeration, or floating-point
5176 // type, it is converted to the enumeration type via its underlying type.
5177 // There is no overlap possible between these two cases (except when the
5178 // source value is already of the destination type), and the first
5179 // case is handled by the general case for single-element lists below.
5181 ICS.setStandard();
5183 if (!E->isPRValue())
5185 // If E is of a floating-point type, then the conversion is ill-formed
5186 // due to narrowing, but go through the motions in order to produce the
5187 // right diagnostic.
5191 ICS.Standard.setFromType(E->getType());
5192 ICS.Standard.setToType(0, E->getType());
5193 ICS.Standard.setToType(1, DestType);
5194 ICS.Standard.setToType(2, DestType);
5195 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2),
5196 /*TopLevelOfInitList*/true);
5197 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
5198 return;
5199 }
5200
5201 // - Otherwise, if the initializer list has a single element of type E
5202 // [...references are handled above...], the object or reference is
5203 // initialized from that element (by copy-initialization for
5204 // copy-list-initialization, or by direct-initialization for
5205 // direct-list-initialization); if a narrowing conversion is required
5206 // to convert the element to T, the program is ill-formed.
5207 //
5208 // Per core-24034, this is direct-initialization if we were performing
5209 // direct-list-initialization and copy-initialization otherwise.
5210 // We can't use InitListChecker for this, because it always performs
5211 // copy-initialization. This only matters if we might use an 'explicit'
5212 // conversion operator, or for the special case conversion of nullptr_t to
5213 // bool, so we only need to handle those cases.
5214 //
5215 // FIXME: Why not do this in all cases?
5216 Expr *Init = InitList->getInit(0);
5217 if (Init->getType()->isRecordType() ||
5218 (Init->getType()->isNullPtrType() && DestType->isBooleanType())) {
5219 InitializationKind SubKind =
5221 ? InitializationKind::CreateDirect(Kind.getLocation(),
5222 InitList->getLBraceLoc(),
5223 InitList->getRBraceLoc())
5224 : Kind;
5225 Expr *SubInit[1] = { Init };
5226 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
5227 /*TopLevelOfInitList*/true,
5228 TreatUnavailableAsInvalid);
5229 if (Sequence)
5230 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
5231 return;
5232 }
5233 }
5234
5235 InitListChecker CheckInitList(S, Entity, InitList,
5236 DestType, /*VerifyOnly=*/true, TreatUnavailableAsInvalid);
5237 if (CheckInitList.HadError()) {
5239 return;
5240 }
5241
5242 // Add the list initialization step with the built init list.
5243 Sequence.AddListInitializationStep(DestType);
5244}
5245
5246/// Try a reference initialization that involves calling a conversion
5247/// function.
5249 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
5250 Expr *Initializer, bool AllowRValues, bool IsLValueRef,
5251 InitializationSequence &Sequence) {
5252 QualType DestType = Entity.getType();
5253 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
5254 QualType T1 = cv1T1.getUnqualifiedType();
5255 QualType cv2T2 = Initializer->getType();
5256 QualType T2 = cv2T2.getUnqualifiedType();
5257
5258 assert(!S.CompareReferenceRelationship(Initializer->getBeginLoc(), T1, T2) &&
5259 "Must have incompatible references when binding via conversion");
5260
5261 // Build the candidate set directly in the initialization sequence
5262 // structure, so that it will persist if we fail.
5263 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
5265
5266 // Determine whether we are allowed to call explicit conversion operators.
5267 // Note that none of [over.match.copy], [over.match.conv], nor
5268 // [over.match.ref] permit an explicit constructor to be chosen when
5269 // initializing a reference, not even for direct-initialization.
5270 bool AllowExplicitCtors = false;
5271 bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
5272
5273 if (AllowRValues && T1->isRecordType() &&
5274 S.isCompleteType(Kind.getLocation(), T1)) {
5275 auto *T1RecordDecl = T1->castAsCXXRecordDecl();
5276 if (T1RecordDecl->isInvalidDecl())
5277 return OR_No_Viable_Function;
5278 // The type we're converting to is a class type. Enumerate its constructors
5279 // to see if there is a suitable conversion.
5280 for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) {
5281 auto Info = getConstructorInfo(D);
5282 if (!Info.Constructor)
5283 continue;
5284
5285 if (!Info.Constructor->isInvalidDecl() &&
5286 Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
5287 if (Info.ConstructorTmpl)
5289 Info.ConstructorTmpl, Info.FoundDecl,
5290 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
5291 /*SuppressUserConversions=*/true,
5292 /*PartialOverloading*/ false, AllowExplicitCtors);
5293 else
5295 Info.Constructor, Info.FoundDecl, Initializer, CandidateSet,
5296 /*SuppressUserConversions=*/true,
5297 /*PartialOverloading*/ false, AllowExplicitCtors);
5298 }
5299 }
5300 }
5301
5302 if (T2->isRecordType() && S.isCompleteType(Kind.getLocation(), T2)) {
5303 const auto *T2RecordDecl = T2->castAsCXXRecordDecl();
5304 if (T2RecordDecl->isInvalidDecl())
5305 return OR_No_Viable_Function;
5306 // The type we're converting from is a class type, enumerate its conversion
5307 // functions.
5308 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5309 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5310 NamedDecl *D = *I;
5312 if (isa<UsingShadowDecl>(D))
5313 D = cast<UsingShadowDecl>(D)->getTargetDecl();
5314
5315 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
5316 CXXConversionDecl *Conv;
5317 if (ConvTemplate)
5318 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
5319 else
5320 Conv = cast<CXXConversionDecl>(D);
5321
5322 // If the conversion function doesn't return a reference type,
5323 // it can't be considered for this conversion unless we're allowed to
5324 // consider rvalues.
5325 // FIXME: Do we need to make sure that we only consider conversion
5326 // candidates with reference-compatible results? That might be needed to
5327 // break recursion.
5328 if ((AllowRValues ||
5330 if (ConvTemplate)
5332 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
5333 CandidateSet,
5334 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
5335 else
5337 Conv, I.getPair(), ActingDC, Initializer, DestType, CandidateSet,
5338 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
5339 }
5340 }
5341 }
5342
5343 SourceLocation DeclLoc = Initializer->getBeginLoc();
5344
5345 // Perform overload resolution. If it fails, return the failed result.
5347 if (OverloadingResult Result
5348 = CandidateSet.BestViableFunction(S, DeclLoc, Best))
5349 return Result;
5350
5351 FunctionDecl *Function = Best->Function;
5352 // This is the overload that will be used for this initialization step if we
5353 // use this initialization. Mark it as referenced.
5354 Function->setReferenced();
5355
5356 // Compute the returned type and value kind of the conversion.
5357 QualType cv3T3;
5358 if (isa<CXXConversionDecl>(Function))
5359 cv3T3 = Function->getReturnType();
5360 else
5361 cv3T3 = T1;
5362
5364 if (cv3T3->isLValueReferenceType())
5365 VK = VK_LValue;
5366 else if (const auto *RRef = cv3T3->getAs<RValueReferenceType>())
5367 VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue;
5368 cv3T3 = cv3T3.getNonLValueExprType(S.Context);
5369
5370 // Add the user-defined conversion step.
5371 bool HadMultipleCandidates = (CandidateSet.size() > 1);
5372 Sequence.AddUserConversionStep(Function, Best->FoundDecl, cv3T3,
5373 HadMultipleCandidates);
5374
5375 // Determine whether we'll need to perform derived-to-base adjustments or
5376 // other conversions.
5378 Sema::ReferenceCompareResult NewRefRelationship =
5379 S.CompareReferenceRelationship(DeclLoc, T1, cv3T3, &RefConv);
5380
5381 // Add the final conversion sequence, if necessary.
5382 if (NewRefRelationship == Sema::Ref_Incompatible) {
5383 assert(Best->HasFinalConversion && !isa<CXXConstructorDecl>(Function) &&
5384 "should not have conversion after constructor");
5385
5387 ICS.setStandard();
5388 ICS.Standard = Best->FinalConversion;
5389 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2));
5390
5391 // Every implicit conversion results in a prvalue, except for a glvalue
5392 // derived-to-base conversion, which we handle below.
5393 cv3T3 = ICS.Standard.getToType(2);
5394 VK = VK_PRValue;
5395 }
5396
5397 // If the converted initializer is a prvalue, its type T4 is adjusted to
5398 // type "cv1 T4" and the temporary materialization conversion is applied.
5399 //
5400 // We adjust the cv-qualifications to match the reference regardless of
5401 // whether we have a prvalue so that the AST records the change. In this
5402 // case, T4 is "cv3 T3".
5403 QualType cv1T4 = S.Context.getQualifiedType(cv3T3, cv1T1.getQualifiers());
5404 if (cv1T4.getQualifiers() != cv3T3.getQualifiers())
5405 Sequence.AddQualificationConversionStep(cv1T4, VK);
5406 Sequence.AddReferenceBindingStep(cv1T4, VK == VK_PRValue);
5407 VK = IsLValueRef ? VK_LValue : VK_XValue;
5408
5409 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5410 Sequence.AddDerivedToBaseCastStep(cv1T1, VK);
5411 else if (RefConv & Sema::ReferenceConversions::ObjC)
5412 Sequence.AddObjCObjectConversionStep(cv1T1);
5413 else if (RefConv & Sema::ReferenceConversions::Function)
5414 Sequence.AddFunctionReferenceConversionStep(cv1T1);
5415 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5416 if (!S.Context.hasSameType(cv1T4, cv1T1))
5417 Sequence.AddQualificationConversionStep(cv1T1, VK);
5418 }
5419
5420 return OR_Success;
5421}
5422
5423static void CheckCXX98CompatAccessibleCopy(Sema &S,
5424 const InitializedEntity &Entity,
5425 Expr *CurInitExpr);
5426
5427/// Attempt reference initialization (C++0x [dcl.init.ref])
5429 const InitializationKind &Kind,
5431 InitializationSequence &Sequence,
5432 bool TopLevelOfInitList) {
5433 QualType DestType = Entity.getType();
5434 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
5435 Qualifiers T1Quals;
5436 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
5438 Qualifiers T2Quals;
5439 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
5440
5441 // If the initializer is the address of an overloaded function, try
5442 // to resolve the overloaded function. If all goes well, T2 is the
5443 // type of the resulting function.
5445 T1, Sequence))
5446 return;
5447
5448 // Delegate everything else to a subfunction.
5449 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
5450 T1Quals, cv2T2, T2, T2Quals, Sequence,
5451 TopLevelOfInitList);
5452}
5453
5454/// Determine whether an expression is a non-referenceable glvalue (one to
5455/// which a reference can never bind). Attempting to bind a reference to
5456/// such a glvalue will always create a temporary.
5458 return E->refersToBitField() || E->refersToVectorElement() ||
5460}
5461
5462/// Reference initialization without resolving overloaded functions.
5463///
5464/// We also can get here in C if we call a builtin which is declared as
5465/// a function with a parameter of reference type (such as __builtin_va_end()).
5467 const InitializedEntity &Entity,
5468 const InitializationKind &Kind,
5470 QualType cv1T1, QualType T1,
5471 Qualifiers T1Quals,
5472 QualType cv2T2, QualType T2,
5473 Qualifiers T2Quals,
5474 InitializationSequence &Sequence,
5475 bool TopLevelOfInitList) {
5476 QualType DestType = Entity.getType();
5477 SourceLocation DeclLoc = Initializer->getBeginLoc();
5478
5479 // Compute some basic properties of the types and the initializer.
5480 bool isLValueRef = DestType->isLValueReferenceType();
5481 bool isRValueRef = !isLValueRef;
5482 Expr::Classification InitCategory = Initializer->Classify(S.Context);
5483
5485 Sema::ReferenceCompareResult RefRelationship =
5486 S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, &RefConv);
5487
5488 // C++0x [dcl.init.ref]p5:
5489 // A reference to type "cv1 T1" is initialized by an expression of type
5490 // "cv2 T2" as follows:
5491 //
5492 // - If the reference is an lvalue reference and the initializer
5493 // expression
5494 // Note the analogous bullet points for rvalue refs to functions. Because
5495 // there are no function rvalues in C++, rvalue refs to functions are treated
5496 // like lvalue refs.
5497 OverloadingResult ConvOvlResult = OR_Success;
5498 bool T1Function = T1->isFunctionType();
5499 if (isLValueRef || T1Function) {
5500 if (InitCategory.isLValue() && !isNonReferenceableGLValue(Initializer) &&
5501 (RefRelationship == Sema::Ref_Compatible ||
5502 (Kind.isCStyleOrFunctionalCast() &&
5503 RefRelationship == Sema::Ref_Related))) {
5504 // - is an lvalue (but is not a bit-field), and "cv1 T1" is
5505 // reference-compatible with "cv2 T2," or
5506 if (RefConv & (Sema::ReferenceConversions::DerivedToBase |
5507 Sema::ReferenceConversions::ObjC)) {
5508 // If we're converting the pointee, add any qualifiers first;
5509 // these qualifiers must all be top-level, so just convert to "cv1 T2".
5510 if (RefConv & (Sema::ReferenceConversions::Qualification))
5512 S.Context.getQualifiedType(T2, T1Quals),
5513 Initializer->getValueKind());
5514 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5515 Sequence.AddDerivedToBaseCastStep(cv1T1, VK_LValue);
5516 else
5517 Sequence.AddObjCObjectConversionStep(cv1T1);
5518 } else if (RefConv & Sema::ReferenceConversions::Qualification) {
5519 // Perform a (possibly multi-level) qualification conversion.
5520 Sequence.AddQualificationConversionStep(cv1T1,
5521 Initializer->getValueKind());
5522 } else if (RefConv & Sema::ReferenceConversions::Function) {
5523 Sequence.AddFunctionReferenceConversionStep(cv1T1);
5524 }
5525
5526 // We only create a temporary here when binding a reference to a
5527 // bit-field or vector element. Those cases are't supposed to be
5528 // handled by this bullet, but the outcome is the same either way.
5529 Sequence.AddReferenceBindingStep(cv1T1, false);
5530 return;
5531 }
5532
5533 // - has a class type (i.e., T2 is a class type), where T1 is not
5534 // reference-related to T2, and can be implicitly converted to an
5535 // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible
5536 // with "cv3 T3" (this conversion is selected by enumerating the
5537 // applicable conversion functions (13.3.1.6) and choosing the best
5538 // one through overload resolution (13.3)),
5539 // If we have an rvalue ref to function type here, the rhs must be
5540 // an rvalue. DR1287 removed the "implicitly" here.
5541 if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() &&
5542 (isLValueRef || InitCategory.isRValue())) {
5543 if (S.getLangOpts().CPlusPlus) {
5544 // Try conversion functions only for C++.
5545 ConvOvlResult = TryRefInitWithConversionFunction(
5546 S, Entity, Kind, Initializer, /*AllowRValues*/ isRValueRef,
5547 /*IsLValueRef*/ isLValueRef, Sequence);
5548 if (ConvOvlResult == OR_Success)
5549 return;
5550 if (ConvOvlResult != OR_No_Viable_Function)
5551 Sequence.SetOverloadFailure(
5553 ConvOvlResult);
5554 } else {
5555 ConvOvlResult = OR_No_Viable_Function;
5556 }
5557 }
5558 }
5559
5560 // - Otherwise, the reference shall be an lvalue reference to a
5561 // non-volatile const type (i.e., cv1 shall be const), or the reference
5562 // shall be an rvalue reference.
5563 // For address spaces, we interpret this to mean that an addr space
5564 // of a reference "cv1 T1" is a superset of addr space of "cv2 T2".
5565 if (isLValueRef &&
5566 !(T1Quals.hasConst() && !T1Quals.hasVolatile() &&
5567 T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext()))) {
5570 else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5571 Sequence.SetOverloadFailure(
5573 ConvOvlResult);
5574 else if (!InitCategory.isLValue())
5575 Sequence.SetFailed(
5576 T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext())
5580 else {
5582 switch (RefRelationship) {
5584 if (Initializer->refersToBitField())
5585 FK = InitializationSequence::
5586 FK_NonConstLValueReferenceBindingToBitfield;
5587 else if (Initializer->refersToVectorElement())
5588 FK = InitializationSequence::
5589 FK_NonConstLValueReferenceBindingToVectorElement;
5590 else if (Initializer->refersToMatrixElement())
5591 FK = InitializationSequence::
5592 FK_NonConstLValueReferenceBindingToMatrixElement;
5593 else
5594 llvm_unreachable("unexpected kind of compatible initializer");
5595 break;
5596 case Sema::Ref_Related:
5598 break;
5600 FK = InitializationSequence::
5601 FK_NonConstLValueReferenceBindingToUnrelated;
5602 break;
5603 }
5604 Sequence.SetFailed(FK);
5605 }
5606 return;
5607 }
5608
5609 // - If the initializer expression
5610 // - is an
5611 // [<=14] xvalue (but not a bit-field), class prvalue, array prvalue, or
5612 // [1z] rvalue (but not a bit-field) or
5613 // function lvalue and "cv1 T1" is reference-compatible with "cv2 T2"
5614 //
5615 // Note: functions are handled above and below rather than here...
5616 if (!T1Function &&
5617 (RefRelationship == Sema::Ref_Compatible ||
5618 (Kind.isCStyleOrFunctionalCast() &&
5619 RefRelationship == Sema::Ref_Related)) &&
5620 ((InitCategory.isXValue() && !isNonReferenceableGLValue(Initializer)) ||
5621 (InitCategory.isPRValue() &&
5622 (S.getLangOpts().CPlusPlus17 || T2->isRecordType() ||
5623 T2->isArrayType())))) {
5624 ExprValueKind ValueKind = InitCategory.isXValue() ? VK_XValue : VK_PRValue;
5625 if (InitCategory.isPRValue() && T2->isRecordType()) {
5626 // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the
5627 // compiler the freedom to perform a copy here or bind to the
5628 // object, while C++0x requires that we bind directly to the
5629 // object. Hence, we always bind to the object without making an
5630 // extra copy. However, in C++03 requires that we check for the
5631 // presence of a suitable copy constructor:
5632 //
5633 // The constructor that would be used to make the copy shall
5634 // be callable whether or not the copy is actually done.
5635 if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt)
5636 Sequence.AddExtraneousCopyToTemporary(cv2T2);
5637 else if (S.getLangOpts().CPlusPlus11)
5639 }
5640
5641 // C++1z [dcl.init.ref]/5.2.1.2:
5642 // If the converted initializer is a prvalue, its type T4 is adjusted
5643 // to type "cv1 T4" and the temporary materialization conversion is
5644 // applied.
5645 // Postpone address space conversions to after the temporary materialization
5646 // conversion to allow creating temporaries in the alloca address space.
5647 auto T1QualsIgnoreAS = T1Quals;
5648 auto T2QualsIgnoreAS = T2Quals;
5649 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5650 T1QualsIgnoreAS.removeAddressSpace();
5651 T2QualsIgnoreAS.removeAddressSpace();
5652 }
5653 // Strip the existing ObjC lifetime qualifier from cv2T2 before combining
5654 // with T1's qualifiers.
5655 QualType T2ForQualConv = cv2T2;
5656 if (T1Quals.getObjCLifetime() != T2Quals.getObjCLifetime()) {
5657 Qualifiers T2BaseQuals =
5658 T2ForQualConv.getQualifiers().withoutObjCLifetime();
5659 T2ForQualConv = S.Context.getQualifiedType(
5660 T2ForQualConv.getUnqualifiedType(), T2BaseQuals);
5661 }
5662 QualType cv1T4 = S.Context.getQualifiedType(T2ForQualConv, T1QualsIgnoreAS);
5663 if (T1QualsIgnoreAS != T2QualsIgnoreAS)
5664 Sequence.AddQualificationConversionStep(cv1T4, ValueKind);
5665 Sequence.AddReferenceBindingStep(cv1T4, ValueKind == VK_PRValue);
5666 ValueKind = isLValueRef ? VK_LValue : VK_XValue;
5667 // Add addr space conversion if required.
5668 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5669 auto T4Quals = cv1T4.getQualifiers();
5670 T4Quals.addAddressSpace(T1Quals.getAddressSpace());
5671 QualType cv1T4WithAS = S.Context.getQualifiedType(T2, T4Quals);
5672 Sequence.AddQualificationConversionStep(cv1T4WithAS, ValueKind);
5673 cv1T4 = cv1T4WithAS;
5674 }
5675
5676 // In any case, the reference is bound to the resulting glvalue (or to
5677 // an appropriate base class subobject).
5678 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5679 Sequence.AddDerivedToBaseCastStep(cv1T1, ValueKind);
5680 else if (RefConv & Sema::ReferenceConversions::ObjC)
5681 Sequence.AddObjCObjectConversionStep(cv1T1);
5682 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5683 if (!S.Context.hasSameType(cv1T4, cv1T1))
5684 Sequence.AddQualificationConversionStep(cv1T1, ValueKind);
5685 }
5686 return;
5687 }
5688
5689 // - has a class type (i.e., T2 is a class type), where T1 is not
5690 // reference-related to T2, and can be implicitly converted to an
5691 // xvalue, class prvalue, or function lvalue of type "cv3 T3",
5692 // where "cv1 T1" is reference-compatible with "cv3 T3",
5693 //
5694 // DR1287 removes the "implicitly" here.
5695 if (T2->isRecordType()) {
5696 if (RefRelationship == Sema::Ref_Incompatible) {
5697 ConvOvlResult = TryRefInitWithConversionFunction(
5698 S, Entity, Kind, Initializer, /*AllowRValues*/ true,
5699 /*IsLValueRef*/ isLValueRef, Sequence);
5700 if (ConvOvlResult)
5701 Sequence.SetOverloadFailure(
5703 ConvOvlResult);
5704
5705 return;
5706 }
5707
5708 if (RefRelationship == Sema::Ref_Compatible &&
5709 isRValueRef && InitCategory.isLValue()) {
5710 Sequence.SetFailed(
5712 return;
5713 }
5714
5716 return;
5717 }
5718
5719 // - Otherwise, a temporary of type "cv1 T1" is created and initialized
5720 // from the initializer expression using the rules for a non-reference
5721 // copy-initialization (8.5). The reference is then bound to the
5722 // temporary. [...]
5723
5724 // Ignore address space of reference type at this point and perform address
5725 // space conversion after the reference binding step.
5726 QualType cv1T1IgnoreAS =
5727 T1Quals.hasAddressSpace()
5729 : cv1T1;
5730
5731 InitializedEntity TempEntity =
5733
5734 // FIXME: Why do we use an implicit conversion here rather than trying
5735 // copy-initialization?
5737 = S.TryImplicitConversion(Initializer, TempEntity.getType(),
5738 /*SuppressUserConversions=*/false,
5739 Sema::AllowedExplicit::None,
5740 /*FIXME:InOverloadResolution=*/false,
5741 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
5742 /*AllowObjCWritebackConversion=*/false);
5743
5744 if (ICS.isBad()) {
5745 // FIXME: Use the conversion function set stored in ICS to turn
5746 // this into an overloading ambiguity diagnostic. However, we need
5747 // to keep that set as an OverloadCandidateSet rather than as some
5748 // other kind of set.
5749 if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5750 Sequence.SetOverloadFailure(
5752 ConvOvlResult);
5753 else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
5755 else
5757 return;
5758 } else {
5759 Sequence.AddConversionSequenceStep(ICS, TempEntity.getType(),
5760 TopLevelOfInitList);
5761 }
5762
5763 // [...] If T1 is reference-related to T2, cv1 must be the
5764 // same cv-qualification as, or greater cv-qualification
5765 // than, cv2; otherwise, the program is ill-formed.
5766 unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
5767 unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
5768 if (RefRelationship == Sema::Ref_Related &&
5769 ((T1CVRQuals | T2CVRQuals) != T1CVRQuals ||
5770 !T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext()))) {
5772 return;
5773 }
5774
5775 // [...] If T1 is reference-related to T2 and the reference is an rvalue
5776 // reference, the initializer expression shall not be an lvalue.
5777 if (RefRelationship >= Sema::Ref_Related && !isLValueRef &&
5778 InitCategory.isLValue()) {
5779 Sequence.SetFailed(
5781 return;
5782 }
5783
5784 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS, /*BindingTemporary=*/true);
5785
5786 if (T1Quals.hasAddressSpace()) {
5789 Sequence.SetFailed(
5791 return;
5792 }
5793 Sequence.AddQualificationConversionStep(cv1T1, isLValueRef ? VK_LValue
5794 : VK_XValue);
5795 }
5796}
5797
5798/// Attempt character array initialization from a string literal
5799/// (C++ [dcl.init.string], C99 6.7.8).
5801 const InitializedEntity &Entity,
5802 const InitializationKind &Kind,
5804 InitializationSequence &Sequence) {
5805 Sequence.AddStringInitStep(Entity.getType());
5806}
5807
5808/// Attempt value initialization (C++ [dcl.init]p7).
5810 const InitializedEntity &Entity,
5811 const InitializationKind &Kind,
5812 InitializationSequence &Sequence,
5813 InitListExpr *InitList) {
5814 assert((!InitList || InitList->getNumInits() == 0) &&
5815 "Shouldn't use value-init for non-empty init lists");
5816
5817 // C++98 [dcl.init]p5, C++11 [dcl.init]p7:
5818 //
5819 // To value-initialize an object of type T means:
5820 QualType T = Entity.getType();
5821 assert(!T->isVoidType() && "Cannot value-init void");
5822
5823 // -- if T is an array type, then each element is value-initialized;
5824 T = S.Context.getBaseElementType(T);
5825
5826 if (auto *ClassDecl = T->getAsCXXRecordDecl()) {
5827 bool NeedZeroInitialization = true;
5828 // C++98:
5829 // -- if T is a class type (clause 9) with a user-declared constructor
5830 // (12.1), then the default constructor for T is called (and the
5831 // initialization is ill-formed if T has no accessible default
5832 // constructor);
5833 // C++11:
5834 // -- if T is a class type (clause 9) with either no default constructor
5835 // (12.1 [class.ctor]) or a default constructor that is user-provided
5836 // or deleted, then the object is default-initialized;
5837 //
5838 // Note that the C++11 rule is the same as the C++98 rule if there are no
5839 // defaulted or deleted constructors, so we just use it unconditionally.
5841 if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted())
5842 NeedZeroInitialization = false;
5843
5844 // -- if T is a (possibly cv-qualified) non-union class type without a
5845 // user-provided or deleted default constructor, then the object is
5846 // zero-initialized and, if T has a non-trivial default constructor,
5847 // default-initialized;
5848 // The 'non-union' here was removed by DR1502. The 'non-trivial default
5849 // constructor' part was removed by DR1507.
5850 if (NeedZeroInitialization)
5851 Sequence.AddZeroInitializationStep(Entity.getType());
5852
5853 // C++03:
5854 // -- if T is a non-union class type without a user-declared constructor,
5855 // then every non-static data member and base class component of T is
5856 // value-initialized;
5857 // [...] A program that calls for [...] value-initialization of an
5858 // entity of reference type is ill-formed.
5859 //
5860 // C++11 doesn't need this handling, because value-initialization does not
5861 // occur recursively there, and the implicit default constructor is
5862 // defined as deleted in the problematic cases.
5863 if (!S.getLangOpts().CPlusPlus11 &&
5864 ClassDecl->hasUninitializedReferenceMember()) {
5866 return;
5867 }
5868
5869 // If this is list-value-initialization, pass the empty init list on when
5870 // building the constructor call. This affects the semantics of a few
5871 // things (such as whether an explicit default constructor can be called).
5872 Expr *InitListAsExpr = InitList;
5873 MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);
5874 bool InitListSyntax = InitList;
5875
5876 // FIXME: Instead of creating a CXXConstructExpr of array type here,
5877 // wrap a class-typed CXXConstructExpr in an ArrayInitLoopExpr.
5879 S, Entity, Kind, Args, T, Entity.getType(), Sequence, InitListSyntax);
5880 }
5881
5882 Sequence.AddZeroInitializationStep(Entity.getType());
5883}
5884
5885/// Attempt default initialization (C++ [dcl.init]p6).
5887 const InitializedEntity &Entity,
5888 const InitializationKind &Kind,
5889 InitializationSequence &Sequence) {
5890 assert(Kind.getKind() == InitializationKind::IK_Default);
5891
5892 // C++ [dcl.init]p6:
5893 // To default-initialize an object of type T means:
5894 // - if T is an array type, each element is default-initialized;
5895 QualType DestType = S.Context.getBaseElementType(Entity.getType());
5896
5897 // - if T is a (possibly cv-qualified) class type (Clause 9), the default
5898 // constructor for T is called (and the initialization is ill-formed if
5899 // T has no accessible default constructor);
5900 if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {
5901 TryConstructorInitialization(S, Entity, Kind, {}, DestType,
5902 Entity.getType(), Sequence);
5903 return;
5904 }
5905
5906 // - otherwise, no initialization is performed.
5907
5908 // If a program calls for the default initialization of an object of
5909 // a const-qualified type T, T shall be a class type with a user-provided
5910 // default constructor.
5911 if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
5912 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
5914 return;
5915 }
5916
5917 // If the destination type has a lifetime property, zero-initialize it.
5918 if (DestType.getQualifiers().hasObjCLifetime()) {
5919 Sequence.AddZeroInitializationStep(Entity.getType());
5920 return;
5921 }
5922}
5923
5925 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
5926 ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly,
5927 ExprResult *Result) {
5928 unsigned EntityIndexToProcess = 0;
5929 SmallVector<Expr *, 4> InitExprs;
5930 QualType ResultType;
5931 Expr *ArrayFiller = nullptr;
5932 FieldDecl *InitializedFieldInUnion = nullptr;
5933
5934 auto HandleInitializedEntity = [&](const InitializedEntity &SubEntity,
5935 const InitializationKind &SubKind,
5936 Expr *Arg, Expr **InitExpr = nullptr) {
5938 S, SubEntity, SubKind,
5939 Arg ? MultiExprArg(Arg) : MutableArrayRef<Expr *>());
5940
5941 if (IS.Failed()) {
5942 if (!VerifyOnly) {
5943 IS.Diagnose(S, SubEntity, SubKind,
5944 Arg ? ArrayRef(Arg) : ArrayRef<Expr *>());
5945 } else {
5946 Sequence.SetFailed(
5948 }
5949
5950 return false;
5951 }
5952 if (!VerifyOnly) {
5953 ExprResult ER;
5954 ER = IS.Perform(S, SubEntity, SubKind,
5955 Arg ? MultiExprArg(Arg) : MutableArrayRef<Expr *>());
5956
5957 if (ER.isInvalid())
5958 return false;
5959
5960 if (InitExpr)
5961 *InitExpr = ER.get();
5962 else
5963 InitExprs.push_back(ER.get());
5964 }
5965 return true;
5966 };
5967
5968 if (const ArrayType *AT =
5969 S.getASTContext().getAsArrayType(Entity.getType())) {
5970 uint64_t ArrayLength;
5971 // C++ [dcl.init]p16.5
5972 // if the destination type is an array, the object is initialized as
5973 // follows. Let x1, . . . , xk be the elements of the expression-list. If
5974 // the destination type is an array of unknown bound, it is defined as
5975 // having k elements.
5976 if (const ConstantArrayType *CAT =
5978 ArrayLength = CAT->getZExtSize();
5979 ResultType = Entity.getType();
5980 } else if (const VariableArrayType *VAT =
5982 // Braced-initialization of variable array types is not allowed, even if
5983 // the size is greater than or equal to the number of args, so we don't
5984 // allow them to be initialized via parenthesized aggregate initialization
5985 // either.
5986 const Expr *SE = VAT->getSizeExpr();
5987 S.Diag(SE->getBeginLoc(), diag::err_variable_object_no_init)
5988 << SE->getSourceRange();
5989 return;
5990 } else {
5991 assert(Entity.getType()->isIncompleteArrayType());
5992 ArrayLength = Args.size();
5993 }
5994 EntityIndexToProcess = ArrayLength;
5995
5996 // ...the ith array element is copy-initialized with xi for each
5997 // 1 <= i <= k
5998 for (Expr *E : Args) {
6000 S.getASTContext(), EntityIndexToProcess, Entity);
6002 E->getExprLoc(), /*isDirectInit=*/false, E);
6003 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6004 return;
6005 }
6006 // ...and value-initialized for each k < i <= n;
6007 if (ArrayLength > Args.size() || Entity.isVariableLengthArrayNew()) {
6009 S.getASTContext(), Args.size(), Entity);
6011 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
6012 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr, &ArrayFiller))
6013 return;
6014 }
6015
6016 if (ResultType.isNull()) {
6017 ResultType = S.Context.getConstantArrayType(
6018 AT->getElementType(), llvm::APInt(/*numBits=*/32, ArrayLength),
6019 /*SizeExpr=*/nullptr, ArraySizeModifier::Normal, 0);
6020 }
6021 } else if (auto *RD = Entity.getType()->getAsCXXRecordDecl()) {
6022 bool IsUnion = RD->isUnion();
6023 if (RD->isInvalidDecl()) {
6024 // Exit early to avoid confusion when processing members.
6025 // We do the same for braced list initialization in
6026 // `CheckStructUnionTypes`.
6027 Sequence.SetFailed(
6029 return;
6030 }
6031
6032 if (!IsUnion) {
6033 for (const CXXBaseSpecifier &Base : RD->bases()) {
6035 S.getASTContext(), &Base, false, &Entity);
6036 if (EntityIndexToProcess < Args.size()) {
6037 // C++ [dcl.init]p16.6.2.2.
6038 // ...the object is initialized is follows. Let e1, ..., en be the
6039 // elements of the aggregate([dcl.init.aggr]). Let x1, ..., xk be
6040 // the elements of the expression-list...The element ei is
6041 // copy-initialized with xi for 1 <= i <= k.
6042 Expr *E = Args[EntityIndexToProcess];
6044 E->getExprLoc(), /*isDirectInit=*/false, E);
6045 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6046 return;
6047 } else {
6048 // We've processed all of the args, but there are still base classes
6049 // that have to be initialized.
6050 // C++ [dcl.init]p17.6.2.2
6051 // The remaining elements...otherwise are value initialzed
6053 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
6054 /*IsImplicit=*/true);
6055 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
6056 return;
6057 }
6058 EntityIndexToProcess++;
6059 }
6060 }
6061
6062 for (FieldDecl *FD : RD->fields()) {
6063 // Unnamed bitfields should not be initialized at all, either with an arg
6064 // or by default.
6065 if (FD->isUnnamedBitField())
6066 continue;
6067
6068 InitializedEntity SubEntity =
6070
6071 if (EntityIndexToProcess < Args.size()) {
6072 // ...The element ei is copy-initialized with xi for 1 <= i <= k.
6073 Expr *E = Args[EntityIndexToProcess];
6074
6075 // Incomplete array types indicate flexible array members. Do not allow
6076 // paren list initializations of structs with these members, as GCC
6077 // doesn't either.
6078 if (FD->getType()->isIncompleteArrayType()) {
6079 if (!VerifyOnly) {
6080 S.Diag(E->getBeginLoc(), diag::err_flexible_array_init)
6081 << SourceRange(E->getBeginLoc(), E->getEndLoc());
6082 S.Diag(FD->getLocation(), diag::note_flexible_array_member) << FD;
6083 }
6084 Sequence.SetFailed(
6086 return;
6087 }
6088
6090 E->getExprLoc(), /*isDirectInit=*/false, E);
6091 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6092 return;
6093
6094 // Unions should have only one initializer expression, so we bail out
6095 // after processing the first field. If there are more initializers then
6096 // it will be caught when we later check whether EntityIndexToProcess is
6097 // less than Args.size();
6098 if (IsUnion) {
6099 InitializedFieldInUnion = FD;
6100 EntityIndexToProcess = 1;
6101 break;
6102 }
6103 } else {
6104 // We've processed all of the args, but there are still members that
6105 // have to be initialized.
6106 if (!VerifyOnly && FD->hasAttr<ExplicitInitAttr>() &&
6107 !S.isUnevaluatedContext()) {
6108 S.Diag(Kind.getLocation(), diag::warn_field_requires_explicit_init)
6109 << /* Var-in-Record */ 0 << FD;
6110 S.Diag(FD->getLocation(), diag::note_entity_declared_at) << FD;
6111 }
6112
6113 if (FD->hasInClassInitializer()) {
6114 if (!VerifyOnly) {
6115 // C++ [dcl.init]p16.6.2.2
6116 // The remaining elements are initialized with their default
6117 // member initializers, if any
6119 Kind.getParenOrBraceRange().getEnd(), FD);
6120 if (DIE.isInvalid())
6121 return;
6122 S.checkInitializerLifetime(SubEntity, DIE.get());
6123 InitExprs.push_back(DIE.get());
6124 }
6125 } else {
6126 // C++ [dcl.init]p17.6.2.2
6127 // The remaining elements...otherwise are value initialzed
6128 if (FD->getType()->isReferenceType()) {
6129 Sequence.SetFailed(
6131 if (!VerifyOnly) {
6132 SourceRange SR = Kind.getParenOrBraceRange();
6133 S.Diag(SR.getEnd(), diag::err_init_reference_member_uninitialized)
6134 << FD->getType() << SR;
6135 S.Diag(FD->getLocation(), diag::note_uninit_reference_member);
6136 }
6137 return;
6138 }
6140 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
6141 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
6142 return;
6143 }
6144 }
6145 EntityIndexToProcess++;
6146 }
6147 ResultType = Entity.getType();
6148 }
6149
6150 // Not all of the args have been processed, so there must've been more args
6151 // than were required to initialize the element.
6152 if (EntityIndexToProcess < Args.size()) {
6154 if (!VerifyOnly) {
6155 QualType T = Entity.getType();
6156 int InitKind = T->isArrayType() ? 0 : T->isUnionType() ? 4 : 5;
6157 SourceRange ExcessInitSR(Args[EntityIndexToProcess]->getBeginLoc(),
6158 Args.back()->getEndLoc());
6159 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
6160 << InitKind << ExcessInitSR;
6161 }
6162 return;
6163 }
6164
6165 if (VerifyOnly) {
6167 Sequence.AddParenthesizedListInitStep(Entity.getType());
6168 } else if (Result) {
6169 SourceRange SR = Kind.getParenOrBraceRange();
6170 auto *CPLIE = CXXParenListInitExpr::Create(
6171 S.getASTContext(), InitExprs, ResultType, Args.size(),
6172 Kind.getLocation(), SR.getBegin(), SR.getEnd());
6173 if (ArrayFiller)
6174 CPLIE->setArrayFiller(ArrayFiller);
6175 if (InitializedFieldInUnion)
6176 CPLIE->setInitializedFieldInUnion(InitializedFieldInUnion);
6177 *Result = CPLIE;
6178 S.Diag(Kind.getLocation(),
6179 diag::warn_cxx17_compat_aggregate_init_paren_list)
6180 << Kind.getLocation() << SR << ResultType;
6181 }
6182}
6183
6184/// Attempt a user-defined conversion between two types (C++ [dcl.init]),
6185/// which enumerates all conversion functions and performs overload resolution
6186/// to select the best.
6188 QualType DestType,
6189 const InitializationKind &Kind,
6191 InitializationSequence &Sequence,
6192 bool TopLevelOfInitList) {
6193 assert(!DestType->isReferenceType() && "References are handled elsewhere");
6194 QualType SourceType = Initializer->getType();
6195 assert((DestType->isRecordType() || SourceType->isRecordType()) &&
6196 "Must have a class type to perform a user-defined conversion");
6197
6198 // Build the candidate set directly in the initialization sequence
6199 // structure, so that it will persist if we fail.
6200 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
6202 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
6203
6204 // Determine whether we are allowed to call explicit constructors or
6205 // explicit conversion operators.
6206 bool AllowExplicit = Kind.AllowExplicit();
6207
6208 if (DestType->isRecordType()) {
6209 // The type we're converting to is a class type. Enumerate its constructors
6210 // to see if there is a suitable conversion.
6211 // Try to complete the type we're converting to.
6212 if (S.isCompleteType(Kind.getLocation(), DestType)) {
6213 auto *DestRecordDecl = DestType->castAsCXXRecordDecl();
6214 for (NamedDecl *D : S.LookupConstructors(DestRecordDecl)) {
6215 auto Info = getConstructorInfo(D);
6216 if (!Info.Constructor)
6217 continue;
6218
6219 if (!Info.Constructor->isInvalidDecl() &&
6220 Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
6221 if (Info.ConstructorTmpl)
6223 Info.ConstructorTmpl, Info.FoundDecl,
6224 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
6225 /*SuppressUserConversions=*/true,
6226 /*PartialOverloading*/ false, AllowExplicit);
6227 else
6228 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
6229 Initializer, CandidateSet,
6230 /*SuppressUserConversions=*/true,
6231 /*PartialOverloading*/ false, AllowExplicit);
6232 }
6233 }
6234 }
6235 }
6236
6237 SourceLocation DeclLoc = Initializer->getBeginLoc();
6238
6239 if (SourceType->isRecordType()) {
6240 // The type we're converting from is a class type, enumerate its conversion
6241 // functions.
6242
6243 // We can only enumerate the conversion functions for a complete type; if
6244 // the type isn't complete, simply skip this step.
6245 if (S.isCompleteType(DeclLoc, SourceType)) {
6246 auto *SourceRecordDecl = SourceType->castAsCXXRecordDecl();
6247 const auto &Conversions =
6248 SourceRecordDecl->getVisibleConversionFunctions();
6249 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
6250 NamedDecl *D = *I;
6252 if (isa<UsingShadowDecl>(D))
6253 D = cast<UsingShadowDecl>(D)->getTargetDecl();
6254
6255 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
6256 CXXConversionDecl *Conv;
6257 if (ConvTemplate)
6258 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
6259 else
6260 Conv = cast<CXXConversionDecl>(D);
6261
6262 if (ConvTemplate)
6264 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
6265 CandidateSet, AllowExplicit, AllowExplicit);
6266 else
6267 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
6268 DestType, CandidateSet, AllowExplicit,
6269 AllowExplicit);
6270 }
6271 }
6272 }
6273
6274 // Perform overload resolution. If it fails, return the failed result.
6276 if (OverloadingResult Result
6277 = CandidateSet.BestViableFunction(S, DeclLoc, Best)) {
6278 Sequence.SetOverloadFailure(
6280
6281 // [class.copy.elision]p3:
6282 // In some copy-initialization contexts, a two-stage overload resolution
6283 // is performed.
6284 // If the first overload resolution selects a deleted function, we also
6285 // need the initialization sequence to decide whether to perform the second
6286 // overload resolution.
6287 if (!(Result == OR_Deleted &&
6288 Kind.getKind() == InitializationKind::IK_Copy))
6289 return;
6290 }
6291
6292 FunctionDecl *Function = Best->Function;
6293 Function->setReferenced();
6294 bool HadMultipleCandidates = (CandidateSet.size() > 1);
6295
6296 if (isa<CXXConstructorDecl>(Function)) {
6297 // Add the user-defined conversion step. Any cv-qualification conversion is
6298 // subsumed by the initialization. Per DR5, the created temporary is of the
6299 // cv-unqualified type of the destination.
6300 Sequence.AddUserConversionStep(Function, Best->FoundDecl,
6301 DestType.getUnqualifiedType(),
6302 HadMultipleCandidates);
6303
6304 // C++14 and before:
6305 // - if the function is a constructor, the call initializes a temporary
6306 // of the cv-unqualified version of the destination type. The [...]
6307 // temporary [...] is then used to direct-initialize, according to the
6308 // rules above, the object that is the destination of the
6309 // copy-initialization.
6310 // Note that this just performs a simple object copy from the temporary.
6311 //
6312 // C++17:
6313 // - if the function is a constructor, the call is a prvalue of the
6314 // cv-unqualified version of the destination type whose return object
6315 // is initialized by the constructor. The call is used to
6316 // direct-initialize, according to the rules above, the object that
6317 // is the destination of the copy-initialization.
6318 // Therefore we need to do nothing further.
6319 //
6320 // FIXME: Mark this copy as extraneous.
6321 if (!S.getLangOpts().CPlusPlus17)
6322 Sequence.AddFinalCopy(DestType);
6323 else if (DestType.hasQualifiers())
6324 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
6325 return;
6326 }
6327
6328 // Add the user-defined conversion step that calls the conversion function.
6329 QualType ConvType = Function->getCallResultType();
6330 Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
6331 HadMultipleCandidates);
6332
6333 if (ConvType->isRecordType()) {
6334 // The call is used to direct-initialize [...] the object that is the
6335 // destination of the copy-initialization.
6336 //
6337 // In C++17, this does not call a constructor if we enter /17.6.1:
6338 // - If the initializer expression is a prvalue and the cv-unqualified
6339 // version of the source type is the same as the class of the
6340 // destination [... do not make an extra copy]
6341 //
6342 // FIXME: Mark this copy as extraneous.
6343 if (!S.getLangOpts().CPlusPlus17 ||
6344 Function->getReturnType()->isReferenceType() ||
6345 !S.Context.hasSameUnqualifiedType(ConvType, DestType))
6346 Sequence.AddFinalCopy(DestType);
6347 else if (!S.Context.hasSameType(ConvType, DestType))
6348 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
6349 return;
6350 }
6351
6352 // If the conversion following the call to the conversion function
6353 // is interesting, add it as a separate step.
6354 assert(Best->HasFinalConversion);
6355 if (Best->FinalConversion.First || Best->FinalConversion.Second ||
6356 Best->FinalConversion.Third) {
6358 ICS.setStandard();
6359 ICS.Standard = Best->FinalConversion;
6360 Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
6361 }
6362}
6363
6364/// The non-zero enum values here are indexes into diagnostic alternatives.
6366
6367/// Determines whether this expression is an acceptable ICR source.
6369 bool isAddressOf, bool &isWeakAccess) {
6370 // Skip parens.
6371 e = e->IgnoreParens();
6372
6373 // Skip address-of nodes.
6374 if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
6375 if (op->getOpcode() == UO_AddrOf)
6376 return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true,
6377 isWeakAccess);
6378
6379 // Skip certain casts.
6380 } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
6381 switch (ce->getCastKind()) {
6382 case CK_Dependent:
6383 case CK_BitCast:
6384 case CK_LValueBitCast:
6385 case CK_NoOp:
6386 return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess);
6387
6388 case CK_ArrayToPointerDecay:
6389 return IIK_nonscalar;
6390
6391 case CK_NullToPointer:
6392 return IIK_okay;
6393
6394 default:
6395 break;
6396 }
6397
6398 // If we have a declaration reference, it had better be a local variable.
6399 } else if (isa<DeclRefExpr>(e)) {
6400 // set isWeakAccess to true, to mean that there will be an implicit
6401 // load which requires a cleanup.
6403 isWeakAccess = true;
6404
6405 if (!isAddressOf) return IIK_nonlocal;
6406
6407 VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
6408 if (!var) return IIK_nonlocal;
6409
6410 return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
6411
6412 // If we have a conditional operator, check both sides.
6413 } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
6414 if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf,
6415 isWeakAccess))
6416 return iik;
6417
6418 return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess);
6419
6420 // These are never scalar.
6421 } else if (isa<ArraySubscriptExpr>(e)) {
6422 return IIK_nonscalar;
6423
6424 // Otherwise, it needs to be a null pointer constant.
6425 } else {
6428 }
6429
6430 return IIK_nonlocal;
6431}
6432
6433/// Check whether the given expression is a valid operand for an
6434/// indirect copy/restore.
6436 assert(src->isPRValue());
6437 bool isWeakAccess = false;
6438 InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess);
6439 // If isWeakAccess to true, there will be an implicit
6440 // load which requires a cleanup.
6441 if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess)
6443
6444 if (iik == IIK_okay) return;
6445
6446 S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
6447 << ((unsigned) iik - 1) // shift index into diagnostic explanations
6448 << src->getSourceRange();
6449}
6450
6451/// Determine whether we have compatible array types for the
6452/// purposes of GNU by-copy array initialization.
6453static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest,
6454 const ArrayType *Source) {
6455 // If the source and destination array types are equivalent, we're
6456 // done.
6457 if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0)))
6458 return true;
6459
6460 // Make sure that the element types are the same.
6461 if (!Context.hasSameType(Dest->getElementType(), Source->getElementType()))
6462 return false;
6463
6464 // The only mismatch we allow is when the destination is an
6465 // incomplete array type and the source is a constant array type.
6466 return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
6467}
6468
6470 InitializationSequence &Sequence,
6471 const InitializedEntity &Entity,
6472 Expr *Initializer) {
6473 bool ArrayDecay = false;
6474 QualType ArgType = Initializer->getType();
6475 QualType ArgPointee;
6476 if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
6477 ArrayDecay = true;
6478 ArgPointee = ArgArrayType->getElementType();
6479 ArgType = S.Context.getPointerType(ArgPointee);
6480 }
6481
6482 // Handle write-back conversion.
6483 QualType ConvertedArgType;
6484 if (!S.ObjC().isObjCWritebackConversion(ArgType, Entity.getType(),
6485 ConvertedArgType))
6486 return false;
6487
6488 // We should copy unless we're passing to an argument explicitly
6489 // marked 'out'.
6490 bool ShouldCopy = true;
6491 if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
6492 ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
6493
6494 // Do we need an lvalue conversion?
6495 if (ArrayDecay || Initializer->isGLValue()) {
6497 ICS.setStandard();
6499
6500 QualType ResultType;
6501 if (ArrayDecay) {
6503 ResultType = S.Context.getPointerType(ArgPointee);
6504 } else {
6506 ResultType = Initializer->getType().getNonLValueExprType(S.Context);
6507 }
6508
6509 Sequence.AddConversionSequenceStep(ICS, ResultType);
6510 }
6511
6512 Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
6513 return true;
6514}
6515
6517 InitializationSequence &Sequence,
6518 QualType DestType,
6519 Expr *Initializer) {
6520 if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
6521 (!Initializer->isIntegerConstantExpr(S.Context) &&
6522 !Initializer->getType()->isSamplerT()))
6523 return false;
6524
6525 Sequence.AddOCLSamplerInitStep(DestType);
6526 return true;
6527}
6528
6529static bool IsZeroInitializer(const Expr *Init, ASTContext &Ctx) {
6530 std::optional<llvm::APSInt> Value = Init->getIntegerConstantExpr(Ctx);
6531 return Value && Value->isZero();
6532}
6533
6535 InitializationSequence &Sequence,
6536 QualType DestType,
6537 Expr *Initializer) {
6538 if (!S.getLangOpts().OpenCL)
6539 return false;
6540
6541 //
6542 // OpenCL 1.2 spec, s6.12.10
6543 //
6544 // The event argument can also be used to associate the
6545 // async_work_group_copy with a previous async copy allowing
6546 // an event to be shared by multiple async copies; otherwise
6547 // event should be zero.
6548 //
6549 if (DestType->isEventT() || DestType->isQueueT()) {
6551 return false;
6552
6553 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6554 return true;
6555 }
6556
6557 // We should allow zero initialization for all types defined in the
6558 // cl_intel_device_side_avc_motion_estimation extension, except
6559 // intel_sub_group_avc_mce_payload_t and intel_sub_group_avc_mce_result_t.
6561 "cl_intel_device_side_avc_motion_estimation", S.getLangOpts()) &&
6562 DestType->isOCLIntelSubgroupAVCType()) {
6563 if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
6564 DestType->isOCLIntelSubgroupAVCMceResultType())
6565 return false;
6567 return false;
6568
6569 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6570 return true;
6571 }
6572
6573 return false;
6574}
6575
6577 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
6578 MultiExprArg Args, bool TopLevelOfInitList, bool TreatUnavailableAsInvalid)
6579 : FailedOverloadResult(OR_Success),
6580 FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) {
6581 InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList,
6582 TreatUnavailableAsInvalid);
6583}
6584
6585/// Tries to get a FunctionDecl out of `E`. If it succeeds and we can take the
6586/// address of that function, this returns true. Otherwise, it returns false.
6587static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E) {
6588 auto *DRE = dyn_cast<DeclRefExpr>(E);
6589 if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
6590 return false;
6591
6593 cast<FunctionDecl>(DRE->getDecl()));
6594}
6595
6596/// Determine whether we can perform an elementwise array copy for this kind
6597/// of entity.
6598static bool canPerformArrayCopy(const InitializedEntity &Entity) {
6599 switch (Entity.getKind()) {
6601 // C++ [expr.prim.lambda]p24:
6602 // For array members, the array elements are direct-initialized in
6603 // increasing subscript order.
6604 return true;
6605
6607 // C++ [dcl.decomp]p1:
6608 // [...] each element is copy-initialized or direct-initialized from the
6609 // corresponding element of the assignment-expression [...]
6610 return isa<DecompositionDecl>(Entity.getDecl());
6611
6613 // C++ [class.copy.ctor]p14:
6614 // - if the member is an array, each element is direct-initialized with
6615 // the corresponding subobject of x
6616 return Entity.isImplicitMemberInitializer();
6617
6619 // All the above cases are intended to apply recursively, even though none
6620 // of them actually say that.
6621 if (auto *E = Entity.getParent())
6622 return canPerformArrayCopy(*E);
6623 break;
6624
6625 default:
6626 break;
6627 }
6628
6629 return false;
6630}
6631
6632static const FieldDecl *getConstField(const RecordDecl *RD) {
6633 assert(!isa<CXXRecordDecl>(RD) && "Only expect to call this in C mode");
6634 for (const FieldDecl *FD : RD->fields()) {
6635 // If the field is a flexible array member, we don't want to consider it
6636 // as a const field because there's no way to initialize the FAM anyway.
6637 const ASTContext &Ctx = FD->getASTContext();
6639 Ctx, FD, FD->getType(),
6640 Ctx.getLangOpts().getStrictFlexArraysLevel(),
6641 /*IgnoreTemplateOrMacroSubstitution=*/true))
6642 continue;
6643
6644 QualType QT = FD->getType();
6645 if (QT.isConstQualified())
6646 return FD;
6647 if (const auto *RD = QT->getAsRecordDecl()) {
6648 if (const FieldDecl *FD = getConstField(RD))
6649 return FD;
6650 }
6651 }
6652 return nullptr;
6653}
6654
6656 const InitializedEntity &Entity,
6657 const InitializationKind &Kind,
6658 MultiExprArg Args,
6659 bool TopLevelOfInitList,
6660 bool TreatUnavailableAsInvalid) {
6661 ASTContext &Context = S.Context;
6662
6663 // Eliminate non-overload placeholder types in the arguments. We
6664 // need to do this before checking whether types are dependent
6665 // because lowering a pseudo-object expression might well give us
6666 // something of dependent type.
6667 for (unsigned I = 0, E = Args.size(); I != E; ++I)
6668 if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
6669 // FIXME: should we be doing this here?
6670 ExprResult result = S.CheckPlaceholderExpr(Args[I]);
6671 if (result.isInvalid()) {
6673 return;
6674 }
6675 Args[I] = result.get();
6676 }
6677
6678 // C++0x [dcl.init]p16:
6679 // The semantics of initializers are as follows. The destination type is
6680 // the type of the object or reference being initialized and the source
6681 // type is the type of the initializer expression. The source type is not
6682 // defined when the initializer is a braced-init-list or when it is a
6683 // parenthesized list of expressions.
6684 QualType DestType = Entity.getType();
6685
6686 if (DestType->isDependentType() ||
6689 return;
6690 }
6691
6692 // Almost everything is a normal sequence.
6694
6695 QualType SourceType;
6696 Expr *Initializer = nullptr;
6697 if (Args.size() == 1) {
6698 Initializer = Args[0];
6699 if (S.getLangOpts().ObjC) {
6701 Initializer->getBeginLoc(), DestType, Initializer->getType(),
6702 Initializer) ||
6704 Args[0] = Initializer;
6705 }
6707 SourceType = Initializer->getType();
6708 }
6709
6710 // - If the initializer is a (non-parenthesized) braced-init-list, the
6711 // object is list-initialized (8.5.4).
6712 if (Kind.getKind() != InitializationKind::IK_Direct) {
6713 if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) {
6714 TryListInitialization(S, Entity, Kind, InitList, *this,
6715 TreatUnavailableAsInvalid);
6716 return;
6717 }
6718 }
6719
6720 if (!S.getLangOpts().CPlusPlus &&
6721 Kind.getKind() == InitializationKind::IK_Default) {
6722 if (RecordDecl *Rec = DestType->getAsRecordDecl()) {
6723 VarDecl *Var = dyn_cast_or_null<VarDecl>(Entity.getDecl());
6724 if (Rec->hasUninitializedExplicitInitFields()) {
6725 if (Var && !Initializer && !S.isUnevaluatedContext()) {
6726 S.Diag(Var->getLocation(), diag::warn_field_requires_explicit_init)
6727 << /* Var-in-Record */ 1 << Rec;
6729 }
6730 }
6731 // If the record has any members which are const (recursively checked),
6732 // then we want to diagnose those as being uninitialized if there is no
6733 // initializer present. However, we only do this for structure types, not
6734 // union types, because an unitialized field in a union is generally
6735 // reasonable, especially in C where unions can be used for type punning.
6736 if (Var && !Initializer && !Rec->isUnion() && !Rec->isInvalidDecl()) {
6737 if (const FieldDecl *FD = getConstField(Rec)) {
6738 unsigned DiagID = diag::warn_default_init_const_field_unsafe;
6739 if (Var->getStorageDuration() == SD_Static ||
6740 Var->getStorageDuration() == SD_Thread)
6741 DiagID = diag::warn_default_init_const_field;
6742
6743 bool EmitCppCompat = !S.Diags.isIgnored(
6744 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
6745 Var->getLocation());
6746
6747 S.Diag(Var->getLocation(), DiagID) << Var->getType() << EmitCppCompat;
6748 S.Diag(FD->getLocation(), diag::note_default_init_const_member) << FD;
6749 }
6750 }
6751 }
6752 }
6753
6754 // - If the destination type is a reference type, see 8.5.3.
6755 if (DestType->isReferenceType()) {
6756 // C++0x [dcl.init.ref]p1:
6757 // A variable declared to be a T& or T&&, that is, "reference to type T"
6758 // (8.3.2), shall be initialized by an object, or function, of type T or
6759 // by an object that can be converted into a T.
6760 // (Therefore, multiple arguments are not permitted.)
6761 if (Args.size() != 1)
6763 // C++17 [dcl.init.ref]p5:
6764 // A reference [...] is initialized by an expression [...] as follows:
6765 // If the initializer is not an expression, presumably we should reject,
6766 // but the standard fails to actually say so.
6767 else if (isa<InitListExpr>(Args[0]))
6769 else
6770 TryReferenceInitialization(S, Entity, Kind, Args[0], *this,
6771 TopLevelOfInitList);
6772 return;
6773 }
6774
6775 // - If the initializer is (), the object is value-initialized.
6776 if (Kind.getKind() == InitializationKind::IK_Value ||
6777 (Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) {
6778 TryValueInitialization(S, Entity, Kind, *this);
6779 return;
6780 }
6781
6782 // Handle default initialization.
6783 if (Kind.getKind() == InitializationKind::IK_Default) {
6784 TryDefaultInitialization(S, Entity, Kind, *this);
6785 return;
6786 }
6787
6788 // - If the destination type is an array of characters, an array of
6789 // char16_t, an array of char32_t, or an array of wchar_t, and the
6790 // initializer is a string literal, see 8.5.2.
6791 // - Otherwise, if the destination type is an array, the program is
6792 // ill-formed.
6793 // - Except in HLSL, where non-decaying array parameters behave like
6794 // non-array types for initialization.
6795 if (DestType->isArrayType() && !DestType->isArrayParameterType()) {
6796 const ArrayType *DestAT = Context.getAsArrayType(DestType);
6797 if (Initializer && isa<VariableArrayType>(DestAT)) {
6799 return;
6800 }
6801
6802 if (Initializer) {
6803 switch (IsStringInit(Initializer, DestAT, Context)) {
6804 case SIF_None:
6805 TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this);
6806 return;
6809 return;
6812 return;
6815 return;
6818 return;
6821 return;
6822 case SIF_Other:
6823 break;
6824 }
6825 }
6826
6827 if (S.getLangOpts().HLSL && Initializer && isa<ConstantArrayType>(DestAT)) {
6828 QualType SrcType = Entity.getType();
6829 if (SrcType->isArrayParameterType())
6830 SrcType =
6831 cast<ArrayParameterType>(SrcType)->getConstantArrayType(Context);
6832 if (S.Context.hasSameUnqualifiedType(DestType, SrcType)) {
6833 TryArrayCopy(S, Kind, Entity, Initializer, DestType, *this,
6834 TreatUnavailableAsInvalid);
6835 return;
6836 }
6837 }
6838
6839 // Some kinds of initialization permit an array to be initialized from
6840 // another array of the same type, and perform elementwise initialization.
6841 if (Initializer && isa<ConstantArrayType>(DestAT) &&
6843 Entity.getType()) &&
6844 canPerformArrayCopy(Entity)) {
6845 TryArrayCopy(S, Kind, Entity, Initializer, DestType, *this,
6846 TreatUnavailableAsInvalid);
6847 return;
6848 }
6849
6850 // Note: as an GNU C extension, we allow initialization of an
6851 // array from a compound literal that creates an array of the same
6852 // type, so long as the initializer has no side effects.
6853 if (!S.getLangOpts().CPlusPlus && Initializer &&
6854 isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) &&
6855 Initializer->getType()->isArrayType()) {
6856 const ArrayType *SourceAT
6857 = Context.getAsArrayType(Initializer->getType());
6858 if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT))
6860 else if (Initializer->HasSideEffects(S.Context))
6862 else {
6863 AddArrayInitStep(DestType, /*IsGNUExtension*/true);
6864 }
6865 }
6866 // Note: as a GNU C++ extension, we allow list-initialization of a
6867 // class member of array type from a parenthesized initializer list.
6868 else if (S.getLangOpts().CPlusPlus &&
6870 isa_and_nonnull<InitListExpr>(Initializer)) {
6872 *this, TreatUnavailableAsInvalid);
6874 } else if (S.getLangOpts().CPlusPlus20 && !TopLevelOfInitList &&
6875 Kind.getKind() == InitializationKind::IK_Direct)
6876 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
6877 /*VerifyOnly=*/true);
6878 else if (DestAT->getElementType()->isCharType())
6880 else if (IsWideCharCompatible(DestAT->getElementType(), Context))
6882 else
6884
6885 return;
6886 }
6887
6888 // Determine whether we should consider writeback conversions for
6889 // Objective-C ARC.
6890 bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount &&
6891 Entity.isParameterKind();
6892
6893 if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
6894 return;
6895
6896 // We're at the end of the line for C: it's either a write-back conversion
6897 // or it's a C assignment. There's no need to check anything else.
6898 if (!S.getLangOpts().CPlusPlus) {
6899 assert(Initializer && "Initializer must be non-null");
6900 // If allowed, check whether this is an Objective-C writeback conversion.
6901 if (allowObjCWritebackConversion &&
6902 tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
6903 return;
6904 }
6905
6906 if (TryOCLZeroOpaqueTypeInitialization(S, *this, DestType, Initializer))
6907 return;
6908
6909 // Handle initialization in C
6910 AddCAssignmentStep(DestType);
6911 MaybeProduceObjCObject(S, *this, Entity);
6912 return;
6913 }
6914
6915 assert(S.getLangOpts().CPlusPlus);
6916
6917 // - If the destination type is a (possibly cv-qualified) class type:
6918 if (DestType->isRecordType()) {
6919 // - If the initialization is direct-initialization, or if it is
6920 // copy-initialization where the cv-unqualified version of the
6921 // source type is the same class as, or a derived class of, the
6922 // class of the destination, constructors are considered. [...]
6923 if (Kind.getKind() == InitializationKind::IK_Direct ||
6924 (Kind.getKind() == InitializationKind::IK_Copy &&
6925 (Context.hasSameUnqualifiedType(SourceType, DestType) ||
6926 (Initializer && S.IsDerivedFrom(Initializer->getBeginLoc(),
6927 SourceType, DestType))))) {
6928 TryConstructorOrParenListInitialization(S, Entity, Kind, Args, DestType,
6929 *this, /*IsAggrListInit=*/false);
6930 } else {
6931 // - Otherwise (i.e., for the remaining copy-initialization cases),
6932 // user-defined conversion sequences that can convert from the
6933 // source type to the destination type or (when a conversion
6934 // function is used) to a derived class thereof are enumerated as
6935 // described in 13.3.1.4, and the best one is chosen through
6936 // overload resolution (13.3).
6937 assert(Initializer && "Initializer must be non-null");
6938 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
6939 TopLevelOfInitList);
6940 }
6941 return;
6942 }
6943
6944 assert(Args.size() >= 1 && "Zero-argument case handled above");
6945
6946 // For HLSL ext vector types we allow list initialization behavior for C++
6947 // functional cast expressions which look like constructor syntax. This is
6948 // accomplished by converting initialization arguments to InitListExpr.
6949 auto ShouldTryListInitialization = [&]() -> bool {
6950 // Only try list initialization for HLSL.
6951 if (!S.getLangOpts().HLSL)
6952 return false;
6953
6954 bool DestIsVec = DestType->isExtVectorType();
6955 bool DestIsMat = DestType->isConstantMatrixType();
6956
6957 // If the destination type is neither a vector nor a matrix, then don't try
6958 // list initialization.
6959 if (!DestIsVec && !DestIsMat)
6960 return false;
6961
6962 // If there is only a single source argument, then only try list
6963 // initialization if initializing a matrix with a vector or vice versa.
6964 if (Args.size() == 1) {
6965 assert(!SourceType.isNull() &&
6966 "Source QualType should not be null when arg size is exactly 1");
6967 bool SourceIsVec = SourceType->isExtVectorType();
6968 bool SourceIsMat = SourceType->isConstantMatrixType();
6969
6970 if (DestIsMat && !SourceIsVec)
6971 return false;
6972 if (DestIsVec && !SourceIsMat)
6973 return false;
6974 }
6975
6976 // Try list initialization if the source type is null or if the
6977 // destination and source types differ.
6978 return SourceType.isNull() ||
6979 !Context.hasSameUnqualifiedType(SourceType, DestType);
6980 };
6981 if (ShouldTryListInitialization()) {
6982 InitListExpr *ILE = new (Context)
6983 InitListExpr(S.getASTContext(), Args.front()->getBeginLoc(), Args,
6984 Args.back()->getEndLoc());
6985 ILE->setType(DestType);
6986 Args[0] = ILE;
6987 TryListInitialization(S, Entity, Kind, ILE, *this,
6988 TreatUnavailableAsInvalid);
6989 return;
6990 }
6991
6992 // The remaining cases all need a source type.
6993 if (Args.size() > 1) {
6995 return;
6996 } else if (isa<InitListExpr>(Args[0])) {
6998 return;
6999 }
7000
7001 // - Otherwise, if the source type is a (possibly cv-qualified) class
7002 // type, conversion functions are considered.
7003 if (!SourceType.isNull() && SourceType->isRecordType()) {
7004 assert(Initializer && "Initializer must be non-null");
7005 // For a conversion to _Atomic(T) from either T or a class type derived
7006 // from T, initialize the T object then convert to _Atomic type.
7007 bool NeedAtomicConversion = false;
7008 if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) {
7009 if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) ||
7010 S.IsDerivedFrom(Initializer->getBeginLoc(), SourceType,
7011 Atomic->getValueType())) {
7012 DestType = Atomic->getValueType();
7013 NeedAtomicConversion = true;
7014 }
7015 }
7016
7017 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
7018 TopLevelOfInitList);
7019 MaybeProduceObjCObject(S, *this, Entity);
7020 if (!Failed() && NeedAtomicConversion)
7022 return;
7023 }
7024
7025 // - Otherwise, if the initialization is direct-initialization, the source
7026 // type is std::nullptr_t, and the destination type is bool, the initial
7027 // value of the object being initialized is false.
7028 if (!SourceType.isNull() && SourceType->isNullPtrType() &&
7029 DestType->isBooleanType() &&
7030 Kind.getKind() == InitializationKind::IK_Direct) {
7033 Initializer->isGLValue()),
7034 DestType);
7035 return;
7036 }
7037
7038 // - Otherwise, the initial value of the object being initialized is the
7039 // (possibly converted) value of the initializer expression. Standard
7040 // conversions (Clause 4) will be used, if necessary, to convert the
7041 // initializer expression to the cv-unqualified version of the
7042 // destination type; no user-defined conversions are considered.
7043
7045 = S.TryImplicitConversion(Initializer, DestType,
7046 /*SuppressUserConversions*/true,
7047 Sema::AllowedExplicit::None,
7048 /*InOverloadResolution*/ false,
7049 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
7050 allowObjCWritebackConversion);
7051
7052 if (ICS.isStandard() &&
7054 // Objective-C ARC writeback conversion.
7055
7056 // We should copy unless we're passing to an argument explicitly
7057 // marked 'out'.
7058 bool ShouldCopy = true;
7059 if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
7060 ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
7061
7062 // If there was an lvalue adjustment, add it as a separate conversion.
7063 if (ICS.Standard.First == ICK_Array_To_Pointer ||
7066 LvalueICS.setStandard();
7068 LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
7069 LvalueICS.Standard.First = ICS.Standard.First;
7070 AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
7071 }
7072
7073 AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy);
7074 } else if (ICS.isBad()) {
7076 Initializer->getType() == Context.OverloadTy &&
7078 /*Complain=*/false, Found))
7080 else if (Initializer->getType()->isFunctionType() &&
7083 else
7085 } else {
7086 AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
7087
7088 MaybeProduceObjCObject(S, *this, Entity);
7089 }
7090}
7091
7093 for (auto &S : Steps)
7094 S.Destroy();
7095}
7096
7097//===----------------------------------------------------------------------===//
7098// Perform initialization
7099//===----------------------------------------------------------------------===//
7101 bool Diagnose = false) {
7102 switch(Entity.getKind()) {
7109
7111 if (Entity.getDecl() &&
7114
7116
7118 if (Entity.getDecl() &&
7121
7122 return !Diagnose ? AssignmentAction::Passing
7124
7126 case InitializedEntity::EK_StmtExprResult: // FIXME: Not quite right.
7128
7131 // FIXME: Can we tell apart casting vs. converting?
7133
7135 // This is really initialization, but refer to it as conversion for
7136 // consistency with CheckConvertedConstantExpression.
7138
7151 }
7152
7153 llvm_unreachable("Invalid EntityKind!");
7154}
7155
7156/// Whether we should bind a created object as a temporary when
7157/// initializing the given entity.
7190
7191/// Whether the given entity, when initialized with an object
7192/// created for that initialization, requires destruction.
7225
7226/// Get the location at which initialization diagnostics should appear.
7265
7266/// Make a (potentially elidable) temporary copy of the object
7267/// provided by the given initializer by calling the appropriate copy
7268/// constructor.
7269///
7270/// \param S The Sema object used for type-checking.
7271///
7272/// \param T The type of the temporary object, which must either be
7273/// the type of the initializer expression or a superclass thereof.
7274///
7275/// \param Entity The entity being initialized.
7276///
7277/// \param CurInit The initializer expression.
7278///
7279/// \param IsExtraneousCopy Whether this is an "extraneous" copy that
7280/// is permitted in C++03 (but not C++0x) when binding a reference to
7281/// an rvalue.
7282///
7283/// \returns An expression that copies the initializer expression into
7284/// a temporary object, or an error expression if a copy could not be
7285/// created.
7287 QualType T,
7288 const InitializedEntity &Entity,
7289 ExprResult CurInit,
7290 bool IsExtraneousCopy) {
7291 if (CurInit.isInvalid())
7292 return CurInit;
7293 // Determine which class type we're copying to.
7294 Expr *CurInitExpr = (Expr *)CurInit.get();
7295 auto *Class = T->getAsCXXRecordDecl();
7296 if (!Class)
7297 return CurInit;
7298
7299 SourceLocation Loc = getInitializationLoc(Entity, CurInit.get());
7300
7301 // Make sure that the type we are copying is complete.
7302 if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))
7303 return CurInit;
7304
7305 // Perform overload resolution using the class's constructors. Per
7306 // C++11 [dcl.init]p16, second bullet for class types, this initialization
7307 // is direct-initialization.
7310
7313 S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
7314 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
7315 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
7316 /*RequireActualConstructor=*/false,
7317 /*SecondStepOfCopyInit=*/true)) {
7318 case OR_Success:
7319 break;
7320
7322 CandidateSet.NoteCandidates(
7324 Loc, S.PDiag(IsExtraneousCopy && !S.isSFINAEContext()
7325 ? diag::ext_rvalue_to_reference_temp_copy_no_viable
7326 : diag::err_temp_copy_no_viable)
7327 << (int)Entity.getKind() << CurInitExpr->getType()
7328 << CurInitExpr->getSourceRange()),
7329 S, OCD_AllCandidates, CurInitExpr);
7330 if (!IsExtraneousCopy || S.isSFINAEContext())
7331 return ExprError();
7332 return CurInit;
7333
7334 case OR_Ambiguous:
7335 CandidateSet.NoteCandidates(
7336 PartialDiagnosticAt(Loc, S.PDiag(diag::err_temp_copy_ambiguous)
7337 << (int)Entity.getKind()
7338 << CurInitExpr->getType()
7339 << CurInitExpr->getSourceRange()),
7340 S, OCD_AmbiguousCandidates, CurInitExpr);
7341 return ExprError();
7342
7343 case OR_Deleted:
7344 S.Diag(Loc, diag::err_temp_copy_deleted)
7345 << (int)Entity.getKind() << CurInitExpr->getType()
7346 << CurInitExpr->getSourceRange();
7347 S.NoteDeletedFunction(Best->Function);
7348 return ExprError();
7349 }
7350
7351 bool HadMultipleCandidates = CandidateSet.size() > 1;
7352
7354 SmallVector<Expr*, 8> ConstructorArgs;
7355 CurInit.get(); // Ownership transferred into MultiExprArg, below.
7356
7357 S.CheckConstructorAccess(Loc, Constructor, Best->FoundDecl, Entity,
7358 IsExtraneousCopy);
7359
7360 if (IsExtraneousCopy) {
7361 // If this is a totally extraneous copy for C++03 reference
7362 // binding purposes, just return the original initialization
7363 // expression. We don't generate an (elided) copy operation here
7364 // because doing so would require us to pass down a flag to avoid
7365 // infinite recursion, where each step adds another extraneous,
7366 // elidable copy.
7367
7368 // Instantiate the default arguments of any extra parameters in
7369 // the selected copy constructor, as if we were going to create a
7370 // proper call to the copy constructor.
7371 for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
7372 ParmVarDecl *Parm = Constructor->getParamDecl(I);
7373 if (S.RequireCompleteType(Loc, Parm->getType(),
7374 diag::err_call_incomplete_argument))
7375 break;
7376
7377 // Build the default argument expression; we don't actually care
7378 // if this succeeds or not, because this routine will complain
7379 // if there was a problem.
7380 S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm);
7381 }
7382
7383 return CurInitExpr;
7384 }
7385
7386 // Determine the arguments required to actually perform the
7387 // constructor call (we might have derived-to-base conversions, or
7388 // the copy constructor may have default arguments).
7389 if (S.CompleteConstructorCall(Constructor, T, CurInitExpr, Loc,
7390 ConstructorArgs))
7391 return ExprError();
7392
7393 // C++0x [class.copy]p32:
7394 // When certain criteria are met, an implementation is allowed to
7395 // omit the copy/move construction of a class object, even if the
7396 // copy/move constructor and/or destructor for the object have
7397 // side effects. [...]
7398 // - when a temporary class object that has not been bound to a
7399 // reference (12.2) would be copied/moved to a class object
7400 // with the same cv-unqualified type, the copy/move operation
7401 // can be omitted by constructing the temporary object
7402 // directly into the target of the omitted copy/move
7403 //
7404 // Note that the other three bullets are handled elsewhere. Copy
7405 // elision for return statements and throw expressions are handled as part
7406 // of constructor initialization, while copy elision for exception handlers
7407 // is handled by the run-time.
7408 //
7409 // FIXME: If the function parameter is not the same type as the temporary, we
7410 // should still be able to elide the copy, but we don't have a way to
7411 // represent in the AST how much should be elided in this case.
7412 bool Elidable =
7413 CurInitExpr->isTemporaryObject(S.Context, Class) &&
7415 Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
7416 CurInitExpr->getType());
7417
7418 // Actually perform the constructor call.
7419 CurInit = S.BuildCXXConstructExpr(
7420 Loc, T, Best->FoundDecl, Constructor, Elidable, ConstructorArgs,
7421 HadMultipleCandidates,
7422 /*ListInit*/ false,
7423 /*StdInitListInit*/ false,
7424 /*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
7425
7426 // If we're supposed to bind temporaries, do so.
7427 if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity))
7428 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
7429 return CurInit;
7430}
7431
7432/// Check whether elidable copy construction for binding a reference to
7433/// a temporary would have succeeded if we were building in C++98 mode, for
7434/// -Wc++98-compat.
7436 const InitializedEntity &Entity,
7437 Expr *CurInitExpr) {
7438 assert(S.getLangOpts().CPlusPlus11);
7439
7440 auto *Record = CurInitExpr->getType()->getAsCXXRecordDecl();
7441 if (!Record)
7442 return;
7443
7444 SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr);
7445 if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))
7446 return;
7447
7448 // Find constructors which would have been considered.
7451
7452 // Perform overload resolution.
7455 S, Loc, CurInitExpr, CandidateSet, CurInitExpr->getType(), Ctors, Best,
7456 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
7457 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
7458 /*RequireActualConstructor=*/false,
7459 /*SecondStepOfCopyInit=*/true);
7460
7461 PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
7462 << OR << (int)Entity.getKind() << CurInitExpr->getType()
7463 << CurInitExpr->getSourceRange();
7464
7465 switch (OR) {
7466 case OR_Success:
7467 S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function),
7468 Best->FoundDecl, Entity, Diag);
7469 // FIXME: Check default arguments as far as that's possible.
7470 break;
7471
7473 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7474 OCD_AllCandidates, CurInitExpr);
7475 break;
7476
7477 case OR_Ambiguous:
7478 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7479 OCD_AmbiguousCandidates, CurInitExpr);
7480 break;
7481
7482 case OR_Deleted:
7483 S.Diag(Loc, Diag);
7484 S.NoteDeletedFunction(Best->Function);
7485 break;
7486 }
7487}
7488
7489void InitializationSequence::PrintInitLocationNote(Sema &S,
7490 const InitializedEntity &Entity) {
7491 if (Entity.isParamOrTemplateParamKind() && Entity.getDecl()) {
7492 if (Entity.getDecl()->getLocation().isInvalid())
7493 return;
7494
7495 if (Entity.getDecl()->getDeclName())
7496 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here)
7497 << Entity.getDecl()->getDeclName();
7498 else
7499 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here);
7500 }
7501 else if (Entity.getKind() == InitializedEntity::EK_RelatedResult &&
7502 Entity.getMethodDecl())
7503 S.Diag(Entity.getMethodDecl()->getLocation(),
7504 diag::note_method_return_type_change)
7505 << Entity.getMethodDecl()->getDeclName();
7506}
7507
7508/// Returns true if the parameters describe a constructor initialization of
7509/// an explicit temporary object, e.g. "Point(x, y)".
7510static bool isExplicitTemporary(const InitializedEntity &Entity,
7511 const InitializationKind &Kind,
7512 unsigned NumArgs) {
7513 switch (Entity.getKind()) {
7517 break;
7518 default:
7519 return false;
7520 }
7521
7522 switch (Kind.getKind()) {
7524 return true;
7525 // FIXME: Hack to work around cast weirdness.
7528 return NumArgs != 1;
7529 default:
7530 return false;
7531 }
7532}
7533
7534static ExprResult
7536 const InitializedEntity &Entity,
7537 const InitializationKind &Kind,
7538 MultiExprArg Args,
7539 const InitializationSequence::Step& Step,
7540 bool &ConstructorInitRequiresZeroInit,
7541 bool IsListInitialization,
7542 bool IsStdInitListInitialization,
7543 SourceLocation LBraceLoc,
7544 SourceLocation RBraceLoc) {
7545 unsigned NumArgs = Args.size();
7548 bool HadMultipleCandidates = Step.Function.HadMultipleCandidates;
7549
7550 // Build a call to the selected constructor.
7551 SmallVector<Expr*, 8> ConstructorArgs;
7552 SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
7553 ? Kind.getEqualLoc()
7554 : Kind.getLocation();
7555
7556 if (Kind.getKind() == InitializationKind::IK_Default) {
7557 // Force even a trivial, implicit default constructor to be
7558 // semantically checked. We do this explicitly because we don't build
7559 // the definition for completely trivial constructors.
7560 assert(Constructor->getParent() && "No parent class for constructor.");
7561 if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
7562 Constructor->isTrivial() && !Constructor->isUsed(false)) {
7563 S.runWithSufficientStackSpace(Loc, [&] {
7565 });
7566 }
7567 }
7568
7569 ExprResult CurInit((Expr *)nullptr);
7570
7571 // C++ [over.match.copy]p1:
7572 // - When initializing a temporary to be bound to the first parameter
7573 // of a constructor that takes a reference to possibly cv-qualified
7574 // T as its first argument, called with a single argument in the
7575 // context of direct-initialization, explicit conversion functions
7576 // are also considered.
7577 bool AllowExplicitConv =
7578 Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
7581
7582 // A smart pointer constructed from a nullable pointer is nullable.
7583 if (NumArgs == 1 && !Kind.isExplicitCast())
7585 Entity.getType(), Args.front()->getType(), Kind.getLocation());
7586
7587 // Determine the arguments required to actually perform the constructor
7588 // call.
7589 if (S.CompleteConstructorCall(Constructor, Step.Type, Args, Loc,
7590 ConstructorArgs, AllowExplicitConv,
7591 IsListInitialization))
7592 return ExprError();
7593
7594 if (isExplicitTemporary(Entity, Kind, NumArgs)) {
7595 // An explicitly-constructed temporary, e.g., X(1, 2).
7596 if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
7597 return ExprError();
7598
7599 if (Kind.getKind() == InitializationKind::IK_Value &&
7600 Constructor->isImplicit()) {
7601 auto *RD = Step.Type.getCanonicalType()->getAsCXXRecordDecl();
7602 if (RD && RD->isAggregate() && RD->hasUninitializedExplicitInitFields()) {
7603 unsigned I = 0;
7604 for (const FieldDecl *FD : RD->fields()) {
7605 if (I >= ConstructorArgs.size() && FD->hasAttr<ExplicitInitAttr>() &&
7606 !S.isUnevaluatedContext()) {
7607 S.Diag(Loc, diag::warn_field_requires_explicit_init)
7608 << /* Var-in-Record */ 0 << FD;
7609 S.Diag(FD->getLocation(), diag::note_entity_declared_at) << FD;
7610 }
7611 ++I;
7612 }
7613 }
7614 }
7615
7616 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
7617 if (!TSInfo)
7618 TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc);
7619 SourceRange ParenOrBraceRange =
7620 (Kind.getKind() == InitializationKind::IK_DirectList)
7621 ? SourceRange(LBraceLoc, RBraceLoc)
7622 : Kind.getParenOrBraceRange();
7623
7624 CXXConstructorDecl *CalleeDecl = Constructor;
7625 if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
7626 Step.Function.FoundDecl.getDecl())) {
7627 CalleeDecl = S.findInheritingConstructor(Loc, Constructor, Shadow);
7628 }
7629 S.MarkFunctionReferenced(Loc, CalleeDecl);
7630
7631 CurInit = S.CheckForImmediateInvocation(
7633 S.Context, CalleeDecl,
7634 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
7635 ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
7636 IsListInitialization, IsStdInitListInitialization,
7637 ConstructorInitRequiresZeroInit),
7638 CalleeDecl);
7639 } else {
7641
7642 if (Entity.getKind() == InitializedEntity::EK_Base) {
7643 ConstructKind = Entity.getBaseSpecifier()->isVirtual()
7646 } else if (Entity.getKind() == InitializedEntity::EK_Delegating) {
7647 ConstructKind = CXXConstructionKind::Delegating;
7648 }
7649
7650 // Only get the parenthesis or brace range if it is a list initialization or
7651 // direct construction.
7652 SourceRange ParenOrBraceRange;
7653 if (IsListInitialization)
7654 ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc);
7655 else if (Kind.getKind() == InitializationKind::IK_Direct)
7656 ParenOrBraceRange = Kind.getParenOrBraceRange();
7657
7658 // If the entity allows NRVO, mark the construction as elidable
7659 // unconditionally.
7660 if (Entity.allowsNRVO())
7661 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7662 Step.Function.FoundDecl,
7663 Constructor, /*Elidable=*/true,
7664 ConstructorArgs,
7665 HadMultipleCandidates,
7666 IsListInitialization,
7667 IsStdInitListInitialization,
7668 ConstructorInitRequiresZeroInit,
7669 ConstructKind,
7670 ParenOrBraceRange);
7671 else
7672 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7673 Step.Function.FoundDecl,
7675 ConstructorArgs,
7676 HadMultipleCandidates,
7677 IsListInitialization,
7678 IsStdInitListInitialization,
7679 ConstructorInitRequiresZeroInit,
7680 ConstructKind,
7681 ParenOrBraceRange);
7682 }
7683 if (CurInit.isInvalid())
7684 return ExprError();
7685
7686 // Only check access if all of that succeeded.
7689 return ExprError();
7690
7691 if (const ArrayType *AT = S.Context.getAsArrayType(Entity.getType()))
7693 return ExprError();
7694
7695 if (shouldBindAsTemporary(Entity))
7696 CurInit = S.MaybeBindToTemporary(CurInit.get());
7697
7698 return CurInit;
7699}
7700
7702 Expr *Init) {
7703 return sema::checkInitLifetime(*this, Entity, Init);
7704}
7705
7706static void DiagnoseNarrowingInInitList(Sema &S,
7707 const ImplicitConversionSequence &ICS,
7708 QualType PreNarrowingType,
7709 QualType EntityType,
7710 const Expr *PostInit);
7711
7712static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType,
7713 QualType ToType, Expr *Init);
7714
7715/// Provide warnings when std::move is used on construction.
7716static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr,
7717 bool IsReturnStmt) {
7718 if (!InitExpr)
7719 return;
7720
7722 return;
7723
7724 QualType DestType = InitExpr->getType();
7725 if (!DestType->isRecordType())
7726 return;
7727
7728 unsigned DiagID = 0;
7729 if (IsReturnStmt) {
7730 const CXXConstructExpr *CCE =
7731 dyn_cast<CXXConstructExpr>(InitExpr->IgnoreParens());
7732 if (!CCE || CCE->getNumArgs() != 1)
7733 return;
7734
7736 return;
7737
7738 InitExpr = CCE->getArg(0)->IgnoreImpCasts();
7739 }
7740
7741 // Find the std::move call and get the argument.
7742 const CallExpr *CE = dyn_cast<CallExpr>(InitExpr->IgnoreParens());
7743 if (!CE || !CE->isCallToStdMove())
7744 return;
7745
7746 const Expr *Arg = CE->getArg(0)->IgnoreImplicit();
7747
7748 if (IsReturnStmt) {
7749 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts());
7750 if (!DRE || DRE->refersToEnclosingVariableOrCapture())
7751 return;
7752
7753 const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
7754 if (!VD || !VD->hasLocalStorage())
7755 return;
7756
7757 // __block variables are not moved implicitly.
7758 if (VD->hasAttr<BlocksAttr>())
7759 return;
7760
7761 QualType SourceType = VD->getType();
7762 if (!SourceType->isRecordType())
7763 return;
7764
7765 if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
7766 return;
7767 }
7768
7769 // If we're returning a function parameter, copy elision
7770 // is not possible.
7771 if (isa<ParmVarDecl>(VD))
7772 DiagID = diag::warn_redundant_move_on_return;
7773 else
7774 DiagID = diag::warn_pessimizing_move_on_return;
7775 } else {
7776 DiagID = diag::warn_pessimizing_move_on_initialization;
7777 const Expr *ArgStripped = Arg->IgnoreImplicit()->IgnoreParens();
7778 if (!ArgStripped->isPRValue() || !ArgStripped->getType()->isRecordType())
7779 return;
7780 }
7781
7782 S.Diag(CE->getBeginLoc(), DiagID);
7783
7784 // Get all the locations for a fix-it. Don't emit the fix-it if any location
7785 // is within a macro.
7786 SourceLocation CallBegin = CE->getCallee()->getBeginLoc();
7787 if (CallBegin.isMacroID())
7788 return;
7789 SourceLocation RParen = CE->getRParenLoc();
7790 if (RParen.isMacroID())
7791 return;
7792 SourceLocation LParen;
7793 SourceLocation ArgLoc = Arg->getBeginLoc();
7794
7795 // Special testing for the argument location. Since the fix-it needs the
7796 // location right before the argument, the argument location can be in a
7797 // macro only if it is at the beginning of the macro.
7798 while (ArgLoc.isMacroID() &&
7801 }
7802
7803 if (LParen.isMacroID())
7804 return;
7805
7806 LParen = ArgLoc.getLocWithOffset(-1);
7807
7808 S.Diag(CE->getBeginLoc(), diag::note_remove_move)
7809 << FixItHint::CreateRemoval(SourceRange(CallBegin, LParen))
7810 << FixItHint::CreateRemoval(SourceRange(RParen, RParen));
7811}
7812
7813static void CheckForNullPointerDereference(Sema &S, const Expr *E) {
7814 // Check to see if we are dereferencing a null pointer. If so, this is
7815 // undefined behavior, so warn about it. This only handles the pattern
7816 // "*null", which is a very syntactic check.
7817 if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts()))
7818 if (UO->getOpcode() == UO_Deref &&
7819 UO->getSubExpr()->IgnoreParenCasts()->
7820 isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) {
7821 S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
7822 S.PDiag(diag::warn_binding_null_to_reference)
7823 << UO->getSubExpr()->getSourceRange());
7824 }
7825}
7826
7829 bool BoundToLvalueReference) {
7830 auto MTE = new (Context)
7831 MaterializeTemporaryExpr(T, Temporary, BoundToLvalueReference);
7832
7833 // Order an ExprWithCleanups for lifetime marks.
7834 //
7835 // TODO: It'll be good to have a single place to check the access of the
7836 // destructor and generate ExprWithCleanups for various uses. Currently these
7837 // are done in both CreateMaterializeTemporaryExpr and MaybeBindToTemporary,
7838 // but there may be a chance to merge them.
7839 Cleanup.setExprNeedsCleanups(false);
7842 return MTE;
7843}
7844
7846 // In C++98, we don't want to implicitly create an xvalue. C11 added the
7847 // same rule, but C99 is broken without this behavior and so we treat the
7848 // change as applying to all C language modes.
7849 // FIXME: This means that AST consumers need to deal with "prvalues" that
7850 // denote materialized temporaries. Maybe we should add another ValueKind
7851 // for "xvalue pretending to be a prvalue" for C++98 support.
7852 if (!E->isPRValue() ||
7854 return E;
7855
7856 // C++1z [conv.rval]/1: T shall be a complete type.
7857 // FIXME: Does this ever matter (can we form a prvalue of incomplete type)?
7858 // If so, we should check for a non-abstract class type here too.
7859 QualType T = E->getType();
7860 if (RequireCompleteType(E->getExprLoc(), T, diag::err_incomplete_type))
7861 return ExprError();
7862
7863 return CreateMaterializeTemporaryExpr(E->getType(), E, false);
7864}
7865
7869
7870 CastKind CK = CK_NoOp;
7871
7872 if (VK == VK_PRValue) {
7873 auto PointeeTy = Ty->getPointeeType();
7874 auto ExprPointeeTy = E->getType()->getPointeeType();
7875 if (!PointeeTy.isNull() &&
7876 PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7877 CK = CK_AddressSpaceConversion;
7878 } else if (Ty.getAddressSpace() != E->getType().getAddressSpace()) {
7879 CK = CK_AddressSpaceConversion;
7880 }
7881
7882 return ImpCastExprToType(E, Ty, CK, VK, /*BasePath=*/nullptr, CCK);
7883}
7884
7886 const InitializedEntity &Entity,
7887 const InitializationKind &Kind,
7888 MultiExprArg Args,
7889 QualType *ResultType) {
7890 if (Failed()) {
7891 Diagnose(S, Entity, Kind, Args);
7892 return ExprError();
7893 }
7894 if (!ZeroInitializationFixit.empty()) {
7895 const Decl *D = Entity.getDecl();
7896 const auto *VD = dyn_cast_or_null<VarDecl>(D);
7897 QualType DestType = Entity.getType();
7898
7899 // The initialization would have succeeded with this fixit. Since the fixit
7900 // is on the error, we need to build a valid AST in this case, so this isn't
7901 // handled in the Failed() branch above.
7902 if (!DestType->isRecordType() && VD && VD->isConstexpr()) {
7903 // Use a more useful diagnostic for constexpr variables.
7904 S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
7905 << VD
7906 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7907 ZeroInitializationFixit);
7908 } else {
7909 unsigned DiagID = diag::err_default_init_const;
7910 if (S.getLangOpts().MSVCCompat && D && D->hasAttr<SelectAnyAttr>())
7911 DiagID = diag::ext_default_init_const;
7912
7913 S.Diag(Kind.getLocation(), DiagID)
7914 << DestType << DestType->isRecordType()
7915 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7916 ZeroInitializationFixit);
7917 }
7918 }
7919
7920 if (getKind() == DependentSequence) {
7921 // If the declaration is a non-dependent, incomplete array type
7922 // that has an initializer, then its type will be completed once
7923 // the initializer is instantiated.
7924 if (ResultType && !Entity.getType()->isDependentType() &&
7925 Args.size() == 1) {
7926 QualType DeclType = Entity.getType();
7927 if (const IncompleteArrayType *ArrayT
7928 = S.Context.getAsIncompleteArrayType(DeclType)) {
7929 // FIXME: We don't currently have the ability to accurately
7930 // compute the length of an initializer list without
7931 // performing full type-checking of the initializer list
7932 // (since we have to determine where braces are implicitly
7933 // introduced and such). So, we fall back to making the array
7934 // type a dependently-sized array type with no specified
7935 // bound.
7936 if (isa<InitListExpr>((Expr *)Args[0]))
7937 *ResultType = S.Context.getDependentSizedArrayType(
7938 ArrayT->getElementType(),
7939 /*NumElts=*/nullptr, ArrayT->getSizeModifier(),
7940 ArrayT->getIndexTypeCVRQualifiers());
7941 }
7942 }
7943 if (Kind.getKind() == InitializationKind::IK_Direct &&
7944 !Kind.isExplicitCast()) {
7945 // Rebuild the ParenListExpr.
7946 SourceRange ParenRange = Kind.getParenOrBraceRange();
7947 return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(),
7948 Args);
7949 }
7950 assert(Kind.getKind() == InitializationKind::IK_Copy ||
7951 Kind.isExplicitCast() ||
7952 Kind.getKind() == InitializationKind::IK_DirectList);
7953 return ExprResult(Args[0]);
7954 }
7955
7956 // No steps means no initialization.
7957 if (Steps.empty())
7958 return ExprResult((Expr *)nullptr);
7959
7960 if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() &&
7961 Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
7962 !Entity.isParamOrTemplateParamKind()) {
7963 // Produce a C++98 compatibility warning if we are initializing a reference
7964 // from an initializer list. For parameters, we produce a better warning
7965 // elsewhere.
7966 Expr *Init = Args[0];
7967 S.Diag(Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7968 << Init->getSourceRange();
7969 }
7970
7971 if (S.getLangOpts().MicrosoftExt && Args.size() == 1 &&
7972 isa<PredefinedExpr>(Args[0]) && Entity.getType()->isArrayType()) {
7973 // Produce a Microsoft compatibility warning when initializing from a
7974 // predefined expression since MSVC treats predefined expressions as string
7975 // literals.
7976 Expr *Init = Args[0];
7977 S.Diag(Init->getBeginLoc(), diag::ext_init_from_predefined) << Init;
7978 }
7979
7980 // OpenCL v2.0 s6.13.11.1. atomic variables can be initialized in global scope
7981 QualType ETy = Entity.getType();
7982 bool HasGlobalAS = ETy.hasAddressSpace() &&
7984
7985 if (S.getLangOpts().OpenCLVersion >= 200 &&
7986 ETy->isAtomicType() && !HasGlobalAS &&
7987 Entity.getKind() == InitializedEntity::EK_Variable && Args.size() > 0) {
7988 S.Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
7989 << 1
7990 << SourceRange(Entity.getDecl()->getBeginLoc(), Args[0]->getEndLoc());
7991 return ExprError();
7992 }
7993
7994 QualType DestType = Entity.getType().getNonReferenceType();
7995 // FIXME: Ugly hack around the fact that Entity.getType() is not
7996 // the same as Entity.getDecl()->getType() in cases involving type merging,
7997 // and we want latter when it makes sense.
7998 if (ResultType)
7999 *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() :
8000 Entity.getType();
8001
8002 ExprResult CurInit((Expr *)nullptr);
8003 SmallVector<Expr*, 4> ArrayLoopCommonExprs;
8004
8005 // HLSL allows vector/matrix initialization to function like list
8006 // initialization, but use the syntax of a C++-like constructor.
8007 bool IsHLSLVectorOrMatrixInit =
8008 S.getLangOpts().HLSL &&
8009 (DestType->isExtVectorType() || DestType->isConstantMatrixType()) &&
8010 isa<InitListExpr>(Args[0]);
8011 (void)IsHLSLVectorOrMatrixInit;
8012
8013 // For initialization steps that start with a single initializer,
8014 // grab the only argument out the Args and place it into the "current"
8015 // initializer.
8016 switch (Steps.front().Kind) {
8021 case SK_BindReference:
8023 case SK_FinalCopy:
8025 case SK_UserConversion:
8034 case SK_UnwrapInitList:
8035 case SK_RewrapInitList:
8036 case SK_CAssignment:
8037 case SK_StringInit:
8039 case SK_ArrayLoopIndex:
8040 case SK_ArrayLoopInit:
8041 case SK_ArrayInit:
8042 case SK_GNUArrayInit:
8048 case SK_OCLSamplerInit:
8049 case SK_OCLZeroOpaqueType: {
8050 assert(Args.size() == 1 || IsHLSLVectorOrMatrixInit);
8051 CurInit = Args[0];
8052 if (!CurInit.get()) return ExprError();
8053 break;
8054 }
8055
8061 break;
8062 }
8063
8064 // Promote from an unevaluated context to an unevaluated list context in
8065 // C++11 list-initialization; we need to instantiate entities usable in
8066 // constant expressions here in order to perform narrowing checks =(
8069 isa_and_nonnull<InitListExpr>(CurInit.get()));
8070
8071 // C++ [class.abstract]p2:
8072 // no objects of an abstract class can be created except as subobjects
8073 // of a class derived from it
8074 auto checkAbstractType = [&](QualType T) -> bool {
8075 if (Entity.getKind() == InitializedEntity::EK_Base ||
8077 return false;
8078 return S.RequireNonAbstractType(Kind.getLocation(), T,
8079 diag::err_allocation_of_abstract_type);
8080 };
8081
8082 // Walk through the computed steps for the initialization sequence,
8083 // performing the specified conversions along the way.
8084 bool ConstructorInitRequiresZeroInit = false;
8085 for (step_iterator Step = step_begin(), StepEnd = step_end();
8086 Step != StepEnd; ++Step) {
8087 if (CurInit.isInvalid())
8088 return ExprError();
8089
8090 QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType();
8091
8092 switch (Step->Kind) {
8094 // Overload resolution determined which function invoke; update the
8095 // initializer to reflect that choice.
8097 if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()))
8098 return ExprError();
8099 CurInit = S.FixOverloadedFunctionReference(CurInit,
8102 // We might get back another placeholder expression if we resolved to a
8103 // builtin.
8104 if (!CurInit.isInvalid())
8105 CurInit = S.CheckPlaceholderExpr(CurInit.get());
8106 break;
8107
8111 // We have a derived-to-base cast that produces either an rvalue or an
8112 // lvalue. Perform that cast.
8113
8114 CXXCastPath BasePath;
8115
8116 // Casts to inaccessible base classes are allowed with C-style casts.
8117 bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
8119 SourceType, Step->Type, CurInit.get()->getBeginLoc(),
8120 CurInit.get()->getSourceRange(), &BasePath, IgnoreBaseAccess))
8121 return ExprError();
8122
8125 ? VK_LValue
8127 : VK_PRValue);
8129 CK_DerivedToBase, CurInit.get(),
8130 &BasePath, VK, FPOptionsOverride());
8131 break;
8132 }
8133
8134 case SK_BindReference:
8135 // Reference binding does not have any corresponding ASTs.
8136
8137 // Check exception specifications
8138 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
8139 return ExprError();
8140
8141 // We don't check for e.g. function pointers here, since address
8142 // availability checks should only occur when the function first decays
8143 // into a pointer or reference.
8144 if (CurInit.get()->getType()->isFunctionProtoType()) {
8145 if (auto *DRE = dyn_cast<DeclRefExpr>(CurInit.get()->IgnoreParens())) {
8146 if (auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
8147 if (!S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
8148 DRE->getBeginLoc()))
8149 return ExprError();
8150 }
8151 }
8152 }
8153
8154 CheckForNullPointerDereference(S, CurInit.get());
8155 break;
8156
8158 // Make sure the "temporary" is actually an rvalue.
8159 assert(CurInit.get()->isPRValue() && "not a temporary");
8160
8161 // Check exception specifications
8162 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
8163 return ExprError();
8164
8165 QualType MTETy = Step->Type;
8166
8167 // When this is an incomplete array type (such as when this is
8168 // initializing an array of unknown bounds from an init list), use THAT
8169 // type instead so that we propagate the array bounds.
8170 if (MTETy->isIncompleteArrayType() &&
8171 !CurInit.get()->getType()->isIncompleteArrayType() &&
8174 CurInit.get()->getType()->getPointeeOrArrayElementType()))
8175 MTETy = CurInit.get()->getType();
8176
8177 // Materialize the temporary into memory.
8179 MTETy, CurInit.get(), Entity.getType()->isLValueReferenceType());
8180 CurInit = MTE;
8181
8182 // If we're extending this temporary to automatic storage duration -- we
8183 // need to register its cleanup during the full-expression's cleanups.
8184 if (MTE->getStorageDuration() == SD_Automatic &&
8185 MTE->getType().isDestructedType())
8187 break;
8188 }
8189
8190 case SK_FinalCopy:
8191 if (checkAbstractType(Step->Type))
8192 return ExprError();
8193
8194 // If the overall initialization is initializing a temporary, we already
8195 // bound our argument if it was necessary to do so. If not (if we're
8196 // ultimately initializing a non-temporary), our argument needs to be
8197 // bound since it's initializing a function parameter.
8198 // FIXME: This is a mess. Rationalize temporary destruction.
8199 if (!shouldBindAsTemporary(Entity))
8200 CurInit = S.MaybeBindToTemporary(CurInit.get());
8201 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
8202 /*IsExtraneousCopy=*/false);
8203 break;
8204
8206 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
8207 /*IsExtraneousCopy=*/true);
8208 break;
8209
8210 case SK_UserConversion: {
8211 // We have a user-defined conversion that invokes either a constructor
8212 // or a conversion function.
8216 bool HadMultipleCandidates = Step->Function.HadMultipleCandidates;
8217 bool CreatedObject = false;
8218 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
8219 // Build a call to the selected constructor.
8220 SmallVector<Expr*, 8> ConstructorArgs;
8221 SourceLocation Loc = CurInit.get()->getBeginLoc();
8222
8223 // Determine the arguments required to actually perform the constructor
8224 // call.
8225 Expr *Arg = CurInit.get();
8227 MultiExprArg(&Arg, 1), Loc,
8228 ConstructorArgs))
8229 return ExprError();
8230
8231 // Build an expression that constructs a temporary.
8232 CurInit = S.BuildCXXConstructExpr(
8233 Loc, Step->Type, FoundFn, Constructor, ConstructorArgs,
8234 HadMultipleCandidates,
8235 /*ListInit*/ false,
8236 /*StdInitListInit*/ false,
8237 /*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
8238 if (CurInit.isInvalid())
8239 return ExprError();
8240
8241 S.CheckConstructorAccess(Kind.getLocation(), Constructor, FoundFn,
8242 Entity);
8243 if (S.DiagnoseUseOfOverloadedDecl(Constructor, Kind.getLocation()))
8244 return ExprError();
8245
8246 CastKind = CK_ConstructorConversion;
8247 CreatedObject = true;
8248 } else {
8249 // Build a call to the conversion function.
8251 S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr,
8252 FoundFn);
8253 if (S.DiagnoseUseOfOverloadedDecl(Conversion, Kind.getLocation()))
8254 return ExprError();
8255
8256 CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion,
8257 HadMultipleCandidates);
8258 if (CurInit.isInvalid())
8259 return ExprError();
8260
8261 CastKind = CK_UserDefinedConversion;
8262 CreatedObject = Conversion->getReturnType()->isRecordType();
8263 }
8264
8265 if (CreatedObject && checkAbstractType(CurInit.get()->getType()))
8266 return ExprError();
8267
8268 CurInit = ImplicitCastExpr::Create(
8269 S.Context, CurInit.get()->getType(), CastKind, CurInit.get(), nullptr,
8270 CurInit.get()->getValueKind(), S.CurFPFeatureOverrides());
8271
8272 if (shouldBindAsTemporary(Entity))
8273 // The overall entity is temporary, so this expression should be
8274 // destroyed at the end of its full-expression.
8275 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
8276 else if (CreatedObject && shouldDestroyEntity(Entity)) {
8277 // The object outlasts the full-expression, but we need to prepare for
8278 // a destructor being run on it.
8279 // FIXME: It makes no sense to do this here. This should happen
8280 // regardless of how we initialized the entity.
8281 QualType T = CurInit.get()->getType();
8282 if (auto *Record = T->castAsCXXRecordDecl()) {
8285 S.PDiag(diag::err_access_dtor_temp) << T);
8287 if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getBeginLoc()))
8288 return ExprError();
8289 }
8290 }
8291 break;
8292 }
8293
8297 // Perform a qualification conversion; these can never go wrong.
8300 ? VK_LValue
8302 : VK_PRValue);
8303 CurInit = S.PerformQualificationConversion(CurInit.get(), Step->Type, VK);
8304 break;
8305 }
8306
8308 assert(CurInit.get()->isLValue() &&
8309 "function reference should be lvalue");
8310 CurInit =
8311 S.ImpCastExprToType(CurInit.get(), Step->Type, CK_NoOp, VK_LValue);
8312 break;
8313
8314 case SK_AtomicConversion: {
8315 assert(CurInit.get()->isPRValue() && "cannot convert glvalue to atomic");
8316 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8317 CK_NonAtomicToAtomic, VK_PRValue);
8318 break;
8319 }
8320
8323 if (const auto *FromPtrType =
8324 CurInit.get()->getType()->getAs<PointerType>()) {
8325 if (const auto *ToPtrType = Step->Type->getAs<PointerType>()) {
8326 if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
8327 !ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
8328 // Do not check static casts here because they are checked earlier
8329 // in Sema::ActOnCXXNamedCast()
8330 if (!Kind.isStaticCast()) {
8331 S.Diag(CurInit.get()->getExprLoc(),
8332 diag::warn_noderef_to_dereferenceable_pointer)
8333 << CurInit.get()->getSourceRange();
8334 }
8335 }
8336 }
8337 }
8338 Expr *Init = CurInit.get();
8340 Kind.isCStyleCast() ? CheckedConversionKind::CStyleCast
8341 : Kind.isFunctionalCast() ? CheckedConversionKind::FunctionalCast
8342 : Kind.isExplicitCast() ? CheckedConversionKind::OtherCast
8344 ExprResult CurInitExprRes = S.PerformImplicitConversion(
8345 Init, Step->Type, *Step->ICS, getAssignmentAction(Entity), CCK);
8346 if (CurInitExprRes.isInvalid())
8347 return ExprError();
8348
8350
8351 CurInit = CurInitExprRes;
8352
8354 S.getLangOpts().CPlusPlus)
8355 DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
8356 CurInit.get());
8357
8358 break;
8359 }
8360
8361 case SK_ListInitialization: {
8362 if (checkAbstractType(Step->Type))
8363 return ExprError();
8364
8365 InitListExpr *InitList = cast<InitListExpr>(CurInit.get());
8366 // If we're not initializing the top-level entity, we need to create an
8367 // InitializeTemporary entity for our target type.
8368 QualType Ty = Step->Type;
8369 bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty);
8370 InitializedEntity InitEntity =
8371 IsTemporary ? InitializedEntity::InitializeTemporary(Ty) : Entity;
8372 InitListChecker PerformInitList(S, InitEntity,
8373 InitList, Ty, /*VerifyOnly=*/false,
8374 /*TreatUnavailableAsInvalid=*/false);
8375 if (PerformInitList.HadError())
8376 return ExprError();
8377
8378 // Hack: We must update *ResultType if available in order to set the
8379 // bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'.
8380 // Worst case: 'const int (&arref)[] = {1, 2, 3};'.
8381 if (ResultType &&
8382 ResultType->getNonReferenceType()->isIncompleteArrayType()) {
8383 if ((*ResultType)->isRValueReferenceType())
8385 else if ((*ResultType)->isLValueReferenceType())
8387 (*ResultType)->castAs<LValueReferenceType>()->isSpelledAsLValue());
8388 *ResultType = Ty;
8389 }
8390
8391 InitListExpr *StructuredInitList =
8392 PerformInitList.getFullyStructuredList();
8393 CurInit = shouldBindAsTemporary(InitEntity)
8394 ? S.MaybeBindToTemporary(StructuredInitList)
8395 : StructuredInitList;
8396 break;
8397 }
8398
8400 if (checkAbstractType(Step->Type))
8401 return ExprError();
8402
8403 // When an initializer list is passed for a parameter of type "reference
8404 // to object", we don't get an EK_Temporary entity, but instead an
8405 // EK_Parameter entity with reference type.
8406 // FIXME: This is a hack. What we really should do is create a user
8407 // conversion step for this case, but this makes it considerably more
8408 // complicated. For now, this will do.
8410 Entity.getType().getNonReferenceType());
8411 bool UseTemporary = Entity.getType()->isReferenceType();
8412 assert(Args.size() == 1 && "expected a single argument for list init");
8413 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
8414 S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8415 << InitList->getSourceRange();
8416 MultiExprArg Arg(InitList->getInits(), InitList->getNumInits());
8417 CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity :
8418 Entity,
8419 Kind, Arg, *Step,
8420 ConstructorInitRequiresZeroInit,
8421 /*IsListInitialization*/true,
8422 /*IsStdInitListInit*/false,
8423 InitList->getLBraceLoc(),
8424 InitList->getRBraceLoc());
8425 break;
8426 }
8427
8428 case SK_UnwrapInitList:
8429 CurInit = cast<InitListExpr>(CurInit.get())->getInit(0);
8430 break;
8431
8432 case SK_RewrapInitList: {
8433 Expr *E = CurInit.get();
8435 InitListExpr *ILE = new (S.Context) InitListExpr(S.Context,
8436 Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc());
8437 ILE->setSyntacticForm(Syntactic);
8438 ILE->setType(E->getType());
8439 ILE->setValueKind(E->getValueKind());
8440 CurInit = ILE;
8441 break;
8442 }
8443
8446 if (checkAbstractType(Step->Type))
8447 return ExprError();
8448
8449 // When an initializer list is passed for a parameter of type "reference
8450 // to object", we don't get an EK_Temporary entity, but instead an
8451 // EK_Parameter entity with reference type.
8452 // FIXME: This is a hack. What we really should do is create a user
8453 // conversion step for this case, but this makes it considerably more
8454 // complicated. For now, this will do.
8456 Entity.getType().getNonReferenceType());
8457 bool UseTemporary = Entity.getType()->isReferenceType();
8458 bool IsStdInitListInit =
8460 Expr *Source = CurInit.get();
8461 SourceRange Range = Kind.hasParenOrBraceRange()
8462 ? Kind.getParenOrBraceRange()
8463 : SourceRange();
8465 S, UseTemporary ? TempEntity : Entity, Kind,
8466 Source ? MultiExprArg(Source) : Args, *Step,
8467 ConstructorInitRequiresZeroInit,
8468 /*IsListInitialization*/ IsStdInitListInit,
8469 /*IsStdInitListInitialization*/ IsStdInitListInit,
8470 /*LBraceLoc*/ Range.getBegin(),
8471 /*RBraceLoc*/ Range.getEnd());
8472 break;
8473 }
8474
8475 case SK_ZeroInitialization: {
8476 step_iterator NextStep = Step;
8477 ++NextStep;
8478 if (NextStep != StepEnd &&
8479 (NextStep->Kind == SK_ConstructorInitialization ||
8480 NextStep->Kind == SK_ConstructorInitializationFromList)) {
8481 // The need for zero-initialization is recorded directly into
8482 // the call to the object's constructor within the next step.
8483 ConstructorInitRequiresZeroInit = true;
8484 } else if (Kind.getKind() == InitializationKind::IK_Value &&
8485 S.getLangOpts().CPlusPlus &&
8486 !Kind.isImplicitValueInit()) {
8487 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
8488 if (!TSInfo)
8490 Kind.getRange().getBegin());
8491
8492 CurInit = new (S.Context) CXXScalarValueInitExpr(
8493 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
8494 Kind.getRange().getEnd());
8495 } else {
8496 CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type);
8497 // Note the return value isn't used to return a ExprError() when
8498 // initialization fails . For struct initialization allows all field
8499 // assignments to be checked rather than bailing on the first error.
8500 S.BoundsSafetyCheckInitialization(Entity, Kind,
8502 Step->Type, CurInit.get());
8503 }
8504 break;
8505 }
8506
8507 case SK_CAssignment: {
8508 QualType SourceType = CurInit.get()->getType();
8509 Expr *Init = CurInit.get();
8510
8511 // Save off the initial CurInit in case we need to emit a diagnostic
8512 ExprResult InitialCurInit = Init;
8515 Step->Type, Result, true,
8517 if (Result.isInvalid())
8518 return ExprError();
8519 CurInit = Result;
8520
8521 // If this is a call, allow conversion to a transparent union.
8522 ExprResult CurInitExprRes = CurInit;
8523 if (!S.IsAssignConvertCompatible(ConvTy) && Entity.isParameterKind() &&
8525 Step->Type, CurInitExprRes) == AssignConvertType::Compatible)
8527 if (CurInitExprRes.isInvalid())
8528 return ExprError();
8529 CurInit = CurInitExprRes;
8530
8531 if (S.getLangOpts().C23 && initializingConstexprVariable(Entity)) {
8532 CheckC23ConstexprInitConversion(S, SourceType, Entity.getType(),
8533 CurInit.get());
8534
8535 // C23 6.7.1p6: If an object or subobject declared with storage-class
8536 // specifier constexpr has pointer, integer, or arithmetic type, any
8537 // explicit initializer value for it shall be null, an integer
8538 // constant expression, or an arithmetic constant expression,
8539 // respectively.
8541 if (Entity.getType()->getAs<PointerType>() &&
8542 CurInit.get()->EvaluateAsRValue(ER, S.Context) &&
8543 (ER.Val.isLValue() && !ER.Val.isNullPointer())) {
8544 S.Diag(Kind.getLocation(), diag::err_c23_constexpr_pointer_not_null);
8545 return ExprError();
8546 }
8547 }
8548
8549 // Note the return value isn't used to return a ExprError() when
8550 // initialization fails. For struct initialization this allows all field
8551 // assignments to be checked rather than bailing on the first error.
8552 S.BoundsSafetyCheckInitialization(Entity, Kind,
8553 getAssignmentAction(Entity, true),
8554 Step->Type, InitialCurInit.get());
8555
8556 bool Complained;
8557 if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
8558 Step->Type, SourceType,
8559 InitialCurInit.get(),
8560 getAssignmentAction(Entity, true),
8561 &Complained)) {
8562 PrintInitLocationNote(S, Entity);
8563 return ExprError();
8564 } else if (Complained)
8565 PrintInitLocationNote(S, Entity);
8566 break;
8567 }
8568
8569 case SK_StringInit: {
8570 QualType Ty = Step->Type;
8571 bool UpdateType = ResultType && Entity.getType()->isIncompleteArrayType();
8572 CheckStringInit(CurInit.get(), UpdateType ? *ResultType : Ty,
8573 S.Context.getAsArrayType(Ty), S, Entity,
8574 S.getLangOpts().C23 &&
8576 break;
8577 }
8578
8580 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8581 CK_ObjCObjectLValueCast,
8582 CurInit.get()->getValueKind());
8583 break;
8584
8585 case SK_ArrayLoopIndex: {
8586 Expr *Cur = CurInit.get();
8587 Expr *BaseExpr = new (S.Context)
8588 OpaqueValueExpr(Cur->getExprLoc(), Cur->getType(),
8589 Cur->getValueKind(), Cur->getObjectKind(), Cur);
8590 Expr *IndexExpr =
8593 BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8594 ArrayLoopCommonExprs.push_back(BaseExpr);
8595 break;
8596 }
8597
8598 case SK_ArrayLoopInit: {
8599 assert(!ArrayLoopCommonExprs.empty() &&
8600 "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8601 Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8602 CurInit = new (S.Context) ArrayInitLoopExpr(Step->Type, Common,
8603 CurInit.get());
8604 break;
8605 }
8606
8607 case SK_GNUArrayInit:
8608 // Okay: we checked everything before creating this step. Note that
8609 // this is a GNU extension.
8610 S.Diag(Kind.getLocation(), diag::ext_array_init_copy)
8611 << Step->Type << CurInit.get()->getType()
8612 << CurInit.get()->getSourceRange();
8614 [[fallthrough]];
8615 case SK_ArrayInit:
8616 // If the destination type is an incomplete array type, update the
8617 // type accordingly.
8618 if (ResultType) {
8619 if (const IncompleteArrayType *IncompleteDest
8621 if (const ConstantArrayType *ConstantSource
8622 = S.Context.getAsConstantArrayType(CurInit.get()->getType())) {
8623 *ResultType = S.Context.getConstantArrayType(
8624 IncompleteDest->getElementType(), ConstantSource->getSize(),
8625 ConstantSource->getSizeExpr(), ArraySizeModifier::Normal, 0);
8626 }
8627 }
8628 }
8629 break;
8630
8632 // Okay: we checked everything before creating this step. Note that
8633 // this is a GNU extension.
8634 S.Diag(Kind.getLocation(), diag::ext_array_init_parens)
8635 << CurInit.get()->getSourceRange();
8636 break;
8637
8640 checkIndirectCopyRestoreSource(S, CurInit.get());
8641 CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr(
8642 CurInit.get(), Step->Type,
8644 break;
8645
8647 CurInit = ImplicitCastExpr::Create(
8648 S.Context, Step->Type, CK_ARCProduceObject, CurInit.get(), nullptr,
8650 break;
8651
8652 case SK_StdInitializerList: {
8653 S.Diag(CurInit.get()->getExprLoc(),
8654 diag::warn_cxx98_compat_initializer_list_init)
8655 << CurInit.get()->getSourceRange();
8656
8657 // Materialize the temporary into memory.
8659 CurInit.get()->getType(), CurInit.get(),
8660 /*BoundToLvalueReference=*/false);
8661
8662 // Wrap it in a construction of a std::initializer_list<T>.
8663 CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
8664
8665 if (!Step->Type->isDependentType()) {
8666 QualType ElementType;
8667 [[maybe_unused]] bool IsStdInitializerList =
8668 S.isStdInitializerList(Step->Type, &ElementType);
8669 assert(IsStdInitializerList &&
8670 "StdInitializerList step to non-std::initializer_list");
8671 const auto *Record = Step->Type->castAsCXXRecordDecl();
8672 assert(Record->isCompleteDefinition() &&
8673 "std::initializer_list should have already be "
8674 "complete/instantiated by this point");
8675
8676 auto InvalidType = [&] {
8677 S.Diag(Record->getLocation(),
8678 diag::err_std_initializer_list_malformed)
8680 return ExprError();
8681 };
8682
8683 if (Record->isUnion() || Record->getNumBases() != 0 ||
8684 Record->isPolymorphic())
8685 return InvalidType();
8686
8687 RecordDecl::field_iterator Field = Record->field_begin();
8688 if (Field == Record->field_end())
8689 return InvalidType();
8690
8691 // Start pointer
8692 if (!Field->getType()->isPointerType() ||
8693 !S.Context.hasSameType(Field->getType()->getPointeeType(),
8694 ElementType.withConst()))
8695 return InvalidType();
8696
8697 if (++Field == Record->field_end())
8698 return InvalidType();
8699
8700 // Size or end pointer
8701 if (const auto *PT = Field->getType()->getAs<PointerType>()) {
8702 if (!S.Context.hasSameType(PT->getPointeeType(),
8703 ElementType.withConst()))
8704 return InvalidType();
8705 } else {
8706 if (Field->isBitField() ||
8707 !S.Context.hasSameType(Field->getType(), S.Context.getSizeType()))
8708 return InvalidType();
8709 }
8710
8711 if (++Field != Record->field_end())
8712 return InvalidType();
8713 }
8714
8715 // Bind the result, in case the library has given initializer_list a
8716 // non-trivial destructor.
8717 if (shouldBindAsTemporary(Entity))
8718 CurInit = S.MaybeBindToTemporary(CurInit.get());
8719 break;
8720 }
8721
8722 case SK_OCLSamplerInit: {
8723 // Sampler initialization have 5 cases:
8724 // 1. function argument passing
8725 // 1a. argument is a file-scope variable
8726 // 1b. argument is a function-scope variable
8727 // 1c. argument is one of caller function's parameters
8728 // 2. variable initialization
8729 // 2a. initializing a file-scope variable
8730 // 2b. initializing a function-scope variable
8731 //
8732 // For file-scope variables, since they cannot be initialized by function
8733 // call of __translate_sampler_initializer in LLVM IR, their references
8734 // need to be replaced by a cast from their literal initializers to
8735 // sampler type. Since sampler variables can only be used in function
8736 // calls as arguments, we only need to replace them when handling the
8737 // argument passing.
8738 assert(Step->Type->isSamplerT() &&
8739 "Sampler initialization on non-sampler type.");
8740 Expr *Init = CurInit.get()->IgnoreParens();
8741 QualType SourceType = Init->getType();
8742 // Case 1
8743 if (Entity.isParameterKind()) {
8744 if (!SourceType->isSamplerT() && !SourceType->isIntegerType()) {
8745 S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8746 << SourceType;
8747 break;
8748 } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Init)) {
8749 auto Var = cast<VarDecl>(DRE->getDecl());
8750 // Case 1b and 1c
8751 // No cast from integer to sampler is needed.
8752 if (!Var->hasGlobalStorage()) {
8753 CurInit = ImplicitCastExpr::Create(
8754 S.Context, Step->Type, CK_LValueToRValue, Init,
8755 /*BasePath=*/nullptr, VK_PRValue, FPOptionsOverride());
8756 break;
8757 }
8758 // Case 1a
8759 // For function call with a file-scope sampler variable as argument,
8760 // get the integer literal.
8761 // Do not diagnose if the file-scope variable does not have initializer
8762 // since this has already been diagnosed when parsing the variable
8763 // declaration.
8764 if (!Var->getInit() || !isa<ImplicitCastExpr>(Var->getInit()))
8765 break;
8766 Init = cast<ImplicitCastExpr>(const_cast<Expr*>(
8767 Var->getInit()))->getSubExpr();
8768 SourceType = Init->getType();
8769 }
8770 } else {
8771 // Case 2
8772 // Check initializer is 32 bit integer constant.
8773 // If the initializer is taken from global variable, do not diagnose since
8774 // this has already been done when parsing the variable declaration.
8775 if (!Init->isConstantInitializer(S.Context, false))
8776 break;
8777
8778 if (!SourceType->isIntegerType() ||
8779 32 != S.Context.getIntWidth(SourceType)) {
8780 S.Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8781 << SourceType;
8782 break;
8783 }
8784
8785 Expr::EvalResult EVResult;
8786 Init->EvaluateAsInt(EVResult, S.Context);
8787 llvm::APSInt Result = EVResult.Val.getInt();
8788 const uint64_t SamplerValue = Result.getLimitedValue();
8789 // 32-bit value of sampler's initializer is interpreted as
8790 // bit-field with the following structure:
8791 // |unspecified|Filter|Addressing Mode| Normalized Coords|
8792 // |31 6|5 4|3 1| 0|
8793 // This structure corresponds to enum values of sampler properties
8794 // defined in SPIR spec v1.2 and also opencl-c.h
8795 unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8796 unsigned FilterMode = (0x30 & SamplerValue) >> 4;
8797 if (FilterMode != 1 && FilterMode != 2 &&
8799 "cl_intel_device_side_avc_motion_estimation", S.getLangOpts()))
8800 S.Diag(Kind.getLocation(),
8801 diag::warn_sampler_initializer_invalid_bits)
8802 << "Filter Mode";
8803 if (AddressingMode > 4)
8804 S.Diag(Kind.getLocation(),
8805 diag::warn_sampler_initializer_invalid_bits)
8806 << "Addressing Mode";
8807 }
8808
8809 // Cases 1a, 2a and 2b
8810 // Insert cast from integer to sampler.
8812 CK_IntToOCLSampler);
8813 break;
8814 }
8815 case SK_OCLZeroOpaqueType: {
8816 assert((Step->Type->isEventT() || Step->Type->isQueueT() ||
8818 "Wrong type for initialization of OpenCL opaque type.");
8819
8820 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8821 CK_ZeroToOCLOpaqueType,
8822 CurInit.get()->getValueKind());
8823 break;
8824 }
8826 CurInit = nullptr;
8827 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
8828 /*VerifyOnly=*/false, &CurInit);
8829 if (CurInit.get() && ResultType)
8830 *ResultType = CurInit.get()->getType();
8831 if (shouldBindAsTemporary(Entity))
8832 CurInit = S.MaybeBindToTemporary(CurInit.get());
8833 break;
8834 }
8835 }
8836 }
8837
8838 Expr *Init = CurInit.get();
8839 if (!Init)
8840 return ExprError();
8841
8842 // Check whether the initializer has a shorter lifetime than the initialized
8843 // entity, and if not, either lifetime-extend or warn as appropriate.
8844 S.checkInitializerLifetime(Entity, Init);
8845
8846 // Diagnose non-fatal problems with the completed initialization.
8847 if (InitializedEntity::EntityKind EK = Entity.getKind();
8850 cast<FieldDecl>(Entity.getDecl())->isBitField())
8851 S.CheckBitFieldInitialization(Kind.getLocation(),
8852 cast<FieldDecl>(Entity.getDecl()), Init);
8853
8854 // Check for std::move on construction.
8857
8858 return Init;
8859}
8860
8861/// Somewhere within T there is an uninitialized reference subobject.
8862/// Dig it out and diagnose it.
8864 QualType T) {
8865 if (T->isReferenceType()) {
8866 S.Diag(Loc, diag::err_reference_without_init)
8867 << T.getNonReferenceType();
8868 return true;
8869 }
8870
8871 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
8872 if (!RD || !RD->hasUninitializedReferenceMember())
8873 return false;
8874
8875 for (const auto *FI : RD->fields()) {
8876 if (FI->isUnnamedBitField())
8877 continue;
8878
8879 if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) {
8880 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8881 return true;
8882 }
8883 }
8884
8885 for (const auto &BI : RD->bases()) {
8886 if (DiagnoseUninitializedReference(S, BI.getBeginLoc(), BI.getType())) {
8887 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8888 return true;
8889 }
8890 }
8891
8892 return false;
8893}
8894
8895
8896//===----------------------------------------------------------------------===//
8897// Diagnose initialization failures
8898//===----------------------------------------------------------------------===//
8899
8900/// Emit notes associated with an initialization that failed due to a
8901/// "simple" conversion failure.
8902static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity,
8903 Expr *op) {
8904 QualType destType = entity.getType();
8905 if (destType.getNonReferenceType()->isObjCObjectPointerType() &&
8907
8908 // Emit a possible note about the conversion failing because the
8909 // operand is a message send with a related result type.
8911
8912 // Emit a possible note about a return failing because we're
8913 // expecting a related result type.
8914 if (entity.getKind() == InitializedEntity::EK_Result)
8916 }
8917 QualType fromType = op->getType();
8918 QualType fromPointeeType = fromType.getCanonicalType()->getPointeeType();
8919 QualType destPointeeType = destType.getCanonicalType()->getPointeeType();
8920 auto *fromDecl = fromType->getPointeeCXXRecordDecl();
8921 auto *destDecl = destType->getPointeeCXXRecordDecl();
8922 if (fromDecl && destDecl && fromDecl->getDeclKind() == Decl::CXXRecord &&
8923 destDecl->getDeclKind() == Decl::CXXRecord &&
8924 !fromDecl->isInvalidDecl() && !destDecl->isInvalidDecl() &&
8925 !fromDecl->hasDefinition() &&
8926 destPointeeType.getQualifiers().compatiblyIncludes(
8927 fromPointeeType.getQualifiers(), S.getASTContext()))
8928 S.Diag(fromDecl->getLocation(), diag::note_forward_class_conversion)
8929 << S.getASTContext().getCanonicalTagType(fromDecl)
8930 << S.getASTContext().getCanonicalTagType(destDecl);
8931}
8932
8933static void diagnoseListInit(Sema &S, const InitializedEntity &Entity,
8934 InitListExpr *InitList) {
8935 QualType DestType = Entity.getType();
8936
8937 QualType E;
8938 if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) {
8940 E.withConst(),
8941 llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
8942 InitList->getNumInits()),
8944 InitializedEntity HiddenArray =
8946 return diagnoseListInit(S, HiddenArray, InitList);
8947 }
8948
8949 if (DestType->isReferenceType()) {
8950 // A list-initialization failure for a reference means that we tried to
8951 // create a temporary of the inner type (per [dcl.init.list]p3.6) and the
8952 // inner initialization failed.
8953 QualType T = DestType->castAs<ReferenceType>()->getPointeeType();
8955 SourceLocation Loc = InitList->getBeginLoc();
8956 if (auto *D = Entity.getDecl())
8957 Loc = D->getLocation();
8958 S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
8959 return;
8960 }
8961
8962 InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
8963 /*VerifyOnly=*/false,
8964 /*TreatUnavailableAsInvalid=*/false);
8965 assert(DiagnoseInitList.HadError() &&
8966 "Inconsistent init list check result.");
8967}
8968
8970 const InitializedEntity &Entity,
8971 const InitializationKind &Kind,
8972 ArrayRef<Expr *> Args) {
8973 if (!Failed())
8974 return false;
8975
8976 QualType DestType = Entity.getType();
8977
8978 // When we want to diagnose only one element of a braced-init-list,
8979 // we need to factor it out.
8980 Expr *OnlyArg;
8981 if (Args.size() == 1) {
8982 auto *List = dyn_cast<InitListExpr>(Args[0]);
8983 if (List && List->getNumInits() == 1)
8984 OnlyArg = List->getInit(0);
8985 else
8986 OnlyArg = Args[0];
8987
8988 if (OnlyArg->getType() == S.Context.OverloadTy) {
8991 OnlyArg, DestType.getNonReferenceType(), /*Complain=*/false,
8992 Found)) {
8993 if (Expr *Resolved =
8994 S.FixOverloadedFunctionReference(OnlyArg, Found, FD).get())
8995 OnlyArg = Resolved;
8996 }
8997 }
8998 }
8999 else
9000 OnlyArg = nullptr;
9001
9002 switch (Failure) {
9004 // FIXME: Customize for the initialized entity?
9005 if (Args.empty()) {
9006 // Dig out the reference subobject which is uninitialized and diagnose it.
9007 // If this is value-initialization, this could be nested some way within
9008 // the target type.
9009 assert(Kind.getKind() == InitializationKind::IK_Value ||
9010 DestType->isReferenceType());
9011 bool Diagnosed =
9012 DiagnoseUninitializedReference(S, Kind.getLocation(), DestType);
9013 assert(Diagnosed && "couldn't find uninitialized reference to diagnose");
9014 (void)Diagnosed;
9015 } else // FIXME: diagnostic below could be better!
9016 S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
9017 << SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
9018 break;
9020 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
9021 << 1 << Entity.getType() << Args[0]->getSourceRange();
9022 break;
9023
9025 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
9026 break;
9028 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
9029 break;
9031 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
9032 break;
9034 S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
9035 break;
9037 S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
9038 break;
9040 S.Diag(Kind.getLocation(),
9041 diag::err_array_init_incompat_wide_string_into_wchar);
9042 break;
9044 S.Diag(Kind.getLocation(),
9045 diag::err_array_init_plain_string_into_char8_t);
9046 S.Diag(Args.front()->getBeginLoc(),
9047 diag::note_array_init_plain_string_into_char8_t)
9048 << FixItHint::CreateInsertion(Args.front()->getBeginLoc(), "u8");
9049 break;
9051 S.Diag(Kind.getLocation(), diag::err_array_init_utf8_string_into_char)
9052 << DestType->isSignedIntegerType() << S.getLangOpts().CPlusPlus20;
9053 break;
9056 S.Diag(Kind.getLocation(),
9057 (Failure == FK_ArrayTypeMismatch
9058 ? diag::err_array_init_different_type
9059 : diag::err_array_init_non_constant_array))
9060 << DestType.getNonReferenceType()
9061 << OnlyArg->getType()
9062 << Args[0]->getSourceRange();
9063 break;
9064
9066 S.Diag(Kind.getLocation(), diag::err_variable_object_no_init)
9067 << Args[0]->getSourceRange();
9068 break;
9069
9073 DestType.getNonReferenceType(),
9074 true,
9075 Found);
9076 break;
9077 }
9078
9080 auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(OnlyArg)->getDecl());
9081 S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
9082 OnlyArg->getBeginLoc());
9083 break;
9084 }
9085
9088 switch (FailedOverloadResult) {
9089 case OR_Ambiguous:
9090
9091 FailedCandidateSet.NoteCandidates(
9093 Kind.getLocation(),
9095 ? (S.PDiag(diag::err_typecheck_ambiguous_condition)
9096 << OnlyArg->getType() << DestType
9097 << Args[0]->getSourceRange())
9098 : (S.PDiag(diag::err_ref_init_ambiguous)
9099 << DestType << OnlyArg->getType()
9100 << Args[0]->getSourceRange())),
9101 S, OCD_AmbiguousCandidates, Args);
9102 break;
9103
9104 case OR_No_Viable_Function: {
9105 auto Cands = FailedCandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args);
9106 if (!S.RequireCompleteType(Kind.getLocation(),
9107 DestType.getNonReferenceType(),
9108 diag::err_typecheck_nonviable_condition_incomplete,
9109 OnlyArg->getType(), Args[0]->getSourceRange()))
9110 S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
9111 << (Entity.getKind() == InitializedEntity::EK_Result)
9112 << OnlyArg->getType() << Args[0]->getSourceRange()
9113 << DestType.getNonReferenceType();
9114
9115 FailedCandidateSet.NoteCandidates(S, Args, Cands);
9116 break;
9117 }
9118 case OR_Deleted: {
9121 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9122
9123 StringLiteral *Msg = Best->Function->getDeletedMessage();
9124 S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
9125 << OnlyArg->getType() << DestType.getNonReferenceType()
9126 << (Msg != nullptr) << (Msg ? Msg->getString() : StringRef())
9127 << Args[0]->getSourceRange();
9128 if (Ovl == OR_Deleted) {
9129 S.NoteDeletedFunction(Best->Function);
9130 } else {
9131 llvm_unreachable("Inconsistent overload resolution?");
9132 }
9133 break;
9134 }
9135
9136 case OR_Success:
9137 llvm_unreachable("Conversion did not fail!");
9138 }
9139 break;
9140
9142 if (isa<InitListExpr>(Args[0])) {
9143 S.Diag(Kind.getLocation(),
9144 diag::err_lvalue_reference_bind_to_initlist)
9146 << DestType.getNonReferenceType()
9147 << Args[0]->getSourceRange();
9148 break;
9149 }
9150 [[fallthrough]];
9151
9153 S.Diag(Kind.getLocation(),
9155 ? diag::err_lvalue_reference_bind_to_temporary
9156 : diag::err_lvalue_reference_bind_to_unrelated)
9158 << DestType.getNonReferenceType()
9159 << OnlyArg->getType()
9160 << Args[0]->getSourceRange();
9161 break;
9162
9164 // We don't necessarily have an unambiguous source bit-field.
9165 FieldDecl *BitField = Args[0]->getSourceBitField();
9166 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
9167 << DestType.isVolatileQualified()
9168 << (BitField ? BitField->getDeclName() : DeclarationName())
9169 << (BitField != nullptr)
9170 << Args[0]->getSourceRange();
9171 if (BitField)
9172 S.Diag(BitField->getLocation(), diag::note_bitfield_decl);
9173 break;
9174 }
9175
9177 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
9178 << DestType.isVolatileQualified()
9179 << Args[0]->getSourceRange();
9180 break;
9181
9183 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_matrix_element)
9184 << DestType.isVolatileQualified() << Args[0]->getSourceRange();
9185 break;
9186
9188 S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
9189 << DestType.getNonReferenceType() << OnlyArg->getType()
9190 << Args[0]->getSourceRange();
9191 break;
9192
9194 S.Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
9195 << DestType << Args[0]->getSourceRange();
9196 break;
9197
9199 QualType SourceType = OnlyArg->getType();
9200 QualType NonRefType = DestType.getNonReferenceType();
9201 Qualifiers DroppedQualifiers =
9202 SourceType.getQualifiers() - NonRefType.getQualifiers();
9203
9204 if (!NonRefType.getQualifiers().isAddressSpaceSupersetOf(
9205 SourceType.getQualifiers(), S.getASTContext()))
9206 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9207 << NonRefType << SourceType << 1 /*addr space*/
9208 << Args[0]->getSourceRange();
9209 else if (DroppedQualifiers.hasQualifiers())
9210 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9211 << NonRefType << SourceType << 0 /*cv quals*/
9212 << Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers())
9213 << DroppedQualifiers.getCVRQualifiers() << Args[0]->getSourceRange();
9214 else
9215 // FIXME: Consider decomposing the type and explaining which qualifiers
9216 // were dropped where, or on which level a 'const' is missing, etc.
9217 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9218 << NonRefType << SourceType << 2 /*incompatible quals*/
9219 << Args[0]->getSourceRange();
9220 break;
9221 }
9222
9224 S.Diag(Kind.getLocation(), diag::err_reference_bind_failed)
9225 << DestType.getNonReferenceType()
9226 << DestType.getNonReferenceType()->isIncompleteType()
9227 << OnlyArg->isLValue()
9228 << OnlyArg->getType()
9229 << Args[0]->getSourceRange();
9230 emitBadConversionNotes(S, Entity, Args[0]);
9231 break;
9232
9233 case FK_ConversionFailed: {
9234 QualType FromType = OnlyArg->getType();
9235 PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
9236 << (int)Entity.getKind()
9237 << DestType
9238 << OnlyArg->isLValue()
9239 << FromType
9240 << Args[0]->getSourceRange();
9241 S.HandleFunctionTypeMismatch(PDiag, FromType, DestType);
9242 S.Diag(Kind.getLocation(), PDiag);
9243 emitBadConversionNotes(S, Entity, Args[0]);
9244 break;
9245 }
9246
9248 // No-op. This error has already been reported.
9249 break;
9250
9252 SourceRange R;
9253
9254 auto *InitList = dyn_cast<InitListExpr>(Args[0]);
9255 if (InitList && InitList->getNumInits() >= 1) {
9256 R = SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
9257 } else {
9258 assert(Args.size() > 1 && "Expected multiple initializers!");
9259 R = SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
9260 }
9261
9263 if (Kind.isCStyleOrFunctionalCast())
9264 S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
9265 << R;
9266 else
9267 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
9268 << /*scalar=*/3 << R;
9269 break;
9270 }
9271
9273 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
9274 << 0 << Entity.getType() << Args[0]->getSourceRange();
9275 break;
9276
9278 S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
9279 << DestType.getNonReferenceType() << Args[0]->getSourceRange();
9280 break;
9281
9283 S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
9284 << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange();
9285 break;
9286
9289 SourceRange ArgsRange;
9290 if (Args.size())
9291 ArgsRange =
9292 SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
9293
9294 if (Failure == FK_ListConstructorOverloadFailed) {
9295 assert(Args.size() == 1 &&
9296 "List construction from other than 1 argument.");
9297 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9298 Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
9299 }
9300
9301 // FIXME: Using "DestType" for the entity we're printing is probably
9302 // bad.
9303 switch (FailedOverloadResult) {
9304 case OR_Ambiguous:
9305 FailedCandidateSet.NoteCandidates(
9306 PartialDiagnosticAt(Kind.getLocation(),
9307 S.PDiag(diag::err_ovl_ambiguous_init)
9308 << DestType << ArgsRange),
9309 S, OCD_AmbiguousCandidates, Args);
9310 break;
9311
9313 if (Kind.getKind() == InitializationKind::IK_Default &&
9314 (Entity.getKind() == InitializedEntity::EK_Base ||
9318 // This is implicit default initialization of a member or
9319 // base within a constructor. If no viable function was
9320 // found, notify the user that they need to explicitly
9321 // initialize this base/member.
9324 const CXXRecordDecl *InheritedFrom = nullptr;
9325 if (auto Inherited = Constructor->getInheritedConstructor())
9326 InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
9327 if (Entity.getKind() == InitializedEntity::EK_Base) {
9328 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9329 << (InheritedFrom ? 2
9330 : Constructor->isImplicit() ? 1
9331 : 0)
9332 << S.Context.getCanonicalTagType(Constructor->getParent())
9333 << /*base=*/0 << Entity.getType() << InheritedFrom;
9334
9335 auto *BaseDecl =
9337 S.Diag(BaseDecl->getLocation(), diag::note_previous_decl)
9338 << S.Context.getCanonicalTagType(BaseDecl);
9339 } else {
9340 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9341 << (InheritedFrom ? 2
9342 : Constructor->isImplicit() ? 1
9343 : 0)
9344 << S.Context.getCanonicalTagType(Constructor->getParent())
9345 << /*member=*/1 << Entity.getName() << InheritedFrom;
9346 S.Diag(Entity.getDecl()->getLocation(),
9347 diag::note_member_declared_at);
9348
9349 if (const auto *Record = Entity.getType()->getAs<RecordType>())
9350 S.Diag(Record->getDecl()->getLocation(), diag::note_previous_decl)
9351 << S.Context.getCanonicalTagType(Record->getDecl());
9352 }
9353 break;
9354 }
9355
9356 FailedCandidateSet.NoteCandidates(
9358 Kind.getLocation(),
9359 S.PDiag(diag::err_ovl_no_viable_function_in_init)
9360 << DestType << ArgsRange),
9361 S, OCD_AllCandidates, Args);
9362 break;
9363
9364 case OR_Deleted: {
9367 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9368 if (Ovl != OR_Deleted) {
9369 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9370 << DestType << ArgsRange;
9371 llvm_unreachable("Inconsistent overload resolution?");
9372 break;
9373 }
9374
9375 // If this is a defaulted or implicitly-declared function, then
9376 // it was implicitly deleted. Make it clear that the deletion was
9377 // implicit.
9378 if (S.isImplicitlyDeleted(Best->Function))
9379 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
9380 << S.getSpecialMember(cast<CXXMethodDecl>(Best->Function))
9381 << DestType << ArgsRange;
9382 else {
9383 StringLiteral *Msg = Best->Function->getDeletedMessage();
9384 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9385 << DestType << (Msg != nullptr)
9386 << (Msg ? Msg->getString() : StringRef()) << ArgsRange;
9387 }
9388
9389 // If it's a default constructed member, but it's not in the
9390 // constructor's initializer list, explicitly note where the member is
9391 // declared so the user can see which member is erroneously initialized
9392 // with a deleted default constructor.
9393 if (Kind.getKind() == InitializationKind::IK_Default &&
9396 S.Diag(Entity.getDecl()->getLocation(),
9397 diag::note_default_constructed_field)
9398 << Entity.getDecl();
9399 }
9400 S.NoteDeletedFunction(Best->Function);
9401 break;
9402 }
9403
9404 case OR_Success:
9405 llvm_unreachable("Conversion did not fail!");
9406 }
9407 }
9408 break;
9409
9411 if (Entity.getKind() == InitializedEntity::EK_Member &&
9413 // This is implicit default-initialization of a const member in
9414 // a constructor. Complain that it needs to be explicitly
9415 // initialized.
9417 S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
9418 << (Constructor->getInheritedConstructor() ? 2
9419 : Constructor->isImplicit() ? 1
9420 : 0)
9421 << S.Context.getCanonicalTagType(Constructor->getParent())
9422 << /*const=*/1 << Entity.getName();
9423 S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl)
9424 << Entity.getName();
9425 } else if (const auto *VD = dyn_cast_if_present<VarDecl>(Entity.getDecl());
9426 VD && VD->isConstexpr()) {
9427 S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
9428 << VD;
9429 } else {
9430 S.Diag(Kind.getLocation(), diag::err_default_init_const)
9431 << DestType << DestType->isRecordType();
9432 }
9433 break;
9434
9435 case FK_Incomplete:
9436 S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
9437 diag::err_init_incomplete_type);
9438 break;
9439
9441 // Run the init list checker again to emit diagnostics.
9442 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9443 diagnoseListInit(S, Entity, InitList);
9444 break;
9445 }
9446
9447 case FK_PlaceholderType: {
9448 // FIXME: Already diagnosed!
9449 break;
9450 }
9451
9453 // Unlike C/C++ list initialization, there is no fallback if it fails. This
9454 // allows us to diagnose the failure when it happens in the
9455 // TryListInitialization call instead of delaying the diagnosis, which is
9456 // beneficial because the flattening is also expensive.
9457 break;
9458 }
9459
9461 S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9462 << Args[0]->getSourceRange();
9465 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9466 (void)Ovl;
9467 assert(Ovl == OR_Success && "Inconsistent overload resolution");
9468 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
9469 S.Diag(CtorDecl->getLocation(),
9470 diag::note_explicit_ctor_deduction_guide_here) << false;
9471 break;
9472 }
9473
9475 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
9476 /*VerifyOnly=*/false);
9477 break;
9478
9480 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9481 S.Diag(Kind.getLocation(), diag::err_designated_init_for_non_aggregate)
9482 << Entity.getType() << InitList->getSourceRange();
9483 break;
9484 }
9485
9486 PrintInitLocationNote(S, Entity);
9487 return true;
9488}
9489
9490void InitializationSequence::dump(raw_ostream &OS) const {
9491 switch (SequenceKind) {
9492 case FailedSequence: {
9493 OS << "Failed sequence: ";
9494 switch (Failure) {
9496 OS << "too many initializers for reference";
9497 break;
9498
9500 OS << "parenthesized list init for reference";
9501 break;
9502
9504 OS << "array requires initializer list";
9505 break;
9506
9508 OS << "address of unaddressable function was taken";
9509 break;
9510
9512 OS << "array requires initializer list or string literal";
9513 break;
9514
9516 OS << "array requires initializer list or wide string literal";
9517 break;
9518
9520 OS << "narrow string into wide char array";
9521 break;
9522
9524 OS << "wide string into char array";
9525 break;
9526
9528 OS << "incompatible wide string into wide char array";
9529 break;
9530
9532 OS << "plain string literal into char8_t array";
9533 break;
9534
9536 OS << "u8 string literal into char array";
9537 break;
9538
9540 OS << "array type mismatch";
9541 break;
9542
9544 OS << "non-constant array initializer";
9545 break;
9546
9548 OS << "address of overloaded function failed";
9549 break;
9550
9552 OS << "overload resolution for reference initialization failed";
9553 break;
9554
9556 OS << "non-const lvalue reference bound to temporary";
9557 break;
9558
9560 OS << "non-const lvalue reference bound to bit-field";
9561 break;
9562
9564 OS << "non-const lvalue reference bound to vector element";
9565 break;
9566
9568 OS << "non-const lvalue reference bound to matrix element";
9569 break;
9570
9572 OS << "non-const lvalue reference bound to unrelated type";
9573 break;
9574
9576 OS << "rvalue reference bound to an lvalue";
9577 break;
9578
9580 OS << "reference initialization drops qualifiers";
9581 break;
9582
9584 OS << "reference with mismatching address space bound to temporary";
9585 break;
9586
9588 OS << "reference initialization failed";
9589 break;
9590
9592 OS << "conversion failed";
9593 break;
9594
9596 OS << "conversion from property failed";
9597 break;
9598
9600 OS << "too many initializers for scalar";
9601 break;
9602
9604 OS << "parenthesized list init for reference";
9605 break;
9606
9608 OS << "referencing binding to initializer list";
9609 break;
9610
9612 OS << "initializer list for non-aggregate, non-scalar type";
9613 break;
9614
9616 OS << "overloading failed for user-defined conversion";
9617 break;
9618
9620 OS << "constructor overloading failed";
9621 break;
9622
9624 OS << "default initialization of a const variable";
9625 break;
9626
9627 case FK_Incomplete:
9628 OS << "initialization of incomplete type";
9629 break;
9630
9632 OS << "list initialization checker failure";
9633 break;
9634
9636 OS << "variable length array has an initializer";
9637 break;
9638
9639 case FK_PlaceholderType:
9640 OS << "initializer expression isn't contextually valid";
9641 break;
9642
9644 OS << "list constructor overloading failed";
9645 break;
9646
9648 OS << "list copy initialization chose explicit constructor";
9649 break;
9650
9652 OS << "parenthesized list initialization failed";
9653 break;
9654
9656 OS << "designated initializer for non-aggregate type";
9657 break;
9658
9660 OS << "HLSL initialization list flattening failed";
9661 break;
9662 }
9663 OS << '\n';
9664 return;
9665 }
9666
9667 case DependentSequence:
9668 OS << "Dependent sequence\n";
9669 return;
9670
9671 case NormalSequence:
9672 OS << "Normal sequence: ";
9673 break;
9674 }
9675
9676 for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
9677 if (S != step_begin()) {
9678 OS << " -> ";
9679 }
9680
9681 switch (S->Kind) {
9683 OS << "resolve address of overloaded function";
9684 break;
9685
9687 OS << "derived-to-base (prvalue)";
9688 break;
9689
9691 OS << "derived-to-base (xvalue)";
9692 break;
9693
9695 OS << "derived-to-base (lvalue)";
9696 break;
9697
9698 case SK_BindReference:
9699 OS << "bind reference to lvalue";
9700 break;
9701
9703 OS << "bind reference to a temporary";
9704 break;
9705
9706 case SK_FinalCopy:
9707 OS << "final copy in class direct-initialization";
9708 break;
9709
9711 OS << "extraneous C++03 copy to temporary";
9712 break;
9713
9714 case SK_UserConversion:
9715 OS << "user-defined conversion via " << *S->Function.Function;
9716 break;
9717
9719 OS << "qualification conversion (prvalue)";
9720 break;
9721
9723 OS << "qualification conversion (xvalue)";
9724 break;
9725
9727 OS << "qualification conversion (lvalue)";
9728 break;
9729
9731 OS << "function reference conversion";
9732 break;
9733
9735 OS << "non-atomic-to-atomic conversion";
9736 break;
9737
9739 OS << "implicit conversion sequence (";
9740 S->ICS->dump(); // FIXME: use OS
9741 OS << ")";
9742 break;
9743
9745 OS << "implicit conversion sequence with narrowing prohibited (";
9746 S->ICS->dump(); // FIXME: use OS
9747 OS << ")";
9748 break;
9749
9751 OS << "list aggregate initialization";
9752 break;
9753
9754 case SK_UnwrapInitList:
9755 OS << "unwrap reference initializer list";
9756 break;
9757
9758 case SK_RewrapInitList:
9759 OS << "rewrap reference initializer list";
9760 break;
9761
9763 OS << "constructor initialization";
9764 break;
9765
9767 OS << "list initialization via constructor";
9768 break;
9769
9771 OS << "zero initialization";
9772 break;
9773
9774 case SK_CAssignment:
9775 OS << "C assignment";
9776 break;
9777
9778 case SK_StringInit:
9779 OS << "string initialization";
9780 break;
9781
9783 OS << "Objective-C object conversion";
9784 break;
9785
9786 case SK_ArrayLoopIndex:
9787 OS << "indexing for array initialization loop";
9788 break;
9789
9790 case SK_ArrayLoopInit:
9791 OS << "array initialization loop";
9792 break;
9793
9794 case SK_ArrayInit:
9795 OS << "array initialization";
9796 break;
9797
9798 case SK_GNUArrayInit:
9799 OS << "array initialization (GNU extension)";
9800 break;
9801
9803 OS << "parenthesized array initialization";
9804 break;
9805
9807 OS << "pass by indirect copy and restore";
9808 break;
9809
9811 OS << "pass by indirect restore";
9812 break;
9813
9815 OS << "Objective-C object retension";
9816 break;
9817
9819 OS << "std::initializer_list from initializer list";
9820 break;
9821
9823 OS << "list initialization from std::initializer_list";
9824 break;
9825
9826 case SK_OCLSamplerInit:
9827 OS << "OpenCL sampler_t from integer constant";
9828 break;
9829
9831 OS << "OpenCL opaque type from zero";
9832 break;
9834 OS << "initialization from a parenthesized list of values";
9835 break;
9836 }
9837
9838 OS << " [" << S->Type << ']';
9839 }
9840
9841 OS << '\n';
9842}
9843
9845 dump(llvm::errs());
9846}
9847
9849 const ImplicitConversionSequence &ICS,
9850 QualType PreNarrowingType,
9851 QualType EntityType,
9852 const Expr *PostInit) {
9853 const StandardConversionSequence *SCS = nullptr;
9854 switch (ICS.getKind()) {
9856 SCS = &ICS.Standard;
9857 break;
9859 SCS = &ICS.UserDefined.After;
9860 break;
9865 return;
9866 }
9867
9868 auto MakeDiag = [&](bool IsConstRef, unsigned DefaultDiagID,
9869 unsigned ConstRefDiagID, unsigned WarnDiagID) {
9870 unsigned DiagID;
9871 auto &L = S.getLangOpts();
9872 if (L.CPlusPlus11 && !L.HLSL &&
9873 (!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015)))
9874 DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID;
9875 else
9876 DiagID = WarnDiagID;
9877 return S.Diag(PostInit->getBeginLoc(), DiagID)
9878 << PostInit->getSourceRange();
9879 };
9880
9881 // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.
9882 APValue ConstantValue;
9883 QualType ConstantType;
9884 switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue,
9885 ConstantType)) {
9886 case NK_Not_Narrowing:
9888 // No narrowing occurred.
9889 return;
9890
9891 case NK_Type_Narrowing: {
9892 // This was a floating-to-integer conversion, which is always considered a
9893 // narrowing conversion even if the value is a constant and can be
9894 // represented exactly as an integer.
9895 QualType T = EntityType.getNonReferenceType();
9896 MakeDiag(T != EntityType, diag::ext_init_list_type_narrowing,
9897 diag::ext_init_list_type_narrowing_const_reference,
9898 diag::warn_init_list_type_narrowing)
9899 << PreNarrowingType.getLocalUnqualifiedType()
9901 break;
9902 }
9903
9904 case NK_Constant_Narrowing: {
9905 // A constant value was narrowed.
9906 MakeDiag(EntityType.getNonReferenceType() != EntityType,
9907 diag::ext_init_list_constant_narrowing,
9908 diag::ext_init_list_constant_narrowing_const_reference,
9909 diag::warn_init_list_constant_narrowing)
9910 << ConstantValue.getAsString(S.getASTContext(), ConstantType)
9912 break;
9913 }
9914
9915 case NK_Variable_Narrowing: {
9916 // A variable's value may have been narrowed.
9917 MakeDiag(EntityType.getNonReferenceType() != EntityType,
9918 diag::ext_init_list_variable_narrowing,
9919 diag::ext_init_list_variable_narrowing_const_reference,
9920 diag::warn_init_list_variable_narrowing)
9921 << PreNarrowingType.getLocalUnqualifiedType()
9923 break;
9924 }
9925 }
9926
9927 SmallString<128> StaticCast;
9928 llvm::raw_svector_ostream OS(StaticCast);
9929 OS << "static_cast<";
9930 if (const TypedefType *TT = EntityType->getAs<TypedefType>()) {
9931 // It's important to use the typedef's name if there is one so that the
9932 // fixit doesn't break code using types like int64_t.
9933 //
9934 // FIXME: This will break if the typedef requires qualification. But
9935 // getQualifiedNameAsString() includes non-machine-parsable components.
9936 OS << *TT->getDecl();
9937 } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>())
9938 OS << BT->getName(S.getLangOpts());
9939 else {
9940 // Oops, we didn't find the actual type of the variable. Don't emit a fixit
9941 // with a broken cast.
9942 return;
9943 }
9944 OS << ">(";
9945 S.Diag(PostInit->getBeginLoc(), diag::note_init_list_narrowing_silence)
9946 << PostInit->getSourceRange()
9947 << FixItHint::CreateInsertion(PostInit->getBeginLoc(), OS.str())
9949 S.getLocForEndOfToken(PostInit->getEndLoc()), ")");
9950}
9951
9953 QualType ToType, Expr *Init) {
9954 assert(S.getLangOpts().C23);
9956 Init->IgnoreParenImpCasts(), ToType, /*SuppressUserConversions*/ false,
9957 Sema::AllowedExplicit::None,
9958 /*InOverloadResolution*/ false,
9959 /*CStyle*/ false,
9960 /*AllowObjCWritebackConversion=*/false);
9961
9962 if (!ICS.isStandard())
9963 return;
9964
9965 APValue Value;
9966 QualType PreNarrowingType;
9967 // Reuse C++ narrowing check.
9968 switch (ICS.Standard.getNarrowingKind(
9969 S.Context, Init, Value, PreNarrowingType,
9970 /*IgnoreFloatToIntegralConversion*/ false)) {
9971 // The value doesn't fit.
9973 S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_not_representable)
9974 << Value.getAsString(S.Context, PreNarrowingType) << ToType;
9975 return;
9976
9977 // Conversion to a narrower type.
9978 case NK_Type_Narrowing:
9979 S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_type_mismatch)
9980 << ToType << FromType;
9981 return;
9982
9983 // Since we only reuse narrowing check for C23 constexpr variables here, we're
9984 // not really interested in these cases.
9987 case NK_Not_Narrowing:
9988 return;
9989 }
9990 llvm_unreachable("unhandled case in switch");
9991}
9992
9994 Sema &SemaRef, QualType &TT) {
9995 assert(SemaRef.getLangOpts().C23);
9996 // character that string literal contains fits into TT - target type.
9997 const ArrayType *AT = SemaRef.Context.getAsArrayType(TT);
9998 QualType CharType = AT->getElementType();
9999 uint32_t BitWidth = SemaRef.Context.getTypeSize(CharType);
10000 bool isUnsigned = CharType->isUnsignedIntegerType();
10001 llvm::APSInt Value(BitWidth, isUnsigned);
10002 for (unsigned I = 0, N = SE->getLength(); I != N; ++I) {
10003 int64_t C = SE->getCodeUnitS(I, SemaRef.Context.getCharWidth());
10004 Value = C;
10005 if (Value != C) {
10006 SemaRef.Diag(SemaRef.getLocationOfStringLiteralByte(SE, I),
10007 diag::err_c23_constexpr_init_not_representable)
10008 << C << CharType;
10009 return;
10010 }
10011 }
10012}
10013
10014//===----------------------------------------------------------------------===//
10015// Initialization helper functions
10016//===----------------------------------------------------------------------===//
10017bool
10019 ExprResult Init) {
10020 if (Init.isInvalid())
10021 return false;
10022
10023 Expr *InitE = Init.get();
10024 assert(InitE && "No initialization expression");
10025
10026 InitializationKind Kind =
10028 InitializationSequence Seq(*this, Entity, Kind, InitE);
10029 return !Seq.Failed();
10030}
10031
10034 SourceLocation EqualLoc,
10036 bool TopLevelOfInitList,
10037 bool AllowExplicit) {
10038 if (Init.isInvalid())
10039 return ExprError();
10040
10041 Expr *InitE = Init.get();
10042 assert(InitE && "No initialization expression?");
10043
10044 if (EqualLoc.isInvalid())
10045 EqualLoc = InitE->getBeginLoc();
10046
10048 InitE->getBeginLoc(), EqualLoc, AllowExplicit);
10049 InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList);
10050
10051 // Prevent infinite recursion when performing parameter copy-initialization.
10052 const bool ShouldTrackCopy =
10053 Entity.isParameterKind() && Seq.isConstructorInitialization();
10054 if (ShouldTrackCopy) {
10055 if (llvm::is_contained(CurrentParameterCopyTypes, Entity.getType())) {
10056 Seq.SetOverloadFailure(
10059
10060 // Try to give a meaningful diagnostic note for the problematic
10061 // constructor.
10062 const auto LastStep = Seq.step_end() - 1;
10063 assert(LastStep->Kind ==
10065 const FunctionDecl *Function = LastStep->Function.Function;
10066 auto Candidate =
10067 llvm::find_if(Seq.getFailedCandidateSet(),
10068 [Function](const OverloadCandidate &Candidate) -> bool {
10069 return Candidate.Viable &&
10070 Candidate.Function == Function &&
10071 Candidate.Conversions.size() > 0;
10072 });
10073 if (Candidate != Seq.getFailedCandidateSet().end() &&
10074 Function->getNumParams() > 0) {
10075 Candidate->Viable = false;
10078 InitE,
10079 Function->getParamDecl(0)->getType());
10080 }
10081 }
10082 CurrentParameterCopyTypes.push_back(Entity.getType());
10083 }
10084
10085 ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
10086
10087 if (ShouldTrackCopy)
10088 CurrentParameterCopyTypes.pop_back();
10089
10090 return Result;
10091}
10092
10093/// Determine whether RD is, or is derived from, a specialization of CTD.
10095 ClassTemplateDecl *CTD) {
10096 auto NotSpecialization = [&] (const CXXRecordDecl *Candidate) {
10097 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
10098 return !CTSD || !declaresSameEntity(CTSD->getSpecializedTemplate(), CTD);
10099 };
10100 return !(NotSpecialization(RD) && RD->forallBases(NotSpecialization));
10101}
10102
10104 TypeSourceInfo *TSInfo, const InitializedEntity &Entity,
10105 const InitializationKind &Kind, MultiExprArg Inits) {
10106 auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
10107 TSInfo->getType()->getContainedDeducedType());
10108 assert(DeducedTST && "not a deduced template specialization type");
10109
10110 auto TemplateName = DeducedTST->getTemplateName();
10112 return SubstAutoTypeSourceInfoDependent(TSInfo)->getType();
10113
10114 // We can only perform deduction for class templates or alias templates.
10115 auto *Template =
10116 dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl());
10117 TemplateDecl *LookupTemplateDecl = Template;
10118 if (!Template) {
10119 if (auto *AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
10121 DiagCompat(Kind.getLocation(), diag_compat::ctad_for_alias_templates);
10122 LookupTemplateDecl = AliasTemplate;
10123 auto UnderlyingType = AliasTemplate->getTemplatedDecl()
10124 ->getUnderlyingType()
10125 .getCanonicalType();
10126 // C++ [over.match.class.deduct#3]: ..., the defining-type-id of A must be
10127 // of the form
10128 // [typename] [nested-name-specifier] [template] simple-template-id
10129 if (const auto *TST =
10130 UnderlyingType->getAs<TemplateSpecializationType>()) {
10131 Template = dyn_cast_or_null<ClassTemplateDecl>(
10132 TST->getTemplateName().getAsTemplateDecl());
10133 } else if (const auto *RT = UnderlyingType->getAs<RecordType>()) {
10134 // Cases where template arguments in the RHS of the alias are not
10135 // dependent. e.g.
10136 // using AliasFoo = Foo<bool>;
10137 if (const auto *CTSD =
10138 llvm::dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl()))
10139 Template = CTSD->getSpecializedTemplate();
10140 }
10141 }
10142 }
10143 if (!Template) {
10144 Diag(Kind.getLocation(),
10145 diag::err_deduced_non_class_or_alias_template_specialization_type)
10147 if (auto *TD = TemplateName.getAsTemplateDecl())
10149 return QualType();
10150 }
10151
10152 // Can't deduce from dependent arguments.
10154 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10155 diag::warn_cxx14_compat_class_template_argument_deduction)
10156 << TSInfo->getTypeLoc().getSourceRange() << 0;
10157 return SubstAutoTypeSourceInfoDependent(TSInfo)->getType();
10158 }
10159
10160 // FIXME: Perform "exact type" matching first, per CWG discussion?
10161 // Or implement this via an implied 'T(T) -> T' deduction guide?
10162
10163 // Look up deduction guides, including those synthesized from constructors.
10164 //
10165 // C++1z [over.match.class.deduct]p1:
10166 // A set of functions and function templates is formed comprising:
10167 // - For each constructor of the class template designated by the
10168 // template-name, a function template [...]
10169 // - For each deduction-guide, a function or function template [...]
10170 DeclarationNameInfo NameInfo(
10171 Context.DeclarationNames.getCXXDeductionGuideName(LookupTemplateDecl),
10172 TSInfo->getTypeLoc().getEndLoc());
10173 LookupResult Guides(*this, NameInfo, LookupOrdinaryName);
10174 LookupQualifiedName(Guides, LookupTemplateDecl->getDeclContext());
10175
10176 // FIXME: Do not diagnose inaccessible deduction guides. The standard isn't
10177 // clear on this, but they're not found by name so access does not apply.
10178 Guides.suppressDiagnostics();
10179
10180 // Figure out if this is list-initialization.
10182 (Inits.size() == 1 && Kind.getKind() != InitializationKind::IK_Direct)
10183 ? dyn_cast<InitListExpr>(Inits[0])
10184 : nullptr;
10185
10186 // C++1z [over.match.class.deduct]p1:
10187 // Initialization and overload resolution are performed as described in
10188 // [dcl.init] and [over.match.ctor], [over.match.copy], or [over.match.list]
10189 // (as appropriate for the type of initialization performed) for an object
10190 // of a hypothetical class type, where the selected functions and function
10191 // templates are considered to be the constructors of that class type
10192 //
10193 // Since we know we're initializing a class type of a type unrelated to that
10194 // of the initializer, this reduces to something fairly reasonable.
10195 OverloadCandidateSet Candidates(Kind.getLocation(),
10198
10199 bool AllowExplicit = !Kind.isCopyInit() || ListInit;
10200
10201 // Return true if the candidate is added successfully, false otherwise.
10202 auto addDeductionCandidate = [&](FunctionTemplateDecl *TD,
10204 DeclAccessPair FoundDecl,
10205 bool OnlyListConstructors,
10206 bool AllowAggregateDeductionCandidate) {
10207 // C++ [over.match.ctor]p1: (non-list copy-initialization from non-class)
10208 // For copy-initialization, the candidate functions are all the
10209 // converting constructors (12.3.1) of that class.
10210 // C++ [over.match.copy]p1: (non-list copy-initialization from class)
10211 // The converting constructors of T are candidate functions.
10212 if (!AllowExplicit) {
10213 // Overload resolution checks whether the deduction guide is declared
10214 // explicit for us.
10215
10216 // When looking for a converting constructor, deduction guides that
10217 // could never be called with one argument are not interesting to
10218 // check or note.
10219 if (GD->getMinRequiredArguments() > 1 ||
10220 (GD->getNumParams() == 0 && !GD->isVariadic()))
10221 return;
10222 }
10223
10224 // C++ [over.match.list]p1.1: (first phase list initialization)
10225 // Initially, the candidate functions are the initializer-list
10226 // constructors of the class T
10227 if (OnlyListConstructors && !isInitListConstructor(GD))
10228 return;
10229
10230 if (!AllowAggregateDeductionCandidate &&
10231 GD->getDeductionCandidateKind() == DeductionCandidate::Aggregate)
10232 return;
10233
10234 // C++ [over.match.list]p1.2: (second phase list initialization)
10235 // the candidate functions are all the constructors of the class T
10236 // C++ [over.match.ctor]p1: (all other cases)
10237 // the candidate functions are all the constructors of the class of
10238 // the object being initialized
10239
10240 // C++ [over.best.ics]p4:
10241 // When [...] the constructor [...] is a candidate by
10242 // - [over.match.copy] (in all cases)
10243 if (TD) {
10244
10245 // As template candidates are not deduced immediately,
10246 // persist the array in the overload set.
10247 MutableArrayRef<Expr *> TmpInits =
10248 Candidates.getPersistentArgsArray(Inits.size());
10249
10250 for (auto [I, E] : llvm::enumerate(Inits)) {
10251 if (auto *DI = dyn_cast<DesignatedInitExpr>(E))
10252 TmpInits[I] = DI->getInit();
10253 else
10254 TmpInits[I] = E;
10255 }
10256
10258 TD, FoundDecl, /*ExplicitArgs=*/nullptr, TmpInits, Candidates,
10259 /*SuppressUserConversions=*/false,
10260 /*PartialOverloading=*/false, AllowExplicit, ADLCallKind::NotADL,
10261 /*PO=*/{}, AllowAggregateDeductionCandidate);
10262 } else {
10263 AddOverloadCandidate(GD, FoundDecl, Inits, Candidates,
10264 /*SuppressUserConversions=*/false,
10265 /*PartialOverloading=*/false, AllowExplicit);
10266 }
10267 };
10268
10269 bool FoundDeductionGuide = false;
10270
10271 auto TryToResolveOverload =
10272 [&](bool OnlyListConstructors) -> OverloadingResult {
10274 bool HasAnyDeductionGuide = false;
10275
10276 auto SynthesizeAggrGuide = [&](InitListExpr *ListInit) {
10277 auto *Pattern = Template;
10278 while (Pattern->getInstantiatedFromMemberTemplate()) {
10279 if (Pattern->isMemberSpecialization())
10280 break;
10281 Pattern = Pattern->getInstantiatedFromMemberTemplate();
10282 }
10283
10284 auto *RD = cast<CXXRecordDecl>(Pattern->getTemplatedDecl());
10285 if (!(RD->getDefinition() && RD->isAggregate()))
10286 return;
10287 QualType Ty = Context.getCanonicalTagType(RD);
10288 SmallVector<QualType, 8> ElementTypes;
10289
10290 InitListChecker CheckInitList(*this, Entity, ListInit, Ty, ElementTypes);
10291 if (!CheckInitList.HadError()) {
10292 // C++ [over.match.class.deduct]p1.8:
10293 // if e_i is of array type and x_i is a braced-init-list, T_i is an
10294 // rvalue reference to the declared type of e_i and
10295 // C++ [over.match.class.deduct]p1.9:
10296 // if e_i is of array type and x_i is a string-literal, T_i is an
10297 // lvalue reference to the const-qualified declared type of e_i and
10298 // C++ [over.match.class.deduct]p1.10:
10299 // otherwise, T_i is the declared type of e_i
10300 for (int I = 0, E = ListInit->getNumInits();
10301 I < E && !isa<PackExpansionType>(ElementTypes[I]); ++I)
10302 if (ElementTypes[I]->isArrayType()) {
10304 ElementTypes[I] = Context.getRValueReferenceType(ElementTypes[I]);
10305 else if (isa<StringLiteral>(
10306 ListInit->getInit(I)->IgnoreParenImpCasts()))
10307 ElementTypes[I] =
10308 Context.getLValueReferenceType(ElementTypes[I].withConst());
10309 }
10310
10311 if (FunctionTemplateDecl *TD =
10313 LookupTemplateDecl, ElementTypes,
10314 TSInfo->getTypeLoc().getEndLoc())) {
10316 addDeductionCandidate(TD, GD, DeclAccessPair::make(TD, AS_public),
10317 OnlyListConstructors,
10318 /*AllowAggregateDeductionCandidate=*/true);
10319 HasAnyDeductionGuide = true;
10320 }
10321 }
10322 };
10323
10324 for (auto I = Guides.begin(), E = Guides.end(); I != E; ++I) {
10325 NamedDecl *D = (*I)->getUnderlyingDecl();
10326 if (D->isInvalidDecl())
10327 continue;
10328
10329 auto *TD = dyn_cast<FunctionTemplateDecl>(D);
10330 auto *GD = dyn_cast_if_present<CXXDeductionGuideDecl>(
10331 TD ? TD->getTemplatedDecl() : dyn_cast<FunctionDecl>(D));
10332 if (!GD)
10333 continue;
10334
10335 if (!GD->isImplicit())
10336 HasAnyDeductionGuide = true;
10337
10338 addDeductionCandidate(TD, GD, I.getPair(), OnlyListConstructors,
10339 /*AllowAggregateDeductionCandidate=*/false);
10340 }
10341
10342 // C++ [over.match.class.deduct]p1.4:
10343 // if C is defined and its definition satisfies the conditions for an
10344 // aggregate class ([dcl.init.aggr]) with the assumption that any
10345 // dependent base class has no virtual functions and no virtual base
10346 // classes, and the initializer is a non-empty braced-init-list or
10347 // parenthesized expression-list, and there are no deduction-guides for
10348 // C, the set contains an additional function template, called the
10349 // aggregate deduction candidate, defined as follows.
10350 if (getLangOpts().CPlusPlus20 && !HasAnyDeductionGuide) {
10351 if (ListInit && ListInit->getNumInits()) {
10352 SynthesizeAggrGuide(ListInit);
10353 } else if (Inits.size()) { // parenthesized expression-list
10354 // Inits are expressions inside the parentheses. We don't have
10355 // the parentheses source locations, use the begin/end of Inits as the
10356 // best heuristic.
10357 InitListExpr TempListInit(getASTContext(), Inits.front()->getBeginLoc(),
10358 Inits, Inits.back()->getEndLoc());
10359 SynthesizeAggrGuide(&TempListInit);
10360 }
10361 }
10362
10363 FoundDeductionGuide = FoundDeductionGuide || HasAnyDeductionGuide;
10364
10365 return Candidates.BestViableFunction(*this, Kind.getLocation(), Best);
10366 };
10367
10369
10370 // C++11 [over.match.list]p1, per DR1467: for list-initialization, first
10371 // try initializer-list constructors.
10372 if (ListInit) {
10373 bool TryListConstructors = true;
10374
10375 // Try list constructors unless the list is empty and the class has one or
10376 // more default constructors, in which case those constructors win.
10377 if (!ListInit->getNumInits()) {
10378 for (NamedDecl *D : Guides) {
10379 auto *FD = dyn_cast<FunctionDecl>(D->getUnderlyingDecl());
10380 if (FD && FD->getMinRequiredArguments() == 0) {
10381 TryListConstructors = false;
10382 break;
10383 }
10384 }
10385 } else if (ListInit->getNumInits() == 1) {
10386 // C++ [over.match.class.deduct]:
10387 // As an exception, the first phase in [over.match.list] (considering
10388 // initializer-list constructors) is omitted if the initializer list
10389 // consists of a single expression of type cv U, where U is a
10390 // specialization of C or a class derived from a specialization of C.
10391 Expr *E = ListInit->getInit(0);
10392 auto *RD = E->getType()->getAsCXXRecordDecl();
10393 if (!isa<InitListExpr>(E) && RD &&
10394 isCompleteType(Kind.getLocation(), E->getType()) &&
10396 TryListConstructors = false;
10397 }
10398
10399 if (TryListConstructors)
10400 Result = TryToResolveOverload(/*OnlyListConstructor*/true);
10401 // Then unwrap the initializer list and try again considering all
10402 // constructors.
10403 Inits = MultiExprArg(ListInit->getInits(), ListInit->getNumInits());
10404 }
10405
10406 // If list-initialization fails, or if we're doing any other kind of
10407 // initialization, we (eventually) consider constructors.
10409 Result = TryToResolveOverload(/*OnlyListConstructor*/false);
10410
10411 switch (Result) {
10412 case OR_Ambiguous:
10413 // FIXME: For list-initialization candidates, it'd usually be better to
10414 // list why they were not viable when given the initializer list itself as
10415 // an argument.
10416 Candidates.NoteCandidates(
10418 Kind.getLocation(),
10419 PDiag(diag::err_deduced_class_template_ctor_ambiguous)
10420 << TemplateName),
10422 return QualType();
10423
10424 case OR_No_Viable_Function: {
10425 CXXRecordDecl *Primary =
10426 cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
10427 bool Complete = isCompleteType(Kind.getLocation(),
10428 Context.getCanonicalTagType(Primary));
10429 Candidates.NoteCandidates(
10431 Kind.getLocation(),
10432 PDiag(Complete ? diag::err_deduced_class_template_ctor_no_viable
10433 : diag::err_deduced_class_template_incomplete)
10434 << TemplateName << !Guides.empty()),
10435 *this, OCD_AllCandidates, Inits);
10436 return QualType();
10437 }
10438
10439 case OR_Deleted: {
10440 // FIXME: There are no tests for this diagnostic, and it doesn't seem
10441 // like we ever get here; attempts to trigger this seem to yield a
10442 // generic c'all to deleted function' diagnostic instead.
10443 Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
10444 << TemplateName;
10445 NoteDeletedFunction(Best->Function);
10446 return QualType();
10447 }
10448
10449 case OR_Success:
10450 // C++ [over.match.list]p1:
10451 // In copy-list-initialization, if an explicit constructor is chosen, the
10452 // initialization is ill-formed.
10453 if (Kind.isCopyInit() && ListInit &&
10454 cast<CXXDeductionGuideDecl>(Best->Function)->isExplicit()) {
10455 bool IsDeductionGuide = !Best->Function->isImplicit();
10456 Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
10457 << TemplateName << IsDeductionGuide;
10458 Diag(Best->Function->getLocation(),
10459 diag::note_explicit_ctor_deduction_guide_here)
10460 << IsDeductionGuide;
10461 return QualType();
10462 }
10463
10464 // Make sure we didn't select an unusable deduction guide, and mark it
10465 // as referenced.
10466 DiagnoseUseOfDecl(Best->FoundDecl, Kind.getLocation());
10467 MarkFunctionReferenced(Kind.getLocation(), Best->Function);
10468 break;
10469 }
10470
10471 // C++ [dcl.type.class.deduct]p1:
10472 // The placeholder is replaced by the return type of the function selected
10473 // by overload resolution for class template deduction.
10474 QualType DeducedType =
10475 SubstAutoTypeSourceInfo(TSInfo, Best->Function->getReturnType())
10476 ->getType();
10477 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10478 diag::warn_cxx14_compat_class_template_argument_deduction)
10479 << TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;
10480
10481 // Warn if CTAD was used on a type that does not have any user-defined
10482 // deduction guides.
10483 if (!FoundDeductionGuide) {
10484 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10485 diag::warn_ctad_maybe_unsupported)
10486 << TemplateName;
10487 Diag(Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
10488 }
10489
10490 return DeducedType;
10491}
Defines the clang::ASTContext interface.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
static bool isRValueRef(QualType ParamType)
Definition Consumed.cpp:178
Defines the clang::Expr interface and subclasses for C++ expressions.
TokenType getType() const
Returns the token's type, e.g.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Definition MachO.h:31
#define SM(sm)
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static void CheckForNullPointerDereference(Sema &S, Expr *E)
Definition SemaExpr.cpp:561
This file declares semantic analysis for HLSL constructs.
static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E)
Tries to get a FunctionDecl out of E.
static void updateStringLiteralType(Expr *E, QualType Ty)
Update the type of a string literal, including any surrounding parentheses, to match the type of the ...
Definition SemaInit.cpp:176
static void updateGNUCompoundLiteralRValue(Expr *E)
Fix a compound literal initializing an array so it's correctly marked as an rvalue.
Definition SemaInit.cpp:188
static bool initializingConstexprVariable(const InitializedEntity &Entity)
Definition SemaInit.cpp:197
static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity, SourceRange Braces)
Warn that Entity was of scalar type and was initialized by a single-element braced initializer list.
static bool shouldDestroyEntity(const InitializedEntity &Entity)
Whether the given entity, when initialized with an object created for that initialization,...
static SourceLocation getInitializationLoc(const InitializedEntity &Entity, Expr *Initializer)
Get the location at which initialization diagnostics should appear.
static bool hasAnyDesignatedInits(const InitListExpr *IL)
static bool tryObjCWritebackConversion(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity, Expr *Initializer)
static DesignatedInitExpr * CloneDesignatedInitExpr(Sema &SemaRef, DesignatedInitExpr *DIE)
static ExprResult CopyObject(Sema &S, QualType T, const InitializedEntity &Entity, ExprResult CurInit, bool IsExtraneousCopy)
Make a (potentially elidable) temporary copy of the object provided by the given initializer by calli...
static void TryOrBuildParenListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef< Expr * > Args, InitializationSequence &Sequence, bool VerifyOnly, ExprResult *Result=nullptr)
static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, Sema &S, const InitializedEntity &Entity, bool CheckC23ConstexprInit=false)
Definition SemaInit.cpp:215
static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr, bool IsReturnStmt)
Provide warnings when std::move is used on construction.
static void CheckC23ConstexprInitStringLiteral(const StringLiteral *SE, Sema &SemaRef, QualType &TT)
static void CheckCXX98CompatAccessibleCopy(Sema &S, const InitializedEntity &Entity, Expr *CurInitExpr)
Check whether elidable copy construction for binding a reference to a temporary would have succeeded ...
static bool isOrIsDerivedFromSpecializationOf(CXXRecordDecl *RD, ClassTemplateDecl *CTD)
Determine whether RD is, or is derived from, a specialization of CTD.
static bool canInitializeArrayWithEmbedDataString(ArrayRef< Expr * > ExprList, const InitializedEntity &Entity, ASTContext &Context)
static bool TryInitializerListConstruction(Sema &S, InitListExpr *List, QualType DestType, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
When initializing from init list via constructor, handle initialization of an object of type std::ini...
static StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT, ASTContext &Context)
Check whether the array of type AT can be initialized by the Init expression by means of string initi...
Definition SemaInit.cpp:75
static void TryArrayCopy(Sema &S, const InitializationKind &Kind, const InitializedEntity &Entity, Expr *Initializer, QualType DestType, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Initialize an array from another array.
static bool isInitializedStructuredList(const InitListExpr *StructuredList)
StringInitFailureKind
Definition SemaInit.cpp:61
@ SIF_None
Definition SemaInit.cpp:62
@ SIF_PlainStringIntoUTF8Char
Definition SemaInit.cpp:67
@ SIF_IncompatWideStringIntoWideChar
Definition SemaInit.cpp:65
@ SIF_UTF8StringIntoPlainChar
Definition SemaInit.cpp:66
@ SIF_NarrowStringIntoWideChar
Definition SemaInit.cpp:63
@ SIF_Other
Definition SemaInit.cpp:68
@ SIF_WideStringIntoChar
Definition SemaInit.cpp:64
static void TryDefaultInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitializationSequence &Sequence)
Attempt default initialization (C++ [dcl.init]p6).
static bool TryOCLSamplerInitialization(Sema &S, InitializationSequence &Sequence, QualType DestType, Expr *Initializer)
static bool maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity)
Tries to add a zero initializer. Returns true if that worked.
static ExprResult CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value)
Check that the given Index expression is a valid array designator value.
static bool canPerformArrayCopy(const InitializedEntity &Entity)
Determine whether we can perform an elementwise array copy for this kind of entity.
static void 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)
Reference initialization without resolving overloaded functions.
static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType, QualType ToType, Expr *Init)
static void ExpandAnonymousFieldDesignator(Sema &SemaRef, DesignatedInitExpr *DIE, unsigned DesigIdx, IndirectFieldDecl *IndirectField)
Expand a field designator that refers to a member of an anonymous struct or union into a series of fi...
static void TryValueInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitializationSequence &Sequence, InitListExpr *InitList=nullptr)
Attempt value initialization (C++ [dcl.init]p7).
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
static OverloadingResult 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)
static AssignmentAction getAssignmentAction(const InitializedEntity &Entity, bool Diagnose=false)
static void TryListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitListExpr *InitList, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Attempt list initialization (C++0x [dcl.init.list])
static void TryStringLiteralInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence)
Attempt character array initialization from a string literal (C++ [dcl.init.string],...
static bool checkDestructorReference(QualType ElementType, SourceLocation Loc, Sema &SemaRef)
Check if the type of a class element has an accessible destructor, and marks it referenced.
static void TryReferenceInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt reference initialization (C++0x [dcl.init.ref])
static void DiagnoseNarrowingInInitList(Sema &S, const ImplicitConversionSequence &ICS, QualType PreNarrowingType, QualType EntityType, const Expr *PostInit)
static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest, const ArrayType *Source)
Determine whether we have compatible array types for the purposes of GNU by-copy array initialization...
static bool isExplicitTemporary(const InitializedEntity &Entity, const InitializationKind &Kind, unsigned NumArgs)
Returns true if the parameters describe a constructor initialization of an explicit temporary object,...
static bool isNonReferenceableGLValue(Expr *E)
Determine whether an expression is a non-referenceable glvalue (one to which a reference can never bi...
static bool TryOCLZeroOpaqueTypeInitialization(Sema &S, InitializationSequence &Sequence, QualType DestType, Expr *Initializer)
static bool IsWideCharCompatible(QualType T, ASTContext &Context)
Check whether T is compatible with a wide character type (wchar_t, char16_t or char32_t).
Definition SemaInit.cpp:51
static void diagnoseListInit(Sema &S, const InitializedEntity &Entity, InitListExpr *InitList)
static OverloadingResult TryRefInitWithConversionFunction(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, bool AllowRValues, bool IsLValueRef, InitializationSequence &Sequence)
Try a reference initialization that involves calling a conversion function.
void emitUninitializedExplicitInitFields(Sema &S, const RecordDecl *R)
Definition SemaInit.cpp:311
static void TryConstructorInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType DestType, QualType DestArrayType, InitializationSequence &Sequence, bool IsListInit=false, bool IsInitListCopy=false)
Attempt initialization by constructor (C++ [dcl.init]), which enumerates the constructors of the init...
static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity, Expr *op)
Emit notes associated with an initialization that failed due to a "simple" conversion failure.
static bool isIdiomaticBraceElisionEntity(const InitializedEntity &Entity)
Determine whether Entity is an entity for which it is idiomatic to elide the braces in aggregate init...
static void MaybeProduceObjCObject(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity)
static void checkIndirectCopyRestoreSource(Sema &S, Expr *src)
Check whether the given expression is a valid operand for an indirect copy/restore.
static bool shouldBindAsTemporary(const InitializedEntity &Entity)
Whether we should bind a created object as a temporary when initializing the given entity.
static void TryConstructorOrParenListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType DestType, InitializationSequence &Sequence, bool IsAggrListInit)
Attempt to initialize an object of a class type either by direct-initialization, or by copy-initializ...
static bool IsZeroInitializer(const Expr *Init, ASTContext &Ctx)
static const FieldDecl * getConstField(const RecordDecl *RD)
static bool ResolveOverloadedFunctionForReferenceBinding(Sema &S, Expr *Initializer, QualType &SourceType, QualType &UnqualifiedSourceType, QualType UnqualifiedTargetType, InitializationSequence &Sequence)
InvalidICRKind
The non-zero enum values here are indexes into diagnostic alternatives.
@ IIK_okay
@ IIK_nonlocal
@ IIK_nonscalar
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)
static void TryReferenceListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitListExpr *InitList, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Attempt list initialization of a reference.
static bool hasCopyOrMoveCtorParam(ASTContext &Ctx, const ConstructorInfo &Info)
Determine if the constructor has the signature of a copy or move constructor for the type T of the cl...
static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc, QualType T)
Somewhere within T there is an uninitialized reference subobject.
static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, bool isAddressOf, bool &isWeakAccess)
Determines whether this expression is an acceptable ICR source.
This file declares semantic analysis for Objective-C.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
Defines the clang::TypeLoc interface and its subclasses.
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
APSInt & getInt()
Definition APValue.h:508
bool isLValue() const
Definition APValue.h:490
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
Definition APValue.cpp:988
bool isNullPointer() const
Definition APValue.cpp:1051
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
Definition ASTContext.h:951
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
CanQualType OverloadTy
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType OCLSamplerTy
CanQualType VoidTy
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:916
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Definition Expr.h:6024
Represents a loop initializing the elements of an array.
Definition Expr.h:5971
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3730
QualType getElementType() const
Definition TypeBase.h:3742
This class is used for builtin types like 'int'.
Definition TypeBase.h:3172
Kind getKind() const
Definition TypeBase.h:3220
Represents a base class of a C++ class.
Definition DeclCXX.h:146
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
Definition DeclCXX.h:203
QualType getType() const
Retrieves the type of the base class.
Definition DeclCXX.h:249
Represents a call to a C++ constructor.
Definition ExprCXX.h:1549
Expr * getArg(unsigned Arg)
Return the specified argument.
Definition ExprCXX.h:1692
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition ExprCXX.h:1612
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Definition ExprCXX.h:1689
Represents a C++ constructor within a class.
Definition DeclCXX.h:2611
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2854
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
Definition DeclCXX.h:2691
bool isCopyOrMoveConstructor(unsigned &TypeQuals) const
Determine whether this is a copy or move constructor.
Definition DeclCXX.cpp:3037
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2946
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Definition DeclCXX.h:2986
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:1986
Represents a C++ destructor within a class.
Definition DeclCXX.h:2876
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2262
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Definition ExprCXX.cpp:2005
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool hasUninitializedReferenceMember() const
Whether this class or any of its subobjects has any members of reference type which would make value-...
Definition DeclCXX.h:1158
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
Definition DeclCXX.h:1397
CXXBaseSpecifier * base_class_iterator
Iterator that traverses the base classes of a class.
Definition DeclCXX.h:517
llvm::iterator_range< base_class_const_iterator > base_class_const_range
Definition DeclCXX.h:605
base_class_range bases()
Definition DeclCXX.h:608
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
Definition DeclCXX.cpp:1987
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition DeclCXX.h:602
const CXXBaseSpecifier * base_class_const_iterator
Iterator that traverses the base classes of a class.
Definition DeclCXX.h:520
llvm::iterator_range< base_class_iterator > base_class_range
Definition DeclCXX.h:604
bool forallBases(ForallBasesCallback BaseMatches) const
Determines if the given callback holds for all the direct or indirect base classes of this type.
An expression "T()" which creates an rvalue of a non-class type T.
Definition ExprCXX.h:2197
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Definition ExprCXX.h:801
static CXXTemporaryObjectExpr * Create(const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI, ArrayRef< Expr * > Args, SourceRange ParenOrBraceRange, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization)
Definition ExprCXX.cpp:1146
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3150
SourceLocation getBeginLoc() const
Definition Expr.h:3280
bool isCallToStdMove() const
Definition Expr.cpp:3624
Expr * getCallee()
Definition Expr.h:3093
SourceLocation getRParenLoc() const
Definition Expr.h:3277
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3679
static CharSourceRange getTokenRange(SourceRange R)
SourceLocation getBegin() const
Declaration of a class template.
void setExprNeedsCleanups(bool SideEffects)
Definition CleanupInfo.h:28
ConditionalOperator - The ?
Definition Expr.h:4394
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3768
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
Definition Type.cpp:255
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Definition TypeBase.h:3844
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
Definition TypeBase.h:4417
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition DeclBase.h:2238
DeclContextLookupResult lookup_result
Definition DeclBase.h:2577
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition DeclBase.h:2373
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1273
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
Definition Expr.h:1477
ValueDecl * getDecl()
Definition Expr.h:1341
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclBase.h:435
static bool isFlexibleArrayMemberLike(const ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
Definition DeclBase.cpp:459
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:593
bool isInvalidDecl() const
Definition DeclBase.h:588
SourceLocation getLocation() const
Definition DeclBase.h:439
void setReferenced(bool R=true)
Definition DeclBase.h:623
DeclContext * getDeclContext()
Definition DeclBase.h:448
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclBase.h:431
bool hasAttr() const
Definition DeclBase.h:577
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:831
Represents a single C99 designator.
Definition Expr.h:5597
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Expr.h:5759
void setFieldDecl(FieldDecl *FD)
Definition Expr.h:5695
FieldDecl * getFieldDecl() const
Definition Expr.h:5688
SourceLocation getFieldLoc() const
Definition Expr.h:5705
const IdentifierInfo * getFieldName() const
Definition Expr.cpp:4768
SourceLocation getDotLoc() const
Definition Expr.h:5700
SourceLocation getLBracketLoc() const
Definition Expr.h:5741
Represents a C99 designated initializer expression.
Definition Expr.h:5554
bool isDirectInit() const
Whether this designated initializer should result in direct-initialization of the designated subobjec...
Definition Expr.h:5814
Expr * getArrayRangeEnd(const Designator &D) const
Definition Expr.cpp:4877
Expr * getSubExpr(unsigned Idx) const
Definition Expr.h:5836
bool usesGNUSyntax() const
Determines whether this designated initializer used the deprecated GNU syntax for designated initiali...
Definition Expr.h:5818
Expr * getArrayRangeStart(const Designator &D) const
Definition Expr.cpp:4872
void ExpandDesignator(const ASTContext &C, unsigned Idx, const Designator *First, const Designator *Last)
Replaces the designator at index Idx with the series of designators in [First, Last).
Definition Expr.cpp:4884
MutableArrayRef< Designator > designators()
Definition Expr.h:5787
Expr * getArrayIndex(const Designator &D) const
Definition Expr.cpp:4867
Designator * getDesignator(unsigned Idx)
Definition Expr.h:5795
Expr * getInit() const
Retrieve the initializer value.
Definition Expr.h:5822
unsigned size() const
Returns the number of designators in this initializer.
Definition Expr.h:5784
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Expr.cpp:4846
SourceLocation getEndLoc() const LLVM_READONLY
Definition Expr.cpp:4863
SourceLocation getEqualOrColonLoc() const
Retrieve the location of the '=' that precedes the initializer value itself, if present.
Definition Expr.h:5809
unsigned getNumSubExprs() const
Retrieve the total number of subexpressions in this designated initializer expression,...
Definition Expr.h:5834
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
Definition Expr.cpp:4809
InitListExpr * getUpdater() const
Definition Expr.h:5939
Designation - Represent a full designation, which is a sequence of designators.
Definition Designator.h:208
const Designator & getDesignator(unsigned Idx) const
Definition Designator.h:219
unsigned getNumDesignators() const
Definition Designator.h:218
Designator - A designator in a C99 designated initializer.
Definition Designator.h:38
SourceLocation getFieldLoc() const
Definition Designator.h:133
SourceLocation getDotLoc() const
Definition Designator.h:128
Expr * getArrayRangeStart() const
Definition Designator.h:181
bool isArrayDesignator() const
Definition Designator.h:108
SourceLocation getLBracketLoc() const
Definition Designator.h:154
bool isArrayRangeDesignator() const
Definition Designator.h:109
bool isFieldDesignator() const
Definition Designator.h:107
SourceLocation getRBracketLoc() const
Definition Designator.h:161
SourceLocation getEllipsisLoc() const
Definition Designator.h:191
Expr * getArrayRangeEnd() const
Definition Designator.h:186
const IdentifierInfo * getFieldDecl() const
Definition Designator.h:123
Expr * getArrayIndex() const
Definition Designator.h:149
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
Definition Designator.h:115
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition Diagnostic.h:959
Represents a reference to emded data.
Definition Expr.h:5129
StringLiteral * getDataStringLiteral() const
Definition Expr.h:5146
EmbedDataStorage * getData() const
Definition Expr.h:5148
SourceLocation getLocation() const
Definition Expr.h:5142
size_t getDataElementCount() const
Definition Expr.h:5151
RAII object that enters a new expression evaluation context.
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
Definition Decl.h:4240
The return type of classify().
Definition Expr.h:339
bool isLValue() const
Definition Expr.h:390
bool isPRValue() const
Definition Expr.h:393
bool isXValue() const
Definition Expr.h:391
bool isRValue() const
Definition Expr.h:394
This represents one expression.
Definition Expr.h:112
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition Expr.cpp:3095
void setType(QualType t)
Definition Expr.h:145
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:177
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Definition Expr.h:447
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
Definition Expr.cpp:4265
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition Expr.cpp:3090
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3078
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3086
bool isPRValue() const
Definition Expr.h:285
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
Definition Expr.h:284
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
Definition Expr.cpp:3339
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
Definition Expr.h:834
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
Definition Expr.h:838
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Definition Expr.h:454
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
Definition Expr.cpp:3670
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3070
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
Definition Expr.cpp:3253
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
Definition Expr.cpp:4050
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
Definition Expr.h:464
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:277
bool refersToMatrixElement() const
Returns whether this expression refers to a matrix element.
Definition Expr.h:517
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Definition Expr.h:479
QualType getType() const
Definition Expr.h:144
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3160
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3340
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4827
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
Definition Decl.h:3245
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Definition Decl.h:3266
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition Diagnostic.h:129
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition Diagnostic.h:103
Represents a function declaration or definition.
Definition Decl.h:2000
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2797
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition Decl.cpp:3848
QualType getReturnType() const
Definition Decl.h:2845
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2540
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3827
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
One of these records is kept for each identifier that is lexed.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2073
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Definition Overload.h:622
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
Definition Overload.h:673
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
Definition Overload.h:677
static ImplicitConversionSequence getNullptrToBool(QualType SourceType, QualType DestType, bool NeedLValToRVal)
Form an "implicit" conversion sequence from nullptr_t to bool, for a direct-initialization of a bool ...
Definition Overload.h:827
Represents an implicitly-generated value initialization of an object of a given type.
Definition Expr.h:6060
Represents a C array with an unspecified size.
Definition TypeBase.h:3917
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3467
chain_iterator chain_end() const
Definition Decl.h:3490
chain_iterator chain_begin() const
Definition Decl.h:3489
ArrayRef< NamedDecl * >::const_iterator chain_iterator
Definition Decl.h:3486
Describes an C or C++ initializer list.
Definition Expr.h:5302
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
Definition Expr.h:5414
void setSyntacticForm(InitListExpr *Init)
Definition Expr.h:5479
void markError()
Mark the semantic form of the InitListExpr as error when the semantic analysis fails.
Definition Expr.h:5376
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
Definition Expr.h:5417
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
Definition Expr.cpp:2462
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
Definition Expr.cpp:2422
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
Definition Expr.h:5428
unsigned getNumInits() const
Definition Expr.h:5332
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Expr.cpp:2496
void setInit(unsigned Init, Expr *expr)
Definition Expr.h:5366
SourceLocation getLBraceLoc() const
Definition Expr.h:5463
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
Definition Expr.cpp:2426
void setArrayFiller(Expr *filler)
Definition Expr.cpp:2438
InitListExpr * getSyntacticForm() const
Definition Expr.h:5475
Expr * getArrayFiller()
If this initializer list initializes an array with more elements than there are initializers in the l...
Definition Expr.h:5404
unsigned getNumInitsWithEmbedExpanded() const
getNumInits but if the list has an EmbedExpr inside includes full length of embedded data.
Definition Expr.h:5336
SourceLocation getRBraceLoc() const
Definition Expr.h:5465
InitListExpr * getSemanticForm() const
Definition Expr.h:5469
const Expr * getInit(unsigned Init) const
Definition Expr.h:5356
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
Definition Expr.cpp:2485
SourceLocation getEndLoc() const LLVM_READONLY
Definition Expr.cpp:2514
void setInitializedFieldInUnion(FieldDecl *FD)
Definition Expr.h:5434
bool isSyntacticForm() const
Definition Expr.h:5472
ArrayRef< Expr * > inits()
Definition Expr.h:5352
void setRBraceLoc(SourceLocation Loc)
Definition Expr.h:5466
void sawArrayRangeDesignator(bool ARD=true)
Definition Expr.h:5489
Expr ** getInits()
Retrieve the set of initializers.
Definition Expr.h:5345
Describes the kind of initialization being performed, along with location information for tokens rela...
@ IK_DirectList
Direct list-initialization.
@ IK_Value
Value initialization.
@ IK_Direct
Direct initialization.
@ IK_Copy
Copy initialization.
@ IK_Default
Default initialization.
InitKind getKind() const
Determine the initialization kind.
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
static InitializationKind CreateValue(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool isImplicit=false)
Create a value initialization.
A single step in the initialization sequence.
StepKind Kind
The kind of conversion or initialization step we are taking.
InitListExpr * WrappingSyntacticList
When Kind = SK_RewrapInitList, the syntactic form of the wrapping list.
ImplicitConversionSequence * ICS
When Kind = SK_ConversionSequence, the implicit conversion sequence.
struct F Function
When Kind == SK_ResolvedOverloadedFunction or Kind == SK_UserConversion, the function that the expres...
Describes the sequence of initializations required to initialize a given object or reference with a s...
step_iterator step_begin() const
void AddListInitializationStep(QualType T)
Add a list-initialization step.
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
void AddStringInitStep(QualType T)
Add a string init step.
void AddStdInitializerListConstructionStep(QualType T)
Add a step to construct a std::initializer_list object from an initializer list.
void AddConstructorInitializationStep(DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T, bool HadMultipleCandidates, bool FromInitList, bool AsInitList)
Add a constructor-initialization step.
@ SK_StdInitializerListConstructorCall
Perform initialization via a constructor taking a single std::initializer_list argument.
@ SK_AtomicConversion
Perform a conversion adding _Atomic to a type.
@ SK_ObjCObjectConversion
An initialization that "converts" an Objective-C object (not a point to an object) to another Objecti...
@ SK_GNUArrayInit
Array initialization (from an array rvalue) as a GNU extension.
@ SK_CastDerivedToBaseLValue
Perform a derived-to-base cast, producing an lvalue.
@ SK_ProduceObjCObject
Produce an Objective-C object pointer.
@ SK_FunctionReferenceConversion
Perform a function reference conversion, see [dcl.init.ref]p4.
@ SK_BindReference
Reference binding to an lvalue.
@ SK_ArrayLoopInit
Array initialization by elementwise copy.
@ SK_ConstructorInitialization
Perform initialization via a constructor.
@ SK_OCLSamplerInit
Initialize an OpenCL sampler from an integer.
@ SK_StringInit
Initialization by string.
@ SK_ZeroInitialization
Zero-initialize the object.
@ SK_CastDerivedToBaseXValue
Perform a derived-to-base cast, producing an xvalue.
@ SK_QualificationConversionXValue
Perform a qualification conversion, producing an xvalue.
@ SK_UserConversion
Perform a user-defined conversion, either via a conversion function or via a constructor.
@ SK_CastDerivedToBasePRValue
Perform a derived-to-base cast, producing an rvalue.
@ SK_BindReferenceToTemporary
Reference binding to a temporary.
@ SK_PassByIndirectRestore
Pass an object by indirect restore.
@ SK_ParenthesizedArrayInit
Array initialization from a parenthesized initializer list.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
@ SK_ArrayInit
Array initialization (from an array rvalue).
@ SK_ExtraneousCopyToTemporary
An optional copy of a temporary object to another temporary object, which is permitted (but not requi...
@ SK_ArrayLoopIndex
Array indexing for initialization by elementwise copy.
@ SK_ConversionSequenceNoNarrowing
Perform an implicit conversion sequence without narrowing.
@ SK_RewrapInitList
Rewrap the single-element initializer list for a reference.
@ SK_ConstructorInitializationFromList
Perform initialization via a constructor, taking arguments from a single InitListExpr.
@ SK_PassByIndirectCopyRestore
Pass an object by indirect copy-and-restore.
@ SK_ResolveAddressOfOverloadedFunction
Resolve the address of an overloaded function to a specific function declaration.
@ SK_UnwrapInitList
Unwrap the single-element initializer list for a reference.
@ SK_FinalCopy
Direct-initialization from a reference-related object in the final stage of class copy-initialization...
@ SK_QualificationConversionLValue
Perform a qualification conversion, producing an lvalue.
@ SK_StdInitializerList
Construct a std::initializer_list from an initializer list.
@ SK_QualificationConversionPRValue
Perform a qualification conversion, producing a prvalue.
@ SK_ConversionSequence
Perform an implicit conversion sequence.
@ SK_ListInitialization
Perform list-initialization without a constructor.
@ SK_OCLZeroOpaqueType
Initialize an opaque OpenCL type (event_t, queue_t, etc.) with zero.
void AddUserConversionStep(FunctionDecl *Function, DeclAccessPair FoundDecl, QualType T, bool HadMultipleCandidates)
Add a new step invoking a conversion function, which is either a constructor or a conversion function...
void SetZeroInitializationFixit(const std::string &Fixit, SourceLocation L)
Call for initializations are invalid but that would be valid zero initialzations if Fixit was applied...
InitializationSequence(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, bool TopLevelOfInitList=false, bool TreatUnavailableAsInvalid=true)
Try to perform initialization of the given entity, creating a record of the steps required to perform...
void AddQualificationConversionStep(QualType Ty, ExprValueKind Category)
Add a new step that performs a qualification conversion to the given type.
void AddFunctionReferenceConversionStep(QualType Ty)
Add a new step that performs a function reference conversion to the given type.
void AddDerivedToBaseCastStep(QualType BaseType, ExprValueKind Category)
Add a new step in the initialization that performs a derived-to- base cast.
FailureKind getFailureKind() const
Determine why initialization failed.
void InitializeFrom(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, bool TopLevelOfInitList, bool TreatUnavailableAsInvalid)
void AddParenthesizedListInitStep(QualType T)
void SetFailed(FailureKind Failure)
Note that this initialization sequence failed.
bool isAmbiguous() const
Determine whether this initialization failed due to an ambiguity.
void AddUnwrapInitListInitStep(InitListExpr *Syntactic)
Only used when initializing structured bindings from an array with direct-list-initialization.
void AddOCLZeroOpaqueTypeStep(QualType T)
Add a step to initialzie an OpenCL opaque type (event_t, queue_t, etc.) from a zero constant.
void AddFinalCopy(QualType T)
Add a new step that makes a copy of the input to an object of the given type, as the final step in cl...
OverloadingResult getFailedOverloadResult() const
Get the overloading result, for when the initialization sequence failed due to a bad overload.
void setSequenceKind(enum SequenceKind SK)
Set the kind of sequence computed.
void AddObjCObjectConversionStep(QualType T)
Add an Objective-C object conversion step, which is always a no-op.
void SetOverloadFailure(FailureKind Failure, OverloadingResult Result)
Note that this initialization sequence failed due to failed overload resolution.
step_iterator step_end() const
void AddParenthesizedArrayInitStep(QualType T)
Add a parenthesized array initialization step.
void AddExtraneousCopyToTemporary(QualType T)
Add a new step that makes an extraneous copy of the input to a temporary of the same class type.
void setIncompleteTypeFailure(QualType IncompleteType)
Note that this initialization sequence failed due to an incomplete type.
void AddOCLSamplerInitStep(QualType T)
Add a step to initialize an OpenCL sampler from an integer constant.
void AddCAssignmentStep(QualType T)
Add a C assignment step.
void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy)
Add a step to pass an object by indirect copy-restore.
void RewrapReferenceInitList(QualType T, InitListExpr *Syntactic)
Add steps to unwrap a initializer list for a reference around a single element and rewrap it at the e...
bool Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef< Expr * > Args)
Diagnose an potentially-invalid initialization sequence.
bool Failed() const
Determine whether the initialization sequence is invalid.
void AddAtomicConversionStep(QualType Ty)
Add a new step that performs conversion from non-atomic to atomic type.
void dump() const
Dump a representation of this initialization sequence to standard error, for debugging purposes.
void AddConversionSequenceStep(const ImplicitConversionSequence &ICS, QualType T, bool TopLevelOfInitList=false)
Add a new step that applies an implicit conversion sequence.
void AddZeroInitializationStep(QualType T)
Add a zero-initialization step.
void AddProduceObjCObjectStep(QualType T)
Add a step to "produce" an Objective-C object (by retaining it).
enum SequenceKind getKind() const
Determine the kind of initialization sequence computed.
SequenceKind
Describes the kind of initialization sequence computed.
@ NormalSequence
A normal sequence.
@ FailedSequence
A failed initialization sequence.
@ DependentSequence
A dependent initialization, which could not be type-checked due to the presence of dependent types or...
void AddReferenceBindingStep(QualType T, bool BindingTemporary)
Add a new step binding a reference to an object.
FailureKind
Describes why initialization failed.
@ FK_UserConversionOverloadFailed
Overloading for a user-defined conversion failed.
@ FK_NarrowStringIntoWideCharArray
Initializing a wide char array with narrow string literal.
@ FK_ArrayTypeMismatch
Array type mismatch.
@ FK_ParenthesizedListInitForReference
Reference initialized from a parenthesized initializer list.
@ FK_NonConstLValueReferenceBindingToVectorElement
Non-const lvalue reference binding to a vector element.
@ FK_ReferenceInitDropsQualifiers
Reference binding drops qualifiers.
@ FK_InitListBadDestinationType
Initialization of some unused destination type with an initializer list.
@ FK_ConversionFromPropertyFailed
Implicit conversion failed.
@ FK_NonConstLValueReferenceBindingToUnrelated
Non-const lvalue reference binding to an lvalue of unrelated type.
@ FK_ListConstructorOverloadFailed
Overloading for list-initialization by constructor failed.
@ FK_ReferenceInitFailed
Reference binding failed.
@ FK_ArrayNeedsInitList
Array must be initialized with an initializer list.
@ FK_PlainStringIntoUTF8Char
Initializing char8_t array with plain string literal.
@ FK_NonConstantArrayInit
Non-constant array initializer.
@ FK_NonConstLValueReferenceBindingToTemporary
Non-const lvalue reference binding to a temporary.
@ FK_ConversionFailed
Implicit conversion failed.
@ FK_ArrayNeedsInitListOrStringLiteral
Array must be initialized with an initializer list or a string literal.
@ FK_ParenthesizedListInitForScalar
Scalar initialized from a parenthesized initializer list.
@ FK_HLSLInitListFlatteningFailed
HLSL intialization list flattening failed.
@ FK_PlaceholderType
Initializer has a placeholder type which cannot be resolved by initialization.
@ FK_IncompatWideStringIntoWideChar
Initializing wide char array with incompatible wide string literal.
@ FK_NonConstLValueReferenceBindingToMatrixElement
Non-const lvalue reference binding to a matrix element.
@ FK_TooManyInitsForReference
Too many initializers provided for a reference.
@ FK_NonConstLValueReferenceBindingToBitfield
Non-const lvalue reference binding to a bit-field.
@ FK_ReferenceAddrspaceMismatchTemporary
Reference with mismatching address space binding to temporary.
@ FK_ListInitializationFailed
List initialization failed at some point.
@ FK_TooManyInitsForScalar
Too many initializers for scalar.
@ FK_AddressOfOverloadFailed
Cannot resolve the address of an overloaded function.
@ FK_VariableLengthArrayHasInitializer
Variable-length array must not have an initializer.
@ FK_ArrayNeedsInitListOrWideStringLiteral
Array must be initialized with an initializer list or a wide string literal.
@ FK_RValueReferenceBindingToLValue
Rvalue reference binding to an lvalue.
@ FK_Incomplete
Initialization of an incomplete type.
@ FK_WideStringIntoCharArray
Initializing char array with wide string literal.
@ FK_ExplicitConstructor
List-copy-initialization chose an explicit constructor.
@ FK_ReferenceInitOverloadFailed
Overloading due to reference initialization failed.
@ FK_ConstructorOverloadFailed
Overloading for initialization by constructor failed.
@ FK_ReferenceBindingToInitList
Reference initialization from an initializer list.
@ FK_DefaultInitOfConst
Default-initialization of a 'const' object.
@ FK_ParenthesizedListInitFailed
Parenthesized list initialization failed at some point.
@ FK_AddressOfUnaddressableFunction
Trying to take the address of a function that doesn't support having its address taken.
@ FK_UTF8StringIntoPlainChar
Initializing char array with UTF-8 string literal.
bool isDirectReferenceBinding() const
Determine whether this initialization is a direct reference binding (C++ [dcl.init....
void AddArrayInitLoopStep(QualType T, QualType EltTy)
Add an array initialization loop step.
void AddAddressOverloadResolutionStep(FunctionDecl *Function, DeclAccessPair Found, bool HadMultipleCandidates)
Add a new step in the initialization that resolves the address of an overloaded function to a specifi...
void AddArrayInitStep(QualType T, bool IsGNUExtension)
Add an array initialization step.
bool isConstructorInitialization() const
Determine whether this initialization is direct call to a constructor.
SmallVectorImpl< Step >::const_iterator step_iterator
OverloadCandidateSet & getFailedCandidateSet()
Retrieve a reference to the candidate set when overload resolution fails.
Describes an entity that is being initialized.
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr, bool Implicit=false)
Create the initialization entity for a member subobject.
VD Variable
When Kind == EK_Variable, EK_Member, EK_Binding, or EK_TemplateParameter, the variable,...
EntityKind getKind() const
Determine the kind of initialization.
DeclarationName getName() const
Retrieve the name of the entity being initialized.
QualType getType() const
Retrieve type being initialized.
ValueDecl * getDecl() const
Retrieve the variable, parameter, or field being initialized.
bool isImplicitMemberInitializer() const
Is this the implicit initialization of a member of a class from a defaulted constructor?
const InitializedEntity * getParent() const
Retrieve the parent of the entity being initialized, when the initialization itself is occurring with...
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
bool isParameterConsumed() const
Determine whether this initialization consumes the parameter.
static InitializedEntity InitializeElement(ASTContext &Context, unsigned Index, const InitializedEntity &Parent)
Create the initialization entity for an array element.
unsigned getElementIndex() const
If this is an array, vector, or complex number element, get the element's index.
void setElementIndex(unsigned Index)
If this is already the initializer for an array or vector element, sets the element index.
SourceLocation getCaptureLoc() const
Determine the location of the capture when initializing field from a captured variable in a lambda.
bool isParamOrTemplateParamKind() const
llvm::PointerIntPair< const CXXBaseSpecifier *, 1 > Base
When Kind == EK_Base, the base specifier that provides the base class.
bool allowsNRVO() const
Determine whether this initialization allows the named return value optimization, which also applies ...
void dump() const
Dump a representation of the initialized entity to standard error, for debugging purposes.
EntityKind
Specifies the kind of entity being initialized.
@ EK_Variable
The entity being initialized is a variable.
@ EK_Temporary
The entity being initialized is a temporary object.
@ EK_Binding
The entity being initialized is a structured binding of a decomposition declaration.
@ EK_BlockElement
The entity being initialized is a field of block descriptor for the copied-in c++ object.
@ EK_MatrixElement
The entity being initialized is an element of a matrix.
@ EK_Parameter_CF_Audited
The entity being initialized is a function parameter; function is member of group of audited CF APIs.
@ EK_LambdaToBlockConversionBlockElement
The entity being initialized is a field of block descriptor for the copied-in lambda object that's us...
@ EK_Member
The entity being initialized is a non-static data member subobject.
@ EK_Base
The entity being initialized is a base member subobject.
@ EK_Result
The entity being initialized is the result of a function call.
@ EK_TemplateParameter
The entity being initialized is a non-type template parameter.
@ EK_StmtExprResult
The entity being initialized is the result of a statement expression.
@ EK_ParenAggInitMember
The entity being initialized is a non-static data member subobject of an object initialized via paren...
@ EK_VectorElement
The entity being initialized is an element of a vector.
@ EK_New
The entity being initialized is an object (or array of objects) allocated via new.
@ EK_CompoundLiteralInit
The entity being initialized is the initializer for a compound literal.
@ EK_Parameter
The entity being initialized is a function parameter.
@ EK_Delegating
The initialization is being done by a delegating constructor.
@ EK_ComplexElement
The entity being initialized is the real or imaginary part of a complex number.
@ EK_ArrayElement
The entity being initialized is an element of an array.
@ EK_LambdaCapture
The entity being initialized is the field that captures a variable in a lambda.
@ EK_Exception
The entity being initialized is an exception object that is being thrown.
@ EK_RelatedResult
The entity being implicitly initialized back to the formal result type.
static InitializedEntity InitializeMemberFromParenAggInit(FieldDecl *Member)
Create the initialization entity for a member subobject initialized via parenthesized aggregate init.
SourceLocation getThrowLoc() const
Determine the location of the 'throw' keyword when initializing an exception object.
unsigned Index
When Kind == EK_ArrayElement, EK_VectorElement, EK_MatrixElement, or EK_ComplexElement,...
bool isVariableLengthArrayNew() const
Determine whether this is an array new with an unknown bound.
llvm::PointerIntPair< ParmVarDecl *, 1 > Parameter
When Kind == EK_Parameter, the ParmVarDecl, with the integer indicating whether the parameter is "con...
const CXXBaseSpecifier * getBaseSpecifier() const
Retrieve the base specifier.
SourceLocation getReturnLoc() const
Determine the location of the 'return' keyword when initializing the result of a function call.
TypeSourceInfo * getTypeSourceInfo() const
Retrieve complete type-source information for the object being constructed, if known.
ObjCMethodDecl * getMethodDecl() const
Retrieve the ObjectiveC method being initialized.
An lvalue reference type, per C++11 [dcl.ref].
Definition TypeBase.h:3625
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
Definition Lexer.cpp:1030
Represents the results of name lookup.
Definition Lookup.h:147
bool empty() const
Return true if no decls were found.
Definition Lookup.h:362
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
Definition Lookup.h:636
iterator end() const
Definition Lookup.h:359
iterator begin() const
Definition Lookup.h:358
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4921
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Definition ExprCXX.h:4946
Represents a matrix type, as defined in the Matrix Types clang extensions.
Definition TypeBase.h:4345
QualType getElementType() const
Returns type of the elements being stored in the matrix.
Definition TypeBase.h:4359
This represents a decl that may have a name.
Definition Decl.h:274
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition Decl.h:487
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:301
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
Represent a C++ namespace.
Definition Decl.h:592
Represents a place-holder for an object not to be initialized by anything.
Definition Expr.h:5880
QualType getEncodedType() const
Definition ExprObjC.h:426
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
Definition ExprObjC.h:1579
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1181
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition Overload.h:1160
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
void setDestAS(LangAS AS)
Definition Overload.h:1486
llvm::MutableArrayRef< Expr * > getPersistentArgsArray(unsigned N)
Provide storage for any Expr* arg that must be preserved until deferred template candidates are deduc...
Definition Overload.h:1408
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
Definition Overload.h:1181
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
Definition Overload.h:1176
@ CSK_Normal
Normal lookup.
Definition Overload.h:1164
SmallVectorImpl< OverloadCandidate >::iterator iterator
Definition Overload.h:1376
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
CandidateSetKind getKind() const
Definition Overload.h:1349
Represents a parameter to a function.
Definition Decl.h:1790
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3336
bool NeedsStdLibCxxWorkaroundBefore(std::uint64_t FixedVersion)
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8472
bool hasQualifiers() const
Determine whether this type has any qualifiers.
Definition TypeBase.h:8477
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
Definition Type.cpp:3624
QualType withConst() const
Definition TypeBase.h:1165
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
Definition TypeBase.h:1231
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8388
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8514
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8428
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1444
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition TypeBase.h:8573
QualType getCanonicalType() const
Definition TypeBase.h:8440
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8482
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8461
bool hasAddressSpace() const
Check if this type has any address space qualifier.
Definition TypeBase.h:8509
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition TypeBase.h:1551
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
unsigned getCVRQualifiers() const
Definition TypeBase.h:488
void addAddressSpace(LangAS space)
Definition TypeBase.h:597
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Definition TypeBase.h:364
bool hasConst() const
Definition TypeBase.h:457
bool hasQualifiers() const
Return true if the set contains any qualifiers.
Definition TypeBase.h:646
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
Definition TypeBase.h:727
bool hasAddressSpace() const
Definition TypeBase.h:570
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
Definition TypeBase.h:708
Qualifiers withoutAddressSpace() const
Definition TypeBase.h:538
static Qualifiers fromCVRMask(unsigned CVR)
Definition TypeBase.h:435
bool hasVolatile() const
Definition TypeBase.h:467
bool hasObjCLifetime() const
Definition TypeBase.h:544
ObjCLifetime getObjCLifetime() const
Definition TypeBase.h:545
Qualifiers withoutObjCLifetime() const
Definition TypeBase.h:533
LangAS getAddressSpace() const
Definition TypeBase.h:571
An rvalue reference type, per C++11 [dcl.ref].
Definition TypeBase.h:3643
Represents a struct/union/class.
Definition Decl.h:4327
field_iterator field_end() const
Definition Decl.h:4533
field_range fields() const
Definition Decl.h:4530
bool isRandomized() const
Definition Decl.h:4485
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition Decl.h:4511
bool hasUninitializedExplicitInitFields() const
Definition Decl.h:4453
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4527
bool field_empty() const
Definition Decl.h:4538
field_iterator field_begin() const
Definition Decl.cpp:5276
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3581
bool isSpelledAsLValue() const
Definition TypeBase.h:3594
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition SemaBase.cpp:33
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
Definition SemaBase.cpp:90
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
bool transformInitList(const InitializedEntity &Entity, InitListExpr *Init)
bool CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose=true)
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
bool CheckConversionToObjCLiteral(QualType DstType, Expr *&SrcExpr, bool Diagnose=true)
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:868
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition Sema.h:6356
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9382
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9390
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
ImplicitConversionSequence TryImplicitConversion(Expr *From, QualType ToType, bool SuppressUserConversions, AllowedExplicit AllowExplicit, bool InOverloadResolution, bool CStyle, bool AllowObjCWritebackConversion)
bool IsStringInit(Expr *Init, const ArrayType *AT)
Definition SemaInit.cpp:170
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
ReferenceCompareResult
ReferenceCompareResult - Expresses the result of comparing two types (cv1 T1 and cv2 T2) to determine...
Definition Sema.h:10453
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10456
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10462
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10460
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true)
Adds a conversion function template specialization candidate to the overload set, using template argu...
Preprocessor & getPreprocessor() const
Definition Sema.h:938
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition Sema.h:6979
FunctionTemplateDecl * DeclareAggregateDeductionGuideFromInitList(TemplateDecl *Template, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
ExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation EqualOrColonLoc, bool GNUSyntax, ExprResult Init)
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2069
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExpressionEvaluationContextRecord & parentEvaluationContext()
Definition Sema.h:6991
ASTContext & Context
Definition Sema.h:1300
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition Sema.cpp:680
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:225
bool checkAddressOfFunctionIsAvailable(const FunctionDecl *Function, bool Complain=false, SourceLocation Loc=SourceLocation())
Returns whether the given function's address can be taken or not, optionally emitting a diagnostic if...
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
SemaObjC & ObjC()
Definition Sema.h:1510
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
Definition SemaExpr.cpp:758
ASTContext & getASTContext() const
Definition Sema.h:939
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:756
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
llvm::SmallVector< QualType, 4 > CurrentParameterCopyTypes
Stack of types that correspond to the parameter entities that are currently being copy-initialized.
Definition Sema.h:9064
std::string getFixItZeroInitializerForType(QualType T, SourceLocation Loc) const
Get a string to suggest for zero-initialization of a type.
void AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
CXXConstructorDecl * LookupDefaultConstructor(CXXRecordDecl *Class)
Look up the default constructor for the given class.
const LangOptions & getLangOpts() const
Definition Sema.h:932
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
ExprResult PerformQualificationConversion(Expr *E, QualType Ty, ExprValueKind VK=VK_PRValue, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
SemaHLSL & HLSL()
Definition Sema.h:1475
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition SemaExpr.cpp:76
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:7012
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
Definition Sema.h:10481
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
SourceLocation getLocationOfStringLiteralByte(const StringLiteral *SL, unsigned ByteNo) const
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8236
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
Definition Sema.h:8103
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
Definition Sema.h:7024
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1438
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8228
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:14026
SourceManager & getSourceManager() const
Definition Sema.h:937
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
void DiscardMisalignedMemberAddress(const Type *T, Expr *E)
This function checks if the expression is in the sef of potentially misaligned members and it is conv...
bool BoundsSafetyCheckInitialization(const InitializedEntity &Entity, const InitializationKind &Kind, AssignmentAction Action, QualType LHSType, Expr *RHSExpr)
Perform Bounds Safety Semantic checks for initializing a Bounds Safety pointer.
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
TypeSourceInfo * SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto)
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
Definition Sema.h:13759
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15530
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:124
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6790
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
SourceManager & SourceMgr
Definition Sema.h:1303
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
DiagnosticsEngine & Diags
Definition Sema.h:1302
OpenCLOptions & getOpenCLOptions()
Definition Sema.h:933
NamespaceDecl * getStdNamespace() const
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
friend class InitializationSequence
Definition Sema.h:1580
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:625
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
bool CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType)
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
Encodes a location in the source.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const
Return the start/end of the expansion information for an expansion location.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isAtStartOfImmediateMacroExpansion(SourceLocation Loc, SourceLocation *MacroBegin=nullptr) const
Returns true if the given MacroID location points at the beginning of the immediate macro expansion.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
Definition Overload.h:298
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
Definition Overload.h:309
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
Definition Overload.h:303
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
void setToType(unsigned Idx, QualType T)
Definition Overload.h:396
NarrowingKind getNarrowingKind(ASTContext &Context, const Expr *Converted, APValue &ConstantValue, QualType &ConstantType, bool IgnoreFloatToIntegralConversion=false) const
Check if this standard conversion sequence represents a narrowing conversion, according to C++11 [dcl...
QualType getToType(unsigned Idx) const
Definition Overload.h:411
Stmt - This represents one statement.
Definition Stmt.h:86
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:367
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:355
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1802
unsigned getLength() const
Definition Expr.h:1912
StringLiteralKind getKind() const
Definition Expr.h:1915
int64_t getCodeUnitS(size_t I, uint64_t BitWidth) const
Definition Expr.h:1899
StringRef getString() const
Definition Expr.h:1870
bool isUnion() const
Definition Decl.h:3928
bool isBigEndian() const
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
bool isDependent() const
Determines whether this is a dependent template name.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
SourceLocation getEndLoc() const
Get the end source location.
Definition TypeLoc.cpp:227
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
A container of type source information.
Definition TypeBase.h:8359
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8370
The base class of the type hierarchy.
Definition TypeBase.h:1839
bool isVoidType() const
Definition TypeBase.h:8991
bool isBooleanType() const
Definition TypeBase.h:9128
bool isMFloat8Type() const
Definition TypeBase.h:9016
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
Definition TypeBase.h:9178
bool isIncompleteArrayType() const
Definition TypeBase.h:8732
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition Type.cpp:2230
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
Definition Type.cpp:2137
bool isRValueReferenceType() const
Definition TypeBase.h:8657
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition Type.h:41
bool isArrayType() const
Definition TypeBase.h:8724
bool isCharType() const
Definition Type.cpp:2157
CXXRecordDecl * castAsCXXRecordDecl() const
Definition Type.h:36
bool isConstantMatrixType() const
Definition TypeBase.h:8792
bool isArrayParameterType() const
Definition TypeBase.h:8740
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9035
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9285
bool isReferenceType() const
Definition TypeBase.h:8649
bool isEnumeralType() const
Definition TypeBase.h:8756
bool isScalarType() const
Definition TypeBase.h:9097
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
Definition Type.cpp:1922
bool isChar8Type() const
Definition Type.cpp:2173
bool isSizelessBuiltinType() const
Definition Type.cpp:2575
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:753
bool isExtVectorType() const
Definition TypeBase.h:8768
bool isOCLIntelSubgroupAVCType() const
Definition TypeBase.h:8910
bool isLValueReferenceType() const
Definition TypeBase.h:8653
bool isOpenCLSpecificType() const
Definition TypeBase.h:8925
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2790
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
Definition Type.cpp:2455
RecordDecl * castAsRecordDecl() const
Definition Type.h:48
bool isAnyComplexType() const
Definition TypeBase.h:8760
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition Type.cpp:2073
bool isQueueT() const
Definition TypeBase.h:8881
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
Definition TypeBase.h:9171
bool isAtomicType() const
Definition TypeBase.h:8817
bool isFunctionProtoType() const
Definition TypeBase.h:2607
bool isMatrixType() const
Definition TypeBase.h:8788
EnumDecl * castAsEnumDecl() const
Definition Type.h:59
bool isObjCObjectType() const
Definition TypeBase.h:8808
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
Definition TypeBase.h:9271
bool isEventT() const
Definition TypeBase.h:8873
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2479
bool isFunctionType() const
Definition TypeBase.h:8621
bool isObjCObjectPointerType() const
Definition TypeBase.h:8804
bool isVectorType() const
Definition TypeBase.h:8764
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2929
bool isFloatingType() const
Definition Type.cpp:2341
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
Definition Type.cpp:2284
bool isSamplerT() const
Definition TypeBase.h:8869
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9218
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
Definition Type.cpp:654
bool isNullPtrType() const
Definition TypeBase.h:9028
bool isRecordType() const
Definition TypeBase.h:8752
bool isObjCRetainableType() const
Definition Type.cpp:5364
bool isUnionType() const
Definition Type.cpp:719
DeclClass * getCorrectionDeclAs() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2247
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
QualType getType() const
Definition Decl.h:723
Represents a variable declaration or definition.
Definition Decl.h:926
const Expr * getInit() const
Definition Decl.h:1368
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
Definition Decl.h:1184
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition Decl.h:1229
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:3974
Represents a GCC generic vector type.
Definition TypeBase.h:4183
unsigned getNumElements() const
Definition TypeBase.h:4198
VectorKind getVectorKind() const
Definition TypeBase.h:4203
QualType getElementType() const
Definition TypeBase.h:4197
Defines the clang::TargetInfo interface.
Definition SPIR.cpp:47
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
void checkInitLifetime(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for initializing the ent...
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus20
@ CPlusPlus
@ CPlusPlus11
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
Definition Overload.h:50
@ OR_Deleted
Succeeded, but refers to a deleted function.
Definition Overload.h:61
@ OR_Success
Overload resolution succeeded.
Definition Overload.h:52
@ OR_Ambiguous
Ambiguous candidates found.
Definition Overload.h:58
@ OR_No_Viable_Function
No viable function found.
Definition Overload.h:55
@ ovl_fail_bad_conversion
Definition Overload.h:862
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
Definition Overload.h:73
@ OCD_AllCandidates
Requests that all candidates be shown.
Definition Overload.h:67
CXXConstructionKind
Definition ExprCXX.h:1541
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ AS_public
Definition Specifiers.h:124
MutableArrayRef< Expr * > MultiExprArg
Definition Ownership.h:259
@ SD_Thread
Thread storage duration.
Definition Specifiers.h:342
@ SD_Static
Static storage duration.
Definition Specifiers.h:343
@ SD_Automatic
Automatic storage duration (most local variables).
Definition Specifiers.h:341
@ Result
The result type of a method or function.
Definition TypeBase.h:905
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
Definition Overload.h:133
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
Definition Overload.h:142
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
Definition Overload.h:112
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
Definition Overload.h:109
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
Definition Overload.h:181
@ Template
We are parsing a template declaration.
Definition Parser.h:81
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition Sema.h:689
@ Compatible
Compatible - the types are compatible according to the standard.
Definition Sema.h:691
ExprResult ExprError()
Definition Ownership.h:265
CastKind
CastKind - The kind of operation required for a conversion.
AssignmentAction
Definition Sema.h:216
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
Expr * IgnoreParensSingleStep(Expr *E)
Definition IgnoreExpr.h:157
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:150
@ NK_Not_Narrowing
Not a narrowing conversion.
Definition Overload.h:276
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
Definition Overload.h:282
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
Definition Overload.h:290
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
Definition Overload.h:279
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
Definition Overload.h:286
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1288
U cast(CodeGen::Address addr)
Definition Address.h:327
ConstructorInfo getConstructorInfo(NamedDecl *ND)
Definition Overload.h:1519
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ Braces
New-expression has a C++11 list-initializer.
Definition ExprCXX.h:2249
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:438
@ Implicit
An implicit conversion.
Definition Sema.h:440
@ CStyleCast
A C-style cast.
Definition Sema.h:442
@ OtherCast
A cast other than a C-style cast.
Definition Sema.h:446
@ FunctionalCast
A functional-style cast.
Definition Sema.h:444
unsigned long uint64_t
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
CXXConstructorDecl * Constructor
Definition Overload.h:1511
DeclAccessPair FoundDecl
Definition Overload.h:1510
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
EvalResult is a struct with detailed info about an evaluated expression.
Definition Expr.h:648
APValue Val
Val - This is the value the expression can be folded to.
Definition Expr.h:650
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Definition Overload.h:933
unsigned FailureKind
FailureKind - The reason why this candidate is not viable.
Definition Overload.h:1015
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
Definition Overload.h:956
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
Definition Overload.h:963
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
Definition Sema.h:6901
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6869
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6907
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6924
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
Definition Overload.h:506