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