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 // if the initialization is direct-initialization, or if it is
4693 // copy-initialization where the cv-unqualified version of the source type is
4694 // the same as or is derived from the class of the destination type,
4695 // constructors are considered.
4696 if ((Kind.getKind() == InitializationKind::IK_Direct ||
4697 Kind.getKind() == InitializationKind::IK_Copy) &&
4698 Args.size() == 1 &&
4700 Args[0]->getType().getNonReferenceType(),
4701 DestType.getNonReferenceType()))
4702 RequireActualConstructor = true;
4703
4704 // C++11 [over.match.list]p1:
4705 // - If no viable initializer-list constructor is found, overload resolution
4706 // is performed again, where the candidate functions are all the
4707 // constructors of the class T and the argument list consists of the
4708 // elements of the initializer list.
4709 if (Result == OR_No_Viable_Function) {
4710 AsInitializerList = false;
4712 S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4713 Best, CopyInitialization, AllowExplicit,
4714 /*OnlyListConstructors=*/false, IsListInit, RequireActualConstructor);
4715 }
4716 if (Result) {
4717 Sequence.SetOverloadFailure(
4720 Result);
4721
4722 if (Result != OR_Deleted)
4723 return;
4724 }
4725
4726 bool HadMultipleCandidates = (CandidateSet.size() > 1);
4727
4728 // In C++17, ResolveConstructorOverload can select a conversion function
4729 // instead of a constructor.
4730 if (auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4731 // Add the user-defined conversion step that calls the conversion function.
4732 QualType ConvType = CD->getConversionType();
4733 assert(S.Context.hasSameUnqualifiedType(ConvType, DestType) &&
4734 "should not have selected this conversion function");
4735 Sequence.AddUserConversionStep(CD, Best->FoundDecl, ConvType,
4736 HadMultipleCandidates);
4737 if (!S.Context.hasSameType(ConvType, DestType))
4738 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
4739 if (IsListInit)
4740 Sequence.RewrapReferenceInitList(Entity.getType(), ILE);
4741 return;
4742 }
4743
4744 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
4745 if (Result != OR_Deleted) {
4746 if (!IsListInit &&
4747 (Kind.getKind() == InitializationKind::IK_Default ||
4748 Kind.getKind() == InitializationKind::IK_Direct) &&
4749 !(CtorDecl->isCopyOrMoveConstructor() && CtorDecl->isImplicit()) &&
4750 DestRecordDecl->isAggregate() &&
4751 DestRecordDecl->hasUninitializedExplicitInitFields() &&
4752 !S.isUnevaluatedContext()) {
4753 S.Diag(Kind.getLocation(), diag::warn_field_requires_explicit_init)
4754 << /* Var-in-Record */ 1 << DestRecordDecl;
4755 emitUninitializedExplicitInitFields(S, DestRecordDecl);
4756 }
4757
4758 // C++11 [dcl.init]p6:
4759 // If a program calls for the default initialization of an object
4760 // of a const-qualified type T, T shall be a class type with a
4761 // user-provided default constructor.
4762 // C++ core issue 253 proposal:
4763 // If the implicit default constructor initializes all subobjects, no
4764 // initializer should be required.
4765 // The 253 proposal is for example needed to process libstdc++ headers
4766 // in 5.x.
4767 if (Kind.getKind() == InitializationKind::IK_Default &&
4768 Entity.getType().isConstQualified()) {
4769 if (!CtorDecl->getParent()->allowConstDefaultInit()) {
4770 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
4772 return;
4773 }
4774 }
4775
4776 // C++11 [over.match.list]p1:
4777 // In copy-list-initialization, if an explicit constructor is chosen, the
4778 // initializer is ill-formed.
4779 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
4781 return;
4782 }
4783 }
4784
4785 // [class.copy.elision]p3:
4786 // In some copy-initialization contexts, a two-stage overload resolution
4787 // is performed.
4788 // If the first overload resolution selects a deleted function, we also
4789 // need the initialization sequence to decide whether to perform the second
4790 // overload resolution.
4791 // For deleted functions in other contexts, there is no need to get the
4792 // initialization sequence.
4793 if (Result == OR_Deleted && Kind.getKind() != InitializationKind::IK_Copy)
4794 return;
4795
4796 // Add the constructor initialization step. Any cv-qualification conversion is
4797 // subsumed by the initialization.
4799 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4800 IsListInit | IsInitListCopy, AsInitializerList);
4801}
4802
4804 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4805 ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly,
4806 ExprResult *Result = nullptr);
4807
4808/// Attempt to initialize an object of a class type either by
4809/// direct-initialization, or by copy-initialization from an
4810/// expression of the same or derived class type. This corresponds
4811/// to the first two sub-bullets of C++2c [dcl.init.general] p16.6.
4812///
4813/// \param IsAggrListInit Is this non-list-initialization being done as
4814/// part of a list-initialization of an aggregate
4815/// from a single expression of the same or
4816/// derived class type (C++2c [dcl.init.list] p3.2)?
4818 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
4819 MultiExprArg Args, QualType DestType, InitializationSequence &Sequence,
4820 bool IsAggrListInit) {
4821 // C++2c [dcl.init.general] p16.6:
4822 // * Otherwise, if the destination type is a class type:
4823 // * If the initializer expression is a prvalue and
4824 // the cv-unqualified version of the source type is the same
4825 // as the destination type, the initializer expression is used
4826 // to initialize the destination object.
4827 // * Otherwise, if the initialization is direct-initialization,
4828 // or if it is copy-initialization where the cv-unqualified
4829 // version of the source type is the same as or is derived from
4830 // the class of the destination type, constructors are considered.
4831 // The applicable constructors are enumerated, and the best one
4832 // is chosen through overload resolution. Then:
4833 // * If overload resolution is successful, the selected
4834 // constructor is called to initialize the object, with
4835 // the initializer expression or expression-list as its
4836 // argument(s).
4837 TryConstructorInitialization(S, Entity, Kind, Args, DestType, DestType,
4838 Sequence, /*IsListInit=*/false, IsAggrListInit);
4839
4840 // * Otherwise, if no constructor is viable, the destination type
4841 // is an aggregate class, and the initializer is a parenthesized
4842 // expression-list, the object is initialized as follows. [...]
4843 // Parenthesized initialization of aggregates is a C++20 feature.
4844 if (S.getLangOpts().CPlusPlus20 &&
4845 Kind.getKind() == InitializationKind::IK_Direct && Sequence.Failed() &&
4846 Sequence.getFailureKind() ==
4849 (IsAggrListInit || DestType->isAggregateType()))
4850 TryOrBuildParenListInitialization(S, Entity, Kind, Args, Sequence,
4851 /*VerifyOnly=*/true);
4852
4853 // * Otherwise, the initialization is ill-formed.
4854}
4855
4856static bool
4859 QualType &SourceType,
4860 QualType &UnqualifiedSourceType,
4861 QualType UnqualifiedTargetType,
4862 InitializationSequence &Sequence) {
4863 if (S.Context.getCanonicalType(UnqualifiedSourceType) ==
4864 S.Context.OverloadTy) {
4866 bool HadMultipleCandidates = false;
4867 if (FunctionDecl *Fn
4869 UnqualifiedTargetType,
4870 false, Found,
4871 &HadMultipleCandidates)) {
4873 HadMultipleCandidates);
4874 SourceType = Fn->getType();
4875 UnqualifiedSourceType = SourceType.getUnqualifiedType();
4876 } else if (!UnqualifiedTargetType->isRecordType()) {
4878 return true;
4879 }
4880 }
4881 return false;
4882}
4883
4884static void TryReferenceInitializationCore(Sema &S,
4885 const InitializedEntity &Entity,
4886 const InitializationKind &Kind,
4887 Expr *Initializer,
4888 QualType cv1T1, QualType T1,
4889 Qualifiers T1Quals,
4890 QualType cv2T2, QualType T2,
4891 Qualifiers T2Quals,
4892 InitializationSequence &Sequence,
4893 bool TopLevelOfInitList);
4894
4895static void TryValueInitialization(Sema &S,
4896 const InitializedEntity &Entity,
4897 const InitializationKind &Kind,
4898 InitializationSequence &Sequence,
4899 InitListExpr *InitList = nullptr);
4900
4901/// Attempt list initialization of a reference.
4903 const InitializedEntity &Entity,
4904 const InitializationKind &Kind,
4905 InitListExpr *InitList,
4906 InitializationSequence &Sequence,
4907 bool TreatUnavailableAsInvalid) {
4908 // First, catch C++03 where this isn't possible.
4909 if (!S.getLangOpts().CPlusPlus11) {
4911 return;
4912 }
4913 // Can't reference initialize a compound literal.
4916 return;
4917 }
4918
4919 QualType DestType = Entity.getType();
4920 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
4921 Qualifiers T1Quals;
4922 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
4923
4924 // Reference initialization via an initializer list works thus:
4925 // If the initializer list consists of a single element that is
4926 // reference-related to the referenced type, bind directly to that element
4927 // (possibly creating temporaries).
4928 // Otherwise, initialize a temporary with the initializer list and
4929 // bind to that.
4930 if (InitList->getNumInits() == 1) {
4931 Expr *Initializer = InitList->getInit(0);
4933 Qualifiers T2Quals;
4934 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
4935
4936 // If this fails, creating a temporary wouldn't work either.
4938 T1, Sequence))
4939 return;
4940
4941 SourceLocation DeclLoc = Initializer->getBeginLoc();
4942 Sema::ReferenceCompareResult RefRelationship
4943 = S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2);
4944 if (RefRelationship >= Sema::Ref_Related) {
4945 // Try to bind the reference here.
4946 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
4947 T1Quals, cv2T2, T2, T2Quals, Sequence,
4948 /*TopLevelOfInitList=*/true);
4949 if (Sequence)
4950 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4951 return;
4952 }
4953
4954 // Update the initializer if we've resolved an overloaded function.
4955 if (!Sequence.steps().empty())
4956 Sequence.RewrapReferenceInitList(cv1T1, InitList);
4957 }
4958 // Perform address space compatibility check.
4959 QualType cv1T1IgnoreAS = cv1T1;
4960 if (T1Quals.hasAddressSpace()) {
4961 Qualifiers T2Quals;
4962 (void)S.Context.getUnqualifiedArrayType(InitList->getType(), T2Quals);
4963 if (!T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext())) {
4964 Sequence.SetFailed(
4966 return;
4967 }
4968 // Ignore address space of reference type at this point and perform address
4969 // space conversion after the reference binding step.
4970 cv1T1IgnoreAS =
4972 }
4973 // Not reference-related. Create a temporary and bind to that.
4974 InitializedEntity TempEntity =
4976
4977 TryListInitialization(S, TempEntity, Kind, InitList, Sequence,
4978 TreatUnavailableAsInvalid);
4979 if (Sequence) {
4980 if (DestType->isRValueReferenceType() ||
4981 (T1Quals.hasConst() && !T1Quals.hasVolatile())) {
4982 if (S.getLangOpts().CPlusPlus20 &&
4984 DestType->isRValueReferenceType()) {
4985 // C++20 [dcl.init.list]p3.10:
4986 // List-initialization of an object or reference of type T is defined as
4987 // follows:
4988 // ..., unless T is “reference to array of unknown bound of U”, in which
4989 // case the type of the prvalue is the type of x in the declaration U
4990 // x[] H, where H is the initializer list.
4992 }
4993 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS,
4994 /*BindingTemporary=*/true);
4995 if (T1Quals.hasAddressSpace())
4997 cv1T1, DestType->isRValueReferenceType() ? VK_XValue : VK_LValue);
4998 } else
4999 Sequence.SetFailed(
5001 }
5002}
5003
5004/// Attempt list initialization (C++0x [dcl.init.list])
5006 const InitializedEntity &Entity,
5007 const InitializationKind &Kind,
5008 InitListExpr *InitList,
5009 InitializationSequence &Sequence,
5010 bool TreatUnavailableAsInvalid) {
5011 QualType DestType = Entity.getType();
5012
5013 if (S.getLangOpts().HLSL && !S.HLSL().transformInitList(Entity, InitList)) {
5015 return;
5016 }
5017
5018 // C++ doesn't allow scalar initialization with more than one argument.
5019 // But C99 complex numbers are scalars and it makes sense there.
5020 if (S.getLangOpts().CPlusPlus && DestType->isScalarType() &&
5021 !DestType->isAnyComplexType() && InitList->getNumInits() > 1) {
5023 return;
5024 }
5025 if (DestType->isReferenceType()) {
5026 TryReferenceListInitialization(S, Entity, Kind, InitList, Sequence,
5027 TreatUnavailableAsInvalid);
5028 return;
5029 }
5030
5031 if (DestType->isRecordType() &&
5032 !S.isCompleteType(InitList->getBeginLoc(), DestType)) {
5033 Sequence.setIncompleteTypeFailure(DestType);
5034 return;
5035 }
5036
5037 // C++20 [dcl.init.list]p3:
5038 // - If the braced-init-list contains a designated-initializer-list, T shall
5039 // be an aggregate class. [...] Aggregate initialization is performed.
5040 //
5041 // We allow arrays here too in order to support array designators.
5042 //
5043 // FIXME: This check should precede the handling of reference initialization.
5044 // We follow other compilers in allowing things like 'Aggr &&a = {.x = 1};'
5045 // as a tentative DR resolution.
5046 bool IsDesignatedInit = InitList->hasDesignatedInit();
5047 if (!DestType->isAggregateType() && IsDesignatedInit) {
5048 Sequence.SetFailed(
5050 return;
5051 }
5052
5053 // C++11 [dcl.init.list]p3, per DR1467 and DR2137:
5054 // - If T is an aggregate class and the initializer list has a single element
5055 // of type cv U, where U is T or a class derived from T, the object is
5056 // initialized from that element (by copy-initialization for
5057 // copy-list-initialization, or by direct-initialization for
5058 // direct-list-initialization).
5059 // - Otherwise, if T is a character array and the initializer list has a
5060 // single element that is an appropriately-typed string literal
5061 // (8.5.2 [dcl.init.string]), initialization is performed as described
5062 // in that section.
5063 // - Otherwise, if T is an aggregate, [...] (continue below).
5064 if (S.getLangOpts().CPlusPlus11 && InitList->getNumInits() == 1 &&
5065 !IsDesignatedInit) {
5066 if (DestType->isRecordType() && DestType->isAggregateType()) {
5067 QualType InitType = InitList->getInit(0)->getType();
5068 if (S.Context.hasSameUnqualifiedType(InitType, DestType) ||
5069 S.IsDerivedFrom(InitList->getBeginLoc(), InitType, DestType)) {
5070 InitializationKind SubKind =
5072 ? InitializationKind::CreateDirect(Kind.getLocation(),
5073 InitList->getLBraceLoc(),
5074 InitList->getRBraceLoc())
5075 : Kind;
5076 Expr *InitListAsExpr = InitList;
5078 S, Entity, SubKind, InitListAsExpr, DestType, Sequence,
5079 /*IsAggrListInit=*/true);
5080 return;
5081 }
5082 }
5083 if (const ArrayType *DestAT = S.Context.getAsArrayType(DestType)) {
5084 Expr *SubInit[1] = {InitList->getInit(0)};
5085
5086 // C++17 [dcl.struct.bind]p1:
5087 // ... If the assignment-expression in the initializer has array type A
5088 // and no ref-qualifier is present, e has type cv A and each element is
5089 // copy-initialized or direct-initialized from the corresponding element
5090 // of the assignment-expression as specified by the form of the
5091 // initializer. ...
5092 //
5093 // This is a special case not following list-initialization.
5094 if (isa<ConstantArrayType>(DestAT) &&
5096 isa<DecompositionDecl>(Entity.getDecl())) {
5097 assert(
5098 S.Context.hasSameUnqualifiedType(SubInit[0]->getType(), DestType) &&
5099 "Deduced to other type?");
5100 assert(Kind.getKind() == clang::InitializationKind::IK_DirectList &&
5101 "List-initialize structured bindings but not "
5102 "direct-list-initialization?");
5103 TryArrayCopy(S,
5104 InitializationKind::CreateDirect(Kind.getLocation(),
5105 InitList->getLBraceLoc(),
5106 InitList->getRBraceLoc()),
5107 Entity, SubInit[0], DestType, Sequence,
5108 TreatUnavailableAsInvalid);
5109 if (Sequence)
5110 Sequence.AddUnwrapInitListInitStep(InitList);
5111 return;
5112 }
5113
5114 if (!isa<VariableArrayType>(DestAT) &&
5115 IsStringInit(SubInit[0], DestAT, S.Context) == SIF_None) {
5116 InitializationKind SubKind =
5118 ? InitializationKind::CreateDirect(Kind.getLocation(),
5119 InitList->getLBraceLoc(),
5120 InitList->getRBraceLoc())
5121 : Kind;
5122 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
5123 /*TopLevelOfInitList*/ true,
5124 TreatUnavailableAsInvalid);
5125
5126 // TryStringLiteralInitialization() (in InitializeFrom()) will fail if
5127 // the element is not an appropriately-typed string literal, in which
5128 // case we should proceed as in C++11 (below).
5129 if (Sequence) {
5130 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
5131 return;
5132 }
5133 }
5134 }
5135 }
5136
5137 // C++11 [dcl.init.list]p3:
5138 // - If T is an aggregate, aggregate initialization is performed.
5139 if ((DestType->isRecordType() && !DestType->isAggregateType()) ||
5140 (S.getLangOpts().CPlusPlus11 &&
5141 S.isStdInitializerList(DestType, nullptr) && !IsDesignatedInit)) {
5142 if (S.getLangOpts().CPlusPlus11) {
5143 // - Otherwise, if the initializer list has no elements and T is a
5144 // class type with a default constructor, the object is
5145 // value-initialized.
5146 if (InitList->getNumInits() == 0) {
5147 CXXRecordDecl *RD = DestType->castAsCXXRecordDecl();
5148 if (S.LookupDefaultConstructor(RD)) {
5149 TryValueInitialization(S, Entity, Kind, Sequence, InitList);
5150 return;
5151 }
5152 }
5153
5154 // - Otherwise, if T is a specialization of std::initializer_list<E>,
5155 // an initializer_list object constructed [...]
5156 if (TryInitializerListConstruction(S, InitList, DestType, Sequence,
5157 TreatUnavailableAsInvalid))
5158 return;
5159
5160 // - Otherwise, if T is a class type, constructors are considered.
5161 Expr *InitListAsExpr = InitList;
5162 TryConstructorInitialization(S, Entity, Kind, InitListAsExpr, DestType,
5163 DestType, Sequence, /*InitListSyntax*/true);
5164 } else
5166 return;
5167 }
5168
5169 if (S.getLangOpts().CPlusPlus && !DestType->isAggregateType() &&
5170 InitList->getNumInits() == 1) {
5171 Expr *E = InitList->getInit(0);
5172
5173 // - Otherwise, if T is an enumeration with a fixed underlying type,
5174 // the initializer-list has a single element v, and the initialization
5175 // is direct-list-initialization, the object is initialized with the
5176 // value T(v); if a narrowing conversion is required to convert v to
5177 // the underlying type of T, the program is ill-formed.
5178 if (S.getLangOpts().CPlusPlus17 &&
5179 Kind.getKind() == InitializationKind::IK_DirectList &&
5180 DestType->isEnumeralType() && DestType->castAsEnumDecl()->isFixed() &&
5181 !S.Context.hasSameUnqualifiedType(E->getType(), DestType) &&
5183 E->getType()->isFloatingType())) {
5184 // There are two ways that T(v) can work when T is an enumeration type.
5185 // If there is either an implicit conversion sequence from v to T or
5186 // a conversion function that can convert from v to T, then we use that.
5187 // Otherwise, if v is of integral, unscoped enumeration, or floating-point
5188 // type, it is converted to the enumeration type via its underlying type.
5189 // There is no overlap possible between these two cases (except when the
5190 // source value is already of the destination type), and the first
5191 // case is handled by the general case for single-element lists below.
5193 ICS.setStandard();
5195 if (!E->isPRValue())
5197 // If E is of a floating-point type, then the conversion is ill-formed
5198 // due to narrowing, but go through the motions in order to produce the
5199 // right diagnostic.
5203 ICS.Standard.setFromType(E->getType());
5204 ICS.Standard.setToType(0, E->getType());
5205 ICS.Standard.setToType(1, DestType);
5206 ICS.Standard.setToType(2, DestType);
5207 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2),
5208 /*TopLevelOfInitList*/true);
5209 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
5210 return;
5211 }
5212
5213 // - Otherwise, if the initializer list has a single element of type E
5214 // [...references are handled above...], the object or reference is
5215 // initialized from that element (by copy-initialization for
5216 // copy-list-initialization, or by direct-initialization for
5217 // direct-list-initialization); if a narrowing conversion is required
5218 // to convert the element to T, the program is ill-formed.
5219 //
5220 // Per core-24034, this is direct-initialization if we were performing
5221 // direct-list-initialization and copy-initialization otherwise.
5222 // We can't use InitListChecker for this, because it always performs
5223 // copy-initialization. This only matters if we might use an 'explicit'
5224 // conversion operator, or for the special case conversion of nullptr_t to
5225 // bool, so we only need to handle those cases.
5226 //
5227 // FIXME: Why not do this in all cases?
5228 Expr *Init = InitList->getInit(0);
5229 if (Init->getType()->isRecordType() ||
5230 (Init->getType()->isNullPtrType() && DestType->isBooleanType())) {
5231 InitializationKind SubKind =
5233 ? InitializationKind::CreateDirect(Kind.getLocation(),
5234 InitList->getLBraceLoc(),
5235 InitList->getRBraceLoc())
5236 : Kind;
5237 Expr *SubInit[1] = { Init };
5238 Sequence.InitializeFrom(S, Entity, SubKind, SubInit,
5239 /*TopLevelOfInitList*/true,
5240 TreatUnavailableAsInvalid);
5241 if (Sequence)
5242 Sequence.RewrapReferenceInitList(Entity.getType(), InitList);
5243 return;
5244 }
5245 }
5246
5247 InitListChecker CheckInitList(S, Entity, InitList,
5248 DestType, /*VerifyOnly=*/true, TreatUnavailableAsInvalid);
5249 if (CheckInitList.HadError()) {
5251 return;
5252 }
5253
5254 // Add the list initialization step with the built init list.
5255 Sequence.AddListInitializationStep(DestType);
5256}
5257
5258/// Try a reference initialization that involves calling a conversion
5259/// function.
5261 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
5262 Expr *Initializer, bool AllowRValues, bool IsLValueRef,
5263 InitializationSequence &Sequence) {
5264 QualType DestType = Entity.getType();
5265 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
5266 QualType T1 = cv1T1.getUnqualifiedType();
5267 QualType cv2T2 = Initializer->getType();
5268 QualType T2 = cv2T2.getUnqualifiedType();
5269
5270 assert(!S.CompareReferenceRelationship(Initializer->getBeginLoc(), T1, T2) &&
5271 "Must have incompatible references when binding via conversion");
5272
5273 // Build the candidate set directly in the initialization sequence
5274 // structure, so that it will persist if we fail.
5275 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
5277
5278 // Determine whether we are allowed to call explicit conversion operators.
5279 // Note that none of [over.match.copy], [over.match.conv], nor
5280 // [over.match.ref] permit an explicit constructor to be chosen when
5281 // initializing a reference, not even for direct-initialization.
5282 bool AllowExplicitCtors = false;
5283 bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
5284
5285 if (AllowRValues && T1->isRecordType() &&
5286 S.isCompleteType(Kind.getLocation(), T1)) {
5287 auto *T1RecordDecl = T1->castAsCXXRecordDecl();
5288 if (T1RecordDecl->isInvalidDecl())
5289 return OR_No_Viable_Function;
5290 // The type we're converting to is a class type. Enumerate its constructors
5291 // to see if there is a suitable conversion.
5292 for (NamedDecl *D : S.LookupConstructors(T1RecordDecl)) {
5293 auto Info = getConstructorInfo(D);
5294 if (!Info.Constructor)
5295 continue;
5296
5297 if (!Info.Constructor->isInvalidDecl() &&
5298 Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
5299 if (Info.ConstructorTmpl)
5301 Info.ConstructorTmpl, Info.FoundDecl,
5302 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
5303 /*SuppressUserConversions=*/true,
5304 /*PartialOverloading*/ false, AllowExplicitCtors);
5305 else
5307 Info.Constructor, Info.FoundDecl, Initializer, CandidateSet,
5308 /*SuppressUserConversions=*/true,
5309 /*PartialOverloading*/ false, AllowExplicitCtors);
5310 }
5311 }
5312 }
5313
5314 if (T2->isRecordType() && S.isCompleteType(Kind.getLocation(), T2)) {
5315 const auto *T2RecordDecl = T2->castAsCXXRecordDecl();
5316 if (T2RecordDecl->isInvalidDecl())
5317 return OR_No_Viable_Function;
5318 // The type we're converting from is a class type, enumerate its conversion
5319 // functions.
5320 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5321 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5322 NamedDecl *D = *I;
5324 if (isa<UsingShadowDecl>(D))
5325 D = cast<UsingShadowDecl>(D)->getTargetDecl();
5326
5327 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
5328 CXXConversionDecl *Conv;
5329 if (ConvTemplate)
5330 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
5331 else
5332 Conv = cast<CXXConversionDecl>(D);
5333
5334 // If the conversion function doesn't return a reference type,
5335 // it can't be considered for this conversion unless we're allowed to
5336 // consider rvalues.
5337 // FIXME: Do we need to make sure that we only consider conversion
5338 // candidates with reference-compatible results? That might be needed to
5339 // break recursion.
5340 if ((AllowRValues ||
5342 if (ConvTemplate)
5344 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
5345 CandidateSet,
5346 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
5347 else
5349 Conv, I.getPair(), ActingDC, Initializer, DestType, CandidateSet,
5350 /*AllowObjCConversionOnExplicit=*/false, AllowExplicitConvs);
5351 }
5352 }
5353 }
5354
5355 SourceLocation DeclLoc = Initializer->getBeginLoc();
5356
5357 // Perform overload resolution. If it fails, return the failed result.
5359 if (OverloadingResult Result
5360 = CandidateSet.BestViableFunction(S, DeclLoc, Best))
5361 return Result;
5362
5363 FunctionDecl *Function = Best->Function;
5364 // This is the overload that will be used for this initialization step if we
5365 // use this initialization. Mark it as referenced.
5366 Function->setReferenced();
5367
5368 // Compute the returned type and value kind of the conversion.
5369 QualType cv3T3;
5370 if (isa<CXXConversionDecl>(Function))
5371 cv3T3 = Function->getReturnType();
5372 else
5373 cv3T3 = T1;
5374
5376 if (cv3T3->isLValueReferenceType())
5377 VK = VK_LValue;
5378 else if (const auto *RRef = cv3T3->getAs<RValueReferenceType>())
5379 VK = RRef->getPointeeType()->isFunctionType() ? VK_LValue : VK_XValue;
5380 cv3T3 = cv3T3.getNonLValueExprType(S.Context);
5381
5382 // Add the user-defined conversion step.
5383 bool HadMultipleCandidates = (CandidateSet.size() > 1);
5384 Sequence.AddUserConversionStep(Function, Best->FoundDecl, cv3T3,
5385 HadMultipleCandidates);
5386
5387 // Determine whether we'll need to perform derived-to-base adjustments or
5388 // other conversions.
5390 Sema::ReferenceCompareResult NewRefRelationship =
5391 S.CompareReferenceRelationship(DeclLoc, T1, cv3T3, &RefConv);
5392
5393 // Add the final conversion sequence, if necessary.
5394 if (NewRefRelationship == Sema::Ref_Incompatible) {
5395 assert(Best->HasFinalConversion && !isa<CXXConstructorDecl>(Function) &&
5396 "should not have conversion after constructor");
5397
5399 ICS.setStandard();
5400 ICS.Standard = Best->FinalConversion;
5401 Sequence.AddConversionSequenceStep(ICS, ICS.Standard.getToType(2));
5402
5403 // Every implicit conversion results in a prvalue, except for a glvalue
5404 // derived-to-base conversion, which we handle below.
5405 cv3T3 = ICS.Standard.getToType(2);
5406 VK = VK_PRValue;
5407 }
5408
5409 // If the converted initializer is a prvalue, its type T4 is adjusted to
5410 // type "cv1 T4" and the temporary materialization conversion is applied.
5411 //
5412 // We adjust the cv-qualifications to match the reference regardless of
5413 // whether we have a prvalue so that the AST records the change. In this
5414 // case, T4 is "cv3 T3".
5415 QualType cv1T4 = S.Context.getQualifiedType(cv3T3, cv1T1.getQualifiers());
5416 if (cv1T4.getQualifiers() != cv3T3.getQualifiers())
5417 Sequence.AddQualificationConversionStep(cv1T4, VK);
5418 Sequence.AddReferenceBindingStep(cv1T4, VK == VK_PRValue);
5419 VK = IsLValueRef ? VK_LValue : VK_XValue;
5420
5421 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5422 Sequence.AddDerivedToBaseCastStep(cv1T1, VK);
5423 else if (RefConv & Sema::ReferenceConversions::ObjC)
5424 Sequence.AddObjCObjectConversionStep(cv1T1);
5425 else if (RefConv & Sema::ReferenceConversions::Function)
5426 Sequence.AddFunctionReferenceConversionStep(cv1T1);
5427 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5428 if (!S.Context.hasSameType(cv1T4, cv1T1))
5429 Sequence.AddQualificationConversionStep(cv1T1, VK);
5430 }
5431
5432 return OR_Success;
5433}
5434
5435static void CheckCXX98CompatAccessibleCopy(Sema &S,
5436 const InitializedEntity &Entity,
5437 Expr *CurInitExpr);
5438
5439/// Attempt reference initialization (C++0x [dcl.init.ref])
5441 const InitializationKind &Kind,
5443 InitializationSequence &Sequence,
5444 bool TopLevelOfInitList) {
5445 QualType DestType = Entity.getType();
5446 QualType cv1T1 = DestType->castAs<ReferenceType>()->getPointeeType();
5447 Qualifiers T1Quals;
5448 QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
5450 Qualifiers T2Quals;
5451 QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
5452
5453 // If the initializer is the address of an overloaded function, try
5454 // to resolve the overloaded function. If all goes well, T2 is the
5455 // type of the resulting function.
5457 T1, Sequence))
5458 return;
5459
5460 // Delegate everything else to a subfunction.
5461 TryReferenceInitializationCore(S, Entity, Kind, Initializer, cv1T1, T1,
5462 T1Quals, cv2T2, T2, T2Quals, Sequence,
5463 TopLevelOfInitList);
5464}
5465
5466/// Determine whether an expression is a non-referenceable glvalue (one to
5467/// which a reference can never bind). Attempting to bind a reference to
5468/// such a glvalue will always create a temporary.
5470 return E->refersToBitField() || E->refersToVectorElement() ||
5472}
5473
5474/// Reference initialization without resolving overloaded functions.
5475///
5476/// We also can get here in C if we call a builtin which is declared as
5477/// a function with a parameter of reference type (such as __builtin_va_end()).
5479 const InitializedEntity &Entity,
5480 const InitializationKind &Kind,
5482 QualType cv1T1, QualType T1,
5483 Qualifiers T1Quals,
5484 QualType cv2T2, QualType T2,
5485 Qualifiers T2Quals,
5486 InitializationSequence &Sequence,
5487 bool TopLevelOfInitList) {
5488 QualType DestType = Entity.getType();
5489 SourceLocation DeclLoc = Initializer->getBeginLoc();
5490
5491 // Compute some basic properties of the types and the initializer.
5492 bool isLValueRef = DestType->isLValueReferenceType();
5493 bool isRValueRef = !isLValueRef;
5494 Expr::Classification InitCategory = Initializer->Classify(S.Context);
5495
5497 Sema::ReferenceCompareResult RefRelationship =
5498 S.CompareReferenceRelationship(DeclLoc, cv1T1, cv2T2, &RefConv);
5499
5500 // C++0x [dcl.init.ref]p5:
5501 // A reference to type "cv1 T1" is initialized by an expression of type
5502 // "cv2 T2" as follows:
5503 //
5504 // - If the reference is an lvalue reference and the initializer
5505 // expression
5506 // Note the analogous bullet points for rvalue refs to functions. Because
5507 // there are no function rvalues in C++, rvalue refs to functions are treated
5508 // like lvalue refs.
5509 OverloadingResult ConvOvlResult = OR_Success;
5510 bool T1Function = T1->isFunctionType();
5511 if (isLValueRef || T1Function) {
5512 if (InitCategory.isLValue() && !isNonReferenceableGLValue(Initializer) &&
5513 (RefRelationship == Sema::Ref_Compatible ||
5514 (Kind.isCStyleOrFunctionalCast() &&
5515 RefRelationship == Sema::Ref_Related))) {
5516 // - is an lvalue (but is not a bit-field), and "cv1 T1" is
5517 // reference-compatible with "cv2 T2," or
5518 if (RefConv & (Sema::ReferenceConversions::DerivedToBase |
5519 Sema::ReferenceConversions::ObjC)) {
5520 // If we're converting the pointee, add any qualifiers first;
5521 // these qualifiers must all be top-level, so just convert to "cv1 T2".
5522 if (RefConv & (Sema::ReferenceConversions::Qualification))
5524 S.Context.getQualifiedType(T2, T1Quals),
5525 Initializer->getValueKind());
5526 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5527 Sequence.AddDerivedToBaseCastStep(cv1T1, VK_LValue);
5528 else
5529 Sequence.AddObjCObjectConversionStep(cv1T1);
5530 } else if (RefConv & Sema::ReferenceConversions::Qualification) {
5531 // Perform a (possibly multi-level) qualification conversion.
5532 Sequence.AddQualificationConversionStep(cv1T1,
5533 Initializer->getValueKind());
5534 } else if (RefConv & Sema::ReferenceConversions::Function) {
5535 Sequence.AddFunctionReferenceConversionStep(cv1T1);
5536 }
5537
5538 // We only create a temporary here when binding a reference to a
5539 // bit-field or vector element. Those cases are't supposed to be
5540 // handled by this bullet, but the outcome is the same either way.
5541 Sequence.AddReferenceBindingStep(cv1T1, false);
5542 return;
5543 }
5544
5545 // - has a class type (i.e., T2 is a class type), where T1 is not
5546 // reference-related to T2, and can be implicitly converted to an
5547 // lvalue of type "cv3 T3," where "cv1 T1" is reference-compatible
5548 // with "cv3 T3" (this conversion is selected by enumerating the
5549 // applicable conversion functions (13.3.1.6) and choosing the best
5550 // one through overload resolution (13.3)),
5551 // If we have an rvalue ref to function type here, the rhs must be
5552 // an rvalue. DR1287 removed the "implicitly" here.
5553 if (RefRelationship == Sema::Ref_Incompatible && T2->isRecordType() &&
5554 (isLValueRef || InitCategory.isRValue())) {
5555 if (S.getLangOpts().CPlusPlus) {
5556 // Try conversion functions only for C++.
5557 ConvOvlResult = TryRefInitWithConversionFunction(
5558 S, Entity, Kind, Initializer, /*AllowRValues*/ isRValueRef,
5559 /*IsLValueRef*/ isLValueRef, Sequence);
5560 if (ConvOvlResult == OR_Success)
5561 return;
5562 if (ConvOvlResult != OR_No_Viable_Function)
5563 Sequence.SetOverloadFailure(
5565 ConvOvlResult);
5566 } else {
5567 ConvOvlResult = OR_No_Viable_Function;
5568 }
5569 }
5570 }
5571
5572 // - Otherwise, the reference shall be an lvalue reference to a
5573 // non-volatile const type (i.e., cv1 shall be const), or the reference
5574 // shall be an rvalue reference.
5575 // For address spaces, we interpret this to mean that an addr space
5576 // of a reference "cv1 T1" is a superset of addr space of "cv2 T2".
5577 if (isLValueRef &&
5578 !(T1Quals.hasConst() && !T1Quals.hasVolatile() &&
5579 T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext()))) {
5582 else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5583 Sequence.SetOverloadFailure(
5585 ConvOvlResult);
5586 else if (!InitCategory.isLValue())
5587 Sequence.SetFailed(
5588 T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext())
5592 else {
5594 switch (RefRelationship) {
5596 if (Initializer->refersToBitField())
5597 FK = InitializationSequence::
5598 FK_NonConstLValueReferenceBindingToBitfield;
5599 else if (Initializer->refersToVectorElement())
5600 FK = InitializationSequence::
5601 FK_NonConstLValueReferenceBindingToVectorElement;
5602 else if (Initializer->refersToMatrixElement())
5603 FK = InitializationSequence::
5604 FK_NonConstLValueReferenceBindingToMatrixElement;
5605 else
5606 llvm_unreachable("unexpected kind of compatible initializer");
5607 break;
5608 case Sema::Ref_Related:
5610 break;
5612 FK = InitializationSequence::
5613 FK_NonConstLValueReferenceBindingToUnrelated;
5614 break;
5615 }
5616 Sequence.SetFailed(FK);
5617 }
5618 return;
5619 }
5620
5621 // - If the initializer expression
5622 // - is an
5623 // [<=14] xvalue (but not a bit-field), class prvalue, array prvalue, or
5624 // [1z] rvalue (but not a bit-field) or
5625 // function lvalue and "cv1 T1" is reference-compatible with "cv2 T2"
5626 //
5627 // Note: functions are handled above and below rather than here...
5628 if (!T1Function &&
5629 (RefRelationship == Sema::Ref_Compatible ||
5630 (Kind.isCStyleOrFunctionalCast() &&
5631 RefRelationship == Sema::Ref_Related)) &&
5632 ((InitCategory.isXValue() && !isNonReferenceableGLValue(Initializer)) ||
5633 (InitCategory.isPRValue() &&
5634 (S.getLangOpts().CPlusPlus17 || T2->isRecordType() ||
5635 T2->isArrayType())))) {
5636 ExprValueKind ValueKind = InitCategory.isXValue() ? VK_XValue : VK_PRValue;
5637 if (InitCategory.isPRValue() && T2->isRecordType()) {
5638 // The corresponding bullet in C++03 [dcl.init.ref]p5 gives the
5639 // compiler the freedom to perform a copy here or bind to the
5640 // object, while C++0x requires that we bind directly to the
5641 // object. Hence, we always bind to the object without making an
5642 // extra copy. However, in C++03 requires that we check for the
5643 // presence of a suitable copy constructor:
5644 //
5645 // The constructor that would be used to make the copy shall
5646 // be callable whether or not the copy is actually done.
5647 if (!S.getLangOpts().CPlusPlus11 && !S.getLangOpts().MicrosoftExt)
5648 Sequence.AddExtraneousCopyToTemporary(cv2T2);
5649 else if (S.getLangOpts().CPlusPlus11)
5651 }
5652
5653 // C++1z [dcl.init.ref]/5.2.1.2:
5654 // If the converted initializer is a prvalue, its type T4 is adjusted
5655 // to type "cv1 T4" and the temporary materialization conversion is
5656 // applied.
5657 // Postpone address space conversions to after the temporary materialization
5658 // conversion to allow creating temporaries in the alloca address space.
5659 auto T1QualsIgnoreAS = T1Quals;
5660 auto T2QualsIgnoreAS = T2Quals;
5661 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5662 T1QualsIgnoreAS.removeAddressSpace();
5663 T2QualsIgnoreAS.removeAddressSpace();
5664 }
5665 // Strip the existing ObjC lifetime qualifier from cv2T2 before combining
5666 // with T1's qualifiers.
5667 QualType T2ForQualConv = cv2T2;
5668 if (T1Quals.getObjCLifetime() != T2Quals.getObjCLifetime()) {
5669 Qualifiers T2BaseQuals =
5670 T2ForQualConv.getQualifiers().withoutObjCLifetime();
5671 T2ForQualConv = S.Context.getQualifiedType(
5672 T2ForQualConv.getUnqualifiedType(), T2BaseQuals);
5673 }
5674 QualType cv1T4 = S.Context.getQualifiedType(T2ForQualConv, T1QualsIgnoreAS);
5675 if (T1QualsIgnoreAS != T2QualsIgnoreAS)
5676 Sequence.AddQualificationConversionStep(cv1T4, ValueKind);
5677 Sequence.AddReferenceBindingStep(cv1T4, ValueKind == VK_PRValue);
5678 ValueKind = isLValueRef ? VK_LValue : VK_XValue;
5679 // Add addr space conversion if required.
5680 if (T1Quals.getAddressSpace() != T2Quals.getAddressSpace()) {
5681 auto T4Quals = cv1T4.getQualifiers();
5682 T4Quals.addAddressSpace(T1Quals.getAddressSpace());
5683 QualType cv1T4WithAS = S.Context.getQualifiedType(T2, T4Quals);
5684 Sequence.AddQualificationConversionStep(cv1T4WithAS, ValueKind);
5685 cv1T4 = cv1T4WithAS;
5686 }
5687
5688 // In any case, the reference is bound to the resulting glvalue (or to
5689 // an appropriate base class subobject).
5690 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5691 Sequence.AddDerivedToBaseCastStep(cv1T1, ValueKind);
5692 else if (RefConv & Sema::ReferenceConversions::ObjC)
5693 Sequence.AddObjCObjectConversionStep(cv1T1);
5694 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5695 if (!S.Context.hasSameType(cv1T4, cv1T1))
5696 Sequence.AddQualificationConversionStep(cv1T1, ValueKind);
5697 }
5698 return;
5699 }
5700
5701 // - has a class type (i.e., T2 is a class type), where T1 is not
5702 // reference-related to T2, and can be implicitly converted to an
5703 // xvalue, class prvalue, or function lvalue of type "cv3 T3",
5704 // where "cv1 T1" is reference-compatible with "cv3 T3",
5705 //
5706 // DR1287 removes the "implicitly" here.
5707 if (T2->isRecordType()) {
5708 if (RefRelationship == Sema::Ref_Incompatible) {
5709 ConvOvlResult = TryRefInitWithConversionFunction(
5710 S, Entity, Kind, Initializer, /*AllowRValues*/ true,
5711 /*IsLValueRef*/ isLValueRef, Sequence);
5712 if (ConvOvlResult)
5713 Sequence.SetOverloadFailure(
5715 ConvOvlResult);
5716
5717 return;
5718 }
5719
5720 if (RefRelationship == Sema::Ref_Compatible &&
5721 isRValueRef && InitCategory.isLValue()) {
5722 Sequence.SetFailed(
5724 return;
5725 }
5726
5728 return;
5729 }
5730
5731 // - Otherwise, a temporary of type "cv1 T1" is created and initialized
5732 // from the initializer expression using the rules for a non-reference
5733 // copy-initialization (8.5). The reference is then bound to the
5734 // temporary. [...]
5735
5736 // Ignore address space of reference type at this point and perform address
5737 // space conversion after the reference binding step.
5738 QualType cv1T1IgnoreAS =
5739 T1Quals.hasAddressSpace()
5741 : cv1T1;
5742
5743 InitializedEntity TempEntity =
5745
5746 // FIXME: Why do we use an implicit conversion here rather than trying
5747 // copy-initialization?
5749 = S.TryImplicitConversion(Initializer, TempEntity.getType(),
5750 /*SuppressUserConversions=*/false,
5751 Sema::AllowedExplicit::None,
5752 /*FIXME:InOverloadResolution=*/false,
5753 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
5754 /*AllowObjCWritebackConversion=*/false);
5755
5756 if (ICS.isBad()) {
5757 // FIXME: Use the conversion function set stored in ICS to turn
5758 // this into an overloading ambiguity diagnostic. However, we need
5759 // to keep that set as an OverloadCandidateSet rather than as some
5760 // other kind of set.
5761 if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
5762 Sequence.SetOverloadFailure(
5764 ConvOvlResult);
5765 else if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy)
5767 else
5769 return;
5770 } else {
5771 Sequence.AddConversionSequenceStep(ICS, TempEntity.getType(),
5772 TopLevelOfInitList);
5773 }
5774
5775 // [...] If T1 is reference-related to T2, cv1 must be the
5776 // same cv-qualification as, or greater cv-qualification
5777 // than, cv2; otherwise, the program is ill-formed.
5778 unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
5779 unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
5780 if (RefRelationship == Sema::Ref_Related &&
5781 ((T1CVRQuals | T2CVRQuals) != T1CVRQuals ||
5782 !T1Quals.isAddressSpaceSupersetOf(T2Quals, S.getASTContext()))) {
5784 return;
5785 }
5786
5787 // [...] If T1 is reference-related to T2 and the reference is an rvalue
5788 // reference, the initializer expression shall not be an lvalue.
5789 if (RefRelationship >= Sema::Ref_Related && !isLValueRef &&
5790 InitCategory.isLValue()) {
5791 Sequence.SetFailed(
5793 return;
5794 }
5795
5796 Sequence.AddReferenceBindingStep(cv1T1IgnoreAS, /*BindingTemporary=*/true);
5797
5798 if (T1Quals.hasAddressSpace()) {
5801 Sequence.SetFailed(
5803 return;
5804 }
5805 Sequence.AddQualificationConversionStep(cv1T1, isLValueRef ? VK_LValue
5806 : VK_XValue);
5807 }
5808}
5809
5810/// Attempt character array initialization from a string literal
5811/// (C++ [dcl.init.string], C99 6.7.8).
5813 const InitializedEntity &Entity,
5814 const InitializationKind &Kind,
5816 InitializationSequence &Sequence) {
5817 Sequence.AddStringInitStep(Entity.getType());
5818}
5819
5820/// Attempt value initialization (C++ [dcl.init]p7).
5822 const InitializedEntity &Entity,
5823 const InitializationKind &Kind,
5824 InitializationSequence &Sequence,
5825 InitListExpr *InitList) {
5826 assert((!InitList || InitList->getNumInits() == 0) &&
5827 "Shouldn't use value-init for non-empty init lists");
5828
5829 // C++98 [dcl.init]p5, C++11 [dcl.init]p7:
5830 //
5831 // To value-initialize an object of type T means:
5832 QualType T = Entity.getType();
5833 assert(!T->isVoidType() && "Cannot value-init void");
5834
5835 // -- if T is an array type, then each element is value-initialized;
5836 T = S.Context.getBaseElementType(T);
5837
5838 if (auto *ClassDecl = T->getAsCXXRecordDecl()) {
5839 bool NeedZeroInitialization = true;
5840 // C++98:
5841 // -- if T is a class type (clause 9) with a user-declared constructor
5842 // (12.1), then the default constructor for T is called (and the
5843 // initialization is ill-formed if T has no accessible default
5844 // constructor);
5845 // C++11:
5846 // -- if T is a class type (clause 9) with either no default constructor
5847 // (12.1 [class.ctor]) or a default constructor that is user-provided
5848 // or deleted, then the object is default-initialized;
5849 //
5850 // Note that the C++11 rule is the same as the C++98 rule if there are no
5851 // defaulted or deleted constructors, so we just use it unconditionally.
5853 if (!CD || !CD->getCanonicalDecl()->isDefaulted() || CD->isDeleted())
5854 NeedZeroInitialization = false;
5855
5856 // -- if T is a (possibly cv-qualified) non-union class type without a
5857 // user-provided or deleted default constructor, then the object is
5858 // zero-initialized and, if T has a non-trivial default constructor,
5859 // default-initialized;
5860 // The 'non-union' here was removed by DR1502. The 'non-trivial default
5861 // constructor' part was removed by DR1507.
5862 if (NeedZeroInitialization)
5863 Sequence.AddZeroInitializationStep(Entity.getType());
5864
5865 // C++03:
5866 // -- if T is a non-union class type without a user-declared constructor,
5867 // then every non-static data member and base class component of T is
5868 // value-initialized;
5869 // [...] A program that calls for [...] value-initialization of an
5870 // entity of reference type is ill-formed.
5871 //
5872 // C++11 doesn't need this handling, because value-initialization does not
5873 // occur recursively there, and the implicit default constructor is
5874 // defined as deleted in the problematic cases.
5875 if (!S.getLangOpts().CPlusPlus11 &&
5876 ClassDecl->hasUninitializedReferenceMember()) {
5878 return;
5879 }
5880
5881 // If this is list-value-initialization, pass the empty init list on when
5882 // building the constructor call. This affects the semantics of a few
5883 // things (such as whether an explicit default constructor can be called).
5884 Expr *InitListAsExpr = InitList;
5885 MultiExprArg Args(&InitListAsExpr, InitList ? 1 : 0);
5886 bool InitListSyntax = InitList;
5887
5888 // FIXME: Instead of creating a CXXConstructExpr of array type here,
5889 // wrap a class-typed CXXConstructExpr in an ArrayInitLoopExpr.
5891 S, Entity, Kind, Args, T, Entity.getType(), Sequence, InitListSyntax);
5892 }
5893
5894 Sequence.AddZeroInitializationStep(Entity.getType());
5895}
5896
5897/// Attempt default initialization (C++ [dcl.init]p6).
5899 const InitializedEntity &Entity,
5900 const InitializationKind &Kind,
5901 InitializationSequence &Sequence) {
5902 assert(Kind.getKind() == InitializationKind::IK_Default);
5903
5904 // C++ [dcl.init]p6:
5905 // To default-initialize an object of type T means:
5906 // - if T is an array type, each element is default-initialized;
5907 QualType DestType = S.Context.getBaseElementType(Entity.getType());
5908
5909 // - if T is a (possibly cv-qualified) class type (Clause 9), the default
5910 // constructor for T is called (and the initialization is ill-formed if
5911 // T has no accessible default constructor);
5912 if (DestType->isRecordType() && S.getLangOpts().CPlusPlus) {
5913 TryConstructorInitialization(S, Entity, Kind, {}, DestType,
5914 Entity.getType(), Sequence);
5915 return;
5916 }
5917
5918 // - otherwise, no initialization is performed.
5919
5920 // If a program calls for the default initialization of an object of
5921 // a const-qualified type T, T shall be a class type with a user-provided
5922 // default constructor.
5923 if (DestType.isConstQualified() && S.getLangOpts().CPlusPlus) {
5924 if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
5926 return;
5927 }
5928
5929 // If the destination type has a lifetime property, zero-initialize it.
5930 if (DestType.getQualifiers().hasObjCLifetime()) {
5931 Sequence.AddZeroInitializationStep(Entity.getType());
5932 return;
5933 }
5934}
5935
5937 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
5938 ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly,
5939 ExprResult *Result) {
5940 unsigned EntityIndexToProcess = 0;
5941 SmallVector<Expr *, 4> InitExprs;
5942 QualType ResultType;
5943 Expr *ArrayFiller = nullptr;
5944 FieldDecl *InitializedFieldInUnion = nullptr;
5945
5946 auto HandleInitializedEntity = [&](const InitializedEntity &SubEntity,
5947 const InitializationKind &SubKind,
5948 Expr *Arg, Expr **InitExpr = nullptr) {
5950 S, SubEntity, SubKind,
5951 Arg ? MultiExprArg(Arg) : MutableArrayRef<Expr *>());
5952
5953 if (IS.Failed()) {
5954 if (!VerifyOnly) {
5955 IS.Diagnose(S, SubEntity, SubKind,
5956 Arg ? ArrayRef(Arg) : ArrayRef<Expr *>());
5957 } else {
5958 Sequence.SetFailed(
5960 }
5961
5962 return false;
5963 }
5964 if (!VerifyOnly) {
5965 ExprResult ER;
5966 ER = IS.Perform(S, SubEntity, SubKind,
5967 Arg ? MultiExprArg(Arg) : MutableArrayRef<Expr *>());
5968
5969 if (ER.isInvalid())
5970 return false;
5971
5972 if (InitExpr)
5973 *InitExpr = ER.get();
5974 else
5975 InitExprs.push_back(ER.get());
5976 }
5977 return true;
5978 };
5979
5980 if (const ArrayType *AT =
5981 S.getASTContext().getAsArrayType(Entity.getType())) {
5982 uint64_t ArrayLength;
5983 // C++ [dcl.init]p16.5
5984 // if the destination type is an array, the object is initialized as
5985 // follows. Let x1, . . . , xk be the elements of the expression-list. If
5986 // the destination type is an array of unknown bound, it is defined as
5987 // having k elements.
5988 if (const ConstantArrayType *CAT =
5990 ArrayLength = CAT->getZExtSize();
5991 ResultType = Entity.getType();
5992 } else if (const VariableArrayType *VAT =
5994 // Braced-initialization of variable array types is not allowed, even if
5995 // the size is greater than or equal to the number of args, so we don't
5996 // allow them to be initialized via parenthesized aggregate initialization
5997 // either.
5998 const Expr *SE = VAT->getSizeExpr();
5999 S.Diag(SE->getBeginLoc(), diag::err_variable_object_no_init)
6000 << SE->getSourceRange();
6001 return;
6002 } else {
6003 assert(Entity.getType()->isIncompleteArrayType());
6004 ArrayLength = Args.size();
6005 }
6006 EntityIndexToProcess = ArrayLength;
6007
6008 // ...the ith array element is copy-initialized with xi for each
6009 // 1 <= i <= k
6010 for (Expr *E : Args) {
6012 S.getASTContext(), EntityIndexToProcess, Entity);
6014 E->getExprLoc(), /*isDirectInit=*/false, E);
6015 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6016 return;
6017 }
6018 // ...and value-initialized for each k < i <= n;
6019 if (ArrayLength > Args.size() || Entity.isVariableLengthArrayNew()) {
6021 S.getASTContext(), Args.size(), Entity);
6023 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
6024 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr, &ArrayFiller))
6025 return;
6026 }
6027
6028 if (ResultType.isNull()) {
6029 ResultType = S.Context.getConstantArrayType(
6030 AT->getElementType(), llvm::APInt(/*numBits=*/32, ArrayLength),
6031 /*SizeExpr=*/nullptr, ArraySizeModifier::Normal, 0);
6032 }
6033 } else if (auto *RD = Entity.getType()->getAsCXXRecordDecl()) {
6034 bool IsUnion = RD->isUnion();
6035 if (RD->isInvalidDecl()) {
6036 // Exit early to avoid confusion when processing members.
6037 // We do the same for braced list initialization in
6038 // `CheckStructUnionTypes`.
6039 Sequence.SetFailed(
6041 return;
6042 }
6043
6044 if (!IsUnion) {
6045 for (const CXXBaseSpecifier &Base : RD->bases()) {
6047 S.getASTContext(), &Base, false, &Entity);
6048 if (EntityIndexToProcess < Args.size()) {
6049 // C++ [dcl.init]p16.6.2.2.
6050 // ...the object is initialized is follows. Let e1, ..., en be the
6051 // elements of the aggregate([dcl.init.aggr]). Let x1, ..., xk be
6052 // the elements of the expression-list...The element ei is
6053 // copy-initialized with xi for 1 <= i <= k.
6054 Expr *E = Args[EntityIndexToProcess];
6056 E->getExprLoc(), /*isDirectInit=*/false, E);
6057 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6058 return;
6059 } else {
6060 // We've processed all of the args, but there are still base classes
6061 // that have to be initialized.
6062 // C++ [dcl.init]p17.6.2.2
6063 // The remaining elements...otherwise are value initialzed
6065 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
6066 /*IsImplicit=*/true);
6067 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
6068 return;
6069 }
6070 EntityIndexToProcess++;
6071 }
6072 }
6073
6074 for (FieldDecl *FD : RD->fields()) {
6075 // Unnamed bitfields should not be initialized at all, either with an arg
6076 // or by default.
6077 if (FD->isUnnamedBitField())
6078 continue;
6079
6080 InitializedEntity SubEntity =
6082
6083 if (EntityIndexToProcess < Args.size()) {
6084 // ...The element ei is copy-initialized with xi for 1 <= i <= k.
6085 Expr *E = Args[EntityIndexToProcess];
6086
6087 // Incomplete array types indicate flexible array members. Do not allow
6088 // paren list initializations of structs with these members, as GCC
6089 // doesn't either.
6090 if (FD->getType()->isIncompleteArrayType()) {
6091 if (!VerifyOnly) {
6092 S.Diag(E->getBeginLoc(), diag::err_flexible_array_init)
6093 << SourceRange(E->getBeginLoc(), E->getEndLoc());
6094 S.Diag(FD->getLocation(), diag::note_flexible_array_member) << FD;
6095 }
6096 Sequence.SetFailed(
6098 return;
6099 }
6100
6102 E->getExprLoc(), /*isDirectInit=*/false, E);
6103 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6104 return;
6105
6106 // Unions should have only one initializer expression, so we bail out
6107 // after processing the first field. If there are more initializers then
6108 // it will be caught when we later check whether EntityIndexToProcess is
6109 // less than Args.size();
6110 if (IsUnion) {
6111 InitializedFieldInUnion = FD;
6112 EntityIndexToProcess = 1;
6113 break;
6114 }
6115 } else {
6116 // We've processed all of the args, but there are still members that
6117 // have to be initialized.
6118 if (!VerifyOnly && FD->hasAttr<ExplicitInitAttr>() &&
6119 !S.isUnevaluatedContext()) {
6120 S.Diag(Kind.getLocation(), diag::warn_field_requires_explicit_init)
6121 << /* Var-in-Record */ 0 << FD;
6122 S.Diag(FD->getLocation(), diag::note_entity_declared_at) << FD;
6123 }
6124
6125 if (FD->hasInClassInitializer()) {
6126 if (!VerifyOnly) {
6127 // C++ [dcl.init]p16.6.2.2
6128 // The remaining elements are initialized with their default
6129 // member initializers, if any
6131 Kind.getParenOrBraceRange().getEnd(), FD);
6132 if (DIE.isInvalid())
6133 return;
6134 S.checkInitializerLifetime(SubEntity, DIE.get());
6135 InitExprs.push_back(DIE.get());
6136 }
6137 } else {
6138 // C++ [dcl.init]p17.6.2.2
6139 // The remaining elements...otherwise are value initialzed
6140 if (FD->getType()->isReferenceType()) {
6141 Sequence.SetFailed(
6143 if (!VerifyOnly) {
6144 SourceRange SR = Kind.getParenOrBraceRange();
6145 S.Diag(SR.getEnd(), diag::err_init_reference_member_uninitialized)
6146 << FD->getType() << SR;
6147 S.Diag(FD->getLocation(), diag::note_uninit_reference_member);
6148 }
6149 return;
6150 }
6152 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(), true);
6153 if (!HandleInitializedEntity(SubEntity, SubKind, nullptr))
6154 return;
6155 }
6156 }
6157 EntityIndexToProcess++;
6158 }
6159 ResultType = Entity.getType();
6160 }
6161
6162 // Not all of the args have been processed, so there must've been more args
6163 // than were required to initialize the element.
6164 if (EntityIndexToProcess < Args.size()) {
6166 if (!VerifyOnly) {
6167 QualType T = Entity.getType();
6168 int InitKind = T->isArrayType() ? 0 : T->isUnionType() ? 4 : 5;
6169 SourceRange ExcessInitSR(Args[EntityIndexToProcess]->getBeginLoc(),
6170 Args.back()->getEndLoc());
6171 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
6172 << InitKind << ExcessInitSR;
6173 }
6174 return;
6175 }
6176
6177 if (VerifyOnly) {
6179 Sequence.AddParenthesizedListInitStep(Entity.getType());
6180 } else if (Result) {
6181 SourceRange SR = Kind.getParenOrBraceRange();
6182 auto *CPLIE = CXXParenListInitExpr::Create(
6183 S.getASTContext(), InitExprs, ResultType, Args.size(),
6184 Kind.getLocation(), SR.getBegin(), SR.getEnd());
6185 if (ArrayFiller)
6186 CPLIE->setArrayFiller(ArrayFiller);
6187 if (InitializedFieldInUnion)
6188 CPLIE->setInitializedFieldInUnion(InitializedFieldInUnion);
6189 *Result = CPLIE;
6190 S.Diag(Kind.getLocation(),
6191 diag::warn_cxx17_compat_aggregate_init_paren_list)
6192 << Kind.getLocation() << SR << ResultType;
6193 }
6194}
6195
6196/// Attempt a user-defined conversion between two types (C++ [dcl.init]),
6197/// which enumerates all conversion functions and performs overload resolution
6198/// to select the best.
6200 QualType DestType,
6201 const InitializationKind &Kind,
6203 InitializationSequence &Sequence,
6204 bool TopLevelOfInitList) {
6205 assert(!DestType->isReferenceType() && "References are handled elsewhere");
6206 QualType SourceType = Initializer->getType();
6207 assert((DestType->isRecordType() || SourceType->isRecordType()) &&
6208 "Must have a class type to perform a user-defined conversion");
6209
6210 // Build the candidate set directly in the initialization sequence
6211 // structure, so that it will persist if we fail.
6212 OverloadCandidateSet &CandidateSet = Sequence.getFailedCandidateSet();
6214 CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
6215
6216 // Determine whether we are allowed to call explicit constructors or
6217 // explicit conversion operators.
6218 bool AllowExplicit = Kind.AllowExplicit();
6219
6220 if (DestType->isRecordType()) {
6221 // The type we're converting to is a class type. Enumerate its constructors
6222 // to see if there is a suitable conversion.
6223 // Try to complete the type we're converting to.
6224 if (S.isCompleteType(Kind.getLocation(), DestType)) {
6225 auto *DestRecordDecl = DestType->castAsCXXRecordDecl();
6226 for (NamedDecl *D : S.LookupConstructors(DestRecordDecl)) {
6227 auto Info = getConstructorInfo(D);
6228 if (!Info.Constructor)
6229 continue;
6230
6231 if (!Info.Constructor->isInvalidDecl() &&
6232 Info.Constructor->isConvertingConstructor(/*AllowExplicit*/true)) {
6233 if (Info.ConstructorTmpl)
6235 Info.ConstructorTmpl, Info.FoundDecl,
6236 /*ExplicitArgs*/ nullptr, Initializer, CandidateSet,
6237 /*SuppressUserConversions=*/true,
6238 /*PartialOverloading*/ false, AllowExplicit);
6239 else
6240 S.AddOverloadCandidate(Info.Constructor, Info.FoundDecl,
6241 Initializer, CandidateSet,
6242 /*SuppressUserConversions=*/true,
6243 /*PartialOverloading*/ false, AllowExplicit);
6244 }
6245 }
6246 }
6247 }
6248
6249 SourceLocation DeclLoc = Initializer->getBeginLoc();
6250
6251 if (SourceType->isRecordType()) {
6252 // The type we're converting from is a class type, enumerate its conversion
6253 // functions.
6254
6255 // We can only enumerate the conversion functions for a complete type; if
6256 // the type isn't complete, simply skip this step.
6257 if (S.isCompleteType(DeclLoc, SourceType)) {
6258 auto *SourceRecordDecl = SourceType->castAsCXXRecordDecl();
6259 const auto &Conversions =
6260 SourceRecordDecl->getVisibleConversionFunctions();
6261 for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
6262 NamedDecl *D = *I;
6264 if (isa<UsingShadowDecl>(D))
6265 D = cast<UsingShadowDecl>(D)->getTargetDecl();
6266
6267 FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
6268 CXXConversionDecl *Conv;
6269 if (ConvTemplate)
6270 Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
6271 else
6272 Conv = cast<CXXConversionDecl>(D);
6273
6274 if (ConvTemplate)
6276 ConvTemplate, I.getPair(), ActingDC, Initializer, DestType,
6277 CandidateSet, AllowExplicit, AllowExplicit);
6278 else
6279 S.AddConversionCandidate(Conv, I.getPair(), ActingDC, Initializer,
6280 DestType, CandidateSet, AllowExplicit,
6281 AllowExplicit);
6282 }
6283 }
6284 }
6285
6286 // Perform overload resolution. If it fails, return the failed result.
6288 if (OverloadingResult Result
6289 = CandidateSet.BestViableFunction(S, DeclLoc, Best)) {
6290 Sequence.SetOverloadFailure(
6292
6293 // [class.copy.elision]p3:
6294 // In some copy-initialization contexts, a two-stage overload resolution
6295 // is performed.
6296 // If the first overload resolution selects a deleted function, we also
6297 // need the initialization sequence to decide whether to perform the second
6298 // overload resolution.
6299 if (!(Result == OR_Deleted &&
6300 Kind.getKind() == InitializationKind::IK_Copy))
6301 return;
6302 }
6303
6304 FunctionDecl *Function = Best->Function;
6305 Function->setReferenced();
6306 bool HadMultipleCandidates = (CandidateSet.size() > 1);
6307
6308 if (isa<CXXConstructorDecl>(Function)) {
6309 // Add the user-defined conversion step. Any cv-qualification conversion is
6310 // subsumed by the initialization. Per DR5, the created temporary is of the
6311 // cv-unqualified type of the destination.
6312 Sequence.AddUserConversionStep(Function, Best->FoundDecl,
6313 DestType.getUnqualifiedType(),
6314 HadMultipleCandidates);
6315
6316 // C++14 and before:
6317 // - if the function is a constructor, the call initializes a temporary
6318 // of the cv-unqualified version of the destination type. The [...]
6319 // temporary [...] is then used to direct-initialize, according to the
6320 // rules above, the object that is the destination of the
6321 // copy-initialization.
6322 // Note that this just performs a simple object copy from the temporary.
6323 //
6324 // C++17:
6325 // - if the function is a constructor, the call is a prvalue of the
6326 // cv-unqualified version of the destination type whose return object
6327 // is initialized by the constructor. The call is used to
6328 // direct-initialize, according to the rules above, the object that
6329 // is the destination of the copy-initialization.
6330 // Therefore we need to do nothing further.
6331 //
6332 // FIXME: Mark this copy as extraneous.
6333 if (!S.getLangOpts().CPlusPlus17)
6334 Sequence.AddFinalCopy(DestType);
6335 else if (DestType.hasQualifiers())
6336 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
6337 return;
6338 }
6339
6340 // Add the user-defined conversion step that calls the conversion function.
6341 QualType ConvType = Function->getCallResultType();
6342 Sequence.AddUserConversionStep(Function, Best->FoundDecl, ConvType,
6343 HadMultipleCandidates);
6344
6345 if (ConvType->isRecordType()) {
6346 // The call is used to direct-initialize [...] the object that is the
6347 // destination of the copy-initialization.
6348 //
6349 // In C++17, this does not call a constructor if we enter /17.6.1:
6350 // - If the initializer expression is a prvalue and the cv-unqualified
6351 // version of the source type is the same as the class of the
6352 // destination [... do not make an extra copy]
6353 //
6354 // FIXME: Mark this copy as extraneous.
6355 if (!S.getLangOpts().CPlusPlus17 ||
6356 Function->getReturnType()->isReferenceType() ||
6357 !S.Context.hasSameUnqualifiedType(ConvType, DestType))
6358 Sequence.AddFinalCopy(DestType);
6359 else if (!S.Context.hasSameType(ConvType, DestType))
6360 Sequence.AddQualificationConversionStep(DestType, VK_PRValue);
6361 return;
6362 }
6363
6364 // If the conversion following the call to the conversion function
6365 // is interesting, add it as a separate step.
6366 assert(Best->HasFinalConversion);
6367 if (Best->FinalConversion.First || Best->FinalConversion.Second ||
6368 Best->FinalConversion.Third) {
6370 ICS.setStandard();
6371 ICS.Standard = Best->FinalConversion;
6372 Sequence.AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
6373 }
6374}
6375
6376/// The non-zero enum values here are indexes into diagnostic alternatives.
6378
6379/// Determines whether this expression is an acceptable ICR source.
6381 bool isAddressOf, bool &isWeakAccess) {
6382 // Skip parens.
6383 e = e->IgnoreParens();
6384
6385 // Skip address-of nodes.
6386 if (UnaryOperator *op = dyn_cast<UnaryOperator>(e)) {
6387 if (op->getOpcode() == UO_AddrOf)
6388 return isInvalidICRSource(C, op->getSubExpr(), /*addressof*/ true,
6389 isWeakAccess);
6390
6391 // Skip certain casts.
6392 } else if (CastExpr *ce = dyn_cast<CastExpr>(e)) {
6393 switch (ce->getCastKind()) {
6394 case CK_Dependent:
6395 case CK_BitCast:
6396 case CK_LValueBitCast:
6397 case CK_NoOp:
6398 return isInvalidICRSource(C, ce->getSubExpr(), isAddressOf, isWeakAccess);
6399
6400 case CK_ArrayToPointerDecay:
6401 return IIK_nonscalar;
6402
6403 case CK_NullToPointer:
6404 return IIK_okay;
6405
6406 default:
6407 break;
6408 }
6409
6410 // If we have a declaration reference, it had better be a local variable.
6411 } else if (isa<DeclRefExpr>(e)) {
6412 // set isWeakAccess to true, to mean that there will be an implicit
6413 // load which requires a cleanup.
6415 isWeakAccess = true;
6416
6417 if (!isAddressOf) return IIK_nonlocal;
6418
6419 VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
6420 if (!var) return IIK_nonlocal;
6421
6422 return (var->hasLocalStorage() ? IIK_okay : IIK_nonlocal);
6423
6424 // If we have a conditional operator, check both sides.
6425 } else if (ConditionalOperator *cond = dyn_cast<ConditionalOperator>(e)) {
6426 if (InvalidICRKind iik = isInvalidICRSource(C, cond->getLHS(), isAddressOf,
6427 isWeakAccess))
6428 return iik;
6429
6430 return isInvalidICRSource(C, cond->getRHS(), isAddressOf, isWeakAccess);
6431
6432 // These are never scalar.
6433 } else if (isa<ArraySubscriptExpr>(e)) {
6434 return IIK_nonscalar;
6435
6436 // Otherwise, it needs to be a null pointer constant.
6437 } else {
6440 }
6441
6442 return IIK_nonlocal;
6443}
6444
6445/// Check whether the given expression is a valid operand for an
6446/// indirect copy/restore.
6448 assert(src->isPRValue());
6449 bool isWeakAccess = false;
6450 InvalidICRKind iik = isInvalidICRSource(S.Context, src, false, isWeakAccess);
6451 // If isWeakAccess to true, there will be an implicit
6452 // load which requires a cleanup.
6453 if (S.getLangOpts().ObjCAutoRefCount && isWeakAccess)
6455
6456 if (iik == IIK_okay) return;
6457
6458 S.Diag(src->getExprLoc(), diag::err_arc_nonlocal_writeback)
6459 << ((unsigned) iik - 1) // shift index into diagnostic explanations
6460 << src->getSourceRange();
6461}
6462
6463/// Determine whether we have compatible array types for the
6464/// purposes of GNU by-copy array initialization.
6465static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest,
6466 const ArrayType *Source) {
6467 // If the source and destination array types are equivalent, we're
6468 // done.
6469 if (Context.hasSameType(QualType(Dest, 0), QualType(Source, 0)))
6470 return true;
6471
6472 // Make sure that the element types are the same.
6473 if (!Context.hasSameType(Dest->getElementType(), Source->getElementType()))
6474 return false;
6475
6476 // The only mismatch we allow is when the destination is an
6477 // incomplete array type and the source is a constant array type.
6478 return Source->isConstantArrayType() && Dest->isIncompleteArrayType();
6479}
6480
6482 InitializationSequence &Sequence,
6483 const InitializedEntity &Entity,
6484 Expr *Initializer) {
6485 bool ArrayDecay = false;
6486 QualType ArgType = Initializer->getType();
6487 QualType ArgPointee;
6488 if (const ArrayType *ArgArrayType = S.Context.getAsArrayType(ArgType)) {
6489 ArrayDecay = true;
6490 ArgPointee = ArgArrayType->getElementType();
6491 ArgType = S.Context.getPointerType(ArgPointee);
6492 }
6493
6494 // Handle write-back conversion.
6495 QualType ConvertedArgType;
6496 if (!S.ObjC().isObjCWritebackConversion(ArgType, Entity.getType(),
6497 ConvertedArgType))
6498 return false;
6499
6500 // We should copy unless we're passing to an argument explicitly
6501 // marked 'out'.
6502 bool ShouldCopy = true;
6503 if (ParmVarDecl *param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
6504 ShouldCopy = (param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
6505
6506 // Do we need an lvalue conversion?
6507 if (ArrayDecay || Initializer->isGLValue()) {
6509 ICS.setStandard();
6511
6512 QualType ResultType;
6513 if (ArrayDecay) {
6515 ResultType = S.Context.getPointerType(ArgPointee);
6516 } else {
6518 ResultType = Initializer->getType().getNonLValueExprType(S.Context);
6519 }
6520
6521 Sequence.AddConversionSequenceStep(ICS, ResultType);
6522 }
6523
6524 Sequence.AddPassByIndirectCopyRestoreStep(Entity.getType(), ShouldCopy);
6525 return true;
6526}
6527
6529 InitializationSequence &Sequence,
6530 QualType DestType,
6531 Expr *Initializer) {
6532 if (!S.getLangOpts().OpenCL || !DestType->isSamplerT() ||
6533 (!Initializer->isIntegerConstantExpr(S.Context) &&
6534 !Initializer->getType()->isSamplerT()))
6535 return false;
6536
6537 Sequence.AddOCLSamplerInitStep(DestType);
6538 return true;
6539}
6540
6541static bool IsZeroInitializer(const Expr *Init, ASTContext &Ctx) {
6542 std::optional<llvm::APSInt> Value = Init->getIntegerConstantExpr(Ctx);
6543 return Value && Value->isZero();
6544}
6545
6547 InitializationSequence &Sequence,
6548 QualType DestType,
6549 Expr *Initializer) {
6550 if (!S.getLangOpts().OpenCL)
6551 return false;
6552
6553 //
6554 // OpenCL 1.2 spec, s6.12.10
6555 //
6556 // The event argument can also be used to associate the
6557 // async_work_group_copy with a previous async copy allowing
6558 // an event to be shared by multiple async copies; otherwise
6559 // event should be zero.
6560 //
6561 if (DestType->isEventT() || DestType->isQueueT()) {
6563 return false;
6564
6565 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6566 return true;
6567 }
6568
6569 // We should allow zero initialization for all types defined in the
6570 // cl_intel_device_side_avc_motion_estimation extension, except
6571 // intel_sub_group_avc_mce_payload_t and intel_sub_group_avc_mce_result_t.
6573 "cl_intel_device_side_avc_motion_estimation", S.getLangOpts()) &&
6574 DestType->isOCLIntelSubgroupAVCType()) {
6575 if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
6576 DestType->isOCLIntelSubgroupAVCMceResultType())
6577 return false;
6579 return false;
6580
6581 Sequence.AddOCLZeroOpaqueTypeStep(DestType);
6582 return true;
6583 }
6584
6585 return false;
6586}
6587
6589 Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind,
6590 MultiExprArg Args, bool TopLevelOfInitList, bool TreatUnavailableAsInvalid)
6591 : FailedOverloadResult(OR_Success),
6592 FailedCandidateSet(Kind.getLocation(), OverloadCandidateSet::CSK_Normal) {
6593 InitializeFrom(S, Entity, Kind, Args, TopLevelOfInitList,
6594 TreatUnavailableAsInvalid);
6595}
6596
6597/// Tries to get a FunctionDecl out of `E`. If it succeeds and we can take the
6598/// address of that function, this returns true. Otherwise, it returns false.
6599static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E) {
6600 auto *DRE = dyn_cast<DeclRefExpr>(E);
6601 if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
6602 return false;
6603
6605 cast<FunctionDecl>(DRE->getDecl()));
6606}
6607
6608/// Determine whether we can perform an elementwise array copy for this kind
6609/// of entity.
6610static bool canPerformArrayCopy(const InitializedEntity &Entity) {
6611 switch (Entity.getKind()) {
6613 // C++ [expr.prim.lambda]p24:
6614 // For array members, the array elements are direct-initialized in
6615 // increasing subscript order.
6616 return true;
6617
6619 // C++ [dcl.decomp]p1:
6620 // [...] each element is copy-initialized or direct-initialized from the
6621 // corresponding element of the assignment-expression [...]
6622 return isa<DecompositionDecl>(Entity.getDecl());
6623
6625 // C++ [class.copy.ctor]p14:
6626 // - if the member is an array, each element is direct-initialized with
6627 // the corresponding subobject of x
6628 return Entity.isImplicitMemberInitializer();
6629
6631 // All the above cases are intended to apply recursively, even though none
6632 // of them actually say that.
6633 if (auto *E = Entity.getParent())
6634 return canPerformArrayCopy(*E);
6635 break;
6636
6637 default:
6638 break;
6639 }
6640
6641 return false;
6642}
6643
6644static const FieldDecl *getConstField(const RecordDecl *RD) {
6645 assert(!isa<CXXRecordDecl>(RD) && "Only expect to call this in C mode");
6646 for (const FieldDecl *FD : RD->fields()) {
6647 // If the field is a flexible array member, we don't want to consider it
6648 // as a const field because there's no way to initialize the FAM anyway.
6649 const ASTContext &Ctx = FD->getASTContext();
6651 Ctx, FD, FD->getType(),
6652 Ctx.getLangOpts().getStrictFlexArraysLevel(),
6653 /*IgnoreTemplateOrMacroSubstitution=*/true))
6654 continue;
6655
6656 QualType QT = FD->getType();
6657 if (QT.isConstQualified())
6658 return FD;
6659 if (const auto *RD = QT->getAsRecordDecl()) {
6660 if (const FieldDecl *FD = getConstField(RD))
6661 return FD;
6662 }
6663 }
6664 return nullptr;
6665}
6666
6668 const InitializedEntity &Entity,
6669 const InitializationKind &Kind,
6670 MultiExprArg Args,
6671 bool TopLevelOfInitList,
6672 bool TreatUnavailableAsInvalid) {
6673 ASTContext &Context = S.Context;
6674
6675 // Eliminate non-overload placeholder types in the arguments. We
6676 // need to do this before checking whether types are dependent
6677 // because lowering a pseudo-object expression might well give us
6678 // something of dependent type.
6679 for (unsigned I = 0, E = Args.size(); I != E; ++I)
6680 if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
6681 // FIXME: should we be doing this here?
6682 ExprResult result = S.CheckPlaceholderExpr(Args[I]);
6683 if (result.isInvalid()) {
6685 return;
6686 }
6687 Args[I] = result.get();
6688 }
6689
6690 // C++0x [dcl.init]p16:
6691 // The semantics of initializers are as follows. The destination type is
6692 // the type of the object or reference being initialized and the source
6693 // type is the type of the initializer expression. The source type is not
6694 // defined when the initializer is a braced-init-list or when it is a
6695 // parenthesized list of expressions.
6696 QualType DestType = Entity.getType();
6697
6698 if (DestType->isDependentType() ||
6701 return;
6702 }
6703
6704 // Almost everything is a normal sequence.
6706
6707 QualType SourceType;
6708 Expr *Initializer = nullptr;
6709 if (Args.size() == 1) {
6710 Initializer = Args[0];
6711 if (S.getLangOpts().ObjC) {
6713 Initializer->getBeginLoc(), DestType, Initializer->getType(),
6714 Initializer) ||
6716 Args[0] = Initializer;
6717 }
6719 SourceType = Initializer->getType();
6720 }
6721
6722 // - If the initializer is a (non-parenthesized) braced-init-list, the
6723 // object is list-initialized (8.5.4).
6724 if (Kind.getKind() != InitializationKind::IK_Direct) {
6725 if (InitListExpr *InitList = dyn_cast_or_null<InitListExpr>(Initializer)) {
6726 TryListInitialization(S, Entity, Kind, InitList, *this,
6727 TreatUnavailableAsInvalid);
6728 return;
6729 }
6730 }
6731
6732 if (!S.getLangOpts().CPlusPlus &&
6733 Kind.getKind() == InitializationKind::IK_Default) {
6734 if (RecordDecl *Rec = DestType->getAsRecordDecl()) {
6735 VarDecl *Var = dyn_cast_or_null<VarDecl>(Entity.getDecl());
6736 if (Rec->hasUninitializedExplicitInitFields()) {
6737 if (Var && !Initializer && !S.isUnevaluatedContext()) {
6738 S.Diag(Var->getLocation(), diag::warn_field_requires_explicit_init)
6739 << /* Var-in-Record */ 1 << Rec;
6741 }
6742 }
6743 // If the record has any members which are const (recursively checked),
6744 // then we want to diagnose those as being uninitialized if there is no
6745 // initializer present. However, we only do this for structure types, not
6746 // union types, because an unitialized field in a union is generally
6747 // reasonable, especially in C where unions can be used for type punning.
6748 if (Var && !Initializer && !Rec->isUnion() && !Rec->isInvalidDecl()) {
6749 if (const FieldDecl *FD = getConstField(Rec)) {
6750 unsigned DiagID = diag::warn_default_init_const_field_unsafe;
6751 if (Var->getStorageDuration() == SD_Static ||
6752 Var->getStorageDuration() == SD_Thread)
6753 DiagID = diag::warn_default_init_const_field;
6754
6755 bool EmitCppCompat = !S.Diags.isIgnored(
6756 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
6757 Var->getLocation());
6758
6759 S.Diag(Var->getLocation(), DiagID) << Var->getType() << EmitCppCompat;
6760 S.Diag(FD->getLocation(), diag::note_default_init_const_member) << FD;
6761 }
6762 }
6763 }
6764 }
6765
6766 // - If the destination type is a reference type, see 8.5.3.
6767 if (DestType->isReferenceType()) {
6768 // C++0x [dcl.init.ref]p1:
6769 // A variable declared to be a T& or T&&, that is, "reference to type T"
6770 // (8.3.2), shall be initialized by an object, or function, of type T or
6771 // by an object that can be converted into a T.
6772 // (Therefore, multiple arguments are not permitted.)
6773 if (Args.size() != 1)
6775 // C++17 [dcl.init.ref]p5:
6776 // A reference [...] is initialized by an expression [...] as follows:
6777 // If the initializer is not an expression, presumably we should reject,
6778 // but the standard fails to actually say so.
6779 else if (isa<InitListExpr>(Args[0]))
6781 else
6782 TryReferenceInitialization(S, Entity, Kind, Args[0], *this,
6783 TopLevelOfInitList);
6784 return;
6785 }
6786
6787 // - If the initializer is (), the object is value-initialized.
6788 if (Kind.getKind() == InitializationKind::IK_Value ||
6789 (Kind.getKind() == InitializationKind::IK_Direct && Args.empty())) {
6790 TryValueInitialization(S, Entity, Kind, *this);
6791 return;
6792 }
6793
6794 // Handle default initialization.
6795 if (Kind.getKind() == InitializationKind::IK_Default) {
6796 TryDefaultInitialization(S, Entity, Kind, *this);
6797 return;
6798 }
6799
6800 // - If the destination type is an array of characters, an array of
6801 // char16_t, an array of char32_t, or an array of wchar_t, and the
6802 // initializer is a string literal, see 8.5.2.
6803 // - Otherwise, if the destination type is an array, the program is
6804 // ill-formed.
6805 // - Except in HLSL, where non-decaying array parameters behave like
6806 // non-array types for initialization.
6807 if (DestType->isArrayType() && !DestType->isArrayParameterType()) {
6808 const ArrayType *DestAT = Context.getAsArrayType(DestType);
6809 if (Initializer && isa<VariableArrayType>(DestAT)) {
6811 return;
6812 }
6813
6814 if (Initializer) {
6815 switch (IsStringInit(Initializer, DestAT, Context)) {
6816 case SIF_None:
6817 TryStringLiteralInitialization(S, Entity, Kind, Initializer, *this);
6818 return;
6821 return;
6824 return;
6827 return;
6830 return;
6833 return;
6834 case SIF_Other:
6835 break;
6836 }
6837 }
6838
6839 if (S.getLangOpts().HLSL && Initializer && isa<ConstantArrayType>(DestAT)) {
6840 QualType SrcType = Entity.getType();
6841 if (SrcType->isArrayParameterType())
6842 SrcType =
6843 cast<ArrayParameterType>(SrcType)->getConstantArrayType(Context);
6844 if (S.Context.hasSameUnqualifiedType(DestType, SrcType)) {
6845 TryArrayCopy(S, Kind, Entity, Initializer, DestType, *this,
6846 TreatUnavailableAsInvalid);
6847 return;
6848 }
6849 }
6850
6851 // Some kinds of initialization permit an array to be initialized from
6852 // another array of the same type, and perform elementwise initialization.
6853 if (Initializer && isa<ConstantArrayType>(DestAT) &&
6855 Entity.getType()) &&
6856 canPerformArrayCopy(Entity)) {
6857 TryArrayCopy(S, Kind, Entity, Initializer, DestType, *this,
6858 TreatUnavailableAsInvalid);
6859 return;
6860 }
6861
6862 // Note: as an GNU C extension, we allow initialization of an
6863 // array from a compound literal that creates an array of the same
6864 // type, so long as the initializer has no side effects.
6865 if (!S.getLangOpts().CPlusPlus && Initializer &&
6866 isa<CompoundLiteralExpr>(Initializer->IgnoreParens()) &&
6867 Initializer->getType()->isArrayType()) {
6868 const ArrayType *SourceAT
6869 = Context.getAsArrayType(Initializer->getType());
6870 if (!hasCompatibleArrayTypes(S.Context, DestAT, SourceAT))
6872 else if (Initializer->HasSideEffects(S.Context))
6874 else {
6875 AddArrayInitStep(DestType, /*IsGNUExtension*/true);
6876 }
6877 }
6878 // Note: as a GNU C++ extension, we allow list-initialization of a
6879 // class member of array type from a parenthesized initializer list.
6880 else if (S.getLangOpts().CPlusPlus &&
6882 isa_and_nonnull<InitListExpr>(Initializer)) {
6884 *this, TreatUnavailableAsInvalid);
6886 } else if (S.getLangOpts().CPlusPlus20 && !TopLevelOfInitList &&
6887 Kind.getKind() == InitializationKind::IK_Direct)
6888 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
6889 /*VerifyOnly=*/true);
6890 else if (DestAT->getElementType()->isCharType())
6892 else if (IsWideCharCompatible(DestAT->getElementType(), Context))
6894 else
6896
6897 return;
6898 }
6899
6900 // Determine whether we should consider writeback conversions for
6901 // Objective-C ARC.
6902 bool allowObjCWritebackConversion = S.getLangOpts().ObjCAutoRefCount &&
6903 Entity.isParameterKind();
6904
6905 if (TryOCLSamplerInitialization(S, *this, DestType, Initializer))
6906 return;
6907
6908 // We're at the end of the line for C: it's either a write-back conversion
6909 // or it's a C assignment. There's no need to check anything else.
6910 if (!S.getLangOpts().CPlusPlus) {
6911 assert(Initializer && "Initializer must be non-null");
6912 // If allowed, check whether this is an Objective-C writeback conversion.
6913 if (allowObjCWritebackConversion &&
6914 tryObjCWritebackConversion(S, *this, Entity, Initializer)) {
6915 return;
6916 }
6917
6918 if (TryOCLZeroOpaqueTypeInitialization(S, *this, DestType, Initializer))
6919 return;
6920
6921 // Handle initialization in C
6922 AddCAssignmentStep(DestType);
6923 MaybeProduceObjCObject(S, *this, Entity);
6924 return;
6925 }
6926
6927 assert(S.getLangOpts().CPlusPlus);
6928
6929 // - If the destination type is a (possibly cv-qualified) class type:
6930 if (DestType->isRecordType()) {
6931 // - If the initialization is direct-initialization, or if it is
6932 // copy-initialization where the cv-unqualified version of the
6933 // source type is the same class as, or a derived class of, the
6934 // class of the destination, constructors are considered. [...]
6935 if (Kind.getKind() == InitializationKind::IK_Direct ||
6936 (Kind.getKind() == InitializationKind::IK_Copy &&
6937 (Context.hasSameUnqualifiedType(SourceType, DestType) ||
6938 (Initializer && S.IsDerivedFrom(Initializer->getBeginLoc(),
6939 SourceType, DestType))))) {
6940 TryConstructorOrParenListInitialization(S, Entity, Kind, Args, DestType,
6941 *this, /*IsAggrListInit=*/false);
6942 } else {
6943 // - Otherwise (i.e., for the remaining copy-initialization cases),
6944 // user-defined conversion sequences that can convert from the
6945 // source type to the destination type or (when a conversion
6946 // function is used) to a derived class thereof are enumerated as
6947 // described in 13.3.1.4, and the best one is chosen through
6948 // overload resolution (13.3).
6949 assert(Initializer && "Initializer must be non-null");
6950 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
6951 TopLevelOfInitList);
6952 }
6953 return;
6954 }
6955
6956 assert(Args.size() >= 1 && "Zero-argument case handled above");
6957
6958 // For HLSL ext vector types we allow list initialization behavior for C++
6959 // functional cast expressions which look like constructor syntax. This is
6960 // accomplished by converting initialization arguments to InitListExpr.
6961 auto ShouldTryListInitialization = [&]() -> bool {
6962 // Only try list initialization for HLSL.
6963 if (!S.getLangOpts().HLSL)
6964 return false;
6965
6966 bool DestIsVec = DestType->isExtVectorType();
6967 bool DestIsMat = DestType->isConstantMatrixType();
6968
6969 // If the destination type is neither a vector nor a matrix, then don't try
6970 // list initialization.
6971 if (!DestIsVec && !DestIsMat)
6972 return false;
6973
6974 // If there is only a single source argument, then only try list
6975 // initialization if initializing a matrix with a vector or vice versa.
6976 if (Args.size() == 1) {
6977 assert(!SourceType.isNull() &&
6978 "Source QualType should not be null when arg size is exactly 1");
6979 bool SourceIsVec = SourceType->isExtVectorType();
6980 bool SourceIsMat = SourceType->isConstantMatrixType();
6981
6982 if (DestIsMat && !SourceIsVec)
6983 return false;
6984 if (DestIsVec && !SourceIsMat)
6985 return false;
6986 }
6987
6988 // Try list initialization if the source type is null or if the
6989 // destination and source types differ.
6990 return SourceType.isNull() ||
6991 !Context.hasSameUnqualifiedType(SourceType, DestType);
6992 };
6993 if (ShouldTryListInitialization()) {
6994 InitListExpr *ILE = new (Context)
6995 InitListExpr(S.getASTContext(), Args.front()->getBeginLoc(), Args,
6996 Args.back()->getEndLoc());
6997 ILE->setType(DestType);
6998 Args[0] = ILE;
6999 TryListInitialization(S, Entity, Kind, ILE, *this,
7000 TreatUnavailableAsInvalid);
7001 return;
7002 }
7003
7004 // The remaining cases all need a source type.
7005 if (Args.size() > 1) {
7007 return;
7008 } else if (isa<InitListExpr>(Args[0])) {
7010 return;
7011 }
7012
7013 // - Otherwise, if the source type is a (possibly cv-qualified) class
7014 // type, conversion functions are considered.
7015 if (!SourceType.isNull() && SourceType->isRecordType()) {
7016 assert(Initializer && "Initializer must be non-null");
7017 // For a conversion to _Atomic(T) from either T or a class type derived
7018 // from T, initialize the T object then convert to _Atomic type.
7019 bool NeedAtomicConversion = false;
7020 if (const AtomicType *Atomic = DestType->getAs<AtomicType>()) {
7021 if (Context.hasSameUnqualifiedType(SourceType, Atomic->getValueType()) ||
7022 S.IsDerivedFrom(Initializer->getBeginLoc(), SourceType,
7023 Atomic->getValueType())) {
7024 DestType = Atomic->getValueType();
7025 NeedAtomicConversion = true;
7026 }
7027 }
7028
7029 TryUserDefinedConversion(S, DestType, Kind, Initializer, *this,
7030 TopLevelOfInitList);
7031 MaybeProduceObjCObject(S, *this, Entity);
7032 if (!Failed() && NeedAtomicConversion)
7034 return;
7035 }
7036
7037 // - Otherwise, if the initialization is direct-initialization, the source
7038 // type is std::nullptr_t, and the destination type is bool, the initial
7039 // value of the object being initialized is false.
7040 if (!SourceType.isNull() && SourceType->isNullPtrType() &&
7041 DestType->isBooleanType() &&
7042 Kind.getKind() == InitializationKind::IK_Direct) {
7045 Initializer->isGLValue()),
7046 DestType);
7047 return;
7048 }
7049
7050 // - Otherwise, the initial value of the object being initialized is the
7051 // (possibly converted) value of the initializer expression. Standard
7052 // conversions (Clause 4) will be used, if necessary, to convert the
7053 // initializer expression to the cv-unqualified version of the
7054 // destination type; no user-defined conversions are considered.
7055
7057 = S.TryImplicitConversion(Initializer, DestType,
7058 /*SuppressUserConversions*/true,
7059 Sema::AllowedExplicit::None,
7060 /*InOverloadResolution*/ false,
7061 /*CStyle=*/Kind.isCStyleOrFunctionalCast(),
7062 allowObjCWritebackConversion);
7063
7064 if (ICS.isStandard() &&
7066 // Objective-C ARC writeback conversion.
7067
7068 // We should copy unless we're passing to an argument explicitly
7069 // marked 'out'.
7070 bool ShouldCopy = true;
7071 if (ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Entity.getDecl()))
7072 ShouldCopy = (Param->getObjCDeclQualifier() != ParmVarDecl::OBJC_TQ_Out);
7073
7074 // If there was an lvalue adjustment, add it as a separate conversion.
7075 if (ICS.Standard.First == ICK_Array_To_Pointer ||
7078 LvalueICS.setStandard();
7080 LvalueICS.Standard.setAllToTypes(ICS.Standard.getToType(0));
7081 LvalueICS.Standard.First = ICS.Standard.First;
7082 AddConversionSequenceStep(LvalueICS, ICS.Standard.getToType(0));
7083 }
7084
7085 AddPassByIndirectCopyRestoreStep(DestType, ShouldCopy);
7086 } else if (ICS.isBad()) {
7088 Initializer->getType() == Context.OverloadTy &&
7090 /*Complain=*/false, Found))
7092 else if (Initializer->getType()->isFunctionType() &&
7095 else
7097 } else {
7098 AddConversionSequenceStep(ICS, DestType, TopLevelOfInitList);
7099
7100 MaybeProduceObjCObject(S, *this, Entity);
7101 }
7102}
7103
7105 for (auto &S : Steps)
7106 S.Destroy();
7107}
7108
7109//===----------------------------------------------------------------------===//
7110// Perform initialization
7111//===----------------------------------------------------------------------===//
7113 bool Diagnose = false) {
7114 switch(Entity.getKind()) {
7121
7123 if (Entity.getDecl() &&
7126
7128
7130 if (Entity.getDecl() &&
7133
7134 return !Diagnose ? AssignmentAction::Passing
7136
7138 case InitializedEntity::EK_StmtExprResult: // FIXME: Not quite right.
7140
7143 // FIXME: Can we tell apart casting vs. converting?
7145
7147 // This is really initialization, but refer to it as conversion for
7148 // consistency with CheckConvertedConstantExpression.
7150
7163 }
7164
7165 llvm_unreachable("Invalid EntityKind!");
7166}
7167
7168/// Whether we should bind a created object as a temporary when
7169/// initializing the given entity.
7202
7203/// Whether the given entity, when initialized with an object
7204/// created for that initialization, requires destruction.
7237
7238/// Get the location at which initialization diagnostics should appear.
7277
7278/// Make a (potentially elidable) temporary copy of the object
7279/// provided by the given initializer by calling the appropriate copy
7280/// constructor.
7281///
7282/// \param S The Sema object used for type-checking.
7283///
7284/// \param T The type of the temporary object, which must either be
7285/// the type of the initializer expression or a superclass thereof.
7286///
7287/// \param Entity The entity being initialized.
7288///
7289/// \param CurInit The initializer expression.
7290///
7291/// \param IsExtraneousCopy Whether this is an "extraneous" copy that
7292/// is permitted in C++03 (but not C++0x) when binding a reference to
7293/// an rvalue.
7294///
7295/// \returns An expression that copies the initializer expression into
7296/// a temporary object, or an error expression if a copy could not be
7297/// created.
7299 QualType T,
7300 const InitializedEntity &Entity,
7301 ExprResult CurInit,
7302 bool IsExtraneousCopy) {
7303 if (CurInit.isInvalid())
7304 return CurInit;
7305 // Determine which class type we're copying to.
7306 Expr *CurInitExpr = (Expr *)CurInit.get();
7307 auto *Class = T->getAsCXXRecordDecl();
7308 if (!Class)
7309 return CurInit;
7310
7311 SourceLocation Loc = getInitializationLoc(Entity, CurInit.get());
7312
7313 // Make sure that the type we are copying is complete.
7314 if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))
7315 return CurInit;
7316
7317 // Perform overload resolution using the class's constructors. Per
7318 // C++11 [dcl.init]p16, second bullet for class types, this initialization
7319 // is direct-initialization.
7322
7325 S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
7326 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
7327 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
7328 /*RequireActualConstructor=*/false,
7329 /*SecondStepOfCopyInit=*/true)) {
7330 case OR_Success:
7331 break;
7332
7334 CandidateSet.NoteCandidates(
7336 Loc, S.PDiag(IsExtraneousCopy && !S.isSFINAEContext()
7337 ? diag::ext_rvalue_to_reference_temp_copy_no_viable
7338 : diag::err_temp_copy_no_viable)
7339 << (int)Entity.getKind() << CurInitExpr->getType()
7340 << CurInitExpr->getSourceRange()),
7341 S, OCD_AllCandidates, CurInitExpr);
7342 if (!IsExtraneousCopy || S.isSFINAEContext())
7343 return ExprError();
7344 return CurInit;
7345
7346 case OR_Ambiguous:
7347 CandidateSet.NoteCandidates(
7348 PartialDiagnosticAt(Loc, S.PDiag(diag::err_temp_copy_ambiguous)
7349 << (int)Entity.getKind()
7350 << CurInitExpr->getType()
7351 << CurInitExpr->getSourceRange()),
7352 S, OCD_AmbiguousCandidates, CurInitExpr);
7353 return ExprError();
7354
7355 case OR_Deleted:
7356 S.Diag(Loc, diag::err_temp_copy_deleted)
7357 << (int)Entity.getKind() << CurInitExpr->getType()
7358 << CurInitExpr->getSourceRange();
7359 S.NoteDeletedFunction(Best->Function);
7360 return ExprError();
7361 }
7362
7363 bool HadMultipleCandidates = CandidateSet.size() > 1;
7364
7366 SmallVector<Expr*, 8> ConstructorArgs;
7367 CurInit.get(); // Ownership transferred into MultiExprArg, below.
7368
7369 S.CheckConstructorAccess(Loc, Constructor, Best->FoundDecl, Entity,
7370 IsExtraneousCopy);
7371
7372 if (IsExtraneousCopy) {
7373 // If this is a totally extraneous copy for C++03 reference
7374 // binding purposes, just return the original initialization
7375 // expression. We don't generate an (elided) copy operation here
7376 // because doing so would require us to pass down a flag to avoid
7377 // infinite recursion, where each step adds another extraneous,
7378 // elidable copy.
7379
7380 // Instantiate the default arguments of any extra parameters in
7381 // the selected copy constructor, as if we were going to create a
7382 // proper call to the copy constructor.
7383 for (unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
7384 ParmVarDecl *Parm = Constructor->getParamDecl(I);
7385 if (S.RequireCompleteType(Loc, Parm->getType(),
7386 diag::err_call_incomplete_argument))
7387 break;
7388
7389 // Build the default argument expression; we don't actually care
7390 // if this succeeds or not, because this routine will complain
7391 // if there was a problem.
7392 S.BuildCXXDefaultArgExpr(Loc, Constructor, Parm);
7393 }
7394
7395 return CurInitExpr;
7396 }
7397
7398 // Determine the arguments required to actually perform the
7399 // constructor call (we might have derived-to-base conversions, or
7400 // the copy constructor may have default arguments).
7401 if (S.CompleteConstructorCall(Constructor, T, CurInitExpr, Loc,
7402 ConstructorArgs))
7403 return ExprError();
7404
7405 // C++0x [class.copy]p32:
7406 // When certain criteria are met, an implementation is allowed to
7407 // omit the copy/move construction of a class object, even if the
7408 // copy/move constructor and/or destructor for the object have
7409 // side effects. [...]
7410 // - when a temporary class object that has not been bound to a
7411 // reference (12.2) would be copied/moved to a class object
7412 // with the same cv-unqualified type, the copy/move operation
7413 // can be omitted by constructing the temporary object
7414 // directly into the target of the omitted copy/move
7415 //
7416 // Note that the other three bullets are handled elsewhere. Copy
7417 // elision for return statements and throw expressions are handled as part
7418 // of constructor initialization, while copy elision for exception handlers
7419 // is handled by the run-time.
7420 //
7421 // FIXME: If the function parameter is not the same type as the temporary, we
7422 // should still be able to elide the copy, but we don't have a way to
7423 // represent in the AST how much should be elided in this case.
7424 bool Elidable =
7425 CurInitExpr->isTemporaryObject(S.Context, Class) &&
7427 Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
7428 CurInitExpr->getType());
7429
7430 // Actually perform the constructor call.
7431 CurInit = S.BuildCXXConstructExpr(
7432 Loc, T, Best->FoundDecl, Constructor, Elidable, ConstructorArgs,
7433 HadMultipleCandidates,
7434 /*ListInit*/ false,
7435 /*StdInitListInit*/ false,
7436 /*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
7437
7438 // If we're supposed to bind temporaries, do so.
7439 if (!CurInit.isInvalid() && shouldBindAsTemporary(Entity))
7440 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
7441 return CurInit;
7442}
7443
7444/// Check whether elidable copy construction for binding a reference to
7445/// a temporary would have succeeded if we were building in C++98 mode, for
7446/// -Wc++98-compat.
7448 const InitializedEntity &Entity,
7449 Expr *CurInitExpr) {
7450 assert(S.getLangOpts().CPlusPlus11);
7451
7452 auto *Record = CurInitExpr->getType()->getAsCXXRecordDecl();
7453 if (!Record)
7454 return;
7455
7456 SourceLocation Loc = getInitializationLoc(Entity, CurInitExpr);
7457 if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))
7458 return;
7459
7460 // Find constructors which would have been considered.
7463
7464 // Perform overload resolution.
7467 S, Loc, CurInitExpr, CandidateSet, CurInitExpr->getType(), Ctors, Best,
7468 /*CopyInitializing=*/false, /*AllowExplicit=*/true,
7469 /*OnlyListConstructors=*/false, /*IsListInit=*/false,
7470 /*RequireActualConstructor=*/false,
7471 /*SecondStepOfCopyInit=*/true);
7472
7473 PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
7474 << OR << (int)Entity.getKind() << CurInitExpr->getType()
7475 << CurInitExpr->getSourceRange();
7476
7477 switch (OR) {
7478 case OR_Success:
7479 S.CheckConstructorAccess(Loc, cast<CXXConstructorDecl>(Best->Function),
7480 Best->FoundDecl, Entity, Diag);
7481 // FIXME: Check default arguments as far as that's possible.
7482 break;
7483
7485 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7486 OCD_AllCandidates, CurInitExpr);
7487 break;
7488
7489 case OR_Ambiguous:
7490 CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, Diag), S,
7491 OCD_AmbiguousCandidates, CurInitExpr);
7492 break;
7493
7494 case OR_Deleted:
7495 S.Diag(Loc, Diag);
7496 S.NoteDeletedFunction(Best->Function);
7497 break;
7498 }
7499}
7500
7501void InitializationSequence::PrintInitLocationNote(Sema &S,
7502 const InitializedEntity &Entity) {
7503 if (Entity.isParamOrTemplateParamKind() && Entity.getDecl()) {
7504 if (Entity.getDecl()->getLocation().isInvalid())
7505 return;
7506
7507 if (Entity.getDecl()->getDeclName())
7508 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_named_here)
7509 << Entity.getDecl()->getDeclName();
7510 else
7511 S.Diag(Entity.getDecl()->getLocation(), diag::note_parameter_here);
7512 }
7513 else if (Entity.getKind() == InitializedEntity::EK_RelatedResult &&
7514 Entity.getMethodDecl())
7515 S.Diag(Entity.getMethodDecl()->getLocation(),
7516 diag::note_method_return_type_change)
7517 << Entity.getMethodDecl()->getDeclName();
7518}
7519
7520/// Returns true if the parameters describe a constructor initialization of
7521/// an explicit temporary object, e.g. "Point(x, y)".
7522static bool isExplicitTemporary(const InitializedEntity &Entity,
7523 const InitializationKind &Kind,
7524 unsigned NumArgs) {
7525 switch (Entity.getKind()) {
7529 break;
7530 default:
7531 return false;
7532 }
7533
7534 switch (Kind.getKind()) {
7536 return true;
7537 // FIXME: Hack to work around cast weirdness.
7540 return NumArgs != 1;
7541 default:
7542 return false;
7543 }
7544}
7545
7546static ExprResult
7548 const InitializedEntity &Entity,
7549 const InitializationKind &Kind,
7550 MultiExprArg Args,
7551 const InitializationSequence::Step& Step,
7552 bool &ConstructorInitRequiresZeroInit,
7553 bool IsListInitialization,
7554 bool IsStdInitListInitialization,
7555 SourceLocation LBraceLoc,
7556 SourceLocation RBraceLoc) {
7557 unsigned NumArgs = Args.size();
7560 bool HadMultipleCandidates = Step.Function.HadMultipleCandidates;
7561
7562 // Build a call to the selected constructor.
7563 SmallVector<Expr*, 8> ConstructorArgs;
7564 SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
7565 ? Kind.getEqualLoc()
7566 : Kind.getLocation();
7567
7568 if (Kind.getKind() == InitializationKind::IK_Default) {
7569 // Force even a trivial, implicit default constructor to be
7570 // semantically checked. We do this explicitly because we don't build
7571 // the definition for completely trivial constructors.
7572 assert(Constructor->getParent() && "No parent class for constructor.");
7573 if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
7574 Constructor->isTrivial() && !Constructor->isUsed(false)) {
7575 S.runWithSufficientStackSpace(Loc, [&] {
7577 });
7578 }
7579 }
7580
7581 ExprResult CurInit((Expr *)nullptr);
7582
7583 // C++ [over.match.copy]p1:
7584 // - When initializing a temporary to be bound to the first parameter
7585 // of a constructor that takes a reference to possibly cv-qualified
7586 // T as its first argument, called with a single argument in the
7587 // context of direct-initialization, explicit conversion functions
7588 // are also considered.
7589 bool AllowExplicitConv =
7590 Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
7593
7594 // A smart pointer constructed from a nullable pointer is nullable.
7595 if (NumArgs == 1 && !Kind.isExplicitCast())
7597 Entity.getType(), Args.front()->getType(), Kind.getLocation());
7598
7599 // Determine the arguments required to actually perform the constructor
7600 // call.
7601 if (S.CompleteConstructorCall(Constructor, Step.Type, Args, Loc,
7602 ConstructorArgs, AllowExplicitConv,
7603 IsListInitialization))
7604 return ExprError();
7605
7606 if (isExplicitTemporary(Entity, Kind, NumArgs)) {
7607 // An explicitly-constructed temporary, e.g., X(1, 2).
7608 if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
7609 return ExprError();
7610
7611 if (Kind.getKind() == InitializationKind::IK_Value &&
7612 Constructor->isImplicit()) {
7613 auto *RD = Step.Type.getCanonicalType()->getAsCXXRecordDecl();
7614 if (RD && RD->isAggregate() && RD->hasUninitializedExplicitInitFields()) {
7615 unsigned I = 0;
7616 for (const FieldDecl *FD : RD->fields()) {
7617 if (I >= ConstructorArgs.size() && FD->hasAttr<ExplicitInitAttr>() &&
7618 !S.isUnevaluatedContext()) {
7619 S.Diag(Loc, diag::warn_field_requires_explicit_init)
7620 << /* Var-in-Record */ 0 << FD;
7621 S.Diag(FD->getLocation(), diag::note_entity_declared_at) << FD;
7622 }
7623 ++I;
7624 }
7625 }
7626 }
7627
7628 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
7629 if (!TSInfo)
7630 TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc);
7631 SourceRange ParenOrBraceRange =
7632 (Kind.getKind() == InitializationKind::IK_DirectList)
7633 ? SourceRange(LBraceLoc, RBraceLoc)
7634 : Kind.getParenOrBraceRange();
7635
7636 CXXConstructorDecl *CalleeDecl = Constructor;
7637 if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
7638 Step.Function.FoundDecl.getDecl())) {
7639 CalleeDecl = S.findInheritingConstructor(Loc, Constructor, Shadow);
7640 }
7641 S.MarkFunctionReferenced(Loc, CalleeDecl);
7642
7643 CurInit = S.CheckForImmediateInvocation(
7645 S.Context, CalleeDecl,
7646 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
7647 ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
7648 IsListInitialization, IsStdInitListInitialization,
7649 ConstructorInitRequiresZeroInit),
7650 CalleeDecl);
7651 } else {
7653
7654 if (Entity.getKind() == InitializedEntity::EK_Base) {
7655 ConstructKind = Entity.getBaseSpecifier()->isVirtual()
7658 } else if (Entity.getKind() == InitializedEntity::EK_Delegating) {
7659 ConstructKind = CXXConstructionKind::Delegating;
7660 }
7661
7662 // Only get the parenthesis or brace range if it is a list initialization or
7663 // direct construction.
7664 SourceRange ParenOrBraceRange;
7665 if (IsListInitialization)
7666 ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc);
7667 else if (Kind.getKind() == InitializationKind::IK_Direct)
7668 ParenOrBraceRange = Kind.getParenOrBraceRange();
7669
7670 // If the entity allows NRVO, mark the construction as elidable
7671 // unconditionally.
7672 if (Entity.allowsNRVO())
7673 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7674 Step.Function.FoundDecl,
7675 Constructor, /*Elidable=*/true,
7676 ConstructorArgs,
7677 HadMultipleCandidates,
7678 IsListInitialization,
7679 IsStdInitListInitialization,
7680 ConstructorInitRequiresZeroInit,
7681 ConstructKind,
7682 ParenOrBraceRange);
7683 else
7684 CurInit = S.BuildCXXConstructExpr(Loc, Step.Type,
7685 Step.Function.FoundDecl,
7687 ConstructorArgs,
7688 HadMultipleCandidates,
7689 IsListInitialization,
7690 IsStdInitListInitialization,
7691 ConstructorInitRequiresZeroInit,
7692 ConstructKind,
7693 ParenOrBraceRange);
7694 }
7695 if (CurInit.isInvalid())
7696 return ExprError();
7697
7698 // Only check access if all of that succeeded.
7701 return ExprError();
7702
7703 if (const ArrayType *AT = S.Context.getAsArrayType(Entity.getType()))
7705 return ExprError();
7706
7707 if (shouldBindAsTemporary(Entity))
7708 CurInit = S.MaybeBindToTemporary(CurInit.get());
7709
7710 return CurInit;
7711}
7712
7714 Expr *Init) {
7715 return sema::checkInitLifetime(*this, Entity, Init);
7716}
7717
7718static void DiagnoseNarrowingInInitList(Sema &S,
7719 const ImplicitConversionSequence &ICS,
7720 QualType PreNarrowingType,
7721 QualType EntityType,
7722 const Expr *PostInit);
7723
7724static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType,
7725 QualType ToType, Expr *Init);
7726
7727/// Provide warnings when std::move is used on construction.
7728static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr,
7729 bool IsReturnStmt) {
7730 if (!InitExpr)
7731 return;
7732
7734 return;
7735
7736 QualType DestType = InitExpr->getType();
7737 if (!DestType->isRecordType())
7738 return;
7739
7740 unsigned DiagID = 0;
7741 if (IsReturnStmt) {
7742 const CXXConstructExpr *CCE =
7743 dyn_cast<CXXConstructExpr>(InitExpr->IgnoreParens());
7744 if (!CCE || CCE->getNumArgs() != 1)
7745 return;
7746
7748 return;
7749
7750 InitExpr = CCE->getArg(0)->IgnoreImpCasts();
7751 }
7752
7753 // Find the std::move call and get the argument.
7754 const CallExpr *CE = dyn_cast<CallExpr>(InitExpr->IgnoreParens());
7755 if (!CE || !CE->isCallToStdMove())
7756 return;
7757
7758 const Expr *Arg = CE->getArg(0)->IgnoreImplicit();
7759
7760 if (IsReturnStmt) {
7761 const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg->IgnoreParenImpCasts());
7762 if (!DRE || DRE->refersToEnclosingVariableOrCapture())
7763 return;
7764
7765 const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl());
7766 if (!VD || !VD->hasLocalStorage())
7767 return;
7768
7769 // __block variables are not moved implicitly.
7770 if (VD->hasAttr<BlocksAttr>())
7771 return;
7772
7773 QualType SourceType = VD->getType();
7774 if (!SourceType->isRecordType())
7775 return;
7776
7777 if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
7778 return;
7779 }
7780
7781 // If we're returning a function parameter, copy elision
7782 // is not possible.
7783 if (isa<ParmVarDecl>(VD))
7784 DiagID = diag::warn_redundant_move_on_return;
7785 else
7786 DiagID = diag::warn_pessimizing_move_on_return;
7787 } else {
7788 DiagID = diag::warn_pessimizing_move_on_initialization;
7789 const Expr *ArgStripped = Arg->IgnoreImplicit()->IgnoreParens();
7790 if (!ArgStripped->isPRValue() || !ArgStripped->getType()->isRecordType())
7791 return;
7792 }
7793
7794 S.Diag(CE->getBeginLoc(), DiagID);
7795
7796 // Get all the locations for a fix-it. Don't emit the fix-it if any location
7797 // is within a macro.
7798 SourceLocation CallBegin = CE->getCallee()->getBeginLoc();
7799 if (CallBegin.isMacroID())
7800 return;
7801 SourceLocation RParen = CE->getRParenLoc();
7802 if (RParen.isMacroID())
7803 return;
7804 SourceLocation LParen;
7805 SourceLocation ArgLoc = Arg->getBeginLoc();
7806
7807 // Special testing for the argument location. Since the fix-it needs the
7808 // location right before the argument, the argument location can be in a
7809 // macro only if it is at the beginning of the macro.
7810 while (ArgLoc.isMacroID() &&
7813 }
7814
7815 if (LParen.isMacroID())
7816 return;
7817
7818 LParen = ArgLoc.getLocWithOffset(-1);
7819
7820 S.Diag(CE->getBeginLoc(), diag::note_remove_move)
7821 << FixItHint::CreateRemoval(SourceRange(CallBegin, LParen))
7822 << FixItHint::CreateRemoval(SourceRange(RParen, RParen));
7823}
7824
7825static void CheckForNullPointerDereference(Sema &S, const Expr *E) {
7826 // Check to see if we are dereferencing a null pointer. If so, this is
7827 // undefined behavior, so warn about it. This only handles the pattern
7828 // "*null", which is a very syntactic check.
7829 if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParenCasts()))
7830 if (UO->getOpcode() == UO_Deref &&
7831 UO->getSubExpr()->IgnoreParenCasts()->
7832 isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)) {
7833 S.DiagRuntimeBehavior(UO->getOperatorLoc(), UO,
7834 S.PDiag(diag::warn_binding_null_to_reference)
7835 << UO->getSubExpr()->getSourceRange());
7836 }
7837}
7838
7841 bool BoundToLvalueReference) {
7842 auto MTE = new (Context)
7843 MaterializeTemporaryExpr(T, Temporary, BoundToLvalueReference);
7844
7845 // Order an ExprWithCleanups for lifetime marks.
7846 //
7847 // TODO: It'll be good to have a single place to check the access of the
7848 // destructor and generate ExprWithCleanups for various uses. Currently these
7849 // are done in both CreateMaterializeTemporaryExpr and MaybeBindToTemporary,
7850 // but there may be a chance to merge them.
7851 Cleanup.setExprNeedsCleanups(false);
7854 return MTE;
7855}
7856
7858 // In C++98, we don't want to implicitly create an xvalue. C11 added the
7859 // same rule, but C99 is broken without this behavior and so we treat the
7860 // change as applying to all C language modes.
7861 // FIXME: This means that AST consumers need to deal with "prvalues" that
7862 // denote materialized temporaries. Maybe we should add another ValueKind
7863 // for "xvalue pretending to be a prvalue" for C++98 support.
7864 if (!E->isPRValue() ||
7866 return E;
7867
7868 // C++1z [conv.rval]/1: T shall be a complete type.
7869 // FIXME: Does this ever matter (can we form a prvalue of incomplete type)?
7870 // If so, we should check for a non-abstract class type here too.
7871 QualType T = E->getType();
7872 if (RequireCompleteType(E->getExprLoc(), T, diag::err_incomplete_type))
7873 return ExprError();
7874
7875 return CreateMaterializeTemporaryExpr(E->getType(), E, false);
7876}
7877
7881
7882 CastKind CK = CK_NoOp;
7883
7884 if (VK == VK_PRValue) {
7885 auto PointeeTy = Ty->getPointeeType();
7886 auto ExprPointeeTy = E->getType()->getPointeeType();
7887 if (!PointeeTy.isNull() &&
7888 PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7889 CK = CK_AddressSpaceConversion;
7890 } else if (Ty.getAddressSpace() != E->getType().getAddressSpace()) {
7891 CK = CK_AddressSpaceConversion;
7892 }
7893
7894 return ImpCastExprToType(E, Ty, CK, VK, /*BasePath=*/nullptr, CCK);
7895}
7896
7898 const InitializedEntity &Entity,
7899 const InitializationKind &Kind,
7900 MultiExprArg Args,
7901 QualType *ResultType) {
7902 if (Failed()) {
7903 Diagnose(S, Entity, Kind, Args);
7904 return ExprError();
7905 }
7906 if (!ZeroInitializationFixit.empty()) {
7907 const Decl *D = Entity.getDecl();
7908 const auto *VD = dyn_cast_or_null<VarDecl>(D);
7909 QualType DestType = Entity.getType();
7910
7911 // The initialization would have succeeded with this fixit. Since the fixit
7912 // is on the error, we need to build a valid AST in this case, so this isn't
7913 // handled in the Failed() branch above.
7914 if (!DestType->isRecordType() && VD && VD->isConstexpr()) {
7915 // Use a more useful diagnostic for constexpr variables.
7916 S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
7917 << VD
7918 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7919 ZeroInitializationFixit);
7920 } else {
7921 unsigned DiagID = diag::err_default_init_const;
7922 if (S.getLangOpts().MSVCCompat && D && D->hasAttr<SelectAnyAttr>())
7923 DiagID = diag::ext_default_init_const;
7924
7925 S.Diag(Kind.getLocation(), DiagID)
7926 << DestType << DestType->isRecordType()
7927 << FixItHint::CreateInsertion(ZeroInitializationFixitLoc,
7928 ZeroInitializationFixit);
7929 }
7930 }
7931
7932 if (getKind() == DependentSequence) {
7933 // If the declaration is a non-dependent, incomplete array type
7934 // that has an initializer, then its type will be completed once
7935 // the initializer is instantiated.
7936 if (ResultType && !Entity.getType()->isDependentType() &&
7937 Args.size() == 1) {
7938 QualType DeclType = Entity.getType();
7939 if (const IncompleteArrayType *ArrayT
7940 = S.Context.getAsIncompleteArrayType(DeclType)) {
7941 // FIXME: We don't currently have the ability to accurately
7942 // compute the length of an initializer list without
7943 // performing full type-checking of the initializer list
7944 // (since we have to determine where braces are implicitly
7945 // introduced and such). So, we fall back to making the array
7946 // type a dependently-sized array type with no specified
7947 // bound.
7948 if (isa<InitListExpr>((Expr *)Args[0]))
7949 *ResultType = S.Context.getDependentSizedArrayType(
7950 ArrayT->getElementType(),
7951 /*NumElts=*/nullptr, ArrayT->getSizeModifier(),
7952 ArrayT->getIndexTypeCVRQualifiers());
7953 }
7954 }
7955 if (Kind.getKind() == InitializationKind::IK_Direct &&
7956 !Kind.isExplicitCast()) {
7957 // Rebuild the ParenListExpr.
7958 SourceRange ParenRange = Kind.getParenOrBraceRange();
7959 return S.ActOnParenListExpr(ParenRange.getBegin(), ParenRange.getEnd(),
7960 Args);
7961 }
7962 assert(Kind.getKind() == InitializationKind::IK_Copy ||
7963 Kind.isExplicitCast() ||
7964 Kind.getKind() == InitializationKind::IK_DirectList);
7965 return ExprResult(Args[0]);
7966 }
7967
7968 // No steps means no initialization.
7969 if (Steps.empty())
7970 return ExprResult((Expr *)nullptr);
7971
7972 if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() &&
7973 Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
7974 !Entity.isParamOrTemplateParamKind()) {
7975 // Produce a C++98 compatibility warning if we are initializing a reference
7976 // from an initializer list. For parameters, we produce a better warning
7977 // elsewhere.
7978 Expr *Init = Args[0];
7979 S.Diag(Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7980 << Init->getSourceRange();
7981 }
7982
7983 if (S.getLangOpts().MicrosoftExt && Args.size() == 1 &&
7984 isa<PredefinedExpr>(Args[0]) && Entity.getType()->isArrayType()) {
7985 // Produce a Microsoft compatibility warning when initializing from a
7986 // predefined expression since MSVC treats predefined expressions as string
7987 // literals.
7988 Expr *Init = Args[0];
7989 S.Diag(Init->getBeginLoc(), diag::ext_init_from_predefined) << Init;
7990 }
7991
7992 // OpenCL v2.0 s6.13.11.1. atomic variables can be initialized in global scope
7993 QualType ETy = Entity.getType();
7994 bool HasGlobalAS = ETy.hasAddressSpace() &&
7996
7997 if (S.getLangOpts().OpenCLVersion >= 200 &&
7998 ETy->isAtomicType() && !HasGlobalAS &&
7999 Entity.getKind() == InitializedEntity::EK_Variable && Args.size() > 0) {
8000 S.Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
8001 << 1
8002 << SourceRange(Entity.getDecl()->getBeginLoc(), Args[0]->getEndLoc());
8003 return ExprError();
8004 }
8005
8006 QualType DestType = Entity.getType().getNonReferenceType();
8007 // FIXME: Ugly hack around the fact that Entity.getType() is not
8008 // the same as Entity.getDecl()->getType() in cases involving type merging,
8009 // and we want latter when it makes sense.
8010 if (ResultType)
8011 *ResultType = Entity.getDecl() ? Entity.getDecl()->getType() :
8012 Entity.getType();
8013
8014 ExprResult CurInit((Expr *)nullptr);
8015 SmallVector<Expr*, 4> ArrayLoopCommonExprs;
8016
8017 // HLSL allows vector/matrix initialization to function like list
8018 // initialization, but use the syntax of a C++-like constructor.
8019 bool IsHLSLVectorOrMatrixInit =
8020 S.getLangOpts().HLSL &&
8021 (DestType->isExtVectorType() || DestType->isConstantMatrixType()) &&
8022 isa<InitListExpr>(Args[0]);
8023 (void)IsHLSLVectorOrMatrixInit;
8024
8025 // For initialization steps that start with a single initializer,
8026 // grab the only argument out the Args and place it into the "current"
8027 // initializer.
8028 switch (Steps.front().Kind) {
8033 case SK_BindReference:
8035 case SK_FinalCopy:
8037 case SK_UserConversion:
8046 case SK_UnwrapInitList:
8047 case SK_RewrapInitList:
8048 case SK_CAssignment:
8049 case SK_StringInit:
8051 case SK_ArrayLoopIndex:
8052 case SK_ArrayLoopInit:
8053 case SK_ArrayInit:
8054 case SK_GNUArrayInit:
8060 case SK_OCLSamplerInit:
8061 case SK_OCLZeroOpaqueType: {
8062 assert(Args.size() == 1 || IsHLSLVectorOrMatrixInit);
8063 CurInit = Args[0];
8064 if (!CurInit.get()) return ExprError();
8065 break;
8066 }
8067
8073 break;
8074 }
8075
8076 // Promote from an unevaluated context to an unevaluated list context in
8077 // C++11 list-initialization; we need to instantiate entities usable in
8078 // constant expressions here in order to perform narrowing checks =(
8081 isa_and_nonnull<InitListExpr>(CurInit.get()));
8082
8083 // C++ [class.abstract]p2:
8084 // no objects of an abstract class can be created except as subobjects
8085 // of a class derived from it
8086 auto checkAbstractType = [&](QualType T) -> bool {
8087 if (Entity.getKind() == InitializedEntity::EK_Base ||
8089 return false;
8090 return S.RequireNonAbstractType(Kind.getLocation(), T,
8091 diag::err_allocation_of_abstract_type);
8092 };
8093
8094 // Walk through the computed steps for the initialization sequence,
8095 // performing the specified conversions along the way.
8096 bool ConstructorInitRequiresZeroInit = false;
8097 for (step_iterator Step = step_begin(), StepEnd = step_end();
8098 Step != StepEnd; ++Step) {
8099 if (CurInit.isInvalid())
8100 return ExprError();
8101
8102 QualType SourceType = CurInit.get() ? CurInit.get()->getType() : QualType();
8103
8104 switch (Step->Kind) {
8106 // Overload resolution determined which function invoke; update the
8107 // initializer to reflect that choice.
8109 if (S.DiagnoseUseOfDecl(Step->Function.FoundDecl, Kind.getLocation()))
8110 return ExprError();
8111 CurInit = S.FixOverloadedFunctionReference(CurInit,
8114 // We might get back another placeholder expression if we resolved to a
8115 // builtin.
8116 if (!CurInit.isInvalid())
8117 CurInit = S.CheckPlaceholderExpr(CurInit.get());
8118 break;
8119
8123 // We have a derived-to-base cast that produces either an rvalue or an
8124 // lvalue. Perform that cast.
8125
8126 CXXCastPath BasePath;
8127
8128 // Casts to inaccessible base classes are allowed with C-style casts.
8129 bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
8131 SourceType, Step->Type, CurInit.get()->getBeginLoc(),
8132 CurInit.get()->getSourceRange(), &BasePath, IgnoreBaseAccess))
8133 return ExprError();
8134
8137 ? VK_LValue
8139 : VK_PRValue);
8141 CK_DerivedToBase, CurInit.get(),
8142 &BasePath, VK, FPOptionsOverride());
8143 break;
8144 }
8145
8146 case SK_BindReference:
8147 // Reference binding does not have any corresponding ASTs.
8148
8149 // Check exception specifications
8150 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
8151 return ExprError();
8152
8153 // We don't check for e.g. function pointers here, since address
8154 // availability checks should only occur when the function first decays
8155 // into a pointer or reference.
8156 if (CurInit.get()->getType()->isFunctionProtoType()) {
8157 if (auto *DRE = dyn_cast<DeclRefExpr>(CurInit.get()->IgnoreParens())) {
8158 if (auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
8159 if (!S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
8160 DRE->getBeginLoc()))
8161 return ExprError();
8162 }
8163 }
8164 }
8165
8166 CheckForNullPointerDereference(S, CurInit.get());
8167 break;
8168
8170 // Make sure the "temporary" is actually an rvalue.
8171 assert(CurInit.get()->isPRValue() && "not a temporary");
8172
8173 // Check exception specifications
8174 if (S.CheckExceptionSpecCompatibility(CurInit.get(), DestType))
8175 return ExprError();
8176
8177 QualType MTETy = Step->Type;
8178
8179 // When this is an incomplete array type (such as when this is
8180 // initializing an array of unknown bounds from an init list), use THAT
8181 // type instead so that we propagate the array bounds.
8182 if (MTETy->isIncompleteArrayType() &&
8183 !CurInit.get()->getType()->isIncompleteArrayType() &&
8186 CurInit.get()->getType()->getPointeeOrArrayElementType()))
8187 MTETy = CurInit.get()->getType();
8188
8189 // Materialize the temporary into memory.
8191 MTETy, CurInit.get(), Entity.getType()->isLValueReferenceType());
8192 CurInit = MTE;
8193
8194 // If we're extending this temporary to automatic storage duration -- we
8195 // need to register its cleanup during the full-expression's cleanups.
8196 if (MTE->getStorageDuration() == SD_Automatic &&
8197 MTE->getType().isDestructedType())
8199 break;
8200 }
8201
8202 case SK_FinalCopy:
8203 if (checkAbstractType(Step->Type))
8204 return ExprError();
8205
8206 // If the overall initialization is initializing a temporary, we already
8207 // bound our argument if it was necessary to do so. If not (if we're
8208 // ultimately initializing a non-temporary), our argument needs to be
8209 // bound since it's initializing a function parameter.
8210 // FIXME: This is a mess. Rationalize temporary destruction.
8211 if (!shouldBindAsTemporary(Entity))
8212 CurInit = S.MaybeBindToTemporary(CurInit.get());
8213 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
8214 /*IsExtraneousCopy=*/false);
8215 break;
8216
8218 CurInit = CopyObject(S, Step->Type, Entity, CurInit,
8219 /*IsExtraneousCopy=*/true);
8220 break;
8221
8222 case SK_UserConversion: {
8223 // We have a user-defined conversion that invokes either a constructor
8224 // or a conversion function.
8228 bool HadMultipleCandidates = Step->Function.HadMultipleCandidates;
8229 bool CreatedObject = false;
8230 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
8231 // Build a call to the selected constructor.
8232 SmallVector<Expr*, 8> ConstructorArgs;
8233 SourceLocation Loc = CurInit.get()->getBeginLoc();
8234
8235 // Determine the arguments required to actually perform the constructor
8236 // call.
8237 Expr *Arg = CurInit.get();
8239 MultiExprArg(&Arg, 1), Loc,
8240 ConstructorArgs))
8241 return ExprError();
8242
8243 // Build an expression that constructs a temporary.
8244 CurInit = S.BuildCXXConstructExpr(
8245 Loc, Step->Type, FoundFn, Constructor, ConstructorArgs,
8246 HadMultipleCandidates,
8247 /*ListInit*/ false,
8248 /*StdInitListInit*/ false,
8249 /*ZeroInit*/ false, CXXConstructionKind::Complete, SourceRange());
8250 if (CurInit.isInvalid())
8251 return ExprError();
8252
8253 S.CheckConstructorAccess(Kind.getLocation(), Constructor, FoundFn,
8254 Entity);
8255 if (S.DiagnoseUseOfOverloadedDecl(Constructor, Kind.getLocation()))
8256 return ExprError();
8257
8258 CastKind = CK_ConstructorConversion;
8259 CreatedObject = true;
8260 } else {
8261 // Build a call to the conversion function.
8263 S.CheckMemberOperatorAccess(Kind.getLocation(), CurInit.get(), nullptr,
8264 FoundFn);
8265 if (S.DiagnoseUseOfOverloadedDecl(Conversion, Kind.getLocation()))
8266 return ExprError();
8267
8268 CurInit = S.BuildCXXMemberCallExpr(CurInit.get(), FoundFn, Conversion,
8269 HadMultipleCandidates);
8270 if (CurInit.isInvalid())
8271 return ExprError();
8272
8273 CastKind = CK_UserDefinedConversion;
8274 CreatedObject = Conversion->getReturnType()->isRecordType();
8275 }
8276
8277 if (CreatedObject && checkAbstractType(CurInit.get()->getType()))
8278 return ExprError();
8279
8280 CurInit = ImplicitCastExpr::Create(
8281 S.Context, CurInit.get()->getType(), CastKind, CurInit.get(), nullptr,
8282 CurInit.get()->getValueKind(), S.CurFPFeatureOverrides());
8283
8284 if (shouldBindAsTemporary(Entity))
8285 // The overall entity is temporary, so this expression should be
8286 // destroyed at the end of its full-expression.
8287 CurInit = S.MaybeBindToTemporary(CurInit.getAs<Expr>());
8288 else if (CreatedObject && shouldDestroyEntity(Entity)) {
8289 // The object outlasts the full-expression, but we need to prepare for
8290 // a destructor being run on it.
8291 // FIXME: It makes no sense to do this here. This should happen
8292 // regardless of how we initialized the entity.
8293 QualType T = CurInit.get()->getType();
8294 if (auto *Record = T->castAsCXXRecordDecl()) {
8297 S.PDiag(diag::err_access_dtor_temp) << T);
8299 if (S.DiagnoseUseOfDecl(Destructor, CurInit.get()->getBeginLoc()))
8300 return ExprError();
8301 }
8302 }
8303 break;
8304 }
8305
8309 // Perform a qualification conversion; these can never go wrong.
8312 ? VK_LValue
8314 : VK_PRValue);
8315 CurInit = S.PerformQualificationConversion(CurInit.get(), Step->Type, VK);
8316 break;
8317 }
8318
8320 assert(CurInit.get()->isLValue() &&
8321 "function reference should be lvalue");
8322 CurInit =
8323 S.ImpCastExprToType(CurInit.get(), Step->Type, CK_NoOp, VK_LValue);
8324 break;
8325
8326 case SK_AtomicConversion: {
8327 assert(CurInit.get()->isPRValue() && "cannot convert glvalue to atomic");
8328 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8329 CK_NonAtomicToAtomic, VK_PRValue);
8330 break;
8331 }
8332
8335 if (const auto *FromPtrType =
8336 CurInit.get()->getType()->getAs<PointerType>()) {
8337 if (const auto *ToPtrType = Step->Type->getAs<PointerType>()) {
8338 if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
8339 !ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
8340 // Do not check static casts here because they are checked earlier
8341 // in Sema::ActOnCXXNamedCast()
8342 if (!Kind.isStaticCast()) {
8343 S.Diag(CurInit.get()->getExprLoc(),
8344 diag::warn_noderef_to_dereferenceable_pointer)
8345 << CurInit.get()->getSourceRange();
8346 }
8347 }
8348 }
8349 }
8350 Expr *Init = CurInit.get();
8352 Kind.isCStyleCast() ? CheckedConversionKind::CStyleCast
8353 : Kind.isFunctionalCast() ? CheckedConversionKind::FunctionalCast
8354 : Kind.isExplicitCast() ? CheckedConversionKind::OtherCast
8356 ExprResult CurInitExprRes = S.PerformImplicitConversion(
8357 Init, Step->Type, *Step->ICS, getAssignmentAction(Entity), CCK);
8358 if (CurInitExprRes.isInvalid())
8359 return ExprError();
8360
8362
8363 CurInit = CurInitExprRes;
8364
8366 S.getLangOpts().CPlusPlus)
8367 DiagnoseNarrowingInInitList(S, *Step->ICS, SourceType, Entity.getType(),
8368 CurInit.get());
8369
8370 break;
8371 }
8372
8373 case SK_ListInitialization: {
8374 if (checkAbstractType(Step->Type))
8375 return ExprError();
8376
8377 InitListExpr *InitList = cast<InitListExpr>(CurInit.get());
8378 // If we're not initializing the top-level entity, we need to create an
8379 // InitializeTemporary entity for our target type.
8380 QualType Ty = Step->Type;
8381 bool IsTemporary = !S.Context.hasSameType(Entity.getType(), Ty);
8382 InitializedEntity InitEntity =
8383 IsTemporary ? InitializedEntity::InitializeTemporary(Ty) : Entity;
8384 InitListChecker PerformInitList(S, InitEntity,
8385 InitList, Ty, /*VerifyOnly=*/false,
8386 /*TreatUnavailableAsInvalid=*/false);
8387 if (PerformInitList.HadError())
8388 return ExprError();
8389
8390 // Hack: We must update *ResultType if available in order to set the
8391 // bounds of arrays, e.g. in 'int ar[] = {1, 2, 3};'.
8392 // Worst case: 'const int (&arref)[] = {1, 2, 3};'.
8393 if (ResultType &&
8394 ResultType->getNonReferenceType()->isIncompleteArrayType()) {
8395 if ((*ResultType)->isRValueReferenceType())
8397 else if ((*ResultType)->isLValueReferenceType())
8399 (*ResultType)->castAs<LValueReferenceType>()->isSpelledAsLValue());
8400 *ResultType = Ty;
8401 }
8402
8403 InitListExpr *StructuredInitList =
8404 PerformInitList.getFullyStructuredList();
8405 CurInit = shouldBindAsTemporary(InitEntity)
8406 ? S.MaybeBindToTemporary(StructuredInitList)
8407 : StructuredInitList;
8408 break;
8409 }
8410
8412 if (checkAbstractType(Step->Type))
8413 return ExprError();
8414
8415 // When an initializer list is passed for a parameter of type "reference
8416 // to object", we don't get an EK_Temporary entity, but instead an
8417 // EK_Parameter entity with reference type.
8418 // FIXME: This is a hack. What we really should do is create a user
8419 // conversion step for this case, but this makes it considerably more
8420 // complicated. For now, this will do.
8422 Entity.getType().getNonReferenceType());
8423 bool UseTemporary = Entity.getType()->isReferenceType();
8424 assert(Args.size() == 1 && "expected a single argument for list init");
8425 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
8426 S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8427 << InitList->getSourceRange();
8428 MultiExprArg Arg(InitList->getInits(), InitList->getNumInits());
8429 CurInit = PerformConstructorInitialization(S, UseTemporary ? TempEntity :
8430 Entity,
8431 Kind, Arg, *Step,
8432 ConstructorInitRequiresZeroInit,
8433 /*IsListInitialization*/true,
8434 /*IsStdInitListInit*/false,
8435 InitList->getLBraceLoc(),
8436 InitList->getRBraceLoc());
8437 break;
8438 }
8439
8440 case SK_UnwrapInitList:
8441 CurInit = cast<InitListExpr>(CurInit.get())->getInit(0);
8442 break;
8443
8444 case SK_RewrapInitList: {
8445 Expr *E = CurInit.get();
8447 InitListExpr *ILE = new (S.Context) InitListExpr(S.Context,
8448 Syntactic->getLBraceLoc(), E, Syntactic->getRBraceLoc());
8449 ILE->setSyntacticForm(Syntactic);
8450 ILE->setType(E->getType());
8451 ILE->setValueKind(E->getValueKind());
8452 CurInit = ILE;
8453 break;
8454 }
8455
8458 if (checkAbstractType(Step->Type))
8459 return ExprError();
8460
8461 // When an initializer list is passed for a parameter of type "reference
8462 // to object", we don't get an EK_Temporary entity, but instead an
8463 // EK_Parameter entity with reference type.
8464 // FIXME: This is a hack. What we really should do is create a user
8465 // conversion step for this case, but this makes it considerably more
8466 // complicated. For now, this will do.
8468 Entity.getType().getNonReferenceType());
8469 bool UseTemporary = Entity.getType()->isReferenceType();
8470 bool IsStdInitListInit =
8472 Expr *Source = CurInit.get();
8473 SourceRange Range = Kind.hasParenOrBraceRange()
8474 ? Kind.getParenOrBraceRange()
8475 : SourceRange();
8477 S, UseTemporary ? TempEntity : Entity, Kind,
8478 Source ? MultiExprArg(Source) : Args, *Step,
8479 ConstructorInitRequiresZeroInit,
8480 /*IsListInitialization*/ IsStdInitListInit,
8481 /*IsStdInitListInitialization*/ IsStdInitListInit,
8482 /*LBraceLoc*/ Range.getBegin(),
8483 /*RBraceLoc*/ Range.getEnd());
8484 break;
8485 }
8486
8487 case SK_ZeroInitialization: {
8488 step_iterator NextStep = Step;
8489 ++NextStep;
8490 if (NextStep != StepEnd &&
8491 (NextStep->Kind == SK_ConstructorInitialization ||
8492 NextStep->Kind == SK_ConstructorInitializationFromList)) {
8493 // The need for zero-initialization is recorded directly into
8494 // the call to the object's constructor within the next step.
8495 ConstructorInitRequiresZeroInit = true;
8496 } else if (Kind.getKind() == InitializationKind::IK_Value &&
8497 S.getLangOpts().CPlusPlus &&
8498 !Kind.isImplicitValueInit()) {
8499 TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
8500 if (!TSInfo)
8502 Kind.getRange().getBegin());
8503
8504 CurInit = new (S.Context) CXXScalarValueInitExpr(
8505 Entity.getType().getNonLValueExprType(S.Context), TSInfo,
8506 Kind.getRange().getEnd());
8507 } else {
8508 CurInit = new (S.Context) ImplicitValueInitExpr(Step->Type);
8509 // Note the return value isn't used to return a ExprError() when
8510 // initialization fails . For struct initialization allows all field
8511 // assignments to be checked rather than bailing on the first error.
8512 S.BoundsSafetyCheckInitialization(Entity, Kind,
8514 Step->Type, CurInit.get());
8515 }
8516 break;
8517 }
8518
8519 case SK_CAssignment: {
8520 QualType SourceType = CurInit.get()->getType();
8521 Expr *Init = CurInit.get();
8522
8523 // Save off the initial CurInit in case we need to emit a diagnostic
8524 ExprResult InitialCurInit = Init;
8527 Step->Type, Result, true,
8529 if (Result.isInvalid())
8530 return ExprError();
8531 CurInit = Result;
8532
8533 // If this is a call, allow conversion to a transparent union.
8534 ExprResult CurInitExprRes = CurInit;
8535 if (!S.IsAssignConvertCompatible(ConvTy) && Entity.isParameterKind() &&
8537 Step->Type, CurInitExprRes) == AssignConvertType::Compatible)
8539 if (CurInitExprRes.isInvalid())
8540 return ExprError();
8541 CurInit = CurInitExprRes;
8542
8543 if (S.getLangOpts().C23 && initializingConstexprVariable(Entity)) {
8544 CheckC23ConstexprInitConversion(S, SourceType, Entity.getType(),
8545 CurInit.get());
8546
8547 // C23 6.7.1p6: If an object or subobject declared with storage-class
8548 // specifier constexpr has pointer, integer, or arithmetic type, any
8549 // explicit initializer value for it shall be null, an integer
8550 // constant expression, or an arithmetic constant expression,
8551 // respectively.
8553 if (Entity.getType()->getAs<PointerType>() &&
8554 CurInit.get()->EvaluateAsRValue(ER, S.Context) &&
8555 (ER.Val.isLValue() && !ER.Val.isNullPointer())) {
8556 S.Diag(Kind.getLocation(), diag::err_c23_constexpr_pointer_not_null);
8557 return ExprError();
8558 }
8559 }
8560
8561 // Note the return value isn't used to return a ExprError() when
8562 // initialization fails. For struct initialization this allows all field
8563 // assignments to be checked rather than bailing on the first error.
8564 S.BoundsSafetyCheckInitialization(Entity, Kind,
8565 getAssignmentAction(Entity, true),
8566 Step->Type, InitialCurInit.get());
8567
8568 bool Complained;
8569 if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
8570 Step->Type, SourceType,
8571 InitialCurInit.get(),
8572 getAssignmentAction(Entity, true),
8573 &Complained)) {
8574 PrintInitLocationNote(S, Entity);
8575 return ExprError();
8576 } else if (Complained)
8577 PrintInitLocationNote(S, Entity);
8578 break;
8579 }
8580
8581 case SK_StringInit: {
8582 QualType Ty = Step->Type;
8583 bool UpdateType = ResultType && Entity.getType()->isIncompleteArrayType();
8584 CheckStringInit(CurInit.get(), UpdateType ? *ResultType : Ty,
8585 S.Context.getAsArrayType(Ty), S, Entity,
8586 S.getLangOpts().C23 &&
8588 break;
8589 }
8590
8592 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8593 CK_ObjCObjectLValueCast,
8594 CurInit.get()->getValueKind());
8595 break;
8596
8597 case SK_ArrayLoopIndex: {
8598 Expr *Cur = CurInit.get();
8599 Expr *BaseExpr = new (S.Context)
8600 OpaqueValueExpr(Cur->getExprLoc(), Cur->getType(),
8601 Cur->getValueKind(), Cur->getObjectKind(), Cur);
8602 Expr *IndexExpr =
8605 BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8606 ArrayLoopCommonExprs.push_back(BaseExpr);
8607 break;
8608 }
8609
8610 case SK_ArrayLoopInit: {
8611 assert(!ArrayLoopCommonExprs.empty() &&
8612 "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8613 Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8614 CurInit = new (S.Context) ArrayInitLoopExpr(Step->Type, Common,
8615 CurInit.get());
8616 break;
8617 }
8618
8619 case SK_GNUArrayInit:
8620 // Okay: we checked everything before creating this step. Note that
8621 // this is a GNU extension.
8622 S.Diag(Kind.getLocation(), diag::ext_array_init_copy)
8623 << Step->Type << CurInit.get()->getType()
8624 << CurInit.get()->getSourceRange();
8626 [[fallthrough]];
8627 case SK_ArrayInit:
8628 // If the destination type is an incomplete array type, update the
8629 // type accordingly.
8630 if (ResultType) {
8631 if (const IncompleteArrayType *IncompleteDest
8633 if (const ConstantArrayType *ConstantSource
8634 = S.Context.getAsConstantArrayType(CurInit.get()->getType())) {
8635 *ResultType = S.Context.getConstantArrayType(
8636 IncompleteDest->getElementType(), ConstantSource->getSize(),
8637 ConstantSource->getSizeExpr(), ArraySizeModifier::Normal, 0);
8638 }
8639 }
8640 }
8641 break;
8642
8644 // Okay: we checked everything before creating this step. Note that
8645 // this is a GNU extension.
8646 S.Diag(Kind.getLocation(), diag::ext_array_init_parens)
8647 << CurInit.get()->getSourceRange();
8648 break;
8649
8652 checkIndirectCopyRestoreSource(S, CurInit.get());
8653 CurInit = new (S.Context) ObjCIndirectCopyRestoreExpr(
8654 CurInit.get(), Step->Type,
8656 break;
8657
8659 CurInit = ImplicitCastExpr::Create(
8660 S.Context, Step->Type, CK_ARCProduceObject, CurInit.get(), nullptr,
8662 break;
8663
8664 case SK_StdInitializerList: {
8665 S.Diag(CurInit.get()->getExprLoc(),
8666 diag::warn_cxx98_compat_initializer_list_init)
8667 << CurInit.get()->getSourceRange();
8668
8669 // Materialize the temporary into memory.
8671 CurInit.get()->getType(), CurInit.get(),
8672 /*BoundToLvalueReference=*/false);
8673
8674 // Wrap it in a construction of a std::initializer_list<T>.
8675 CurInit = new (S.Context) CXXStdInitializerListExpr(Step->Type, MTE);
8676
8677 if (!Step->Type->isDependentType()) {
8678 QualType ElementType;
8679 [[maybe_unused]] bool IsStdInitializerList =
8680 S.isStdInitializerList(Step->Type, &ElementType);
8681 assert(IsStdInitializerList &&
8682 "StdInitializerList step to non-std::initializer_list");
8683 const auto *Record = Step->Type->castAsCXXRecordDecl();
8684 assert(Record->isCompleteDefinition() &&
8685 "std::initializer_list should have already be "
8686 "complete/instantiated by this point");
8687
8688 auto InvalidType = [&] {
8689 S.Diag(Record->getLocation(),
8690 diag::err_std_initializer_list_malformed)
8692 return ExprError();
8693 };
8694
8695 if (Record->isUnion() || Record->getNumBases() != 0 ||
8696 Record->isPolymorphic())
8697 return InvalidType();
8698
8699 RecordDecl::field_iterator Field = Record->field_begin();
8700 if (Field == Record->field_end())
8701 return InvalidType();
8702
8703 // Start pointer
8704 if (!Field->getType()->isPointerType() ||
8705 !S.Context.hasSameType(Field->getType()->getPointeeType(),
8706 ElementType.withConst()))
8707 return InvalidType();
8708
8709 if (++Field == Record->field_end())
8710 return InvalidType();
8711
8712 // Size or end pointer
8713 if (const auto *PT = Field->getType()->getAs<PointerType>()) {
8714 if (!S.Context.hasSameType(PT->getPointeeType(),
8715 ElementType.withConst()))
8716 return InvalidType();
8717 } else {
8718 if (Field->isBitField() ||
8719 !S.Context.hasSameType(Field->getType(), S.Context.getSizeType()))
8720 return InvalidType();
8721 }
8722
8723 if (++Field != Record->field_end())
8724 return InvalidType();
8725 }
8726
8727 // Bind the result, in case the library has given initializer_list a
8728 // non-trivial destructor.
8729 if (shouldBindAsTemporary(Entity))
8730 CurInit = S.MaybeBindToTemporary(CurInit.get());
8731 break;
8732 }
8733
8734 case SK_OCLSamplerInit: {
8735 // Sampler initialization have 5 cases:
8736 // 1. function argument passing
8737 // 1a. argument is a file-scope variable
8738 // 1b. argument is a function-scope variable
8739 // 1c. argument is one of caller function's parameters
8740 // 2. variable initialization
8741 // 2a. initializing a file-scope variable
8742 // 2b. initializing a function-scope variable
8743 //
8744 // For file-scope variables, since they cannot be initialized by function
8745 // call of __translate_sampler_initializer in LLVM IR, their references
8746 // need to be replaced by a cast from their literal initializers to
8747 // sampler type. Since sampler variables can only be used in function
8748 // calls as arguments, we only need to replace them when handling the
8749 // argument passing.
8750 assert(Step->Type->isSamplerT() &&
8751 "Sampler initialization on non-sampler type.");
8752 Expr *Init = CurInit.get()->IgnoreParens();
8753 QualType SourceType = Init->getType();
8754 // Case 1
8755 if (Entity.isParameterKind()) {
8756 if (!SourceType->isSamplerT() && !SourceType->isIntegerType()) {
8757 S.Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8758 << SourceType;
8759 break;
8760 } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Init)) {
8761 auto Var = cast<VarDecl>(DRE->getDecl());
8762 // Case 1b and 1c
8763 // No cast from integer to sampler is needed.
8764 if (!Var->hasGlobalStorage()) {
8765 CurInit = ImplicitCastExpr::Create(
8766 S.Context, Step->Type, CK_LValueToRValue, Init,
8767 /*BasePath=*/nullptr, VK_PRValue, FPOptionsOverride());
8768 break;
8769 }
8770 // Case 1a
8771 // For function call with a file-scope sampler variable as argument,
8772 // get the integer literal.
8773 // Do not diagnose if the file-scope variable does not have initializer
8774 // since this has already been diagnosed when parsing the variable
8775 // declaration.
8776 if (!Var->getInit() || !isa<ImplicitCastExpr>(Var->getInit()))
8777 break;
8778 Init = cast<ImplicitCastExpr>(const_cast<Expr*>(
8779 Var->getInit()))->getSubExpr();
8780 SourceType = Init->getType();
8781 }
8782 } else {
8783 // Case 2
8784 // Check initializer is 32 bit integer constant.
8785 // If the initializer is taken from global variable, do not diagnose since
8786 // this has already been done when parsing the variable declaration.
8787 if (!Init->isConstantInitializer(S.Context, false))
8788 break;
8789
8790 if (!SourceType->isIntegerType() ||
8791 32 != S.Context.getIntWidth(SourceType)) {
8792 S.Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8793 << SourceType;
8794 break;
8795 }
8796
8797 Expr::EvalResult EVResult;
8798 Init->EvaluateAsInt(EVResult, S.Context);
8799 llvm::APSInt Result = EVResult.Val.getInt();
8800 const uint64_t SamplerValue = Result.getLimitedValue();
8801 // 32-bit value of sampler's initializer is interpreted as
8802 // bit-field with the following structure:
8803 // |unspecified|Filter|Addressing Mode| Normalized Coords|
8804 // |31 6|5 4|3 1| 0|
8805 // This structure corresponds to enum values of sampler properties
8806 // defined in SPIR spec v1.2 and also opencl-c.h
8807 unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8808 unsigned FilterMode = (0x30 & SamplerValue) >> 4;
8809 if (FilterMode != 1 && FilterMode != 2 &&
8811 "cl_intel_device_side_avc_motion_estimation", S.getLangOpts()))
8812 S.Diag(Kind.getLocation(),
8813 diag::warn_sampler_initializer_invalid_bits)
8814 << "Filter Mode";
8815 if (AddressingMode > 4)
8816 S.Diag(Kind.getLocation(),
8817 diag::warn_sampler_initializer_invalid_bits)
8818 << "Addressing Mode";
8819 }
8820
8821 // Cases 1a, 2a and 2b
8822 // Insert cast from integer to sampler.
8824 CK_IntToOCLSampler);
8825 break;
8826 }
8827 case SK_OCLZeroOpaqueType: {
8828 assert((Step->Type->isEventT() || Step->Type->isQueueT() ||
8830 "Wrong type for initialization of OpenCL opaque type.");
8831
8832 CurInit = S.ImpCastExprToType(CurInit.get(), Step->Type,
8833 CK_ZeroToOCLOpaqueType,
8834 CurInit.get()->getValueKind());
8835 break;
8836 }
8838 CurInit = nullptr;
8839 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
8840 /*VerifyOnly=*/false, &CurInit);
8841 if (CurInit.get() && ResultType)
8842 *ResultType = CurInit.get()->getType();
8843 if (shouldBindAsTemporary(Entity))
8844 CurInit = S.MaybeBindToTemporary(CurInit.get());
8845 break;
8846 }
8847 }
8848 }
8849
8850 Expr *Init = CurInit.get();
8851 if (!Init)
8852 return ExprError();
8853
8854 // Check whether the initializer has a shorter lifetime than the initialized
8855 // entity, and if not, either lifetime-extend or warn as appropriate.
8856 S.checkInitializerLifetime(Entity, Init);
8857
8858 // Diagnose non-fatal problems with the completed initialization.
8859 if (InitializedEntity::EntityKind EK = Entity.getKind();
8862 cast<FieldDecl>(Entity.getDecl())->isBitField())
8863 S.CheckBitFieldInitialization(Kind.getLocation(),
8864 cast<FieldDecl>(Entity.getDecl()), Init);
8865
8866 // Check for std::move on construction.
8869
8870 return Init;
8871}
8872
8873/// Somewhere within T there is an uninitialized reference subobject.
8874/// Dig it out and diagnose it.
8876 QualType T) {
8877 if (T->isReferenceType()) {
8878 S.Diag(Loc, diag::err_reference_without_init)
8879 << T.getNonReferenceType();
8880 return true;
8881 }
8882
8883 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
8884 if (!RD || !RD->hasUninitializedReferenceMember())
8885 return false;
8886
8887 for (const auto *FI : RD->fields()) {
8888 if (FI->isUnnamedBitField())
8889 continue;
8890
8891 if (DiagnoseUninitializedReference(S, FI->getLocation(), FI->getType())) {
8892 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8893 return true;
8894 }
8895 }
8896
8897 for (const auto &BI : RD->bases()) {
8898 if (DiagnoseUninitializedReference(S, BI.getBeginLoc(), BI.getType())) {
8899 S.Diag(Loc, diag::note_value_initialization_here) << RD;
8900 return true;
8901 }
8902 }
8903
8904 return false;
8905}
8906
8907
8908//===----------------------------------------------------------------------===//
8909// Diagnose initialization failures
8910//===----------------------------------------------------------------------===//
8911
8912/// Emit notes associated with an initialization that failed due to a
8913/// "simple" conversion failure.
8914static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity,
8915 Expr *op) {
8916 QualType destType = entity.getType();
8917 if (destType.getNonReferenceType()->isObjCObjectPointerType() &&
8919
8920 // Emit a possible note about the conversion failing because the
8921 // operand is a message send with a related result type.
8923
8924 // Emit a possible note about a return failing because we're
8925 // expecting a related result type.
8926 if (entity.getKind() == InitializedEntity::EK_Result)
8928 }
8929 QualType fromType = op->getType();
8930 QualType fromPointeeType = fromType.getCanonicalType()->getPointeeType();
8931 QualType destPointeeType = destType.getCanonicalType()->getPointeeType();
8932 auto *fromDecl = fromType->getPointeeCXXRecordDecl();
8933 auto *destDecl = destType->getPointeeCXXRecordDecl();
8934 if (fromDecl && destDecl && fromDecl->getDeclKind() == Decl::CXXRecord &&
8935 destDecl->getDeclKind() == Decl::CXXRecord &&
8936 !fromDecl->isInvalidDecl() && !destDecl->isInvalidDecl() &&
8937 !fromDecl->hasDefinition() &&
8938 destPointeeType.getQualifiers().compatiblyIncludes(
8939 fromPointeeType.getQualifiers(), S.getASTContext()))
8940 S.Diag(fromDecl->getLocation(), diag::note_forward_class_conversion)
8941 << S.getASTContext().getCanonicalTagType(fromDecl)
8942 << S.getASTContext().getCanonicalTagType(destDecl);
8943}
8944
8945static void diagnoseListInit(Sema &S, const InitializedEntity &Entity,
8946 InitListExpr *InitList) {
8947 QualType DestType = Entity.getType();
8948
8949 QualType E;
8950 if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) {
8952 E.withConst(),
8953 llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()),
8954 InitList->getNumInits()),
8956 InitializedEntity HiddenArray =
8958 return diagnoseListInit(S, HiddenArray, InitList);
8959 }
8960
8961 if (DestType->isReferenceType()) {
8962 // A list-initialization failure for a reference means that we tried to
8963 // create a temporary of the inner type (per [dcl.init.list]p3.6) and the
8964 // inner initialization failed.
8965 QualType T = DestType->castAs<ReferenceType>()->getPointeeType();
8967 SourceLocation Loc = InitList->getBeginLoc();
8968 if (auto *D = Entity.getDecl())
8969 Loc = D->getLocation();
8970 S.Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
8971 return;
8972 }
8973
8974 InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
8975 /*VerifyOnly=*/false,
8976 /*TreatUnavailableAsInvalid=*/false);
8977 assert(DiagnoseInitList.HadError() &&
8978 "Inconsistent init list check result.");
8979}
8980
8982 const InitializedEntity &Entity,
8983 const InitializationKind &Kind,
8984 ArrayRef<Expr *> Args) {
8985 if (!Failed())
8986 return false;
8987
8988 QualType DestType = Entity.getType();
8989
8990 // When we want to diagnose only one element of a braced-init-list,
8991 // we need to factor it out.
8992 Expr *OnlyArg;
8993 if (Args.size() == 1) {
8994 auto *List = dyn_cast<InitListExpr>(Args[0]);
8995 if (List && List->getNumInits() == 1)
8996 OnlyArg = List->getInit(0);
8997 else
8998 OnlyArg = Args[0];
8999
9000 if (OnlyArg->getType() == S.Context.OverloadTy) {
9003 OnlyArg, DestType.getNonReferenceType(), /*Complain=*/false,
9004 Found)) {
9005 if (Expr *Resolved =
9006 S.FixOverloadedFunctionReference(OnlyArg, Found, FD).get())
9007 OnlyArg = Resolved;
9008 }
9009 }
9010 }
9011 else
9012 OnlyArg = nullptr;
9013
9014 switch (Failure) {
9016 // FIXME: Customize for the initialized entity?
9017 if (Args.empty()) {
9018 // Dig out the reference subobject which is uninitialized and diagnose it.
9019 // If this is value-initialization, this could be nested some way within
9020 // the target type.
9021 assert(Kind.getKind() == InitializationKind::IK_Value ||
9022 DestType->isReferenceType());
9023 bool Diagnosed =
9024 DiagnoseUninitializedReference(S, Kind.getLocation(), DestType);
9025 assert(Diagnosed && "couldn't find uninitialized reference to diagnose");
9026 (void)Diagnosed;
9027 } else // FIXME: diagnostic below could be better!
9028 S.Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
9029 << SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
9030 break;
9032 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
9033 << 1 << Entity.getType() << Args[0]->getSourceRange();
9034 break;
9035
9037 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
9038 break;
9040 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
9041 break;
9043 S.Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
9044 break;
9046 S.Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
9047 break;
9049 S.Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
9050 break;
9052 S.Diag(Kind.getLocation(),
9053 diag::err_array_init_incompat_wide_string_into_wchar);
9054 break;
9056 S.Diag(Kind.getLocation(),
9057 diag::err_array_init_plain_string_into_char8_t);
9058 S.Diag(Args.front()->getBeginLoc(),
9059 diag::note_array_init_plain_string_into_char8_t)
9060 << FixItHint::CreateInsertion(Args.front()->getBeginLoc(), "u8");
9061 break;
9063 S.Diag(Kind.getLocation(), diag::err_array_init_utf8_string_into_char)
9064 << DestType->isSignedIntegerType() << S.getLangOpts().CPlusPlus20;
9065 break;
9068 S.Diag(Kind.getLocation(),
9069 (Failure == FK_ArrayTypeMismatch
9070 ? diag::err_array_init_different_type
9071 : diag::err_array_init_non_constant_array))
9072 << DestType.getNonReferenceType()
9073 << OnlyArg->getType()
9074 << Args[0]->getSourceRange();
9075 break;
9076
9078 S.Diag(Kind.getLocation(), diag::err_variable_object_no_init)
9079 << Args[0]->getSourceRange();
9080 break;
9081
9085 DestType.getNonReferenceType(),
9086 true,
9087 Found);
9088 break;
9089 }
9090
9092 auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(OnlyArg)->getDecl());
9093 S.checkAddressOfFunctionIsAvailable(FD, /*Complain=*/true,
9094 OnlyArg->getBeginLoc());
9095 break;
9096 }
9097
9100 switch (FailedOverloadResult) {
9101 case OR_Ambiguous:
9102
9103 FailedCandidateSet.NoteCandidates(
9105 Kind.getLocation(),
9107 ? (S.PDiag(diag::err_typecheck_ambiguous_condition)
9108 << OnlyArg->getType() << DestType
9109 << Args[0]->getSourceRange())
9110 : (S.PDiag(diag::err_ref_init_ambiguous)
9111 << DestType << OnlyArg->getType()
9112 << Args[0]->getSourceRange())),
9113 S, OCD_AmbiguousCandidates, Args);
9114 break;
9115
9116 case OR_No_Viable_Function: {
9117 auto Cands = FailedCandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args);
9118 if (!S.RequireCompleteType(Kind.getLocation(),
9119 DestType.getNonReferenceType(),
9120 diag::err_typecheck_nonviable_condition_incomplete,
9121 OnlyArg->getType(), Args[0]->getSourceRange()))
9122 S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
9123 << (Entity.getKind() == InitializedEntity::EK_Result)
9124 << OnlyArg->getType() << Args[0]->getSourceRange()
9125 << DestType.getNonReferenceType();
9126
9127 FailedCandidateSet.NoteCandidates(S, Args, Cands);
9128 break;
9129 }
9130 case OR_Deleted: {
9133 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9134
9135 StringLiteral *Msg = Best->Function->getDeletedMessage();
9136 S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
9137 << OnlyArg->getType() << DestType.getNonReferenceType()
9138 << (Msg != nullptr) << (Msg ? Msg->getString() : StringRef())
9139 << Args[0]->getSourceRange();
9140 if (Ovl == OR_Deleted) {
9141 S.NoteDeletedFunction(Best->Function);
9142 } else {
9143 llvm_unreachable("Inconsistent overload resolution?");
9144 }
9145 break;
9146 }
9147
9148 case OR_Success:
9149 llvm_unreachable("Conversion did not fail!");
9150 }
9151 break;
9152
9154 if (isa<InitListExpr>(Args[0])) {
9155 S.Diag(Kind.getLocation(),
9156 diag::err_lvalue_reference_bind_to_initlist)
9158 << DestType.getNonReferenceType()
9159 << Args[0]->getSourceRange();
9160 break;
9161 }
9162 [[fallthrough]];
9163
9165 S.Diag(Kind.getLocation(),
9167 ? diag::err_lvalue_reference_bind_to_temporary
9168 : diag::err_lvalue_reference_bind_to_unrelated)
9170 << DestType.getNonReferenceType()
9171 << OnlyArg->getType()
9172 << Args[0]->getSourceRange();
9173 break;
9174
9176 // We don't necessarily have an unambiguous source bit-field.
9177 FieldDecl *BitField = Args[0]->getSourceBitField();
9178 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
9179 << DestType.isVolatileQualified()
9180 << (BitField ? BitField->getDeclName() : DeclarationName())
9181 << (BitField != nullptr)
9182 << Args[0]->getSourceRange();
9183 if (BitField)
9184 S.Diag(BitField->getLocation(), diag::note_bitfield_decl);
9185 break;
9186 }
9187
9189 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
9190 << DestType.isVolatileQualified()
9191 << Args[0]->getSourceRange();
9192 break;
9193
9195 S.Diag(Kind.getLocation(), diag::err_reference_bind_to_matrix_element)
9196 << DestType.isVolatileQualified() << Args[0]->getSourceRange();
9197 break;
9198
9200 S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
9201 << DestType.getNonReferenceType() << OnlyArg->getType()
9202 << Args[0]->getSourceRange();
9203 break;
9204
9206 S.Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
9207 << DestType << Args[0]->getSourceRange();
9208 break;
9209
9211 QualType SourceType = OnlyArg->getType();
9212 QualType NonRefType = DestType.getNonReferenceType();
9213 Qualifiers DroppedQualifiers =
9214 SourceType.getQualifiers() - NonRefType.getQualifiers();
9215
9216 if (!NonRefType.getQualifiers().isAddressSpaceSupersetOf(
9217 SourceType.getQualifiers(), S.getASTContext()))
9218 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9219 << NonRefType << SourceType << 1 /*addr space*/
9220 << Args[0]->getSourceRange();
9221 else if (DroppedQualifiers.hasQualifiers())
9222 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9223 << NonRefType << SourceType << 0 /*cv quals*/
9224 << Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers())
9225 << DroppedQualifiers.getCVRQualifiers() << Args[0]->getSourceRange();
9226 else
9227 // FIXME: Consider decomposing the type and explaining which qualifiers
9228 // were dropped where, or on which level a 'const' is missing, etc.
9229 S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9230 << NonRefType << SourceType << 2 /*incompatible quals*/
9231 << Args[0]->getSourceRange();
9232 break;
9233 }
9234
9236 S.Diag(Kind.getLocation(), diag::err_reference_bind_failed)
9237 << DestType.getNonReferenceType()
9238 << DestType.getNonReferenceType()->isIncompleteType()
9239 << OnlyArg->isLValue()
9240 << OnlyArg->getType()
9241 << Args[0]->getSourceRange();
9242 emitBadConversionNotes(S, Entity, Args[0]);
9243 break;
9244
9245 case FK_ConversionFailed: {
9246 QualType FromType = OnlyArg->getType();
9247 PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed)
9248 << (int)Entity.getKind()
9249 << DestType
9250 << OnlyArg->isLValue()
9251 << FromType
9252 << Args[0]->getSourceRange();
9253 S.HandleFunctionTypeMismatch(PDiag, FromType, DestType);
9254 S.Diag(Kind.getLocation(), PDiag);
9255 emitBadConversionNotes(S, Entity, Args[0]);
9256 break;
9257 }
9258
9260 // No-op. This error has already been reported.
9261 break;
9262
9264 SourceRange R;
9265
9266 auto *InitList = dyn_cast<InitListExpr>(Args[0]);
9267 if (InitList && InitList->getNumInits() >= 1) {
9268 R = SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
9269 } else {
9270 assert(Args.size() > 1 && "Expected multiple initializers!");
9271 R = SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
9272 }
9273
9274 R.setBegin(S.getLocForEndOfToken(R.getBegin()));
9275 if (Kind.isCStyleOrFunctionalCast())
9276 S.Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
9277 << R;
9278 else
9279 S.Diag(Kind.getLocation(), diag::err_excess_initializers)
9280 << /*scalar=*/3 << R;
9281 break;
9282 }
9283
9285 S.Diag(Kind.getLocation(), diag::err_list_init_in_parens)
9286 << 0 << Entity.getType() << Args[0]->getSourceRange();
9287 break;
9288
9290 S.Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
9291 << DestType.getNonReferenceType() << Args[0]->getSourceRange();
9292 break;
9293
9295 S.Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
9296 << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange();
9297 break;
9298
9301 SourceRange ArgsRange;
9302 if (Args.size())
9303 ArgsRange =
9304 SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
9305
9306 if (Failure == FK_ListConstructorOverloadFailed) {
9307 assert(Args.size() == 1 &&
9308 "List construction from other than 1 argument.");
9309 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9310 Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
9311 }
9312
9313 // FIXME: Using "DestType" for the entity we're printing is probably
9314 // bad.
9315 switch (FailedOverloadResult) {
9316 case OR_Ambiguous:
9317 FailedCandidateSet.NoteCandidates(
9318 PartialDiagnosticAt(Kind.getLocation(),
9319 S.PDiag(diag::err_ovl_ambiguous_init)
9320 << DestType << ArgsRange),
9321 S, OCD_AmbiguousCandidates, Args);
9322 break;
9323
9325 if (Kind.getKind() == InitializationKind::IK_Default &&
9326 (Entity.getKind() == InitializedEntity::EK_Base ||
9330 // This is implicit default initialization of a member or
9331 // base within a constructor. If no viable function was
9332 // found, notify the user that they need to explicitly
9333 // initialize this base/member.
9336 const CXXRecordDecl *InheritedFrom = nullptr;
9337 if (auto Inherited = Constructor->getInheritedConstructor())
9338 InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
9339 if (Entity.getKind() == InitializedEntity::EK_Base) {
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 << /*base=*/0 << Entity.getType() << InheritedFrom;
9346
9347 auto *BaseDecl =
9349 S.Diag(BaseDecl->getLocation(), diag::note_previous_decl)
9350 << S.Context.getCanonicalTagType(BaseDecl);
9351 } else {
9352 S.Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9353 << (InheritedFrom ? 2
9354 : Constructor->isImplicit() ? 1
9355 : 0)
9356 << S.Context.getCanonicalTagType(Constructor->getParent())
9357 << /*member=*/1 << Entity.getName() << InheritedFrom;
9358 S.Diag(Entity.getDecl()->getLocation(),
9359 diag::note_member_declared_at);
9360
9361 if (const auto *Record = Entity.getType()->getAs<RecordType>())
9362 S.Diag(Record->getDecl()->getLocation(), diag::note_previous_decl)
9363 << S.Context.getCanonicalTagType(Record->getDecl());
9364 }
9365 break;
9366 }
9367
9368 FailedCandidateSet.NoteCandidates(
9370 Kind.getLocation(),
9371 S.PDiag(diag::err_ovl_no_viable_function_in_init)
9372 << DestType << ArgsRange),
9373 S, OCD_AllCandidates, Args);
9374 break;
9375
9376 case OR_Deleted: {
9379 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9380 if (Ovl != OR_Deleted) {
9381 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9382 << DestType << ArgsRange;
9383 llvm_unreachable("Inconsistent overload resolution?");
9384 break;
9385 }
9386
9387 // If this is a defaulted or implicitly-declared function, then
9388 // it was implicitly deleted. Make it clear that the deletion was
9389 // implicit.
9390 if (S.isImplicitlyDeleted(Best->Function))
9391 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
9392 << S.getSpecialMember(cast<CXXMethodDecl>(Best->Function))
9393 << DestType << ArgsRange;
9394 else {
9395 StringLiteral *Msg = Best->Function->getDeletedMessage();
9396 S.Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9397 << DestType << (Msg != nullptr)
9398 << (Msg ? Msg->getString() : StringRef()) << ArgsRange;
9399 }
9400
9401 // If it's a default constructed member, but it's not in the
9402 // constructor's initializer list, explicitly note where the member is
9403 // declared so the user can see which member is erroneously initialized
9404 // with a deleted default constructor.
9405 if (Kind.getKind() == InitializationKind::IK_Default &&
9408 S.Diag(Entity.getDecl()->getLocation(),
9409 diag::note_default_constructed_field)
9410 << Entity.getDecl();
9411 }
9412 S.NoteDeletedFunction(Best->Function);
9413 break;
9414 }
9415
9416 case OR_Success:
9417 llvm_unreachable("Conversion did not fail!");
9418 }
9419 }
9420 break;
9421
9423 if (Entity.getKind() == InitializedEntity::EK_Member &&
9425 // This is implicit default-initialization of a const member in
9426 // a constructor. Complain that it needs to be explicitly
9427 // initialized.
9429 S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
9430 << (Constructor->getInheritedConstructor() ? 2
9431 : Constructor->isImplicit() ? 1
9432 : 0)
9433 << S.Context.getCanonicalTagType(Constructor->getParent())
9434 << /*const=*/1 << Entity.getName();
9435 S.Diag(Entity.getDecl()->getLocation(), diag::note_previous_decl)
9436 << Entity.getName();
9437 } else if (const auto *VD = dyn_cast_if_present<VarDecl>(Entity.getDecl());
9438 VD && VD->isConstexpr()) {
9439 S.Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
9440 << VD;
9441 } else {
9442 S.Diag(Kind.getLocation(), diag::err_default_init_const)
9443 << DestType << DestType->isRecordType();
9444 }
9445 break;
9446
9447 case FK_Incomplete:
9448 S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
9449 diag::err_init_incomplete_type);
9450 break;
9451
9453 // Run the init list checker again to emit diagnostics.
9454 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9455 diagnoseListInit(S, Entity, InitList);
9456 break;
9457 }
9458
9459 case FK_PlaceholderType: {
9460 // FIXME: Already diagnosed!
9461 break;
9462 }
9463
9465 // Unlike C/C++ list initialization, there is no fallback if it fails. This
9466 // allows us to diagnose the failure when it happens in the
9467 // TryListInitialization call instead of delaying the diagnosis, which is
9468 // beneficial because the flattening is also expensive.
9469 break;
9470 }
9471
9473 S.Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9474 << Args[0]->getSourceRange();
9477 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9478 (void)Ovl;
9479 assert(Ovl == OR_Success && "Inconsistent overload resolution");
9480 CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
9481 S.Diag(CtorDecl->getLocation(),
9482 diag::note_explicit_ctor_deduction_guide_here) << false;
9483 break;
9484 }
9485
9487 TryOrBuildParenListInitialization(S, Entity, Kind, Args, *this,
9488 /*VerifyOnly=*/false);
9489 break;
9490
9492 InitListExpr *InitList = cast<InitListExpr>(Args[0]);
9493 S.Diag(Kind.getLocation(), diag::err_designated_init_for_non_aggregate)
9494 << Entity.getType() << InitList->getSourceRange();
9495 break;
9496 }
9497
9498 PrintInitLocationNote(S, Entity);
9499 return true;
9500}
9501
9502void InitializationSequence::dump(raw_ostream &OS) const {
9503 switch (SequenceKind) {
9504 case FailedSequence: {
9505 OS << "Failed sequence: ";
9506 switch (Failure) {
9508 OS << "too many initializers for reference";
9509 break;
9510
9512 OS << "parenthesized list init for reference";
9513 break;
9514
9516 OS << "array requires initializer list";
9517 break;
9518
9520 OS << "address of unaddressable function was taken";
9521 break;
9522
9524 OS << "array requires initializer list or string literal";
9525 break;
9526
9528 OS << "array requires initializer list or wide string literal";
9529 break;
9530
9532 OS << "narrow string into wide char array";
9533 break;
9534
9536 OS << "wide string into char array";
9537 break;
9538
9540 OS << "incompatible wide string into wide char array";
9541 break;
9542
9544 OS << "plain string literal into char8_t array";
9545 break;
9546
9548 OS << "u8 string literal into char array";
9549 break;
9550
9552 OS << "array type mismatch";
9553 break;
9554
9556 OS << "non-constant array initializer";
9557 break;
9558
9560 OS << "address of overloaded function failed";
9561 break;
9562
9564 OS << "overload resolution for reference initialization failed";
9565 break;
9566
9568 OS << "non-const lvalue reference bound to temporary";
9569 break;
9570
9572 OS << "non-const lvalue reference bound to bit-field";
9573 break;
9574
9576 OS << "non-const lvalue reference bound to vector element";
9577 break;
9578
9580 OS << "non-const lvalue reference bound to matrix element";
9581 break;
9582
9584 OS << "non-const lvalue reference bound to unrelated type";
9585 break;
9586
9588 OS << "rvalue reference bound to an lvalue";
9589 break;
9590
9592 OS << "reference initialization drops qualifiers";
9593 break;
9594
9596 OS << "reference with mismatching address space bound to temporary";
9597 break;
9598
9600 OS << "reference initialization failed";
9601 break;
9602
9604 OS << "conversion failed";
9605 break;
9606
9608 OS << "conversion from property failed";
9609 break;
9610
9612 OS << "too many initializers for scalar";
9613 break;
9614
9616 OS << "parenthesized list init for reference";
9617 break;
9618
9620 OS << "referencing binding to initializer list";
9621 break;
9622
9624 OS << "initializer list for non-aggregate, non-scalar type";
9625 break;
9626
9628 OS << "overloading failed for user-defined conversion";
9629 break;
9630
9632 OS << "constructor overloading failed";
9633 break;
9634
9636 OS << "default initialization of a const variable";
9637 break;
9638
9639 case FK_Incomplete:
9640 OS << "initialization of incomplete type";
9641 break;
9642
9644 OS << "list initialization checker failure";
9645 break;
9646
9648 OS << "variable length array has an initializer";
9649 break;
9650
9651 case FK_PlaceholderType:
9652 OS << "initializer expression isn't contextually valid";
9653 break;
9654
9656 OS << "list constructor overloading failed";
9657 break;
9658
9660 OS << "list copy initialization chose explicit constructor";
9661 break;
9662
9664 OS << "parenthesized list initialization failed";
9665 break;
9666
9668 OS << "designated initializer for non-aggregate type";
9669 break;
9670
9672 OS << "HLSL initialization list flattening failed";
9673 break;
9674 }
9675 OS << '\n';
9676 return;
9677 }
9678
9679 case DependentSequence:
9680 OS << "Dependent sequence\n";
9681 return;
9682
9683 case NormalSequence:
9684 OS << "Normal sequence: ";
9685 break;
9686 }
9687
9688 for (step_iterator S = step_begin(), SEnd = step_end(); S != SEnd; ++S) {
9689 if (S != step_begin()) {
9690 OS << " -> ";
9691 }
9692
9693 switch (S->Kind) {
9695 OS << "resolve address of overloaded function";
9696 break;
9697
9699 OS << "derived-to-base (prvalue)";
9700 break;
9701
9703 OS << "derived-to-base (xvalue)";
9704 break;
9705
9707 OS << "derived-to-base (lvalue)";
9708 break;
9709
9710 case SK_BindReference:
9711 OS << "bind reference to lvalue";
9712 break;
9713
9715 OS << "bind reference to a temporary";
9716 break;
9717
9718 case SK_FinalCopy:
9719 OS << "final copy in class direct-initialization";
9720 break;
9721
9723 OS << "extraneous C++03 copy to temporary";
9724 break;
9725
9726 case SK_UserConversion:
9727 OS << "user-defined conversion via " << *S->Function.Function;
9728 break;
9729
9731 OS << "qualification conversion (prvalue)";
9732 break;
9733
9735 OS << "qualification conversion (xvalue)";
9736 break;
9737
9739 OS << "qualification conversion (lvalue)";
9740 break;
9741
9743 OS << "function reference conversion";
9744 break;
9745
9747 OS << "non-atomic-to-atomic conversion";
9748 break;
9749
9751 OS << "implicit conversion sequence (";
9752 S->ICS->dump(); // FIXME: use OS
9753 OS << ")";
9754 break;
9755
9757 OS << "implicit conversion sequence with narrowing prohibited (";
9758 S->ICS->dump(); // FIXME: use OS
9759 OS << ")";
9760 break;
9761
9763 OS << "list aggregate initialization";
9764 break;
9765
9766 case SK_UnwrapInitList:
9767 OS << "unwrap reference initializer list";
9768 break;
9769
9770 case SK_RewrapInitList:
9771 OS << "rewrap reference initializer list";
9772 break;
9773
9775 OS << "constructor initialization";
9776 break;
9777
9779 OS << "list initialization via constructor";
9780 break;
9781
9783 OS << "zero initialization";
9784 break;
9785
9786 case SK_CAssignment:
9787 OS << "C assignment";
9788 break;
9789
9790 case SK_StringInit:
9791 OS << "string initialization";
9792 break;
9793
9795 OS << "Objective-C object conversion";
9796 break;
9797
9798 case SK_ArrayLoopIndex:
9799 OS << "indexing for array initialization loop";
9800 break;
9801
9802 case SK_ArrayLoopInit:
9803 OS << "array initialization loop";
9804 break;
9805
9806 case SK_ArrayInit:
9807 OS << "array initialization";
9808 break;
9809
9810 case SK_GNUArrayInit:
9811 OS << "array initialization (GNU extension)";
9812 break;
9813
9815 OS << "parenthesized array initialization";
9816 break;
9817
9819 OS << "pass by indirect copy and restore";
9820 break;
9821
9823 OS << "pass by indirect restore";
9824 break;
9825
9827 OS << "Objective-C object retension";
9828 break;
9829
9831 OS << "std::initializer_list from initializer list";
9832 break;
9833
9835 OS << "list initialization from std::initializer_list";
9836 break;
9837
9838 case SK_OCLSamplerInit:
9839 OS << "OpenCL sampler_t from integer constant";
9840 break;
9841
9843 OS << "OpenCL opaque type from zero";
9844 break;
9846 OS << "initialization from a parenthesized list of values";
9847 break;
9848 }
9849
9850 OS << " [" << S->Type << ']';
9851 }
9852
9853 OS << '\n';
9854}
9855
9857 dump(llvm::errs());
9858}
9859
9861 const ImplicitConversionSequence &ICS,
9862 QualType PreNarrowingType,
9863 QualType EntityType,
9864 const Expr *PostInit) {
9865 const StandardConversionSequence *SCS = nullptr;
9866 switch (ICS.getKind()) {
9868 SCS = &ICS.Standard;
9869 break;
9871 SCS = &ICS.UserDefined.After;
9872 break;
9877 return;
9878 }
9879
9880 auto MakeDiag = [&](bool IsConstRef, unsigned DefaultDiagID,
9881 unsigned ConstRefDiagID, unsigned WarnDiagID) {
9882 unsigned DiagID;
9883 auto &L = S.getLangOpts();
9884 if (L.CPlusPlus11 && !L.HLSL &&
9885 (!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015)))
9886 DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID;
9887 else
9888 DiagID = WarnDiagID;
9889 return S.Diag(PostInit->getBeginLoc(), DiagID)
9890 << PostInit->getSourceRange();
9891 };
9892
9893 // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.
9894 APValue ConstantValue;
9895 QualType ConstantType;
9896 switch (SCS->getNarrowingKind(S.Context, PostInit, ConstantValue,
9897 ConstantType)) {
9898 case NK_Not_Narrowing:
9900 // No narrowing occurred.
9901 return;
9902
9903 case NK_Type_Narrowing: {
9904 // This was a floating-to-integer conversion, which is always considered a
9905 // narrowing conversion even if the value is a constant and can be
9906 // represented exactly as an integer.
9907 QualType T = EntityType.getNonReferenceType();
9908 MakeDiag(T != EntityType, diag::ext_init_list_type_narrowing,
9909 diag::ext_init_list_type_narrowing_const_reference,
9910 diag::warn_init_list_type_narrowing)
9911 << PreNarrowingType.getLocalUnqualifiedType()
9913 break;
9914 }
9915
9916 case NK_Constant_Narrowing: {
9917 // A constant value was narrowed.
9918 MakeDiag(EntityType.getNonReferenceType() != EntityType,
9919 diag::ext_init_list_constant_narrowing,
9920 diag::ext_init_list_constant_narrowing_const_reference,
9921 diag::warn_init_list_constant_narrowing)
9922 << ConstantValue.getAsString(S.getASTContext(), ConstantType)
9924 break;
9925 }
9926
9927 case NK_Variable_Narrowing: {
9928 // A variable's value may have been narrowed.
9929 MakeDiag(EntityType.getNonReferenceType() != EntityType,
9930 diag::ext_init_list_variable_narrowing,
9931 diag::ext_init_list_variable_narrowing_const_reference,
9932 diag::warn_init_list_variable_narrowing)
9933 << PreNarrowingType.getLocalUnqualifiedType()
9935 break;
9936 }
9937 }
9938
9939 SmallString<128> StaticCast;
9940 llvm::raw_svector_ostream OS(StaticCast);
9941 OS << "static_cast<";
9942 if (const TypedefType *TT = EntityType->getAs<TypedefType>()) {
9943 // It's important to use the typedef's name if there is one so that the
9944 // fixit doesn't break code using types like int64_t.
9945 //
9946 // FIXME: This will break if the typedef requires qualification. But
9947 // getQualifiedNameAsString() includes non-machine-parsable components.
9948 OS << *TT->getDecl();
9949 } else if (const BuiltinType *BT = EntityType->getAs<BuiltinType>())
9950 OS << BT->getName(S.getLangOpts());
9951 else {
9952 // Oops, we didn't find the actual type of the variable. Don't emit a fixit
9953 // with a broken cast.
9954 return;
9955 }
9956 OS << ">(";
9957 S.Diag(PostInit->getBeginLoc(), diag::note_init_list_narrowing_silence)
9958 << PostInit->getSourceRange()
9959 << FixItHint::CreateInsertion(PostInit->getBeginLoc(), OS.str())
9961 S.getLocForEndOfToken(PostInit->getEndLoc()), ")");
9962}
9963
9965 QualType ToType, Expr *Init) {
9966 assert(S.getLangOpts().C23);
9968 Init->IgnoreParenImpCasts(), ToType, /*SuppressUserConversions*/ false,
9969 Sema::AllowedExplicit::None,
9970 /*InOverloadResolution*/ false,
9971 /*CStyle*/ false,
9972 /*AllowObjCWritebackConversion=*/false);
9973
9974 if (!ICS.isStandard())
9975 return;
9976
9977 APValue Value;
9978 QualType PreNarrowingType;
9979 // Reuse C++ narrowing check.
9980 switch (ICS.Standard.getNarrowingKind(
9981 S.Context, Init, Value, PreNarrowingType,
9982 /*IgnoreFloatToIntegralConversion*/ false)) {
9983 // The value doesn't fit.
9985 S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_not_representable)
9986 << Value.getAsString(S.Context, PreNarrowingType) << ToType;
9987 return;
9988
9989 // Conversion to a narrower type.
9990 case NK_Type_Narrowing:
9991 S.Diag(Init->getBeginLoc(), diag::err_c23_constexpr_init_type_mismatch)
9992 << ToType << FromType;
9993 return;
9994
9995 // Since we only reuse narrowing check for C23 constexpr variables here, we're
9996 // not really interested in these cases.
9999 case NK_Not_Narrowing:
10000 return;
10001 }
10002 llvm_unreachable("unhandled case in switch");
10003}
10004
10006 Sema &SemaRef, QualType &TT) {
10007 assert(SemaRef.getLangOpts().C23);
10008 // character that string literal contains fits into TT - target type.
10009 const ArrayType *AT = SemaRef.Context.getAsArrayType(TT);
10010 QualType CharType = AT->getElementType();
10011 uint32_t BitWidth = SemaRef.Context.getTypeSize(CharType);
10012 bool isUnsigned = CharType->isUnsignedIntegerType();
10013 llvm::APSInt Value(BitWidth, isUnsigned);
10014 for (unsigned I = 0, N = SE->getLength(); I != N; ++I) {
10015 int64_t C = SE->getCodeUnitS(I, SemaRef.Context.getCharWidth());
10016 Value = C;
10017 if (Value != C) {
10018 SemaRef.Diag(SemaRef.getLocationOfStringLiteralByte(SE, I),
10019 diag::err_c23_constexpr_init_not_representable)
10020 << C << CharType;
10021 return;
10022 }
10023 }
10024}
10025
10026//===----------------------------------------------------------------------===//
10027// Initialization helper functions
10028//===----------------------------------------------------------------------===//
10029bool
10031 ExprResult Init) {
10032 if (Init.isInvalid())
10033 return false;
10034
10035 Expr *InitE = Init.get();
10036 assert(InitE && "No initialization expression");
10037
10038 InitializationKind Kind =
10040 InitializationSequence Seq(*this, Entity, Kind, InitE);
10041 return !Seq.Failed();
10042}
10043
10046 SourceLocation EqualLoc,
10048 bool TopLevelOfInitList,
10049 bool AllowExplicit) {
10050 if (Init.isInvalid())
10051 return ExprError();
10052
10053 Expr *InitE = Init.get();
10054 assert(InitE && "No initialization expression?");
10055
10056 if (EqualLoc.isInvalid())
10057 EqualLoc = InitE->getBeginLoc();
10058
10060 InitE->getBeginLoc(), EqualLoc, AllowExplicit);
10061 InitializationSequence Seq(*this, Entity, Kind, InitE, TopLevelOfInitList);
10062
10063 // Prevent infinite recursion when performing parameter copy-initialization.
10064 const bool ShouldTrackCopy =
10065 Entity.isParameterKind() && Seq.isConstructorInitialization();
10066 if (ShouldTrackCopy) {
10067 if (llvm::is_contained(CurrentParameterCopyTypes, Entity.getType())) {
10068 Seq.SetOverloadFailure(
10071
10072 // Try to give a meaningful diagnostic note for the problematic
10073 // constructor.
10074 const auto LastStep = Seq.step_end() - 1;
10075 assert(LastStep->Kind ==
10077 const FunctionDecl *Function = LastStep->Function.Function;
10078 auto Candidate =
10079 llvm::find_if(Seq.getFailedCandidateSet(),
10080 [Function](const OverloadCandidate &Candidate) -> bool {
10081 return Candidate.Viable &&
10082 Candidate.Function == Function &&
10083 Candidate.Conversions.size() > 0;
10084 });
10085 if (Candidate != Seq.getFailedCandidateSet().end() &&
10086 Function->getNumParams() > 0) {
10087 Candidate->Viable = false;
10090 InitE,
10091 Function->getParamDecl(0)->getType());
10092 }
10093 }
10094 CurrentParameterCopyTypes.push_back(Entity.getType());
10095 }
10096
10097 ExprResult Result = Seq.Perform(*this, Entity, Kind, InitE);
10098
10099 if (ShouldTrackCopy)
10100 CurrentParameterCopyTypes.pop_back();
10101
10102 return Result;
10103}
10104
10105/// Determine whether RD is, or is derived from, a specialization of CTD.
10107 ClassTemplateDecl *CTD) {
10108 auto NotSpecialization = [&] (const CXXRecordDecl *Candidate) {
10109 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
10110 return !CTSD || !declaresSameEntity(CTSD->getSpecializedTemplate(), CTD);
10111 };
10112 return !(NotSpecialization(RD) && RD->forallBases(NotSpecialization));
10113}
10114
10116 TypeSourceInfo *TSInfo, const InitializedEntity &Entity,
10117 const InitializationKind &Kind, MultiExprArg Inits) {
10118 auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
10119 TSInfo->getType()->getContainedDeducedType());
10120 assert(DeducedTST && "not a deduced template specialization type");
10121
10122 auto TemplateName = DeducedTST->getTemplateName();
10124 return SubstAutoTypeSourceInfoDependent(TSInfo)->getType();
10125
10126 // We can only perform deduction for class templates or alias templates.
10127 auto *Template =
10128 dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl());
10129 TemplateDecl *LookupTemplateDecl = Template;
10130 if (!Template) {
10131 if (auto *AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
10133 DiagCompat(Kind.getLocation(), diag_compat::ctad_for_alias_templates);
10134 LookupTemplateDecl = AliasTemplate;
10135 auto UnderlyingType = AliasTemplate->getTemplatedDecl()
10136 ->getUnderlyingType()
10137 .getCanonicalType();
10138 // C++ [over.match.class.deduct#3]: ..., the defining-type-id of A must be
10139 // of the form
10140 // [typename] [nested-name-specifier] [template] simple-template-id
10141 if (const auto *TST =
10142 UnderlyingType->getAs<TemplateSpecializationType>()) {
10143 Template = dyn_cast_or_null<ClassTemplateDecl>(
10144 TST->getTemplateName().getAsTemplateDecl());
10145 } else if (const auto *RT = UnderlyingType->getAs<RecordType>()) {
10146 // Cases where template arguments in the RHS of the alias are not
10147 // dependent. e.g.
10148 // using AliasFoo = Foo<bool>;
10149 if (const auto *CTSD =
10150 llvm::dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl()))
10151 Template = CTSD->getSpecializedTemplate();
10152 }
10153 }
10154 }
10155 if (!Template) {
10156 Diag(Kind.getLocation(),
10157 diag::err_deduced_non_class_or_alias_template_specialization_type)
10159 if (auto *TD = TemplateName.getAsTemplateDecl())
10161 return QualType();
10162 }
10163
10164 // Can't deduce from dependent arguments.
10166 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10167 diag::warn_cxx14_compat_class_template_argument_deduction)
10168 << TSInfo->getTypeLoc().getSourceRange() << 0;
10169 return SubstAutoTypeSourceInfoDependent(TSInfo)->getType();
10170 }
10171
10172 // FIXME: Perform "exact type" matching first, per CWG discussion?
10173 // Or implement this via an implied 'T(T) -> T' deduction guide?
10174
10175 // Look up deduction guides, including those synthesized from constructors.
10176 //
10177 // C++1z [over.match.class.deduct]p1:
10178 // A set of functions and function templates is formed comprising:
10179 // - For each constructor of the class template designated by the
10180 // template-name, a function template [...]
10181 // - For each deduction-guide, a function or function template [...]
10182 DeclarationNameInfo NameInfo(
10183 Context.DeclarationNames.getCXXDeductionGuideName(LookupTemplateDecl),
10184 TSInfo->getTypeLoc().getEndLoc());
10185 LookupResult Guides(*this, NameInfo, LookupOrdinaryName);
10186 LookupQualifiedName(Guides, LookupTemplateDecl->getDeclContext());
10187
10188 // FIXME: Do not diagnose inaccessible deduction guides. The standard isn't
10189 // clear on this, but they're not found by name so access does not apply.
10190 Guides.suppressDiagnostics();
10191
10192 // Figure out if this is list-initialization.
10194 (Inits.size() == 1 && Kind.getKind() != InitializationKind::IK_Direct)
10195 ? dyn_cast<InitListExpr>(Inits[0])
10196 : nullptr;
10197
10198 // C++1z [over.match.class.deduct]p1:
10199 // Initialization and overload resolution are performed as described in
10200 // [dcl.init] and [over.match.ctor], [over.match.copy], or [over.match.list]
10201 // (as appropriate for the type of initialization performed) for an object
10202 // of a hypothetical class type, where the selected functions and function
10203 // templates are considered to be the constructors of that class type
10204 //
10205 // Since we know we're initializing a class type of a type unrelated to that
10206 // of the initializer, this reduces to something fairly reasonable.
10207 OverloadCandidateSet Candidates(Kind.getLocation(),
10210
10211 bool AllowExplicit = !Kind.isCopyInit() || ListInit;
10212
10213 // Return true if the candidate is added successfully, false otherwise.
10214 auto addDeductionCandidate = [&](FunctionTemplateDecl *TD,
10216 DeclAccessPair FoundDecl,
10217 bool OnlyListConstructors,
10218 bool AllowAggregateDeductionCandidate) {
10219 // C++ [over.match.ctor]p1: (non-list copy-initialization from non-class)
10220 // For copy-initialization, the candidate functions are all the
10221 // converting constructors (12.3.1) of that class.
10222 // C++ [over.match.copy]p1: (non-list copy-initialization from class)
10223 // The converting constructors of T are candidate functions.
10224 if (!AllowExplicit) {
10225 // Overload resolution checks whether the deduction guide is declared
10226 // explicit for us.
10227
10228 // When looking for a converting constructor, deduction guides that
10229 // could never be called with one argument are not interesting to
10230 // check or note.
10231 if (GD->getMinRequiredArguments() > 1 ||
10232 (GD->getNumParams() == 0 && !GD->isVariadic()))
10233 return;
10234 }
10235
10236 // C++ [over.match.list]p1.1: (first phase list initialization)
10237 // Initially, the candidate functions are the initializer-list
10238 // constructors of the class T
10239 if (OnlyListConstructors && !isInitListConstructor(GD))
10240 return;
10241
10242 if (!AllowAggregateDeductionCandidate &&
10243 GD->getDeductionCandidateKind() == DeductionCandidate::Aggregate)
10244 return;
10245
10246 // C++ [over.match.list]p1.2: (second phase list initialization)
10247 // the candidate functions are all the constructors of the class T
10248 // C++ [over.match.ctor]p1: (all other cases)
10249 // the candidate functions are all the constructors of the class of
10250 // the object being initialized
10251
10252 // C++ [over.best.ics]p4:
10253 // When [...] the constructor [...] is a candidate by
10254 // - [over.match.copy] (in all cases)
10255 if (TD) {
10256
10257 // As template candidates are not deduced immediately,
10258 // persist the array in the overload set.
10259 MutableArrayRef<Expr *> TmpInits =
10260 Candidates.getPersistentArgsArray(Inits.size());
10261
10262 for (auto [I, E] : llvm::enumerate(Inits)) {
10263 if (auto *DI = dyn_cast<DesignatedInitExpr>(E))
10264 TmpInits[I] = DI->getInit();
10265 else
10266 TmpInits[I] = E;
10267 }
10268
10270 TD, FoundDecl, /*ExplicitArgs=*/nullptr, TmpInits, Candidates,
10271 /*SuppressUserConversions=*/false,
10272 /*PartialOverloading=*/false, AllowExplicit, ADLCallKind::NotADL,
10273 /*PO=*/{}, AllowAggregateDeductionCandidate);
10274 } else {
10275 AddOverloadCandidate(GD, FoundDecl, Inits, Candidates,
10276 /*SuppressUserConversions=*/false,
10277 /*PartialOverloading=*/false, AllowExplicit);
10278 }
10279 };
10280
10281 bool FoundDeductionGuide = false;
10282
10283 auto TryToResolveOverload =
10284 [&](bool OnlyListConstructors) -> OverloadingResult {
10286 bool HasAnyDeductionGuide = false;
10287
10288 auto SynthesizeAggrGuide = [&](InitListExpr *ListInit) {
10289 auto *Pattern = Template;
10290 while (Pattern->getInstantiatedFromMemberTemplate()) {
10291 if (Pattern->isMemberSpecialization())
10292 break;
10293 Pattern = Pattern->getInstantiatedFromMemberTemplate();
10294 }
10295
10296 auto *RD = cast<CXXRecordDecl>(Pattern->getTemplatedDecl());
10297 if (!(RD->getDefinition() && RD->isAggregate()))
10298 return;
10299 QualType Ty = Context.getCanonicalTagType(RD);
10300 SmallVector<QualType, 8> ElementTypes;
10301
10302 InitListChecker CheckInitList(*this, Entity, ListInit, Ty, ElementTypes);
10303 if (!CheckInitList.HadError()) {
10304 // C++ [over.match.class.deduct]p1.8:
10305 // if e_i is of array type and x_i is a braced-init-list, T_i is an
10306 // rvalue reference to the declared type of e_i and
10307 // C++ [over.match.class.deduct]p1.9:
10308 // if e_i is of array type and x_i is a string-literal, T_i is an
10309 // lvalue reference to the const-qualified declared type of e_i and
10310 // C++ [over.match.class.deduct]p1.10:
10311 // otherwise, T_i is the declared type of e_i
10312 for (int I = 0, E = ListInit->getNumInits();
10313 I < E && !isa<PackExpansionType>(ElementTypes[I]); ++I)
10314 if (ElementTypes[I]->isArrayType()) {
10316 ElementTypes[I] = Context.getRValueReferenceType(ElementTypes[I]);
10317 else if (isa<StringLiteral>(
10318 ListInit->getInit(I)->IgnoreParenImpCasts()))
10319 ElementTypes[I] =
10320 Context.getLValueReferenceType(ElementTypes[I].withConst());
10321 }
10322
10323 if (FunctionTemplateDecl *TD =
10325 LookupTemplateDecl, ElementTypes,
10326 TSInfo->getTypeLoc().getEndLoc())) {
10328 addDeductionCandidate(TD, GD, DeclAccessPair::make(TD, AS_public),
10329 OnlyListConstructors,
10330 /*AllowAggregateDeductionCandidate=*/true);
10331 HasAnyDeductionGuide = true;
10332 }
10333 }
10334 };
10335
10336 for (auto I = Guides.begin(), E = Guides.end(); I != E; ++I) {
10337 NamedDecl *D = (*I)->getUnderlyingDecl();
10338 if (D->isInvalidDecl())
10339 continue;
10340
10341 auto *TD = dyn_cast<FunctionTemplateDecl>(D);
10342 auto *GD = dyn_cast_if_present<CXXDeductionGuideDecl>(
10343 TD ? TD->getTemplatedDecl() : dyn_cast<FunctionDecl>(D));
10344 if (!GD)
10345 continue;
10346
10347 if (!GD->isImplicit())
10348 HasAnyDeductionGuide = true;
10349
10350 addDeductionCandidate(TD, GD, I.getPair(), OnlyListConstructors,
10351 /*AllowAggregateDeductionCandidate=*/false);
10352 }
10353
10354 // C++ [over.match.class.deduct]p1.4:
10355 // if C is defined and its definition satisfies the conditions for an
10356 // aggregate class ([dcl.init.aggr]) with the assumption that any
10357 // dependent base class has no virtual functions and no virtual base
10358 // classes, and the initializer is a non-empty braced-init-list or
10359 // parenthesized expression-list, and there are no deduction-guides for
10360 // C, the set contains an additional function template, called the
10361 // aggregate deduction candidate, defined as follows.
10362 if (getLangOpts().CPlusPlus20 && !HasAnyDeductionGuide) {
10363 if (ListInit && ListInit->getNumInits()) {
10364 SynthesizeAggrGuide(ListInit);
10365 } else if (Inits.size()) { // parenthesized expression-list
10366 // Inits are expressions inside the parentheses. We don't have
10367 // the parentheses source locations, use the begin/end of Inits as the
10368 // best heuristic.
10369 InitListExpr TempListInit(getASTContext(), Inits.front()->getBeginLoc(),
10370 Inits, Inits.back()->getEndLoc());
10371 SynthesizeAggrGuide(&TempListInit);
10372 }
10373 }
10374
10375 FoundDeductionGuide = FoundDeductionGuide || HasAnyDeductionGuide;
10376
10377 return Candidates.BestViableFunction(*this, Kind.getLocation(), Best);
10378 };
10379
10381
10382 // C++11 [over.match.list]p1, per DR1467: for list-initialization, first
10383 // try initializer-list constructors.
10384 if (ListInit) {
10385 bool TryListConstructors = true;
10386
10387 // Try list constructors unless the list is empty and the class has one or
10388 // more default constructors, in which case those constructors win.
10389 if (!ListInit->getNumInits()) {
10390 for (NamedDecl *D : Guides) {
10391 auto *FD = dyn_cast<FunctionDecl>(D->getUnderlyingDecl());
10392 if (FD && FD->getMinRequiredArguments() == 0) {
10393 TryListConstructors = false;
10394 break;
10395 }
10396 }
10397 } else if (ListInit->getNumInits() == 1) {
10398 // C++ [over.match.class.deduct]:
10399 // As an exception, the first phase in [over.match.list] (considering
10400 // initializer-list constructors) is omitted if the initializer list
10401 // consists of a single expression of type cv U, where U is a
10402 // specialization of C or a class derived from a specialization of C.
10403 Expr *E = ListInit->getInit(0);
10404 auto *RD = E->getType()->getAsCXXRecordDecl();
10405 if (!isa<InitListExpr>(E) && RD &&
10406 isCompleteType(Kind.getLocation(), E->getType()) &&
10408 TryListConstructors = false;
10409 }
10410
10411 if (TryListConstructors)
10412 Result = TryToResolveOverload(/*OnlyListConstructor*/true);
10413 // Then unwrap the initializer list and try again considering all
10414 // constructors.
10415 Inits = MultiExprArg(ListInit->getInits(), ListInit->getNumInits());
10416 }
10417
10418 // If list-initialization fails, or if we're doing any other kind of
10419 // initialization, we (eventually) consider constructors.
10421 Result = TryToResolveOverload(/*OnlyListConstructor*/false);
10422
10423 switch (Result) {
10424 case OR_Ambiguous:
10425 // FIXME: For list-initialization candidates, it'd usually be better to
10426 // list why they were not viable when given the initializer list itself as
10427 // an argument.
10428 Candidates.NoteCandidates(
10430 Kind.getLocation(),
10431 PDiag(diag::err_deduced_class_template_ctor_ambiguous)
10432 << TemplateName),
10434 return QualType();
10435
10436 case OR_No_Viable_Function: {
10437 CXXRecordDecl *Primary =
10438 cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
10439 bool Complete = isCompleteType(Kind.getLocation(),
10440 Context.getCanonicalTagType(Primary));
10441 Candidates.NoteCandidates(
10443 Kind.getLocation(),
10444 PDiag(Complete ? diag::err_deduced_class_template_ctor_no_viable
10445 : diag::err_deduced_class_template_incomplete)
10446 << TemplateName << !Guides.empty()),
10447 *this, OCD_AllCandidates, Inits);
10448 return QualType();
10449 }
10450
10451 case OR_Deleted: {
10452 // FIXME: There are no tests for this diagnostic, and it doesn't seem
10453 // like we ever get here; attempts to trigger this seem to yield a
10454 // generic c'all to deleted function' diagnostic instead.
10455 Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
10456 << TemplateName;
10457 NoteDeletedFunction(Best->Function);
10458 return QualType();
10459 }
10460
10461 case OR_Success:
10462 // C++ [over.match.list]p1:
10463 // In copy-list-initialization, if an explicit constructor is chosen, the
10464 // initialization is ill-formed.
10465 if (Kind.isCopyInit() && ListInit &&
10466 cast<CXXDeductionGuideDecl>(Best->Function)->isExplicit()) {
10467 bool IsDeductionGuide = !Best->Function->isImplicit();
10468 Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
10469 << TemplateName << IsDeductionGuide;
10470 Diag(Best->Function->getLocation(),
10471 diag::note_explicit_ctor_deduction_guide_here)
10472 << IsDeductionGuide;
10473 return QualType();
10474 }
10475
10476 // Make sure we didn't select an unusable deduction guide, and mark it
10477 // as referenced.
10478 DiagnoseUseOfDecl(Best->FoundDecl, Kind.getLocation());
10479 MarkFunctionReferenced(Kind.getLocation(), Best->Function);
10480 break;
10481 }
10482
10483 // C++ [dcl.type.class.deduct]p1:
10484 // The placeholder is replaced by the return type of the function selected
10485 // by overload resolution for class template deduction.
10486 QualType DeducedType =
10487 SubstAutoTypeSourceInfo(TSInfo, Best->Function->getReturnType())
10488 ->getType();
10489 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10490 diag::warn_cxx14_compat_class_template_argument_deduction)
10491 << TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;
10492
10493 // Warn if CTAD was used on a type that does not have any user-defined
10494 // deduction guides.
10495 if (!FoundDeductionGuide) {
10496 Diag(TSInfo->getTypeLoc().getBeginLoc(),
10497 diag::warn_ctad_maybe_unsupported)
10498 << TemplateName;
10499 Diag(Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
10500 }
10501
10502 return DeducedType;
10503}
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:952
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:917
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:3772
QualType getElementType() const
Definition TypeBase.h:3784
This class is used for builtin types like 'int'.
Definition TypeBase.h:3214
Kind getKind() const
Definition TypeBase.h:3262
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:2003
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:3642
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:3810
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:256
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Definition TypeBase.h:3886
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
Definition TypeBase.h:4459
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:4786
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:4895
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:4890
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:4902
MutableArrayRef< Designator > designators()
Definition Expr.h:5787
Expr * getArrayIndex(const Designator &D) const
Definition Expr.cpp:4885
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:4864
SourceLocation getEndLoc() const LLVM_READONLY
Definition Expr.cpp:4881
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:4827
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:4255
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:4283
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:3688
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:4068
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:3175
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3355
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:3260
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Definition Decl.h:3281
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:2015
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2812
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition Decl.cpp:3848
QualType getReturnType() const
Definition Decl.h:2860
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2555
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2400
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:3959
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3482
chain_iterator chain_end() const
Definition Decl.h:3505
chain_iterator chain_begin() const
Definition Decl.h:3504
ArrayRef< NamedDecl * >::const_iterator chain_iterator
Definition Decl.h:3501
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:3667
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:1038
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:4387
QualType getElementType() const
Returns type of the elements being stored in the matrix.
Definition TypeBase.h:4401
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
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:460
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
Definition ExprObjC.h:1613
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:1805
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3378
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:8515
bool hasQualifiers() const
Determine whether this type has any qualifiers.
Definition TypeBase.h:8520
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
Definition Type.cpp:3628
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:8431
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8557
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8471
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:8616
QualType getCanonicalType() const
Definition TypeBase.h:8483
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8525
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8504
bool hasAddressSpace() const
Check if this type has any address space qualifier.
Definition TypeBase.h:8552
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:3685
Represents a struct/union/class.
Definition Decl.h:4342
field_iterator field_end() const
Definition Decl.h:4548
field_range fields() const
Definition Decl.h:4545
bool isRandomized() const
Definition Decl.h:4500
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition Decl.h:4526
bool hasUninitializedExplicitInitFields() const
Definition Decl.h:4468
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4542
bool field_empty() const
Definition Decl.h:4553
field_iterator field_begin() const
Definition Decl.cpp:5276
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3623
bool isSpelledAsLValue() const
Definition TypeBase.h:3636
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:6373
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9402
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9410
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:10474
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
Definition Sema.h:10477
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10483
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
Definition Sema.h:10481
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:6996
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:2073
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:7008
ASTContext & Context
Definition Sema.h:1304
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:681
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:1514
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:757
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:9084
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:84
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:1479
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:7032
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
Definition Sema.h:10502
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:8256
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
Definition Sema.h:8123
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
Definition Sema.h:7044
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1442
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:8248
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:14047
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:13780
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15551
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:6807
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:1307
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
DiagnosticsEngine & Diags
Definition Sema.h:1306
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:1584
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:626
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.
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:3943
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:8402
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:8413
The base class of the type hierarchy.
Definition TypeBase.h:1866
bool isVoidType() const
Definition TypeBase.h:9034
bool isBooleanType() const
Definition TypeBase.h:9171
bool isMFloat8Type() const
Definition TypeBase.h:9059
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
Definition TypeBase.h:9221
bool isIncompleteArrayType() const
Definition TypeBase.h:8775
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition Type.cpp:2231
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
Definition Type.cpp:2138
bool isRValueReferenceType() const
Definition TypeBase.h:8700
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:8767
bool isCharType() const
Definition Type.cpp:2158
CXXRecordDecl * castAsCXXRecordDecl() const
Definition Type.h:36
bool isConstantMatrixType() const
Definition TypeBase.h:8835
bool isArrayParameterType() const
Definition TypeBase.h:8783
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9078
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9328
bool isReferenceType() const
Definition TypeBase.h:8692
bool isEnumeralType() const
Definition TypeBase.h:8799
bool isScalarType() const
Definition TypeBase.h:9140
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:1923
bool isChar8Type() const
Definition Type.cpp:2174
bool isSizelessBuiltinType() const
Definition Type.cpp:2576
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:754
bool isExtVectorType() const
Definition TypeBase.h:8811
bool isOCLIntelSubgroupAVCType() const
Definition TypeBase.h:8953
bool isLValueReferenceType() const
Definition TypeBase.h:8696
bool isOpenCLSpecificType() const
Definition TypeBase.h:8968
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2832
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
Definition Type.cpp:2456
RecordDecl * castAsRecordDecl() const
Definition Type.h:48
bool isAnyComplexType() const
Definition TypeBase.h:8803
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition Type.cpp:2074
bool isQueueT() const
Definition TypeBase.h:8924
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
Definition TypeBase.h:9214
bool isAtomicType() const
Definition TypeBase.h:8860
bool isFunctionProtoType() const
Definition TypeBase.h:2649
bool isMatrixType() const
Definition TypeBase.h:8831
EnumDecl * castAsEnumDecl() const
Definition Type.h:59
bool isObjCObjectType() const
Definition TypeBase.h:8851
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
Definition TypeBase.h:9314
bool isEventT() const
Definition TypeBase.h:8916
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2480
bool isFunctionType() const
Definition TypeBase.h:8664
bool isObjCObjectPointerType() const
Definition TypeBase.h:8847
bool isVectorType() const
Definition TypeBase.h:8807
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2971
bool isFloatingType() const
Definition Type.cpp:2342
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:2285
bool isSamplerT() const
Definition TypeBase.h:8912
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9261
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
Definition Type.cpp:655
bool isNullPtrType() const
Definition TypeBase.h:9071
bool isRecordType() const
Definition TypeBase.h:8795
bool isObjCRetainableType() const
Definition Type.cpp:5368
bool isUnionType() const
Definition Type.cpp:720
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:1383
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:1244
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:4016
Represents a GCC generic vector type.
Definition TypeBase.h:4225
unsigned getNumElements() const
Definition TypeBase.h:4240
VectorKind getVectorKind() const
Definition TypeBase.h:4245
QualType getElementType() const
Definition TypeBase.h:4239
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:6918
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
Definition Sema.h:6886
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
Definition Sema.h:6924
std::optional< InitializationContext > DelayedDefaultInitializationContext
Definition Sema.h:6941
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
Definition Overload.h:506