1 //===--- SemaInit.h - Semantic Analysis for Initializers --------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file provides supporting data types for initialization of objects.
12 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CLANG_SEMA_INITIALIZATION_H
14 #define LLVM_CLANG_SEMA_INITIALIZATION_H
16 #include "clang/Sema/Ownership.h"
17 #include "clang/Sema/Overload.h"
18 #include "clang/AST/Type.h"
19 #include "clang/AST/UnresolvedSet.h"
20 #include "clang/Basic/SourceLocation.h"
21 #include "llvm/ADT/PointerIntPair.h"
22 #include "llvm/ADT/SmallVector.h"
31 class CXXBaseSpecifier;
41 /// \brief Describes an entity that is being initialized.
42 class InitializedEntity {
44 /// \brief Specifies the kind of entity being initialized.
46 /// \brief The entity being initialized is a variable.
48 /// \brief The entity being initialized is a function parameter.
50 /// \brief The entity being initialized is the result of a function call.
52 /// \brief The entity being initialized is an exception object that
55 /// \brief The entity being initialized is a non-static data member
58 /// \brief The entity being initialized is an element of an array.
60 /// \brief The entity being initialized is an object (or array of
61 /// objects) allocated via new.
63 /// \brief The entity being initialized is a temporary object.
65 /// \brief The entity being initialized is a base member subobject.
67 /// \brief The initialization is being done by a delegating constructor.
69 /// \brief The entity being initialized is an element of a vector.
72 /// \brief The entity being initialized is a field of block descriptor for
73 /// the copied-in c++ object.
78 /// \brief The kind of entity being initialized.
81 /// \brief If non-NULL, the parent entity in which this
82 /// initialization occurs.
83 const InitializedEntity *Parent;
85 /// \brief The type of the object or reference being initialized.
89 /// \brief When Kind == EK_Variable or EK_Member, the VarDecl or
90 /// FieldDecl, respectively.
91 DeclaratorDecl *VariableOrMember;
93 /// \brief When Kind == EK_Parameter, the ParmVarDecl, with the
94 /// low bit indicating whether the parameter is "consumed".
97 /// \brief When Kind == EK_Temporary, the type source information for
99 TypeSourceInfo *TypeInfo;
102 /// \brief When Kind == EK_Result, EK_Exception, or EK_New, the
103 /// location of the 'return', 'throw', or 'new' keyword,
104 /// respectively. When Kind == EK_Temporary, the location where
105 /// the temporary is being created.
108 /// \brief Whether the entity being initialized may end up using the
109 /// named return value optimization (NRVO).
113 /// \brief When Kind == EK_Base, the base specifier that provides the
114 /// base class. The lower bit specifies whether the base is an inherited
118 /// \brief When Kind == EK_ArrayElement or EK_VectorElement, the
119 /// index of the array or vector element being initialized.
123 InitializedEntity() { }
125 /// \brief Create the initialization entity for a variable.
126 InitializedEntity(VarDecl *Var)
127 : Kind(EK_Variable), Parent(0), Type(Var->getType()),
128 VariableOrMember(Var) { }
130 /// \brief Create the initialization entity for the result of a
131 /// function, throwing an object, performing an explicit cast, or
132 /// initializing a parameter for which there is no declaration.
133 InitializedEntity(EntityKind Kind, SourceLocation Loc, QualType Type,
135 : Kind(Kind), Parent(0), Type(Type)
137 LocAndNRVO.Location = Loc.getRawEncoding();
138 LocAndNRVO.NRVO = NRVO;
141 /// \brief Create the initialization entity for a member subobject.
142 InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent)
143 : Kind(EK_Member), Parent(Parent), Type(Member->getType()),
144 VariableOrMember(Member) { }
146 /// \brief Create the initialization entity for an array element.
147 InitializedEntity(ASTContext &Context, unsigned Index,
148 const InitializedEntity &Parent);
151 /// \brief Create the initialization entity for a variable.
152 static InitializedEntity InitializeVariable(VarDecl *Var) {
153 return InitializedEntity(Var);
156 /// \brief Create the initialization entity for a parameter.
157 static InitializedEntity InitializeParameter(ASTContext &Context,
159 bool Consumed = (Context.getLangOptions().ObjCAutoRefCount &&
160 Parm->hasAttr<NSConsumedAttr>());
162 InitializedEntity Entity;
163 Entity.Kind = EK_Parameter;
164 Entity.Type = Context.getVariableArrayDecayedType(
165 Parm->getType().getUnqualifiedType());
168 = (static_cast<uintptr_t>(Consumed) | reinterpret_cast<uintptr_t>(Parm));
172 /// \brief Create the initialization entity for a parameter that is
173 /// only known by its type.
174 static InitializedEntity InitializeParameter(ASTContext &Context,
177 InitializedEntity Entity;
178 Entity.Kind = EK_Parameter;
179 Entity.Type = Context.getVariableArrayDecayedType(Type);
181 Entity.Parameter = (Consumed);
185 /// \brief Create the initialization entity for the result of a function.
186 static InitializedEntity InitializeResult(SourceLocation ReturnLoc,
187 QualType Type, bool NRVO) {
188 return InitializedEntity(EK_Result, ReturnLoc, Type, NRVO);
191 static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc,
192 QualType Type, bool NRVO) {
193 return InitializedEntity(EK_BlockElement, BlockVarLoc, Type, NRVO);
196 /// \brief Create the initialization entity for an exception object.
197 static InitializedEntity InitializeException(SourceLocation ThrowLoc,
198 QualType Type, bool NRVO) {
199 return InitializedEntity(EK_Exception, ThrowLoc, Type, NRVO);
202 /// \brief Create the initialization entity for an object allocated via new.
203 static InitializedEntity InitializeNew(SourceLocation NewLoc, QualType Type) {
204 return InitializedEntity(EK_New, NewLoc, Type);
207 /// \brief Create the initialization entity for a temporary.
208 static InitializedEntity InitializeTemporary(QualType Type) {
209 return InitializedEntity(EK_Temporary, SourceLocation(), Type);
212 /// \brief Create the initialization entity for a temporary.
213 static InitializedEntity InitializeTemporary(TypeSourceInfo *TypeInfo) {
214 InitializedEntity Result(EK_Temporary, SourceLocation(),
215 TypeInfo->getType());
216 Result.TypeInfo = TypeInfo;
220 /// \brief Create the initialization entity for a base class subobject.
221 static InitializedEntity InitializeBase(ASTContext &Context,
222 CXXBaseSpecifier *Base,
223 bool IsInheritedVirtualBase);
225 /// \brief Create the initialization entity for a delegated constructor.
226 static InitializedEntity InitializeDelegation(QualType Type) {
227 return InitializedEntity(EK_Delegating, SourceLocation(), Type);
230 /// \brief Create the initialization entity for a member subobject.
231 static InitializedEntity InitializeMember(FieldDecl *Member,
232 const InitializedEntity *Parent = 0) {
233 return InitializedEntity(Member, Parent);
236 /// \brief Create the initialization entity for a member subobject.
237 static InitializedEntity InitializeMember(IndirectFieldDecl *Member,
238 const InitializedEntity *Parent = 0) {
239 return InitializedEntity(Member->getAnonField(), Parent);
242 /// \brief Create the initialization entity for an array element.
243 static InitializedEntity InitializeElement(ASTContext &Context,
245 const InitializedEntity &Parent) {
246 return InitializedEntity(Context, Index, Parent);
249 /// \brief Determine the kind of initialization.
250 EntityKind getKind() const { return Kind; }
252 /// \brief Retrieve the parent of the entity being initialized, when
253 /// the initialization itself is occurring within the context of a
254 /// larger initialization.
255 const InitializedEntity *getParent() const { return Parent; }
257 /// \brief Retrieve type being initialized.
258 QualType getType() const { return Type; }
260 /// \brief Retrieve complete type-source information for the object being
261 /// constructed, if known.
262 TypeSourceInfo *getTypeSourceInfo() const {
263 if (Kind == EK_Temporary)
269 /// \brief Retrieve the name of the entity being initialized.
270 DeclarationName getName() const;
272 /// \brief Retrieve the variable, parameter, or field being
274 DeclaratorDecl *getDecl() const;
276 /// \brief Determine whether this initialization allows the named return
277 /// value optimization, which also applies to thrown objects.
278 bool allowsNRVO() const;
280 /// \brief Determine whether this initialization consumes the
282 bool isParameterConsumed() const {
283 assert(getKind() == EK_Parameter && "Not a parameter");
284 return (Parameter & 1);
287 /// \brief Retrieve the base specifier.
288 CXXBaseSpecifier *getBaseSpecifier() const {
289 assert(getKind() == EK_Base && "Not a base specifier");
290 return reinterpret_cast<CXXBaseSpecifier *>(Base & ~0x1);
293 /// \brief Return whether the base is an inherited virtual base.
294 bool isInheritedVirtualBase() const {
295 assert(getKind() == EK_Base && "Not a base specifier");
299 /// \brief Determine the location of the 'return' keyword when initializing
300 /// the result of a function call.
301 SourceLocation getReturnLoc() const {
302 assert(getKind() == EK_Result && "No 'return' location!");
303 return SourceLocation::getFromRawEncoding(LocAndNRVO.Location);
306 /// \brief Determine the location of the 'throw' keyword when initializing
307 /// an exception object.
308 SourceLocation getThrowLoc() const {
309 assert(getKind() == EK_Exception && "No 'throw' location!");
310 return SourceLocation::getFromRawEncoding(LocAndNRVO.Location);
313 /// \brief If this is already the initializer for an array or vector
314 /// element, sets the element index.
315 void setElementIndex(unsigned Index) {
316 assert(getKind() == EK_ArrayElement || getKind() == EK_VectorElement);
321 /// \brief Describes the kind of initialization being performed, along with
322 /// location information for tokens related to the initialization (equal sign,
324 class InitializationKind {
326 /// \brief The kind of initialization being performed.
328 IK_Direct, ///< Direct initialization
329 IK_Copy, ///< Copy initialization
330 IK_Default, ///< Default initialization
331 IK_Value ///< Value initialization
335 /// \brief The kind of initialization that we're storing.
336 enum StoredInitKind {
337 SIK_Direct = IK_Direct, ///< Direct initialization
338 SIK_Copy = IK_Copy, ///< Copy initialization
339 SIK_Default = IK_Default, ///< Default initialization
340 SIK_Value = IK_Value, ///< Value initialization
341 SIK_ImplicitValue, ///< Implicit value initialization
342 SIK_DirectCast, ///< Direct initialization due to a cast
343 /// \brief Direct initialization due to a C-style cast.
344 SIK_DirectCStyleCast,
345 /// \brief Direct initialization due to a functional-style cast.
346 SIK_DirectFunctionalCast
349 /// \brief The kind of initialization being performed.
352 /// \brief The source locations involved in the initialization.
353 SourceLocation Locations[3];
355 InitializationKind(StoredInitKind Kind, SourceLocation Loc1,
356 SourceLocation Loc2, SourceLocation Loc3)
365 /// \brief Create a direct initialization.
366 static InitializationKind CreateDirect(SourceLocation InitLoc,
367 SourceLocation LParenLoc,
368 SourceLocation RParenLoc) {
369 return InitializationKind(SIK_Direct, InitLoc, LParenLoc, RParenLoc);
372 /// \brief Create a direct initialization due to a cast that isn't a C-style
373 /// or functional cast.
374 static InitializationKind CreateCast(SourceRange TypeRange) {
375 return InitializationKind(SIK_DirectCast,
376 TypeRange.getBegin(), TypeRange.getBegin(),
380 /// \brief Create a direct initialization for a C-style cast.
381 static InitializationKind CreateCStyleCast(SourceLocation StartLoc,
382 SourceRange TypeRange) {
383 return InitializationKind(SIK_DirectCStyleCast,
384 StartLoc, TypeRange.getBegin(),
388 /// \brief Create a direct initialization for a functional cast.
389 static InitializationKind CreateFunctionalCast(SourceRange TypeRange) {
390 return InitializationKind(SIK_DirectFunctionalCast,
391 TypeRange.getBegin(), TypeRange.getBegin(),
395 /// \brief Create a copy initialization.
396 static InitializationKind CreateCopy(SourceLocation InitLoc,
397 SourceLocation EqualLoc) {
398 return InitializationKind(SIK_Copy, InitLoc, EqualLoc, EqualLoc);
401 /// \brief Create a default initialization.
402 static InitializationKind CreateDefault(SourceLocation InitLoc) {
403 return InitializationKind(SIK_Default, InitLoc, InitLoc, InitLoc);
406 /// \brief Create a value initialization.
407 static InitializationKind CreateValue(SourceLocation InitLoc,
408 SourceLocation LParenLoc,
409 SourceLocation RParenLoc,
410 bool isImplicit = false) {
411 return InitializationKind(isImplicit? SIK_ImplicitValue : SIK_Value,
412 InitLoc, LParenLoc, RParenLoc);
415 /// \brief Determine the initialization kind.
416 InitKind getKind() const {
417 if (Kind > SIK_ImplicitValue)
419 if (Kind == SIK_ImplicitValue)
422 return (InitKind)Kind;
425 /// \brief Determine whether this initialization is an explicit cast.
426 bool isExplicitCast() const {
427 return Kind == SIK_DirectCast ||
428 Kind == SIK_DirectCStyleCast ||
429 Kind == SIK_DirectFunctionalCast;
432 /// \brief Determine whether this initialization is a C-style cast.
433 bool isCStyleOrFunctionalCast() const {
434 return Kind == SIK_DirectCStyleCast || Kind == SIK_DirectFunctionalCast;
437 /// brief Determine whether this is a C-style cast.
438 bool isCStyleCast() const {
439 return Kind == SIK_DirectCStyleCast;
442 /// brief Determine whether this is a functional-style cast.
443 bool isFunctionalCast() const {
444 return Kind == SIK_DirectFunctionalCast;
447 /// \brief Determine whether this initialization is an implicit
448 /// value-initialization, e.g., as occurs during aggregate
450 bool isImplicitValueInit() const { return Kind == SIK_ImplicitValue; }
452 /// \brief Retrieve the location at which initialization is occurring.
453 SourceLocation getLocation() const { return Locations[0]; }
455 /// \brief Retrieve the source range that covers the initialization.
456 SourceRange getRange() const {
457 return SourceRange(Locations[0], Locations[2]);
460 /// \brief Retrieve the location of the equal sign for copy initialization
462 SourceLocation getEqualLoc() const {
463 assert(Kind == SIK_Copy && "Only copy initialization has an '='");
467 bool isCopyInit() const { return Kind == SIK_Copy; }
469 /// \brief Retrieve the source range containing the locations of the open
470 /// and closing parentheses for value and direct initializations.
471 SourceRange getParenRange() const {
472 assert((getKind() == IK_Direct || Kind == SIK_Value) &&
473 "Only direct- and value-initialization have parentheses");
474 return SourceRange(Locations[1], Locations[2]);
478 /// \brief Describes the sequence of initializations required to initialize
479 /// a given object or reference with a set of arguments.
480 class InitializationSequence {
482 /// \brief Describes the kind of initialization sequence computed.
484 /// \brief A failed initialization sequence. The failure kind tells what
488 /// \brief A dependent initialization, which could not be
489 /// type-checked due to the presence of dependent types or
490 /// dependently-typed expressions.
493 /// \brief A normal sequence.
497 /// \brief Describes the kind of a particular step in an initialization
500 /// \brief Resolve the address of an overloaded function to a specific
501 /// function declaration.
502 SK_ResolveAddressOfOverloadedFunction,
503 /// \brief Perform a derived-to-base cast, producing an rvalue.
504 SK_CastDerivedToBaseRValue,
505 /// \brief Perform a derived-to-base cast, producing an xvalue.
506 SK_CastDerivedToBaseXValue,
507 /// \brief Perform a derived-to-base cast, producing an lvalue.
508 SK_CastDerivedToBaseLValue,
509 /// \brief Reference binding to an lvalue.
511 /// \brief Reference binding to a temporary.
512 SK_BindReferenceToTemporary,
513 /// \brief An optional copy of a temporary object to another
514 /// temporary object, which is permitted (but not required) by
515 /// C++98/03 but not C++0x.
516 SK_ExtraneousCopyToTemporary,
517 /// \brief Perform a user-defined conversion, either via a conversion
518 /// function or via a constructor.
520 /// \brief Perform a qualification conversion, producing an rvalue.
521 SK_QualificationConversionRValue,
522 /// \brief Perform a qualification conversion, producing an xvalue.
523 SK_QualificationConversionXValue,
524 /// \brief Perform a qualification conversion, producing an lvalue.
525 SK_QualificationConversionLValue,
526 /// \brief Perform an implicit conversion sequence.
527 SK_ConversionSequence,
528 /// \brief Perform list-initialization
529 SK_ListInitialization,
530 /// \brief Perform initialization via a constructor.
531 SK_ConstructorInitialization,
532 /// \brief Zero-initialize the object
533 SK_ZeroInitialization,
534 /// \brief C assignment
536 /// \brief Initialization by string
538 /// \brief An initialization that "converts" an Objective-C object
539 /// (not a point to an object) to another Objective-C object type.
540 SK_ObjCObjectConversion,
541 /// \brief Array initialization (from an array rvalue).
542 /// This is a GNU C extension.
544 /// \brief Pass an object by indirect copy-and-restore.
545 SK_PassByIndirectCopyRestore,
546 /// \brief Pass an object by indirect restore.
547 SK_PassByIndirectRestore,
548 /// \brief Produce an Objective-C object pointer.
552 /// \brief A single step in the initialization sequence.
555 /// \brief The kind of conversion or initialization step we are taking.
558 // \brief The type that results from this initialization.
562 /// \brief When Kind == SK_ResolvedOverloadedFunction or Kind ==
563 /// SK_UserConversion, the function that the expression should be
564 /// resolved to or the conversion function to call, respectively.
566 /// Always a FunctionDecl.
567 /// For conversion decls, the naming class is the source type.
568 /// For construct decls, the naming class is the target type.
570 FunctionDecl *Function;
571 DeclAccessPair FoundDecl;
574 /// \brief When Kind = SK_ConversionSequence, the implicit conversion
576 ImplicitConversionSequence *ICS;
583 /// \brief The kind of initialization sequence computed.
584 enum SequenceKind SequenceKind;
586 /// \brief Steps taken by this initialization.
587 llvm::SmallVector<Step, 4> Steps;
590 /// \brief Describes why initialization failed.
592 /// \brief Too many initializers provided for a reference.
593 FK_TooManyInitsForReference,
594 /// \brief Array must be initialized with an initializer list.
595 FK_ArrayNeedsInitList,
596 /// \brief Array must be initialized with an initializer list or a
598 FK_ArrayNeedsInitListOrStringLiteral,
599 /// \brief Array type mismatch.
600 FK_ArrayTypeMismatch,
601 /// \brief Non-constant array initializer
602 FK_NonConstantArrayInit,
603 /// \brief Cannot resolve the address of an overloaded function.
604 FK_AddressOfOverloadFailed,
605 /// \brief Overloading due to reference initialization failed.
606 FK_ReferenceInitOverloadFailed,
607 /// \brief Non-const lvalue reference binding to a temporary.
608 FK_NonConstLValueReferenceBindingToTemporary,
609 /// \brief Non-const lvalue reference binding to an lvalue of unrelated
611 FK_NonConstLValueReferenceBindingToUnrelated,
612 /// \brief Rvalue reference binding to an lvalue.
613 FK_RValueReferenceBindingToLValue,
614 /// \brief Reference binding drops qualifiers.
615 FK_ReferenceInitDropsQualifiers,
616 /// \brief Reference binding failed.
617 FK_ReferenceInitFailed,
618 /// \brief Implicit conversion failed.
620 /// \brief Implicit conversion failed.
621 FK_ConversionFromPropertyFailed,
622 /// \brief Too many initializers for scalar
623 FK_TooManyInitsForScalar,
624 /// \brief Reference initialization from an initializer list
625 FK_ReferenceBindingToInitList,
626 /// \brief Initialization of some unused destination type with an
627 /// initializer list.
628 FK_InitListBadDestinationType,
629 /// \brief Overloading for a user-defined conversion failed.
630 FK_UserConversionOverloadFailed,
631 /// \brief Overloaded for initialization by constructor failed.
632 FK_ConstructorOverloadFailed,
633 /// \brief Default-initialization of a 'const' object.
634 FK_DefaultInitOfConst,
635 /// \brief Initialization of an incomplete type.
640 /// \brief The reason why initialization failued.
643 /// \brief The failed result of overload resolution.
644 OverloadingResult FailedOverloadResult;
646 /// \brief The candidate set created when initialization failed.
647 OverloadCandidateSet FailedCandidateSet;
649 /// \brief Prints a follow-up note that highlights the location of
650 /// the initialized entity, if it's remote.
651 void PrintInitLocationNote(Sema &S, const InitializedEntity &Entity);
654 /// \brief Try to perform initialization of the given entity, creating a
655 /// record of the steps required to perform the initialization.
657 /// The generated initialization sequence will either contain enough
658 /// information to diagnose
660 /// \param S the semantic analysis object.
662 /// \param Entity the entity being initialized.
664 /// \param Kind the kind of initialization being performed.
666 /// \param Args the argument(s) provided for initialization.
668 /// \param NumArgs the number of arguments provided for initialization.
669 InitializationSequence(Sema &S,
670 const InitializedEntity &Entity,
671 const InitializationKind &Kind,
675 ~InitializationSequence();
677 /// \brief Perform the actual initialization of the given entity based on
678 /// the computed initialization sequence.
680 /// \param S the semantic analysis object.
682 /// \param Entity the entity being initialized.
684 /// \param Kind the kind of initialization being performed.
686 /// \param Args the argument(s) provided for initialization, ownership of
687 /// which is transferred into the routine.
689 /// \param ResultType if non-NULL, will be set to the type of the
690 /// initialized object, which is the type of the declaration in most
691 /// cases. However, when the initialized object is a variable of
692 /// incomplete array type and the initializer is an initializer
693 /// list, this type will be set to the completed array type.
695 /// \returns an expression that performs the actual object initialization, if
696 /// the initialization is well-formed. Otherwise, emits diagnostics
697 /// and returns an invalid expression.
698 ExprResult Perform(Sema &S,
699 const InitializedEntity &Entity,
700 const InitializationKind &Kind,
702 QualType *ResultType = 0);
704 /// \brief Diagnose an potentially-invalid initialization sequence.
706 /// \returns true if the initialization sequence was ill-formed,
708 bool Diagnose(Sema &S,
709 const InitializedEntity &Entity,
710 const InitializationKind &Kind,
711 Expr **Args, unsigned NumArgs);
713 /// \brief Determine the kind of initialization sequence computed.
714 enum SequenceKind getKind() const { return SequenceKind; }
716 /// \brief Set the kind of sequence computed.
717 void setSequenceKind(enum SequenceKind SK) { SequenceKind = SK; }
719 /// \brief Determine whether the initialization sequence is valid.
720 operator bool() const { return !Failed(); }
722 /// \brief Determine whether the initialization sequence is invalid.
723 bool Failed() const { return SequenceKind == FailedSequence; }
725 typedef llvm::SmallVector<Step, 4>::const_iterator step_iterator;
726 step_iterator step_begin() const { return Steps.begin(); }
727 step_iterator step_end() const { return Steps.end(); }
729 /// \brief Determine whether this initialization is a direct reference
730 /// binding (C++ [dcl.init.ref]).
731 bool isDirectReferenceBinding() const;
733 /// \brief Determine whether this initialization failed due to an ambiguity.
734 bool isAmbiguous() const;
736 /// \brief Determine whether this initialization is direct call to a
738 bool isConstructorInitialization() const;
740 /// \brief Add a new step in the initialization that resolves the address
741 /// of an overloaded function to a specific function declaration.
743 /// \param Function the function to which the overloaded function reference
745 void AddAddressOverloadResolutionStep(FunctionDecl *Function,
746 DeclAccessPair Found);
748 /// \brief Add a new step in the initialization that performs a derived-to-
751 /// \param BaseType the base type to which we will be casting.
753 /// \param IsLValue true if the result of this cast will be treated as
755 void AddDerivedToBaseCastStep(QualType BaseType,
756 ExprValueKind Category);
758 /// \brief Add a new step binding a reference to an object.
760 /// \param BindingTemporary True if we are binding a reference to a temporary
761 /// object (thereby extending its lifetime); false if we are binding to an
762 /// lvalue or an lvalue treated as an rvalue.
764 /// \param UnnecessaryCopy True if we should check for a copy
765 /// constructor for a completely unnecessary but
766 void AddReferenceBindingStep(QualType T, bool BindingTemporary);
768 /// \brief Add a new step that makes an extraneous copy of the input
769 /// to a temporary of the same class type.
771 /// This extraneous copy only occurs during reference binding in
772 /// C++98/03, where we are permitted (but not required) to introduce
773 /// an extra copy. At a bare minimum, we must check that we could
774 /// call the copy constructor, and produce a diagnostic if the copy
775 /// constructor is inaccessible or no copy constructor matches.
777 /// \param T The type of the temporary being created.
778 void AddExtraneousCopyToTemporary(QualType T);
780 /// \brief Add a new step invoking a conversion function, which is either
781 /// a constructor or a conversion function.
782 void AddUserConversionStep(FunctionDecl *Function,
783 DeclAccessPair FoundDecl,
786 /// \brief Add a new step that performs a qualification conversion to the
788 void AddQualificationConversionStep(QualType Ty,
789 ExprValueKind Category);
791 /// \brief Add a new step that applies an implicit conversion sequence.
792 void AddConversionSequenceStep(const ImplicitConversionSequence &ICS,
795 /// \brief Add a list-initialiation step
796 void AddListInitializationStep(QualType T);
798 /// \brief Add a constructor-initialization step.
799 void AddConstructorInitializationStep(CXXConstructorDecl *Constructor,
800 AccessSpecifier Access,
803 /// \brief Add a zero-initialization step.
804 void AddZeroInitializationStep(QualType T);
806 /// \brief Add a C assignment step.
808 // FIXME: It isn't clear whether this should ever be needed;
809 // ideally, we would handle everything needed in C in the common
810 // path. However, that isn't the case yet.
811 void AddCAssignmentStep(QualType T);
813 /// \brief Add a string init step.
814 void AddStringInitStep(QualType T);
816 /// \brief Add an Objective-C object conversion step, which is
818 void AddObjCObjectConversionStep(QualType T);
820 /// \brief Add an array initialization step.
821 void AddArrayInitStep(QualType T);
823 /// \brief Add a step to pass an object by indirect copy-restore.
824 void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy);
826 /// \brief Add a step to "produce" an Objective-C object (by
828 void AddProduceObjCObjectStep(QualType T);
830 /// \brief Note that this initialization sequence failed.
831 void SetFailed(FailureKind Failure) {
832 SequenceKind = FailedSequence;
833 this->Failure = Failure;
836 /// \brief Note that this initialization sequence failed due to failed
837 /// overload resolution.
838 void SetOverloadFailure(FailureKind Failure, OverloadingResult Result);
840 /// \brief Retrieve a reference to the candidate set when overload
841 /// resolution fails.
842 OverloadCandidateSet &getFailedCandidateSet() {
843 return FailedCandidateSet;
846 /// brief Get the overloading result, for when the initialization
847 /// sequence failed due to a bad overload.
848 OverloadingResult getFailedOverloadResult() const {
849 return FailedOverloadResult;
852 /// \brief Determine why initialization failed.
853 FailureKind getFailureKind() const {
854 assert(Failed() && "Not an initialization failure!");
858 /// \brief Dump a representation of this initialization sequence to
859 /// the given stream, for debugging purposes.
860 void dump(llvm::raw_ostream &OS) const;
862 /// \brief Dump a representation of this initialization sequence to
863 /// standard error, for debugging purposes.
867 } // end namespace clang
869 #endif // LLVM_CLANG_SEMA_INITIALIZATION_H