30#include "llvm/ADT/APInt.h"
31#include "llvm/ADT/FoldingSet.h"
32#include "llvm/ADT/PointerIntPair.h"
33#include "llvm/ADT/STLForwardCompat.h"
34#include "llvm/ADT/SmallVector.h"
35#include "llvm/ADT/StringExtras.h"
36#include "llvm/Support/ErrorHandling.h"
37#include "llvm/Support/raw_ostream.h"
73 if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT))
91 auto IsCharOrUnsignedChar = [](
const QualType &
T) {
92 const BuiltinType *BT = dyn_cast<BuiltinType>(
T.getTypePtr());
97 case StringLiteralKind::UTF8:
107 case StringLiteralKind::Ordinary:
111 return (SL->
getKind() == StringLiteralKind::UTF8 &&
125 case StringLiteralKind::UTF16:
133 case StringLiteralKind::UTF32:
141 case StringLiteralKind::Wide:
149 case StringLiteralKind::Unevaluated:
150 assert(
false &&
"Unevaluated string literal in initialization");
154 llvm_unreachable(
"missed a StringLiteral kind?");
175 if (isa<StringLiteral>(
E) || isa<ObjCEncodeExpr>(
E))
186 if (isa<CompoundLiteralExpr>(
E))
201 if (
const auto *VD = dyn_cast_if_present<VarDecl>(
D); VD && VD->isConstexpr())
211 Sema &S,
bool CheckC23ConstexprInit =
false) {
213 auto *ConstantArrayTy =
215 uint64_t StrLength = ConstantArrayTy->getZExtSize();
217 if (CheckC23ConstexprInit)
224 llvm::APInt ConstVal(32, StrLength);
250 diag::err_initializer_string_for_char_array_too_long)
256 diag::ext_initializer_string_for_char_array_too_long)
304class InitListChecker {
306 bool hadError =
false;
308 bool TreatUnavailableAsInvalid;
309 bool InOverloadResolution;
314 unsigned CurEmbedIndex = 0;
325 unsigned &StructuredIndex);
329 bool TopLevelObject =
false);
332 bool SubobjectIsDesignatorContext,
335 unsigned &StructuredIndex,
336 bool TopLevelObject =
false);
341 unsigned &StructuredIndex,
342 bool DirectlyDesignated =
false);
347 unsigned &StructuredIndex);
352 unsigned &StructuredIndex);
357 unsigned &StructuredIndex);
361 unsigned &StructuredIndex);
366 bool SubobjectIsDesignatorContext,
unsigned &Index,
368 unsigned &StructuredIndex,
369 bool TopLevelObject =
false);
372 llvm::APSInt elementIndex,
373 bool SubobjectIsDesignatorContext,
unsigned &Index,
375 unsigned &StructuredIndex);
381 llvm::APSInt *NextElementIndex,
384 unsigned &StructuredIndex,
385 bool FinishSubobjectInit,
386 bool TopLevelObject);
390 unsigned StructuredIndex,
392 bool IsFullyOverwritten =
false);
393 void UpdateStructuredListElement(
InitListExpr *StructuredList,
394 unsigned &StructuredIndex,
398 unsigned ExpectedNumInits);
399 int numArrayElements(
QualType DeclType);
400 int numStructUnionElements(
QualType DeclType);
408 bool UnionOverride =
false,
409 bool FullyOverwritten =
true) {
414 ? (UnionOverride ? diag::ext_initializer_union_overrides
415 : diag::ext_initializer_overrides)
416 : diag::warn_initializer_overrides;
418 if (InOverloadResolution && SemaRef.
getLangOpts().CPlusPlus) {
439 DiagID = diag::err_initializer_overrides_destructed;
459 << NewInitRange << FullyOverwritten << OldInit->
getType();
488 bool FillWithNoInit);
489 void FillInEmptyInitForField(
unsigned Init,
FieldDecl *Field,
492 bool FillWithNoInit =
false);
496 bool FillWithNoInit =
false);
499 bool TopLevelObject);
504 Expr *Result =
nullptr;
516 assert(AType &&
"expected array type when initializing array");
518 if (
const auto *CAType = dyn_cast<ConstantArrayType>(AType))
519 ElsCount = std::min(CAType->getSize().getZExtValue(),
520 ElsCount - CurEmbedIndex);
530 CurEmbedIndex, ElsCount);
531 CurEmbedIndex += ElsCount;
542 bool VerifyOnly,
bool TreatUnavailableAsInvalid,
543 bool InOverloadResolution =
false,
548 : InitListChecker(S, Entity, IL,
T,
true,
551 &AggrDeductionCandidateParamTypes) {}
553 bool HadError() {
return hadError; }
557 InitListExpr *getFullyStructuredList()
const {
return FullyStructuredList; }
574 bool EmptyInitList = SemaRef.
getLangOpts().CPlusPlus11 &&
587 InitExpr = VerifyOnly ? &DummyInitList
604 if (!InitSeq && EmptyInitList && InitSeq.getFailureKind() ==
608 InitSeq.getFailedCandidateSet()
609 .BestViableFunction(SemaRef,
Kind.getLocation(), Best);
611 assert(O ==
OR_Success &&
"Inconsistent overload resolution");
618 bool IsInStd =
false;
620 ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
625 if (IsInStd && llvm::StringSwitch<bool>(R->
getName())
626 .Cases(
"basic_string",
"deque",
"forward_list",
true)
627 .Cases(
"list",
"map",
"multimap",
"multiset",
true)
628 .Cases(
"priority_queue",
"queue",
"set",
"stack",
true)
629 .Cases(
"unordered_map",
"unordered_set",
"vector",
true)
631 InitSeq.InitializeFrom(
635 TreatUnavailableAsInvalid);
640 diag::warn_invalid_initializer_from_system_header);
643 diag::note_used_in_initialization_here);
645 SemaRef.
Diag(
Loc, diag::note_used_in_initialization_here);
652 InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
655 diag::note_in_omitted_aggregate_initializer)
658 bool IsTrailingArrayNewMember =
661 SemaRef.
Diag(
Loc, diag::note_in_omitted_aggregate_initializer)
662 << (IsTrailingArrayNewMember ? 2 : 0)
671 : InitSeq.Perform(SemaRef, Entity,
Kind, SubInit);
679 if (FullyStructuredList)
681 PerformEmptyInit(
Loc, Entity);
684void InitListChecker::FillInEmptyInitForBase(
687 bool &RequiresSecondPass,
bool FillWithNoInit) {
694 : PerformEmptyInit(ILE->
getEndLoc(), BaseEntity);
701 assert(Init < ILE->getNumInits() &&
"should have been expanded");
706 FillInEmptyInitializations(BaseEntity, InnerILE, RequiresSecondPass,
707 ILE,
Init, FillWithNoInit);
709 dyn_cast<DesignatedInitUpdateExpr>(ILE->
getInit(
Init))) {
710 FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
711 RequiresSecondPass, ILE,
Init,
716void InitListChecker::FillInEmptyInitForField(
unsigned Init,
FieldDecl *Field,
719 bool &RequiresSecondPass,
720 bool FillWithNoInit) {
728 if (!RType->getDecl()->isUnion())
729 assert((
Init < NumInits || VerifyOnly) &&
730 "This ILE should have been expanded");
732 if (FillWithNoInit) {
733 assert(!VerifyOnly &&
"should not fill with no-init in verify-only mode");
745 if (
Field->hasInClassInitializer()) {
775 RequiresSecondPass =
true;
780 if (
Field->getType()->isReferenceType()) {
786 SemaRef.
Diag(
Loc, diag::err_init_reference_member_uninitialized)
790 SemaRef.
Diag(
Field->getLocation(), diag::note_uninit_reference_member);
802 if (hadError || VerifyOnly) {
804 }
else if (
Init < NumInits) {
806 }
else if (!isa<ImplicitValueInitExpr>(MemberInit.
get())) {
812 RequiresSecondPass =
true;
816 FillInEmptyInitializations(MemberEntity, InnerILE,
817 RequiresSecondPass, ILE,
Init, FillWithNoInit);
819 dyn_cast<DesignatedInitUpdateExpr>(ILE->
getInit(
Init))) {
820 FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
821 RequiresSecondPass, ILE,
Init,
832 bool &RequiresSecondPass,
835 bool FillWithNoInit) {
837 "Should not have void type");
841 if (FillWithNoInit && VerifyOnly)
851 struct UpdateOuterILEWithUpdatedInit {
854 ~UpdateOuterILEWithUpdatedInit() {
858 } UpdateOuterRAII = {OuterILE, OuterIndex};
869 RequiresSecondPass, FillWithNoInit);
871 assert((!RDecl->
isUnion() || !isa<CXXRecordDecl>(RDecl) ||
872 !cast<CXXRecordDecl>(RDecl)->hasInClassInitializer()) &&
873 "We should have computed initialized fields already");
877 unsigned NumElems = numStructUnionElements(ILE->
getType());
885 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
886 for (
auto &
Base : CXXRD->bases()) {
890 FillInEmptyInitForBase(
Init,
Base, Entity, ILE, RequiresSecondPass,
896 for (
auto *Field : RDecl->
fields()) {
897 if (
Field->isUnnamedBitField())
903 FillInEmptyInitForField(
Init, Field, Entity, ILE, RequiresSecondPass,
925 ElementType = AType->getElementType();
926 if (
const auto *CAType = dyn_cast<ConstantArrayType>(AType))
927 NumElements = CAType->getZExtSize();
935 ElementType = VType->getElementType();
936 NumElements = VType->getNumElements();
942 bool SkipEmptyInitChecks =
false;
955 if (!InitExpr && Init < NumInits && ILE->hasArrayFiller())
960 if (SkipEmptyInitChecks)
963 Expr *Filler =
nullptr;
969 PerformEmptyInit(ILE->
getEndLoc(), ElementEntity);
980 }
else if (VerifyOnly) {
981 SkipEmptyInitChecks =
true;
982 }
else if (
Init < NumInits) {
997 if (!isa<ImplicitValueInitExpr>(Filler) && !isa<NoInitExpr>(Filler)) {
1003 RequiresSecondPass =
true;
1007 = dyn_cast_or_null<InitListExpr>(InitExpr)) {
1008 FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
1009 ILE,
Init, FillWithNoInit);
1011 dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr)) {
1012 FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
1013 RequiresSecondPass, ILE,
Init,
1021 if (isa_and_nonnull<DesignatedInitExpr>(
Init))
1026InitListChecker::InitListChecker(
1028 bool VerifyOnly,
bool TreatUnavailableAsInvalid,
bool InOverloadResolution,
1030 : SemaRef(S), VerifyOnly(VerifyOnly),
1031 TreatUnavailableAsInvalid(TreatUnavailableAsInvalid),
1032 InOverloadResolution(InOverloadResolution),
1033 AggrDeductionCandidateParamTypes(AggrDeductionCandidateParamTypes) {
1035 FullyStructuredList =
1044 CheckExplicitInitList(Entity, IL,
T, FullyStructuredList,
1047 if (!hadError && !AggrDeductionCandidateParamTypes && FullyStructuredList) {
1048 bool RequiresSecondPass =
false;
1049 FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass,
1051 if (RequiresSecondPass && !hadError)
1052 FillInEmptyInitializations(Entity, FullyStructuredList,
1053 RequiresSecondPass,
nullptr, 0);
1055 if (hadError && FullyStructuredList)
1059int InitListChecker::numArrayElements(
QualType DeclType) {
1061 int maxElements = 0x7FFFFFFF;
1064 maxElements =
static_cast<int>(CAT->getZExtSize());
1069int InitListChecker::numStructUnionElements(
QualType DeclType) {
1071 int InitializableMembers = 0;
1072 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
1073 InitializableMembers += CXXRD->getNumBases();
1074 for (
const auto *Field : structDecl->
fields())
1075 if (!
Field->isUnnamedBitField())
1076 ++InitializableMembers;
1079 return std::min(InitializableMembers, 1);
1085 return RT->getDecl();
1087 return Inject->getDecl();
1117 if (
CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ParentRD)) {
1118 if (CXXRD->getNumBases()) {
1122 auto FieldIt = ParentRD->field_begin();
1123 assert(FieldIt != ParentRD->field_end() &&
1124 "no fields but have initializer for member?");
1125 return ++FieldIt == ParentRD->field_end();
1141 unsigned &StructuredIndex) {
1142 int maxElements = 0;
1145 maxElements = numArrayElements(
T);
1147 maxElements = numStructUnionElements(
T);
1151 llvm_unreachable(
"CheckImplicitInitList(): Illegal type");
1153 if (maxElements == 0) {
1156 diag::err_implicit_empty_initializer);
1163 InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(
1164 ParentIList, Index,
T, StructuredList, StructuredIndex,
1167 unsigned StructuredSubobjectInitIndex = 0;
1170 unsigned StartIndex = Index;
1171 CheckListElementTypes(Entity, ParentIList,
T,
1173 StructuredSubobjectInitList,
1174 StructuredSubobjectInitIndex);
1176 if (StructuredSubobjectInitList) {
1177 StructuredSubobjectInitList->
setType(
T);
1179 unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
1182 if (EndIndex < ParentIList->getNumInits() &&
1183 ParentIList->
getInit(EndIndex)) {
1194 diag::warn_missing_braces)
1200 StructuredSubobjectInitList->
getEndLoc()),
1206 if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1208 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1224 unsigned DiagID = 0;
1236 DiagID = diag::warn_braces_around_init;
1243 DiagID = diag::warn_braces_around_init;
1269 llvm_unreachable(
"unexpected braced scalar init");
1288 bool TopLevelObject) {
1289 unsigned Index = 0, StructuredIndex = 0;
1290 CheckListElementTypes(Entity, IList,
T,
true,
1291 Index, StructuredList, StructuredIndex, TopLevelObject);
1292 if (StructuredList) {
1298 StructuredList->
setType(ExprTy);
1306 bool ExtraInitsIsError = SemaRef.
getLangOpts().CPlusPlus ||
1308 hadError = ExtraInitsIsError;
1311 }
else if (StructuredIndex == 1 &&
1316 ? diag::err_excess_initializers_in_char_array_initializer
1317 : diag::ext_excess_initializers_in_char_array_initializer;
1321 unsigned DK = ExtraInitsIsError
1322 ? diag::err_excess_initializers_for_sizeless_type
1323 : diag::ext_excess_initializers_for_sizeless_type;
1333 unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
1334 : diag::ext_excess_initializers;
1342 !isa<InitListExpr>(IList->
getInit(0)))
1348 if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1351 bool HasEquivCtor =
false;
1357 if (!HasEquivCtor) {
1359 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1369 bool SubobjectIsDesignatorContext,
1372 unsigned &StructuredIndex,
1373 bool TopLevelObject) {
1377 CheckComplexType(Entity, IList, DeclType, Index,
1378 StructuredList, StructuredIndex);
1380 CheckScalarType(Entity, IList, DeclType, Index,
1381 StructuredList, StructuredIndex);
1383 CheckVectorType(Entity, IList, DeclType, Index,
1384 StructuredList, StructuredIndex);
1385 }
else if (
const RecordDecl *RD = getRecordDecl(DeclType)) {
1391 "non-aggregate records should be handed in CheckSubElementType");
1392 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1393 Bases = CXXRD->bases();
1395 Bases = cast<CXXRecordDecl>(RD)->bases();
1397 CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1398 SubobjectIsDesignatorContext, Index, StructuredList,
1399 StructuredIndex, TopLevelObject);
1404 CheckArrayType(Entity, IList, DeclType, Zero,
1405 SubobjectIsDesignatorContext, Index,
1406 StructuredList, StructuredIndex);
1411 SemaRef.
Diag(IList->
getBeginLoc(), diag::err_illegal_initializer_type)
1415 CheckReferenceType(Entity, IList, DeclType, Index,
1416 StructuredList, StructuredIndex);
1419 SemaRef.
Diag(IList->
getBeginLoc(), diag::err_init_objc_class) << DeclType;
1424 CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1431 assert(AggrDeductionCandidateParamTypes);
1432 AggrDeductionCandidateParamTypes->push_back(DeclType);
1435 SemaRef.
Diag(IList->
getBeginLoc(), diag::err_illegal_initializer_type)
1446 unsigned &StructuredIndex,
1447 bool DirectlyDesignated) {
1451 return CheckReferenceType(Entity, IList, ElemType, Index,
1452 StructuredList, StructuredIndex);
1455 if (SubInitList->getNumInits() == 1 &&
1460 expr = SubInitList->getInit(0);
1463 }
else if (isa<ImplicitValueInitExpr>(
expr)) {
1467 "found implicit initialization for the wrong type");
1468 UpdateStructuredListElement(StructuredList, StructuredIndex,
expr);
1490 if (TmpEntity.getType()->isDependentType()) {
1495 assert(AggrDeductionCandidateParamTypes);
1509 if (isa<InitListExpr, DesignatedInitExpr>(
expr) ||
1510 !isa_and_present<ConstantArrayType>(
1513 AggrDeductionCandidateParamTypes->push_back(ElemType);
1525 if (
Seq || isa<InitListExpr>(
expr)) {
1526 if (
auto *Embed = dyn_cast<EmbedExpr>(
expr)) {
1527 expr = HandleEmbed(Embed, Entity);
1531 if (Result.isInvalid())
1534 UpdateStructuredListElement(StructuredList, StructuredIndex,
1535 Result.getAs<
Expr>());
1538 }
else if (StructuredList) {
1539 UpdateStructuredListElement(StructuredList, StructuredIndex,
1544 if (AggrDeductionCandidateParamTypes)
1545 AggrDeductionCandidateParamTypes->push_back(ElemType);
1553 return CheckScalarType(Entity, IList, ElemType, Index,
1554 StructuredList, StructuredIndex);
1568 UpdateStructuredListElement(StructuredList, StructuredIndex,
expr);
1597 UpdateStructuredListElement(StructuredList, StructuredIndex,
1615 CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1620 if (DirectlyDesignated && SemaRef.
getLangOpts().CPlusPlus && !hadError) {
1621 if (InOverloadResolution)
1625 diag::ext_designated_init_brace_elision)
1626 <<
expr->getSourceRange()
1641 assert(
Copy.isInvalid() &&
1642 "expected non-aggregate initialization to fail");
1654 unsigned &StructuredIndex) {
1655 assert(Index == 0 &&
"Index in explicit init list must be zero");
1665 return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1670 if (!SemaRef.
getLangOpts().CPlusPlus && !VerifyOnly)
1679 for (
unsigned i = 0; i < 2; ++i) {
1681 CheckSubElementType(ElementEntity, IList, elementType, Index,
1682 StructuredList, StructuredIndex);
1690 unsigned &StructuredIndex) {
1697 ? diag::warn_cxx98_compat_empty_sizeless_initializer
1698 : diag::err_empty_sizeless_initializer)
1703 ? diag::warn_cxx98_compat_empty_scalar_initializer
1704 : diag::err_empty_scalar_initializer)
1720 SemaRef.
Diag(SubIList->getBeginLoc(), diag::ext_many_braces_around_init)
1723 CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1726 }
else if (isa<DesignatedInitExpr>(
expr)) {
1729 diag::err_designator_for_scalar_or_sizeless_init)
1731 <<
expr->getSourceRange();
1736 }
else if (
auto *Embed = dyn_cast<EmbedExpr>(
expr)) {
1737 expr = HandleEmbed(Embed, Entity);
1743 Result = getDummyInit();
1752 Expr *ResultExpr =
nullptr;
1754 if (Result.isInvalid())
1757 ResultExpr = Result.getAs<
Expr>();
1759 if (ResultExpr !=
expr && !VerifyOnly && !CurEmbed) {
1762 IList->
setInit(Index, ResultExpr);
1766 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1769 if (AggrDeductionCandidateParamTypes)
1770 AggrDeductionCandidateParamTypes->push_back(DeclType);
1777 unsigned &StructuredIndex) {
1785 diag::err_init_reference_member_uninitialized)
1807 Result = getDummyInit();
1816 if (Result.isInvalid())
1821 if (!VerifyOnly &&
expr)
1824 UpdateStructuredListElement(StructuredList, StructuredIndex,
expr);
1826 if (AggrDeductionCandidateParamTypes)
1827 AggrDeductionCandidateParamTypes->push_back(DeclType);
1834 unsigned &StructuredIndex) {
1837 unsigned numEltsInit = 0;
1842 CheckEmptyInitializable(
1852 if (!isa<InitListExpr>(
Init) &&
Init->getType()->isVectorType()) {
1856 Result = getDummyInit();
1865 Expr *ResultExpr =
nullptr;
1866 if (Result.isInvalid())
1869 ResultExpr = Result.getAs<
Expr>();
1871 if (ResultExpr !=
Init && !VerifyOnly) {
1874 IList->
setInit(Index, ResultExpr);
1877 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1879 if (AggrDeductionCandidateParamTypes)
1880 AggrDeductionCandidateParamTypes->push_back(elementType);
1887 for (
unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1890 CheckEmptyInitializable(ElementEntity, IList->
getEndLoc());
1895 CheckSubElementType(ElementEntity, IList, elementType, Index,
1896 StructuredList, StructuredIndex);
1904 if (isBigEndian && (
T->getVectorKind() == VectorKind::Neon ||
1905 T->getVectorKind() == VectorKind::NeonPoly)) {
1917 diag::warn_neon_vector_initializer_non_portable);
1919 const char *typeCode;
1929 llvm_unreachable(
"Invalid element type!");
1933 ? diag::note_neon_vector_initializer_non_portable_q
1934 : diag::note_neon_vector_initializer_non_portable)
1935 << typeCode << typeSize;
1945 for (
unsigned i = 0; i < maxElements; ++i) {
1954 CheckSubElementType(ElementEntity, IList, elementType, Index,
1955 StructuredList, StructuredIndex);
1967 CheckSubElementType(ElementEntity, IList, VecType, Index,
1968 StructuredList, StructuredIndex);
1969 numEltsInit += numIElts;
1974 if (numEltsInit != maxElements) {
1977 diag::err_vector_incorrect_num_elements)
1978 << (numEltsInit < maxElements) << maxElements << numEltsInit
2005 SemaRef.
PDiag(diag::err_access_dtor_temp)
2019 InitType =
Parent->getType();
2025 ExprList.size() == 1
2026 ? dyn_cast_if_present<EmbedExpr>(ExprList[0]->IgnoreParens())
2035 const bool TypesMatch =
2046 llvm::APSInt elementIndex,
2047 bool SubobjectIsDesignatorContext,
2050 unsigned &StructuredIndex) {
2068 if (Index < IList->getNumInits()) {
2081 if (StructuredList) {
2082 UpdateStructuredListElement(StructuredList, StructuredIndex,
2087 if (AggrDeductionCandidateParamTypes)
2088 AggrDeductionCandidateParamTypes->push_back(DeclType);
2109 SemaRef.
Diag(VAT->getSizeExpr()->getBeginLoc(),
2110 diag::err_variable_object_no_init)
2111 << VAT->getSizeExpr()->getSourceRange();
2120 llvm::APSInt maxElements(elementIndex.getBitWidth(),
2121 elementIndex.isUnsigned());
2122 bool maxElementsKnown =
false;
2124 maxElements = CAT->getSize();
2125 elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
2126 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2127 maxElementsKnown =
true;
2131 while (Index < IList->getNumInits()) {
2137 if (!SubobjectIsDesignatorContext)
2142 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
2143 DeclType,
nullptr, &elementIndex, Index,
2144 StructuredList, StructuredIndex,
true,
2150 if (elementIndex.getBitWidth() > maxElements.getBitWidth())
2151 maxElements = maxElements.extend(elementIndex.getBitWidth());
2152 else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
2153 elementIndex = elementIndex.extend(maxElements.getBitWidth());
2154 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2158 if (!maxElementsKnown && elementIndex > maxElements)
2159 maxElements = elementIndex;
2166 if (maxElementsKnown && elementIndex == maxElements)
2170 SemaRef.
Context, StructuredIndex, Entity);
2172 unsigned EmbedElementIndexBeforeInit = CurEmbedIndex;
2174 CheckSubElementType(ElementEntity, IList, elementType, Index,
2175 StructuredList, StructuredIndex);
2180 elementIndex + CurEmbedIndex - EmbedElementIndexBeforeInit - 1;
2182 auto Embed = cast<EmbedExpr>(
Init);
2184 EmbedElementIndexBeforeInit - 1;
2190 if (!maxElementsKnown && elementIndex > maxElements)
2191 maxElements = elementIndex;
2196 llvm::APSInt
Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
2200 SemaRef.
Diag(IList->
getBeginLoc(), diag::ext_typecheck_zero_array_size);
2204 elementType, maxElements,
nullptr, ArraySizeModifier::Normal, 0);
2211 if ((maxElementsKnown && elementIndex < maxElements) ||
2213 CheckEmptyInitializable(
2222 bool TopLevelObject) {
2224 unsigned FlexArrayDiag;
2225 if (isa<InitListExpr>(InitExpr) &&
2226 cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
2228 FlexArrayDiag = diag::ext_flexible_array_init;
2229 }
else if (!TopLevelObject) {
2231 FlexArrayDiag = diag::err_flexible_array_init;
2234 FlexArrayDiag = diag::err_flexible_array_init;
2235 }
else if (cast<VarDecl>(Entity.
getDecl())->hasLocalStorage()) {
2237 FlexArrayDiag = diag::err_flexible_array_init;
2240 FlexArrayDiag = diag::ext_flexible_array_init;
2246 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
2250 return FlexArrayDiag != diag::ext_flexible_array_init;
2254 return StructuredList && StructuredList->
getNumInits() == 1U;
2257void InitListChecker::CheckStructUnionTypes(
2260 bool SubobjectIsDesignatorContext,
unsigned &Index,
2261 InitListExpr *StructuredList,
unsigned &StructuredIndex,
2262 bool TopLevelObject) {
2263 const RecordDecl *RD = getRecordDecl(DeclType);
2285 if (isa<CXXRecordDecl>(RD) &&
2286 cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
2287 if (!StructuredList)
2290 Field != FieldEnd; ++Field) {
2291 if (
Field->hasInClassInitializer() ||
2292 (
Field->isAnonymousStructOrUnion() &&
2293 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
2299 llvm_unreachable(
"Couldn't find in-class initializer");
2305 Field != FieldEnd; ++Field) {
2306 if (!
Field->isUnnamedBitField()) {
2307 CheckEmptyInitializable(
2318 bool InitializedSomething =
false;
2321 for (
auto I = Bases.begin(),
E = Bases.end(); I !=
E; ++I) {
2327 if (isa_and_nonnull<DesignatedInitExpr>(
Init))
2344 if (AggrDeductionCandidateParamTypes &&
Base.isPackExpansion()) {
2345 AggrDeductionCandidateParamTypes->push_back(
2350 if (Index < IList->getNumInits())
2362 CheckSubElementType(BaseEntity, IList,
Base.getType(), Index,
2363 StructuredList, StructuredIndex);
2364 InitializedSomething =
true;
2366 CheckEmptyInitializable(BaseEntity, InitLoc);
2381 size_t NumRecordDecls = llvm::count_if(RD->
decls(), [&](
const Decl *
D) {
2382 return isa<FieldDecl>(D) || isa<RecordDecl>(D);
2384 bool HasDesignatedInit =
false;
2388 while (Index < IList->getNumInits()) {
2396 if (!SubobjectIsDesignatorContext)
2399 HasDesignatedInit =
true;
2403 bool DesignatedInitFailed = CheckDesignatedInitializer(
2404 Entity, IList, DIE, 0, DeclType, &Field,
nullptr, Index,
2405 StructuredList, StructuredIndex,
true, TopLevelObject);
2406 if (DesignatedInitFailed)
2411 if (!VerifyOnly &&
D->isFieldDesignator()) {
2413 InitializedFields.insert(F);
2414 if (!DesignatedInitFailed) {
2423 InitializedSomething =
true;
2440 if (NumRecordDecls == 1)
2442 if (
const auto *IL = dyn_cast<IntegerLiteral>(I))
2443 return IL->getValue().isZero();
2451 SemaRef.
Diag(InitLoc, diag::err_non_designated_init_used);
2456 if (Field == FieldEnd) {
2462 if (InitializedSomething && RD->
isUnion())
2466 if (
Field->getType()->isIncompleteArrayType())
2469 if (
Field->isUnnamedBitField()) {
2478 InvalidUse = !SemaRef.
CanUseDecl(*Field, TreatUnavailableAsInvalid);
2499 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
2500 StructuredList, StructuredIndex);
2501 InitializedSomething =
true;
2502 InitializedFields.insert(*Field);
2514 bool IsCDesignatedInitializer =
2515 HasDesignatedInit && !SemaRef.
getLangOpts().CPlusPlus;
2516 if (!VerifyOnly && InitializedSomething && !RD->
isUnion() &&
2518 !IsCDesignatedInitializer) {
2525 if (HasDesignatedInit && InitializedFields.count(*it))
2528 if (!it->isUnnamedBitField() && !it->hasInClassInitializer() &&
2529 !it->getType()->isIncompleteArrayType()) {
2530 auto Diag = HasDesignatedInit
2531 ? diag::warn_missing_designated_field_initializers
2532 : diag::warn_missing_field_initializers;
2541 if (!StructuredList && Field != FieldEnd && !RD->
isUnion() &&
2542 !
Field->getType()->isIncompleteArrayType()) {
2543 for (;
Field != FieldEnd && !hadError; ++
Field) {
2544 if (!
Field->isUnnamedBitField() && !
Field->hasInClassInitializer())
2545 CheckEmptyInitializable(
2566 if (Field == FieldEnd || !
Field->getType()->isIncompleteArrayType() ||
2570 if (CheckFlexibleArrayInit(Entity, IList->
getInit(Index), *Field,
2580 if (isa<InitListExpr>(IList->
getInit(Index)) ||
2581 AggrDeductionCandidateParamTypes)
2582 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
2583 StructuredList, StructuredIndex);
2585 CheckImplicitInitList(MemberEntity, IList,
Field->getType(), Index,
2586 StructuredList, StructuredIndex);
2607 PE = IndirectField->
chain_end(); PI != PE; ++PI) {
2615 assert(isa<FieldDecl>(*PI));
2616 Replacements.back().setFieldDecl(cast<FieldDecl>(*PI));
2623 &Replacements[0] + Replacements.size());
2630 for (
unsigned I = 0; I < NumIndexExprs; ++I)
2644 explicit FieldInitializerValidatorCCC(
const RecordDecl *RD)
2652 std::unique_ptr<CorrectionCandidateCallback>
clone()
override {
2653 return std::make_unique<FieldInitializerValidatorCCC>(*
this);
2706 llvm::APSInt *NextElementIndex,
2709 unsigned &StructuredIndex,
2710 bool FinishSubobjectInit,
2711 bool TopLevelObject) {
2712 if (DesigIdx == DIE->
size()) {
2719 assert(isa<InitListExpr>(
Init) &&
2720 "designator result in direct non-list initialization?");
2725 if (StructuredList) {
2729 UpdateStructuredListElement(StructuredList, StructuredIndex,
2733 if (AggrDeductionCandidateParamTypes)
2734 AggrDeductionCandidateParamTypes->push_back(CurrentObjectType);
2739 bool prevHadError = hadError;
2744 unsigned OldIndex = Index;
2747 CheckSubElementType(Entity, IList, CurrentObjectType, Index, StructuredList,
2748 StructuredIndex,
true);
2754 IList->
setInit(OldIndex, DIE);
2756 return hadError && !prevHadError;
2760 bool IsFirstDesignator = (DesigIdx == 0);
2761 if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
2764 if (IsFirstDesignator)
2765 StructuredList = FullyStructuredList;
2767 Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2768 StructuredList->getInit(StructuredIndex) :
nullptr;
2769 if (!ExistingInit && StructuredList->hasArrayFiller())
2770 ExistingInit = StructuredList->getArrayFiller();
2773 StructuredList = getStructuredSubobjectInit(
2774 IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
2776 else if (
InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2777 StructuredList = Result;
2790 diagnoseInitOverride(ExistingInit,
2797 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2798 StructuredList =
E->getUpdater();
2803 StructuredList->updateInit(SemaRef.
Context, StructuredIndex, DIUE);
2812 StructuredList =
nullptr;
2818 if (
D->isFieldDesignator()) {
2828 RecordDecl *RD = getRecordDecl(CurrentObjectType);
2832 Loc =
D->getFieldLoc();
2834 SemaRef.
Diag(
Loc, diag::err_field_designator_non_aggr)
2835 << SemaRef.
getLangOpts().CPlusPlus << CurrentObjectType;
2844 if (
auto *FD = dyn_cast_if_present<FieldDecl>(VD)) {
2846 }
else if (
auto *IFD = dyn_cast_if_present<IndirectFieldDecl>(VD)) {
2852 KnownField = cast<FieldDecl>(*IFD->chain_begin());
2869 SemaRef.
Diag(
D->getFieldLoc(), diag::err_field_designator_nonfield)
2871 SemaRef.
Diag(Lookup.front()->getLocation(),
2872 diag::note_field_designator_found);
2879 FieldInitializerValidatorCCC CCC(RD);
2886 SemaRef.
PDiag(diag::err_field_designator_unknown_suggest)
2887 << FieldName << CurrentObjectType);
2888 KnownField = Corrected.getCorrectionDeclAs<
FieldDecl>();
2899 SemaRef.
Diag(
Loc, diag::err_field_designator_unknown)
2907 unsigned NumBases = 0;
2908 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2909 NumBases = CXXRD->getNumBases();
2911 unsigned FieldIndex = NumBases;
2913 for (
auto *FI : RD->
fields()) {
2914 if (FI->isUnnamedBitField())
2930 if (StructuredList) {
2931 FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
2933 assert(StructuredList->getNumInits() == 1
2934 &&
"A union should never have more than one initializer!");
2936 Expr *ExistingInit = StructuredList->getInit(0);
2939 diagnoseInitOverride(
2947 StructuredList->resizeInits(SemaRef.
Context, 0);
2948 StructuredList->setInitializedFieldInUnion(
nullptr);
2951 StructuredList->setInitializedFieldInUnion(*Field);
2958 InvalidUse = !SemaRef.
CanUseDecl(*Field, TreatUnavailableAsInvalid);
2981 if (IsFirstDesignator && !VerifyOnly && SemaRef.
getLangOpts().CPlusPlus &&
2984 (*NextField)->getFieldIndex() >
Field->getFieldIndex() + 1)) {
2988 if (FI->isUnnamedBitField())
2999 diag::ext_designated_init_reordered)
3002 unsigned OldIndex = StructuredIndex - 1;
3003 if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
3004 if (
Expr *PrevInit = StructuredList->getInit(OldIndex)) {
3005 SemaRef.
Diag(PrevInit->getBeginLoc(),
3006 diag::note_previous_field_init)
3016 D->setFieldDecl(*Field);
3020 if (StructuredList && FieldIndex >= StructuredList->getNumInits())
3021 StructuredList->resizeInits(SemaRef.
Context, FieldIndex + 1);
3024 if (
Field->getType()->isIncompleteArrayType()) {
3026 if ((DesigIdx + 1) != DIE->
size()) {
3033 diag::err_designator_into_flexible_array_member)
3035 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
3041 if (!hadError && !isa<InitListExpr>(DIE->
getInit()) &&
3042 !isa<StringLiteral>(DIE->
getInit())) {
3046 diag::err_flexible_array_init_needs_braces)
3048 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
3055 if (!
Invalid && CheckFlexibleArrayInit(Entity, DIE->
getInit(), *Field,
3065 bool prevHadError = hadError;
3066 unsigned newStructuredIndex = FieldIndex;
3067 unsigned OldIndex = Index;
3072 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
3073 StructuredList, newStructuredIndex);
3075 IList->
setInit(OldIndex, DIE);
3076 if (hadError && !prevHadError) {
3081 StructuredIndex = FieldIndex;
3087 unsigned newStructuredIndex = FieldIndex;
3091 if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
3092 FieldType,
nullptr,
nullptr, Index,
3093 StructuredList, newStructuredIndex,
3094 FinishSubobjectInit,
false))
3105 if (IsFirstDesignator) {
3112 StructuredIndex = FieldIndex;
3116 if (!FinishSubobjectInit)
3124 bool prevHadError = hadError;
3129 CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
3130 false, Index, StructuredList, FieldIndex);
3131 return hadError && !prevHadError;
3152 SemaRef.
Diag(
D->getLBracketLoc(), diag::err_array_designator_non_array)
3153 << CurrentObjectType;
3158 Expr *IndexExpr =
nullptr;
3159 llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
3160 if (
D->isArrayDesignator()) {
3163 DesignatedEndIndex = DesignatedStartIndex;
3165 assert(
D->isArrayRangeDesignator() &&
"Need array-range designator");
3167 DesignatedStartIndex =
3169 DesignatedEndIndex =
3178 if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
3183 if (isa<ConstantArrayType>(AT)) {
3184 llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(),
false);
3185 DesignatedStartIndex
3186 = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
3187 DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
3189 = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
3190 DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
3191 if (DesignatedEndIndex >= MaxElements) {
3194 diag::err_array_designator_too_large)
3201 unsigned DesignatedIndexBitWidth =
3203 DesignatedStartIndex =
3204 DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
3205 DesignatedEndIndex =
3206 DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
3207 DesignatedStartIndex.setIsUnsigned(
true);
3208 DesignatedEndIndex.setIsUnsigned(
true);
3211 bool IsStringLiteralInitUpdate =
3212 StructuredList && StructuredList->isStringLiteralInit();
3213 if (IsStringLiteralInitUpdate && VerifyOnly) {
3216 StructuredList =
nullptr;
3217 }
else if (IsStringLiteralInitUpdate) {
3230 unsigned PromotedCharTyWidth = Context.
getTypeSize(PromotedCharTy);
3235 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3236 StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3237 StructuredList->resizeInits(Context, StrLen);
3241 for (
unsigned i = 0, e = StrLen; i != e; ++i) {
3242 llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
3244 Context, CodeUnit, PromotedCharTy, SubExpr->
getExprLoc());
3245 if (CharTy != PromotedCharTy)
3249 StructuredList->updateInit(Context, i,
Init);
3258 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3259 StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3260 StructuredList->resizeInits(Context, StrLen);
3264 for (
unsigned i = 0, e = StrLen; i != e; ++i) {
3265 llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
3267 Context, CodeUnit, PromotedCharTy, SubExpr->
getExprLoc());
3268 if (CharTy != PromotedCharTy)
3272 StructuredList->updateInit(Context, i,
Init);
3279 if (StructuredList &&
3280 DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
3281 StructuredList->resizeInits(SemaRef.
Context,
3282 DesignatedEndIndex.getZExtValue() + 1);
3288 unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
3289 unsigned OldIndex = Index;
3294 while (DesignatedStartIndex <= DesignatedEndIndex) {
3300 if (CheckDesignatedInitializer(
3301 ElementEntity, IList, DIE, DesigIdx + 1, ElementType,
nullptr,
3302 nullptr, Index, StructuredList, ElementIndex,
3303 FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
3308 ++DesignatedStartIndex;
3309 ElementIndex = DesignatedStartIndex.getZExtValue();
3314 if (IsFirstDesignator) {
3315 if (NextElementIndex)
3316 *NextElementIndex = DesignatedStartIndex;
3317 StructuredIndex = ElementIndex;
3321 if (!FinishSubobjectInit)
3325 bool prevHadError = hadError;
3326 CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
3328 StructuredList, ElementIndex);
3329 return hadError && !prevHadError;
3335InitListChecker::getStructuredSubobjectInit(
InitListExpr *IList,
unsigned Index,
3338 unsigned StructuredIndex,
3340 bool IsFullyOverwritten) {
3341 if (!StructuredList)
3344 Expr *ExistingInit =
nullptr;
3345 if (StructuredIndex < StructuredList->getNumInits())
3346 ExistingInit = StructuredList->
getInit(StructuredIndex);
3348 if (
InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
3357 if (!IsFullyOverwritten)
3380 diagnoseInitOverride(ExistingInit, InitRange);
3383 unsigned ExpectedNumInits = 0;
3384 if (Index < IList->getNumInits()) {
3385 if (
auto *
Init = dyn_cast_or_null<InitListExpr>(IList->
getInit(Index)))
3386 ExpectedNumInits =
Init->getNumInits();
3392 createInitListExpr(CurrentObjectType, InitRange, ExpectedNumInits);
3401InitListChecker::createInitListExpr(
QualType CurrentObjectType,
3403 unsigned ExpectedNumInits) {
3407 QualType ResultType = CurrentObjectType;
3410 Result->setType(ResultType);
3413 unsigned NumElements = 0;
3418 NumElements = CAType->getZExtSize();
3421 if (NumElements > ExpectedNumInits)
3425 NumElements = VType->getNumElements();
3427 NumElements = numStructUnionElements(CurrentObjectType);
3432 Result->reserveInits(SemaRef.
Context, NumElements);
3439void InitListChecker::UpdateStructuredListElement(
InitListExpr *StructuredList,
3440 unsigned &StructuredIndex,
3443 if (!StructuredList)
3447 StructuredIndex,
expr)) {
3453 diagnoseInitOverride(PrevInit,
expr->getSourceRange());
3462 InitListChecker Check(*
this, Entity, From,
Type,
true,
3465 return !Check.HadError();
3486 return S.
Diag(
Loc, diag::err_array_designator_negative)
3489 Value.setIsUnsigned(
true);
3507 if (
D.isFieldDesignator()) {
3508 Designators.push_back(ASTDesignator::CreateFieldDesignator(
3509 D.getFieldDecl(),
D.getDotLoc(),
D.getFieldLoc()));
3510 }
else if (
D.isArrayDesignator()) {
3511 Expr *Index =
static_cast<Expr *
>(
D.getArrayIndex());
3512 llvm::APSInt IndexValue;
3513 if (!Index->isTypeDependent() && !Index->isValueDependent())
3518 Designators.push_back(ASTDesignator::CreateArrayDesignator(
3519 InitExpressions.size(),
D.getLBracketLoc(),
D.getRBracketLoc()));
3520 InitExpressions.push_back(Index);
3522 }
else if (
D.isArrayRangeDesignator()) {
3523 Expr *StartIndex =
static_cast<Expr *
>(
D.getArrayRangeStart());
3524 Expr *EndIndex =
static_cast<Expr *
>(
D.getArrayRangeEnd());
3525 llvm::APSInt StartValue;
3526 llvm::APSInt EndValue;
3531 if (!StartDependent)
3537 if (!StartIndex || !EndIndex)
3541 if (StartDependent || EndDependent) {
3543 }
else if (StartValue.getBitWidth() > EndValue.getBitWidth())
3544 EndValue = EndValue.extend(StartValue.getBitWidth());
3545 else if (StartValue.getBitWidth() < EndValue.getBitWidth())
3546 StartValue = StartValue.extend(EndValue.getBitWidth());
3548 if (!StartDependent && !EndDependent && EndValue < StartValue) {
3549 Diag(
D.getEllipsisLoc(), diag::err_array_designator_empty_range)
3554 Designators.push_back(ASTDesignator::CreateArrayRangeDesignator(
3555 InitExpressions.size(),
D.getLBracketLoc(),
D.getEllipsisLoc(),
3556 D.getRBracketLoc()));
3557 InitExpressions.push_back(StartIndex);
3558 InitExpressions.push_back(EndIndex);
3568 EqualOrColonLoc, GNUSyntax,
3576InitializedEntity::InitializedEntity(
ASTContext &Context,
unsigned Index,
3581 Kind = EK_ArrayElement;
3584 Kind = EK_VectorElement;
3588 assert(CT &&
"Unexpected type");
3589 Kind = EK_ComplexElement;
3597 bool IsInheritedVirtualBase,
3602 Result.Base = {
Base, IsInheritedVirtualBase};
3620 return Variable.VariableOrMember->getDeclName();
3642 llvm_unreachable(
"Invalid EntityKind!");
3676 llvm_unreachable(
"Invalid EntityKind!");
3711unsigned InitializedEntity::dumpImpl(raw_ostream &OS)
const {
3714 for (
unsigned I = 0; I != Depth; ++I)
3731 case EK_New: OS <<
"New";
break;
3735 case EK_Base: OS <<
"Base";
break;
3742 OS <<
"Block (lambda)";
3745 OS <<
"LambdaCapture ";
3752 D->printQualifiedName(OS);
3755 OS <<
" '" <<
getType() <<
"'\n";
3761 dumpImpl(llvm::errs());
3816 for (
const Step &S : llvm::reverse(Steps)) {
3876 llvm_unreachable(
"Invalid EntityKind!");
3884InitializationSequence
3887 bool HadMultipleCandidates) {
3891 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3893 S.Function.FoundDecl =
Found;
3912 bool BindingTemporary) {
3937 bool HadMultipleCandidates) {
3941 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3943 S.Function.FoundDecl = FoundDecl;
3982 bool TopLevelOfInitList) {
4000 bool HadMultipleCandidates,
bool FromInitList,
bool AsInitList) {
4006 S.Function.HadMultipleCandidates = HadMultipleCandidates;
4007 S.Function.Function = Constructor;
4008 S.Function.FoundDecl = FoundDecl;
4051 Steps.insert(Steps.begin(), S);
4112 "Can only unwrap trivial init lists.");
4116 Steps.insert(Steps.begin(), S);
4122 "Can only rewrap trivial init lists.");
4126 Steps.insert(Steps.begin(), S);
4130 S.WrappingSyntacticList = Syntactic;
4137 this->Failure = Failure;
4138 this->FailedOverloadResult =
Result;
4159 if (!
Init.empty()) {
4179 "consuming an object of unretainable type?");
4199 bool TreatUnavailableAsInvalid) {
4214 Expr *OVEAsExpr = &OVE;
4217 TreatUnavailableAsInvalid);
4227 bool TreatUnavailableAsInvalid);
4238 bool TreatUnavailableAsInvalid) {
4252 List->getNumInits()),
4257 List->getExprLoc(), List->getBeginLoc(), List->getEndLoc());
4259 TreatUnavailableAsInvalid);
4286 bool CopyInitializing,
bool AllowExplicit,
bool OnlyListConstructors,
4287 bool IsListInit,
bool RequireActualConstructor,
4288 bool SecondStepOfCopyInit =
false) {
4294 if (!Info.Constructor || Info.Constructor->isInvalidDecl())
4311 bool SuppressUserConversions =
4312 SecondStepOfCopyInit ||
4313 (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
4316 if (Info.ConstructorTmpl)
4318 Info.ConstructorTmpl, Info.FoundDecl,
4319 nullptr, Args, CandidateSet, SuppressUserConversions,
4320 false, AllowExplicit);
4329 bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
4333 CandidateSet, SuppressUserConversions,
4334 false, AllowExplicit,
4350 if (S.
getLangOpts().CPlusPlus17 && Args.size() == 1 &&
4351 !RequireActualConstructor && !SecondStepOfCopyInit) {
4353 auto *SourceRD =
Initializer->getType()->getAsCXXRecordDecl();
4355 const auto &Conversions = SourceRD->getVisibleConversionFunctions();
4356 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
4359 D =
D->getUnderlyingDecl();
4366 Conv = cast<CXXConversionDecl>(
D);
4370 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
4371 CandidateSet, AllowExplicit, AllowExplicit,
4375 DestType, CandidateSet, AllowExplicit,
4402 bool IsListInit =
false,
4403 bool IsInitListCopy =
false) {
4404 assert(((!IsListInit && !IsInitListCopy) ||
4405 (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
4406 "IsListInit/IsInitListCopy must come with a single initializer list "
4409 (IsListInit || IsInitListCopy) ? cast<InitListExpr>(Args[0]) :
nullptr;
4419 bool RequireActualConstructor =
4425 bool CopyElisionPossible =
false;
4426 auto ElideConstructor = [&] {
4442 if (S.
getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
4443 UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
4465 assert(!IsInitListCopy &&
4466 "IsInitListCopy only possible with aggregate types");
4467 CopyElisionPossible =
true;
4475 assert(DestRecordType &&
"Constructor initialization requires record type");
4477 = cast<CXXRecordDecl>(DestRecordType->
getDecl());
4485 bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
4495 bool AsInitializerList =
false;
4507 AsInitializerList =
true;
4513 S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
4514 CopyInitialization, AllowExplicit,
4515 true, IsListInit, RequireActualConstructor);
4530 AsInitializerList =
false;
4532 S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4533 Best, CopyInitialization, AllowExplicit,
4534 false, IsListInit, RequireActualConstructor);
4546 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4550 if (
auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4552 QualType ConvType = CD->getConversionType();
4554 "should not have selected this conversion function");
4556 HadMultipleCandidates);
4587 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->
isExplicit()) {
4607 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4608 IsListInit | IsInitListCopy, AsInitializerList);
4621 bool HadMultipleCandidates =
false;
4624 UnqualifiedTargetType,
4626 &HadMultipleCandidates)) {
4628 HadMultipleCandidates);
4629 SourceType = Fn->getType();
4648 bool TopLevelOfInitList);
4662 bool TreatUnavailableAsInvalid) {
4702 T1Quals, cv2T2, T2, T2Quals, Sequence,
4733 TreatUnavailableAsInvalid);
4765 bool TreatUnavailableAsInvalid) {
4777 TreatUnavailableAsInvalid);
4815 !IsDesignatedInit) {
4820 Expr *InitListAsExpr = InitList;
4839 if (isa<ConstantArrayType>(DestAT) &&
4841 isa<DecompositionDecl>(Entity.
getDecl())) {
4844 "Deduced to other type?");
4848 Entity, SubInit[0], DestType, Sequence,
4849 TreatUnavailableAsInvalid);
4855 if (!isa<VariableArrayType>(DestAT) &&
4865 TreatUnavailableAsInvalid);
4898 TreatUnavailableAsInvalid))
4902 Expr *InitListAsExpr = InitList;
4904 DestType, Sequence,
true);
4922 ET && ET->getDecl()->isFixed() &&