Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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, false, 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, Implicit, 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(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(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(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(Type, 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(Loc);
  714.     if (!DirectInit)
  715.       return CreateCopy(Loc, Init->getBeginLoc());
  716.     if (isa<InitListExpr>(Init))
  717.       return CreateDirectList(Loc, Init->getBeginLoc(), Init->getEndLoc());
  718.     return CreateDirect(Loc, Init->getBeginLoc(), 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.     SK_ExtraneousCopyToTemporary,
  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.  
  1126. private:
  1127.   /// The reason why initialization failed.
  1128.   FailureKind Failure;
  1129.  
  1130.   /// The failed result of overload resolution.
  1131.   OverloadingResult FailedOverloadResult;
  1132.  
  1133.   /// The candidate set created when initialization failed.
  1134.   OverloadCandidateSet FailedCandidateSet;
  1135.  
  1136.   /// The incomplete type that caused a failure.
  1137.   QualType FailedIncompleteType;
  1138.  
  1139.   /// The fixit that needs to be applied to make this initialization
  1140.   /// succeed.
  1141.   std::string ZeroInitializationFixit;
  1142.   SourceLocation ZeroInitializationFixitLoc;
  1143.  
  1144. public:
  1145.   /// Call for initializations are invalid but that would be valid
  1146.   /// zero initialzations if Fixit was applied.
  1147.   void SetZeroInitializationFixit(const std::string& Fixit, SourceLocation L) {
  1148.     ZeroInitializationFixit = Fixit;
  1149.     ZeroInitializationFixitLoc = L;
  1150.   }
  1151.  
  1152. private:
  1153.   /// Prints a follow-up note that highlights the location of
  1154.   /// the initialized entity, if it's remote.
  1155.   void PrintInitLocationNote(Sema &S, const InitializedEntity &Entity);
  1156.  
  1157. public:
  1158.   /// Try to perform initialization of the given entity, creating a
  1159.   /// record of the steps required to perform the initialization.
  1160.   ///
  1161.   /// The generated initialization sequence will either contain enough
  1162.   /// information to diagnose
  1163.   ///
  1164.   /// \param S the semantic analysis object.
  1165.   ///
  1166.   /// \param Entity the entity being initialized.
  1167.   ///
  1168.   /// \param Kind the kind of initialization being performed.
  1169.   ///
  1170.   /// \param Args the argument(s) provided for initialization.
  1171.   ///
  1172.   /// \param TopLevelOfInitList true if we are initializing from an expression
  1173.   ///        at the top level inside an initializer list. This disallows
  1174.   ///        narrowing conversions in C++11 onwards.
  1175.   /// \param TreatUnavailableAsInvalid true if we want to treat unavailable
  1176.   ///        as invalid.
  1177.   InitializationSequence(Sema &S,
  1178.                          const InitializedEntity &Entity,
  1179.                          const InitializationKind &Kind,
  1180.                          MultiExprArg Args,
  1181.                          bool TopLevelOfInitList = false,
  1182.                          bool TreatUnavailableAsInvalid = true);
  1183.   void InitializeFrom(Sema &S, const InitializedEntity &Entity,
  1184.                       const InitializationKind &Kind, MultiExprArg Args,
  1185.                       bool TopLevelOfInitList, bool TreatUnavailableAsInvalid);
  1186.  
  1187.   ~InitializationSequence();
  1188.  
  1189.   /// Perform the actual initialization of the given entity based on
  1190.   /// the computed initialization sequence.
  1191.   ///
  1192.   /// \param S the semantic analysis object.
  1193.   ///
  1194.   /// \param Entity the entity being initialized.
  1195.   ///
  1196.   /// \param Kind the kind of initialization being performed.
  1197.   ///
  1198.   /// \param Args the argument(s) provided for initialization, ownership of
  1199.   /// which is transferred into the routine.
  1200.   ///
  1201.   /// \param ResultType if non-NULL, will be set to the type of the
  1202.   /// initialized object, which is the type of the declaration in most
  1203.   /// cases. However, when the initialized object is a variable of
  1204.   /// incomplete array type and the initializer is an initializer
  1205.   /// list, this type will be set to the completed array type.
  1206.   ///
  1207.   /// \returns an expression that performs the actual object initialization, if
  1208.   /// the initialization is well-formed. Otherwise, emits diagnostics
  1209.   /// and returns an invalid expression.
  1210.   ExprResult Perform(Sema &S,
  1211.                      const InitializedEntity &Entity,
  1212.                      const InitializationKind &Kind,
  1213.                      MultiExprArg Args,
  1214.                      QualType *ResultType = nullptr);
  1215.  
  1216.   /// Diagnose an potentially-invalid initialization sequence.
  1217.   ///
  1218.   /// \returns true if the initialization sequence was ill-formed,
  1219.   /// false otherwise.
  1220.   bool Diagnose(Sema &S,
  1221.                 const InitializedEntity &Entity,
  1222.                 const InitializationKind &Kind,
  1223.                 ArrayRef<Expr *> Args);
  1224.  
  1225.   /// Determine the kind of initialization sequence computed.
  1226.   enum SequenceKind getKind() const { return SequenceKind; }
  1227.  
  1228.   /// Set the kind of sequence computed.
  1229.   void setSequenceKind(enum SequenceKind SK) { SequenceKind = SK; }
  1230.  
  1231.   /// Determine whether the initialization sequence is valid.
  1232.   explicit operator bool() const { return !Failed(); }
  1233.  
  1234.   /// Determine whether the initialization sequence is invalid.
  1235.   bool Failed() const { return SequenceKind == FailedSequence; }
  1236.  
  1237.   using step_iterator = SmallVectorImpl<Step>::const_iterator;
  1238.  
  1239.   step_iterator step_begin() const { return Steps.begin(); }
  1240.   step_iterator step_end()   const { return Steps.end(); }
  1241.  
  1242.   using step_range = llvm::iterator_range<step_iterator>;
  1243.  
  1244.   step_range steps() const { return {step_begin(), step_end()}; }
  1245.  
  1246.   /// Determine whether this initialization is a direct reference
  1247.   /// binding (C++ [dcl.init.ref]).
  1248.   bool isDirectReferenceBinding() const;
  1249.  
  1250.   /// Determine whether this initialization failed due to an ambiguity.
  1251.   bool isAmbiguous() const;
  1252.  
  1253.   /// Determine whether this initialization is direct call to a
  1254.   /// constructor.
  1255.   bool isConstructorInitialization() const;
  1256.  
  1257.   /// Add a new step in the initialization that resolves the address
  1258.   /// of an overloaded function to a specific function declaration.
  1259.   ///
  1260.   /// \param Function the function to which the overloaded function reference
  1261.   /// resolves.
  1262.   void AddAddressOverloadResolutionStep(FunctionDecl *Function,
  1263.                                         DeclAccessPair Found,
  1264.                                         bool HadMultipleCandidates);
  1265.  
  1266.   /// Add a new step in the initialization that performs a derived-to-
  1267.   /// base cast.
  1268.   ///
  1269.   /// \param BaseType the base type to which we will be casting.
  1270.   ///
  1271.   /// \param Category Indicates whether the result will be treated as an
  1272.   /// rvalue, an xvalue, or an lvalue.
  1273.   void AddDerivedToBaseCastStep(QualType BaseType,
  1274.                                 ExprValueKind Category);
  1275.  
  1276.   /// Add a new step binding a reference to an object.
  1277.   ///
  1278.   /// \param BindingTemporary True if we are binding a reference to a temporary
  1279.   /// object (thereby extending its lifetime); false if we are binding to an
  1280.   /// lvalue or an lvalue treated as an rvalue.
  1281.   void AddReferenceBindingStep(QualType T, bool BindingTemporary);
  1282.  
  1283.   /// Add a new step that makes an extraneous copy of the input
  1284.   /// to a temporary of the same class type.
  1285.   ///
  1286.   /// This extraneous copy only occurs during reference binding in
  1287.   /// C++98/03, where we are permitted (but not required) to introduce
  1288.   /// an extra copy. At a bare minimum, we must check that we could
  1289.   /// call the copy constructor, and produce a diagnostic if the copy
  1290.   /// constructor is inaccessible or no copy constructor matches.
  1291.   //
  1292.   /// \param T The type of the temporary being created.
  1293.   void AddExtraneousCopyToTemporary(QualType T);
  1294.  
  1295.   /// Add a new step that makes a copy of the input to an object of
  1296.   /// the given type, as the final step in class copy-initialization.
  1297.   void AddFinalCopy(QualType T);
  1298.  
  1299.   /// Add a new step invoking a conversion function, which is either
  1300.   /// a constructor or a conversion function.
  1301.   void AddUserConversionStep(FunctionDecl *Function,
  1302.                              DeclAccessPair FoundDecl,
  1303.                              QualType T,
  1304.                              bool HadMultipleCandidates);
  1305.  
  1306.   /// Add a new step that performs a qualification conversion to the
  1307.   /// given type.
  1308.   void AddQualificationConversionStep(QualType Ty,
  1309.                                      ExprValueKind Category);
  1310.  
  1311.   /// Add a new step that performs a function reference conversion to the
  1312.   /// given type.
  1313.   void AddFunctionReferenceConversionStep(QualType Ty);
  1314.  
  1315.   /// Add a new step that performs conversion from non-atomic to atomic
  1316.   /// type.
  1317.   void AddAtomicConversionStep(QualType Ty);
  1318.  
  1319.   /// Add a new step that applies an implicit conversion sequence.
  1320.   void AddConversionSequenceStep(const ImplicitConversionSequence &ICS,
  1321.                                  QualType T, bool TopLevelOfInitList = false);
  1322.  
  1323.   /// Add a list-initialization step.
  1324.   void AddListInitializationStep(QualType T);
  1325.  
  1326.   /// Add a constructor-initialization step.
  1327.   ///
  1328.   /// \param FromInitList The constructor call is syntactically an initializer
  1329.   /// list.
  1330.   /// \param AsInitList The constructor is called as an init list constructor.
  1331.   void AddConstructorInitializationStep(DeclAccessPair FoundDecl,
  1332.                                         CXXConstructorDecl *Constructor,
  1333.                                         QualType T,
  1334.                                         bool HadMultipleCandidates,
  1335.                                         bool FromInitList, bool AsInitList);
  1336.  
  1337.   /// Add a zero-initialization step.
  1338.   void AddZeroInitializationStep(QualType T);
  1339.  
  1340.   /// Add a C assignment step.
  1341.   //
  1342.   // FIXME: It isn't clear whether this should ever be needed;
  1343.   // ideally, we would handle everything needed in C in the common
  1344.   // path. However, that isn't the case yet.
  1345.   void AddCAssignmentStep(QualType T);
  1346.  
  1347.   /// Add a string init step.
  1348.   void AddStringInitStep(QualType T);
  1349.  
  1350.   /// Add an Objective-C object conversion step, which is
  1351.   /// always a no-op.
  1352.   void AddObjCObjectConversionStep(QualType T);
  1353.  
  1354.   /// Add an array initialization loop step.
  1355.   void AddArrayInitLoopStep(QualType T, QualType EltTy);
  1356.  
  1357.   /// Add an array initialization step.
  1358.   void AddArrayInitStep(QualType T, bool IsGNUExtension);
  1359.  
  1360.   /// Add a parenthesized array initialization step.
  1361.   void AddParenthesizedArrayInitStep(QualType T);
  1362.  
  1363.   /// Add a step to pass an object by indirect copy-restore.
  1364.   void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy);
  1365.  
  1366.   /// Add a step to "produce" an Objective-C object (by
  1367.   /// retaining it).
  1368.   void AddProduceObjCObjectStep(QualType T);
  1369.  
  1370.   /// Add a step to construct a std::initializer_list object from an
  1371.   /// initializer list.
  1372.   void AddStdInitializerListConstructionStep(QualType T);
  1373.  
  1374.   /// Add a step to initialize an OpenCL sampler from an integer
  1375.   /// constant.
  1376.   void AddOCLSamplerInitStep(QualType T);
  1377.  
  1378.   /// Add a step to initialzie an OpenCL opaque type (event_t, queue_t, etc.)
  1379.   /// from a zero constant.
  1380.   void AddOCLZeroOpaqueTypeStep(QualType T);
  1381.  
  1382.   void AddParenthesizedListInitStep(QualType T);
  1383.  
  1384.   /// Add steps to unwrap a initializer list for a reference around a
  1385.   /// single element and rewrap it at the end.
  1386.   void RewrapReferenceInitList(QualType T, InitListExpr *Syntactic);
  1387.  
  1388.   /// Note that this initialization sequence failed.
  1389.   void SetFailed(FailureKind Failure) {
  1390.     SequenceKind = FailedSequence;
  1391.     this->Failure = Failure;
  1392.     assert((Failure != FK_Incomplete || !FailedIncompleteType.isNull()) &&
  1393.            "Incomplete type failure requires a type!");
  1394.   }
  1395.  
  1396.   /// Note that this initialization sequence failed due to failed
  1397.   /// overload resolution.
  1398.   void SetOverloadFailure(FailureKind Failure, OverloadingResult Result);
  1399.  
  1400.   /// Retrieve a reference to the candidate set when overload
  1401.   /// resolution fails.
  1402.   OverloadCandidateSet &getFailedCandidateSet() {
  1403.     return FailedCandidateSet;
  1404.   }
  1405.  
  1406.   /// Get the overloading result, for when the initialization
  1407.   /// sequence failed due to a bad overload.
  1408.   OverloadingResult getFailedOverloadResult() const {
  1409.     return FailedOverloadResult;
  1410.   }
  1411.  
  1412.   /// Note that this initialization sequence failed due to an
  1413.   /// incomplete type.
  1414.   void setIncompleteTypeFailure(QualType IncompleteType) {
  1415.     FailedIncompleteType = IncompleteType;
  1416.     SetFailed(FK_Incomplete);
  1417.   }
  1418.  
  1419.   /// Determine why initialization failed.
  1420.   FailureKind getFailureKind() const {
  1421.     assert(Failed() && "Not an initialization failure!");
  1422.     return Failure;
  1423.   }
  1424.  
  1425.   /// Dump a representation of this initialization sequence to
  1426.   /// the given stream, for debugging purposes.
  1427.   void dump(raw_ostream &OS) const;
  1428.  
  1429.   /// Dump a representation of this initialization sequence to
  1430.   /// standard error, for debugging purposes.
  1431.   void dump() const;
  1432. };
  1433.  
  1434. } // namespace clang
  1435.  
  1436. #endif // LLVM_CLANG_SEMA_INITIALIZATION_H
  1437.