clang: include/clang/Sema/Initialization.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_CLANG_SEMA_INITIALIZATION_H
14#define LLVM_CLANG_SEMA_INITIALIZATION_H
15
30#include "llvm/ADT/ArrayRef.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/StringRef.h"
33#include "llvm/ADT/iterator_range.h"
34#include "llvm/Support/Casting.h"
35#include
36#include
37#include
38
40
45
46
47class alignas(8) InitializedEntity {
48public:
49
51
53
54
56
57
59
60
62
63
65
66
67
69
70
71
73
74
76
77
78
80
81
83
84
86
87
89
90
91
93
94
95
97
98
99
101
102
103
105
106
107
109
110
111
113
114
115
117
118
119
121
122
123
125
126
127
129
130
131
133
134
135
136
137 };
138
139private:
140
141 EntityKind Kind;
142
143
144
146
147
149
150
151 mutable unsigned ManglingNumber = 0;
152
153 struct LN {
154
155
156
157
159
160
161
162 bool NRVO;
163 };
164
165 struct VD {
166
167
168 NamedDecl *VariableOrMember;
169
170
171
172
173 bool IsImplicitFieldInit;
174
175
176
177 bool IsDefaultMemberInit;
178 };
179
180 struct C {
181
182 IdentifierInfo *VarID;
183
184
185 SourceLocation Location;
186 };
187
188 union {
189
190
192
193
194
196
197
198
199 llvm::PointerIntPair<ParmVarDecl *, 1> Parameter;
200
201
202
204
206
207
208
209
210 llvm::PointerIntPair<const CXXBaseSpecifier *, 1> Base;
211
212
213
214
216
218 };
219
221
222
223 InitializedEntity(VarDecl *Var, EntityKind EK = EK_Variable)
225
226
227
228
229 InitializedEntity(EntityKind Kind, SourceLocation Loc, QualType Type,
230 bool NRVO = false)
231 : Kind(Kind), Type(Type) {
235 }
236
237
238 InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent,
239 bool Implicit, bool DefaultMemberInit,
240 bool IsParenAggInit = false)
244
245
246 InitializedEntity(ASTContext &Context, unsigned Index,
247 const InitializedEntity &Parent);
248
249
250 InitializedEntity(IdentifierInfo *VarID, QualType FieldType, SourceLocation Loc)
255 }
256
257public:
258
260 return InitializedEntity(Var);
261 }
262
263
268
269
270
273 bool Consumed = (Context.getLangOpts().ObjCAutoRefCount &&
274 Parm->hasAttr());
275
276 InitializedEntity Entity;
278 Entity.Type =
279 Context.getVariableArrayDecayedType(Type.getUnqualifiedType());
280 Entity.Parent = nullptr;
281 Entity.Parameter = {Parm, Consumed};
282 return Entity;
283 }
284
285
286
289 bool Consumed) {
290 InitializedEntity Entity;
292 Entity.Type = Context.getVariableArrayDecayedType(Type);
293 Entity.Parent = nullptr;
294 Entity.Parameter = {nullptr, Consumed};
295 return Entity;
296 }
297
298
301 InitializedEntity Entity;
303 Entity.Type = T;
304 Entity.Parent = nullptr;
305 Entity.Variable = {Param, false, false};
306 return Entity;
307 }
308
309
312 return InitializedEntity(EK_Result, ReturnLoc, Type);
313 }
314
319
324
328 BlockVarLoc, Type);
329 }
330
331
334 return InitializedEntity(EK_Exception, ThrowLoc, Type);
335 }
336
337
339 return InitializedEntity(EK_New, NewLoc, Type);
340 }
341
342
346
347
351 if (Context.getLangOpts().OpenCLCPlusPlus) {
352 assert(!Type.hasAddressSpace() && "Temporary already has address space!");
354 }
355
357 }
358
359
366
367
371 Result.MethodDecl = MD;
373 }
374
375
378 bool IsInheritedVirtualBase,
380
381
385
386
389 const InitializedEntity *Parent = nullptr,
391 return InitializedEntity(Member, Parent, Implicit, false);
392 }
393
394
397 const InitializedEntity *Parent = nullptr,
399 return InitializedEntity(Member->getAnonField(), Parent, Implicit, false);
400 }
401
402
403
405 return InitializedEntity(Member, nullptr, false,
406 false,
407 true);
408 }
409
410
413 return InitializedEntity(Member, nullptr, false, true);
414 }
415
416
419 const InitializedEntity &Parent) {
420 return InitializedEntity(Context, Index, Parent);
421 }
422
423
425 return InitializedEntity(Binding, EK_Binding);
426 }
427
428
429
430
434 return InitializedEntity(VarID, FieldType, Loc);
435 }
436
437
441 Result.TypeInfo = TSI;
443 }
444
445
447
448
449
450
451 const InitializedEntity *getParent() const { return Parent; }
452
453
455
456
457
461
462 return nullptr;
463 }
464
465
467
468
469
471
472
474
475
476
478
483
487
488
489
494
495
497 assert(getKind() == EK_Base && "Not a base specifier");
498 return Base.getPointer();
499 }
500
501
503 assert(getKind() == EK_Base && "Not a base specifier");
504 return Base.getInt();
505 }
506
507
509 return getKind() == EK_New && isa_and_nonnull(
510 getType()->getAsArrayTypeUnsafe());
511 }
512
513
514
518
519
520
524
525
526
531
532
533
538
539
540
546
547
548
552 this->Index = Index;
553 }
554
555
560
561
562
567
571
573
574
575
576 void dump() const;
577
578private:
579 unsigned dumpImpl(raw_ostream &OS) const;
580};
581
582
583
584
585class InitializationKind {
586public:
587
589
591
592
594
595
597
598
600
601
603 };
604
605private:
606
607 enum InitContext {
608
609 IC_Normal,
610
611
612 IC_ExplicitConvs,
613
614
615 IC_Implicit,
616
617
618 IC_StaticCast,
619
620
621 IC_CStyleCast,
622
623
624 IC_FunctionalCast
625 };
626
627
628 InitKind Kind : 8;
629
630
631 InitContext Context : 8;
632
633
634 SourceLocation Locations[3];
635
636 InitializationKind(InitKind Kind, InitContext Context, SourceLocation Loc1,
637 SourceLocation Loc2, SourceLocation Loc3)
638 : Kind(Kind), Context(Context) {
639 Locations[0] = Loc1;
640 Locations[1] = Loc2;
641 Locations[2] = Loc3;
642 }
643
644public:
645
649 return InitializationKind(IK_Direct, IC_Normal,
650 InitLoc, LParenLoc, RParenLoc);
651 }
652
654 return InitializationKind(IK_DirectList, IC_Normal, InitLoc, InitLoc,
655 InitLoc);
656 }
657
661 return InitializationKind(IK_DirectList, IC_Normal, InitLoc, LBraceLoc,
662 RBraceLoc);
663 }
664
665
666
671
672
675 bool InitList) {
676
677
679 IC_CStyleCast, StartLoc, TypeRange.getBegin(),
681 }
682
683
686 bool InitList) {
688 IC_FunctionalCast, StartLoc,
690 }
691
692
695 bool AllowExplicitConvs = false) {
696 return InitializationKind(IK_Copy,
697 AllowExplicitConvs? IC_ExplicitConvs : IC_Normal,
698 InitLoc, EqualLoc, EqualLoc);
699 }
700
701
703 return InitializationKind(IK_Default, IC_Normal, InitLoc, InitLoc, InitLoc);
704 }
705
706
710 bool isImplicit = false) {
711 return InitializationKind(IK_Value, isImplicit ? IC_Implicit : IC_Normal,
712 InitLoc, LParenLoc, RParenLoc);
713 }
714
715
716
726
727
731
732
734 return Context >= IC_StaticCast;
735 }
736
737
738 bool isStaticCast() const { return Context == IC_StaticCast; }
739
740
742 return Context >= IC_CStyleCast;
743 }
744
745
747 return Context == IC_CStyleCast;
748 }
749
750
752 return Context == IC_FunctionalCast;
753 }
754
755
756
757
759
760
762
763
765 return SourceRange(Locations[0], Locations[2]);
766 }
767
768
769
771 assert(Kind == IK_Copy && "Only copy initialization has an '='");
772 return Locations[1];
773 }
774
776
777
778
780
781
782
783
784
786 return () || Context == IC_ExplicitConvs;
787 }
788
789
790
794
795
796
797
800 "initialization have parentheses or "
801 "braces");
802 return SourceRange(Locations[1], Locations[2]);
803 }
804};
805
806
807
809public:
810
812
813
815
816
817
818
820
821
823 };
824
825
826
828
829
831
832
834
835
837
838
840
841
843
844
846
847
848
849
851
852
853
855
856
857
859
860
862
863
865
866
868
869
871
872
874
875
877
878
880
881
883
884
886
887
889
890
892
893
894
896
897
899
900
902
903
905
906
907
909
910
912
913
915
916
918
919
921
922
923
925
926
928
929
931
932
934
935
937
938
939
941
942
944
945
947
948
949
951 };
952
953
955 public:
956
958
959
961
967
968 union {
969
970
971
972
973
974
975
976
977
978
980
981
982
984
985
986
988 };
989
991 };
992
993private:
994
996
997
999
1000public:
1001
1003
1005
1006
1008
1009
1011
1012
1013
1015
1016
1017
1019
1020
1022
1023
1025
1026
1027
1029
1030
1032
1033
1035
1036
1038
1039
1041
1042
1044
1045
1047
1048
1050
1051
1053
1054
1056
1057
1059
1060
1061
1063
1064
1066
1067
1069
1070
1072
1073
1075
1076
1078
1079
1081
1082
1084
1085
1087
1088
1090
1091
1092
1094
1095
1097
1098
1100
1101
1103
1104
1106
1107
1109
1110
1112
1113
1115
1116
1117
1119
1120
1121
1123
1124
1126
1127
1128
1130
1131
1133
1134
1136 };
1137
1138private:
1139
1140 FailureKind Failure;
1141
1142
1144
1145
1147
1148
1149 QualType FailedIncompleteType;
1150
1151
1152
1153 std::string ZeroInitializationFixit;
1155
1156public:
1157
1158
1160 ZeroInitializationFixit = Fixit;
1161 ZeroInitializationFixitLoc = L;
1162 }
1163
1164private:
1165
1166
1168
1169public:
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1193 bool TopLevelOfInitList = false,
1194 bool TreatUnavailableAsInvalid = true);
1197 bool TopLevelOfInitList, bool TreatUnavailableAsInvalid);
1198
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1226 QualType *ResultType = nullptr);
1227
1228
1229
1230
1231
1236
1237
1239
1240
1242
1243
1244 explicit operator bool() const { return (); }
1245
1246
1248
1250
1253
1254 using step_range = llvm::iterator_range<step_iterator>;
1255
1257
1258
1259
1261
1262
1264
1265
1266
1268
1269
1270
1271
1272
1273
1276 bool HadMultipleCandidates);
1277
1278
1279
1280
1281
1282
1283
1284
1287
1288
1289
1290
1291
1292
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1306
1307
1308
1310
1311
1312
1316 bool HadMultipleCandidates);
1317
1318
1319
1322
1323
1324
1326
1327
1328
1330
1331
1333 QualType T, bool TopLevelOfInitList = false);
1334
1335
1337
1338
1339
1340
1341
1342
1346 bool HadMultipleCandidates,
1347 bool FromInitList, bool AsInitList);
1348
1349
1351
1352
1353
1354
1355
1356
1358
1359
1361
1362
1363
1365
1366
1368
1369
1371
1372
1374
1375
1377
1378
1379
1381
1382
1383
1385
1386
1387
1389
1390
1391
1393
1395
1396
1397
1398
1400
1401
1402
1404
1405
1408 this->Failure = Failure;
1409 assert((Failure != FK_Incomplete || !FailedIncompleteType.isNull()) &&
1410 "Incomplete type failure requires a type!");
1411 }
1412
1413
1414
1416
1417
1418
1420 return FailedCandidateSet;
1421 }
1422
1423
1424
1426 return FailedOverloadResult;
1427 }
1428
1429
1430
1432 FailedIncompleteType = IncompleteType;
1434 }
1435
1436
1438 assert(Failed() && "Not an initialization failure!");
1439 return Failure;
1440 }
1441
1442
1443
1444 void dump(raw_ostream &OS) const;
1445
1446
1447
1448 void dump() const;
1449};
1450
1451}
1452
1453#endif
Defines the clang::ASTContext interface.
TokenType getType() const
Returns the token's type, e.g.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
A POD class for pairing a NamedDecl* with an access specifier.
The name of a declaration.
This represents one expression.
Represents a member of a struct/union/class.
Represents a function declaration or definition.
One of these records is kept for each identifier that is lexed.
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Represents a field injected from an anonymous union/struct into the parent scope.
Describes an C or C++ initializer list.
Describes the kind of initialization being performed, along with location information for tokens rela...
Definition Initialization.h:585
SourceLocation getLocation() const
Retrieve the location at which initialization is occurring.
Definition Initialization.h:761
static InitializationKind CreateCast(SourceRange TypeRange)
Create a direct initialization due to a cast that isn't a C-style or functional cast.
Definition Initialization.h:667
InitKind
The kind of initialization being performed.
Definition Initialization.h:588
@ IK_DirectList
Direct list-initialization.
Definition Initialization.h:593
@ IK_Value
Value initialization.
Definition Initialization.h:602
@ IK_Direct
Direct initialization.
Definition Initialization.h:590
@ IK_Copy
Copy initialization.
Definition Initialization.h:596
@ IK_Default
Default initialization.
Definition Initialization.h:599
SourceLocation getEqualLoc() const
Retrieve the location of the equal sign for copy initialization (if present).
Definition Initialization.h:770
bool isCStyleOrFunctionalCast() const
Determine whether this initialization is a C-style cast.
Definition Initialization.h:741
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
Definition Initialization.h:702
bool hasParenOrBraceRange() const
Determine whether this initialization has a source range containing the locations of open and closing...
Definition Initialization.h:791
bool isExplicitCast() const
Determine whether this initialization is an explicit cast.
Definition Initialization.h:733
bool isFunctionalCast() const
Determine whether this is a functional-style cast.
Definition Initialization.h:751
InitKind getKind() const
Determine the initialization kind.
Definition Initialization.h:728
static InitializationKind CreateFunctionalCast(SourceLocation StartLoc, SourceRange ParenRange, bool InitList)
Create a direct initialization for a functional cast.
Definition Initialization.h:684
bool AllowExplicit() const
Retrieve whether this initialization allows the use of explicit constructors.
Definition Initialization.h:779
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
Definition Initialization.h:646
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
Definition Initialization.h:717
bool isImplicitValueInit() const
Determine whether this initialization is an implicit value-initialization, e.g., as occurs during agg...
Definition Initialization.h:758
bool isCStyleCast() const
Determine whether this is a C-style cast.
Definition Initialization.h:746
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
Definition Initialization.h:693
static InitializationKind CreateDirectList(SourceLocation InitLoc)
Definition Initialization.h:653
bool isCopyInit() const
Definition Initialization.h:775
SourceRange getParenOrBraceRange() const
Retrieve the source range containing the locations of the open and closing parentheses or braces for ...
Definition Initialization.h:798
bool allowExplicitConversionFunctionsInRefBinding() const
Retrieve whether this initialization allows the use of explicit conversion functions when binding a r...
Definition Initialization.h:785
static InitializationKind CreateDirectList(SourceLocation InitLoc, SourceLocation LBraceLoc, SourceLocation RBraceLoc)
Definition Initialization.h:658
bool isStaticCast() const
Determine whether this initialization is a static cast.
Definition Initialization.h:738
static InitializationKind CreateValue(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool isImplicit=false)
Create a value initialization.
Definition Initialization.h:707
SourceRange getRange() const
Retrieve the source range that covers the initialization.
Definition Initialization.h:764
static InitializationKind CreateCStyleCast(SourceLocation StartLoc, SourceRange TypeRange, bool InitList)
Create a direct initialization for a C-style cast.
Definition Initialization.h:673
A single step in the initialization sequence.
Definition Initialization.h:954
StepKind Kind
The kind of conversion or initialization step we are taking.
Definition Initialization.h:957
InitListExpr * WrappingSyntacticList
When Kind = SK_RewrapInitList, the syntactic form of the wrapping list.
Definition Initialization.h:987
ImplicitConversionSequence * ICS
When Kind = SK_ConversionSequence, the implicit conversion sequence.
Definition Initialization.h:983
struct F Function
When Kind == SK_ResolvedOverloadedFunction or Kind == SK_UserConversion, the function that the expres...
Definition Initialization.h:979
QualType Type
Definition Initialization.h:960
step_iterator step_begin() const
Definition Initialization.h:1251
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.
StepKind
Describes the kind of a particular step in an initialization sequence.
Definition Initialization.h:827
@ SK_StdInitializerListConstructorCall
Perform initialization via a constructor taking a single std::initializer_list argument.
Definition Initialization.h:940
@ SK_AtomicConversion
Perform a conversion adding _Atomic to a type.
Definition Initialization.h:873
@ SK_ObjCObjectConversion
An initialization that "converts" an Objective-C object (not a point to an object) to another Objecti...
Definition Initialization.h:908
@ SK_GNUArrayInit
Array initialization (from an array rvalue) as a GNU extension.
Definition Initialization.h:920
@ SK_CastDerivedToBaseLValue
Perform a derived-to-base cast, producing an lvalue.
Definition Initialization.h:839
@ SK_ProduceObjCObject
Produce an Objective-C object pointer.
Definition Initialization.h:933
@ SK_FunctionReferenceConversion
Perform a function reference conversion, see [dcl.init.ref]p4.
Definition Initialization.h:870
@ SK_BindReference
Reference binding to an lvalue.
Definition Initialization.h:842
@ SK_ArrayLoopInit
Array initialization by elementwise copy.
Definition Initialization.h:914
@ SK_ConstructorInitialization
Perform initialization via a constructor.
Definition Initialization.h:891
@ SK_OCLSamplerInit
Initialize an OpenCL sampler from an integer.
Definition Initialization.h:943
@ SK_StringInit
Initialization by string.
Definition Initialization.h:904
@ SK_ZeroInitialization
Zero-initialize the object.
Definition Initialization.h:898
@ SK_CastDerivedToBaseXValue
Perform a derived-to-base cast, producing an xvalue.
Definition Initialization.h:836
@ SK_QualificationConversionXValue
Perform a qualification conversion, producing an xvalue.
Definition Initialization.h:864
@ SK_UserConversion
Perform a user-defined conversion, either via a conversion function or via a constructor.
Definition Initialization.h:858
@ SK_CastDerivedToBasePRValue
Perform a derived-to-base cast, producing an rvalue.
Definition Initialization.h:833
@ SK_BindReferenceToTemporary
Reference binding to a temporary.
Definition Initialization.h:845
@ SK_PassByIndirectRestore
Pass an object by indirect restore.
Definition Initialization.h:930
@ SK_ParenthesizedArrayInit
Array initialization from a parenthesized initializer list.
Definition Initialization.h:924
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
Definition Initialization.h:950
@ SK_ArrayInit
Array initialization (from an array rvalue).
Definition Initialization.h:917
@ SK_ExtraneousCopyToTemporary
An optional copy of a temporary object to another temporary object, which is permitted (but not requi...
Definition Initialization.h:850
@ SK_ArrayLoopIndex
Array indexing for initialization by elementwise copy.
Definition Initialization.h:911
@ SK_ConversionSequenceNoNarrowing
Perform an implicit conversion sequence without narrowing.
Definition Initialization.h:879
@ SK_RewrapInitList
Rewrap the single-element initializer list for a reference.
Definition Initialization.h:888
@ SK_CAssignment
C assignment.
Definition Initialization.h:901
@ SK_ConstructorInitializationFromList
Perform initialization via a constructor, taking arguments from a single InitListExpr.
Definition Initialization.h:895
@ SK_PassByIndirectCopyRestore
Pass an object by indirect copy-and-restore.
Definition Initialization.h:927
@ SK_ResolveAddressOfOverloadedFunction
Resolve the address of an overloaded function to a specific function declaration.
Definition Initialization.h:830
@ SK_UnwrapInitList
Unwrap the single-element initializer list for a reference.
Definition Initialization.h:885
@ SK_FinalCopy
Direct-initialization from a reference-related object in the final stage of class copy-initialization...
Definition Initialization.h:854
@ SK_QualificationConversionLValue
Perform a qualification conversion, producing an lvalue.
Definition Initialization.h:867
@ SK_StdInitializerList
Construct a std::initializer_list from an initializer list.
Definition Initialization.h:936
@ SK_QualificationConversionPRValue
Perform a qualification conversion, producing a prvalue.
Definition Initialization.h:861
@ SK_ConversionSequence
Perform an implicit conversion sequence.
Definition Initialization.h:876
@ SK_ListInitialization
Perform list-initialization without a constructor.
Definition Initialization.h:882
@ SK_OCLZeroOpaqueType
Initialize an opaque OpenCL type (event_t, queue_t, etc.) with zero.
Definition Initialization.h:946
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...
Definition Initialization.h:1159
llvm::iterator_range< step_iterator > step_range
Definition Initialization.h:1254
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.
Definition Initialization.h:1437
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.
Definition Initialization.h:1406
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.
step_range steps() const
Definition Initialization.h:1256
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.
Definition Initialization.h:1425
void setSequenceKind(enum SequenceKind SK)
Set the kind of sequence computed.
Definition Initialization.h:1241
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
Definition Initialization.h:1252
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.
Definition Initialization.h:1431
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.
Definition Initialization.h:1247
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.
Definition Initialization.h:1238
SequenceKind
Describes the kind of initialization sequence computed.
Definition Initialization.h:811
@ NormalSequence
A normal sequence.
Definition Initialization.h:822
@ FailedSequence
A failed initialization sequence.
Definition Initialization.h:814
@ DependentSequence
A dependent initialization, which could not be type-checked due to the presence of dependent types or...
Definition Initialization.h:819
void AddReferenceBindingStep(QualType T, bool BindingTemporary)
Add a new step binding a reference to an object.
FailureKind
Describes why initialization failed.
Definition Initialization.h:1002
@ FK_UserConversionOverloadFailed
Overloading for a user-defined conversion failed.
Definition Initialization.h:1096
@ FK_NarrowStringIntoWideCharArray
Initializing a wide char array with narrow string literal.
Definition Initialization.h:1021
@ FK_ArrayTypeMismatch
Array type mismatch.
Definition Initialization.h:1037
@ FK_ParenthesizedListInitForReference
Reference initialized from a parenthesized initializer list.
Definition Initialization.h:1007
@ FK_NonConstLValueReferenceBindingToVectorElement
Non-const lvalue reference binding to a vector element.
Definition Initialization.h:1055
@ FK_ReferenceInitDropsQualifiers
Reference binding drops qualifiers.
Definition Initialization.h:1068
@ FK_InitListBadDestinationType
Initialization of some unused destination type with an initializer list.
Definition Initialization.h:1093
@ FK_ConversionFromPropertyFailed
Implicit conversion failed.
Definition Initialization.h:1080
@ FK_NonConstLValueReferenceBindingToUnrelated
Non-const lvalue reference binding to an lvalue of unrelated type.
Definition Initialization.h:1062
@ FK_ListConstructorOverloadFailed
Overloading for list-initialization by constructor failed.
Definition Initialization.h:1102
@ FK_ReferenceInitFailed
Reference binding failed.
Definition Initialization.h:1074
@ FK_DesignatedInitForNonAggregate
Definition Initialization.h:1132
@ FK_ArrayNeedsInitList
Array must be initialized with an initializer list.
Definition Initialization.h:1010
@ FK_PlainStringIntoUTF8Char
Initializing char8_t array with plain string literal.
Definition Initialization.h:1031
@ FK_NonConstantArrayInit
Non-constant array initializer.
Definition Initialization.h:1040
@ FK_NonConstLValueReferenceBindingToTemporary
Non-const lvalue reference binding to a temporary.
Definition Initialization.h:1049
@ FK_ConversionFailed
Implicit conversion failed.
Definition Initialization.h:1077
@ FK_ArrayNeedsInitListOrStringLiteral
Array must be initialized with an initializer list or a string literal.
Definition Initialization.h:1014
@ FK_ParenthesizedListInitForScalar
Scalar initialized from a parenthesized initializer list.
Definition Initialization.h:1086
@ FK_HLSLInitListFlatteningFailed
HLSL intialization list flattening failed.
Definition Initialization.h:1135
@ FK_PlaceholderType
Initializer has a placeholder type which cannot be resolved by initialization.
Definition Initialization.h:1118
@ FK_IncompatWideStringIntoWideChar
Initializing wide char array with incompatible wide string literal.
Definition Initialization.h:1028
@ FK_NonConstLValueReferenceBindingToMatrixElement
Non-const lvalue reference binding to a matrix element.
Definition Initialization.h:1058
@ FK_TooManyInitsForReference
Too many initializers provided for a reference.
Definition Initialization.h:1004
@ FK_NonConstLValueReferenceBindingToBitfield
Non-const lvalue reference binding to a bit-field.
Definition Initialization.h:1052
@ FK_ReferenceAddrspaceMismatchTemporary
Reference with mismatching address space binding to temporary.
Definition Initialization.h:1071
@ FK_ListInitializationFailed
List initialization failed at some point.
Definition Initialization.h:1114
@ FK_TooManyInitsForScalar
Too many initializers for scalar.
Definition Initialization.h:1083
@ FK_AddressOfOverloadFailed
Cannot resolve the address of an overloaded function.
Definition Initialization.h:1043
@ FK_VariableLengthArrayHasInitializer
Variable-length array must not have an initializer.
Definition Initialization.h:1111
@ FK_ArrayNeedsInitListOrWideStringLiteral
Array must be initialized with an initializer list or a wide string literal.
Definition Initialization.h:1018
@ FK_RValueReferenceBindingToLValue
Rvalue reference binding to an lvalue.
Definition Initialization.h:1065
@ FK_Incomplete
Initialization of an incomplete type.
Definition Initialization.h:1108
@ FK_WideStringIntoCharArray
Initializing char array with wide string literal.
Definition Initialization.h:1024
@ FK_ExplicitConstructor
List-copy-initialization chose an explicit constructor.
Definition Initialization.h:1125
@ FK_ReferenceInitOverloadFailed
Overloading due to reference initialization failed.
Definition Initialization.h:1046
@ FK_ConstructorOverloadFailed
Overloading for initialization by constructor failed.
Definition Initialization.h:1099
@ FK_ReferenceBindingToInitList
Reference initialization from an initializer list.
Definition Initialization.h:1089
@ FK_DefaultInitOfConst
Default-initialization of a 'const' object.
Definition Initialization.h:1105
@ FK_ParenthesizedListInitFailed
Parenthesized list initialization failed at some point.
Definition Initialization.h:1129
@ FK_AddressOfUnaddressableFunction
Trying to take the address of a function that doesn't support having its address taken.
Definition Initialization.h:1122
@ FK_UTF8StringIntoPlainChar
Initializing char array with UTF-8 string literal.
Definition Initialization.h:1034
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
Definition Initialization.h:1249
OverloadCandidateSet & getFailedCandidateSet()
Retrieve a reference to the candidate set when overload resolution fails.
Definition Initialization.h:1419
Describes an entity that is being initialized.
Definition Initialization.h:47
static InitializedEntity InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeResult(SourceLocation ReturnLoc, QualType Type)
Create the initialization entity for the result of a function.
Definition Initialization.h:310
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr, bool Implicit=false)
Create the initialization entity for a member subobject.
Definition Initialization.h:388
VD Variable
When Kind == EK_Variable, EK_Member, EK_Binding, or EK_TemplateParameter, the variable,...
Definition Initialization.h:191
static InitializedEntity InitializeRelatedResult(ObjCMethodDecl *MD, QualType Type)
Create the initialization entity for a related result.
Definition Initialization.h:368
void setParameterCFAudited()
Definition Initialization.h:568
EntityKind getKind() const
Determine the kind of initialization.
Definition Initialization.h:446
DeclarationName getName() const
Retrieve the name of the entity being initialized.
static InitializedEntity InitializeException(SourceLocation ThrowLoc, QualType Type)
Create the initialization entity for an exception object.
Definition Initialization.h:332
unsigned allocateManglingNumber() const
Definition Initialization.h:572
QualType getType() const
Retrieve type being initialized.
Definition Initialization.h:454
static InitializedEntity InitializeTemporary(ASTContext &Context, TypeSourceInfo *TypeInfo)
Create the initialization entity for a temporary.
Definition Initialization.h:348
ValueDecl * getDecl() const
Retrieve the variable, parameter, or field being initialized.
struct C Capture
Definition Initialization.h:217
static InitializedEntity InitializeParameter(ASTContext &Context, QualType Type, bool Consumed)
Create the initialization entity for a parameter that is only known by its type.
Definition Initialization.h:287
static InitializedEntity InitializeStmtExprResult(SourceLocation ReturnLoc, QualType Type)
Definition Initialization.h:315
bool isImplicitMemberInitializer() const
Is this the implicit initialization of a member of a class from a defaulted constructor?
Definition Initialization.h:515
const InitializedEntity * getParent() const
Retrieve the parent of the entity being initialized, when the initialization itself is occurring with...
Definition Initialization.h:451
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
Definition Initialization.h:343
bool isParameterConsumed() const
Determine whether this initialization consumes the parameter.
Definition Initialization.h:490
static InitializedEntity InitializeBinding(VarDecl *Binding)
Create the initialization entity for a structured binding.
Definition Initialization.h:424
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm, QualType Type)
Create the initialization entity for a parameter, but use another type.
Definition Initialization.h:272
TypeSourceInfo * TypeInfo
When Kind == EK_Temporary or EK_CompoundLiteralInit, the type source information for the temporary.
Definition Initialization.h:203
static InitializedEntity InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member)
Create the initialization entity for a default member initializer.
Definition Initialization.h:412
static InitializedEntity InitializeElement(ASTContext &Context, unsigned Index, const InitializedEntity &Parent)
Create the initialization entity for an array element.
Definition Initialization.h:417
unsigned getElementIndex() const
If this is an array, vector, or complex number element, get the element's index.
Definition Initialization.h:541
bool isInheritedVirtualBase() const
Return whether the base is an inherited virtual base.
Definition Initialization.h:502
static InitializedEntity InitializeLambdaToBlock(SourceLocation BlockVarLoc, QualType Type)
Definition Initialization.h:325
void setElementIndex(unsigned Index)
If this is already the initializer for an array or vector element, sets the element index.
Definition Initialization.h:549
SourceLocation getCaptureLoc() const
Determine the location of the capture when initializing field from a captured variable in a lambda.
Definition Initialization.h:563
static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, QualType Type)
Definition Initialization.h:320
bool isParamOrTemplateParamKind() const
Definition Initialization.h:484
static InitializedEntity InitializeNew(SourceLocation NewLoc, QualType Type)
Create the initialization entity for an object allocated via new.
Definition Initialization.h:338
llvm::PointerIntPair< const CXXBaseSpecifier *, 1 > Base
When Kind == EK_Base, the base specifier that provides the base class.
Definition Initialization.h:210
static InitializedEntity InitializeTemporary(TypeSourceInfo *TypeInfo, QualType Type)
Create the initialization entity for a temporary.
Definition Initialization.h:360
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
Definition Initialization.h:259
bool allowsNRVO() const
Determine whether this initialization allows the named return value optimization, which also applies ...
bool isParameterKind() const
Definition Initialization.h:479
void dump() const
Dump a representation of the initialized entity to standard error, for debugging purposes.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Definition Initialization.h:264
static InitializedEntity InitializeLambdaCapture(IdentifierInfo *VarID, QualType FieldType, SourceLocation Loc)
Create the initialization entity for a lambda capture.
Definition Initialization.h:431
static InitializedEntity InitializeTemplateParameter(QualType T, NamedDecl *Param)
Create the initialization entity for a template parameter.
Definition Initialization.h:299
EntityKind
Specifies the kind of entity being initialized.
Definition Initialization.h:50
@ EK_Variable
The entity being initialized is a variable.
Definition Initialization.h:52
@ EK_Temporary
The entity being initialized is a temporary object.
Definition Initialization.h:82
@ EK_Binding
The entity being initialized is a structured binding of a decomposition declaration.
Definition Initialization.h:128
@ EK_BlockElement
The entity being initialized is a field of block descriptor for the copied-in c++ object.
Definition Initialization.h:100
@ EK_MatrixElement
The entity being initialized is an element of a matrix.
Definition Initialization.h:96
@ EK_Parameter_CF_Audited
The entity being initialized is a function parameter; function is member of group of audited CF APIs.
Definition Initialization.h:124
@ EK_LambdaToBlockConversionBlockElement
The entity being initialized is a field of block descriptor for the copied-in lambda object that's us...
Definition Initialization.h:104
@ EK_Member
The entity being initialized is a non-static data member subobject.
Definition Initialization.h:72
@ EK_Base
The entity being initialized is a base member subobject.
Definition Initialization.h:85
@ EK_Result
The entity being initialized is the result of a function call.
Definition Initialization.h:61
@ EK_TemplateParameter
The entity being initialized is a non-type template parameter.
Definition Initialization.h:58
@ EK_StmtExprResult
The entity being initialized is the result of a statement expression.
Definition Initialization.h:64
@ EK_ParenAggInitMember
The entity being initialized is a non-static data member subobject of an object initialized via paren...
Definition Initialization.h:132
@ EK_VectorElement
The entity being initialized is an element of a vector.
Definition Initialization.h:92
@ EK_New
The entity being initialized is an object (or array of objects) allocated via new.
Definition Initialization.h:79
@ EK_CompoundLiteralInit
The entity being initialized is the initializer for a compound literal.
Definition Initialization.h:116
@ EK_Parameter
The entity being initialized is a function parameter.
Definition Initialization.h:55
@ EK_Delegating
The initialization is being done by a delegating constructor.
Definition Initialization.h:88
@ EK_ComplexElement
The entity being initialized is the real or imaginary part of a complex number.
Definition Initialization.h:108
@ EK_ArrayElement
The entity being initialized is an element of an array.
Definition Initialization.h:75
@ EK_LambdaCapture
The entity being initialized is the field that captures a variable in a lambda.
Definition Initialization.h:112
@ EK_Exception
The entity being initialized is an exception object that is being thrown.
Definition Initialization.h:68
@ EK_RelatedResult
The entity being implicitly initialized back to the formal result type.
Definition Initialization.h:120
StringRef getCapturedVarName() const
For a lambda capture, return the capture's name.
Definition Initialization.h:556
static InitializedEntity InitializeMemberFromParenAggInit(FieldDecl *Member)
Create the initialization entity for a member subobject initialized via parenthesized aggregate init.
Definition Initialization.h:404
SourceLocation getThrowLoc() const
Determine the location of the 'throw' keyword when initializing an exception object.
Definition Initialization.h:534
static InitializedEntity InitializeDelegation(QualType Type)
Create the initialization entity for a delegated constructor.
Definition Initialization.h:382
unsigned Index
When Kind == EK_ArrayElement, EK_VectorElement, EK_MatrixElement, or EK_ComplexElement,...
Definition Initialization.h:215
static InitializedEntity InitializeCompoundLiteralInit(TypeSourceInfo *TSI)
Create the entity for a compound literal initializer.
Definition Initialization.h:438
struct LN LocAndNRVO
Definition Initialization.h:205
static InitializedEntity InitializeMember(IndirectFieldDecl *Member, const InitializedEntity *Parent=nullptr, bool Implicit=false)
Create the initialization entity for a member subobject.
Definition Initialization.h:396
bool isVariableLengthArrayNew() const
Determine whether this is an array new with an unknown bound.
Definition Initialization.h:508
ObjCMethodDecl * MethodDecl
When Kind == EK_RelatedResult, the ObjectiveC method where result type was implicitly changed to acco...
Definition Initialization.h:195
bool isDefaultMemberInitializer() const
Is this the default member initializer of a member (specified inside the class definition)?
Definition Initialization.h:521
llvm::PointerIntPair< ParmVarDecl *, 1 > Parameter
When Kind == EK_Parameter, the ParmVarDecl, with the integer indicating whether the parameter is "con...
Definition Initialization.h:199
const CXXBaseSpecifier * getBaseSpecifier() const
Retrieve the base specifier.
Definition Initialization.h:496
SourceLocation getReturnLoc() const
Determine the location of the 'return' keyword when initializing the result of a function call.
Definition Initialization.h:527
TypeSourceInfo * getTypeSourceInfo() const
Retrieve complete type-source information for the object being constructed, if known.
Definition Initialization.h:458
ObjCMethodDecl * getMethodDecl() const
Retrieve the ObjectiveC method being initialized.
Definition Initialization.h:473
This represents a decl that may have a name.
ObjCMethodDecl - Represents an instance or class method declaration.
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Represents a parameter to a function.
A (possibly-)qualified type.
Sema - This implements semantic analysis and AST building for C.
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
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.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
OverloadingResult
OverloadingResult - Capture the result of performing overload resolution.
MutableArrayRef< Expr * > MultiExprArg
@ Result
The result type of a method or function.
const FunctionProtoType * T
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
ActionResult< Expr * > ExprResult
@ Implicit
An implicit conversion.
Definition Initialization.h:962
FunctionDecl * Function
Definition Initialization.h:964
bool HadMultipleCandidates
Definition Initialization.h:963
DeclAccessPair FoundDecl
Definition Initialization.h:965