33#include "llvm/ADT/APInt.h"
34#include "llvm/ADT/DenseMap.h"
35#include "llvm/ADT/FoldingSet.h"
36#include "llvm/ADT/PointerIntPair.h"
37#include "llvm/ADT/SmallString.h"
38#include "llvm/ADT/SmallVector.h"
39#include "llvm/ADT/StringExtras.h"
40#include "llvm/Support/ErrorHandling.h"
41#include "llvm/Support/raw_ostream.h"
52 if (Context.typesAreCompatible(Context.getWideCharType(), T))
54 if (Context.getLangOpts().CPlusPlus || Context.getLangOpts().C11) {
55 return Context.typesAreCompatible(Context.Char16Ty, T) ||
56 Context.typesAreCompatible(Context.Char32Ty, T);
95 auto IsCharOrUnsignedChar = [](
const QualType &T) {
96 const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr());
107 (Context.getLangOpts().Char8 &&
117 Context.getLangOpts().Char8)
131 if (Context.typesAreCompatible(Context.Char16Ty, ElemTy))
139 if (Context.typesAreCompatible(Context.Char32Ty, ElemTy))
147 if (Context.typesAreCompatible(Context.getWideCharType(), ElemTy))
155 assert(
false &&
"Unevaluated string literal in initialization");
159 llvm_unreachable(
"missed a StringLiteral kind?");
206 if (
const auto *VD = dyn_cast_if_present<VarDecl>(D); VD && VD->isConstexpr())
217 bool CheckC23ConstexprInit =
false) {
219 auto *ConstantArrayTy =
221 uint64_t StrLength = ConstantArrayTy->getZExtSize();
223 if (CheckC23ConstexprInit)
230 llvm::APInt ConstVal(32, StrLength);
255 if (StrLength > ArrayLen)
257 diag::err_initializer_string_for_char_array_too_long)
261 if (StrLength - 1 > ArrayLen)
263 diag::ext_initializer_string_for_char_array_too_long)
265 else if (StrLength - 1 == ArrayLen) {
268 const auto *SL = dyn_cast<StringLiteral>(Str->
IgnoreParens());
269 bool IsSLSafe = SL && SL->getLength() > 0 &&
270 SL->getCodeUnit(SL->getLength() - 1) == 0;
277 auto FindCorrectEntity =
289 if (
const ValueDecl *D = FindCorrectEntity(&Entity);
290 !D || !D->
hasAttr<NonStringAttr>())
294 warn_initializer_string_for_char_array_too_long_no_nonstring)
299 diag::warn_initializer_string_for_char_array_too_long_for_cpp)
312 for (
const FieldDecl *Field : R->fields()) {
313 if (Field->hasAttr<ExplicitInitAttr>())
314 S.
Diag(Field->getLocation(), diag::note_entity_declared_at) << Field;
355class InitListChecker {
357 bool hadError =
false;
359 bool TreatUnavailableAsInvalid;
360 bool InOverloadResolution;
361 InitListExpr *FullyStructuredList =
nullptr;
362 NoInitExpr *DummyExpr =
nullptr;
363 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes =
nullptr;
364 EmbedExpr *CurEmbed =
nullptr;
365 unsigned CurEmbedIndex = 0;
367 NoInitExpr *getDummyInit() {
373 void CheckImplicitInitList(
const InitializedEntity &Entity,
374 InitListExpr *ParentIList, QualType T,
375 unsigned &Index, InitListExpr *StructuredList,
376 unsigned &StructuredIndex);
377 void CheckExplicitInitList(
const InitializedEntity &Entity,
378 InitListExpr *IList, QualType &T,
379 InitListExpr *StructuredList,
380 bool TopLevelObject =
false);
381 void CheckListElementTypes(
const InitializedEntity &Entity,
382 InitListExpr *IList, QualType &DeclType,
383 bool SubobjectIsDesignatorContext,
385 InitListExpr *StructuredList,
386 unsigned &StructuredIndex,
387 bool TopLevelObject =
false);
388 void CheckSubElementType(
const InitializedEntity &Entity,
389 InitListExpr *IList, QualType ElemType,
391 InitListExpr *StructuredList,
392 unsigned &StructuredIndex,
393 bool DirectlyDesignated =
false);
394 void CheckComplexType(
const InitializedEntity &Entity,
395 InitListExpr *IList, QualType DeclType,
397 InitListExpr *StructuredList,
398 unsigned &StructuredIndex);
399 void CheckScalarType(
const InitializedEntity &Entity,
400 InitListExpr *IList, QualType DeclType,
402 InitListExpr *StructuredList,
403 unsigned &StructuredIndex);
404 void CheckReferenceType(
const InitializedEntity &Entity,
405 InitListExpr *IList, QualType DeclType,
407 InitListExpr *StructuredList,
408 unsigned &StructuredIndex);
409 void CheckMatrixType(
const InitializedEntity &Entity, InitListExpr *IList,
410 QualType DeclType,
unsigned &Index,
411 InitListExpr *StructuredList,
unsigned &StructuredIndex);
412 void CheckVectorType(
const InitializedEntity &Entity,
413 InitListExpr *IList, QualType DeclType,
unsigned &Index,
414 InitListExpr *StructuredList,
415 unsigned &StructuredIndex);
416 void CheckStructUnionTypes(
const InitializedEntity &Entity,
417 InitListExpr *IList, QualType DeclType,
420 bool SubobjectIsDesignatorContext,
unsigned &Index,
421 InitListExpr *StructuredList,
422 unsigned &StructuredIndex,
423 bool TopLevelObject =
false);
424 void CheckArrayType(
const InitializedEntity &Entity,
425 InitListExpr *IList, QualType &DeclType,
426 llvm::APSInt elementIndex,
427 bool SubobjectIsDesignatorContext,
unsigned &Index,
428 InitListExpr *StructuredList,
429 unsigned &StructuredIndex);
430 bool CheckDesignatedInitializer(
const InitializedEntity &Entity,
431 InitListExpr *IList, DesignatedInitExpr *DIE,
433 QualType &CurrentObjectType,
435 llvm::APSInt *NextElementIndex,
437 InitListExpr *StructuredList,
438 unsigned &StructuredIndex,
439 bool FinishSubobjectInit,
440 bool TopLevelObject);
441 InitListExpr *getStructuredSubobjectInit(InitListExpr *IList,
unsigned Index,
442 QualType CurrentObjectType,
443 InitListExpr *StructuredList,
444 unsigned StructuredIndex,
445 SourceRange InitRange,
446 bool IsFullyOverwritten =
false);
447 void UpdateStructuredListElement(InitListExpr *StructuredList,
448 unsigned &StructuredIndex,
450 InitListExpr *createInitListExpr(QualType CurrentObjectType,
451 SourceRange InitRange,
452 unsigned ExpectedNumInits,
bool IsExplicit);
453 int numArrayElements(QualType DeclType);
454 int numStructUnionElements(QualType DeclType);
456 ExprResult PerformEmptyInit(SourceLocation Loc,
457 const InitializedEntity &Entity);
460 void diagnoseInitOverride(Expr *OldInit, SourceRange NewInitRange,
461 bool UnionOverride =
false,
462 bool FullyOverwritten =
true) {
467 ? (UnionOverride ? diag::ext_initializer_union_overrides
468 : diag::ext_initializer_overrides)
469 : diag::warn_initializer_overrides;
471 if (InOverloadResolution && SemaRef.
getLangOpts().CPlusPlus) {
492 DiagID = diag::err_initializer_overrides_destructed;
512 << NewInitRange << FullyOverwritten << OldInit->
getType();
538 void FillInEmptyInitForBase(
unsigned Init,
const CXXBaseSpecifier &Base,
539 const InitializedEntity &ParentEntity,
540 InitListExpr *ILE,
bool &RequiresSecondPass,
541 bool FillWithNoInit);
542 void FillInEmptyInitForField(
unsigned Init, FieldDecl *Field,
543 const InitializedEntity &ParentEntity,
544 InitListExpr *ILE,
bool &RequiresSecondPass,
545 bool FillWithNoInit =
false);
546 void FillInEmptyInitializations(
const InitializedEntity &Entity,
547 InitListExpr *ILE,
bool &RequiresSecondPass,
548 InitListExpr *OuterILE,
unsigned OuterIndex,
549 bool FillWithNoInit =
false);
550 bool CheckFlexibleArrayInit(
const InitializedEntity &Entity,
551 Expr *InitExpr, FieldDecl *Field,
552 bool TopLevelObject);
553 void CheckEmptyInitializable(
const InitializedEntity &Entity,
556 Expr *HandleEmbed(EmbedExpr *Embed,
const InitializedEntity &Entity) {
570 assert(AType &&
"expected array type when initializing array");
572 if (
const auto *CAType = dyn_cast<ConstantArrayType>(AType))
573 ElsCount = std::min(CAType->getSize().getZExtValue() - ArrIndex,
574 ElsCount - CurEmbedIndex);
584 CurEmbedIndex, ElsCount);
585 CurEmbedIndex += ElsCount;
595 Sema &S,
const InitializedEntity &Entity, InitListExpr *IL, QualType &T,
596 bool VerifyOnly,
bool TreatUnavailableAsInvalid,
597 bool InOverloadResolution =
false,
598 SmallVectorImpl<QualType> *AggrDeductionCandidateParamTypes =
nullptr);
599 InitListChecker(Sema &S,
const InitializedEntity &Entity, InitListExpr *IL,
601 SmallVectorImpl<QualType> &AggrDeductionCandidateParamTypes)
602 : InitListChecker(S, Entity, IL, T,
true,
605 &AggrDeductionCandidateParamTypes) {}
607 bool HadError() {
return hadError; }
611 InitListExpr *getFullyStructuredList()
const {
return FullyStructuredList; }
629 bool EmptyInitList = SemaRef.
getLangOpts().CPlusPlus11 &&
642 InitExpr = VerifyOnly ? &DummyInitList
660 if (!InitSeq && EmptyInitList &&
661 InitSeq.getFailureKind() ==
666 InitSeq.getFailedCandidateSet()
667 .BestViableFunction(SemaRef,
Kind.getLocation(), Best);
669 assert(O ==
OR_Success &&
"Inconsistent overload resolution");
676 bool IsInStd =
false;
677 for (
NamespaceDecl *ND = dyn_cast<NamespaceDecl>(
R->getDeclContext());
678 ND && !IsInStd; ND = dyn_cast<NamespaceDecl>(ND->getParent())) {
684 llvm::StringSwitch<bool>(
R->getName())
685 .Cases({
"basic_string",
"deque",
"forward_list"},
true)
686 .Cases({
"list",
"map",
"multimap",
"multiset"},
true)
687 .Cases({
"priority_queue",
"queue",
"set",
"stack"},
true)
688 .Cases({
"unordered_map",
"unordered_set",
"vector"},
true)
690 InitSeq.InitializeFrom(
694 TreatUnavailableAsInvalid);
699 diag::warn_invalid_initializer_from_system_header);
702 diag::note_used_in_initialization_here);
704 SemaRef.
Diag(Loc, diag::note_used_in_initialization_here);
711 InitSeq.Diagnose(SemaRef, Entity, Kind, SubInit);
714 diag::note_in_omitted_aggregate_initializer)
717 bool IsTrailingArrayNewMember =
720 SemaRef.
Diag(Loc, diag::note_in_omitted_aggregate_initializer)
721 << (IsTrailingArrayNewMember ? 2 : 0)
730 : InitSeq.Perform(SemaRef, Entity,
Kind, SubInit);
738 if (FullyStructuredList)
740 PerformEmptyInit(Loc, Entity);
743void InitListChecker::FillInEmptyInitForBase(
746 bool &RequiresSecondPass,
bool FillWithNoInit) {
748 SemaRef.
Context, &Base,
false, &ParentEntity);
753 : PerformEmptyInit(ILE->
getEndLoc(), BaseEntity);
760 assert(
Init < ILE->getNumInits() &&
"should have been expanded");
765 FillInEmptyInitializations(BaseEntity, InnerILE, RequiresSecondPass,
766 ILE,
Init, FillWithNoInit);
768 dyn_cast<DesignatedInitUpdateExpr>(ILE->
getInit(
Init))) {
769 FillInEmptyInitializations(BaseEntity, InnerDIUE->getUpdater(),
770 RequiresSecondPass, ILE,
Init,
775void InitListChecker::FillInEmptyInitForField(
unsigned Init,
FieldDecl *Field,
778 bool &RequiresSecondPass,
779 bool FillWithNoInit) {
787 if (!RType->getDecl()->isUnion())
788 assert((
Init < NumInits || VerifyOnly) &&
789 "This ILE should have been expanded");
791 if (FillWithNoInit) {
792 assert(!VerifyOnly &&
"should not fill with no-init in verify-only mode");
801 if (!VerifyOnly &&
Field->hasAttr<ExplicitInitAttr>() &&
803 SemaRef.
Diag(ILE->
getExprLoc(), diag::warn_field_requires_explicit_init)
805 SemaRef.
Diag(
Field->getLocation(), diag::note_entity_declared_at)
813 if (
Field->hasInClassInitializer()) {
843 RequiresSecondPass =
true;
848 if (
Field->getType()->isReferenceType()) {
854 SemaRef.
Diag(Loc, diag::err_init_reference_member_uninitialized)
858 SemaRef.
Diag(
Field->getLocation(), diag::note_uninit_reference_member);
864 ExprResult MemberInit = PerformEmptyInit(Loc, MemberEntity);
870 if (hadError || VerifyOnly) {
872 }
else if (
Init < NumInits) {
880 RequiresSecondPass =
true;
884 FillInEmptyInitializations(MemberEntity, InnerILE,
885 RequiresSecondPass, ILE,
Init, FillWithNoInit);
887 dyn_cast<DesignatedInitUpdateExpr>(ILE->
getInit(
Init))) {
888 FillInEmptyInitializations(MemberEntity, InnerDIUE->getUpdater(),
889 RequiresSecondPass, ILE,
Init,
900 bool &RequiresSecondPass,
903 bool FillWithNoInit) {
905 "Should not have void type");
909 if (FillWithNoInit && VerifyOnly)
919 struct UpdateOuterILEWithUpdatedInit {
922 ~UpdateOuterILEWithUpdatedInit() {
926 } UpdateOuterRAII = {OuterILE, OuterIndex};
936 RequiresSecondPass, FillWithNoInit);
940 "We should have computed initialized fields already");
944 unsigned NumElems = numStructUnionElements(ILE->
getType());
945 if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember())
952 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RDecl)) {
953 for (
auto &Base : CXXRD->bases()) {
957 FillInEmptyInitForBase(
Init, Base, Entity, ILE, RequiresSecondPass,
963 for (
auto *Field : RDecl->fields()) {
964 if (
Field->isUnnamedBitField())
970 FillInEmptyInitForField(
Init, Field, Entity, ILE, RequiresSecondPass,
978 if (RDecl->isUnion())
992 ElementType = AType->getElementType();
993 if (
const auto *CAType = dyn_cast<ConstantArrayType>(AType))
994 NumElements = CAType->getZExtSize();
1002 ElementType = VType->getElementType();
1003 NumElements = VType->getNumElements();
1009 bool SkipEmptyInitChecks =
false;
1028 if (SkipEmptyInitChecks)
1031 Expr *Filler =
nullptr;
1037 PerformEmptyInit(ILE->
getEndLoc(), ElementEntity);
1048 }
else if (VerifyOnly) {
1049 SkipEmptyInitChecks =
true;
1050 }
else if (
Init < NumInits) {
1071 RequiresSecondPass =
true;
1075 = dyn_cast_or_null<InitListExpr>(InitExpr)) {
1076 FillInEmptyInitializations(ElementEntity, InnerILE, RequiresSecondPass,
1077 ILE,
Init, FillWithNoInit);
1079 dyn_cast_or_null<DesignatedInitUpdateExpr>(InitExpr)) {
1080 FillInEmptyInitializations(ElementEntity, InnerDIUE->getUpdater(),
1081 RequiresSecondPass, ILE,
Init,
1089 if (isa_and_nonnull<DesignatedInitExpr>(
Init))
1094InitListChecker::InitListChecker(
1096 bool VerifyOnly,
bool TreatUnavailableAsInvalid,
bool InOverloadResolution,
1098 : SemaRef(S), VerifyOnly(VerifyOnly),
1099 TreatUnavailableAsInvalid(TreatUnavailableAsInvalid),
1100 InOverloadResolution(InOverloadResolution),
1101 AggrDeductionCandidateParamTypes(AggrDeductionCandidateParamTypes) {
1103 FullyStructuredList = createInitListExpr(
1112 CheckExplicitInitList(Entity, IL, T, FullyStructuredList,
1115 if (!hadError && !AggrDeductionCandidateParamTypes && FullyStructuredList) {
1116 bool RequiresSecondPass =
false;
1117 FillInEmptyInitializations(Entity, FullyStructuredList, RequiresSecondPass,
1119 if (RequiresSecondPass && !hadError)
1120 FillInEmptyInitializations(Entity, FullyStructuredList,
1121 RequiresSecondPass,
nullptr, 0);
1123 if (hadError && FullyStructuredList)
1127int InitListChecker::numArrayElements(
QualType DeclType) {
1129 int maxElements = 0x7FFFFFFF;
1130 if (
const ConstantArrayType *CAT =
1132 maxElements =
static_cast<int>(CAT->getZExtSize());
1137int InitListChecker::numStructUnionElements(QualType DeclType) {
1139 int InitializableMembers = 0;
1140 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(structDecl))
1141 InitializableMembers += CXXRD->getNumBases();
1142 for (
const auto *Field : structDecl->fields())
1143 if (!
Field->isUnnamedBitField())
1144 ++InitializableMembers;
1146 if (structDecl->isUnion())
1147 return std::min(InitializableMembers, 1);
1148 return InitializableMembers - structDecl->hasFlexibleArrayMember();
1175 if (
CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ParentRD)) {
1176 if (CXXRD->getNumBases()) {
1181 assert(FieldIt != ParentRD->field_end() &&
1182 "no fields but have initializer for member?");
1183 return ++FieldIt == ParentRD->field_end();
1195void InitListChecker::CheckImplicitInitList(
const InitializedEntity &Entity,
1196 InitListExpr *ParentIList,
1197 QualType T,
unsigned &Index,
1198 InitListExpr *StructuredList,
1199 unsigned &StructuredIndex) {
1200 int maxElements = 0;
1203 maxElements = numArrayElements(T);
1205 maxElements = numStructUnionElements(T);
1207 maxElements = T->
castAs<VectorType>()->getNumElements();
1209 llvm_unreachable(
"CheckImplicitInitList(): Illegal type");
1211 if (maxElements == 0) {
1214 diag::err_implicit_empty_initializer);
1221 InitListExpr *StructuredSubobjectInitList = getStructuredSubobjectInit(
1222 ParentIList, Index, T, StructuredList, StructuredIndex,
1225 unsigned StructuredSubobjectInitIndex = 0;
1228 unsigned StartIndex = Index;
1229 CheckListElementTypes(Entity, ParentIList, T,
1231 StructuredSubobjectInitList,
1232 StructuredSubobjectInitIndex);
1234 if (StructuredSubobjectInitList) {
1235 StructuredSubobjectInitList->
setType(T);
1237 unsigned EndIndex = (Index == StartIndex? StartIndex : Index - 1);
1240 if (EndIndex < ParentIList->getNumInits() &&
1241 ParentIList->
getInit(EndIndex)) {
1242 SourceLocation EndLoc
1252 diag::warn_missing_braces)
1258 StructuredSubobjectInitList->
getEndLoc()),
1264 if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1266 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1282 unsigned DiagID = 0;
1295 DiagID = diag::warn_braces_around_init;
1302 DiagID = diag::warn_braces_around_init;
1328 llvm_unreachable(
"unexpected braced scalar init");
1344void InitListChecker::CheckExplicitInitList(
const InitializedEntity &Entity,
1345 InitListExpr *IList, QualType &T,
1346 InitListExpr *StructuredList,
1347 bool TopLevelObject) {
1348 unsigned Index = 0, StructuredIndex = 0;
1349 CheckListElementTypes(Entity, IList, T,
true,
1350 Index, StructuredList, StructuredIndex, TopLevelObject);
1351 if (StructuredList) {
1352 QualType ExprTy = T;
1357 StructuredList->
setType(ExprTy);
1363 if ((Index < IList->getNumInits() || CurEmbed) && !T->
isIncompleteType()) {
1365 bool ExtraInitsIsError = SemaRef.
getLangOpts().CPlusPlus ||
1367 hadError = ExtraInitsIsError;
1370 }
else if (StructuredIndex == 1 &&
1375 ? diag::err_excess_initializers_in_char_array_initializer
1376 : diag::ext_excess_initializers_in_char_array_initializer;
1380 unsigned DK = ExtraInitsIsError
1381 ? diag::err_excess_initializers_for_sizeless_type
1382 : diag::ext_excess_initializers_for_sizeless_type;
1393 unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
1394 : diag::ext_excess_initializers;
1408 if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {
1411 bool HasEquivCtor =
false;
1414 HasEquivCtor = CD && !CD->isDeleted();
1417 if (!HasEquivCtor) {
1419 diag::warn_cxx20_compat_aggregate_init_with_ctors)
1426void InitListChecker::CheckListElementTypes(
const InitializedEntity &Entity,
1427 InitListExpr *IList,
1429 bool SubobjectIsDesignatorContext,
1431 InitListExpr *StructuredList,
1432 unsigned &StructuredIndex,
1433 bool TopLevelObject) {
1437 CheckComplexType(Entity, IList, DeclType, Index,
1438 StructuredList, StructuredIndex);
1440 CheckScalarType(Entity, IList, DeclType, Index,
1441 StructuredList, StructuredIndex);
1443 CheckVectorType(Entity, IList, DeclType, Index,
1444 StructuredList, StructuredIndex);
1446 CheckMatrixType(Entity, IList, DeclType, Index, StructuredList,
1454 "non-aggregate records should be handed in CheckSubElementType");
1455 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1456 Bases = CXXRD->bases();
1460 CheckStructUnionTypes(Entity, IList, DeclType, Bases, RD->field_begin(),
1461 SubobjectIsDesignatorContext, Index, StructuredList,
1462 StructuredIndex, TopLevelObject);
1467 CheckArrayType(Entity, IList, DeclType,
Zero,
1468 SubobjectIsDesignatorContext, Index,
1469 StructuredList, StructuredIndex);
1474 SemaRef.
Diag(IList->
getBeginLoc(), diag::err_illegal_initializer_type)
1478 CheckReferenceType(Entity, IList, DeclType, Index,
1479 StructuredList, StructuredIndex);
1482 SemaRef.
Diag(IList->
getBeginLoc(), diag::err_init_objc_class) << DeclType;
1487 CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1494 assert(AggrDeductionCandidateParamTypes);
1495 AggrDeductionCandidateParamTypes->push_back(DeclType);
1498 SemaRef.
Diag(IList->
getBeginLoc(), diag::err_illegal_initializer_type)
1504void InitListChecker::CheckSubElementType(
const InitializedEntity &Entity,
1505 InitListExpr *IList,
1508 InitListExpr *StructuredList,
1509 unsigned &StructuredIndex,
1510 bool DirectlyDesignated) {
1514 return CheckReferenceType(Entity, IList, ElemType, Index,
1515 StructuredList, StructuredIndex);
1517 if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(
expr)) {
1518 if (SubInitList->getNumInits() == 1 &&
1523 expr = SubInitList->getInit(0);
1530 "found implicit initialization for the wrong type");
1531 UpdateStructuredListElement(StructuredList, StructuredIndex,
expr);
1542 InitializationKind
Kind =
1553 if (TmpEntity.getType()->isDependentType()) {
1558 assert(AggrDeductionCandidateParamTypes);
1573 !isa_and_present<ConstantArrayType>(
1576 AggrDeductionCandidateParamTypes->push_back(ElemType);
1580 InitializationSequence
Seq(SemaRef, TmpEntity, Kind,
expr,
1589 if (
auto *Embed = dyn_cast<EmbedExpr>(
expr)) {
1590 expr = HandleEmbed(Embed, Entity);
1597 UpdateStructuredListElement(StructuredList, StructuredIndex,
1601 }
else if (StructuredList) {
1602 UpdateStructuredListElement(StructuredList, StructuredIndex,
1607 if (AggrDeductionCandidateParamTypes)
1608 AggrDeductionCandidateParamTypes->push_back(ElemType);
1616 return CheckScalarType(Entity, IList, ElemType, Index,
1617 StructuredList, StructuredIndex);
1631 UpdateStructuredListElement(StructuredList, StructuredIndex,
expr);
1654 AssignConvertType::Incompatible) {
1662 UpdateStructuredListElement(StructuredList, StructuredIndex,
1663 ExprRes.
getAs<Expr>());
1680 CheckImplicitInitList(Entity, IList, ElemType, Index, StructuredList,
1685 if (DirectlyDesignated && SemaRef.
getLangOpts().CPlusPlus && !hadError) {
1686 if (InOverloadResolution)
1690 diag::ext_designated_init_brace_elision)
1691 <<
expr->getSourceRange()
1706 assert(
Copy.isInvalid() &&
1707 "expected non-aggregate initialization to fail");
1715void InitListChecker::CheckComplexType(
const InitializedEntity &Entity,
1716 InitListExpr *IList, QualType DeclType,
1718 InitListExpr *StructuredList,
1719 unsigned &StructuredIndex) {
1720 assert(Index == 0 &&
"Index in explicit init list must be zero");
1730 return CheckScalarType(Entity, IList, DeclType, Index, StructuredList,
1735 if (!SemaRef.
getLangOpts().CPlusPlus && !VerifyOnly)
1740 QualType elementType = DeclType->
castAs<ComplexType>()->getElementType();
1741 InitializedEntity ElementEntity =
1744 for (
unsigned i = 0; i < 2; ++i) {
1746 CheckSubElementType(ElementEntity, IList, elementType, Index,
1747 StructuredList, StructuredIndex);
1751void InitListChecker::CheckScalarType(
const InitializedEntity &Entity,
1752 InitListExpr *IList, QualType DeclType,
1754 InitListExpr *StructuredList,
1755 unsigned &StructuredIndex) {
1762 ? diag::warn_cxx98_compat_empty_sizeless_initializer
1763 : diag::err_empty_sizeless_initializer)
1768 ? diag::warn_cxx98_compat_empty_scalar_initializer
1769 : diag::err_empty_scalar_initializer)
1781 if (InitListExpr *SubIList = dyn_cast<InitListExpr>(
expr)) {
1785 SemaRef.
Diag(SubIList->getBeginLoc(), diag::ext_many_braces_around_init)
1788 CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList,
1794 diag::err_designator_for_scalar_or_sizeless_init)
1796 <<
expr->getSourceRange();
1801 }
else if (
auto *Embed = dyn_cast<EmbedExpr>(
expr)) {
1802 expr = HandleEmbed(Embed, Entity);
1817 Expr *ResultExpr =
nullptr;
1822 ResultExpr =
Result.getAs<Expr>();
1824 if (ResultExpr !=
expr && !VerifyOnly && !CurEmbed) {
1827 IList->
setInit(Index, ResultExpr);
1831 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1834 if (AggrDeductionCandidateParamTypes)
1835 AggrDeductionCandidateParamTypes->push_back(DeclType);
1838void InitListChecker::CheckReferenceType(
const InitializedEntity &Entity,
1839 InitListExpr *IList, QualType DeclType,
1841 InitListExpr *StructuredList,
1842 unsigned &StructuredIndex) {
1850 diag::err_init_reference_member_uninitialized)
1886 if (!VerifyOnly &&
expr)
1889 UpdateStructuredListElement(StructuredList, StructuredIndex,
expr);
1891 if (AggrDeductionCandidateParamTypes)
1892 AggrDeductionCandidateParamTypes->push_back(DeclType);
1895void InitListChecker::CheckMatrixType(
const InitializedEntity &Entity,
1896 InitListExpr *IList, QualType DeclType,
1898 InitListExpr *StructuredList,
1899 unsigned &StructuredIndex) {
1903 const ConstantMatrixType *MT = DeclType->
castAs<ConstantMatrixType>();
1910 "Inits must equal Matrix element count");
1915 InitializedEntity Element =
1918 while (Index < IList->getNumInits()) {
1923 CheckSubElementType(Element, IList, ElemTy, Index, StructuredList,
1928void InitListChecker::CheckVectorType(
const InitializedEntity &Entity,
1929 InitListExpr *IList, QualType DeclType,
1931 InitListExpr *StructuredList,
1932 unsigned &StructuredIndex) {
1933 const VectorType *VT = DeclType->
castAs<VectorType>();
1935 unsigned numEltsInit = 0;
1940 CheckEmptyInitializable(
1963 Expr *ResultExpr =
nullptr;
1967 ResultExpr =
Result.getAs<Expr>();
1969 if (ResultExpr !=
Init && !VerifyOnly) {
1972 IList->
setInit(Index, ResultExpr);
1975 UpdateStructuredListElement(StructuredList, StructuredIndex, ResultExpr);
1977 if (AggrDeductionCandidateParamTypes)
1978 AggrDeductionCandidateParamTypes->push_back(elementType);
1982 InitializedEntity ElementEntity =
1985 for (
unsigned i = 0; i < maxElements; ++i, ++numEltsInit) {
1988 CheckEmptyInitializable(ElementEntity, IList->
getEndLoc());
1993 CheckSubElementType(ElementEntity, IList, elementType, Index,
1994 StructuredList, StructuredIndex);
2001 const VectorType *T = Entity.
getType()->
castAs<VectorType>();
2002 if (isBigEndian && (T->
getVectorKind() == VectorKind::Neon ||
2015 diag::warn_neon_vector_initializer_non_portable);
2017 const char *typeCode;
2029 llvm_unreachable(
"Invalid element type!");
2033 ? diag::note_neon_vector_initializer_non_portable_q
2034 : diag::note_neon_vector_initializer_non_portable)
2035 << typeCode << typeSize;
2041 InitializedEntity ElementEntity =
2045 for (
unsigned i = 0; i < maxElements; ++i) {
2054 CheckSubElementType(ElementEntity, IList, elementType, Index,
2055 StructuredList, StructuredIndex);
2059 const VectorType *IVT = IType->
castAs<VectorType>();
2067 CheckSubElementType(ElementEntity, IList, VecType, Index,
2068 StructuredList, StructuredIndex);
2069 numEltsInit += numIElts;
2074 if (numEltsInit != maxElements) {
2077 diag::err_vector_incorrect_num_elements)
2078 << (numEltsInit < maxElements) << maxElements << numEltsInit
2105 SemaRef.
PDiag(diag::err_access_dtor_temp)
2125 ExprList.size() == 1
2126 ? dyn_cast_if_present<EmbedExpr>(ExprList[0]->IgnoreParens())
2139void InitListChecker::CheckArrayType(
const InitializedEntity &Entity,
2140 InitListExpr *IList, QualType &DeclType,
2141 llvm::APSInt elementIndex,
2142 bool SubobjectIsDesignatorContext,
2144 InitListExpr *StructuredList,
2145 unsigned &StructuredIndex) {
2163 if (Index < IList->getNumInits()) {
2176 if (StructuredList) {
2177 UpdateStructuredListElement(StructuredList, StructuredIndex,
2182 if (AggrDeductionCandidateParamTypes)
2183 AggrDeductionCandidateParamTypes->push_back(DeclType);
2187 if (
const VariableArrayType *VAT = dyn_cast<VariableArrayType>(
arrayType)) {
2204 SemaRef.
Diag(VAT->getSizeExpr()->getBeginLoc(),
2205 diag::err_variable_object_no_init)
2206 << VAT->getSizeExpr()->getSourceRange();
2215 llvm::APSInt maxElements(elementIndex.getBitWidth(),
2216 elementIndex.isUnsigned());
2217 bool maxElementsKnown =
false;
2218 if (
const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(
arrayType)) {
2219 maxElements = CAT->getSize();
2220 elementIndex = elementIndex.extOrTrunc(maxElements.getBitWidth());
2221 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2222 maxElementsKnown =
true;
2225 QualType elementType =
arrayType->getElementType();
2226 while (Index < IList->getNumInits()) {
2228 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(
Init)) {
2232 if (!SubobjectIsDesignatorContext)
2237 if (CheckDesignatedInitializer(Entity, IList, DIE, 0,
2238 DeclType,
nullptr, &elementIndex, Index,
2239 StructuredList, StructuredIndex,
true,
2245 if (elementIndex.getBitWidth() > maxElements.getBitWidth())
2246 maxElements = maxElements.extend(elementIndex.getBitWidth());
2247 else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
2248 elementIndex = elementIndex.extend(maxElements.getBitWidth());
2249 elementIndex.setIsUnsigned(maxElements.isUnsigned());
2253 if (!maxElementsKnown && elementIndex > maxElements)
2254 maxElements = elementIndex;
2261 if (maxElementsKnown && elementIndex == maxElements)
2265 SemaRef.
Context, StructuredIndex, Entity);
2268 unsigned EmbedElementIndexBeforeInit = CurEmbedIndex;
2270 CheckSubElementType(ElementEntity, IList, elementType, Index,
2271 StructuredList, StructuredIndex);
2276 elementIndex + CurEmbedIndex - EmbedElementIndexBeforeInit - 1;
2280 EmbedElementIndexBeforeInit - 1;
2286 if (!maxElementsKnown && elementIndex > maxElements)
2287 maxElements = elementIndex;
2292 llvm::APSInt
Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
2296 SemaRef.
Diag(IList->
getBeginLoc(), diag::ext_typecheck_zero_array_size);
2300 elementType, maxElements,
nullptr, ArraySizeModifier::Normal, 0);
2307 if ((maxElementsKnown && elementIndex < maxElements) ||
2309 CheckEmptyInitializable(
2315bool InitListChecker::CheckFlexibleArrayInit(
const InitializedEntity &Entity,
2318 bool TopLevelObject) {
2320 unsigned FlexArrayDiag;
2324 FlexArrayDiag = diag::ext_flexible_array_init;
2325 }
else if (!TopLevelObject) {
2327 FlexArrayDiag = diag::err_flexible_array_init;
2330 FlexArrayDiag = diag::err_flexible_array_init;
2333 FlexArrayDiag = diag::err_flexible_array_init;
2336 FlexArrayDiag = diag::ext_flexible_array_init;
2342 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
2346 return FlexArrayDiag != diag::ext_flexible_array_init;
2350 return StructuredList && StructuredList->
getNumInits() == 1U;
2353void InitListChecker::CheckStructUnionTypes(
2354 const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType,
2356 bool SubobjectIsDesignatorContext,
unsigned &Index,
2357 InitListExpr *StructuredList,
unsigned &StructuredIndex,
2358 bool TopLevelObject) {
2372 for (FieldDecl *FD : RD->
fields()) {
2383 if (!StructuredList)
2386 Field != FieldEnd; ++Field) {
2387 if (
Field->hasInClassInitializer() ||
2388 (
Field->isAnonymousStructOrUnion() &&
2390 ->castAsCXXRecordDecl()
2391 ->hasInClassInitializer())) {
2397 llvm_unreachable(
"Couldn't find in-class initializer");
2403 Field != FieldEnd; ++Field) {
2404 if (!
Field->isUnnamedBitField()) {
2405 CheckEmptyInitializable(
2416 bool InitializedSomething =
false;
2419 for (
auto I = Bases.begin(), E = Bases.end(); I != E; ++I) {
2425 if (isa_and_nonnull<DesignatedInitExpr>(
Init))
2442 if (AggrDeductionCandidateParamTypes &&
Base.isPackExpansion()) {
2443 AggrDeductionCandidateParamTypes->push_back(
2448 if (Index < IList->getNumInits())
2458 SemaRef.
Context, &Base,
false, &Entity);
2460 CheckSubElementType(BaseEntity, IList,
Base.getType(), Index,
2461 StructuredList, StructuredIndex);
2462 InitializedSomething =
true;
2464 CheckEmptyInitializable(BaseEntity, InitLoc);
2479 size_t NumRecordDecls = llvm::count_if(RD->
decls(), [&](
const Decl *D) {
2480 return isa<FieldDecl>(D) || isa<RecordDecl>(D);
2482 bool HasDesignatedInit =
false;
2484 llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;
2486 while (Index < IList->getNumInits()) {
2488 SourceLocation InitLoc =
Init->getBeginLoc();
2490 if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(
Init)) {
2494 if (!SubobjectIsDesignatorContext)
2497 HasDesignatedInit =
true;
2501 bool DesignatedInitFailed = CheckDesignatedInitializer(
2502 Entity, IList, DIE, 0, DeclType, &Field,
nullptr, Index,
2503 StructuredList, StructuredIndex,
true, TopLevelObject);
2504 if (DesignatedInitFailed)
2508 DesignatedInitExpr::Designator *D = DIE->getDesignator(0);
2511 InitializedFields.insert(F);
2512 if (!DesignatedInitFailed) {
2521 InitializedSomething =
true;
2538 if (NumRecordDecls == 1)
2540 if (
const auto *IL = dyn_cast<IntegerLiteral>(I))
2541 return IL->getValue().isZero();
2549 SemaRef.
Diag(InitLoc, diag::err_non_designated_init_used);
2554 if (Field == FieldEnd) {
2560 if (InitializedSomething && RD->
isUnion())
2564 if (
Field->getType()->isIncompleteArrayType())
2567 if (
Field->isUnnamedBitField()) {
2576 InvalidUse = !SemaRef.
CanUseDecl(*Field, TreatUnavailableAsInvalid);
2595 InitializedEntity MemberEntity =
2597 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
2598 StructuredList, StructuredIndex);
2599 InitializedSomething =
true;
2600 InitializedFields.insert(*Field);
2612 bool IsCDesignatedInitializer =
2613 HasDesignatedInit && !SemaRef.
getLangOpts().CPlusPlus;
2614 if (!VerifyOnly && InitializedSomething && !RD->
isUnion() &&
2616 !IsCDesignatedInitializer) {
2623 if (HasDesignatedInit && InitializedFields.count(*it))
2626 if (!it->isUnnamedBitField() && !it->hasInClassInitializer() &&
2627 !it->getType()->isIncompleteArrayType()) {
2628 auto Diag = HasDesignatedInit
2629 ? diag::warn_missing_designated_field_initializers
2630 : diag::warn_missing_field_initializers;
2639 if (!StructuredList && Field != FieldEnd && !RD->
isUnion() &&
2640 !
Field->getType()->isIncompleteArrayType()) {
2641 for (;
Field != FieldEnd && !hadError; ++
Field) {
2642 if (!
Field->isUnnamedBitField() && !
Field->hasInClassInitializer())
2643 CheckEmptyInitializable(
2664 if (Field == FieldEnd || !
Field->getType()->isIncompleteArrayType() ||
2668 if (CheckFlexibleArrayInit(Entity, IList->
getInit(Index), *Field,
2675 InitializedEntity MemberEntity =
2679 AggrDeductionCandidateParamTypes)
2680 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
2681 StructuredList, StructuredIndex);
2683 CheckImplicitInitList(MemberEntity, IList,
Field->getType(), Index,
2684 StructuredList, StructuredIndex);
2705 PE = IndirectField->
chain_end(); PI != PE; ++PI) {
2721 &Replacements[0] + Replacements.size());
2728 for (
unsigned I = 0; I < NumIndexExprs; ++I)
2740class FieldInitializerValidatorCCC final :
public CorrectionCandidateCallback {
2742 explicit FieldInitializerValidatorCCC(
const RecordDecl *RD)
2745 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
2750 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
2751 return std::make_unique<FieldInitializerValidatorCCC>(*
this);
2755 const RecordDecl *
Record;
2798InitListChecker::CheckDesignatedInitializer(
const InitializedEntity &Entity,
2799 InitListExpr *IList,
2800 DesignatedInitExpr *DIE,
2802 QualType &CurrentObjectType,
2804 llvm::APSInt *NextElementIndex,
2806 InitListExpr *StructuredList,
2807 unsigned &StructuredIndex,
2808 bool FinishSubobjectInit,
2809 bool TopLevelObject) {
2810 if (DesigIdx == DIE->
size()) {
2818 "designator result in direct non-list initialization?");
2821 InitializationSequence
Seq(SemaRef, Entity, Kind,
Init,
2823 if (StructuredList) {
2827 UpdateStructuredListElement(StructuredList, StructuredIndex,
2831 if (AggrDeductionCandidateParamTypes)
2832 AggrDeductionCandidateParamTypes->push_back(CurrentObjectType);
2837 bool prevHadError = hadError;
2842 unsigned OldIndex = Index;
2844 dyn_cast_if_present<DesignatedInitExpr>(IList->
getInit(OldIndex));
2847 IList->
setInit(OldIndex, OldDIE->getInit());
2849 CheckSubElementType(Entity, IList, CurrentObjectType, Index, StructuredList,
2850 StructuredIndex,
true);
2854 if (IList->
getInit(OldIndex) != OldDIE->getInit())
2855 OldDIE->setInit(IList->
getInit(OldIndex));
2856 IList->
setInit(OldIndex, OldDIE);
2858 return hadError && !prevHadError;
2861 DesignatedInitExpr::Designator *D = DIE->
getDesignator(DesigIdx);
2862 bool IsFirstDesignator = (DesigIdx == 0);
2863 if (IsFirstDesignator ? FullyStructuredList : StructuredList) {
2866 if (IsFirstDesignator)
2867 StructuredList = FullyStructuredList;
2869 Expr *ExistingInit = StructuredIndex < StructuredList->getNumInits() ?
2870 StructuredList->getInit(StructuredIndex) :
nullptr;
2871 if (!ExistingInit && StructuredList->hasArrayFiller())
2872 ExistingInit = StructuredList->getArrayFiller();
2875 StructuredList = getStructuredSubobjectInit(
2876 IList, Index, CurrentObjectType, StructuredList, StructuredIndex,
2878 else if (InitListExpr *
Result = dyn_cast<InitListExpr>(ExistingInit))
2892 diagnoseInitOverride(ExistingInit,
2898 if (DesignatedInitUpdateExpr *E =
2899 dyn_cast<DesignatedInitUpdateExpr>(ExistingInit))
2900 StructuredList = E->getUpdater();
2902 DesignatedInitUpdateExpr *DIUE =
new (SemaRef.
Context)
2905 StructuredList->updateInit(SemaRef.
Context, StructuredIndex, DIUE);
2914 StructuredList =
nullptr;
2936 SemaRef.
Diag(Loc, diag::err_field_designator_non_aggr)
2937 << SemaRef.
getLangOpts().CPlusPlus << CurrentObjectType;
2946 if (
auto *FD = dyn_cast_if_present<FieldDecl>(VD)) {
2948 }
else if (
auto *IFD = dyn_cast_if_present<IndirectFieldDecl>(VD)) {
2969 if (DeclContextLookupResult Lookup = RD->
lookup(FieldName);
2973 SemaRef.
Diag(Lookup.front()->getLocation(),
2974 diag::note_field_designator_found);
2981 FieldInitializerValidatorCCC CCC(RD);
2982 if (TypoCorrection Corrected = SemaRef.
CorrectTypo(
2985 CorrectTypoKind::ErrorRecovery, RD)) {
2988 SemaRef.
PDiag(diag::err_field_designator_unknown_suggest)
2989 << FieldName << CurrentObjectType);
2990 KnownField = Corrected.getCorrectionDeclAs<FieldDecl>();
3001 SemaRef.
Diag(Loc, diag::err_field_designator_unknown)
3009 unsigned NumBases = 0;
3010 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3011 NumBases = CXXRD->getNumBases();
3013 unsigned FieldIndex = NumBases;
3015 for (
auto *FI : RD->
fields()) {
3016 if (FI->isUnnamedBitField())
3032 if (StructuredList) {
3033 FieldDecl *CurrentField = StructuredList->getInitializedFieldInUnion();
3035 assert(StructuredList->getNumInits() == 1
3036 &&
"A union should never have more than one initializer!");
3038 Expr *ExistingInit = StructuredList->getInit(0);
3041 diagnoseInitOverride(
3049 StructuredList->resizeInits(SemaRef.
Context, 0);
3050 StructuredList->setInitializedFieldInUnion(
nullptr);
3053 StructuredList->setInitializedFieldInUnion(*Field);
3060 InvalidUse = !SemaRef.
CanUseDecl(*Field, TreatUnavailableAsInvalid);
3083 if (IsFirstDesignator && !VerifyOnly && SemaRef.
getLangOpts().CPlusPlus &&
3086 (*NextField)->getFieldIndex() >
Field->getFieldIndex() + 1)) {
3088 FieldDecl *PrevField =
nullptr;
3090 if (FI->isUnnamedBitField())
3098 const auto GenerateDesignatedInitReorderingFixit =
3099 [&](SemaBase::SemaDiagnosticBuilder &
Diag) {
3100 struct ReorderInfo {
3102 const Expr *InitExpr{};
3105 llvm::SmallDenseMap<IdentifierInfo *, int> MemberNameInx{};
3106 llvm::SmallVector<ReorderInfo, 16> ReorderedInitExprs{};
3108 const auto *CxxRecord =
3111 for (
const FieldDecl *Field : CxxRecord->fields())
3112 MemberNameInx[
Field->getIdentifier()] =
Field->getFieldIndex();
3114 for (
const Expr *
Init : IList->
inits()) {
3115 if (
const auto *DI =
3116 dyn_cast_if_present<DesignatedInitExpr>(
Init)) {
3118 if (DI->size() != 1)
3121 const IdentifierInfo *
const FieldName =
3122 DI->getDesignator(0)->getFieldName();
3125 if (MemberNameInx.contains(FieldName))
3126 ReorderedInitExprs.emplace_back(
3127 ReorderInfo{MemberNameInx.at(FieldName),
Init});
3131 llvm::sort(ReorderedInitExprs,
3132 [](
const ReorderInfo &A,
const ReorderInfo &B) {
3133 return A.Pos < B.Pos;
3136 llvm::SmallString<128> FixedInitList{};
3138 const LangOptions &LangOpts = SemaRef.
getLangOpts();
3142 const ArrayRef<clang::Expr *> IListInits =
3143 IList->
inits().drop_front(CxxRecord->getNumBases());
3145 for (
const auto &[OrigExpr, Repl] :
3146 llvm::zip(IListInits, ReorderedInitExprs)) {
3148 Repl.InitExpr->getSourceRange());
3149 const StringRef InitText =
3160 diag::ext_designated_init_reordered)
3163 unsigned OldIndex = StructuredIndex - 1;
3164 if (StructuredList && OldIndex <= StructuredList->getNumInits()) {
3165 if (Expr *PrevInit = StructuredList->getInit(OldIndex)) {
3166 auto Diag = SemaRef.
Diag(PrevInit->getBeginLoc(),
3167 diag::note_previous_field_init)
3169 GenerateDesignatedInitReorderingFixit(
Diag);
3182 if (StructuredList && FieldIndex >= StructuredList->getNumInits())
3183 StructuredList->resizeInits(SemaRef.
Context, FieldIndex + 1);
3186 if (
Field->getType()->isIncompleteArrayType()) {
3188 if ((DesigIdx + 1) != DIE->
size()) {
3192 DesignatedInitExpr::Designator *NextD
3195 diag::err_designator_into_flexible_array_member)
3197 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
3208 diag::err_flexible_array_init_needs_braces)
3210 SemaRef.
Diag(
Field->getLocation(), diag::note_flexible_array_member)
3217 if (!
Invalid && CheckFlexibleArrayInit(Entity, DIE->
getInit(), *Field,
3227 bool prevHadError = hadError;
3228 unsigned newStructuredIndex = FieldIndex;
3229 unsigned OldIndex = Index;
3232 InitializedEntity MemberEntity =
3234 CheckSubElementType(MemberEntity, IList,
Field->getType(), Index,
3235 StructuredList, newStructuredIndex);
3237 IList->
setInit(OldIndex, DIE);
3238 if (hadError && !prevHadError) {
3243 StructuredIndex = FieldIndex;
3248 QualType FieldType =
Field->getType();
3249 unsigned newStructuredIndex = FieldIndex;
3251 InitializedEntity MemberEntity =
3253 if (CheckDesignatedInitializer(MemberEntity, IList, DIE, DesigIdx + 1,
3254 FieldType,
nullptr,
nullptr, Index,
3255 StructuredList, newStructuredIndex,
3256 FinishSubobjectInit,
false))
3267 if (IsFirstDesignator) {
3274 StructuredIndex = FieldIndex;
3278 if (!FinishSubobjectInit)
3286 bool prevHadError = hadError;
3291 CheckStructUnionTypes(Entity, IList, CurrentObjectType, NoBases, Field,
3292 false, Index, StructuredList, FieldIndex);
3293 return hadError && !prevHadError;
3315 << CurrentObjectType;
3320 Expr *IndexExpr =
nullptr;
3321 llvm::APSInt DesignatedStartIndex, DesignatedEndIndex;
3325 DesignatedEndIndex = DesignatedStartIndex;
3329 DesignatedStartIndex =
3331 DesignatedEndIndex =
3340 if (DesignatedStartIndex.getZExtValue()!=DesignatedEndIndex.getZExtValue()&&
3347 DesignatedStartIndex
3348 = DesignatedStartIndex.extOrTrunc(MaxElements.getBitWidth());
3349 DesignatedStartIndex.setIsUnsigned(MaxElements.isUnsigned());
3351 = DesignatedEndIndex.extOrTrunc(MaxElements.getBitWidth());
3352 DesignatedEndIndex.setIsUnsigned(MaxElements.isUnsigned());
3353 if (DesignatedEndIndex >= MaxElements) {
3356 diag::err_array_designator_too_large)
3363 unsigned DesignatedIndexBitWidth =
3365 DesignatedStartIndex =
3366 DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
3367 DesignatedEndIndex =
3368 DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
3369 DesignatedStartIndex.setIsUnsigned(
true);
3370 DesignatedEndIndex.setIsUnsigned(
true);
3373 bool IsStringLiteralInitUpdate =
3374 StructuredList && StructuredList->isStringLiteralInit();
3375 if (IsStringLiteralInitUpdate && VerifyOnly) {
3378 StructuredList =
nullptr;
3379 }
else if (IsStringLiteralInitUpdate) {
3382 ASTContext &Context = SemaRef.
Context;
3383 Expr *SubExpr = StructuredList->getInit(0)->IgnoreParenImpCasts();
3389 QualType PromotedCharTy = CharTy;
3392 unsigned PromotedCharTyWidth = Context.
getTypeSize(PromotedCharTy);
3394 if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) {
3397 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT);
3398 CAT && CAT->getSize().ult(StrLen))
3399 StrLen = CAT->getZExtSize();
3400 StructuredList->resizeInits(Context, StrLen);
3404 for (
unsigned i = 0, e = StrLen; i != e; ++i) {
3405 llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i));
3406 Expr *
Init =
new (Context) IntegerLiteral(
3407 Context, CodeUnit, PromotedCharTy, SubExpr->
getExprLoc());
3408 if (CharTy != PromotedCharTy)
3411 FPOptionsOverride());
3412 StructuredList->updateInit(Context, i,
Init);
3421 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT);
3422 CAT && CAT->getSize().ult(StrLen))
3423 StrLen = CAT->getZExtSize();
3424 StructuredList->resizeInits(Context, StrLen);
3428 for (
unsigned i = 0, e = StrLen; i != e; ++i) {
3429 llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]);
3430 Expr *
Init =
new (Context) IntegerLiteral(
3431 Context, CodeUnit, PromotedCharTy, SubExpr->
getExprLoc());
3432 if (CharTy != PromotedCharTy)
3435 FPOptionsOverride());
3436 StructuredList->updateInit(Context, i,
Init);
3443 if (StructuredList &&
3444 DesignatedEndIndex.getZExtValue() >= StructuredList->getNumInits())
3445 StructuredList->resizeInits(SemaRef.
Context,
3446 DesignatedEndIndex.getZExtValue() + 1);
3452 unsigned ElementIndex = DesignatedStartIndex.getZExtValue();
3453 unsigned OldIndex = Index;
3455 InitializedEntity ElementEntity =
3458 while (DesignatedStartIndex <= DesignatedEndIndex) {
3464 if (CheckDesignatedInitializer(
3465 ElementEntity, IList, DIE, DesigIdx + 1, ElementType,
nullptr,
3466 nullptr, Index, StructuredList, ElementIndex,
3467 FinishSubobjectInit && (DesignatedStartIndex == DesignatedEndIndex),
3472 ++DesignatedStartIndex;
3473 ElementIndex = DesignatedStartIndex.getZExtValue();
3478 if (IsFirstDesignator) {
3479 if (NextElementIndex)
3480 *NextElementIndex = std::move(DesignatedStartIndex);
3481 StructuredIndex = ElementIndex;
3485 if (!FinishSubobjectInit)
3489 bool prevHadError = hadError;
3490 CheckArrayType(Entity, IList, CurrentObjectType, DesignatedStartIndex,
3492 StructuredList, ElementIndex);
3493 return hadError && !prevHadError;
3499InitListChecker::getStructuredSubobjectInit(InitListExpr *IList,
unsigned Index,
3500 QualType CurrentObjectType,
3501 InitListExpr *StructuredList,
3502 unsigned StructuredIndex,
3503 SourceRange InitRange,
3504 bool IsFullyOverwritten) {
3505 if (!StructuredList)
3508 Expr *ExistingInit =
nullptr;
3509 if (StructuredIndex < StructuredList->getNumInits())
3510 ExistingInit = StructuredList->
getInit(StructuredIndex);
3512 if (InitListExpr *
Result = dyn_cast_or_null<InitListExpr>(ExistingInit))
3521 if (!IsFullyOverwritten)
3544 diagnoseInitOverride(ExistingInit, InitRange);
3547 unsigned ExpectedNumInits = 0;
3548 if (Index < IList->getNumInits()) {
3549 if (
auto *
Init = dyn_cast_or_null<InitListExpr>(IList->
getInit(Index)))
3550 ExpectedNumInits =
Init->getNumInits();
3555 InitListExpr *
Result = createInitListExpr(
3556 CurrentObjectType, InitRange, ExpectedNumInits,
false);
3564InitListExpr *InitListChecker::createInitListExpr(QualType CurrentObjectType,
3565 SourceRange InitRange,
3566 unsigned ExpectedNumInits,
3570 {}, InitRange.
getEnd(), IsExplicit);
3572 QualType ResultType = CurrentObjectType;
3575 Result->setType(ResultType);
3578 unsigned NumElements = 0;
3580 if (
const ArrayType *AType
3582 if (
const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(AType)) {
3583 NumElements = CAType->getZExtSize();
3586 if (NumElements > ExpectedNumInits)
3589 }
else if (
const VectorType *VType = CurrentObjectType->
getAs<VectorType>()) {
3590 NumElements = VType->getNumElements();
3592 NumElements = numStructUnionElements(CurrentObjectType);
3604void InitListChecker::UpdateStructuredListElement(InitListExpr *StructuredList,
3605 unsigned &StructuredIndex,
3608 if (!StructuredList)
3612 StructuredIndex,
expr)) {
3618 diagnoseInitOverride(PrevInit,
expr->getSourceRange());
3627 InitListChecker Check(*
this, Entity, From,
Type,
true,
3630 return !Check.HadError();
3651 return S.
Diag(Loc, diag::err_array_designator_negative)
3654 Value.setIsUnsigned(
true);
3673 Designators.push_back(ASTDesignator::CreateFieldDesignator(
3677 llvm::APSInt IndexValue;
3683 Designators.push_back(ASTDesignator::CreateArrayDesignator(
3685 InitExpressions.push_back(Index);
3690 llvm::APSInt StartValue;
3691 llvm::APSInt EndValue;
3696 if (!StartDependent)
3702 if (!StartIndex || !EndIndex)
3706 if (StartDependent || EndDependent) {
3708 }
else if (StartValue.getBitWidth() > EndValue.getBitWidth())
3709 EndValue = EndValue.extend(StartValue.getBitWidth());
3710 else if (StartValue.getBitWidth() < EndValue.getBitWidth())
3711 StartValue = StartValue.extend(EndValue.getBitWidth());
3713 if (!StartDependent && !EndDependent && EndValue < StartValue) {
3719 Designators.push_back(ASTDesignator::CreateArrayRangeDesignator(
3722 InitExpressions.push_back(StartIndex);
3723 InitExpressions.push_back(EndIndex);
3733 EqualOrColonLoc, GNUSyntax,
3741InitializedEntity::InitializedEntity(
ASTContext &Context,
unsigned Index,
3743 : Parent(&Parent), Index(Index)
3746 Kind = EK_ArrayElement;
3747 Type = AT->getElementType();
3749 Kind = EK_VectorElement;
3750 Type = VT->getElementType();
3752 Kind = EK_MatrixElement;
3753 Type = MT->getElementType();
3755 const ComplexType *CT = Parent.getType()->getAs<ComplexType>();
3756 assert(CT &&
"Unexpected type");
3757 Kind = EK_ComplexElement;
3758 Type = CT->getElementType();
3765 bool IsInheritedVirtualBase,
3766 const InitializedEntity *Parent) {
3767 InitializedEntity
Result;
3770 Result.Base = {
Base, IsInheritedVirtualBase};
3788 return Variable.VariableOrMember->getDeclName();
3811 llvm_unreachable(
"Invalid EntityKind!");
3846 llvm_unreachable(
"Invalid EntityKind!");
3882unsigned InitializedEntity::dumpImpl(raw_ostream &OS)
const {
3885 for (
unsigned I = 0; I != Depth; ++I)
3902 case EK_New: OS <<
"New";
break;
3906 case EK_Base: OS <<
"Base";
break;
3911 OS <<
"MatrixElement " <<
Index;
3916 OS <<
"Block (lambda)";
3919 OS <<
"LambdaCapture ";
3926 D->printQualifiedName(OS);
3935 dumpImpl(llvm::errs());
3990 for (
const Step &S : llvm::reverse(Steps)) {
4051 llvm_unreachable(
"Invalid EntityKind!");
4059InitializationSequence
4062 bool HadMultipleCandidates) {
4087 bool BindingTemporary) {
4112 bool HadMultipleCandidates) {
4157 bool TopLevelOfInitList) {
4175 bool HadMultipleCandidates,
bool FromInitList,
bool AsInitList) {
4226 Steps.insert(Steps.begin(), S);
4287 "Can only unwrap trivial init lists.");
4291 Steps.insert(Steps.begin(), S);
4297 "Can only rewrap trivial init lists.");
4301 Steps.insert(Steps.begin(), S);
4312 this->Failure = Failure;
4313 this->FailedOverloadResult =
Result;
4334 if (!
Init.empty()) {
4354 "consuming an object of unretainable type?");
4374 bool TreatUnavailableAsInvalid) {
4392 Expr *OVEAsExpr = OVE;
4395 TreatUnavailableAsInvalid);
4401 const InitializedEntity &Entity,
4402 const InitializationKind &Kind,
4403 InitListExpr *InitList,
4405 bool TreatUnavailableAsInvalid);
4416 bool TreatUnavailableAsInvalid) {
4437 TreatUnavailableAsInvalid);
4464 bool CopyInitializing,
bool AllowExplicit,
bool OnlyListConstructors,
4465 bool IsListInit,
bool RequireActualConstructor,
4466 bool SecondStepOfCopyInit =
false) {
4472 if (!Info.Constructor || Info.Constructor->isInvalidDecl())
4489 bool SuppressUserConversions =
4490 SecondStepOfCopyInit ||
4494 if (Info.ConstructorTmpl)
4496 Info.ConstructorTmpl, Info.FoundDecl,
4497 nullptr, Args, CandidateSet, SuppressUserConversions,
4498 false, AllowExplicit);
4507 bool AllowExplicitConv = AllowExplicit && !CopyInitializing &&
4511 CandidateSet, SuppressUserConversions,
4512 false, AllowExplicit,
4528 if (S.
getLangOpts().CPlusPlus17 && Args.size() == 1 &&
4529 !RequireActualConstructor && !SecondStepOfCopyInit) {
4531 auto *SourceRD =
Initializer->getType()->getAsCXXRecordDecl();
4533 const auto &Conversions = SourceRD->getVisibleConversionFunctions();
4534 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
4548 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
4549 CandidateSet, AllowExplicit, AllowExplicit,
4553 DestType, CandidateSet, AllowExplicit,
4580 bool IsListInit =
false,
4581 bool IsInitListCopy =
false) {
4582 assert(((!IsListInit && !IsInitListCopy) ||
4584 "IsListInit/IsInitListCopy must come with a single initializer list "
4597 bool RequireActualConstructor =
4603 bool CopyElisionPossible =
false;
4604 auto ElideConstructor = [&] {
4620 if (S.
getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
4621 UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
4643 assert(!IsInitListCopy &&
4644 "IsInitListCopy only possible with aggregate types");
4645 CopyElisionPossible =
true;
4659 bool AllowExplicit = Kind.AllowExplicit() || IsListInit;
4669 bool AsInitializerList =
false;
4681 AsInitializerList =
true;
4687 S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
4688 CopyInitialization, AllowExplicit,
4689 true, IsListInit, RequireActualConstructor);
4706 Args[0]->getType().getNonReferenceType(),
4708 RequireActualConstructor =
true;
4716 AsInitializerList =
false;
4718 S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
4719 Best, CopyInitialization, AllowExplicit,
4720 false, IsListInit, RequireActualConstructor);
4732 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
4736 if (
auto *CD = dyn_cast<CXXConversionDecl>(Best->Function)) {
4738 QualType ConvType = CD->getConversionType();
4740 "should not have selected this conversion function");
4742 HadMultipleCandidates);
4756 DestRecordDecl->isAggregate() &&
4757 DestRecordDecl->hasUninitializedExplicitInitFields() &&
4759 S.
Diag(Kind.getLocation(), diag::warn_field_requires_explicit_init)
4760 << 1 << DestRecordDecl;
4785 if (IsListInit && !Kind.AllowExplicit() && CtorDecl->
isExplicit()) {
4805 Best->FoundDecl, CtorDecl, DestArrayType, HadMultipleCandidates,
4806 IsListInit | IsInitListCopy, AsInitializerList);
4810 Sema &S,
const InitializedEntity &Entity,
const InitializationKind &Kind,
4826 bool IsAggrListInit) {
4844 Sequence,
false, IsAggrListInit);
4872 bool HadMultipleCandidates =
false;
4875 UnqualifiedTargetType,
4877 &HadMultipleCandidates)) {
4879 HadMultipleCandidates);
4880 SourceType = Fn->getType();
4891 const InitializedEntity &Entity,
4892 const InitializationKind &Kind,
4894 QualType cv1T1, QualType T1,
4896 QualType cv2T2, QualType T2,
4899 bool TopLevelOfInitList);
4902 const InitializedEntity &Entity,
4903 const InitializationKind &Kind,
4905 InitListExpr *InitList =
nullptr);
4913 bool TreatUnavailableAsInvalid) {
4953 T1Quals, cv2T2, T2, T2Quals, Sequence,
4961 if (!Sequence.
steps().empty())
4984 TreatUnavailableAsInvalid);
5016 bool TreatUnavailableAsInvalid) {
5033 TreatUnavailableAsInvalid);
5071 !IsDesignatedInit) {
5082 Expr *InitListAsExpr = InitList;
5084 S, Entity, SubKind, InitListAsExpr, DestType, Sequence,
5105 "Deduced to other type?");
5107 "List-initialize structured bindings but not "
5108 "direct-list-initialization?");
5113 Entity, SubInit[0], DestType, Sequence,
5114 TreatUnavailableAsInvalid);
5130 TreatUnavailableAsInvalid);
5163 TreatUnavailableAsInvalid))
5167 Expr *InitListAsExpr = InitList;
5169 DestType, Sequence,
true);
5235 if (
Init->getType()->isRecordType() ||
5246 TreatUnavailableAsInvalid);
5253 InitListChecker CheckInitList(S, Entity, InitList,
5254 DestType,
true, TreatUnavailableAsInvalid);
5255 if (CheckInitList.HadError()) {
5277 "Must have incompatible references when binding via conversion");
5288 bool AllowExplicitCtors =
false;
5289 bool AllowExplicitConvs = Kind.allowExplicitConversionFunctionsInRefBinding();
5294 if (T1RecordDecl->isInvalidDecl())
5300 if (!Info.Constructor)
5303 if (!Info.Constructor->isInvalidDecl() &&
5304 Info.Constructor->isConvertingConstructor(
true)) {
5305 if (Info.ConstructorTmpl)
5307 Info.ConstructorTmpl, Info.FoundDecl,
5310 false, AllowExplicitCtors);
5313 Info.Constructor, Info.FoundDecl,
Initializer, CandidateSet,
5315 false, AllowExplicitCtors);
5322 if (T2RecordDecl->isInvalidDecl())
5326 const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
5327 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
5346 if ((AllowRValues ||
5350 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
5352 false, AllowExplicitConvs);
5355 Conv, I.getPair(), ActingDC,
Initializer, DestType, CandidateSet,
5356 false, AllowExplicitConvs);
5377 cv3T3 = Function->getReturnType();
5389 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
5391 HadMultipleCandidates);
5402 "should not have conversion after constructor");
5406 ICS.
Standard = Best->FinalConversion;
5427 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5429 else if (RefConv & Sema::ReferenceConversions::ObjC)
5431 else if (RefConv & Sema::ReferenceConversions::Function)
5433 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5442 const InitializedEntity &Entity,
5450 bool TopLevelOfInitList) {
5468 T1Quals, cv2T2, T2, T2Quals, Sequence,
5469 TopLevelOfInitList);
5493 bool TopLevelOfInitList) {
5517 if (isLValueRef || T1Function) {
5520 (Kind.isCStyleOrFunctionalCast() &&
5524 if (RefConv & (Sema::ReferenceConversions::DerivedToBase |
5525 Sema::ReferenceConversions::ObjC)) {
5528 if (RefConv & (Sema::ReferenceConversions::Qualification))
5532 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5536 }
else if (RefConv & Sema::ReferenceConversions::Qualification) {
5540 }
else if (RefConv & Sema::ReferenceConversions::Function) {
5560 (isLValueRef || InitCategory.
isRValue())) {
5565 isLValueRef, Sequence);
5600 switch (RefRelationship) {
5603 FK = InitializationSequence::
5604 FK_NonConstLValueReferenceBindingToBitfield;
5606 FK = InitializationSequence::
5607 FK_NonConstLValueReferenceBindingToVectorElement;
5609 FK = InitializationSequence::
5610 FK_NonConstLValueReferenceBindingToMatrixElement;
5612 llvm_unreachable(
"unexpected kind of compatible initializer");
5618 FK = InitializationSequence::
5619 FK_NonConstLValueReferenceBindingToUnrelated;
5636 (Kind.isCStyleOrFunctionalCast() &&
5665 auto T1QualsIgnoreAS = T1Quals;
5666 auto T2QualsIgnoreAS = T2Quals;
5668 T1QualsIgnoreAS.removeAddressSpace();
5669 T2QualsIgnoreAS.removeAddressSpace();
5681 if (T1QualsIgnoreAS != T2QualsIgnoreAS)
5691 cv1T4 = cv1T4WithAS;
5696 if (RefConv & Sema::ReferenceConversions::DerivedToBase)
5698 else if (RefConv & Sema::ReferenceConversions::ObjC)
5700 else if (RefConv & Sema::ReferenceConversions::Qualification) {
5717 isLValueRef, Sequence);
5757 Sema::AllowedExplicit::None,
5759 Kind.isCStyleOrFunctionalCast(),
5778 TopLevelOfInitList);
5787 ((T1CVRQuals | T2CVRQuals) != T1CVRQuals ||
5832 assert((!InitList || InitList->
getNumInits() == 0) &&
5833 "Shouldn't use value-init for non-empty init lists");
5839 assert(!T->isVoidType() &&
"Cannot value-init void");
5844 if (
auto *ClassDecl = T->getAsCXXRecordDecl()) {
5845 bool NeedZeroInitialization =
true;
5860 NeedZeroInitialization =
false;
5868 if (NeedZeroInitialization)
5882 ClassDecl->hasUninitializedReferenceMember()) {
5890 Expr *InitListAsExpr = InitList;
5892 bool InitListSyntax = InitList;
5897 S, Entity, Kind, Args, T, Entity.
getType(), Sequence, InitListSyntax);
5946 unsigned EntityIndexToProcess = 0;
5949 Expr *ArrayFiller =
nullptr;
5950 FieldDecl *InitializedFieldInUnion =
nullptr;
5954 Expr *Arg,
Expr **InitExpr =
nullptr) {
5956 S, SubEntity, SubKind,
5972 ER = IS.
Perform(S, SubEntity, SubKind,
5979 *InitExpr = ER.
get();
5981 InitExprs.push_back(ER.
get());
5988 uint64_t ArrayLength;
5996 ArrayLength = CAT->getZExtSize();
5997 ResultType = Entity.
getType();
6004 const Expr *SE = VAT->getSizeExpr();
6010 ArrayLength = Args.size();
6012 EntityIndexToProcess = ArrayLength;
6016 for (
Expr *E : Args) {
6021 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6029 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
true);
6030 if (!HandleInitializedEntity(SubEntity, SubKind,
nullptr, &ArrayFiller))
6034 if (ResultType.
isNull()) {
6054 if (EntityIndexToProcess < Args.size()) {
6060 Expr *E = Args[EntityIndexToProcess];
6063 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6071 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
6073 if (!HandleInitializedEntity(SubEntity, SubKind,
nullptr))
6076 EntityIndexToProcess++;
6089 if (EntityIndexToProcess < Args.size()) {
6091 Expr *E = Args[EntityIndexToProcess];
6109 if (!HandleInitializedEntity(SubEntity, SubKind, E))
6117 InitializedFieldInUnion = FD;
6118 EntityIndexToProcess = 1;
6124 if (!VerifyOnly && FD->
hasAttr<ExplicitInitAttr>() &&
6126 S.
Diag(Kind.getLocation(), diag::warn_field_requires_explicit_init)
6137 Kind.getParenOrBraceRange().getEnd(), FD);
6141 InitExprs.push_back(DIE.
get());
6151 S.
Diag(SR.
getEnd(), diag::err_init_reference_member_uninitialized)
6158 Kind.getLocation(), Kind.getLocation(), Kind.getLocation(),
true);
6159 if (!HandleInitializedEntity(SubEntity, SubKind,
nullptr))
6163 EntityIndexToProcess++;
6165 ResultType = Entity.
getType();
6170 if (EntityIndexToProcess < Args.size()) {
6174 int InitKind = T->
isArrayType() ? 0 : T->isUnionType() ? 4 : 5;
6175 SourceRange ExcessInitSR(Args[EntityIndexToProcess]->getBeginLoc(),
6176 Args.back()->getEndLoc());
6177 S.
Diag(Kind.getLocation(), diag::err_excess_initializers)
6178 << InitKind << ExcessInitSR;
6192 CPLIE->setArrayFiller(ArrayFiller);
6193 if (InitializedFieldInUnion)
6194 CPLIE->setInitializedFieldInUnion(InitializedFieldInUnion);
6196 S.
Diag(Kind.getLocation(),
6197 diag::warn_cxx17_compat_aggregate_init_paren_list)
6198 << Kind.getLocation() << SR << ResultType;
6210 bool TopLevelOfInitList) {
6211 assert(!DestType->
isReferenceType() &&
"References are handled elsewhere");
6214 "Must have a class type to perform a user-defined conversion");
6224 bool AllowExplicit = Kind.AllowExplicit();
6234 if (!Info.Constructor)
6237 if (!Info.Constructor->isInvalidDecl() &&
6238 Info.Constructor->isConvertingConstructor(
true)) {
6239 if (Info.ConstructorTmpl)
6241 Info.ConstructorTmpl, Info.FoundDecl,
6244 false, AllowExplicit);
6249 false, AllowExplicit);
6265 const auto &Conversions =
6267 for (
auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
6282 ConvTemplate, I.getPair(), ActingDC,
Initializer, DestType,
6283 CandidateSet, AllowExplicit, AllowExplicit);
6286 DestType, CandidateSet, AllowExplicit,
6312 bool HadMultipleCandidates = (CandidateSet.
size() > 1);
6320 HadMultipleCandidates);
6347 QualType ConvType = Function->getCallResultType();
6349 HadMultipleCandidates);
6362 Function->getReturnType()->isReferenceType() ||
6372 assert(Best->HasFinalConversion);
6373 if (Best->FinalConversion.First || Best->FinalConversion.Second ||
6374 Best->FinalConversion.Third) {
6377 ICS.
Standard = Best->FinalConversion;
6387 bool isAddressOf,
bool &isWeakAccess) {
6393 if (op->getOpcode() == UO_AddrOf)
6398 }
else if (
CastExpr *ce = dyn_cast<CastExpr>(e)) {
6399 switch (ce->getCastKind()) {
6402 case CK_LValueBitCast:
6406 case CK_ArrayToPointerDecay:
6409 case CK_NullToPointer:
6421 isWeakAccess =
true;
6455 bool isWeakAccess =
false;
6459 if (S.
getLangOpts().ObjCAutoRefCount && isWeakAccess)
6479 if (!Context.hasSameType(Dest->
getElementType(), Source->getElementType()))
6491 bool ArrayDecay =
false;
6496 ArgPointee = ArgArrayType->getElementType();
6508 bool ShouldCopy =
true;
6548 std::optional<llvm::APSInt>
Value =
Init->getIntegerConstantExpr(Ctx);
6579 "cl_intel_device_side_avc_motion_estimation", S.
getLangOpts()) &&
6581 if (DestType->isOCLIntelSubgroupAVCMcePayloadType() ||
6582 DestType->isOCLIntelSubgroupAVCMceResultType())
6596 MultiExprArg Args,
bool TopLevelOfInitList,
bool TreatUnavailableAsInvalid)
6600 TreatUnavailableAsInvalid);
6606 auto *DRE = dyn_cast<DeclRefExpr>(E);
6677 bool TopLevelOfInitList,
6678 bool TreatUnavailableAsInvalid) {
6685 for (
unsigned I = 0, E = Args.size(); I != E; ++I)
6686 if (Args[I]->
getType()->isNonOverloadPlaceholderType()) {
6693 Args[I] = result.
get();
6715 if (Args.size() == 1) {
6733 TreatUnavailableAsInvalid);
6742 if (Rec->hasUninitializedExplicitInitFields()) {
6754 if (Var && !
Initializer && !Rec->isUnion() && !Rec->isInvalidDecl()) {
6756 unsigned DiagID = diag::warn_default_init_const_field_unsafe;
6759 DiagID = diag::warn_default_init_const_field;
6762 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
6766 S.
Diag(FD->
getLocation(), diag::note_default_init_const_member) << FD;
6779 if (Args.size() != 1)
6789 TopLevelOfInitList);
6814 const ArrayType *DestAT = Context.getAsArrayType(DestType);
6852 TreatUnavailableAsInvalid);
6864 TreatUnavailableAsInvalid);
6890 *
this, TreatUnavailableAsInvalid);
6892 }
else if (S.
getLangOpts().CPlusPlus20 && !TopLevelOfInitList &&
6908 bool allowObjCWritebackConversion = S.
getLangOpts().ObjCAutoRefCount &&
6917 assert(
Initializer &&
"Initializer must be non-null");
6919 if (allowObjCWritebackConversion &&
6943 (Context.hasSameUnqualifiedType(SourceType, DestType) ||
6945 SourceType, DestType))))) {
6955 assert(
Initializer &&
"Initializer must be non-null");
6957 TopLevelOfInitList);
6962 assert(Args.size() >= 1 &&
"Zero-argument case handled above");
6967 auto ShouldTryListInitialization = [&]() ->
bool {
6977 if (!DestIsVec && !DestIsMat)
6982 if (Args.size() == 1) {
6983 assert(!SourceType.
isNull() &&
6984 "Source QualType should not be null when arg size is exactly 1");
6988 if (DestIsMat && !SourceIsVec)
6990 if (DestIsVec && !SourceIsMat)
6996 return SourceType.
isNull() ||
6997 !Context.hasSameUnqualifiedType(SourceType, DestType);
6999 if (ShouldTryListInitialization()) {
7002 Args.back()->getEndLoc(),
false);
7006 TreatUnavailableAsInvalid);
7011 if (Args.size() > 1) {
7022 assert(
Initializer &&
"Initializer must be non-null");
7025 bool NeedAtomicConversion =
false;
7027 if (Context.hasSameUnqualifiedType(SourceType,
Atomic->getValueType()) ||
7029 Atomic->getValueType())) {
7030 DestType =
Atomic->getValueType();
7031 NeedAtomicConversion =
true;
7036 TopLevelOfInitList);
7038 if (!
Failed() && NeedAtomicConversion)
7065 Sema::AllowedExplicit::None,
7067 Kind.isCStyleOrFunctionalCast(),
7068 allowObjCWritebackConversion);
7076 bool ShouldCopy =
true;
7092 }
else if (ICS.
isBad()) {
7098 else if (
Initializer->getType()->isFunctionType() &&
7111 for (
auto &S : Steps)
7119 bool Diagnose =
false) {
7171 llvm_unreachable(
"Invalid EntityKind!");
7206 llvm_unreachable(
"missed an InitializedEntity kind?");
7241 llvm_unreachable(
"missed an InitializedEntity kind?");
7281 llvm_unreachable(
"missed an InitializedEntity kind?");
7308 bool IsExtraneousCopy) {
7313 auto *Class = T->getAsCXXRecordDecl();
7331 S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
7343 ? diag::ext_rvalue_to_reference_temp_copy_no_viable
7344 : diag::err_temp_copy_no_viable)
7362 S.
Diag(Loc, diag::err_temp_copy_deleted)
7369 bool HadMultipleCandidates = CandidateSet.
size() > 1;
7378 if (IsExtraneousCopy) {
7389 for (
unsigned I = 1, N =
Constructor->getNumParams(); I != N; ++I) {
7392 diag::err_call_incomplete_argument))
7433 Best->Function->getParamDecl(0)->getType().getNonReferenceType(),
7438 Loc, T, Best->FoundDecl,
Constructor, Elidable, ConstructorArgs,
7439 HadMultipleCandidates,
7455 Expr *CurInitExpr) {
7473 S, Loc, CurInitExpr, CandidateSet, CurInitExpr->
getType(), Ctors, Best,
7486 Best->FoundDecl, Entity,
Diag);
7507void InitializationSequence::PrintInitLocationNote(
Sema &S,
7522 diag::note_method_return_type_change)
7540 switch (Kind.getKind()) {
7546 return NumArgs != 1;
7558 bool &ConstructorInitRequiresZeroInit,
7559 bool IsListInitialization,
7560 bool IsStdInitListInitialization,
7563 unsigned NumArgs = Args.size();
7570 SourceLocation Loc = (Kind.isCopyInit() && Kind.getEqualLoc().isValid())
7571 ? Kind.getEqualLoc()
7572 : Kind.getLocation();
7578 assert(
Constructor->getParent() &&
"No parent class for constructor.");
7595 bool AllowExplicitConv =
7596 Kind.AllowExplicit() && !Kind.isCopyInit() && Args.size() == 1 &&
7601 if (NumArgs == 1 && !Kind.isExplicitCast())
7603 Entity.
getType(), Args.front()->getType(), Kind.getLocation());
7608 ConstructorArgs, AllowExplicitConv,
7609 IsListInitialization))
7623 if (I >= ConstructorArgs.size() && FD->
hasAttr<ExplicitInitAttr>() &&
7625 S.
Diag(Loc, diag::warn_field_requires_explicit_init)
7640 : Kind.getParenOrBraceRange();
7643 if (
auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
7653 ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates,
7654 IsListInitialization, IsStdInitListInitialization,
7655 ConstructorInitRequiresZeroInit),
7671 if (IsListInitialization)
7672 ParenOrBraceRange =
SourceRange(LBraceLoc, RBraceLoc);
7674 ParenOrBraceRange = Kind.getParenOrBraceRange();
7683 HadMultipleCandidates,
7684 IsListInitialization,
7685 IsStdInitListInitialization,
7686 ConstructorInitRequiresZeroInit,
7694 HadMultipleCandidates,
7695 IsListInitialization,
7696 IsStdInitListInitialization,
7697 ConstructorInitRequiresZeroInit,
7728 const Expr *PostInit);
7735 bool IsReturnStmt) {
7746 unsigned DiagID = 0;
7776 if (VD->
hasAttr<BlocksAttr>())
7790 DiagID = diag::warn_redundant_move_on_return;
7792 DiagID = diag::warn_pessimizing_move_on_return;
7794 DiagID = diag::warn_pessimizing_move_on_initialization;
7836 if (UO->getOpcode() == UO_Deref &&
7837 UO->getSubExpr()->IgnoreParenCasts()->
7840 S.
PDiag(diag::warn_binding_null_to_reference)
7841 << UO->getSubExpr()->getSourceRange());
7847 bool BoundToLvalueReference) {
7857 Cleanup.setExprNeedsCleanups(
false);
7893 if (!PointeeTy.isNull() &&
7894 PointeeTy.getAddressSpace() != ExprPointeeTy.getAddressSpace())
7895 CK = CK_AddressSpaceConversion;
7897 CK = CK_AddressSpaceConversion;
7912 if (!ZeroInitializationFixit.empty()) {
7914 const auto *VD = dyn_cast_or_null<VarDecl>(D);
7920 if (!DestType->
isRecordType() && VD && VD->isConstexpr()) {
7922 S.
Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
7925 ZeroInitializationFixit);
7927 unsigned DiagID = diag::err_default_init_const;
7929 DiagID = diag::ext_default_init_const;
7931 S.
Diag(Kind.getLocation(), DiagID)
7934 ZeroInitializationFixit);
7956 ArrayT->getElementType(),
7957 nullptr, ArrayT->getSizeModifier(),
7958 ArrayT->getIndexTypeCVRQualifiers());
7962 !Kind.isExplicitCast()) {
7964 SourceRange ParenRange = Kind.getParenOrBraceRange();
7969 Kind.isExplicitCast() ||
7985 S.
Diag(
Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init)
7986 <<
Init->getSourceRange();
7989 if (S.
getLangOpts().MicrosoftExt && Args.size() == 1 &&
7995 S.
Diag(
Init->getBeginLoc(), diag::ext_init_from_predefined) <<
Init;
8006 S.
Diag(Args[0]->getBeginLoc(), diag::err_opencl_atomic_init)
8025 bool IsHLSLVectorOrMatrixInit =
8029 (void)IsHLSLVectorOrMatrixInit;
8034 switch (Steps.front().Kind) {
8068 assert(Args.size() == 1 || IsHLSLVectorOrMatrixInit);
8087 isa_and_nonnull<InitListExpr>(CurInit.
get()));
8092 auto checkAbstractType = [&](
QualType T) ->
bool {
8097 diag::err_allocation_of_abstract_type);
8102 bool ConstructorInitRequiresZeroInit =
false;
8135 bool IgnoreBaseAccess = Kind.isCStyleOrFunctionalCast();
8147 CK_DerivedToBase, CurInit.
get(),
8163 if (
auto *DRE = dyn_cast<DeclRefExpr>(CurInit.
get()->
IgnoreParens())) {
8164 if (
auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
8177 assert(CurInit.
get()->
isPRValue() &&
"not a temporary");
8235 bool CreatedObject =
false;
8252 HadMultipleCandidates,
8264 CastKind = CK_ConstructorConversion;
8265 CreatedObject =
true;
8275 HadMultipleCandidates);
8279 CastKind = CK_UserDefinedConversion;
8283 if (CreatedObject && checkAbstractType(CurInit.
get()->
getType()))
8300 if (
auto *
Record = T->castAsCXXRecordDecl()) {
8303 S.
PDiag(diag::err_access_dtor_temp) << T);
8327 "function reference should be lvalue");
8333 assert(CurInit.
get()->
isPRValue() &&
"cannot convert glvalue to atomic");
8341 if (
const auto *FromPtrType =
8344 if (FromPtrType->getPointeeType()->hasAttr(attr::NoDeref) &&
8345 !ToPtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
8348 if (!Kind.isStaticCast()) {
8350 diag::warn_noderef_to_dereferenceable_pointer)
8369 CurInit = CurInitExprRes;
8390 InitListChecker PerformInitList(S, InitEntity,
8391 InitList, Ty,
false,
8393 if (PerformInitList.HadError())
8401 if ((*ResultType)->isRValueReferenceType())
8403 else if ((*ResultType)->isLValueReferenceType())
8410 PerformInitList.getFullyStructuredList();
8413 : StructuredInitList;
8430 assert(Args.size() == 1 &&
"expected a single argument for list init");
8432 S.
Diag(InitList->
getExprLoc(), diag::warn_cxx98_compat_ctor_list_init)
8438 ConstructorInitRequiresZeroInit,
8477 bool IsStdInitListInit =
8481 ? Kind.getParenOrBraceRange()
8484 S, UseTemporary ? TempEntity : Entity, Kind,
8486 ConstructorInitRequiresZeroInit,
8497 if (NextStep != StepEnd &&
8502 ConstructorInitRequiresZeroInit =
true;
8505 !Kind.isImplicitValueInit()) {
8509 Kind.getRange().getBegin());
8513 Kind.getRange().getEnd());
8548 CurInit = CurInitExprRes;
8563 S.
Diag(Kind.getLocation(), diag::err_c23_constexpr_pointer_not_null);
8578 InitialCurInit.
get(),
8581 PrintInitLocationNote(S, Entity);
8583 }
else if (Complained)
8584 PrintInitLocationNote(S, Entity);
8600 CK_ObjCObjectLValueCast,
8612 BaseExpr, Kind.getLocation(), IndexExpr, Kind.getLocation());
8613 ArrayLoopCommonExprs.push_back(BaseExpr);
8618 assert(!ArrayLoopCommonExprs.empty() &&
8619 "mismatched SK_ArrayLoopIndex and SK_ArrayLoopInit");
8620 Expr *Common = ArrayLoopCommonExprs.pop_back_val();
8629 S.
Diag(Kind.getLocation(), diag::ext_array_init_copy)
8643 IncompleteDest->getElementType(), ConstantSource->getSize(),
8653 S.
Diag(Kind.getLocation(), diag::ext_array_init_parens)
8673 diag::warn_cxx98_compat_initializer_list_init)
8686 [[maybe_unused]]
bool IsStdInitializerList =
8688 assert(IsStdInitializerList &&
8689 "StdInitializerList step to non-std::initializer_list");
8691 assert(
Record->isCompleteDefinition() &&
8692 "std::initializer_list should have already be "
8693 "complete/instantiated by this point");
8695 auto InvalidType = [&] {
8697 diag::err_std_initializer_list_malformed)
8704 return InvalidType();
8707 if (Field ==
Record->field_end())
8708 return InvalidType();
8711 if (!Field->getType()->isPointerType() ||
8714 return InvalidType();
8716 if (++Field ==
Record->field_end())
8717 return InvalidType();
8720 if (
const auto *PT = Field->getType()->getAs<
PointerType>()) {
8723 return InvalidType();
8725 if (Field->isBitField() ||
8727 return InvalidType();
8730 if (++Field !=
Record->field_end())
8731 return InvalidType();
8758 "Sampler initialization on non-sampler type.");
8764 S.
Diag(Kind.getLocation(), diag::err_sampler_argument_required)
8771 if (!Var->hasGlobalStorage()) {
8786 Var->getInit()))->getSubExpr();
8787 SourceType =
Init->getType();
8799 S.
Diag(Kind.getLocation(), diag::err_sampler_initializer_not_integer)
8807 const uint64_t SamplerValue =
Result.getLimitedValue();
8814 unsigned AddressingMode = (0x0E & SamplerValue) >> 1;
8815 unsigned FilterMode = (0x30 & SamplerValue) >> 4;
8816 if (FilterMode != 1 && FilterMode != 2 &&
8818 "cl_intel_device_side_avc_motion_estimation", S.
getLangOpts()))
8819 S.
Diag(Kind.getLocation(),
8820 diag::warn_sampler_initializer_invalid_bits)
8822 if (AddressingMode > 4)
8823 S.
Diag(Kind.getLocation(),
8824 diag::warn_sampler_initializer_invalid_bits)
8825 <<
"Addressing Mode";
8831 CK_IntToOCLSampler);
8837 "Wrong type for initialization of OpenCL opaque type.");
8840 CK_ZeroToOCLOpaqueType,
8848 if (CurInit.
get() && ResultType)
8870 S.CheckBitFieldInitialization(Kind.getLocation(),
8884 if (T->isReferenceType()) {
8885 S.
Diag(Loc, diag::err_reference_without_init)
8886 << T.getNonReferenceType();
8890 CXXRecordDecl *RD = T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
8894 for (
const auto *FI : RD->
fields()) {
8895 if (FI->isUnnamedBitField())
8899 S.
Diag(Loc, diag::note_value_initialization_here) << RD;
8904 for (
const auto &BI : RD->
bases()) {
8906 S.
Diag(Loc, diag::note_value_initialization_here) << RD;
8941 if (fromDecl && destDecl && fromDecl->getDeclKind() == Decl::CXXRecord &&
8942 destDecl->getDeclKind() == Decl::CXXRecord &&
8943 !fromDecl->isInvalidDecl() && !destDecl->isInvalidDecl() &&
8944 !fromDecl->hasDefinition() &&
8947 S.
Diag(fromDecl->getLocation(), diag::note_forward_class_conversion)
8975 if (
auto *D = Entity.
getDecl())
8976 Loc = D->getLocation();
8977 S.
Diag(Loc, diag::note_in_reference_temporary_list_initializer) << T;
8981 InitListChecker DiagnoseInitList(S, Entity, InitList, DestType,
8984 assert(DiagnoseInitList.HadError() &&
8985 "Inconsistent init list check result.");
9000 if (Args.size() == 1) {
9001 auto *List = dyn_cast<InitListExpr>(Args[0]);
9002 if (List && List->getNumInits() == 1)
9003 OnlyArg = List->getInit(0);
9012 if (
Expr *Resolved =
9032 assert(Diagnosed &&
"couldn't find uninitialized reference to diagnose");
9035 S.
Diag(Kind.getLocation(), diag::err_reference_has_multiple_inits)
9036 <<
SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
9039 S.
Diag(Kind.getLocation(), diag::err_list_init_in_parens)
9040 << 1 << Entity.
getType() << Args[0]->getSourceRange();
9044 S.
Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 0;
9047 S.
Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 1;
9050 S.
Diag(Kind.getLocation(), diag::err_array_init_not_init_list) << 2;
9053 S.
Diag(Kind.getLocation(), diag::err_array_init_narrow_string_into_wchar);
9056 S.
Diag(Kind.getLocation(), diag::err_array_init_wide_string_into_char);
9059 S.
Diag(Kind.getLocation(),
9060 diag::err_array_init_incompat_wide_string_into_wchar);
9063 S.
Diag(Kind.getLocation(),
9064 diag::err_array_init_plain_string_into_char8_t);
9065 S.
Diag(Args.front()->getBeginLoc(),
9066 diag::note_array_init_plain_string_into_char8_t)
9070 S.
Diag(Kind.getLocation(), diag::err_array_init_utf8_string_into_char)
9075 S.
Diag(Kind.getLocation(),
9077 ? diag::err_array_init_different_type
9078 : diag::err_array_init_non_constant_array))
9081 << Args[0]->getSourceRange();
9085 S.
Diag(Kind.getLocation(), diag::err_variable_object_no_init)
9086 << Args[0]->getSourceRange();
9107 switch (FailedOverloadResult) {
9110 FailedCandidateSet.NoteCandidates(
9114 ? (S.
PDiag(diag::err_typecheck_ambiguous_condition)
9115 << OnlyArg->
getType() << DestType
9116 << Args[0]->getSourceRange())
9117 : (S.
PDiag(diag::err_ref_init_ambiguous)
9118 << DestType << OnlyArg->
getType()
9119 << Args[0]->getSourceRange())),
9127 diag::err_typecheck_nonviable_condition_incomplete,
9128 OnlyArg->
getType(), Args[0]->getSourceRange()))
9129 S.
Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
9131 << OnlyArg->
getType() << Args[0]->getSourceRange()
9134 FailedCandidateSet.NoteCandidates(S, Args, Cands);
9140 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9143 S.
Diag(Kind.getLocation(), diag::err_typecheck_deleted_function)
9145 << (Msg !=
nullptr) << (Msg ? Msg->
getString() : StringRef())
9146 << Args[0]->getSourceRange();
9150 llvm_unreachable(
"Inconsistent overload resolution?");
9156 llvm_unreachable(
"Conversion did not fail!");
9162 S.
Diag(Kind.getLocation(),
9163 diag::err_lvalue_reference_bind_to_initlist)
9166 << Args[0]->getSourceRange();
9172 S.
Diag(Kind.getLocation(),
9174 ? diag::err_lvalue_reference_bind_to_temporary
9175 : diag::err_lvalue_reference_bind_to_unrelated)
9179 << Args[0]->getSourceRange();
9184 FieldDecl *BitField = Args[0]->getSourceBitField();
9185 S.
Diag(Kind.getLocation(), diag::err_reference_bind_to_bitfield)
9188 << (BitField !=
nullptr)
9189 << Args[0]->getSourceRange();
9196 S.
Diag(Kind.getLocation(), diag::err_reference_bind_to_vector_element)
9198 << Args[0]->getSourceRange();
9202 S.
Diag(Kind.getLocation(), diag::err_reference_bind_to_matrix_element)
9207 S.
Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
9209 << Args[0]->getSourceRange();
9213 S.
Diag(Kind.getLocation(), diag::err_reference_bind_temporary_addrspace)
9214 << DestType << Args[0]->getSourceRange();
9225 S.
Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9226 << NonRefType << SourceType << 1
9227 << Args[0]->getSourceRange();
9229 S.
Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9230 << NonRefType << SourceType << 0
9236 S.
Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals)
9237 << NonRefType << SourceType << 2
9238 << Args[0]->getSourceRange();
9243 S.
Diag(Kind.getLocation(), diag::err_reference_bind_failed)
9248 << Args[0]->getSourceRange();
9256 if (FromType == S.
Context.AMDGPUFeaturePredicateTy &&
9259 diag::err_amdgcn_predicate_type_needs_explicit_bool_cast)
9260 << OnlyArg << DestType;
9268 << Args[0]->getSourceRange();
9270 S.
Diag(Kind.getLocation(), PDiag);
9282 auto *InitList = dyn_cast<InitListExpr>(Args[0]);
9283 if (InitList && InitList->getNumInits() >= 1) {
9284 R =
SourceRange(InitList->getInit(0)->getEndLoc(), InitList->getEndLoc());
9286 assert(Args.size() > 1 &&
"Expected multiple initializers!");
9287 R =
SourceRange(Args.front()->getEndLoc(), Args.back()->getEndLoc());
9291 if (Kind.isCStyleOrFunctionalCast())
9292 S.
Diag(Kind.getLocation(), diag::err_builtin_func_cast_more_than_one_arg)
9295 S.
Diag(Kind.getLocation(), diag::err_excess_initializers)
9301 S.
Diag(Kind.getLocation(), diag::err_list_init_in_parens)
9302 << 0 << Entity.
getType() << Args[0]->getSourceRange();
9306 S.
Diag(Kind.getLocation(), diag::err_reference_bind_init_list)
9311 S.
Diag(Kind.getLocation(), diag::err_init_list_bad_dest_type)
9312 << (DestType->
isRecordType()) << DestType << Args[0]->getSourceRange();
9320 SourceRange(Args.front()->getBeginLoc(), Args.back()->getEndLoc());
9323 assert(Args.size() == 1 &&
9324 "List construction from other than 1 argument.");
9331 switch (FailedOverloadResult) {
9333 FailedCandidateSet.NoteCandidates(
9335 S.
PDiag(diag::err_ovl_ambiguous_init)
9336 << DestType << ArgsRange),
9353 if (
auto Inherited =
Constructor->getInheritedConstructor())
9354 InheritedFrom = Inherited.getShadowDecl()->getNominatedBaseClass();
9356 S.
Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9357 << (InheritedFrom ? 2
9361 << 0 << Entity.
getType() << InheritedFrom;
9365 S.
Diag(BaseDecl->getLocation(), diag::note_previous_decl)
9368 S.
Diag(Kind.getLocation(), diag::err_missing_default_ctor)
9369 << (InheritedFrom ? 2
9373 << 1 << Entity.
getName() << InheritedFrom;
9375 diag::note_member_declared_at);
9378 S.
Diag(
Record->getDecl()->getLocation(), diag::note_previous_decl)
9384 FailedCandidateSet.NoteCandidates(
9387 S.
PDiag(diag::err_ovl_no_viable_function_in_init)
9388 << DestType << ArgsRange),
9395 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9397 S.
Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9398 << DestType << ArgsRange;
9399 llvm_unreachable(
"Inconsistent overload resolution?");
9407 S.
Diag(Kind.getLocation(), diag::err_ovl_deleted_special_init)
9409 << DestType << ArgsRange;
9412 S.
Diag(Kind.getLocation(), diag::err_ovl_deleted_init)
9413 << DestType << (Msg !=
nullptr)
9414 << (Msg ? Msg->
getString() : StringRef()) << ArgsRange;
9425 diag::note_default_constructed_field)
9433 llvm_unreachable(
"Conversion did not fail!");
9445 S.
Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor)
9453 }
else if (
const auto *VD = dyn_cast_if_present<VarDecl>(Entity.
getDecl());
9454 VD && VD->isConstexpr()) {
9455 S.
Diag(Kind.getLocation(), diag::err_constexpr_var_requires_const_init)
9458 S.
Diag(Kind.getLocation(), diag::err_default_init_const)
9465 diag::err_init_incomplete_type);
9489 S.
Diag(Kind.getLocation(), diag::err_selected_explicit_constructor)
9490 << Args[0]->getSourceRange();
9493 = FailedCandidateSet.BestViableFunction(S, Kind.getLocation(), Best);
9495 assert(Ovl ==
OR_Success &&
"Inconsistent overload resolution");
9498 diag::note_explicit_ctor_deduction_guide_here) <<
false;
9509 S.
Diag(Kind.getLocation(), diag::err_designated_init_for_non_aggregate)
9514 PrintInitLocationNote(S, Entity);
9521 OS <<
"Failed sequence: ";
9524 OS <<
"too many initializers for reference";
9528 OS <<
"parenthesized list init for reference";
9532 OS <<
"array requires initializer list";
9536 OS <<
"address of unaddressable function was taken";
9540 OS <<
"array requires initializer list or string literal";
9544 OS <<
"array requires initializer list or wide string literal";
9548 OS <<
"narrow string into wide char array";
9552 OS <<
"wide string into char array";
9556 OS <<
"incompatible wide string into wide char array";
9560 OS <<
"plain string literal into char8_t array";
9564 OS <<
"u8 string literal into char array";
9568 OS <<
"array type mismatch";
9572 OS <<
"non-constant array initializer";
9576 OS <<
"address of overloaded function failed";
9580 OS <<
"overload resolution for reference initialization failed";
9584 OS <<
"non-const lvalue reference bound to temporary";
9588 OS <<
"non-const lvalue reference bound to bit-field";
9592 OS <<
"non-const lvalue reference bound to vector element";
9596 OS <<
"non-const lvalue reference bound to matrix element";
9600 OS <<
"non-const lvalue reference bound to unrelated type";
9604 OS <<
"rvalue reference bound to an lvalue";
9608 OS <<
"reference initialization drops qualifiers";
9612 OS <<
"reference with mismatching address space bound to temporary";
9616 OS <<
"reference initialization failed";
9620 OS <<
"conversion failed";
9624 OS <<
"conversion from property failed";
9628 OS <<
"too many initializers for scalar";
9632 OS <<
"parenthesized list init for reference";
9636 OS <<
"referencing binding to initializer list";
9640 OS <<
"initializer list for non-aggregate, non-scalar type";
9644 OS <<
"overloading failed for user-defined conversion";
9648 OS <<
"constructor overloading failed";
9652 OS <<
"default initialization of a const variable";
9656 OS <<
"initialization of incomplete type";
9660 OS <<
"list initialization checker failure";
9664 OS <<
"variable length array has an initializer";
9668 OS <<
"initializer expression isn't contextually valid";
9672 OS <<
"list constructor overloading failed";
9676 OS <<
"list copy initialization chose explicit constructor";
9680 OS <<
"parenthesized list initialization failed";
9684 OS <<
"designated initializer for non-aggregate type";
9688 OS <<
"HLSL initialization list flattening failed";
9696 OS <<
"Dependent sequence\n";
9700 OS <<
"Normal sequence: ";
9711 OS <<
"resolve address of overloaded function";
9715 OS <<
"derived-to-base (prvalue)";
9719 OS <<
"derived-to-base (xvalue)";
9723 OS <<
"derived-to-base (lvalue)";
9727 OS <<
"bind reference to lvalue";
9731 OS <<
"bind reference to a temporary";
9735 OS <<
"final copy in class direct-initialization";
9739 OS <<
"extraneous C++03 copy to temporary";
9743 OS <<
"user-defined conversion via " << *S->Function.Function;
9747 OS <<
"qualification conversion (prvalue)";
9751 OS <<
"qualification conversion (xvalue)";
9755 OS <<
"qualification conversion (lvalue)";
9759 OS <<
"function reference conversion";
9763 OS <<
"non-atomic-to-atomic conversion";
9767 OS <<
"implicit conversion sequence (";
9773 OS <<
"implicit conversion sequence with narrowing prohibited (";
9779 OS <<
"list aggregate initialization";
9783 OS <<
"unwrap reference initializer list";
9787 OS <<
"rewrap reference initializer list";
9791 OS <<
"constructor initialization";
9795 OS <<
"list initialization via constructor";
9799 OS <<
"zero initialization";
9803 OS <<
"C assignment";
9807 OS <<
"string initialization";
9811 OS <<
"Objective-C object conversion";
9815 OS <<
"indexing for array initialization loop";
9819 OS <<
"array initialization loop";
9823 OS <<
"array initialization";
9827 OS <<
"array initialization (GNU extension)";
9831 OS <<
"parenthesized array initialization";
9835 OS <<
"pass by indirect copy and restore";
9839 OS <<
"pass by indirect restore";
9843 OS <<
"Objective-C object retension";
9847 OS <<
"std::initializer_list from initializer list";
9851 OS <<
"list initialization from std::initializer_list";
9855 OS <<
"OpenCL sampler_t from integer constant";
9859 OS <<
"OpenCL opaque type from zero";
9862 OS <<
"initialization from a parenthesized list of values";
9866 OS <<
" [" << S->Type <<
']';
9880 const Expr *PostInit) {
9896 auto MakeDiag = [&](
bool IsConstRef,
unsigned DefaultDiagID,
9897 unsigned ConstRefDiagID,
unsigned WarnDiagID) {
9900 if (L.CPlusPlus11 && !L.HLSL &&
9902 DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID;
9904 DiagID = WarnDiagID;
9924 MakeDiag(T != EntityType, diag::ext_init_list_type_narrowing,
9925 diag::ext_init_list_type_narrowing_const_reference,
9926 diag::warn_init_list_type_narrowing)
9935 diag::ext_init_list_constant_narrowing,
9936 diag::ext_init_list_constant_narrowing_const_reference,
9937 diag::warn_init_list_constant_narrowing)
9946 diag::ext_init_list_variable_narrowing,
9947 diag::ext_init_list_variable_narrowing_const_reference,
9948 diag::warn_init_list_variable_narrowing)
9956 llvm::raw_svector_ostream OS(StaticCast);
9957 OS <<
"static_cast<";
9964 OS << *TT->getDecl();
9973 S.
Diag(PostInit->
getBeginLoc(), diag::note_init_list_narrowing_silence)
9984 Init->IgnoreParenImpCasts(), ToType,
false,
9985 Sema::AllowedExplicit::None,
10001 S.
Diag(
Init->getBeginLoc(), diag::err_c23_constexpr_init_not_representable)
10002 <<
Value.getAsString(S.
Context, PreNarrowingType) << ToType;
10007 S.
Diag(
Init->getBeginLoc(), diag::err_c23_constexpr_init_type_mismatch)
10008 << ToType << FromType;
10018 llvm_unreachable(
"unhandled case in switch");
10030 for (
unsigned I = 0, N = SE->
getLength(); I != N; ++I) {
10035 diag::err_c23_constexpr_init_not_representable)
10048 if (
Init.isInvalid())
10052 assert(InitE &&
"No initialization expression");
10057 return !
Seq.Failed();
10064 bool TopLevelOfInitList,
10065 bool AllowExplicit) {
10066 if (
Init.isInvalid())
10070 assert(InitE &&
"No initialization expression?");
10076 Context.AMDGPUFeaturePredicateTy &&
10078 Diag(EqualLoc, diag::err_amdgcn_predicate_type_is_not_constructible)
10088 const bool ShouldTrackCopy =
10090 if (ShouldTrackCopy) {
10092 Seq.SetOverloadFailure(
10098 const auto LastStep =
Seq.step_end() - 1;
10099 assert(LastStep->Kind ==
10103 llvm::find_if(
Seq.getFailedCandidateSet(),
10105 return Candidate.Viable &&
10106 Candidate.Function == Function &&
10107 Candidate.Conversions.size() > 0;
10109 if (Candidate !=
Seq.getFailedCandidateSet().end() &&
10111 Candidate->
Viable =
false;
10115 Function->getParamDecl(0)->getType());
10123 if (ShouldTrackCopy)
10132 auto NotSpecialization = [&] (
const CXXRecordDecl *Candidate) {
10133 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Candidate);
10136 return !(NotSpecialization(RD) && RD->
forallBases(NotSpecialization));
10142 auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>(
10144 assert(DeducedTST &&
"not a deduced template specialization type");
10155 if (
auto *
AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
10157 DiagCompat(Kind.getLocation(), diag_compat::ctad_for_alias_templates);
10160 ->getUnderlyingType()
10161 .getCanonicalType();
10165 if (
const auto *TST =
10166 UnderlyingType->getAs<TemplateSpecializationType>()) {
10167 Template = dyn_cast_or_null<ClassTemplateDecl>(
10168 TST->getTemplateName().getAsTemplateDecl());
10169 }
else if (
const auto *RT = UnderlyingType->getAs<RecordType>()) {
10173 if (
const auto *CTSD =
10174 llvm::dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl()))
10175 Template = CTSD->getSpecializedTemplate();
10180 Diag(Kind.getLocation(),
10181 diag::err_deduced_non_class_or_alias_template_specialization_type)
10191 diag::warn_cxx14_compat_class_template_argument_deduction)
10207 Context.DeclarationNames.getCXXDeductionGuideName(LookupTemplateDecl),
10219 ? dyn_cast<InitListExpr>(
Inits[0])
10235 bool AllowExplicit = !Kind.isCopyInit() ||
ListInit;
10241 bool OnlyListConstructors,
10242 bool AllowAggregateDeductionCandidate) {
10248 if (!AllowExplicit) {
10255 if (GD->getMinRequiredArguments() > 1 ||
10256 (GD->getNumParams() == 0 && !GD->isVariadic()))
10266 if (!AllowAggregateDeductionCandidate &&
10286 for (
auto [I, E] : llvm::enumerate(
Inits)) {
10287 if (
auto *DI = dyn_cast<DesignatedInitExpr>(E))
10288 TmpInits[I] = DI->getInit();
10294 TD, FoundDecl,
nullptr, TmpInits, Candidates,
10296 false, AllowExplicit, ADLCallKind::NotADL,
10297 {}, AllowAggregateDeductionCandidate);
10301 false, AllowExplicit);
10305 bool FoundDeductionGuide =
false;
10307 auto TryToResolveOverload =
10310 bool HasAnyDeductionGuide =
false;
10314 while (Pattern->getInstantiatedFromMemberTemplate()) {
10315 if (Pattern->isMemberSpecialization())
10317 Pattern = Pattern->getInstantiatedFromMemberTemplate();
10326 InitListChecker CheckInitList(*
this, Entity,
ListInit, Ty, ElementTypes);
10327 if (!CheckInitList.HadError()) {
10336 for (
int I = 0, E =
ListInit->getNumInits();
10338 if (ElementTypes[I]->isArrayType()) {
10340 ElementTypes[I] =
Context.getRValueReferenceType(ElementTypes[I]);
10342 ListInit->getInit(I)->IgnoreParenImpCasts()))
10344 Context.getLValueReferenceType(ElementTypes[I].withConst());
10349 LookupTemplateDecl, ElementTypes,
10351 auto *TD = GD->getDescribedFunctionTemplate();
10353 OnlyListConstructors,
10355 HasAnyDeductionGuide =
true;
10360 for (
auto I = Guides.
begin(), E = Guides.
end(); I != E; ++I) {
10361 NamedDecl *D = (*I)->getUnderlyingDecl();
10365 auto *TD = dyn_cast<FunctionTemplateDecl>(D);
10366 auto *GD = dyn_cast_if_present<CXXDeductionGuideDecl>(
10371 if (!GD->isImplicit())
10372 HasAnyDeductionGuide =
true;
10374 addDeductionCandidate(TD, GD, I.getPair(), OnlyListConstructors,
10389 }
else if (
Inits.size()) {
10396 SynthesizeAggrGuide(&TempListInit);
10400 FoundDeductionGuide = FoundDeductionGuide || HasAnyDeductionGuide;
10410 bool TryListConstructors =
true;
10416 auto *FD = dyn_cast<FunctionDecl>(D->getUnderlyingDecl());
10417 if (FD && FD->getMinRequiredArguments() == 0) {
10418 TryListConstructors =
false;
10422 }
else if (
ListInit->getNumInits() == 1) {
10433 TryListConstructors =
false;
10436 if (TryListConstructors)
10437 Result = TryToResolveOverload(
true);
10446 Result = TryToResolveOverload(
false);
10455 Kind.getLocation(),
10456 PDiag(diag::err_deduced_class_template_ctor_ambiguous)
10465 Context.getCanonicalTagType(Primary));
10468 Kind.getLocation(),
10469 PDiag(
Complete ? diag::err_deduced_class_template_ctor_no_viable
10470 : diag::err_deduced_class_template_incomplete)
10480 Diag(Kind.getLocation(), diag::err_deduced_class_template_deleted)
10490 if (Kind.isCopyInit() &&
ListInit &&
10492 bool IsDeductionGuide = !Best->Function->isImplicit();
10493 Diag(Kind.getLocation(), diag::err_deduced_class_template_explicit)
10495 Diag(Best->Function->getLocation(),
10496 diag::note_explicit_ctor_deduction_guide_here)
10497 << IsDeductionGuide;
10515 diag::warn_cxx14_compat_class_template_argument_deduction)
10520 if (!FoundDeductionGuide) {
10522 diag::warn_ctad_maybe_unsupported)
10524 Diag(
Template->getLocation(), diag::note_suppress_ctad_maybe_unsupported);
10527 return DeducedType;
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.
Result
Implement __builtin_bit_cast and related operations.
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
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static void CheckForNullPointerDereference(Sema &S, Expr *E)
This file declares semantic analysis for HLSL constructs.
static bool isExprAnUnaddressableFunction(Sema &S, const Expr *E)
Tries to get a FunctionDecl out of E.
static void updateStringLiteralType(Expr *E, QualType Ty)
Update the type of a string literal, including any surrounding parentheses, to match the type of the ...
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 CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT, Sema &S, const InitializedEntity &Entity, bool CheckC23ConstexprInit=false)
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 void TryReferenceInitializationCore(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, QualType cv1T1, QualType T1, Qualifiers T1Quals, QualType cv2T2, QualType T2, Qualifiers T2Quals, InitializationSequence &Sequence, bool TopLevelOfInitList)
Reference initialization without resolving overloaded functions.
static void CheckC23ConstexprInitConversion(Sema &S, QualType FromType, QualType ToType, Expr *Init)
static void ExpandAnonymousFieldDesignator(Sema &SemaRef, DesignatedInitExpr *DIE, unsigned DesigIdx, IndirectFieldDecl *IndirectField)
Expand a field designator that refers to a member of an anonymous struct or union into a series of fi...
static void TryValueInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitializationSequence &Sequence, InitListExpr *InitList=nullptr)
Attempt value initialization (C++ [dcl.init]p7).
static void TryUserDefinedConversion(Sema &S, QualType DestType, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt a user-defined conversion between two types (C++ [dcl.init]), which enumerates all conversion...
static OverloadingResult ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc, MultiExprArg Args, OverloadCandidateSet &CandidateSet, QualType DestType, DeclContext::lookup_result Ctors, OverloadCandidateSet::iterator &Best, bool CopyInitializing, bool AllowExplicit, bool OnlyListConstructors, bool IsListInit, bool RequireActualConstructor, bool SecondStepOfCopyInit=false)
static AssignmentAction getAssignmentAction(const InitializedEntity &Entity, bool Diagnose=false)
static void TryListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitListExpr *InitList, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Attempt list initialization (C++0x [dcl.init.list])
static void TryStringLiteralInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence)
Attempt character array initialization from a string literal (C++ [dcl.init.string],...
static bool checkDestructorReference(QualType ElementType, SourceLocation Loc, Sema &SemaRef)
Check if the type of a class element has an accessible destructor, and marks it referenced.
static void TryReferenceInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, InitializationSequence &Sequence, bool TopLevelOfInitList)
Attempt reference initialization (C++0x [dcl.init.ref])
static void DiagnoseNarrowingInInitList(Sema &S, const ImplicitConversionSequence &ICS, QualType PreNarrowingType, QualType EntityType, const Expr *PostInit)
static bool hasCompatibleArrayTypes(ASTContext &Context, const ArrayType *Dest, const ArrayType *Source)
Determine whether we have compatible array types for the purposes of GNU by-copy array initialization...
static bool isExplicitTemporary(const InitializedEntity &Entity, const InitializationKind &Kind, unsigned NumArgs)
Returns true if the parameters describe a constructor initialization of an explicit temporary object,...
static bool isNonReferenceableGLValue(Expr *E)
Determine whether an expression is a non-referenceable glvalue (one to which a reference can never bi...
static bool TryOCLZeroOpaqueTypeInitialization(Sema &S, InitializationSequence &Sequence, QualType DestType, Expr *Initializer)
static bool IsWideCharCompatible(QualType T, ASTContext &Context)
Check whether T is compatible with a wide character type (wchar_t, char16_t or char32_t).
static void diagnoseListInit(Sema &S, const InitializedEntity &Entity, InitListExpr *InitList)
static OverloadingResult TryRefInitWithConversionFunction(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, Expr *Initializer, bool AllowRValues, bool IsLValueRef, InitializationSequence &Sequence)
Try a reference initialization that involves calling a conversion function.
void emitUninitializedExplicitInitFields(Sema &S, const RecordDecl *R)
static void TryConstructorInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType DestType, QualType DestArrayType, InitializationSequence &Sequence, bool IsListInit=false, bool IsInitListCopy=false)
Attempt initialization by constructor (C++ [dcl.init]), which enumerates the constructors of the init...
static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity, Expr *op)
Emit notes associated with an initialization that failed due to a "simple" conversion failure.
static bool isIdiomaticBraceElisionEntity(const InitializedEntity &Entity)
Determine whether Entity is an entity for which it is idiomatic to elide the braces in aggregate init...
static void MaybeProduceObjCObject(Sema &S, InitializationSequence &Sequence, const InitializedEntity &Entity)
static void checkIndirectCopyRestoreSource(Sema &S, Expr *src)
Check whether the given expression is a valid operand for an indirect copy/restore.
static bool shouldBindAsTemporary(const InitializedEntity &Entity)
Whether we should bind a created object as a temporary when initializing the given entity.
static void TryConstructorOrParenListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType DestType, InitializationSequence &Sequence, bool IsAggrListInit)
Attempt to initialize an object of a class type either by direct-initialization, or by copy-initializ...
static bool IsZeroInitializer(const Expr *Init, ASTContext &Ctx)
static const FieldDecl * getConstField(const RecordDecl *RD)
static bool ResolveOverloadedFunctionForReferenceBinding(Sema &S, Expr *Initializer, QualType &SourceType, QualType &UnqualifiedSourceType, QualType UnqualifiedTargetType, InitializationSequence &Sequence)
InvalidICRKind
The non-zero enum values here are indexes into diagnostic alternatives.
static ExprResult PerformConstructorInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, const InitializationSequence::Step &Step, bool &ConstructorInitRequiresZeroInit, bool IsListInitialization, bool IsStdInitListInitialization, SourceLocation LBraceLoc, SourceLocation RBraceLoc)
static void TryReferenceListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, InitListExpr *InitList, InitializationSequence &Sequence, bool TreatUnavailableAsInvalid)
Attempt list initialization of a reference.
static bool hasCopyOrMoveCtorParam(ASTContext &Ctx, const ConstructorInfo &Info)
Determine if the constructor has the signature of a copy or move constructor for the type T of the cl...
static bool DiagnoseUninitializedReference(Sema &S, SourceLocation Loc, QualType T)
Somewhere within T there is an uninitialized reference subobject.
static InvalidICRKind isInvalidICRSource(ASTContext &C, Expr *e, bool isAddressOf, bool &isWeakAccess)
Determines whether this expression is an acceptable ICR source.
This file declares semantic analysis for Objective-C.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
Defines the clang::TypeLoc interface and its subclasses.
__device__ __2f16 float __ockl_bool s
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
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
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
CanQualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
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 getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
const TargetInfo & getTargetInfo() const
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
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.
CXXBaseSpecifier * base_class_iterator
Iterator that traverses the base classes of a class.
llvm::iterator_range< base_class_const_iterator > base_class_const_range
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.
const CXXBaseSpecifier * base_class_const_iterator
Iterator that traverses the base classes of a class.
llvm::iterator_range< base_class_iterator > base_class_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
bool isCallToStdMove() const
SourceLocation getRParenLoc() const
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
static CharSourceRange getTokenRange(SourceRange R)
SourceLocation getBegin() const
Declaration of a class template.
void setExprNeedsCleanups(bool SideEffects)
ConditionalOperator - The ?
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.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
DeclContextLookupResult lookup_result
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
static bool isFlexibleArrayMemberLike(const ASTContext &Context, const Decl *D, QualType Ty, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel, bool IgnoreTemplateOrMacroSubstitution)
Whether it resembles a flexible array member.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setReferenced(bool R=true)
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a single C99 designator.
bool isFieldDesignator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isArrayRangeDesignator() const
void setFieldDecl(FieldDecl *FD)
FieldDecl * getFieldDecl() const
bool isArrayDesignator() const
SourceLocation getFieldLoc() const
const IdentifierInfo * getFieldName() const
SourceLocation getDotLoc() const
SourceLocation getLBracketLoc() 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
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).
MutableArrayRef< Designator > designators()
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,...
static DesignatedInitExpr * Create(const ASTContext &C, ArrayRef< Designator > Designators, ArrayRef< Expr * > IndexExprs, SourceLocation EqualOrColonLoc, bool GNUSyntax, Expr *Init)
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.
SourceLocation getFieldLoc() const
SourceLocation getDotLoc() const
Expr * getArrayRangeStart() const
bool isArrayDesignator() const
SourceLocation getLBracketLoc() const
bool isArrayRangeDesignator() const
bool isFieldDesignator() const
SourceLocation getRBracketLoc() const
SourceLocation getEllipsisLoc() const
Expr * getArrayRangeEnd() const
const IdentifierInfo * getFieldDecl() const
Expr * getArrayIndex() const
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.
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
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) 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.
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.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
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...
unsigned getNumInitsWithEmbedExpanded() const
getNumInits but if the list has an EmbedExpr inside includes full length of embedded data.
SourceLocation getRBraceLoc() const
InitListExpr * getSemanticForm() 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
void setRBraceLoc(SourceLocation Loc)
ArrayRef< Expr * > inits() const
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.
InitKind getKind() const
Determine the initialization kind.
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
static InitializationKind CreateValue(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool isImplicit=false)
Create a value initialization.
A single step in the initialization sequence.
StepKind Kind
The kind of conversion or initialization step we are taking.
InitListExpr * WrappingSyntacticList
When Kind = SK_RewrapInitList, the syntactic form of the wrapping list.
ImplicitConversionSequence * ICS
When Kind = SK_ConversionSequence, the implicit conversion sequence.
struct F Function
When Kind == SK_ResolvedOverloadedFunction or Kind == SK_UserConversion, the function that the expres...
Describes the sequence of initializations required to initialize a given object or reference with a s...
step_iterator step_begin() const
void AddListInitializationStep(QualType T)
Add a list-initialization step.
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
void AddStringInitStep(QualType T)
Add a string init step.
void AddStdInitializerListConstructionStep(QualType T)
Add a step to construct a std::initializer_list object from an initializer list.
void AddConstructorInitializationStep(DeclAccessPair FoundDecl, CXXConstructorDecl *Constructor, QualType T, bool HadMultipleCandidates, bool FromInitList, bool AsInitList)
Add a constructor-initialization step.
@ SK_StdInitializerListConstructorCall
Perform initialization via a constructor taking a single std::initializer_list argument.
@ SK_AtomicConversion
Perform a conversion adding _Atomic to a type.
@ SK_ObjCObjectConversion
An initialization that "converts" an Objective-C object (not a point to an object) to another Objecti...
@ SK_GNUArrayInit
Array initialization (from an array rvalue) as a GNU extension.
@ SK_CastDerivedToBaseLValue
Perform a derived-to-base cast, producing an lvalue.
@ SK_ProduceObjCObject
Produce an Objective-C object pointer.
@ SK_FunctionReferenceConversion
Perform a function reference conversion, see [dcl.init.ref]p4.
@ SK_BindReference
Reference binding to an lvalue.
@ SK_ArrayLoopInit
Array initialization by elementwise copy.
@ SK_ConstructorInitialization
Perform initialization via a constructor.
@ SK_OCLSamplerInit
Initialize an OpenCL sampler from an integer.
@ SK_StringInit
Initialization by string.
@ SK_ZeroInitialization
Zero-initialize the object.
@ SK_CastDerivedToBaseXValue
Perform a derived-to-base cast, producing an xvalue.
@ SK_QualificationConversionXValue
Perform a qualification conversion, producing an xvalue.
@ SK_UserConversion
Perform a user-defined conversion, either via a conversion function or via a constructor.
@ SK_CastDerivedToBasePRValue
Perform a derived-to-base cast, producing an rvalue.
@ SK_BindReferenceToTemporary
Reference binding to a temporary.
@ SK_PassByIndirectRestore
Pass an object by indirect restore.
@ SK_ParenthesizedArrayInit
Array initialization from a parenthesized initializer list.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
@ SK_ArrayInit
Array initialization (from an array rvalue).
@ SK_ExtraneousCopyToTemporary
An optional copy of a temporary object to another temporary object, which is permitted (but not requi...
@ SK_ArrayLoopIndex
Array indexing for initialization by elementwise copy.
@ SK_ConversionSequenceNoNarrowing
Perform an implicit conversion sequence without narrowing.
@ SK_RewrapInitList
Rewrap the single-element initializer list for a reference.
@ SK_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...
OverloadingResult getFailedOverloadResult() const
Get the overloading result, for when the initialization sequence failed due to a bad overload.
void setSequenceKind(enum SequenceKind SK)
Set the kind of sequence computed.
void AddObjCObjectConversionStep(QualType T)
Add an Objective-C object conversion step, which is always a no-op.
void SetOverloadFailure(FailureKind Failure, OverloadingResult Result)
Note that this initialization sequence failed due to failed overload resolution.
step_iterator step_end() const
void AddParenthesizedArrayInitStep(QualType T)
Add a parenthesized array initialization step.
void AddExtraneousCopyToTemporary(QualType T)
Add a new step that makes an extraneous copy of the input to a temporary of the same class type.
void setIncompleteTypeFailure(QualType IncompleteType)
Note that this initialization sequence failed due to an incomplete type.
void AddOCLSamplerInitStep(QualType T)
Add a step to initialize an OpenCL sampler from an integer constant.
void AddCAssignmentStep(QualType T)
Add a C assignment step.
void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy)
Add a step to pass an object by indirect copy-restore.
void RewrapReferenceInitList(QualType T, InitListExpr *Syntactic)
Add steps to unwrap a initializer list for a reference around a single element and rewrap it at the e...
bool Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef< Expr * > Args)
Diagnose an potentially-invalid initialization sequence.
bool Failed() const
Determine whether the initialization sequence is invalid.
void AddAtomicConversionStep(QualType Ty)
Add a new step that performs conversion from non-atomic to atomic type.
void dump() const
Dump a representation of this initialization sequence to standard error, for debugging purposes.
void AddConversionSequenceStep(const ImplicitConversionSequence &ICS, QualType T, bool TopLevelOfInitList=false)
Add a new step that applies an implicit conversion sequence.
void AddZeroInitializationStep(QualType T)
Add a zero-initialization step.
void AddProduceObjCObjectStep(QualType T)
Add a step to "produce" an Objective-C object (by retaining it).
enum SequenceKind getKind() const
Determine the kind of initialization sequence computed.
SequenceKind
Describes the kind of initialization sequence computed.
@ NormalSequence
A normal sequence.
@ FailedSequence
A failed initialization sequence.
@ DependentSequence
A dependent initialization, which could not be type-checked due to the presence of dependent types or...
void AddReferenceBindingStep(QualType T, bool BindingTemporary)
Add a new step binding a reference to an object.
FailureKind
Describes why initialization failed.
@ FK_UserConversionOverloadFailed
Overloading for a user-defined conversion failed.
@ FK_NarrowStringIntoWideCharArray
Initializing a wide char array with narrow string literal.
@ FK_ArrayTypeMismatch
Array type mismatch.
@ FK_ParenthesizedListInitForReference
Reference initialized from a parenthesized initializer list.
@ FK_NonConstLValueReferenceBindingToVectorElement
Non-const lvalue reference binding to a vector element.
@ FK_ReferenceInitDropsQualifiers
Reference binding drops qualifiers.
@ FK_InitListBadDestinationType
Initialization of some unused destination type with an initializer list.
@ FK_ConversionFromPropertyFailed
Implicit conversion failed.
@ FK_NonConstLValueReferenceBindingToUnrelated
Non-const lvalue reference binding to an lvalue of unrelated type.
@ FK_ListConstructorOverloadFailed
Overloading for list-initialization by constructor failed.
@ FK_ReferenceInitFailed
Reference binding failed.
@ FK_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_HLSLInitListFlatteningFailed
HLSL initialization list flattening failed.
@ FK_PlaceholderType
Initializer has a placeholder type which cannot be resolved by initialization.
@ FK_IncompatWideStringIntoWideChar
Initializing wide char array with incompatible wide string literal.
@ FK_NonConstLValueReferenceBindingToMatrixElement
Non-const lvalue reference binding to a matrix element.
@ FK_TooManyInitsForReference
Too many initializers provided for a reference.
@ FK_NonConstLValueReferenceBindingToBitfield
Non-const lvalue reference binding to a bit-field.
@ FK_ReferenceAddrspaceMismatchTemporary
Reference with mismatching address space binding to temporary.
@ FK_ListInitializationFailed
List initialization failed at some point.
@ FK_TooManyInitsForScalar
Too many initializers for scalar.
@ FK_AddressOfOverloadFailed
Cannot resolve the address of an overloaded function.
@ FK_VariableLengthArrayHasInitializer
Variable-length array must not have an initializer.
@ FK_ArrayNeedsInitListOrWideStringLiteral
Array must be initialized with an initializer list or a wide string literal.
@ FK_RValueReferenceBindingToLValue
Rvalue reference binding to an lvalue.
@ FK_Incomplete
Initialization of an incomplete type.
@ FK_WideStringIntoCharArray
Initializing char array with wide string literal.
@ FK_ExplicitConstructor
List-copy-initialization chose an explicit constructor.
@ FK_ReferenceInitOverloadFailed
Overloading due to reference initialization failed.
@ FK_ConstructorOverloadFailed
Overloading for initialization by constructor failed.
@ FK_ReferenceBindingToInitList
Reference initialization from an initializer list.
@ FK_DefaultInitOfConst
Default-initialization of a 'const' object.
@ FK_ParenthesizedListInitFailed
Parenthesized list initialization failed at some point.
@ FK_AddressOfUnaddressableFunction
Trying to take the address of a function that doesn't support having its address taken.
@ FK_UTF8StringIntoPlainChar
Initializing char array with UTF-8 string literal.
bool isDirectReferenceBinding() const
Determine whether this initialization is a direct reference binding (C++ [dcl.init....
void AddArrayInitLoopStep(QualType T, QualType EltTy)
Add an array initialization loop step.
void AddAddressOverloadResolutionStep(FunctionDecl *Function, DeclAccessPair Found, bool HadMultipleCandidates)
Add a new step in the initialization that resolves the address of an overloaded function to a specifi...
void AddArrayInitStep(QualType T, bool IsGNUExtension)
Add an array initialization step.
bool isConstructorInitialization() const
Determine whether this initialization is direct call to a constructor.
SmallVectorImpl< Step >::const_iterator step_iterator
OverloadCandidateSet & getFailedCandidateSet()
Retrieve a reference to the candidate set when overload resolution fails.
Describes an entity that is being initialized.
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
VD Variable
When Kind == EK_Variable, EK_Member, EK_Binding, or EK_TemplateParameter, the variable,...
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a member subobject.
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_MatrixElement
The entity being initialized is an element of a matrix.
@ EK_Parameter_CF_Audited
The entity being initialized is a function parameter; function is member of group of audited CF APIs.
@ EK_LambdaToBlockConversionBlockElement
The entity being initialized is a field of block descriptor for the copied-in lambda object that's us...
@ EK_Member
The entity being initialized is a non-static data member subobject.
@ EK_Base
The entity being initialized is a base member subobject.
@ EK_Result
The entity being initialized is the result of a function call.
@ EK_TemplateParameter
The entity being initialized is a non-type template parameter.
@ EK_StmtExprResult
The entity being initialized is the result of a statement expression.
@ EK_ParenAggInitMember
The entity being initialized is a non-static data member subobject of an object initialized via paren...
@ EK_VectorElement
The entity being initialized is an element of a vector.
@ EK_New
The entity being initialized is an object (or array of objects) allocated via new.
@ EK_CompoundLiteralInit
The entity being initialized is the initializer for a compound literal.
@ EK_Parameter
The entity being initialized is a function parameter.
@ EK_Delegating
The initialization is being done by a delegating constructor.
@ EK_ComplexElement
The entity being initialized is the real or imaginary part of a complex number.
@ EK_ArrayElement
The entity being initialized is an element of an array.
@ EK_LambdaCapture
The entity being initialized is the field that captures a variable in a lambda.
@ EK_Exception
The entity being initialized is an exception object that is being thrown.
@ EK_RelatedResult
The entity being implicitly initialized back to the formal result type.
static InitializedEntity InitializeMemberFromParenAggInit(FieldDecl *Member)
Create the initialization entity for a member subobject initialized via parenthesized aggregate init.
SourceLocation getThrowLoc() const
Determine the location of the 'throw' keyword when initializing an exception object.
unsigned Index
When Kind == EK_ArrayElement, EK_VectorElement, EK_MatrixElement, or EK_ComplexElement,...
bool isVariableLengthArrayNew() const
Determine whether this is an array new with an unknown bound.
llvm::PointerIntPair< ParmVarDecl *, 1 > Parameter
When Kind == EK_Parameter, the ParmVarDecl, with the integer indicating whether the parameter is "con...
const CXXBaseSpecifier * getBaseSpecifier() const
Retrieve the base specifier.
SourceLocation getReturnLoc() const
Determine the location of the 'return' keyword when initializing the result of a function call.
TypeSourceInfo * getTypeSourceInfo() const
Retrieve complete type-source information for the object being constructed, if known.
ObjCMethodDecl * getMethodDecl() const
Retrieve the ObjectiveC method being initialized.
An lvalue reference type, per C++11 [dcl.ref].
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
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.
Represents a matrix type, as defined in the Matrix Types clang extensions.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
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.
QualType getEncodedType() const
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)
llvm::MutableArrayRef< Expr * > getPersistentArgsArray(unsigned N)
Provide storage for any Expr* arg that must be preserved until deferred template candidates are deduc...
@ 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.
CandidateSetKind getKind() const
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
bool NeedsStdLibCxxWorkaroundBefore(std::uint64_t FixedVersion)
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 getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the 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
static Qualifiers fromCVRMask(unsigned CVR)
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
LangAS getAddressSpace() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
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.
bool hasUninitializedExplicitInitFields() const
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
Base for LValueReferenceType and RValueReferenceType.
bool isSpelledAsLValue() const
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
bool transformInitList(const InitializedEntity &Entity, InitListExpr *Init)
bool CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose=true)
bool isObjCWritebackConversion(QualType FromType, QualType ToType, QualType &ConvertedType)
Determine whether this is an Objective-C writeback conversion, used for parameter passing when perfor...
bool CheckConversionToObjCLiteral(QualType DstType, Expr *&SrcExpr, bool Diagnose=true)
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
void EmitRelatedResultTypeNoteForReturn(QualType destType)
Given that we had incompatible pointer types in a return statement, check whether we're in a method w...
Sema - This implements semantic analysis and AST building for C.
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 ...
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...
Preprocessor & getPreprocessor() const
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
ExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation EqualOrColonLoc, bool GNUSyntax, ExprResult Init)
FPOptionsOverride CurFPFeatureOverrides()
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExpressionEvaluationContextRecord & parentEvaluationContext()
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
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.
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 AddConversionCandidate(CXXConversionDecl *Conversion, DeclAccessPair FoundDecl, CXXRecordDecl *ActingContext, Expr *From, QualType ToType, OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit, bool AllowExplicit, bool AllowResultConversion=true, bool StrictPackMatch=false)
AddConversionCandidate - Add a C++ conversion function as a candidate in the candidate set (C++ [over...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
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)
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
ExprResult PerformQualificationConversion(Expr *E, QualType Ty, ExprValueKind VK=VK_PRValue, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
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.
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
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
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
bool IsAssignConvertCompatible(AssignConvertType ConvTy)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
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.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
AccessResult CheckAddressOfMemberAccess(Expr *OvlExpr, DeclAccessPair FoundDecl)
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
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 BoundsSafetyCheckInitialization(const InitializedEntity &Entity, const InitializationKind &Kind, AssignmentAction Action, QualType LHSType, Expr *RHSExpr)
Perform Bounds Safety Semantic checks for initializing a Bounds Safety pointer.
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
TypeSourceInfo * SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto)
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
bool isSFINAEContext() const
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,...
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
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
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
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)
friend class InitializationSequence
CXXDeductionGuideDecl * DeclareAggregateDeductionGuideFromInitList(TemplateDecl *Template, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc)
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 CanPerformCopyInitialization(const InitializedEntity &Entity, ExprResult Init)
bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType)
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
Encodes a location in the source.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const
Return the start/end of the expansion information for an expansion location.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool isAtStartOfImmediateMacroExpansion(SourceLocation Loc, SourceLocation *MacroBegin=nullptr) const
Returns true if the given MacroID location points at the beginning of the immediate macro expansion.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
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.
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.
bool isBooleanType() const
bool isMFloat8Type() 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
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
CXXRecordDecl * castAsCXXRecordDecl() const
bool isConstantMatrixType() 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 isEnumeralType() 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.
RecordDecl * castAsRecordDecl() const
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 isMatrixType() const
EnumDecl * castAsEnumDecl() 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
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
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
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.
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
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
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
void checkInitLifetime(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient for initializing the ent...
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
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.
MutableArrayRef< Expr * > MultiExprArg
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ 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.
@ Template
We are parsing a template declaration.
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.
CastKind
CastKind - The kind of operation required for a conversion.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ 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)
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
@ 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.
U cast(CodeGen::Address addr)
ConstructorInfo getConstructorInfo(NamedDecl *ND)
ActionResult< Expr * > ExprResult
@ 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.
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).
unsigned 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.
unsigned Viable
Viable - True to indicate that this overload candidate is viable.
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
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.