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())
2041 llvm::APSInt elementIndex,
2042 bool SubobjectIsDesignatorContext,
2045 unsigned &StructuredIndex) {
2063 if (Index < IList->getNumInits()) {
2076 if (StructuredList) {
2077 UpdateStructuredListElement(StructuredList, StructuredIndex,
2082 if (AggrDeductionCandidateParamTypes)
2083 AggrDeductionCandidateParamTypes->push_back(DeclType);
2104 SemaRef.
Diag(VAT->getSizeExpr()->getBeginLoc(),
2105 diag::err_variable_object_no_init)
2106 << VAT->getSizeExpr()->getSourceRange();
2115 llvm::APSInt maxElements(elementIndex.getBitWidth(),
2116 elementIndex.isUnsigned());
2117 bool maxElementsKnown =
false;
2119 maxElements = CAT->getSize();
2120 elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
2121 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2122 maxElementsKnown =
true;
2126 while (Index < IList->getNumInits()) {
2132 if (!SubobjectIsDesignatorContext)
2137 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
2138 DeclType,
nullptr, &elementIndex, Index,
2139 StructuredList, StructuredIndex,
true,
2145 if (elementIndex.getBitWidth() > maxElements.getBitWidth())
2146 maxElements = maxElements.extend(elementIndex.getBitWidth());
2147 else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
2148 elementIndex = elementIndex.extend(maxElements.getBitWidth());
2149 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2153 if (!maxElementsKnown && elementIndex > maxElements)
2154 maxElements = elementIndex;
2161 if (maxElementsKnown && elementIndex == maxElements)
2165 SemaRef.
Context, StructuredIndex, Entity);
2167 unsigned EmbedElementIndexBeforeInit = CurEmbedIndex;
2169 CheckSubElementType(ElementEntity, IList, elementType, Index,
2170 StructuredList, StructuredIndex);
2175 elementIndex + CurEmbedIndex - EmbedElementIndexBeforeInit - 1;
2177 auto Embed = cast<EmbedExpr>(
Init);
2179 EmbedElementIndexBeforeInit - 1;
2185 if (!maxElementsKnown && elementIndex > maxElements)
2186 maxElements = elementIndex;
2191 llvm::APSInt
Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
2195 SemaRef.
Diag(IList->
getBeginLoc(), diag::ext_typecheck_zero_array_size);
2199 elementType, maxElements,
nullptr, ArraySizeModifier::Normal, 0);
2206 if ((maxElementsKnown && elementIndex < maxElements) ||
2208 CheckEmptyInitializable(
2217 bool TopLevelObject) {
2219 unsigned FlexArrayDiag;
2220 if (isa<InitListExpr>(InitExpr) &&
2221 cast<InitListExpr>(InitExpr)->getNumInits() == 0) {
2223 FlexArrayDiag = diag::ext_flexible_array_init;
2224 }
else if (!TopLevelObject) {
2226 FlexArrayDiag = diag::err_flexible_array_init;
2229 FlexArrayDiag = diag::err_flexible_array_init;
2230 }
else if (cast<VarDecl>(Entity.
getDecl())->hasLocalStorage()) {
2232 FlexArrayDiag = diag::err_flexible_array_init;
2235 FlexArrayDiag = diag::ext_flexible_array_init;
2241 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
2245 return FlexArrayDiag != diag::ext_flexible_array_init;
2249 return StructuredList && StructuredList->
getNumInits() == 1U;
2252void InitListChecker::CheckStructUnionTypes(
2255 bool SubobjectIsDesignatorContext,
unsigned &Index,
2256 InitListExpr *StructuredList,
unsigned &StructuredIndex,
2257 bool TopLevelObject) {
2258 const RecordDecl *RD = getRecordDecl(DeclType);
2280 if (isa<CXXRecordDecl>(RD) &&
2281 cast<CXXRecordDecl>(RD)->hasInClassInitializer()) {
2282 if (!StructuredList)
2285 Field != FieldEnd; ++Field) {
2286 if (
Field->hasInClassInitializer() ||
2287 (
Field->isAnonymousStructOrUnion() &&
2288 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
2294 llvm_unreachable(
"Couldn't find in-class initializer");
2300 Field != FieldEnd; ++Field) {
2301 if (!
Field->isUnnamedBitField()) {
2302 CheckEmptyInitializable(
2313 bool InitializedSomething =
false;
2316 for (
auto I = Bases.begin(),
E = Bases.end(); I !=
E; ++I) {
2322 if (isa_and_nonnull<DesignatedInitExpr>(
Init))
2339 if (AggrDeductionCandidateParamTypes &&
Base.isPackExpansion()) {
2340 AggrDeductionCandidateParamTypes->push_back(
2345 if (Index < IList->getNumInits())
2357 CheckSubElementType(BaseEntity, IList,
Base.getType(), Index,
2358 StructuredList, StructuredIndex);
2359 InitializedSomething =
true;
2361 CheckEmptyInitializable(BaseEntity, InitLoc);
2376 size_t NumRecordDecls = llvm::count_if(RD->
decls(), [&](
const Decl *
D) {
2377 return isa<FieldDecl>(D) || isa<RecordDecl>(D);
2379 bool HasDesignatedInit =
false;
2383 while (Index < IList->getNumInits()) {
2391 if (!SubobjectIsDesignatorContext)
2394 HasDesignatedInit =
true;
2398 bool DesignatedInitFailed = CheckDesignatedInitializer(
2399 Entity, IList, DIE, 0, DeclType, &Field,
nullptr, Index,
2400 StructuredList, StructuredIndex,
true, TopLevelObject);
2401 if (DesignatedInitFailed)
2406 if (!VerifyOnly &&
D->isFieldDesignator()) {
2408 InitializedFields.insert(F);
2409 if (!DesignatedInitFailed) {
2418 InitializedSomething =
true;
2435 if (NumRecordDecls == 1)
2437 if (
const auto *IL = dyn_cast<IntegerLiteral>(I))
2438 return IL->getValue().isZero();
2446 SemaRef.
Diag(InitLoc, diag::err_non_designated_init_used);
2451 if (Field == FieldEnd) {
2457 if (InitializedSomething && RD->
isUnion())
2461 if (
Field->getType()->isIncompleteArrayType())
2464 if (
Field->isUnnamedBitField()) {
2473 InvalidUse = !SemaRef.
CanUseDecl(*Field, TreatUnavailableAsInvalid);
2494 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
2495 StructuredList, StructuredIndex);
2496 InitializedSomething =
true;
2497 InitializedFields.insert(*Field);
2509 bool IsCDesignatedInitializer =
2510 HasDesignatedInit && !SemaRef.
getLangOpts().CPlusPlus;
2511 if (!VerifyOnly && InitializedSomething && !RD->
isUnion() &&
2513 !IsCDesignatedInitializer) {
2520 if (HasDesignatedInit && InitializedFields.count(*it))
2523 if (!it->isUnnamedBitField() && !it->hasInClassInitializer() &&
2524 !it->getType()->isIncompleteArrayType()) {
2525 auto Diag = HasDesignatedInit
2526 ? diag::warn_missing_designated_field_initializers
2527 : diag::warn_missing_field_initializers;
2536 if (!StructuredList && Field != FieldEnd && !RD->
isUnion() &&
2537 !
Field->getType()->isIncompleteArrayType()) {
2538 for (;
Field != FieldEnd && !hadError; ++
Field) {
2539 if (!
Field->isUnnamedBitField() && !
Field->hasInClassInitializer())
2540 CheckEmptyInitializable(
2561 if (Field == FieldEnd || !
Field->getType()->isIncompleteArrayType() ||
2565 if (CheckFlexibleArrayInit(Entity, IList->
getInit(Index), *Field,
2575 if (isa<InitListExpr>(IList->
getInit(Index)) ||
2576 AggrDeductionCandidateParamTypes)
2577 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
2578 StructuredList, StructuredIndex);
2580 CheckImplicitInitList(MemberEntity, IList,
Field->getType(), Index,
2581 StructuredList, StructuredIndex);
2602 PE = IndirectField->
chain_end(); PI != PE; ++PI) {
2610 assert(isa<FieldDecl>(*PI));
2611 Replacements.back().setFieldDecl(cast<FieldDecl>(*PI));
2618 &Replacements[0] + Replacements.size());
2625 for (
unsigned I = 0; I < NumIndexExprs; ++I)
2639 explicit FieldInitializerValidatorCCC(
const RecordDecl *RD)
2647 std::unique_ptr<CorrectionCandidateCallback>
clone()
override {
2648 return std::make_unique<FieldInitializerValidatorCCC>(*
this);
2701 llvm::APSInt *NextElementIndex,
2704 unsigned &StructuredIndex,
2705 bool FinishSubobjectInit,
2706 bool TopLevelObject) {
2707 if (DesigIdx == DIE->
size()) {
2714 assert(isa<InitListExpr>(
Init) &&
2715 "designator result in direct non-list initialization?");
2720 if (StructuredList) {
2724 UpdateStructuredListElement(StructuredList, StructuredIndex,
2728 if (AggrDeductionCandidateParamTypes)
2729 AggrDeductionCandidateParamTypes->push_back(CurrentObjectType);
2734 bool prevHadError = hadError;
2739 unsigned OldIndex = Index;
2742 CheckSubElementType(Entity, IList, CurrentObjectType, Index, StructuredList,
2743 StructuredIndex,
true);
2749 IList->
setInit(OldIndex, DIE);
2751 return hadError && !prevHadError;
2755 bool IsFirstDesignator = (DesigIdx == 0);
2756 if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
2759 if (IsFirstDesignator)
2760 StructuredList = FullyStructuredList;
2762 Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2763 StructuredList->getInit(StructuredIndex) :
nullptr;
2764 if (!ExistingInit && StructuredList->hasArrayFiller())
2765 ExistingInit = StructuredList->getArrayFiller();
2768 StructuredList = getStructuredSubobjectInit(
2769 IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
2771 else if (
InitListExpr *Result = dyn_cast<InitListExpr>(ExistingInit))
2772 StructuredList = Result;
2785 diagnoseInitOverride(ExistingInit,
2792 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2793 StructuredList =
E->getUpdater();
2798 StructuredList->updateInit(SemaRef.
Context, StructuredIndex, DIUE);
2807 StructuredList =
nullptr;
2813 if (
D->isFieldDesignator()) {
2823 RecordDecl *RD = getRecordDecl(CurrentObjectType);
2827 Loc =
D->getFieldLoc();
2829 SemaRef.
Diag(
Loc, diag::err_field_designator_non_aggr)
2830 << SemaRef.
getLangOpts().CPlusPlus << CurrentObjectType;
2839 if (
auto *FD = dyn_cast_if_present<FieldDecl>(VD)) {
2841 }
else if (
auto *IFD = dyn_cast_if_present<IndirectFieldDecl>(VD)) {
2847 KnownField = cast<FieldDecl>(*IFD->chain_begin());
2864 SemaRef.
Diag(
D->getFieldLoc(), diag::err_field_designator_nonfield)
2866 SemaRef.
Diag(Lookup.front()->getLocation(),
2867 diag::note_field_designator_found);
2874 FieldInitializerValidatorCCC CCC(RD);
2881 SemaRef.
PDiag(diag::err_field_designator_unknown_suggest)
2882 << FieldName << CurrentObjectType);
2883 KnownField = Corrected.getCorrectionDeclAs<
FieldDecl>();
2894 SemaRef.
Diag(
Loc, diag::err_field_designator_unknown)
2902 unsigned NumBases = 0;
2903 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2904 NumBases = CXXRD->getNumBases();
2906 unsigned FieldIndex = NumBases;
2908 for (
auto *FI : RD->
fields()) {
2909 if (FI->isUnnamedBitField())
2925 if (StructuredList) {
2926 FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
2928 assert(StructuredList->getNumInits() == 1
2929 &&
"A union should never have more than one initializer!");
2931 Expr *ExistingInit = StructuredList->getInit(0);
2934 diagnoseInitOverride(
2942 StructuredList->resizeInits(SemaRef.
Context, 0);
2943 StructuredList->setInitializedFieldInUnion(
nullptr);
2946 StructuredList->setInitializedFieldInUnion(*Field);
2953 InvalidUse = !SemaRef.
CanUseDecl(*Field, TreatUnavailableAsInvalid);
2976 if (IsFirstDesignator && !VerifyOnly && SemaRef.
getLangOpts().CPlusPlus &&
2979 (*NextField)->getFieldIndex() >
Field->getFieldIndex() + 1)) {
2983 if (FI->isUnnamedBitField())
2994 diag::ext_designated_init_reordered)
2997 unsigned OldIndex = StructuredIndex - 1;
2998 if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
2999 if (
Expr *PrevInit = StructuredList->getInit(OldIndex)) {
3000 SemaRef.
Diag(PrevInit->getBeginLoc(),
3001 diag::note_previous_field_init)
3011 D->setFieldDecl(*Field);
3015 if (StructuredList && FieldIndex >= StructuredList->getNumInits())
3016 StructuredList->resizeInits(SemaRef.
Context, FieldIndex + 1);
3019 if (
Field->getType()->isIncompleteArrayType()) {
3021 if ((DesigIdx + 1) != DIE->
size()) {
3028 diag::err_designator_into_flexible_array_member)
3030 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
3036 if (!hadError && !isa<InitListExpr>(DIE->
getInit()) &&
3037 !isa<StringLiteral>(DIE->
getInit())) {
3041 diag::err_flexible_array_init_needs_braces)
3043 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
3050 if (!
Invalid && CheckFlexibleArrayInit(Entity, DIE->
getInit(), *Field,
3060 bool prevHadError = hadError;
3061 unsigned newStructuredIndex = FieldIndex;
3062 unsigned OldIndex = Index;
3067 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
3068 StructuredList, newStructuredIndex);
3070 IList->
setInit(OldIndex, DIE);
3071 if (hadError && !prevHadError) {
3076 StructuredIndex = FieldIndex;
3082 unsigned newStructuredIndex = FieldIndex;
3086 if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
3087 FieldType,
nullptr,
nullptr, Index,
3088 StructuredList, newStructuredIndex,
3089 FinishSubobjectInit,
false))
3100 if (IsFirstDesignator) {
3107 StructuredIndex = FieldIndex;
3111 if (!FinishSubobjectInit)
3119 bool prevHadError = hadError;
3124 CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
3125 false, Index, StructuredList, FieldIndex);
3126 return hadError && !prevHadError;
3147 SemaRef.
Diag(
D->getLBracketLoc(), diag::err_array_designator_non_array)
3148 << CurrentObjectType;
3153 Expr *IndexExpr =
nullptr;
3154 llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
3155 if (
D->isArrayDesignator()) {
3158 DesignatedEndIndex = DesignatedStartIndex;
3160 assert(
D->isArrayRangeDesignator() &&
"Need array-range designator");
3162 DesignatedStartIndex =
3164 DesignatedEndIndex =
3173 if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
3178 if (isa<ConstantArrayType>(AT)) {
3179 llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(),
false);
3180 DesignatedStartIndex
3181 = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
3182 DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
3184 = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
3185 DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
3186 if (DesignatedEndIndex >= MaxElements) {
3189 diag::err_array_designator_too_large)
3196 unsigned DesignatedIndexBitWidth =
3198 DesignatedStartIndex =
3199 DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
3200 DesignatedEndIndex =
3201 DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
3202 DesignatedStartIndex.setIsUnsigned(
true);
3203 DesignatedEndIndex.setIsUnsigned(
true);
3206 bool IsStringLiteralInitUpdate =
3207 StructuredList && StructuredList->isStringLiteralInit();
3208 if (IsStringLiteralInitUpdate && VerifyOnly) {
3211 StructuredList =
nullptr;
3212 }
else if (IsStringLiteralInitUpdate) {
3225 unsigned PromotedCharTyWidth = Context.
getTypeSize(PromotedCharTy);
3230 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3231 StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3232 StructuredList->resizeInits(Context, StrLen);
3236 for (
unsigned i = 0, e = StrLen; i != e; ++i) {
3237 llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
3239 Context, CodeUnit, PromotedCharTy, SubExpr->
getExprLoc());
3240 if (CharTy != PromotedCharTy)
3244 StructuredList->updateInit(Context, i,
Init);
3253 if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen))
3254 StrLen = cast<ConstantArrayType>(AT)->getZExtSize();
3255 StructuredList->resizeInits(Context, StrLen);
3259 for (
unsigned i = 0, e = StrLen; i != e; ++i) {
3260 llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
3262 Context, CodeUnit, PromotedCharTy, SubExpr->
getExprLoc());
3263 if (CharTy != PromotedCharTy)
3267 StructuredList->updateInit(Context, i,
Init);
3274 if (StructuredList &&
3275 DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
3276 StructuredList->resizeInits(SemaRef.
Context,
3277 DesignatedEndIndex.getZExtValue() + 1);
3283 unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
3284 unsigned OldIndex = Index;
3289 while (DesignatedStartIndex <= DesignatedEndIndex) {
3295 if (CheckDesignatedInitializer(
3296 ElementEntity, IList, DIE, DesigIdx + 1, ElementType,
nullptr,
3297 nullptr, Index, StructuredList, ElementIndex,
3298 FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
3303 ++DesignatedStartIndex;
3304 ElementIndex = DesignatedStartIndex.getZExtValue();
3309 if (IsFirstDesignator) {
3310 if (NextElementIndex)
3311 *NextElementIndex = DesignatedStartIndex;
3312 StructuredIndex = ElementIndex;
3316 if (!FinishSubobjectInit)
3320 bool prevHadError = hadError;
3321 CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
3323 StructuredList, ElementIndex);
3324 return hadError && !prevHadError;
3330InitListChecker::getStructuredSubobjectInit(
InitListExpr *IList,
unsigned Index,
3333 unsigned StructuredIndex,
3335 bool IsFullyOverwritten) {
3336 if (!StructuredList)
3339 Expr *ExistingInit =
nullptr;
3340 if (StructuredIndex < StructuredList->getNumInits())
3341 ExistingInit = StructuredList->
getInit(StructuredIndex);
3343 if (
InitListExpr *Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
3352 if (!IsFullyOverwritten)
3375 diagnoseInitOverride(ExistingInit, InitRange);
3378 unsigned ExpectedNumInits = 0;
3379 if (Index < IList->getNumInits()) {
3380 if (
auto *
Init = dyn_cast_or_null<InitListExpr>(IList->
getInit(Index)))
3381 ExpectedNumInits =
Init->getNumInits();
3387 createInitListExpr(CurrentObjectType, InitRange, ExpectedNumInits);
3396InitListChecker::createInitListExpr(
QualType CurrentObjectType,
3398 unsigned ExpectedNumInits) {
3402 QualType ResultType = CurrentObjectType;
3405 Result->setType(ResultType);
3408 unsigned NumElements = 0;
3413 NumElements = CAType->getZExtSize();
3416 if (NumElements > ExpectedNumInits)
3420 NumElements = VType->getNumElements();
3422 NumElements = numStructUnionElements(CurrentObjectType);
3427 Result->reserveInits(SemaRef.
Context, NumElements);
3434void InitListChecker::UpdateStructuredListElement(
InitListExpr *StructuredList,
3435 unsigned &StructuredIndex,
3438 if (!StructuredList)
3442 StructuredIndex,
expr)) {
3448 diagnoseInitOverride(PrevInit,
expr->getSourceRange());
3457 InitListChecker Check(*
this, Entity, From,
Type,
true,
3460 return !Check.HadError();
3481 return S.
Diag(
Loc, diag::err_array_designator_negative)
3484 Value.setIsUnsigned(
true);
3502 if (
D.isFieldDesignator()) {
3503 Designators.push_back(ASTDesignator::CreateFieldDesignator(
3504 D.getFieldDecl(),
D.getDotLoc(),
D.getFieldLoc()));
3505 }
else if (
D.isArrayDesignator()) {
3506 Expr *Index =
static_cast<Expr *
>(
D.getArrayIndex());
3507 llvm::APSInt IndexValue;
3508 if (!Index->isTypeDependent() && !Index->isValueDependent())
3513 Designators.push_back(ASTDesignator::CreateArrayDesignator(
3514 InitExpressions.size(),
D.getLBracketLoc(),
D.getRBracketLoc()));
3515 InitExpressions.push_back(Index);
3517 }
else if (
D.isArrayRangeDesignator()) {
3518 Expr *StartIndex =
static_cast<Expr *
>(
D.getArrayRangeStart());
3519 Expr *EndIndex =
static_cast<Expr *
>(
D.getArrayRangeEnd());
3520 llvm::APSInt StartValue;
3521 llvm::APSInt EndValue;
3526 if (!StartDependent)
3532 if (!StartIndex || !EndIndex)
3536 if (StartDependent || EndDependent) {
3538 }
else if (StartValue.getBitWidth() > EndValue.getBitWidth())
3539 EndValue = EndValue.extend(StartValue.getBitWidth());
3540 else if (StartValue.getBitWidth() < EndValue.getBitWidth())
3541 StartValue = StartValue.extend(EndValue.getBitWidth());
3543 if (!StartDependent && !EndDependent && EndValue < StartValue) {
3544 Diag(
D.getEllipsisLoc(), diag::err_array_designator_empty_range)
3549 Designators.push_back(ASTDesignator::CreateArrayRangeDesignator(
3550 InitExpressions.size(),
D.getLBracketLoc(),
D.getEllipsisLoc(),
3551 D.getRBracketLoc()));
3552 InitExpressions.push_back(StartIndex);
3553 InitExpressions.push_back(EndIndex);
3563 EqualOrColonLoc, GNUSyntax,
3571InitializedEntity::InitializedEntity(
ASTContext &Context,
unsigned Index,
3576 Kind = EK_ArrayElement;
3579 Kind = EK_VectorElement;
3583 assert(CT &&
"Unexpected type");
3584 Kind = EK_ComplexElement;
3592 bool IsInheritedVirtualBase,
3597 Result.Base = {
Base, IsInheritedVirtualBase};
3615 return Variable.VariableOrMember->getDeclName();
3637 llvm_unreachable(
"Invalid EntityKind!");
3671 llvm_unreachable(
"Invalid EntityKind!");
3706unsigned InitializedEntity::dumpImpl(raw_ostream &OS)
const {
3709 for (
unsigned I = 0; I != Depth; ++I)
3726 case EK_New: OS <<
"New";
break;
3730 case EK_Base: OS <<
"Base";
break;
3737 OS <<
"Block (lambda)";
3740 OS <<
"LambdaCapture ";
3747 D->printQualifiedName(OS);
3750 OS <<
" '" <<
getType() <<
"'\n";
3756 dumpImpl(llvm::errs());
3811 for (
const Step &S : llvm::reverse(Steps)) {
3871 llvm_unreachable(
"Invalid EntityKind!");
3879InitializationSequence
3882 bool HadMultipleCandidates) {
3886 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3888 S.Function.FoundDecl =
Found;
3907 bool BindingTemporary) {
3932 bool HadMultipleCandidates) {
3936 S.Function.HadMultipleCandidates = HadMultipleCandidates;
3938 S.Function.FoundDecl = FoundDecl;
3977 bool TopLevelOfInitList) {
3995 bool HadMultipleCandidates,
bool FromInitList,
bool AsInitList) {
4001 S.Function.HadMultipleCandidates = HadMultipleCandidates;
4002 S.Function.Function = Constructor;
4003 S.Function.FoundDecl = FoundDecl;
4046 Steps.insert(Steps.begin(), S);
4107 "Can only unwrap trivial init lists.");
4111 Steps.insert(Steps.begin(), S);
4117 "Can only rewrap trivial init lists.");
4121 Steps.insert(Steps.begin(), S);
4125 S.WrappingSyntacticList = Syntactic;
4132 this->Failure = Failure;
4133 this->FailedOverloadResult =
Result;
4154 if (!
Init.empty()) {
4174 "consuming an object of unretainable type?");
4194 bool TreatUnavailableAsInvalid) {
4209 Expr *OVEAsExpr = &OVE;
4212 TreatUnavailableAsInvalid);
4222 bool TreatUnavailableAsInvalid);
4233 bool TreatUnavailableAsInvalid) {
4247 List->getNumInits()),
4252 List->getExprLoc(), List->getBeginLoc(), List->getEndLoc());
4254 TreatUnavailableAsInvalid);
4281 bool CopyInitializing,
bool AllowExplicit,
bool OnlyListConstructors,
4282 bool IsListInit,
bool RequireActualConstructor,
4283 bool SecondStepOfCopyInit =
false) {
4289 if (!Info.Constructor || Info.Constructor->isInvalidDecl())
4306 bool SuppressUserConversions =
4307 SecondStepOfCopyInit ||
4308 (IsListInit && Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
4311 if (Info.ConstructorTmpl)
4313 Info.ConstructorTmpl, Info.FoundDecl,
4314 nullptr, Args, CandidateSet, SuppressUserConversions,
4315 false, AllowExplicit);
4324 bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
4328 CandidateSet, SuppressUserConversions,
4329 false, AllowExplicit,
4345 if (S.
getLangOpts().CPlusPlus17 && Args.size() == 1 &&
4346 !RequireActualConstructor && !SecondStepOfCopyInit) {
4348 auto *SourceRD =
Initializer->getType()->getAsCXXRecordDecl();
4350 const auto &Conversions = SourceRD->getVisibleConversionFunctions();
4351 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
4354 D =
D->getUnderlyingDecl();
4361 Conv = cast<CXXConversionDecl>(
D);
4365 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
4366 CandidateSet, AllowExplicit, AllowExplicit,
4370 DestType, CandidateSet, AllowExplicit,
4397 bool IsListInit =
false,
4398 bool IsInitListCopy =
false) {
4399 assert(((!IsListInit && !IsInitListCopy) ||
4400 (Args.size() == 1 && isa<InitListExpr>(Args[0]))) &&
4401 "IsListInit/IsInitListCopy must come with a single initializer list "
4404 (IsListInit || IsInitListCopy) ? cast<InitListExpr>(Args[0]) :
nullptr;
4414 bool RequireActualConstructor =
4420 bool CopyElisionPossible =
false;
4421 auto ElideConstructor = [&] {
4437 if (S.
getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
4438 UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
4460 assert(!IsInitListCopy &&
4461 "IsInitListCopy only possible with aggregate types");
4462 CopyElisionPossible =
true;
4470 assert(DestRecordType &&
"Constructor initialization requires record type");
4472 = cast<CXXRecordDecl>(DestRecordType->
getDecl());
4480 bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
4490 bool AsInitializerList =
false;
4502 AsInitializerList =
true;
4508 S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
4509 CopyInitialization, AllowExplicit,
4510 true, IsListInit, RequireActualConstructor);
4525 AsInitializerList =
false;
4527 S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4528 Best, CopyInitialization, AllowExplicit,
4529 false, IsListInit, RequireActualConstructor);
4541 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4545 if (
auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4547 QualType ConvType = CD->getConversionType();
4549 "should not have selected this conversion function");
4551 HadMultipleCandidates);
4582 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->
isExplicit()) {
4602 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4603 IsListInit | IsInitListCopy, AsInitializerList);
4616 bool HadMultipleCandidates =
false;
4619 UnqualifiedTargetType,
4621 &HadMultipleCandidates)) {
4623 HadMultipleCandidates);
4624 SourceType = Fn->getType();
4643 bool TopLevelOfInitList);
4657 bool TreatUnavailableAsInvalid) {
4697 T1Quals, cv2T2, T2, T2Quals, Sequence,
4728 TreatUnavailableAsInvalid);
4760 bool TreatUnavailableAsInvalid) {
4772 TreatUnavailableAsInvalid);
4810 !IsDesignatedInit) {
4815 Expr *InitListAsExpr = InitList;
4834 if (isa<ConstantArrayType>(DestAT) &&
4836 isa<DecompositionDecl>(Entity.
getDecl())) {
4839 "Deduced to other type?");
4843 Entity, SubInit[0], DestType, Sequence,
4844 TreatUnavailableAsInvalid);
4850 if (!isa<VariableArrayType>(DestAT) &&
4860 TreatUnavailableAsInvalid);
4893 TreatUnavailableAsInvalid))
4897 Expr *InitListAsExpr = InitList;
4899 DestType, Sequence,
true);
4917 ET && ET->getDecl()->isFixed() &&
4966 if (
Init->getType()->isRecordType() ||
4977 TreatUnavailableAsInvalid);
4984 InitListChecker CheckInitList(S, Entity, InitList,
4985 DestType,
true, TreatUnavailableAsInvalid);
4986 if (CheckInitList.HadError()) {
5008 "Must have incompatible references when binding via conversion");
5019 bool AllowExplicitCtors =
false;
5020 bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
5031 if (!Info.Constructor)
5034 if (!Info.Constructor->isInvalidDecl() &&
5035 Info.Constructor->isConvertingConstructor(
true)) {
5036 if (Info.ConstructorTmpl)
5038 Info.ConstructorTmpl, Info.FoundDecl,
5041 false, AllowExplicitCtors);
5044 Info.Constructor, Info.FoundDecl,
Initializer, CandidateSet,
5046 false, AllowExplicitCtors);
5061 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
5064 if (isa<UsingShadowDecl>(
D))
5065 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
5072 Conv = cast<CXXConversionDecl>(
D);
5080 if ((AllowRValues ||
5084 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
5086 false, AllowExplicitConvs);
5089 Conv, I.getPair(), ActingDC,
Initializer, DestType, CandidateSet,
5090 false, AllowExplicitConvs);
5112 if (isa<CXXConversionDecl>(
Function))
5125 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5127 HadMultipleCandidates);
5137 assert(!isa<CXXConstructorDecl>(
Function) &&
5138 "should not have conversion after constructor");
5142 ICS.
Standard = Best->FinalConversion;
5163 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5165 else if (RefConv & Sema::ReferenceConversions::ObjC)
5167 else if (RefConv & Sema::ReferenceConversions::Function)
5169 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5186 bool TopLevelOfInitList) {
5204 T1Quals, cv2T2, T2, T2Quals, Sequence,
5205 TopLevelOfInitList);
5229 bool TopLevelOfInitList) {
5253 if (isLValueRef || T1Function) {
5256 (Kind.isCStyleOrFunctionalCast() &&
5260 if (RefConv & (Sema::ReferenceConversions::DerivedToBase |
5261 Sema::ReferenceConversions::ObjC)) {
5264 if (RefConv & (Sema::ReferenceConversions::Qualification))
5268 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5272 }
else if (RefConv & Sema::ReferenceConversions::Qualification) {
5276 }
else if (RefConv & Sema::ReferenceConversions::Function) {
5296 (isLValueRef || InitCategory.
isRValue())) {
5301 isLValueRef, Sequence);
5336 switch (RefRelationship) {
5348 llvm_unreachable(
"unexpected kind of compatible initializer");
5372 (Kind.isCStyleOrFunctionalCast() &&
5401 auto T1QualsIgnoreAS = T1Quals;
5402 auto T2QualsIgnoreAS = T2Quals;
5405 T2QualsIgnoreAS.removeAddressSpace();
5408 if (T1QualsIgnoreAS != T2QualsIgnoreAS)
5418 cv1T4 = cv1T4WithAS;
5423 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5425 else if (RefConv & Sema::ReferenceConversions::ObjC)
5427 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5444 isLValueRef, Sequence);
5484 Sema::AllowedExplicit::None,
5486 Kind.isCStyleOrFunctionalCast(),
5505 TopLevelOfInitList);
5514 ((T1CVRQuals | T2CVRQuals) != T1CVRQuals ||
5559 assert((!InitList || InitList->
getNumInits() == 0) &&
5560 "Shouldn't use value-init for non-empty init lists");
5566 assert(!
T->
isVoidType() &&
"Cannot value-init void");
5572 if (
CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
5573 bool NeedZeroInitialization =
true;
5588 NeedZeroInitialization =
false;
5596 if (NeedZeroInitialization)
5610 ClassDecl->hasUninitializedReferenceMember()) {
5618 Expr *InitListAsExpr = InitList;
5620 bool InitListSyntax = InitList;
5625 S, Entity, Kind, Args,
T, Entity.
getType(), Sequence, InitListSyntax);
5675 unsigned EntityIndexToProcess = 0;
5678 Expr *ArrayFiller =
nullptr;
5679 FieldDecl *InitializedFieldInUnion =
nullptr;
5683 Expr *Arg,
Expr **InitExpr =
nullptr) {
5685 S, SubEntity, SubKind,
5701 ER = IS.
Perform(S, SubEntity, SubKind,
5708 *InitExpr = ER.
get();
5710 InitExprs.push_back(ER.
get());
5718 uint64_t ArrayLength;
5726 ArrayLength = CAT->getZExtSize();
5727 ResultType = Entity.
getType();
5734 const Expr *SE = VAT->getSizeExpr();
5740 ArrayLength = Args.size();
5742 EntityIndexToProcess = ArrayLength;
5746 for (
Expr *
E : Args) {
5751 if (!HandleInitializedEntity(SubEntity, SubKind,
E))
5759 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
true);
5760 if (!HandleInitializedEntity(SubEntity, SubKind,
nullptr, &ArrayFiller))
5764 if (ResultType.
isNull()) {
5771 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
5785 if (EntityIndexToProcess < Args.size()) {
5791 Expr *
E = Args[EntityIndexToProcess];
5794 if (!HandleInitializedEntity(SubEntity, SubKind,
E))
5802 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
5804 if (!HandleInitializedEntity(SubEntity, SubKind,
nullptr))
5807 EntityIndexToProcess++;
5820 if (EntityIndexToProcess < Args.size()) {
5822 Expr *
E = Args[EntityIndexToProcess];
5840 if (!HandleInitializedEntity(SubEntity, SubKind,
E))
5848 InitializedFieldInUnion = FD;
5849 EntityIndexToProcess = 1;
5861 Kind.getParenOrBraceRange().getEnd(), FD);
5865 InitExprs.push_back(DIE.
get());
5875 S.
Diag(SR.
getEnd(), diag::err_init_reference_member_uninitialized)
5882 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
true);
5883 if (!HandleInitializedEntity(SubEntity, SubKind,
nullptr))
5887 EntityIndexToProcess++;
5889 ResultType = Entity.
getType();
5894 if (EntityIndexToProcess < Args.size()) {
5899 SourceRange ExcessInitSR(Args[EntityIndexToProcess]->getBeginLoc(),
5900 Args.back()->getEndLoc());
5901 S.
Diag(Kind.getLocation(), diag::err_excess_initializers)
5902 << InitKind << ExcessInitSR;
5916 CPLIE->setArrayFiller(ArrayFiller);
5917 if (InitializedFieldInUnion)
5918 CPLIE->setInitializedFieldInUnion(InitializedFieldInUnion);
5920 S.
Diag(Kind.getLocation(),
5921 diag::warn_cxx17_compat_aggregate_init_paren_list)
5922 << Kind.getLocation() << SR << ResultType;
5934 bool TopLevelOfInitList) {
5935 assert(!DestType->
isReferenceType() &&
"References are handled elsewhere");
5938 "Must have a class type to perform a user-defined conversion");
5948 bool AllowExplicit = Kind.AllowExplicit();
5954 = cast<CXXRecordDecl>(DestRecordType->getDecl());
5960 if (!Info.Constructor)
5963 if (!Info.Constructor->isInvalidDecl() &&
5964 Info.Constructor->isConvertingConstructor(
true)) {
5965 if (Info.ConstructorTmpl)
5967 Info.ConstructorTmpl, Info.FoundDecl,
5970 false, AllowExplicit);
5975 false, AllowExplicit);
5991 = cast<CXXRecordDecl>(SourceRecordType->getDecl());
5993 const auto &Conversions =
5995 for (
auto I = Conversions.begin(),
E = Conversions.end(); I !=
E; ++I) {
5998 if (isa<UsingShadowDecl>(
D))
5999 D = cast<UsingShadowDecl>(
D)->getTargetDecl();
6006 Conv = cast<CXXConversionDecl>(
D);
6010 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
6011 CandidateSet, AllowExplicit, AllowExplicit);
6014 DestType, CandidateSet, AllowExplicit,
6040 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
6042 if (isa<CXXConstructorDecl>(
Function)) {
6048 HadMultipleCandidates);
6077 HadMultipleCandidates);
6090 Function->getReturnType()->isReferenceType() ||
6100 if (Best->FinalConversion.First || Best->FinalConversion.Second ||
6101 Best->FinalConversion.Third) {
6104 ICS.
Standard = Best->FinalConversion;
6122 isa<CXXBoolLiteralExpr>(
Init) &&
6123 !cast<CXXBoolLiteralExpr>(
Init)->getValue() &&
6132 bool isAddressOf,
bool &isWeakAccess) {
6138 if (op->getOpcode() == UO_AddrOf)
6143 }
else if (
CastExpr *ce = dyn_cast<CastExpr>(e)) {
6144 switch (ce->getCastKind()) {
6147 case CK_LValueBitCast:
6151 case CK_ArrayToPointerDecay:
6154 case CK_NullToPointer:
6162 }
else if (isa<DeclRefExpr>(e)) {
6166 isWeakAccess =
true;
6170 VarDecl *var = dyn_cast<VarDecl>(cast<DeclRefExpr>(e)->getDecl());
6184 }
else if (isa<ArraySubscriptExpr>(e)) {
6200 bool isWeakAccess =
false;
6204 if (S.
getLangOpts().ObjCAutoRefCount && isWeakAccess)
6236 bool ArrayDecay =
false;
6241 ArgPointee = ArgArrayType->getElementType();
6253 bool ShouldCopy =
true;
6324 "cl_intel_device_side_avc_motion_estimation", S.
getLangOpts()) &&
6326 if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
6327 DestType->isOCLIntelSubgroupAVCMceResultType())
6341 MultiExprArg Args,
bool TopLevelOfInitList,
bool TreatUnavailableAsInvalid)
6345 TreatUnavailableAsInvalid);
6351 auto *DRE = dyn_cast<DeclRefExpr>(
E);
6352 if (!DRE || !isa<FunctionDecl>(DRE->getDecl()))
6356 cast<FunctionDecl>(DRE->getDecl()));
6373 return isa<DecompositionDecl>(Entity.
getDecl());
6399 bool TopLevelOfInitList,
6400 bool TreatUnavailableAsInvalid) {
6407 for (
unsigned I = 0,
E = Args.size(); I !=
E; ++I)
6408 if (Args[I]->getType()->isNonOverloadPlaceholderType()) {
6415 Args[I] = result.
get();
6437 if (Args.size() == 1) {
6455 TreatUnavailableAsInvalid);
6467 if (Args.size() != 1)
6473 else if (isa<InitListExpr>(Args[0]))
6477 TopLevelOfInitList);
6503 if (
Initializer && isa<VariableArrayType>(DestAT)) {
6535 if (
Initializer && isa<ConstantArrayType>(DestAT) &&
6540 TreatUnavailableAsInvalid);
6548 isa<CompoundLiteralExpr>(
Initializer->IgnoreParens()) &&
6566 *
this, TreatUnavailableAsInvalid);
6568 }
else if (S.
getLangOpts().CPlusPlus20 && !TopLevelOfInitList &&
6584 bool allowObjCWritebackConversion = S.
getLangOpts().ObjCAutoRefCount &&
6593 assert(
Initializer &&
"Initializer must be non-null");
6595 if (allowObjCWritebackConversion &&
6621 SourceType, DestType))))) {
6628 if (
const auto *RD =
6633 S.
getLangOpts().CPlusPlus20 && RD && RD->hasDefinition() &&
6634 RD->isAggregate() &&
Failed() &&
6647 S, Kind.getLocation(), Best);
6665 assert(
Initializer &&
"Initializer must be non-null");
6667 TopLevelOfInitList);
6672 assert(Args.size() >= 1 &&
"Zero-argument case handled above");
6682 for (
auto *Arg : Args) {
6683 if (Arg->getType()->isExtVectorType()) {
6686 for (
unsigned Idx = 0; Idx < Elm; ++Idx) {
6692 VTy->getElementType(), Arg->
getValueKind(), Arg->getObjectKind(),
6696 InitArgs.emplace_back(Arg);
6706 if (Args.size() > 1) {
6709 }
else if (isa<InitListExpr>(Args[0])) {
6717 assert(
Initializer &&
"Initializer must be non-null");
6720 bool NeedAtomicConversion =
false;
6724 Atomic->getValueType())) {
6725 DestType =
Atomic->getValueType();
6726 NeedAtomicConversion =
true;
6731 TopLevelOfInitList);
6733 if (!
Failed() && NeedAtomicConversion)
6760 Sema::AllowedExplicit::None,
6762 Kind.isCStyleOrFunctionalCast(),
6763 allowObjCWritebackConversion);
6771 bool ShouldCopy =
true;
6787 }
else if (ICS.
isBad()) {
6795 else if (
Initializer->getType()->isFunctionType() &&
6808 for (
auto &S : Steps)
6816 bool Diagnose =
false) {
6867 llvm_unreachable(
"Invalid EntityKind!");
6901 llvm_unreachable(
"missed an InitializedEntity kind?");
6935 llvm_unreachable(
"missed an InitializedEntity kind?");
6974 llvm_unreachable(
"missed an InitializedEntity kind?");
7001 bool IsExtraneousCopy) {
7026 S,
Loc, CurInitExpr, CandidateSet,
T, Ctors, Best,
7038 ? diag::ext_rvalue_to_reference_temp_copy_no_viable
7039 : diag::err_temp_copy_no_viable)
7057 S.
Diag(
Loc, diag::err_temp_copy_deleted)
7064 bool HadMultipleCandidates = CandidateSet.
size() > 1;
7073 if (IsExtraneousCopy) {
7084 for (
unsigned I = 1, N = Constructor->getNumParams(); I != N; ++I) {
7087 diag::err_call_incomplete_argument))
7128 Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
7133 Loc,
T, Best->FoundDecl, Constructor, Elidable, ConstructorArgs,
7134 HadMultipleCandidates,
7150 Expr *CurInitExpr) {
7169 S,
Loc, CurInitExpr, CandidateSet, CurInitExpr->
getType(), Ctors, Best,
7182 Best->FoundDecl, Entity,
Diag);
7203void InitializationSequence::PrintInitLocationNote(
Sema &S,
7218 diag::note_method_return_type_change)
7236 switch (Kind.getKind()) {
7242 return NumArgs != 1;
7254 bool &ConstructorInitRequiresZeroInit,
7255 bool IsListInitialization,
7256 bool IsStdInitListInitialization,
7259 unsigned NumArgs = Args.size();
7267 ? Kind.getEqualLoc()
7268 : Kind.getLocation();
7274 assert(Constructor->getParent() &&
"No parent class for constructor.");
7275 if (Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
7276 Constructor->isTrivial() && !Constructor->isUsed(
false)) {
7291 bool AllowExplicitConv =
7292 Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
7297 if (NumArgs == 1 && !Kind.isExplicitCast())
7299 Entity.
getType(), Args.front()->getType(), Kind.getLocation());
7304 ConstructorArgs, AllowExplicitConv,
7305 IsListInitialization))
7319 : Kind.getParenOrBraceRange();
7322 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
7332 ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
7333 IsListInitialization, IsStdInitListInitialization,
7334 ConstructorInitRequiresZeroInit),
7350 if (IsListInitialization)
7351 ParenOrBraceRange =
SourceRange(LBraceLoc, RBraceLoc);
7353 ParenOrBraceRange = Kind.getParenOrBraceRange();
7362 HadMultipleCandidates,
7363 IsListInitialization,
7364 IsStdInitListInitialization,
7365 ConstructorInitRequiresZeroInit,
7373 HadMultipleCandidates,
7374 IsListInitialization,
7375 IsStdInitListInitialization,
7376 ConstructorInitRequiresZeroInit,
7407 const Expr *PostInit);
7414 bool IsReturnStmt) {
7425 unsigned DiagID = 0;
7455 if (VD->
hasAttr<BlocksAttr>())
7468 if (isa<ParmVarDecl>(VD))
7469 DiagID = diag::warn_redundant_move_on_return;
7471 DiagID = diag::warn_pessimizing_move_on_return;
7473 DiagID = diag::warn_pessimizing_move_on_initialization;
7515 if (UO->getOpcode() == UO_Deref &&
7516 UO->getSubExpr()->IgnoreParenCasts()->
7519 S.
PDiag(diag::warn_binding_null_to_reference)
7520 << UO->getSubExpr()->getSourceRange());
7526 bool BoundToLvalueReference) {
7569 if (!PointeeTy.isNull() &&
7570 PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7571 CK = CK_AddressSpaceConversion;
7573 CK = CK_AddressSpaceConversion;
7588 if (!ZeroInitializationFixit.empty()) {
7590 const auto *VD = dyn_cast_or_null<VarDecl>(
D);
7596 if (!DestType->
isRecordType() && VD && VD->isConstexpr()) {
7598 S.
Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
7601 ZeroInitializationFixit);
7603 unsigned DiagID = diag::err_default_init_const;
7605 DiagID = diag::ext_default_init_const;
7607 S.
Diag(Kind.getLocation(), DiagID)
7610 ZeroInitializationFixit);
7630 if (isa<InitListExpr>((
Expr *)Args[0])) {
7634 if (
auto *DD = dyn_cast_or_null<DeclaratorDecl>(Entity.
getDecl())) {
7636 TypeLoc TL = TInfo->getTypeLoc();
7639 Brackets = ArrayLoc.getBracketsRange();
7646 ArrayT->getSizeModifier(),
7647 ArrayT->getIndexTypeCVRQualifiers(),
7654 !Kind.isExplicitCast()) {
7656 SourceRange ParenRange = Kind.getParenOrBraceRange();
7661 Kind.isExplicitCast() ||
7671 Args.size() == 1 && isa<InitListExpr>(Args[0]) &&
7677 S.
Diag(
Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7678 <<
Init->getSourceRange();
7681 if (S.
getLangOpts().MicrosoftExt && Args.size() == 1 &&
7687 S.
Diag(
Init->getBeginLoc(), diag::ext_init_from_predefined) <<
Init;
7698 S.
Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
7718 isa<InitListExpr>(Args[0]);
7719 (void)IsHLSLVectorInit;
7724 switch (Steps.front().Kind) {
7758 assert(Args.size() == 1 || IsHLSLVectorInit);
7777 isa_and_nonnull<InitListExpr>(CurInit.
get()));
7782 auto checkAbstractType = [&](
QualType T) ->
bool {
7787 diag::err_allocation_of_abstract_type);
7792 bool ConstructorInitRequiresZeroInit =
false;
7825 bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
7837 CK_DerivedToBase, CurInit.
get(),
7853 if (
auto *DRE = dyn_cast<DeclRefExpr>(CurInit.
get()->
IgnoreParens())) {
7854 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
7867 assert(CurInit.
get()->
isPRValue() &&
"not a temporary");
7925 bool CreatedObject =
false;
7941 Loc,
Step->
Type, FoundFn, Constructor, ConstructorArgs,
7942 HadMultipleCandidates,
7954 CastKind = CK_ConstructorConversion;
7955 CreatedObject =
true;
7965 HadMultipleCandidates);
7969 CastKind = CK_UserDefinedConversion;
7973 if (CreatedObject && checkAbstractType(CurInit.
get()->
getType()))
7994 S.
PDiag(diag::err_access_dtor_temp) <<
T);
8018 "function reference should be lvalue");
8024 assert(CurInit.
get()->
isPRValue() &&
"cannot convert glvalue to atomic");
8032 if (
const auto *FromPtrType =
8035 if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
8036 !ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
8039 if (!Kind.isStaticCast()) {
8041 diag::warn_noderef_to_dereferenceable_pointer)
8060 CurInit = CurInitExprRes;
8081 InitListChecker PerformInitList(S, InitEntity,
8082 InitList, Ty,
false,
8084 if (PerformInitList.HadError())
8092 if ((*ResultType)->isRValueReferenceType())
8094 else if ((*ResultType)->isLValueReferenceType())
8101 PerformInitList.getFullyStructuredList();
8105 : StructuredInitList;
8122 assert(Args.size() == 1 &&
"expected a single argument for list init");
8124 S.
Diag(InitList->
getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8130 ConstructorInitRequiresZeroInit,
8139 CurInit = cast<InitListExpr>(CurInit.
get())->getInit(0);
8168 bool IsStdInitListInit =
8172 ? Kind.getParenOrBraceRange()
8175 S, UseTemporary ? TempEntity : Entity, Kind,
8177 ConstructorInitRequiresZeroInit,
8188 if (NextStep != StepEnd &&
8193 ConstructorInitRequiresZeroInit =
true;
8196 !Kind.isImplicitValueInit()) {
8200 Kind.getRange().getBegin());
8204 Kind.getRange().getEnd());
8234 CurInit = CurInitExprRes;
8249 S.
Diag(Kind.getLocation(), diag::err_c23_constexpr_pointer_not_null);
8256 InitialCurInit.
get(),
8259 PrintInitLocationNote(S, Entity);
8261 }
else if (Complained)
8262 PrintInitLocationNote(S, Entity);
8278 CK_ObjCObjectLValueCast,
8290 BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8291 ArrayLoopCommonExprs.push_back(BaseExpr);
8296 assert(!ArrayLoopCommonExprs.empty() &&
8297 "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8298 Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8307 S.
Diag(Kind.getLocation(), diag::ext_array_init_copy)
8321 IncompleteDest->getElementType(), ConstantSource->getSize(),
8331 S.
Diag(Kind.getLocation(), diag::ext_array_init_parens)
8351 diag::warn_cxx98_compat_initializer_list_init)
8364 [[maybe_unused]]
bool IsStdInitializerList =
8366 assert(IsStdInitializerList &&
8367 "StdInitializerList step to non-std::initializer_list");
8371 "std::initializer_list should have already be "
8372 "complete/instantiated by this point");
8374 auto InvalidType = [&] {
8376 diag::err_std_initializer_list_malformed)
8383 return InvalidType();
8386 if (Field ==
Record->field_end())
8387 return InvalidType();
8390 if (!Field->getType()->isPointerType() ||
8393 return InvalidType();
8395 if (++Field ==
Record->field_end())
8396 return InvalidType();
8399 if (
const auto *PT = Field->getType()->getAs<
PointerType>()) {
8402 return InvalidType();
8404 if (Field->isBitField() ||
8406 return InvalidType();
8409 if (++Field !=
Record->field_end())
8410 return InvalidType();
8437 "Sampler initialization on non-sampler type.");
8443 S.
Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8447 auto Var = cast<VarDecl>(DRE->getDecl());
8450 if (!Var->hasGlobalStorage()) {
8462 if (!Var->getInit() || !isa<ImplicitCastExpr>(Var->getInit()))
8464 Init = cast<ImplicitCastExpr>(
const_cast<Expr*
>(
8465 Var->getInit()))->getSubExpr();
8466 SourceType =
Init->getType();
8473 if (!
Init->isConstantInitializer(S.
Context,
false))
8478 S.
Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8486 const uint64_t SamplerValue =
Result.getLimitedValue();
8493 unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8494 unsigned FilterMode = (0x30 & SamplerValue) >> 4;
8495 if (FilterMode != 1 && FilterMode != 2 &&
8497 "cl_intel_device_side_avc_motion_estimation", S.
getLangOpts()))
8498 S.
Diag(Kind.getLocation(),
8499 diag::warn_sampler_initializer_invalid_bits)
8501 if (AddressingMode > 4)
8502 S.
Diag(Kind.getLocation(),
8503 diag::warn_sampler_initializer_invalid_bits)
8504 <<
"Addressing Mode";
8510 CK_IntToOCLSampler);
8516 "Wrong type for initialization of OpenCL opaque type.");
8519 CK_ZeroToOCLOpaqueType,
8527 if (CurInit.
get() && ResultType)
8548 cast<FieldDecl>(Entity.
getDecl())->isBitField())
8549 S.CheckBitFieldInitialization(Kind.getLocation(),
8564 S.
Diag(
Loc, diag::err_reference_without_init)
8565 <<
T.getNonReferenceType();
8573 for (
const auto *FI : RD->
fields()) {
8574 if (FI->isUnnamedBitField())
8578 S.
Diag(
Loc, diag::note_value_initialization_here) << RD;
8583 for (
const auto &BI : RD->
bases()) {
8585 S.
Diag(
Loc, diag::note_value_initialization_here) << RD;
8620 if (fromDecl && destDecl && fromDecl->getDeclKind() == Decl::CXXRecord &&
8621 destDecl->getDeclKind() == Decl::CXXRecord &&
8622 !fromDecl->isInvalidDecl() && !destDecl->isInvalidDecl() &&
8623 !fromDecl->hasDefinition() &&
8626 S.
Diag(fromDecl->getLocation(), diag::note_forward_class_conversion)
8656 S.
Diag(
Loc, diag::note_in_reference_temporary_list_initializer) <<
T;
8660 InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
8663 assert(DiagnoseInitList.HadError() &&
8664 "Inconsistent init list check result.");
8679 if (Args.size() == 1) {
8680 auto *List = dyn_cast<InitListExpr>(Args[0]);
8681 if (List && List->getNumInits() == 1)
8682 OnlyArg = List->getInit(0);
8691 if (
Expr *Resolved =
8711 assert(Diagnosed &&
"couldn't find uninitialized reference to diagnose");
8714 S.
Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
8715 <<
SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
8718 S.
Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8719 << 1 << Entity.
getType() << Args[0]->getSourceRange();
8723 S.
Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
8726 S.
Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
8729 S.
Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
8732 S.
Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
8735 S.
Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
8738 S.
Diag(Kind.getLocation(),
8739 diag::err_array_init_incompat_wide_string_into_wchar);
8742 S.
Diag(Kind.getLocation(),
8743 diag::err_array_init_plain_string_into_char8_t);
8744 S.
Diag(Args.front()->getBeginLoc(),
8745 diag::note_array_init_plain_string_into_char8_t)
8749 S.
Diag(Kind.getLocation(), diag::err_array_init_utf8_string_into_char)
8754 S.
Diag(Kind.getLocation(),
8756 ? diag::err_array_init_different_type
8757 : diag::err_array_init_non_constant_array))
8760 << Args[0]->getSourceRange();
8764 S.
Diag(Kind.getLocation(), diag::err_variable_object_no_init)
8765 << Args[0]->getSourceRange();
8778 auto *FD = cast<FunctionDecl>(cast<DeclRefExpr>(OnlyArg)->getDecl());
8786 switch (FailedOverloadResult) {
8793 ? (S.
PDiag(diag::err_typecheck_ambiguous_condition)
8794 << OnlyArg->
getType() << DestType
8795 << Args[0]->getSourceRange())
8796 : (S.
PDiag(diag::err_ref_init_ambiguous)
8797 << DestType << OnlyArg->
getType()
8798 << Args[0]->getSourceRange())),
8806 diag::err_typecheck_nonviable_condition_incomplete,
8807 OnlyArg->
getType(), Args[0]->getSourceRange()))
8808 S.
Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
8810 << OnlyArg->
getType() << Args[0]->getSourceRange()
8822 S.
Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
8824 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
8825 << Args[0]->getSourceRange();
8829 llvm_unreachable(
"Inconsistent overload resolution?");
8835 llvm_unreachable(
"Conversion did not fail!");
8840 if (isa<InitListExpr>(Args[0])) {
8841 S.
Diag(Kind.getLocation(),
8842 diag::err_lvalue_reference_bind_to_initlist)
8845 << Args[0]->getSourceRange();
8851 S.
Diag(Kind.getLocation(),
8853 ? diag::err_lvalue_reference_bind_to_temporary
8854 : diag::err_lvalue_reference_bind_to_unrelated)
8858 << Args[0]->getSourceRange();
8863 FieldDecl *BitField = Args[0]->getSourceBitField();
8864 S.
Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
8867 << (BitField !=
nullptr)
8868 << Args[0]->getSourceRange();
8875 S.
Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
8877 << Args[0]->getSourceRange();
8881 S.
Diag(Kind.getLocation(), diag::err_reference_bind_to_matrix_element)
8886 S.
Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
8888 << Args[0]->getSourceRange();
8892 S.
Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
8893 << DestType << Args[0]->getSourceRange();
8904 S.
Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8905 << NonRefType << SourceType << 1
8906 << Args[0]->getSourceRange();
8908 S.
Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8909 << NonRefType << SourceType << 0
8915 S.
Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
8916 << NonRefType << SourceType << 2
8917 << Args[0]->getSourceRange();
8922 S.
Diag(Kind.getLocation(), diag::err_reference_bind_failed)
8927 << Args[0]->getSourceRange();
8938 << Args[0]->getSourceRange();
8940 S.
Diag(Kind.getLocation(), PDiag);
8952 auto *InitList = dyn_cast<InitListExpr>(Args[0]);
8953 if (InitList && InitList->getNumInits() >= 1) {
8954 R =
SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
8956 assert(Args.size() > 1 &&
"Expected multiple initializers!");
8957 R =
SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
8961 if (Kind.isCStyleOrFunctionalCast())
8962 S.
Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
8965 S.
Diag(Kind.getLocation(), diag::err_excess_initializers)
8971 S.
Diag(Kind.getLocation(), diag::err_list_init_in_parens)
8972 << 0 << Entity.
getType() << Args[0]->getSourceRange();
8976 S.
Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
8981 S.
Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
8982 << (DestType->
isRecordType()) << DestType << Args[0]->getSourceRange();
8990 SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
8993 assert(Args.size() == 1 &&
8994 "List construction from other than 1 argument.");
9001 switch (FailedOverloadResult) {
9005 S.
PDiag(diag::err_ovl_ambiguous_init)
9006 << DestType << ArgsRange),
9023 if (
auto Inherited = Constructor->getInheritedConstructor())
9024 InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
9026 S.
Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9027 << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
9039 S.
Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9040 << (InheritedFrom ? 2 : Constructor->isImplicit() ? 1 : 0)
9046 diag::note_member_declared_at);
9051 diag::note_previous_decl)
9060 S.
PDiag(diag::err_ovl_no_viable_function_in_init)
9061 << DestType << ArgsRange),
9070 S.
Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9071 << DestType << ArgsRange;
9072 llvm_unreachable(
"Inconsistent overload resolution?");
9080 S.
Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
9081 << llvm::to_underlying(
9083 << DestType << ArgsRange;
9086 S.
Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9087 << DestType << (Msg !=
nullptr)
9088 << (Msg ? Msg->
getString() : StringRef()) << ArgsRange;
9096 llvm_unreachable(
"Conversion did not fail!");
9108 S.
Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
9109 << (Constructor->getInheritedConstructor() ? 2 :
9110 Constructor->isImplicit() ? 1 : 0)
9116 }
else if (
const auto *VD = dyn_cast_if_present<VarDecl>(Entity.
getDecl());
9117 VD && VD->isConstexpr()) {
9118 S.
Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
9121 S.
Diag(Kind.getLocation(), diag::err_default_init_const)
9128 diag::err_init_incomplete_type);
9144 S.
Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9145 << Args[0]->getSourceRange();
9150 assert(Ovl ==
OR_Success &&
"Inconsistent overload resolution");
9153 diag::note_explicit_ctor_deduction_guide_here) <<
false;
9164 S.
Diag(Kind.getLocation(), diag::err_designated_init_for_non_aggregate)
9169 PrintInitLocationNote(S, Entity);
9176 OS <<
"Failed sequence: ";
9179 OS <<
"too many initializers for reference";
9183 OS <<
"parenthesized list init for reference";
9187 OS <<
"array requires initializer list";
9191 OS <<
"address of unaddressable function was taken";
9195 OS <<
"array requires initializer list or string literal";
9199 OS <<
"array requires initializer list or wide string literal";
9203 OS <<
"narrow string into wide char array";
9207 OS <<
"wide string into char array";
9211 OS <<
"incompatible wide string into wide char array";
9215 OS <<
"plain string literal into char8_t array";
9219 OS <<
"u8 string literal into char array";
9223 OS <<
"array type mismatch";
9227 OS <<
"non-constant array initializer";
9231 OS <<
"address of overloaded function failed";
9235 OS <<
"overload resolution for reference initialization failed";
9239 OS <<
"non-const lvalue reference bound to temporary";
9243 OS <<
"non-const lvalue reference bound to bit-field";
9247 OS <<
"non-const lvalue reference bound to vector element";
9251 OS <<
"non-const lvalue reference bound to matrix element";
9255 OS <<
"non-const lvalue reference bound to unrelated type";
9259 OS <<
"rvalue reference bound to an lvalue";
9263 OS <<
"reference initialization drops qualifiers";
9267 OS <<
"reference with mismatching address space bound to temporary";
9271 OS <<
"reference initialization failed";
9275 OS <<
"conversion failed";
9279 OS <<
"conversion from property failed";
9283 OS <<
"too many initializers for scalar";
9287 OS <<
"parenthesized list init for reference";
9291 OS <<
"referencing binding to initializer list";
9295 OS <<
"initializer list for non-aggregate, non-scalar type";
9299 OS <<
"overloading failed for user-defined conversion";
9303 OS <<
"constructor overloading failed";
9307 OS <<
"default initialization of a const variable";
9311 OS <<
"initialization of incomplete type";
9315 OS <<
"list initialization checker failure";
9319 OS <<
"variable length array has an initializer";
9323 OS <<
"initializer expression isn't contextually valid";
9327 OS <<
"list constructor overloading failed";
9331 OS <<
"list copy initialization chose explicit constructor";
9335 OS <<
"parenthesized list initialization failed";
9339 OS <<
"designated initializer for non-aggregate type";
9347 OS <<
"Dependent sequence\n";
9351 OS <<
"Normal sequence: ";
9362 OS <<
"resolve address of overloaded function";
9366 OS <<
"derived-to-base (prvalue)";
9370 OS <<
"derived-to-base (xvalue)";
9374 OS <<
"derived-to-base (lvalue)";
9378 OS <<
"bind reference to lvalue";
9382 OS <<
"bind reference to a temporary";
9386 OS <<
"final copy in class direct-initialization";
9390 OS <<
"extraneous C++03 copy to temporary";
9394 OS <<
"user-defined conversion via " << *S->Function.Function;
9398 OS <<
"qualification conversion (prvalue)";
9402 OS <<
"qualification conversion (xvalue)";
9406 OS <<
"qualification conversion (lvalue)";
9410 OS <<
"function reference conversion";
9414 OS <<
"non-atomic-to-atomic conversion";
9418 OS <<
"implicit conversion sequence (";
9424 OS <<
"implicit conversion sequence with narrowing prohibited (";
9430 OS <<
"list aggregate initialization";
9434 OS <<
"unwrap reference initializer list";
9438 OS <<
"rewrap reference initializer list";
9442 OS <<
"constructor initialization";
9446 OS <<
"list initialization via constructor";
9450 OS <<
"zero initialization";
9454 OS <<
"C assignment";
9458 OS <<
"string initialization";
9462 OS <<
"Objective-C object conversion";
9466 OS <<
"indexing for array initialization loop";
9470 OS <<
"array initialization loop";
9474 OS <<
"array initialization";
9478 OS <<
"array initialization (GNU extension)";
9482 OS <<
"parenthesized array initialization";
9486 OS <<
"pass by indirect copy and restore";
9490 OS <<
"pass by indirect restore";
9494 OS <<
"Objective-C object retension";
9498 OS <<
"std::initializer_list from initializer list";
9502 OS <<
"list initialization from std::initializer_list";
9506 OS <<
"OpenCL sampler_t from integer constant";
9510 OS <<
"OpenCL opaque type from zero";
9513 OS <<
"initialization from a parenthesized list of values";
9517 OS <<
" [" << S->Type <<
']';
9531 const Expr *PostInit) {
9547 auto MakeDiag = [&](
bool IsConstRef,
unsigned DefaultDiagID,
9548 unsigned ConstRefDiagID,
unsigned WarnDiagID) {
9551 if (L.CPlusPlus11 && !L.HLSL &&
9553 DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID;
9555 DiagID = WarnDiagID;
9575 MakeDiag(
T != EntityType, diag::ext_init_list_type_narrowing,
9576 diag::ext_init_list_type_narrowing_const_reference,
9577 diag::warn_init_list_type_narrowing)
9579 <<
T.getLocalUnqualifiedType();
9586 diag::ext_init_list_constant_narrowing,
9587 diag::ext_init_list_constant_narrowing_const_reference,
9588 diag::warn_init_list_constant_narrowing)
9597 diag::ext_init_list_variable_narrowing,
9598 diag::ext_init_list_variable_narrowing_const_reference,
9599 diag::warn_init_list_variable_narrowing)
9607 llvm::raw_svector_ostream OS(StaticCast);
9608 OS <<
"static_cast<";
9615 OS << *TT->getDecl();
9624 S.
Diag(PostInit->
getBeginLoc(), diag::note_init_list_narrowing_silence)
9635 Init->IgnoreParenImpCasts(), ToType,
false,
9636 Sema::AllowedExplicit::None,
9652 S.
Diag(
Init->getBeginLoc(), diag::err_c23_constexpr_init_not_representable)
9653 <<
Value.getAsString(S.
Context, PreNarrowingType) << ToType;
9658 S.
Diag(
Init->getBeginLoc(), diag::err_c23_constexpr_init_type_mismatch)
9659 << ToType << FromType;
9669 llvm_unreachable(
"unhandled case in switch");
9681 for (
unsigned I = 0, N = SE->
getLength(); I != N; ++I) {
9686 diag::err_c23_constexpr_init_not_representable)
9700 if (
Init.isInvalid())
9704 assert(InitE &&
"No initialization expression");
9709 return !
Seq.Failed();
9716 bool TopLevelOfInitList,
9717 bool AllowExplicit) {
9718 if (
Init.isInvalid())
9722 assert(InitE &&
"No initialization expression?");
9732 const bool ShouldTrackCopy =
9734 if (ShouldTrackCopy) {
9736 Seq.SetOverloadFailure(
9742 const auto LastStep =
Seq.step_end() - 1;
9743 assert(LastStep->Kind ==
9747 llvm::find_if(
Seq.getFailedCandidateSet(),
9749 return Candidate.Viable &&
9750 Candidate.Function == Function &&
9751 Candidate.Conversions.size() > 0;
9753 if (Candidate !=
Seq.getFailedCandidateSet().end() &&
9755 Candidate->
Viable =
false;
9759 Function->getParamDecl(0)->getType());
9767 if (ShouldTrackCopy)
9776 auto NotSpecialization = [&] (
const CXXRecordDecl *Candidate) {
9777 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
9780 return !(NotSpecialization(RD) && RD->
forallBases(NotSpecialization));
9786 auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
9788 assert(DeducedTST &&
"not a deduced template specialization type");
9799 if (
auto *
AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
9801 Diag(Kind.getLocation(),
9802 diag::warn_cxx17_compat_ctad_for_alias_templates);
9805 ->getUnderlyingType()
9806 .getCanonicalType();
9810 if (
const auto *TST =
9812 Template = dyn_cast_or_null<ClassTemplateDecl>(
9813 TST->getTemplateName().getAsTemplateDecl());
9814 }
else if (
const auto *RT = UnderlyingType->getAs<
RecordType>()) {
9818 if (
const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>(
9819 RT->getAsCXXRecordDecl()))
9820 Template = CTSD->getSpecializedTemplate();
9825 Diag(Kind.getLocation(),
9826 diag::err_deduced_non_class_or_alias_template_specialization_type)
9836 diag::warn_cxx14_compat_class_template_argument_deduction)
9864 ? dyn_cast<InitListExpr>(Inits[0])
9880 bool AllowExplicit = !Kind.isCopyInit() ||
ListInit;
9886 bool OnlyListConstructors,
9887 bool AllowAggregateDeductionCandidate) {
9893 if (!AllowExplicit) {
9900 if (GD->getMinRequiredArguments() > 1 ||
9901 (GD->getNumParams() == 0 && !GD->isVariadic()))
9911 if (!AllowAggregateDeductionCandidate &&
9926 for (
Expr *
E : Inits)
9927 if (
auto *DI = dyn_cast<DesignatedInitExpr>(
E))
9928 TmpInits.push_back(DI->getInit());
9930 TmpInits.push_back(
E);
9932 TD, FoundDecl,
nullptr, TmpInits, Candidates,
9934 false, AllowExplicit, ADLCallKind::NotADL,
9935 {}, AllowAggregateDeductionCandidate);
9939 false, AllowExplicit);
9943 bool FoundDeductionGuide =
false;
9945 auto TryToResolveOverload =
9948 bool HasAnyDeductionGuide =
false;
9951 auto *Pattern = Template;
9952 while (Pattern->getInstantiatedFromMemberTemplate()) {
9953 if (Pattern->isMemberSpecialization())
9955 Pattern = Pattern->getInstantiatedFromMemberTemplate();
9958 auto *RD = cast<CXXRecordDecl>(Pattern->getTemplatedDecl());
9964 InitListChecker CheckInitList(*
this, Entity,
ListInit, Ty, ElementTypes);
9965 if (!CheckInitList.HadError()) {
9974 for (
int I = 0,
E =
ListInit->getNumInits();
9975 I <
E && !isa<PackExpansionType>(ElementTypes[I]); ++I)
9976 if (ElementTypes[I]->isArrayType()) {
9977 if (isa<InitListExpr, DesignatedInitExpr>(
ListInit->getInit(I)))
9979 else if (isa<StringLiteral>(
9980 ListInit->getInit(I)->IgnoreParenImpCasts()))
9987 LookupTemplateDecl, ElementTypes,
9991 OnlyListConstructors,
9993 HasAnyDeductionGuide =
true;
9998 for (
auto I = Guides.
begin(),
E = Guides.
end(); I !=
E; ++I) {
10003 auto *TD = dyn_cast<FunctionTemplateDecl>(
D);
10004 auto *GD = dyn_cast_if_present<CXXDeductionGuideDecl>(
10009 if (!GD->isImplicit())
10010 HasAnyDeductionGuide =
true;
10012 addDeductionCandidate(TD, GD, I.getPair(), OnlyListConstructors,
10027 }
else if (Inits.size()) {
10032 Inits, Inits.back()->getEndLoc());
10033 SynthesizeAggrGuide(&TempListInit);
10037 FoundDeductionGuide = FoundDeductionGuide || HasAnyDeductionGuide;
10047 bool TryListConstructors =
true;
10053 auto *FD = dyn_cast<FunctionDecl>(
D->getUnderlyingDecl());
10054 if (FD && FD->getMinRequiredArguments() == 0) {
10055 TryListConstructors =
false;
10059 }
else if (
ListInit->getNumInits() == 1) {
10067 if (!isa<InitListExpr>(
E) && RD &&
10070 TryListConstructors =
false;
10073 if (TryListConstructors)
10074 Result = TryToResolveOverload(
true);
10083 Result = TryToResolveOverload(
false);
10092 Kind.getLocation(),
10093 PDiag(diag::err_deduced_class_template_ctor_ambiguous)
10100 cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
10105 Kind.getLocation(),
10106 PDiag(
Complete ? diag::err_deduced_class_template_ctor_no_viable
10107 : diag::err_deduced_class_template_incomplete)
10117 Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
10127 if (Kind.isCopyInit() &&
ListInit &&
10128 cast<CXXDeductionGuideDecl>(Best->Function)->isExplicit()) {
10129 bool IsDeductionGuide = !Best->Function->isImplicit();
10130 Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
10132 Diag(Best->Function->getLocation(),
10133 diag::note_explicit_ctor_deduction_guide_here)
10134 << IsDeductionGuide;
10151 diag::warn_cxx14_compat_class_template_argument_deduction)
10156 if (!FoundDeductionGuide) {
10158 diag::warn_ctad_maybe_unsupported)
10160 Diag(Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
Defines the clang::ASTContext interface.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
static bool isRValueRef(QualType ParamType)
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
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)
static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E)
Tries to get a FunctionDecl out of E.
static void updateStringLiteralType(Expr *E, QualType Ty)
Update the type of a string literal, including any surrounding parentheses, to match the type of the ...
static void updateGNUCompoundLiteralRValue(Expr *E)
Fix a compound literal initializing an array so it's correctly marked as an rvalue.
static bool initializingConstexprVariable(const InitializedEntity &Entity)
static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity, SourceRange Braces)
Warn that Entity was of scalar type and was initialized by a single-element braced initializer list.
static bool shouldDestroyEntity(const InitializedEntity &Entity)
Whether the given entity, when initialized with an object created for that initialization,...
static SourceLocation getInitializationLoc(const InitializedEntity &Entity, Expr *Initializer)
Get the location at which initialization diagnostics should appear.
static bool hasAnyDesignatedInits(const InitListExpr *IL)
static bool tryObjCWritebackConversion(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity, Expr *Initializer)
static DesignatedInitExpr * CloneDesignatedInitExpr(Sema &SemaRef, DesignatedInitExpr *DIE)
static ExprResult CopyObject(Sema &S, QualType T, const InitializedEntity &Entity, ExprResult CurInit, bool IsExtraneousCopy)
Make a (potentially elidable) temporary copy of the object provided by the given initializer by calli...
static void TryOrBuildParenListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef< Expr * > Args, InitializationSequence &Sequence, bool VerifyOnly, ExprResult *Result=nullptr)
static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr, bool IsReturnStmt)
Provide warnings when std::move is used on construction.
static void CheckC23ConstexprInitStringLiteral(const StringLiteral *SE, Sema &SemaRef, QualType &TT)
static void CheckCXX98CompatAccessibleCopy(Sema &S, const InitializedEntity &Entity, Expr *CurInitExpr)
Check whether elidable copy construction for binding a reference to a temporary would have succeeded ...
static bool isOrIsDerivedFromSpecializationOf(CXXRecordDecl *RD, ClassTemplateDecl *CTD)
Determine whether RD is, or is derived from, a specialization of CTD.
static bool canInitializeArrayWithEmbedDataString(ArrayRef< Expr * > ExprList, const InitializedEntity &Entity, ASTContext &Context)
static bool TryInitializerListConstruction(Sema &S, InitListExpr *List, QualType DestType, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
When initializing from init list via constructor, handle initialization of an object of type std::ini...
static StringInitFailureKind IsStringInit(Expr *Init, const ArrayType *AT, ASTContext &Context)
Check whether the array of type AT can be initialized by the Init expression by means of string initi...
static void TryArrayCopy(Sema &S, const InitializationKind &Kind, const InitializedEntity &Entity, Expr *Initializer, QualType DestType, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Initialize an array from another array.
static bool isInitializedStructuredList(const InitListExpr *StructuredList)
@ SIF_PlainStringIntoUTF8Char
@ SIF_IncompatWideStringIntoWideChar
@ SIF_UTF8StringIntoPlainChar
@ SIF_NarrowStringIntoWideChar
static void TryDefaultInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitializationSequence &Sequence)
Attempt default initialization (C++ [dcl.init]p6).
static bool TryOCLSamplerInitialization(Sema &S, InitializationSequence &Sequence, QualType DestType, Expr *Initializer)
static bool maybeRecoverWithZeroInitialization(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity)
Tries to add a zero initializer. Returns true if that worked.
static ExprResult CheckArrayDesignatorExpr(Sema &S, Expr *Index, llvm::APSInt &Value)
Check that the given Index expression is a valid array designator value.
static bool canPerformArrayCopy(const InitializedEntity &Entity)
Determine whether we can perform an elementwise array copy for this kind of entity.
static bool IsZeroInitializer(Expr *Initializer, Sema &S)
static void TryReferenceInitializationCore(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, QualType cv1T1, QualType T1, Qualifiers T1Quals, QualType cv2T2, QualType T2, Qualifiers T2Quals, InitializationSequence &Sequence, bool TopLevelOfInitList)
Reference initialization without resolving overloaded functions.
static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType, QualType ToType, Expr *Init)
static void ExpandAnonymousFieldDesignator(Sema &SemaRef, DesignatedInitExpr *DIE, unsigned DesigIdx, IndirectFieldDecl *IndirectField)
Expand a field designator that refers to a member of an anonymous struct or union into a series of fi...
static void TryValueInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitializationSequence &Sequence, InitListExpr *InitList=nullptr)
Attempt value initialization (C++ [dcl.init]p7).
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
static OverloadingResult ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc, MultiExprArg Args, OverloadCandidateSet &CandidateSet, QualType DestType, DeclContext::lookup_result Ctors, OverloadCandidateSet::iterator &Best, bool CopyInitializing, bool AllowExplicit, bool OnlyListConstructors, bool IsListInit, bool RequireActualConstructor, bool SecondStepOfCopyInit=false)
static AssignmentAction getAssignmentAction(const InitializedEntity &Entity, bool Diagnose=false)
static void TryListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitListExpr *InitList, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Attempt list initialization (C++0x [dcl.init.list])
static void TryStringLiteralInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence)
Attempt character array initialization from a string literal (C++ [dcl.init.string],...
static bool checkDestructorReference(QualType ElementType, SourceLocation Loc, Sema &SemaRef)
Check if the type of a class element has an accessible destructor, and marks it referenced.
static void TryReferenceInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt reference initialization (C++0x [dcl.init.ref])
static void DiagnoseNarrowingInInitList(Sema &S, const ImplicitConversionSequence &ICS, QualType PreNarrowingType, QualType EntityType, const Expr *PostInit)
static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest, const ArrayType *Source)
Determine whether we have compatible array types for the purposes of GNU by-copy array initialization...
static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, Sema &S, bool CheckC23ConstexprInit=false)
static bool isExplicitTemporary(const InitializedEntity &Entity, const InitializationKind &Kind, unsigned NumArgs)
Returns true if the parameters describe a constructor initialization of an explicit temporary object,...
static bool isNonReferenceableGLValue(Expr *E)
Determine whether an expression is a non-referenceable glvalue (one to which a reference can never bi...
static bool TryOCLZeroOpaqueTypeInitialization(Sema &S, InitializationSequence &Sequence, QualType DestType, Expr *Initializer)
static bool IsWideCharCompatible(QualType T, ASTContext &Context)
Check whether T is compatible with a wide character type (wchar_t, char16_t or char32_t).
static void diagnoseListInit(Sema &S, const InitializedEntity &Entity, InitListExpr *InitList)
static OverloadingResult TryRefInitWithConversionFunction(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, bool AllowRValues, bool IsLValueRef, InitializationSequence &Sequence)
Try a reference initialization that involves calling a conversion function.
static void TryConstructorInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType DestType, QualType DestArrayType, InitializationSequence &Sequence, bool IsListInit=false, bool IsInitListCopy=false)
Attempt initialization by constructor (C++ [dcl.init]), which enumerates the constructors of the init...
static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity, Expr *op)
Emit notes associated with an initialization that failed due to a "simple" conversion failure.
static bool isIdiomaticBraceElisionEntity(const InitializedEntity &Entity)
Determine whether Entity is an entity for which it is idiomatic to elide the braces in aggregate init...
static void MaybeProduceObjCObject(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity)
static void checkIndirectCopyRestoreSource(Sema &S, Expr *src)
Check whether the given expression is a valid operand for an indirect copy/restore.
static bool shouldBindAsTemporary(const InitializedEntity &Entity)
Whether we should bind a created object as a temporary when initializing the given entity.
static bool ResolveOverloadedFunctionForReferenceBinding(Sema &S, Expr *Initializer, QualType &SourceType, QualType &UnqualifiedSourceType, QualType UnqualifiedTargetType, InitializationSequence &Sequence)
InvalidICRKind
The non-zero enum values here are indexes into diagnostic alternatives.
static ExprResult PerformConstructorInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, const InitializationSequence::Step &Step, bool &ConstructorInitRequiresZeroInit, bool IsListInitialization, bool IsStdInitListInitialization, SourceLocation LBraceLoc, SourceLocation RBraceLoc)
static void TryReferenceListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitListExpr *InitList, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Attempt list initialization of a reference.
static bool 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...
static bool hasCopyOrMoveCtorParam(ASTContext &Ctx, const ConstructorInfo &Info)
Determine if the constructor has the signature of a copy or move constructor for the type T of the cl...
static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc, QualType T)
Somewhere within T there is an uninitialized reference subobject.
static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, bool isAddressOf, bool &isWeakAccess)
Determines whether this expression is an acceptable ICR source.
This file declares semantic analysis for Objective-C.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
bool isNullPointer() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
DeclarationNameTable DeclarationNames
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.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
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
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>.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
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.
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.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType 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
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.
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.
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
This class is used for builtin types like 'int'.
Represents a base class of a C++ class.
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
QualType getType() const
Retrieves the type of the base class.
Represents a call to a C++ constructor.
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Represents a C++ constructor within a class.
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
bool isCopyOrMoveConstructor(unsigned &TypeQuals) const
Determine whether this is a copy or move constructor.
Represents a C++ conversion function within a class.
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a C++ deduction guide declaration.
Represents a C++ destructor within a class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Represents a C++ struct/union/class.
bool hasUninitializedReferenceMember() const
Whether this class or any of its subobjects has any members of reference type which would make value-...
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
CXXRecordDecl * getDefinition() const
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
llvm::iterator_range< base_class_iterator > base_class_range
llvm::iterator_range< base_class_const_iterator > base_class_const_range
bool forallBases(ForallBasesCallback BaseMatches) const
Determines if the given callback holds for all the direct or indirect base classes of this type.
An expression "T()" which creates an rvalue of a non-class type T.
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
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)
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCallToStdMove() const
SourceLocation getRParenLoc() const
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...
SourceLocation getBegin() const
Declaration of a class template.
void setExprNeedsCleanups(bool SideEffects)
Complex values, per C99 6.2.5p11.
QualType getElementType() const
ConditionalOperator - The ?: ternary operator.
Represents the canonical version of C arrays with a specified constant size.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
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.
decl_iterator - Iterates through the declarations stored within this context.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
A reference to a declared variable, function, enum, etc.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
bool isInvalidDecl() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
Represents a single C99 designator.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getFieldLoc() const
SourceLocation getDotLoc() const
Represents a C99 designated initializer expression.
bool isDirectInit() const
Whether this designated initializer should result in direct-initialization of the designated subobjec...
Expr * getArrayRangeEnd(const Designator &D) const
Expr * getSubExpr(unsigned Idx) const
llvm::MutableArrayRef< Designator > designators()
bool usesGNUSyntax() const
Determines whether this designated initializer used the deprecated GNU syntax for designated initiali...
Expr * getArrayRangeStart(const Designator &D) const
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).
static DesignatedInitExpr * Create(const ASTContext &C, llvm::ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
Expr * getArrayIndex(const Designator &D) const
Designator * getDesignator(unsigned Idx)
Expr * getInit() const
Retrieve the initializer value.
unsigned size() const
Returns the number of designators in this initializer.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getEqualOrColonLoc() const
Retrieve the location of the '=' that precedes the initializer value itself, if present.
unsigned getNumSubExprs() const
Retrieve the total number of subexpressions in this designated initializer expression,...
InitListExpr * getUpdater() const
Designation - Represent a full designation, which is a sequence of designators.
const Designator & getDesignator(unsigned Idx) const
unsigned getNumDesignators() const
Designator - A designator in a C99 designated initializer.
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Represents a reference to #emded data.
StringLiteral * getDataStringLiteral() const
EmbedDataStorage * getData() const
SourceLocation getLocation() const
size_t getDataElementCount() const
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.
The return type of classify().
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
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...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
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...
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToMatrixElement() const
Returns whether this expression refers to a matrix element.
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
ExtVectorType - Extended vector type.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
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.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
QualType getReturnType() const
bool isDeleted() const
Whether this function has been deleted.
bool isDefaulted() const
Whether this function is defaulted.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
One of these records is kept for each identifier that is lexed.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
@ StaticObjectArgumentConversion
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
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 ...
Represents an implicitly-generated value initialization of an object of a given type.
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
chain_iterator chain_end() const
chain_iterator chain_begin() const
ArrayRef< NamedDecl * >::const_iterator chain_iterator
Describes an C or C++ initializer list.
bool hasArrayFiller() const
Return true if this is an array initializer and its array "filler" has been set.
void setSyntacticForm(InitListExpr *Init)
void markError()
Mark the semantic form of the InitListExpr as error when the semantic analysis fails.
bool hasDesignatedInit() const
Determine whether this initializer list contains a designated initializer.
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
void resizeInits(const ASTContext &Context, unsigned NumInits)
Specify the number of initializers.
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
unsigned getNumInits() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setInit(unsigned Init, Expr *expr)
SourceLocation getLBraceLoc() const
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...
void setArrayFiller(Expr *filler)
InitListExpr * getSyntacticForm() const
Expr * getArrayFiller()
If this initializer list initializes an array with more elements than there are initializers in the l...
SourceLocation getRBraceLoc() const
const Expr * getInit(unsigned Init) const
bool isIdiomaticZeroInitializer(const LangOptions &LangOpts) const
Is this the zero initializer {0} in a language which considers it idiomatic?
SourceLocation getEndLoc() const LLVM_READONLY
void setInitializedFieldInUnion(FieldDecl *FD)
bool isSyntacticForm() const
ArrayRef< Expr * > inits()
void setRBraceLoc(SourceLocation Loc)
void sawArrayRangeDesignator(bool ARD=true)
Expr ** getInits()
Retrieve the set of initializers.
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.
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
void AddStringInitStep(QualType T)
Add a string init step.
void AddStdInitializerListConstructionStep(QualType T)
Add a step to construct a std::initializer_list object from an initializer list.
void AddConstructorInitializationStep(DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T, bool HadMultipleCandidates, bool FromInitList, bool AsInitList)
Add a constructor-initialization step.
@ SK_StdInitializerListConstructorCall
Perform initialization via a constructor taking a single std::initializer_list argument.
@ SK_AtomicConversion
Perform a conversion adding _Atomic to a type.
@ SK_ObjCObjectConversion
An initialization that "converts" an Objective-C object (not a point to an object) to another Objecti...
@ SK_GNUArrayInit
Array initialization (from an array rvalue) as a GNU extension.
@ SK_CastDerivedToBaseLValue
Perform a derived-to-base cast, producing an lvalue.
@ SK_ProduceObjCObject
Produce an Objective-C object pointer.
@ SK_FunctionReferenceConversion
Perform a function reference conversion, see [dcl.init.ref]p4.
@ SK_BindReference
Reference binding to an lvalue.
@ SK_ArrayLoopInit
Array initialization by elementwise copy.
@ SK_ConstructorInitialization
Perform initialization via a constructor.
@ SK_OCLSamplerInit
Initialize an OpenCL sampler from an integer.
@ SK_StringInit
Initialization by string.
@ SK_ZeroInitialization
Zero-initialize the object.
@ SK_CastDerivedToBaseXValue
Perform a derived-to-base cast, producing an xvalue.
@ SK_QualificationConversionXValue
Perform a qualification conversion, producing an xvalue.
@ SK_UserConversion
Perform a user-defined conversion, either via a conversion function or via a constructor.
@ SK_CastDerivedToBasePRValue
Perform a derived-to-base cast, producing an rvalue.
@ SK_BindReferenceToTemporary
Reference binding to a temporary.
@ SK_PassByIndirectRestore
Pass an object by indirect restore.
@ SK_ParenthesizedArrayInit
Array initialization from a parenthesized initializer list.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
@ SK_ArrayInit
Array initialization (from an array rvalue).
@ SK_ExtraneousCopyToTemporary
An optional copy of a temporary object to another temporary object, which is permitted (but not requi...
@ SK_ArrayLoopIndex
Array indexing for initialization by elementwise copy.
@ SK_ConversionSequenceNoNarrowing
Perform an implicit conversion sequence without narrowing.
@ SK_RewrapInitList
Rewrap the single-element initializer list for a reference.
@ SK_CAssignment
C assignment.
@ SK_ConstructorInitializationFromList
Perform initialization via a constructor, taking arguments from a single InitListExpr.
@ SK_PassByIndirectCopyRestore
Pass an object by indirect copy-and-restore.
@ SK_ResolveAddressOfOverloadedFunction
Resolve the address of an overloaded function to a specific function declaration.
@ SK_UnwrapInitList
Unwrap the single-element initializer list for a reference.
@ SK_FinalCopy
Direct-initialization from a reference-related object in the final stage of class copy-initialization...
@ SK_QualificationConversionLValue
Perform a qualification conversion, producing an lvalue.
@ SK_StdInitializerList
Construct a std::initializer_list from an initializer list.
@ SK_QualificationConversionPRValue
Perform a qualification conversion, producing a prvalue.
@ SK_ConversionSequence
Perform an implicit conversion sequence.
@ SK_ListInitialization
Perform list-initialization without a constructor.
@ SK_OCLZeroOpaqueType
Initialize an opaque OpenCL type (event_t, queue_t, etc.) with zero.
void AddUserConversionStep(FunctionDecl *Function, DeclAccessPair FoundDecl, QualType T, bool HadMultipleCandidates)
Add a new step invoking a conversion function, which is either a constructor or a conversion function...
void SetZeroInitializationFixit(const std::string &Fixit, SourceLocation L)
Call for initializations are invalid but that would be valid zero initialzations if Fixit was applied...
InitializationSequence(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, bool TopLevelOfInitList=false, bool TreatUnavailableAsInvalid=true)
Try to perform initialization of the given entity, creating a record of the steps required to perform...
void AddQualificationConversionStep(QualType Ty, ExprValueKind Category)
Add a new step that performs a qualification conversion to the given type.
void AddFunctionReferenceConversionStep(QualType Ty)
Add a new step that performs a function reference conversion to the given type.
~InitializationSequence()
void AddDerivedToBaseCastStep(QualType BaseType, ExprValueKind Category)
Add a new step in the initialization that performs a derived-to- base cast.
FailureKind getFailureKind() const
Determine why initialization failed.
void InitializeFrom(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, bool TopLevelOfInitList, bool TreatUnavailableAsInvalid)
void AddParenthesizedListInitStep(QualType T)
void SetFailed(FailureKind Failure)
Note that this initialization sequence failed.
bool isAmbiguous() const
Determine whether this initialization failed due to an ambiguity.
void AddUnwrapInitListInitStep(InitListExpr *Syntactic)
Only used when initializing structured bindings from an array with direct-list-initialization.
void AddOCLZeroOpaqueTypeStep(QualType T)
Add a step to initialzie an OpenCL opaque type (event_t, queue_t, etc.) from a zero constant.
void AddFinalCopy(QualType T)
Add a new step that makes a copy of the input to an object of the given type, as the final step in cl...
void setSequenceKind(enum SequenceKind SK)
Set the kind of sequence computed.
void AddObjCObjectConversionStep(QualType T)
Add an Objective-C object conversion step, which is always a no-op.
void SetOverloadFailure(FailureKind Failure, OverloadingResult Result)
Note that this initialization sequence failed due to failed overload resolution.
step_iterator step_end() const
void AddParenthesizedArrayInitStep(QualType T)
Add a parenthesized array initialization step.
void AddExtraneousCopyToTemporary(QualType T)
Add a new step that makes an extraneous copy of the input to a temporary of the same class type.
void setIncompleteTypeFailure(QualType IncompleteType)
Note that this initialization sequence failed due to an incomplete type.
void AddOCLSamplerInitStep(QualType T)
Add a step to initialize an OpenCL sampler from an integer constant.
void AddCAssignmentStep(QualType T)
Add a C assignment step.
void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy)
Add a step to pass an object by indirect copy-restore.
void RewrapReferenceInitList(QualType T, InitListExpr *Syntactic)
Add steps to unwrap a initializer list for a reference around a single element and rewrap it at the e...
bool Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef< Expr * > Args)
Diagnose an potentially-invalid initialization sequence.
bool Failed() const
Determine whether the initialization sequence is invalid.
void AddAtomicConversionStep(QualType Ty)
Add a new step that performs conversion from non-atomic to atomic type.
void dump() const
Dump a representation of this initialization sequence to standard error, for debugging purposes.
void AddConversionSequenceStep(const ImplicitConversionSequence &ICS, QualType T, bool TopLevelOfInitList=false)
Add a new step that applies an implicit conversion sequence.
void AddZeroInitializationStep(QualType T)
Add a zero-initialization step.
void AddProduceObjCObjectStep(QualType T)
Add a step to "produce" an Objective-C object (by retaining it).
enum SequenceKind getKind() const
Determine the kind of initialization sequence computed.
SequenceKind
Describes the kind of initialization sequence computed.
@ NormalSequence
A normal sequence.
@ FailedSequence
A failed initialization sequence.
@ DependentSequence
A dependent initialization, which could not be type-checked due to the presence of dependent types or...
void AddReferenceBindingStep(QualType T, bool BindingTemporary)
Add a new step binding a reference to an object.
FailureKind
Describes why initialization failed.
@ FK_UserConversionOverloadFailed
Overloading for a user-defined conversion failed.
@ FK_NarrowStringIntoWideCharArray
Initializing a wide char array with narrow string literal.
@ FK_ArrayTypeMismatch
Array type mismatch.
@ FK_ParenthesizedListInitForReference
Reference initialized from a parenthesized initializer list.
@ FK_NonConstLValueReferenceBindingToVectorElement
Non-const lvalue reference binding to a vector element.
@ FK_ReferenceInitDropsQualifiers
Reference binding drops qualifiers.
@ FK_InitListBadDestinationType
Initialization of some unused destination type with an initializer list.
@ FK_ConversionFromPropertyFailed
Implicit conversion failed.
@ FK_NonConstLValueReferenceBindingToUnrelated
Non-const lvalue reference binding to an lvalue of unrelated type.
@ FK_ListConstructorOverloadFailed
Overloading for list-initialization by constructor failed.
@ FK_ReferenceInitFailed
Reference binding failed.
@ FK_DesignatedInitForNonAggregate
@ 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....
void AddArrayInitLoopStep(QualType T, QualType EltTy)
Add an array initialization loop step.
void AddAddressOverloadResolutionStep(FunctionDecl *Function, DeclAccessPair Found, bool HadMultipleCandidates)
Add a new step in the initialization that resolves the address of an overloaded function to a specifi...
void AddArrayInitStep(QualType T, bool IsGNUExtension)
Add an array initialization step.
bool isConstructorInitialization() const
Determine whether this initialization is direct call to a constructor.
SmallVectorImpl< Step >::const_iterator step_iterator
OverloadCandidateSet & getFailedCandidateSet()
Retrieve a reference to the candidate set when overload resolution fails.
Describes an entity that is being initialized.
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr, bool Implicit=false)
Create the initialization entity for a member subobject.
VD Variable
When Kind == EK_Variable, EK_Member, EK_Binding, or EK_TemplateParameter, the variable,...
EntityKind getKind() const
Determine the kind of initialization.
DeclarationName getName() const
Retrieve the name of the entity being initialized.
QualType getType() const
Retrieve type being initialized.
ValueDecl * getDecl() const
Retrieve the variable, parameter, or field being initialized.
bool isImplicitMemberInitializer() const
Is this the implicit initialization of a member of a class from a defaulted constructor?
const InitializedEntity * getParent() const
Retrieve the parent of the entity being initialized, when the initialization itself is occurring with...
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
bool isParameterConsumed() const
Determine whether this initialization consumes the parameter.
static InitializedEntity InitializeElement(ASTContext &Context, unsigned Index, const InitializedEntity &Parent)
Create the initialization entity for an array element.
unsigned getElementIndex() const
If this is an array, vector, or complex number element, get the element's index.
void setElementIndex(unsigned Index)
If this is already the initializer for an array or vector element, sets the element index.
SourceLocation getCaptureLoc() const
Determine the location of the capture when initializing field from a captured variable in a lambda.
bool isParamOrTemplateParamKind() const
llvm::PointerIntPair< const CXXBaseSpecifier *, 1 > Base
When Kind == EK_Base, the base specifier that provides the base class.
bool allowsNRVO() const
Determine whether this initialization allows the named return value optimization, which also applies ...
bool isParameterKind() const
void dump() const
Dump a representation of the initialized entity to standard error, for debugging purposes.
EntityKind
Specifies the kind of entity being initialized.
@ EK_Variable
The entity being initialized is a variable.
@ EK_Temporary
The entity being initialized is a temporary object.
@ EK_Binding
The entity being initialized is a structured binding of a decomposition declaration.
@ EK_BlockElement
The entity being initialized is a field of block descriptor for the copied-in c++ object.
@ EK_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.
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'.
An lvalue reference type, per C++11 [dcl.ref].
Represents the results of name lookup.
bool empty() const
Return true if no decls were found.
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represent a C++ namespace.
Represents a place-holder for an object not to be initialized by anything.
ObjCEncodeExpr, used for @encode in Objective-C.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
void clear(CandidateSetKind CSK)
Clear out all of the candidates.
void setDestAS(LangAS AS)
@ CSK_InitByConstructor
C++ [over.match.ctor], [over.match.list] Initialization of an object of class type by constructor,...
@ CSK_InitByUserDefinedConversion
C++ [over.match.copy]: Copy-initialization of an object of class type by user-defined conversion.
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
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.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
QualType withConst() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void addAddressSpace(LangAS space)
@ OCL_Weak
Reading or writing from this object requires a barrier call.
bool hasQualifiers() const
Return true if the set contains any qualifiers.
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
Qualifiers withoutAddressSpace() const
void removeAddressSpace()
static Qualifiers fromCVRMask(unsigned CVR)
bool hasObjCLifetime() const
LangAS getAddressSpace() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool hasFlexibleArrayMember() const
field_iterator field_end() const
field_range fields() const
bool isRandomized() const
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
bool isSpelledAsLValue() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
bool CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose=true)
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
bool CheckConversionToObjCLiteral(QualType DstType, Expr *&SrcExpr, bool Diagnose=true)
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
Sema - This implements semantic analysis and AST building for C.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
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)
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...
@ Ref_Incompatible
Ref_Incompatible - The two types are incompatible, so direct reference binding is not possible.
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
@ Ref_Related
Ref_Related - The two types are reference-related, which means that their unqualified forms (T1 and T...
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...
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
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 ...
ExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation EqualOrColonLoc, bool GNUSyntax, ExprResult Init)
FPOptionsOverride CurFPFeatureOverrides()
ExpressionEvaluationContextRecord & parentEvaluationContext()
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
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())
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
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.
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
llvm::SmallVector< QualType, 4 > CurrentParameterCopyTypes
Stack of types that correspond to the parameter entities that are currently being copy-initialized.
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()
CXXConstructorDecl * LookupDefaultConstructor(CXXRecordDecl *Class)
Look up the default constructor for the given class.
const LangOptions & getLangOpts() const
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)
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
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.
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)
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
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
@ Compatible
Compatible - the types are compatible according to the standard.
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
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.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
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.
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool CanPerformAggregateInitializationForOverloadResolution(const InitializedEntity &Entity, InitListExpr *From)
Determine whether we can perform aggregate initialization for the purposes of overload resolution.
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
SourceManager & SourceMgr
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
bool 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)
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)
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
Encodes a location in the source.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const
Return the start/end of the expansion information for an expansion location.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isAtStartOfImmediateMacroExpansion(SourceLocation Loc, SourceLocation *MacroBegin=nullptr) const
Returns true if the given MacroID location points at the beginning of the immediate macro expansion.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
void setFromType(QualType T)
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
void setAsIdentityConversion()
StandardConversionSequence - Set the standard conversion sequence to the identity conversion.
void setToType(unsigned Idx, QualType T)
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)
QualType getToType(unsigned Idx) const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
unsigned getLength() const
StringLiteralKind getKind() const
int64_t getCodeUnitS(size_t I, uint64_t BitWidth) const
StringRef getString() const
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
bool isDependent() const
Determines whether this is a dependent template name.
Represents a type template specialization; the template must be a class template, a type alias templa...
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceLocation getEndLoc() const
Get the end source location.
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBooleanType() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isRValueReferenceType() const
bool isConstantArrayType() const
bool isPointerType() const
bool isArrayParameterType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isScalarType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isSizelessBuiltinType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorType() const
bool isOCLIntelSubgroupAVCType() const
bool isLValueReferenceType() const
bool isOpenCLSpecificType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isAnyComplexType() const
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isAtomicType() const
bool isFunctionProtoType() const
bool isObjCObjectType() const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isFloatingType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
Simple class containing the result of Sema::CorrectTypo.
DeclClass * getCorrectionDeclAs() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
const Expr * getInit() const
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
unsigned getNumElements() const
VectorKind getVectorKind() const
QualType getElementType() const
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)
void checkInitLifetime(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for initializing the ent...
The JSON file list parser is used to communicate input to InstallAPI.
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ ovl_fail_bad_conversion
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ SD_Automatic
Automatic storage duration (most local variables).
@ Result
The result type of a method or function.
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
ActionResult< Expr * > ExprResult
CastKind
CastKind - The kind of operation required for a conversion.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Expr * IgnoreParensSingleStep(Expr *E)
const FunctionProtoType * T
@ NK_Not_Narrowing
Not a narrowing conversion.
@ NK_Constant_Narrowing
A narrowing conversion, because a constant expression got narrowed.
@ NK_Dependent_Narrowing
Cannot tell whether this is a narrowing conversion because the expression is value-dependent.
@ NK_Type_Narrowing
A narrowing conversion by virtue of the source and destination types.
@ NK_Variable_Narrowing
A narrowing conversion, because a non-constant-expression variable might have got narrowed.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ConstructorInfo getConstructorInfo(NamedDecl *ND)
@ 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.
@ Implicit
An implicit conversion.
@ CStyleCast
A C-style cast.
@ OtherCast
A cast other than a C-style cast.
@ FunctionalCast
A functional-style cast.
MutableArrayRef< Expr * > MultiExprArg
CXXConstructorDecl * Constructor
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool HadMultipleCandidates
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
bool Viable
Viable - True to indicate that this overload candidate is viable.
unsigned char FailureKind
FailureKind - The reason why this candidate is not viable.
ConversionSequenceList Conversions
The conversion sequences used to convert the function arguments to the function parameters.
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
SmallVector< MaterializeTemporaryExpr *, 8 > ForRangeLifetimeExtendTemps
P2718R0 - Lifetime extension in range-based for loops.
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
std::optional< InitializationContext > DelayedDefaultInitializationContext
ReferenceConversions
The conversions that would be performed on an lvalue of type T2 when binding a reference of type T1 t...
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.