1 | //===- Initialization.h - Semantic Analysis for Initializers ----*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file provides supporting data types for initialization of objects. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_CLANG_SEMA_INITIALIZATION_H |
14 | #define LLVM_CLANG_SEMA_INITIALIZATION_H |
15 | |
16 | #include "clang/AST/ASTContext.h" |
17 | #include "clang/AST/Attr.h" |
18 | #include "clang/AST/Decl.h" |
19 | #include "clang/AST/DeclAccessPair.h" |
20 | #include "clang/AST/DeclarationName.h" |
21 | #include "clang/AST/Expr.h" |
22 | #include "clang/AST/Type.h" |
23 | #include "clang/Basic/IdentifierTable.h" |
24 | #include "clang/Basic/LLVM.h" |
25 | #include "clang/Basic/LangOptions.h" |
26 | #include "clang/Basic/SourceLocation.h" |
27 | #include "clang/Basic/Specifiers.h" |
28 | #include "clang/Sema/Overload.h" |
29 | #include "clang/Sema/Ownership.h" |
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 <cassert> |
36 | #include <cstdint> |
37 | #include <string> |
38 | |
39 | namespace clang { |
40 | |
41 | class CXXBaseSpecifier; |
42 | class CXXConstructorDecl; |
43 | class ObjCMethodDecl; |
44 | class Sema; |
45 | |
46 | /// Describes an entity that is being initialized. |
47 | class alignas(8) InitializedEntity { |
48 | public: |
49 | /// Specifies the kind of entity being initialized. |
50 | enum EntityKind { |
51 | /// The entity being initialized is a variable. |
52 | EK_Variable, |
53 | |
54 | /// The entity being initialized is a function parameter. |
55 | EK_Parameter, |
56 | |
57 | /// The entity being initialized is a non-type template parameter. |
58 | EK_TemplateParameter, |
59 | |
60 | /// The entity being initialized is the result of a function call. |
61 | EK_Result, |
62 | |
63 | /// The entity being initialized is the result of a statement expression. |
64 | EK_StmtExprResult, |
65 | |
66 | /// The entity being initialized is an exception object that |
67 | /// is being thrown. |
68 | EK_Exception, |
69 | |
70 | /// The entity being initialized is a non-static data member |
71 | /// subobject. |
72 | EK_Member, |
73 | |
74 | /// The entity being initialized is an element of an array. |
75 | EK_ArrayElement, |
76 | |
77 | /// The entity being initialized is an object (or array of |
78 | /// objects) allocated via new. |
79 | EK_New, |
80 | |
81 | /// The entity being initialized is a temporary object. |
82 | EK_Temporary, |
83 | |
84 | /// The entity being initialized is a base member subobject. |
85 | EK_Base, |
86 | |
87 | /// The initialization is being done by a delegating constructor. |
88 | EK_Delegating, |
89 | |
90 | /// The entity being initialized is an element of a vector. |
91 | /// or vector. |
92 | EK_VectorElement, |
93 | |
94 | /// The entity being initialized is a field of block descriptor for |
95 | /// the copied-in c++ object. |
96 | EK_BlockElement, |
97 | |
98 | /// The entity being initialized is a field of block descriptor for the |
99 | /// copied-in lambda object that's used in the lambda to block conversion. |
100 | EK_LambdaToBlockConversionBlockElement, |
101 | |
102 | /// The entity being initialized is the real or imaginary part of a |
103 | /// complex number. |
104 | EK_ComplexElement, |
105 | |
106 | /// The entity being initialized is the field that captures a |
107 | /// variable in a lambda. |
108 | EK_LambdaCapture, |
109 | |
110 | /// The entity being initialized is the initializer for a compound |
111 | /// literal. |
112 | EK_CompoundLiteralInit, |
113 | |
114 | /// The entity being implicitly initialized back to the formal |
115 | /// result type. |
116 | EK_RelatedResult, |
117 | |
118 | /// The entity being initialized is a function parameter; function |
119 | /// is member of group of audited CF APIs. |
120 | EK_Parameter_CF_Audited, |
121 | |
122 | /// The entity being initialized is a structured binding of a |
123 | /// decomposition declaration. |
124 | EK_Binding, |
125 | |
126 | /// The entity being initialized is a non-static data member subobject of an |
127 | /// object initialized via parenthesized aggregate initialization. |
128 | EK_ParenAggInitMember, |
129 | |
130 | // Note: err_init_conversion_failed in DiagnosticSemaKinds.td uses this |
131 | // enum as an index for its first %select. When modifying this list, |
132 | // that diagnostic text needs to be updated as well. |
133 | }; |
134 | |
135 | private: |
136 | /// The kind of entity being initialized. |
137 | EntityKind Kind; |
138 | |
139 | /// If non-NULL, the parent entity in which this |
140 | /// initialization occurs. |
141 | const InitializedEntity *Parent = nullptr; |
142 | |
143 | /// The type of the object or reference being initialized. |
144 | QualType Type; |
145 | |
146 | /// The mangling number for the next reference temporary to be created. |
147 | mutable unsigned ManglingNumber = 0; |
148 | |
149 | struct LN { |
150 | /// When Kind == EK_Result, EK_Exception, EK_New, the |
151 | /// location of the 'return', 'throw', or 'new' keyword, |
152 | /// respectively. When Kind == EK_Temporary, the location where |
153 | /// the temporary is being created. |
154 | SourceLocation Location; |
155 | |
156 | /// Whether the entity being initialized may end up using the |
157 | /// named return value optimization (NRVO). |
158 | bool NRVO; |
159 | }; |
160 | |
161 | struct VD { |
162 | /// The VarDecl, FieldDecl, or BindingDecl being initialized. |
163 | ValueDecl *VariableOrMember; |
164 | |
165 | /// When Kind == EK_Member, whether this is an implicit member |
166 | /// initialization in a copy or move constructor. These can perform array |
167 | /// copies. |
168 | bool IsImplicitFieldInit; |
169 | |
170 | /// When Kind == EK_Member, whether this is the initial initialization |
171 | /// check for a default member initializer. |
172 | bool IsDefaultMemberInit; |
173 | }; |
174 | |
175 | struct C { |
176 | /// The name of the variable being captured by an EK_LambdaCapture. |
177 | IdentifierInfo *VarID; |
178 | |
179 | /// The source location at which the capture occurs. |
180 | SourceLocation Location; |
181 | }; |
182 | |
183 | union { |
184 | /// When Kind == EK_Variable, EK_Member, EK_Binding, or |
185 | /// EK_TemplateParameter, the variable, binding, or template parameter. |
186 | VD Variable; |
187 | |
188 | /// When Kind == EK_RelatedResult, the ObjectiveC method where |
189 | /// result type was implicitly changed to accommodate ARC semantics. |
190 | ObjCMethodDecl *MethodDecl; |
191 | |
192 | /// When Kind == EK_Parameter, the ParmVarDecl, with the |
193 | /// integer indicating whether the parameter is "consumed". |
194 | llvm::PointerIntPair<ParmVarDecl *, 1> Parameter; |
195 | |
196 | /// When Kind == EK_Temporary or EK_CompoundLiteralInit, the type |
197 | /// source information for the temporary. |
198 | TypeSourceInfo *TypeInfo; |
199 | |
200 | struct LN LocAndNRVO; |
201 | |
202 | /// When Kind == EK_Base, the base specifier that provides the |
203 | /// base class. The integer specifies whether the base is an inherited |
204 | /// virtual base. |
205 | llvm::PointerIntPair<const CXXBaseSpecifier *, 1> Base; |
206 | |
207 | /// When Kind == EK_ArrayElement, EK_VectorElement, or |
208 | /// EK_ComplexElement, the index of the array or vector element being |
209 | /// initialized. |
210 | unsigned Index; |
211 | |
212 | struct C Capture; |
213 | }; |
214 | |
215 | InitializedEntity() {}; |
216 | |
217 | /// Create the initialization entity for a variable. |
218 | InitializedEntity(VarDecl *Var, EntityKind EK = EK_Variable) |
219 | : Kind(EK), Type(Var->getType()), Variable{Var, .IsImplicitFieldInit: false, .IsDefaultMemberInit: false} {} |
220 | |
221 | /// Create the initialization entity for the result of a |
222 | /// function, throwing an object, performing an explicit cast, or |
223 | /// initializing a parameter for which there is no declaration. |
224 | InitializedEntity(EntityKind Kind, SourceLocation Loc, QualType Type, |
225 | bool NRVO = false) |
226 | : Kind(Kind), Type(Type) { |
227 | new (&LocAndNRVO) LN; |
228 | LocAndNRVO.Location = Loc; |
229 | LocAndNRVO.NRVO = NRVO; |
230 | } |
231 | |
232 | /// Create the initialization entity for a member subobject. |
233 | InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent, |
234 | bool Implicit, bool DefaultMemberInit, |
235 | bool IsParenAggInit = false) |
236 | : Kind(IsParenAggInit ? EK_ParenAggInitMember : EK_Member), |
237 | Parent(Parent), Type(Member->getType()), |
238 | Variable{Member, .IsImplicitFieldInit: Implicit, .IsDefaultMemberInit: DefaultMemberInit} {} |
239 | |
240 | /// Create the initialization entity for an array element. |
241 | InitializedEntity(ASTContext &Context, unsigned Index, |
242 | const InitializedEntity &Parent); |
243 | |
244 | /// Create the initialization entity for a lambda capture. |
245 | InitializedEntity(IdentifierInfo *VarID, QualType FieldType, SourceLocation Loc) |
246 | : Kind(EK_LambdaCapture), Type(FieldType) { |
247 | new (&Capture) C; |
248 | Capture.VarID = VarID; |
249 | Capture.Location = Loc; |
250 | } |
251 | |
252 | public: |
253 | /// Create the initialization entity for a variable. |
254 | static InitializedEntity InitializeVariable(VarDecl *Var) { |
255 | return InitializedEntity(Var); |
256 | } |
257 | |
258 | /// Create the initialization entity for a parameter. |
259 | static InitializedEntity InitializeParameter(ASTContext &Context, |
260 | ParmVarDecl *Parm) { |
261 | return InitializeParameter(Context, Parm, Parm->getType()); |
262 | } |
263 | |
264 | /// Create the initialization entity for a parameter, but use |
265 | /// another type. |
266 | static InitializedEntity |
267 | InitializeParameter(ASTContext &Context, ParmVarDecl *Parm, QualType Type) { |
268 | bool Consumed = (Context.getLangOpts().ObjCAutoRefCount && |
269 | Parm->hasAttr<NSConsumedAttr>()); |
270 | |
271 | InitializedEntity Entity; |
272 | Entity.Kind = EK_Parameter; |
273 | Entity.Type = |
274 | Context.getVariableArrayDecayedType(Ty: Type.getUnqualifiedType()); |
275 | Entity.Parent = nullptr; |
276 | Entity.Parameter = {Parm, Consumed}; |
277 | return Entity; |
278 | } |
279 | |
280 | /// Create the initialization entity for a parameter that is |
281 | /// only known by its type. |
282 | static InitializedEntity InitializeParameter(ASTContext &Context, |
283 | QualType Type, |
284 | bool Consumed) { |
285 | InitializedEntity Entity; |
286 | Entity.Kind = EK_Parameter; |
287 | Entity.Type = Context.getVariableArrayDecayedType(Ty: Type); |
288 | Entity.Parent = nullptr; |
289 | Entity.Parameter = {nullptr, Consumed}; |
290 | return Entity; |
291 | } |
292 | |
293 | /// Create the initialization entity for a template parameter. |
294 | static InitializedEntity |
295 | InitializeTemplateParameter(QualType T, NonTypeTemplateParmDecl *Param) { |
296 | InitializedEntity Entity; |
297 | Entity.Kind = EK_TemplateParameter; |
298 | Entity.Type = T; |
299 | Entity.Parent = nullptr; |
300 | Entity.Variable = {Param, false, false}; |
301 | return Entity; |
302 | } |
303 | |
304 | /// Create the initialization entity for the result of a function. |
305 | static InitializedEntity InitializeResult(SourceLocation ReturnLoc, |
306 | QualType Type) { |
307 | return InitializedEntity(EK_Result, ReturnLoc, Type); |
308 | } |
309 | |
310 | static InitializedEntity InitializeStmtExprResult(SourceLocation ReturnLoc, |
311 | QualType Type) { |
312 | return InitializedEntity(EK_StmtExprResult, ReturnLoc, Type); |
313 | } |
314 | |
315 | static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, |
316 | QualType Type) { |
317 | return InitializedEntity(EK_BlockElement, BlockVarLoc, Type); |
318 | } |
319 | |
320 | static InitializedEntity InitializeLambdaToBlock(SourceLocation BlockVarLoc, |
321 | QualType Type) { |
322 | return InitializedEntity(EK_LambdaToBlockConversionBlockElement, |
323 | BlockVarLoc, Type); |
324 | } |
325 | |
326 | /// Create the initialization entity for an exception object. |
327 | static InitializedEntity InitializeException(SourceLocation ThrowLoc, |
328 | QualType Type) { |
329 | return InitializedEntity(EK_Exception, ThrowLoc, Type); |
330 | } |
331 | |
332 | /// Create the initialization entity for an object allocated via new. |
333 | static InitializedEntity InitializeNew(SourceLocation NewLoc, QualType Type) { |
334 | return InitializedEntity(EK_New, NewLoc, Type); |
335 | } |
336 | |
337 | /// Create the initialization entity for a temporary. |
338 | static InitializedEntity InitializeTemporary(QualType Type) { |
339 | return InitializeTemporary(TypeInfo: nullptr, Type); |
340 | } |
341 | |
342 | /// Create the initialization entity for a temporary. |
343 | static InitializedEntity InitializeTemporary(ASTContext &Context, |
344 | TypeSourceInfo *TypeInfo) { |
345 | QualType Type = TypeInfo->getType(); |
346 | if (Context.getLangOpts().OpenCLCPlusPlus) { |
347 | assert(!Type.hasAddressSpace() && "Temporary already has address space!" ); |
348 | Type = Context.getAddrSpaceQualType(T: Type, AddressSpace: LangAS::opencl_private); |
349 | } |
350 | |
351 | return InitializeTemporary(TypeInfo, Type); |
352 | } |
353 | |
354 | /// Create the initialization entity for a temporary. |
355 | static InitializedEntity InitializeTemporary(TypeSourceInfo *TypeInfo, |
356 | QualType Type) { |
357 | InitializedEntity Result(EK_Temporary, SourceLocation(), Type); |
358 | Result.TypeInfo = TypeInfo; |
359 | return Result; |
360 | } |
361 | |
362 | /// Create the initialization entity for a related result. |
363 | static InitializedEntity InitializeRelatedResult(ObjCMethodDecl *MD, |
364 | QualType Type) { |
365 | InitializedEntity Result(EK_RelatedResult, SourceLocation(), Type); |
366 | Result.MethodDecl = MD; |
367 | return Result; |
368 | } |
369 | |
370 | /// Create the initialization entity for a base class subobject. |
371 | static InitializedEntity |
372 | InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, |
373 | bool IsInheritedVirtualBase, |
374 | const InitializedEntity *Parent = nullptr); |
375 | |
376 | /// Create the initialization entity for a delegated constructor. |
377 | static InitializedEntity InitializeDelegation(QualType Type) { |
378 | return InitializedEntity(EK_Delegating, SourceLocation(), Type); |
379 | } |
380 | |
381 | /// Create the initialization entity for a member subobject. |
382 | static InitializedEntity |
383 | InitializeMember(FieldDecl *Member, |
384 | const InitializedEntity *Parent = nullptr, |
385 | bool Implicit = false) { |
386 | return InitializedEntity(Member, Parent, Implicit, false); |
387 | } |
388 | |
389 | /// Create the initialization entity for a member subobject. |
390 | static InitializedEntity |
391 | InitializeMember(IndirectFieldDecl *Member, |
392 | const InitializedEntity *Parent = nullptr, |
393 | bool Implicit = false) { |
394 | return InitializedEntity(Member->getAnonField(), Parent, Implicit, false); |
395 | } |
396 | |
397 | /// Create the initialization entity for a member subobject initialized via |
398 | /// parenthesized aggregate init. |
399 | static InitializedEntity InitializeMemberFromParenAggInit(FieldDecl *Member) { |
400 | return InitializedEntity(Member, /*Parent=*/nullptr, /*Implicit=*/false, |
401 | /*DefaultMemberInit=*/false, |
402 | /*IsParenAggInit=*/true); |
403 | } |
404 | |
405 | /// Create the initialization entity for a default member initializer. |
406 | static InitializedEntity |
407 | InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member) { |
408 | return InitializedEntity(Member, nullptr, false, true); |
409 | } |
410 | |
411 | /// Create the initialization entity for an array element. |
412 | static InitializedEntity InitializeElement(ASTContext &Context, |
413 | unsigned Index, |
414 | const InitializedEntity &Parent) { |
415 | return InitializedEntity(Context, Index, Parent); |
416 | } |
417 | |
418 | /// Create the initialization entity for a structured binding. |
419 | static InitializedEntity InitializeBinding(VarDecl *Binding) { |
420 | return InitializedEntity(Binding, EK_Binding); |
421 | } |
422 | |
423 | /// Create the initialization entity for a lambda capture. |
424 | /// |
425 | /// \p VarID The name of the entity being captured, or nullptr for 'this'. |
426 | static InitializedEntity InitializeLambdaCapture(IdentifierInfo *VarID, |
427 | QualType FieldType, |
428 | SourceLocation Loc) { |
429 | return InitializedEntity(VarID, FieldType, Loc); |
430 | } |
431 | |
432 | /// Create the entity for a compound literal initializer. |
433 | static InitializedEntity InitializeCompoundLiteralInit(TypeSourceInfo *TSI) { |
434 | InitializedEntity Result(EK_CompoundLiteralInit, SourceLocation(), |
435 | TSI->getType()); |
436 | Result.TypeInfo = TSI; |
437 | return Result; |
438 | } |
439 | |
440 | /// Determine the kind of initialization. |
441 | EntityKind getKind() const { return Kind; } |
442 | |
443 | /// Retrieve the parent of the entity being initialized, when |
444 | /// the initialization itself is occurring within the context of a |
445 | /// larger initialization. |
446 | const InitializedEntity *getParent() const { return Parent; } |
447 | |
448 | /// Retrieve type being initialized. |
449 | QualType getType() const { return Type; } |
450 | |
451 | /// Retrieve complete type-source information for the object being |
452 | /// constructed, if known. |
453 | TypeSourceInfo *getTypeSourceInfo() const { |
454 | if (Kind == EK_Temporary || Kind == EK_CompoundLiteralInit) |
455 | return TypeInfo; |
456 | |
457 | return nullptr; |
458 | } |
459 | |
460 | /// Retrieve the name of the entity being initialized. |
461 | DeclarationName getName() const; |
462 | |
463 | /// Retrieve the variable, parameter, or field being |
464 | /// initialized. |
465 | ValueDecl *getDecl() const; |
466 | |
467 | /// Retrieve the ObjectiveC method being initialized. |
468 | ObjCMethodDecl *getMethodDecl() const { return MethodDecl; } |
469 | |
470 | /// Determine whether this initialization allows the named return |
471 | /// value optimization, which also applies to thrown objects. |
472 | bool allowsNRVO() const; |
473 | |
474 | bool isParameterKind() const { |
475 | return (getKind() == EK_Parameter || |
476 | getKind() == EK_Parameter_CF_Audited); |
477 | } |
478 | |
479 | bool isParamOrTemplateParamKind() const { |
480 | return isParameterKind() || getKind() == EK_TemplateParameter; |
481 | } |
482 | |
483 | /// Determine whether this initialization consumes the |
484 | /// parameter. |
485 | bool isParameterConsumed() const { |
486 | assert(isParameterKind() && "Not a parameter" ); |
487 | return Parameter.getInt(); |
488 | } |
489 | |
490 | /// Retrieve the base specifier. |
491 | const CXXBaseSpecifier *getBaseSpecifier() const { |
492 | assert(getKind() == EK_Base && "Not a base specifier" ); |
493 | return Base.getPointer(); |
494 | } |
495 | |
496 | /// Return whether the base is an inherited virtual base. |
497 | bool isInheritedVirtualBase() const { |
498 | assert(getKind() == EK_Base && "Not a base specifier" ); |
499 | return Base.getInt(); |
500 | } |
501 | |
502 | /// Determine whether this is an array new with an unknown bound. |
503 | bool isVariableLengthArrayNew() const { |
504 | return getKind() == EK_New && isa_and_nonnull<IncompleteArrayType>( |
505 | getType()->getAsArrayTypeUnsafe()); |
506 | } |
507 | |
508 | /// Is this the implicit initialization of a member of a class from |
509 | /// a defaulted constructor? |
510 | bool isImplicitMemberInitializer() const { |
511 | return getKind() == EK_Member && Variable.IsImplicitFieldInit; |
512 | } |
513 | |
514 | /// Is this the default member initializer of a member (specified inside |
515 | /// the class definition)? |
516 | bool isDefaultMemberInitializer() const { |
517 | return getKind() == EK_Member && Variable.IsDefaultMemberInit; |
518 | } |
519 | |
520 | /// Determine the location of the 'return' keyword when initializing |
521 | /// the result of a function call. |
522 | SourceLocation getReturnLoc() const { |
523 | assert(getKind() == EK_Result && "No 'return' location!" ); |
524 | return LocAndNRVO.Location; |
525 | } |
526 | |
527 | /// Determine the location of the 'throw' keyword when initializing |
528 | /// an exception object. |
529 | SourceLocation getThrowLoc() const { |
530 | assert(getKind() == EK_Exception && "No 'throw' location!" ); |
531 | return LocAndNRVO.Location; |
532 | } |
533 | |
534 | /// If this is an array, vector, or complex number element, get the |
535 | /// element's index. |
536 | unsigned getElementIndex() const { |
537 | assert(getKind() == EK_ArrayElement || getKind() == EK_VectorElement || |
538 | getKind() == EK_ComplexElement); |
539 | return Index; |
540 | } |
541 | |
542 | /// If this is already the initializer for an array or vector |
543 | /// element, sets the element index. |
544 | void setElementIndex(unsigned Index) { |
545 | assert(getKind() == EK_ArrayElement || getKind() == EK_VectorElement || |
546 | getKind() == EK_ComplexElement); |
547 | this->Index = Index; |
548 | } |
549 | |
550 | /// For a lambda capture, return the capture's name. |
551 | StringRef getCapturedVarName() const { |
552 | assert(getKind() == EK_LambdaCapture && "Not a lambda capture!" ); |
553 | return Capture.VarID ? Capture.VarID->getName() : "this" ; |
554 | } |
555 | |
556 | /// Determine the location of the capture when initializing |
557 | /// field from a captured variable in a lambda. |
558 | SourceLocation getCaptureLoc() const { |
559 | assert(getKind() == EK_LambdaCapture && "Not a lambda capture!" ); |
560 | return Capture.Location; |
561 | } |
562 | |
563 | void setParameterCFAudited() { |
564 | Kind = EK_Parameter_CF_Audited; |
565 | } |
566 | |
567 | unsigned allocateManglingNumber() const { return ++ManglingNumber; } |
568 | |
569 | /// Dump a representation of the initialized entity to standard error, |
570 | /// for debugging purposes. |
571 | void dump() const; |
572 | |
573 | private: |
574 | unsigned dumpImpl(raw_ostream &OS) const; |
575 | }; |
576 | |
577 | /// Describes the kind of initialization being performed, along with |
578 | /// location information for tokens related to the initialization (equal sign, |
579 | /// parentheses). |
580 | class InitializationKind { |
581 | public: |
582 | /// The kind of initialization being performed. |
583 | enum InitKind { |
584 | /// Direct initialization |
585 | IK_Direct, |
586 | |
587 | /// Direct list-initialization |
588 | IK_DirectList, |
589 | |
590 | /// Copy initialization |
591 | IK_Copy, |
592 | |
593 | /// Default initialization |
594 | IK_Default, |
595 | |
596 | /// Value initialization |
597 | IK_Value |
598 | }; |
599 | |
600 | private: |
601 | /// The context of the initialization. |
602 | enum InitContext { |
603 | /// Normal context |
604 | IC_Normal, |
605 | |
606 | /// Normal context, but allows explicit conversion functionss |
607 | IC_ExplicitConvs, |
608 | |
609 | /// Implicit context (value initialization) |
610 | IC_Implicit, |
611 | |
612 | /// Static cast context |
613 | IC_StaticCast, |
614 | |
615 | /// C-style cast context |
616 | IC_CStyleCast, |
617 | |
618 | /// Functional cast context |
619 | IC_FunctionalCast |
620 | }; |
621 | |
622 | /// The kind of initialization being performed. |
623 | InitKind Kind : 8; |
624 | |
625 | /// The context of the initialization. |
626 | InitContext Context : 8; |
627 | |
628 | /// The source locations involved in the initialization. |
629 | SourceLocation Locations[3]; |
630 | |
631 | InitializationKind(InitKind Kind, InitContext Context, SourceLocation Loc1, |
632 | SourceLocation Loc2, SourceLocation Loc3) |
633 | : Kind(Kind), Context(Context) { |
634 | Locations[0] = Loc1; |
635 | Locations[1] = Loc2; |
636 | Locations[2] = Loc3; |
637 | } |
638 | |
639 | public: |
640 | /// Create a direct initialization. |
641 | static InitializationKind CreateDirect(SourceLocation InitLoc, |
642 | SourceLocation LParenLoc, |
643 | SourceLocation RParenLoc) { |
644 | return InitializationKind(IK_Direct, IC_Normal, |
645 | InitLoc, LParenLoc, RParenLoc); |
646 | } |
647 | |
648 | static InitializationKind CreateDirectList(SourceLocation InitLoc) { |
649 | return InitializationKind(IK_DirectList, IC_Normal, InitLoc, InitLoc, |
650 | InitLoc); |
651 | } |
652 | |
653 | static InitializationKind CreateDirectList(SourceLocation InitLoc, |
654 | SourceLocation LBraceLoc, |
655 | SourceLocation RBraceLoc) { |
656 | return InitializationKind(IK_DirectList, IC_Normal, InitLoc, LBraceLoc, |
657 | RBraceLoc); |
658 | } |
659 | |
660 | /// Create a direct initialization due to a cast that isn't a C-style |
661 | /// or functional cast. |
662 | static InitializationKind CreateCast(SourceRange TypeRange) { |
663 | return InitializationKind(IK_Direct, IC_StaticCast, TypeRange.getBegin(), |
664 | TypeRange.getBegin(), TypeRange.getEnd()); |
665 | } |
666 | |
667 | /// Create a direct initialization for a C-style cast. |
668 | static InitializationKind CreateCStyleCast(SourceLocation StartLoc, |
669 | SourceRange TypeRange, |
670 | bool InitList) { |
671 | // C++ cast syntax doesn't permit init lists, but C compound literals are |
672 | // exactly that. |
673 | return InitializationKind(InitList ? IK_DirectList : IK_Direct, |
674 | IC_CStyleCast, StartLoc, TypeRange.getBegin(), |
675 | TypeRange.getEnd()); |
676 | } |
677 | |
678 | /// Create a direct initialization for a functional cast. |
679 | static InitializationKind CreateFunctionalCast(SourceRange TypeRange, |
680 | bool InitList) { |
681 | return InitializationKind(InitList ? IK_DirectList : IK_Direct, |
682 | IC_FunctionalCast, TypeRange.getBegin(), |
683 | TypeRange.getBegin(), TypeRange.getEnd()); |
684 | } |
685 | |
686 | /// Create a copy initialization. |
687 | static InitializationKind CreateCopy(SourceLocation InitLoc, |
688 | SourceLocation EqualLoc, |
689 | bool AllowExplicitConvs = false) { |
690 | return InitializationKind(IK_Copy, |
691 | AllowExplicitConvs? IC_ExplicitConvs : IC_Normal, |
692 | InitLoc, EqualLoc, EqualLoc); |
693 | } |
694 | |
695 | /// Create a default initialization. |
696 | static InitializationKind CreateDefault(SourceLocation InitLoc) { |
697 | return InitializationKind(IK_Default, IC_Normal, InitLoc, InitLoc, InitLoc); |
698 | } |
699 | |
700 | /// Create a value initialization. |
701 | static InitializationKind CreateValue(SourceLocation InitLoc, |
702 | SourceLocation LParenLoc, |
703 | SourceLocation RParenLoc, |
704 | bool isImplicit = false) { |
705 | return InitializationKind(IK_Value, isImplicit ? IC_Implicit : IC_Normal, |
706 | InitLoc, LParenLoc, RParenLoc); |
707 | } |
708 | |
709 | /// Create an initialization from an initializer (which, for direct |
710 | /// initialization from a parenthesized list, will be a ParenListExpr). |
711 | static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, |
712 | Expr *Init) { |
713 | if (!Init) return CreateDefault(InitLoc: Loc); |
714 | if (!DirectInit) |
715 | return CreateCopy(InitLoc: Loc, EqualLoc: Init->getBeginLoc()); |
716 | if (isa<InitListExpr>(Val: Init)) |
717 | return CreateDirectList(Loc, Init->getBeginLoc(), Init->getEndLoc()); |
718 | return CreateDirect(InitLoc: Loc, LParenLoc: Init->getBeginLoc(), RParenLoc: Init->getEndLoc()); |
719 | } |
720 | |
721 | /// Determine the initialization kind. |
722 | InitKind getKind() const { |
723 | return Kind; |
724 | } |
725 | |
726 | /// Determine whether this initialization is an explicit cast. |
727 | bool isExplicitCast() const { |
728 | return Context >= IC_StaticCast; |
729 | } |
730 | |
731 | /// Determine whether this initialization is a static cast. |
732 | bool isStaticCast() const { return Context == IC_StaticCast; } |
733 | |
734 | /// Determine whether this initialization is a C-style cast. |
735 | bool isCStyleOrFunctionalCast() const { |
736 | return Context >= IC_CStyleCast; |
737 | } |
738 | |
739 | /// Determine whether this is a C-style cast. |
740 | bool isCStyleCast() const { |
741 | return Context == IC_CStyleCast; |
742 | } |
743 | |
744 | /// Determine whether this is a functional-style cast. |
745 | bool isFunctionalCast() const { |
746 | return Context == IC_FunctionalCast; |
747 | } |
748 | |
749 | /// Determine whether this initialization is an implicit |
750 | /// value-initialization, e.g., as occurs during aggregate |
751 | /// initialization. |
752 | bool isImplicitValueInit() const { return Context == IC_Implicit; } |
753 | |
754 | /// Retrieve the location at which initialization is occurring. |
755 | SourceLocation getLocation() const { return Locations[0]; } |
756 | |
757 | /// Retrieve the source range that covers the initialization. |
758 | SourceRange getRange() const { |
759 | return SourceRange(Locations[0], Locations[2]); |
760 | } |
761 | |
762 | /// Retrieve the location of the equal sign for copy initialization |
763 | /// (if present). |
764 | SourceLocation getEqualLoc() const { |
765 | assert(Kind == IK_Copy && "Only copy initialization has an '='" ); |
766 | return Locations[1]; |
767 | } |
768 | |
769 | bool isCopyInit() const { return Kind == IK_Copy; } |
770 | |
771 | /// Retrieve whether this initialization allows the use of explicit |
772 | /// constructors. |
773 | bool AllowExplicit() const { return !isCopyInit(); } |
774 | |
775 | /// Retrieve whether this initialization allows the use of explicit |
776 | /// conversion functions when binding a reference. If the reference is the |
777 | /// first parameter in a copy or move constructor, such conversions are |
778 | /// permitted even though we are performing copy-initialization. |
779 | bool allowExplicitConversionFunctionsInRefBinding() const { |
780 | return !isCopyInit() || Context == IC_ExplicitConvs; |
781 | } |
782 | |
783 | /// Determine whether this initialization has a source range containing the |
784 | /// locations of open and closing parentheses or braces. |
785 | bool hasParenOrBraceRange() const { |
786 | return Kind == IK_Direct || Kind == IK_Value || Kind == IK_DirectList; |
787 | } |
788 | |
789 | /// Retrieve the source range containing the locations of the open |
790 | /// and closing parentheses or braces for value, direct, and direct list |
791 | /// initializations. |
792 | SourceRange getParenOrBraceRange() const { |
793 | assert(hasParenOrBraceRange() && "Only direct, value, and direct-list " |
794 | "initialization have parentheses or " |
795 | "braces" ); |
796 | return SourceRange(Locations[1], Locations[2]); |
797 | } |
798 | }; |
799 | |
800 | /// Describes the sequence of initializations required to initialize |
801 | /// a given object or reference with a set of arguments. |
802 | class InitializationSequence { |
803 | public: |
804 | /// Describes the kind of initialization sequence computed. |
805 | enum SequenceKind { |
806 | /// A failed initialization sequence. The failure kind tells what |
807 | /// happened. |
808 | FailedSequence = 0, |
809 | |
810 | /// A dependent initialization, which could not be |
811 | /// type-checked due to the presence of dependent types or |
812 | /// dependently-typed expressions. |
813 | DependentSequence, |
814 | |
815 | /// A normal sequence. |
816 | NormalSequence |
817 | }; |
818 | |
819 | /// Describes the kind of a particular step in an initialization |
820 | /// sequence. |
821 | enum StepKind { |
822 | /// Resolve the address of an overloaded function to a specific |
823 | /// function declaration. |
824 | SK_ResolveAddressOfOverloadedFunction, |
825 | |
826 | /// Perform a derived-to-base cast, producing an rvalue. |
827 | SK_CastDerivedToBasePRValue, |
828 | |
829 | /// Perform a derived-to-base cast, producing an xvalue. |
830 | SK_CastDerivedToBaseXValue, |
831 | |
832 | /// Perform a derived-to-base cast, producing an lvalue. |
833 | SK_CastDerivedToBaseLValue, |
834 | |
835 | /// Reference binding to an lvalue. |
836 | SK_BindReference, |
837 | |
838 | /// Reference binding to a temporary. |
839 | SK_BindReferenceToTemporary, |
840 | |
841 | /// An optional copy of a temporary object to another |
842 | /// temporary object, which is permitted (but not required) by |
843 | /// C++98/03 but not C++0x. |
844 | , |
845 | |
846 | /// Direct-initialization from a reference-related object in the |
847 | /// final stage of class copy-initialization. |
848 | SK_FinalCopy, |
849 | |
850 | /// Perform a user-defined conversion, either via a conversion |
851 | /// function or via a constructor. |
852 | SK_UserConversion, |
853 | |
854 | /// Perform a qualification conversion, producing a prvalue. |
855 | SK_QualificationConversionPRValue, |
856 | |
857 | /// Perform a qualification conversion, producing an xvalue. |
858 | SK_QualificationConversionXValue, |
859 | |
860 | /// Perform a qualification conversion, producing an lvalue. |
861 | SK_QualificationConversionLValue, |
862 | |
863 | /// Perform a function reference conversion, see [dcl.init.ref]p4. |
864 | SK_FunctionReferenceConversion, |
865 | |
866 | /// Perform a conversion adding _Atomic to a type. |
867 | SK_AtomicConversion, |
868 | |
869 | /// Perform an implicit conversion sequence. |
870 | SK_ConversionSequence, |
871 | |
872 | /// Perform an implicit conversion sequence without narrowing. |
873 | SK_ConversionSequenceNoNarrowing, |
874 | |
875 | /// Perform list-initialization without a constructor. |
876 | SK_ListInitialization, |
877 | |
878 | /// Unwrap the single-element initializer list for a reference. |
879 | SK_UnwrapInitList, |
880 | |
881 | /// Rewrap the single-element initializer list for a reference. |
882 | SK_RewrapInitList, |
883 | |
884 | /// Perform initialization via a constructor. |
885 | SK_ConstructorInitialization, |
886 | |
887 | /// Perform initialization via a constructor, taking arguments from |
888 | /// a single InitListExpr. |
889 | SK_ConstructorInitializationFromList, |
890 | |
891 | /// Zero-initialize the object |
892 | SK_ZeroInitialization, |
893 | |
894 | /// C assignment |
895 | SK_CAssignment, |
896 | |
897 | /// Initialization by string |
898 | SK_StringInit, |
899 | |
900 | /// An initialization that "converts" an Objective-C object |
901 | /// (not a point to an object) to another Objective-C object type. |
902 | SK_ObjCObjectConversion, |
903 | |
904 | /// Array indexing for initialization by elementwise copy. |
905 | SK_ArrayLoopIndex, |
906 | |
907 | /// Array initialization by elementwise copy. |
908 | SK_ArrayLoopInit, |
909 | |
910 | /// Array initialization (from an array rvalue). |
911 | SK_ArrayInit, |
912 | |
913 | /// Array initialization (from an array rvalue) as a GNU extension. |
914 | SK_GNUArrayInit, |
915 | |
916 | /// Array initialization from a parenthesized initializer list. |
917 | /// This is a GNU C++ extension. |
918 | SK_ParenthesizedArrayInit, |
919 | |
920 | /// Pass an object by indirect copy-and-restore. |
921 | SK_PassByIndirectCopyRestore, |
922 | |
923 | /// Pass an object by indirect restore. |
924 | SK_PassByIndirectRestore, |
925 | |
926 | /// Produce an Objective-C object pointer. |
927 | SK_ProduceObjCObject, |
928 | |
929 | /// Construct a std::initializer_list from an initializer list. |
930 | SK_StdInitializerList, |
931 | |
932 | /// Perform initialization via a constructor taking a single |
933 | /// std::initializer_list argument. |
934 | SK_StdInitializerListConstructorCall, |
935 | |
936 | /// Initialize an OpenCL sampler from an integer. |
937 | SK_OCLSamplerInit, |
938 | |
939 | /// Initialize an opaque OpenCL type (event_t, queue_t, etc.) with zero |
940 | SK_OCLZeroOpaqueType, |
941 | |
942 | /// Initialize an aggreagate with parenthesized list of values. |
943 | /// This is a C++20 feature. |
944 | SK_ParenthesizedListInit |
945 | }; |
946 | |
947 | /// A single step in the initialization sequence. |
948 | class Step { |
949 | public: |
950 | /// The kind of conversion or initialization step we are taking. |
951 | StepKind Kind; |
952 | |
953 | // The type that results from this initialization. |
954 | QualType Type; |
955 | |
956 | struct F { |
957 | bool HadMultipleCandidates; |
958 | FunctionDecl *Function; |
959 | DeclAccessPair FoundDecl; |
960 | }; |
961 | |
962 | union { |
963 | /// When Kind == SK_ResolvedOverloadedFunction or Kind == |
964 | /// SK_UserConversion, the function that the expression should be |
965 | /// resolved to or the conversion function to call, respectively. |
966 | /// When Kind == SK_ConstructorInitialization or SK_ListConstruction, |
967 | /// the constructor to be called. |
968 | /// |
969 | /// Always a FunctionDecl, plus a Boolean flag telling if it was |
970 | /// selected from an overloaded set having size greater than 1. |
971 | /// For conversion decls, the naming class is the source type. |
972 | /// For construct decls, the naming class is the target type. |
973 | struct F Function; |
974 | |
975 | /// When Kind = SK_ConversionSequence, the implicit conversion |
976 | /// sequence. |
977 | ImplicitConversionSequence *ICS; |
978 | |
979 | /// When Kind = SK_RewrapInitList, the syntactic form of the |
980 | /// wrapping list. |
981 | InitListExpr *WrappingSyntacticList; |
982 | }; |
983 | |
984 | void Destroy(); |
985 | }; |
986 | |
987 | private: |
988 | /// The kind of initialization sequence computed. |
989 | enum SequenceKind SequenceKind; |
990 | |
991 | /// Steps taken by this initialization. |
992 | SmallVector<Step, 4> Steps; |
993 | |
994 | public: |
995 | /// Describes why initialization failed. |
996 | enum FailureKind { |
997 | /// Too many initializers provided for a reference. |
998 | FK_TooManyInitsForReference, |
999 | |
1000 | /// Reference initialized from a parenthesized initializer list. |
1001 | FK_ParenthesizedListInitForReference, |
1002 | |
1003 | /// Array must be initialized with an initializer list. |
1004 | FK_ArrayNeedsInitList, |
1005 | |
1006 | /// Array must be initialized with an initializer list or a |
1007 | /// string literal. |
1008 | FK_ArrayNeedsInitListOrStringLiteral, |
1009 | |
1010 | /// Array must be initialized with an initializer list or a |
1011 | /// wide string literal. |
1012 | FK_ArrayNeedsInitListOrWideStringLiteral, |
1013 | |
1014 | /// Initializing a wide char array with narrow string literal. |
1015 | FK_NarrowStringIntoWideCharArray, |
1016 | |
1017 | /// Initializing char array with wide string literal. |
1018 | FK_WideStringIntoCharArray, |
1019 | |
1020 | /// Initializing wide char array with incompatible wide string |
1021 | /// literal. |
1022 | FK_IncompatWideStringIntoWideChar, |
1023 | |
1024 | /// Initializing char8_t array with plain string literal. |
1025 | FK_PlainStringIntoUTF8Char, |
1026 | |
1027 | /// Initializing char array with UTF-8 string literal. |
1028 | FK_UTF8StringIntoPlainChar, |
1029 | |
1030 | /// Array type mismatch. |
1031 | FK_ArrayTypeMismatch, |
1032 | |
1033 | /// Non-constant array initializer |
1034 | FK_NonConstantArrayInit, |
1035 | |
1036 | /// Cannot resolve the address of an overloaded function. |
1037 | FK_AddressOfOverloadFailed, |
1038 | |
1039 | /// Overloading due to reference initialization failed. |
1040 | FK_ReferenceInitOverloadFailed, |
1041 | |
1042 | /// Non-const lvalue reference binding to a temporary. |
1043 | FK_NonConstLValueReferenceBindingToTemporary, |
1044 | |
1045 | /// Non-const lvalue reference binding to a bit-field. |
1046 | FK_NonConstLValueReferenceBindingToBitfield, |
1047 | |
1048 | /// Non-const lvalue reference binding to a vector element. |
1049 | FK_NonConstLValueReferenceBindingToVectorElement, |
1050 | |
1051 | /// Non-const lvalue reference binding to a matrix element. |
1052 | FK_NonConstLValueReferenceBindingToMatrixElement, |
1053 | |
1054 | /// Non-const lvalue reference binding to an lvalue of unrelated |
1055 | /// type. |
1056 | FK_NonConstLValueReferenceBindingToUnrelated, |
1057 | |
1058 | /// Rvalue reference binding to an lvalue. |
1059 | FK_RValueReferenceBindingToLValue, |
1060 | |
1061 | /// Reference binding drops qualifiers. |
1062 | FK_ReferenceInitDropsQualifiers, |
1063 | |
1064 | /// Reference with mismatching address space binding to temporary. |
1065 | FK_ReferenceAddrspaceMismatchTemporary, |
1066 | |
1067 | /// Reference binding failed. |
1068 | FK_ReferenceInitFailed, |
1069 | |
1070 | /// Implicit conversion failed. |
1071 | FK_ConversionFailed, |
1072 | |
1073 | /// Implicit conversion failed. |
1074 | FK_ConversionFromPropertyFailed, |
1075 | |
1076 | /// Too many initializers for scalar |
1077 | FK_TooManyInitsForScalar, |
1078 | |
1079 | /// Scalar initialized from a parenthesized initializer list. |
1080 | FK_ParenthesizedListInitForScalar, |
1081 | |
1082 | /// Reference initialization from an initializer list |
1083 | FK_ReferenceBindingToInitList, |
1084 | |
1085 | /// Initialization of some unused destination type with an |
1086 | /// initializer list. |
1087 | FK_InitListBadDestinationType, |
1088 | |
1089 | /// Overloading for a user-defined conversion failed. |
1090 | FK_UserConversionOverloadFailed, |
1091 | |
1092 | /// Overloading for initialization by constructor failed. |
1093 | FK_ConstructorOverloadFailed, |
1094 | |
1095 | /// Overloading for list-initialization by constructor failed. |
1096 | FK_ListConstructorOverloadFailed, |
1097 | |
1098 | /// Default-initialization of a 'const' object. |
1099 | FK_DefaultInitOfConst, |
1100 | |
1101 | /// Initialization of an incomplete type. |
1102 | FK_Incomplete, |
1103 | |
1104 | /// Variable-length array must not have an initializer. |
1105 | FK_VariableLengthArrayHasInitializer, |
1106 | |
1107 | /// List initialization failed at some point. |
1108 | FK_ListInitializationFailed, |
1109 | |
1110 | /// Initializer has a placeholder type which cannot be |
1111 | /// resolved by initialization. |
1112 | FK_PlaceholderType, |
1113 | |
1114 | /// Trying to take the address of a function that doesn't support |
1115 | /// having its address taken. |
1116 | FK_AddressOfUnaddressableFunction, |
1117 | |
1118 | /// List-copy-initialization chose an explicit constructor. |
1119 | FK_ExplicitConstructor, |
1120 | |
1121 | /// Parenthesized list initialization failed at some point. |
1122 | /// This is a C++20 feature. |
1123 | FK_ParenthesizedListInitFailed, |
1124 | |
1125 | // A designated initializer was provided for a non-aggregate type. |
1126 | FK_DesignatedInitForNonAggregate, |
1127 | }; |
1128 | |
1129 | private: |
1130 | /// The reason why initialization failed. |
1131 | FailureKind Failure; |
1132 | |
1133 | /// The failed result of overload resolution. |
1134 | OverloadingResult FailedOverloadResult; |
1135 | |
1136 | /// The candidate set created when initialization failed. |
1137 | OverloadCandidateSet FailedCandidateSet; |
1138 | |
1139 | /// The incomplete type that caused a failure. |
1140 | QualType FailedIncompleteType; |
1141 | |
1142 | /// The fixit that needs to be applied to make this initialization |
1143 | /// succeed. |
1144 | std::string ZeroInitializationFixit; |
1145 | SourceLocation ZeroInitializationFixitLoc; |
1146 | |
1147 | public: |
1148 | /// Call for initializations are invalid but that would be valid |
1149 | /// zero initialzations if Fixit was applied. |
1150 | void SetZeroInitializationFixit(const std::string& Fixit, SourceLocation L) { |
1151 | ZeroInitializationFixit = Fixit; |
1152 | ZeroInitializationFixitLoc = L; |
1153 | } |
1154 | |
1155 | private: |
1156 | /// Prints a follow-up note that highlights the location of |
1157 | /// the initialized entity, if it's remote. |
1158 | void PrintInitLocationNote(Sema &S, const InitializedEntity &Entity); |
1159 | |
1160 | public: |
1161 | /// Try to perform initialization of the given entity, creating a |
1162 | /// record of the steps required to perform the initialization. |
1163 | /// |
1164 | /// The generated initialization sequence will either contain enough |
1165 | /// information to diagnose |
1166 | /// |
1167 | /// \param S the semantic analysis object. |
1168 | /// |
1169 | /// \param Entity the entity being initialized. |
1170 | /// |
1171 | /// \param Kind the kind of initialization being performed. |
1172 | /// |
1173 | /// \param Args the argument(s) provided for initialization. |
1174 | /// |
1175 | /// \param TopLevelOfInitList true if we are initializing from an expression |
1176 | /// at the top level inside an initializer list. This disallows |
1177 | /// narrowing conversions in C++11 onwards. |
1178 | /// \param TreatUnavailableAsInvalid true if we want to treat unavailable |
1179 | /// as invalid. |
1180 | InitializationSequence(Sema &S, |
1181 | const InitializedEntity &Entity, |
1182 | const InitializationKind &Kind, |
1183 | MultiExprArg Args, |
1184 | bool TopLevelOfInitList = false, |
1185 | bool TreatUnavailableAsInvalid = true); |
1186 | void InitializeFrom(Sema &S, const InitializedEntity &Entity, |
1187 | const InitializationKind &Kind, MultiExprArg Args, |
1188 | bool TopLevelOfInitList, bool TreatUnavailableAsInvalid); |
1189 | |
1190 | ~InitializationSequence(); |
1191 | |
1192 | /// Perform the actual initialization of the given entity based on |
1193 | /// the computed initialization sequence. |
1194 | /// |
1195 | /// \param S the semantic analysis object. |
1196 | /// |
1197 | /// \param Entity the entity being initialized. |
1198 | /// |
1199 | /// \param Kind the kind of initialization being performed. |
1200 | /// |
1201 | /// \param Args the argument(s) provided for initialization, ownership of |
1202 | /// which is transferred into the routine. |
1203 | /// |
1204 | /// \param ResultType if non-NULL, will be set to the type of the |
1205 | /// initialized object, which is the type of the declaration in most |
1206 | /// cases. However, when the initialized object is a variable of |
1207 | /// incomplete array type and the initializer is an initializer |
1208 | /// list, this type will be set to the completed array type. |
1209 | /// |
1210 | /// \returns an expression that performs the actual object initialization, if |
1211 | /// the initialization is well-formed. Otherwise, emits diagnostics |
1212 | /// and returns an invalid expression. |
1213 | ExprResult Perform(Sema &S, |
1214 | const InitializedEntity &Entity, |
1215 | const InitializationKind &Kind, |
1216 | MultiExprArg Args, |
1217 | QualType *ResultType = nullptr); |
1218 | |
1219 | /// Diagnose an potentially-invalid initialization sequence. |
1220 | /// |
1221 | /// \returns true if the initialization sequence was ill-formed, |
1222 | /// false otherwise. |
1223 | bool Diagnose(Sema &S, |
1224 | const InitializedEntity &Entity, |
1225 | const InitializationKind &Kind, |
1226 | ArrayRef<Expr *> Args); |
1227 | |
1228 | /// Determine the kind of initialization sequence computed. |
1229 | enum SequenceKind getKind() const { return SequenceKind; } |
1230 | |
1231 | /// Set the kind of sequence computed. |
1232 | void setSequenceKind(enum SequenceKind SK) { SequenceKind = SK; } |
1233 | |
1234 | /// Determine whether the initialization sequence is valid. |
1235 | explicit operator bool() const { return !Failed(); } |
1236 | |
1237 | /// Determine whether the initialization sequence is invalid. |
1238 | bool Failed() const { return SequenceKind == FailedSequence; } |
1239 | |
1240 | using step_iterator = SmallVectorImpl<Step>::const_iterator; |
1241 | |
1242 | step_iterator step_begin() const { return Steps.begin(); } |
1243 | step_iterator step_end() const { return Steps.end(); } |
1244 | |
1245 | using step_range = llvm::iterator_range<step_iterator>; |
1246 | |
1247 | step_range steps() const { return {step_begin(), step_end()}; } |
1248 | |
1249 | /// Determine whether this initialization is a direct reference |
1250 | /// binding (C++ [dcl.init.ref]). |
1251 | bool isDirectReferenceBinding() const; |
1252 | |
1253 | /// Determine whether this initialization failed due to an ambiguity. |
1254 | bool isAmbiguous() const; |
1255 | |
1256 | /// Determine whether this initialization is direct call to a |
1257 | /// constructor. |
1258 | bool isConstructorInitialization() const; |
1259 | |
1260 | /// Add a new step in the initialization that resolves the address |
1261 | /// of an overloaded function to a specific function declaration. |
1262 | /// |
1263 | /// \param Function the function to which the overloaded function reference |
1264 | /// resolves. |
1265 | void AddAddressOverloadResolutionStep(FunctionDecl *Function, |
1266 | DeclAccessPair Found, |
1267 | bool HadMultipleCandidates); |
1268 | |
1269 | /// Add a new step in the initialization that performs a derived-to- |
1270 | /// base cast. |
1271 | /// |
1272 | /// \param BaseType the base type to which we will be casting. |
1273 | /// |
1274 | /// \param Category Indicates whether the result will be treated as an |
1275 | /// rvalue, an xvalue, or an lvalue. |
1276 | void AddDerivedToBaseCastStep(QualType BaseType, |
1277 | ExprValueKind Category); |
1278 | |
1279 | /// Add a new step binding a reference to an object. |
1280 | /// |
1281 | /// \param BindingTemporary True if we are binding a reference to a temporary |
1282 | /// object (thereby extending its lifetime); false if we are binding to an |
1283 | /// lvalue or an lvalue treated as an rvalue. |
1284 | void AddReferenceBindingStep(QualType T, bool BindingTemporary); |
1285 | |
1286 | /// Add a new step that makes an extraneous copy of the input |
1287 | /// to a temporary of the same class type. |
1288 | /// |
1289 | /// This extraneous copy only occurs during reference binding in |
1290 | /// C++98/03, where we are permitted (but not required) to introduce |
1291 | /// an extra copy. At a bare minimum, we must check that we could |
1292 | /// call the copy constructor, and produce a diagnostic if the copy |
1293 | /// constructor is inaccessible or no copy constructor matches. |
1294 | // |
1295 | /// \param T The type of the temporary being created. |
1296 | void (QualType T); |
1297 | |
1298 | /// Add a new step that makes a copy of the input to an object of |
1299 | /// the given type, as the final step in class copy-initialization. |
1300 | void AddFinalCopy(QualType T); |
1301 | |
1302 | /// Add a new step invoking a conversion function, which is either |
1303 | /// a constructor or a conversion function. |
1304 | void AddUserConversionStep(FunctionDecl *Function, |
1305 | DeclAccessPair FoundDecl, |
1306 | QualType T, |
1307 | bool HadMultipleCandidates); |
1308 | |
1309 | /// Add a new step that performs a qualification conversion to the |
1310 | /// given type. |
1311 | void AddQualificationConversionStep(QualType Ty, |
1312 | ExprValueKind Category); |
1313 | |
1314 | /// Add a new step that performs a function reference conversion to the |
1315 | /// given type. |
1316 | void AddFunctionReferenceConversionStep(QualType Ty); |
1317 | |
1318 | /// Add a new step that performs conversion from non-atomic to atomic |
1319 | /// type. |
1320 | void AddAtomicConversionStep(QualType Ty); |
1321 | |
1322 | /// Add a new step that applies an implicit conversion sequence. |
1323 | void AddConversionSequenceStep(const ImplicitConversionSequence &ICS, |
1324 | QualType T, bool TopLevelOfInitList = false); |
1325 | |
1326 | /// Add a list-initialization step. |
1327 | void AddListInitializationStep(QualType T); |
1328 | |
1329 | /// Add a constructor-initialization step. |
1330 | /// |
1331 | /// \param FromInitList The constructor call is syntactically an initializer |
1332 | /// list. |
1333 | /// \param AsInitList The constructor is called as an init list constructor. |
1334 | void AddConstructorInitializationStep(DeclAccessPair FoundDecl, |
1335 | CXXConstructorDecl *Constructor, |
1336 | QualType T, |
1337 | bool HadMultipleCandidates, |
1338 | bool FromInitList, bool AsInitList); |
1339 | |
1340 | /// Add a zero-initialization step. |
1341 | void AddZeroInitializationStep(QualType T); |
1342 | |
1343 | /// Add a C assignment step. |
1344 | // |
1345 | // FIXME: It isn't clear whether this should ever be needed; |
1346 | // ideally, we would handle everything needed in C in the common |
1347 | // path. However, that isn't the case yet. |
1348 | void AddCAssignmentStep(QualType T); |
1349 | |
1350 | /// Add a string init step. |
1351 | void AddStringInitStep(QualType T); |
1352 | |
1353 | /// Add an Objective-C object conversion step, which is |
1354 | /// always a no-op. |
1355 | void AddObjCObjectConversionStep(QualType T); |
1356 | |
1357 | /// Add an array initialization loop step. |
1358 | void AddArrayInitLoopStep(QualType T, QualType EltTy); |
1359 | |
1360 | /// Add an array initialization step. |
1361 | void AddArrayInitStep(QualType T, bool IsGNUExtension); |
1362 | |
1363 | /// Add a parenthesized array initialization step. |
1364 | void AddParenthesizedArrayInitStep(QualType T); |
1365 | |
1366 | /// Add a step to pass an object by indirect copy-restore. |
1367 | void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy); |
1368 | |
1369 | /// Add a step to "produce" an Objective-C object (by |
1370 | /// retaining it). |
1371 | void AddProduceObjCObjectStep(QualType T); |
1372 | |
1373 | /// Add a step to construct a std::initializer_list object from an |
1374 | /// initializer list. |
1375 | void AddStdInitializerListConstructionStep(QualType T); |
1376 | |
1377 | /// Add a step to initialize an OpenCL sampler from an integer |
1378 | /// constant. |
1379 | void AddOCLSamplerInitStep(QualType T); |
1380 | |
1381 | /// Add a step to initialzie an OpenCL opaque type (event_t, queue_t, etc.) |
1382 | /// from a zero constant. |
1383 | void AddOCLZeroOpaqueTypeStep(QualType T); |
1384 | |
1385 | void AddParenthesizedListInitStep(QualType T); |
1386 | |
1387 | /// Add steps to unwrap a initializer list for a reference around a |
1388 | /// single element and rewrap it at the end. |
1389 | void RewrapReferenceInitList(QualType T, InitListExpr *Syntactic); |
1390 | |
1391 | /// Note that this initialization sequence failed. |
1392 | void SetFailed(FailureKind Failure) { |
1393 | SequenceKind = FailedSequence; |
1394 | this->Failure = Failure; |
1395 | assert((Failure != FK_Incomplete || !FailedIncompleteType.isNull()) && |
1396 | "Incomplete type failure requires a type!" ); |
1397 | } |
1398 | |
1399 | /// Note that this initialization sequence failed due to failed |
1400 | /// overload resolution. |
1401 | void SetOverloadFailure(FailureKind Failure, OverloadingResult Result); |
1402 | |
1403 | /// Retrieve a reference to the candidate set when overload |
1404 | /// resolution fails. |
1405 | OverloadCandidateSet &getFailedCandidateSet() { |
1406 | return FailedCandidateSet; |
1407 | } |
1408 | |
1409 | /// Get the overloading result, for when the initialization |
1410 | /// sequence failed due to a bad overload. |
1411 | OverloadingResult getFailedOverloadResult() const { |
1412 | return FailedOverloadResult; |
1413 | } |
1414 | |
1415 | /// Note that this initialization sequence failed due to an |
1416 | /// incomplete type. |
1417 | void setIncompleteTypeFailure(QualType IncompleteType) { |
1418 | FailedIncompleteType = IncompleteType; |
1419 | SetFailed(FK_Incomplete); |
1420 | } |
1421 | |
1422 | /// Determine why initialization failed. |
1423 | FailureKind getFailureKind() const { |
1424 | assert(Failed() && "Not an initialization failure!" ); |
1425 | return Failure; |
1426 | } |
1427 | |
1428 | /// Dump a representation of this initialization sequence to |
1429 | /// the given stream, for debugging purposes. |
1430 | void dump(raw_ostream &OS) const; |
1431 | |
1432 | /// Dump a representation of this initialization sequence to |
1433 | /// standard error, for debugging purposes. |
1434 | void dump() const; |
1435 | }; |
1436 | |
1437 | } // namespace clang |
1438 | |
1439 | #endif // LLVM_CLANG_SEMA_INITIALIZATION_H |
1440 | |