Initialization.h revision 7cc58b4c927fca539d43eaa58e00dca95946eb7c
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===--- SemaInit.h - Semantic Analysis for Initializers --------*- C++ -*-===// 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// The LLVM Compiler Infrastructure 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file is distributed under the University of Illinois Open Source 659d709d503bab6e2b61931737e662dd293b40578ccornelius// License. See LICENSE.TXT for details. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===// 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file provides supporting data types for initialization of objects. 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//===----------------------------------------------------------------------===// 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef LLVM_CLANG_SEMA_INITIALIZATION_H 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LLVM_CLANG_SEMA_INITIALIZATION_H 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "clang/Sema/Ownership.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "clang/Sema/Overload.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "clang/AST/Type.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "clang/AST/UnresolvedSet.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "clang/Basic/SourceLocation.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "llvm/ADT/PointerIntPair.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "llvm/ADT/SmallVector.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <cassert> 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace clang { 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass CXXBaseSpecifier; 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass DeclaratorDecl; 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass DeclaratorInfo; 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass FieldDecl; 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass FunctionDecl; 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ParmVarDecl; 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Sema; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TypeLoc; 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass VarDecl; 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// \brief Describes an entity that is being initialized. 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass InitializedEntity { 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Specifies the kind of entity being initialized. 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum EntityKind { 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is a variable. 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Variable, 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is a function parameter. 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Parameter, 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is the result of a function call. 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Result, 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is an exception object that 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// is being thrown. 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Exception, 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is a non-static data member 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// subobject. 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Member, 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is an element of an array. 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_ArrayElement, 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is an object (or array of 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// objects) allocated via new. 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_New, 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is a temporary object. 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Temporary, 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is a base member subobject. 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Base, 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The initialization is being done by a delegating constructor. 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_Delegating, 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is an element of a vector. 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// or vector. 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_VectorElement, 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The entity being initialized is a field of block descriptor for 6954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /// the copied-in c++ object. 7054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius EK_BlockElement, 7154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /// \brief The entity being initialized is the real or imaginary part of a 7254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /// complex number. 7359d709d503bab6e2b61931737e662dd293b40578ccornelius EK_ComplexElement 7459d709d503bab6e2b61931737e662dd293b40578ccornelius }; 7559d709d503bab6e2b61931737e662dd293b40578ccornelius 7659d709d503bab6e2b61931737e662dd293b40578ccorneliusprivate: 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The kind of entity being initialized. 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EntityKind Kind; 7954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 8054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /// \brief If non-NULL, the parent entity in which this 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initialization occurs. 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity *Parent; 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The type of the object or reference being initialized. 8527f654740f2a26ad62a5c155af9199af9e69b889claireho QualType Type; 8627f654740f2a26ad62a5c155af9199af9e69b889claireho 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho union { 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /// \brief When Kind == EK_Variable or EK_Member, the VarDecl or 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /// FieldDecl, respectively. 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho DeclaratorDecl *VariableOrMember; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind == EK_Parameter, the ParmVarDecl, with the 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// low bit indicating whether the parameter is "consumed". 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uintptr_t Parameter; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind == EK_Temporary, the type source information for 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the temporary. 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeSourceInfo *TypeInfo; 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct { 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind == EK_Result, EK_Exception, or EK_New, the 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// location of the 'return', 'throw', or 'new' keyword, 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// respectively. When Kind == EK_Temporary, the location where 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the temporary is being created. 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned Location; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Whether the entity being initialized may end up using the 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// named return value optimization (NRVO). 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool NRVO; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } LocAndNRVO; 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind == EK_Base, the base specifier that provides the 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// base class. The lower bit specifies whether the base is an inherited 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// virtual base. 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uintptr_t Base; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind == EK_ArrayElement, EK_VectorElement, or 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// EK_ComplexElement, the index of the array or vector element being 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initialized. 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned Index; 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity() { } 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a variable. 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity(VarDecl *Var) 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : Kind(EK_Variable), Parent(0), Type(Var->getType()), 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru VariableOrMember(Var) { } 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for the result of a 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// function, throwing an object, performing an explicit cast, or 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initializing a parameter for which there is no declaration. 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity(EntityKind Kind, SourceLocation Loc, QualType Type, 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool NRVO = false) 135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho : Kind(Kind), Parent(0), Type(Type) 136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocAndNRVO.Location = Loc.getRawEncoding(); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LocAndNRVO.NRVO = NRVO; 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a member subobject. 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent) 143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho : Kind(EK_Member), Parent(Parent), Type(Member->getType()), 14454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius VariableOrMember(Member) { } 14554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 14654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /// \brief Create the initialization entity for an array element. 14759d709d503bab6e2b61931737e662dd293b40578ccornelius InitializedEntity(ASTContext &Context, unsigned Index, 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity &Parent); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a variable. 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeVariable(VarDecl *Var) { 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(Var); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a parameter. 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeParameter(ASTContext &Context, 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParmVarDecl *Parm) { 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool Consumed = (Context.getLangOptions().ObjCAutoRefCount && 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Parm->hasAttr<NSConsumedAttr>()); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity Entity; 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Kind = EK_Parameter; 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Type = Context.getVariableArrayDecayedType( 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Parm->getType().getUnqualifiedType()); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Parent = 0; 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Parameter 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = (static_cast<uintptr_t>(Consumed) | reinterpret_cast<uintptr_t>(Parm)); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Entity; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a parameter that is 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// only known by its type. 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeParameter(ASTContext &Context, 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType Type, 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool Consumed) { 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity Entity; 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Kind = EK_Parameter; 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Type = Context.getVariableArrayDecayedType(Type); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Parent = 0; 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Entity.Parameter = (Consumed); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Entity; 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for the result of a function. 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeResult(SourceLocation ReturnLoc, 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType Type, bool NRVO) { 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(EK_Result, ReturnLoc, Type, NRVO); 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeBlock(SourceLocation BlockVarLoc, 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType Type, bool NRVO) { 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(EK_BlockElement, BlockVarLoc, Type, NRVO); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for an exception object. 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeException(SourceLocation ThrowLoc, 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType Type, bool NRVO) { 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(EK_Exception, ThrowLoc, Type, NRVO); 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for an object allocated via new. 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeNew(SourceLocation NewLoc, QualType Type) { 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(EK_New, NewLoc, Type); 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a temporary. 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeTemporary(QualType Type) { 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(EK_Temporary, SourceLocation(), Type); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a temporary. 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeTemporary(TypeSourceInfo *TypeInfo) { 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializedEntity Result(EK_Temporary, SourceLocation(), 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeInfo->getType()); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Result.TypeInfo = TypeInfo; 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Result; 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a base class subobject. 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeBase(ASTContext &Context, 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CXXBaseSpecifier *Base, 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool IsInheritedVirtualBase); 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a delegated constructor. 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeDelegation(QualType Type) { 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(EK_Delegating, SourceLocation(), Type); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a member subobject. 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeMember(FieldDecl *Member, 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity *Parent = 0) { 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(Member, Parent); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for a member subobject. 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeMember(IndirectFieldDecl *Member, 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity *Parent = 0) { 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(Member->getAnonField(), Parent); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create the initialization entity for an array element. 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializedEntity InitializeElement(ASTContext &Context, 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned Index, 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity &Parent) { 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializedEntity(Context, Index, Parent); 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine the kind of initialization. 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EntityKind getKind() const { return Kind; } 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the parent of the entity being initialized, when 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the initialization itself is occurring within the context of a 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// larger initialization. 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity *getParent() const { return Parent; } 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve type being initialized. 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType getType() const { return Type; } 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve complete type-source information for the object being 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// constructed, if known. 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeSourceInfo *getTypeSourceInfo() const { 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (Kind == EK_Temporary) 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TypeInfo; 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the name of the entity being initialized. 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DeclarationName getName() const; 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the variable, parameter, or field being 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initialized. 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DeclaratorDecl *getDecl() const; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization allows the named return 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// value optimization, which also applies to thrown objects. 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool allowsNRVO() const; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization consumes the 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// parameter. 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isParameterConsumed() const { 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(getKind() == EK_Parameter && "Not a parameter"); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (Parameter & 1); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the base specifier. 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CXXBaseSpecifier *getBaseSpecifier() const { 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(getKind() == EK_Base && "Not a base specifier"); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return reinterpret_cast<CXXBaseSpecifier *>(Base & ~0x1); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Return whether the base is an inherited virtual base. 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isInheritedVirtualBase() const { 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(getKind() == EK_Base && "Not a base specifier"); 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Base & 0x1; 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine the location of the 'return' keyword when initializing 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the result of a function call. 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation getReturnLoc() const { 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(getKind() == EK_Result && "No 'return' location!"); 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return SourceLocation::getFromRawEncoding(LocAndNRVO.Location); 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine the location of the 'throw' keyword when initializing 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// an exception object. 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation getThrowLoc() const { 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(getKind() == EK_Exception && "No 'throw' location!"); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return SourceLocation::getFromRawEncoding(LocAndNRVO.Location); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief If this is already the initializer for an array or vector 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// element, sets the element index. 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void setElementIndex(unsigned Index) { 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(getKind() == EK_ArrayElement || getKind() == EK_VectorElement || 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru EK_ComplexElement); 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->Index = Index; 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// \brief Describes the kind of initialization being performed, along with 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// location information for tokens related to the initialization (equal sign, 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// parentheses). 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass InitializationKind { 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The kind of initialization being performed. 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum InitKind { 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IK_Direct, ///< Direct initialization 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IK_Copy, ///< Copy initialization 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IK_Default, ///< Default initialization 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IK_Value ///< Value initialization 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The kind of initialization that we're storing. 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum StoredInitKind { 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_Direct = IK_Direct, ///< Direct initialization 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_Copy = IK_Copy, ///< Copy initialization 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_Default = IK_Default, ///< Default initialization 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_Value = IK_Value, ///< Value initialization 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_ImplicitValue, ///< Implicit value initialization 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_DirectCast, ///< Direct initialization due to a cast 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Direct initialization due to a C-style cast. 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_DirectCStyleCast, 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Direct initialization due to a functional-style cast. 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SIK_DirectFunctionalCast 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The kind of initialization being performed. 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru StoredInitKind Kind; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The source locations involved in the initialization. 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation Locations[3]; 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializationKind(StoredInitKind Kind, SourceLocation Loc1, 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation Loc2, SourceLocation Loc3) 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : Kind(Kind) 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locations[0] = Loc1; 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locations[1] = Loc2; 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locations[2] = Loc3; 363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a direct initialization. 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateDirect(SourceLocation InitLoc, 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation LParenLoc, 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation RParenLoc) { 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(SIK_Direct, InitLoc, LParenLoc, RParenLoc); 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a direct initialization due to a cast that isn't a C-style 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// or functional cast. 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateCast(SourceRange TypeRange) { 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(SIK_DirectCast, 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeRange.getBegin(), TypeRange.getBegin(), 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeRange.getEnd()); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a direct initialization for a C-style cast. 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateCStyleCast(SourceLocation StartLoc, 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceRange TypeRange) { 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(SIK_DirectCStyleCast, 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru StartLoc, TypeRange.getBegin(), 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeRange.getEnd()); 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a direct initialization for a functional cast. 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateFunctionalCast(SourceRange TypeRange) { 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(SIK_DirectFunctionalCast, 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeRange.getBegin(), TypeRange.getBegin(), 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TypeRange.getEnd()); 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a copy initialization. 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateCopy(SourceLocation InitLoc, 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation EqualLoc) { 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(SIK_Copy, InitLoc, EqualLoc, EqualLoc); 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a default initialization. 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateDefault(SourceLocation InitLoc) { 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(SIK_Default, InitLoc, InitLoc, InitLoc); 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Create a value initialization. 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static InitializationKind CreateValue(SourceLocation InitLoc, 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation LParenLoc, 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation RParenLoc, 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isImplicit = false) { 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return InitializationKind(isImplicit? SIK_ImplicitValue : SIK_Value, 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitLoc, LParenLoc, RParenLoc); 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine the initialization kind. 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitKind getKind() const { 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (Kind > SIK_ImplicitValue) 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return IK_Direct; 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (Kind == SIK_ImplicitValue) 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return IK_Value; 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (InitKind)Kind; 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization is an explicit cast. 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isExplicitCast() const { 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Kind == SIK_DirectCast || 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Kind == SIK_DirectCStyleCast || 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Kind == SIK_DirectFunctionalCast; 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization is a C-style cast. 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isCStyleOrFunctionalCast() const { 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Kind == SIK_DirectCStyleCast || Kind == SIK_DirectFunctionalCast; 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// brief Determine whether this is a C-style cast. 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isCStyleCast() const { 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Kind == SIK_DirectCStyleCast; 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// brief Determine whether this is a functional-style cast. 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isFunctionalCast() const { 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Kind == SIK_DirectFunctionalCast; 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization is an implicit 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// value-initialization, e.g., as occurs during aggregate 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initialization. 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isImplicitValueInit() const { return Kind == SIK_ImplicitValue; } 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the location at which initialization is occurring. 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation getLocation() const { return Locations[0]; } 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the source range that covers the initialization. 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceRange getRange() const { 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return SourceRange(Locations[0], Locations[2]); 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the location of the equal sign for copy initialization 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// (if present). 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceLocation getEqualLoc() const { 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(Kind == SIK_Copy && "Only copy initialization has an '='"); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Locations[1]; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isCopyInit() const { return Kind == SIK_Copy; } 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve the source range containing the locations of the open 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// and closing parentheses for value and direct initializations. 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SourceRange getParenRange() const { 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert((getKind() == IK_Direct || Kind == SIK_Value) && 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Only direct- and value-initialization have parentheses"); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return SourceRange(Locations[1], Locations[2]); 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// \brief Describes the sequence of initializations required to initialize 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/// a given object or reference with a set of arguments. 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass InitializationSequence { 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Describes the kind of initialization sequence computed. 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum SequenceKind { 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief A failed initialization sequence. The failure kind tells what 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// happened. 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FailedSequence = 0, 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief A dependent initialization, which could not be 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// type-checked due to the presence of dependent types or 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// dependently-typed expressions. 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DependentSequence, 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief A normal sequence. 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NormalSequence 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Describes the kind of a particular step in an initialization 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// sequence. 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum StepKind { 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Resolve the address of an overloaded function to a specific 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// function declaration. 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ResolveAddressOfOverloadedFunction, 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a derived-to-base cast, producing an rvalue. 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_CastDerivedToBaseRValue, 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a derived-to-base cast, producing an xvalue. 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_CastDerivedToBaseXValue, 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a derived-to-base cast, producing an lvalue. 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_CastDerivedToBaseLValue, 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Reference binding to an lvalue. 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_BindReference, 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Reference binding to a temporary. 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_BindReferenceToTemporary, 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief An optional copy of a temporary object to another 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// temporary object, which is permitted (but not required) by 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// C++98/03 but not C++0x. 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ExtraneousCopyToTemporary, 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a user-defined conversion, either via a conversion 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// function or via a constructor. 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_UserConversion, 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a qualification conversion, producing an rvalue. 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_QualificationConversionRValue, 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a qualification conversion, producing an xvalue. 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_QualificationConversionXValue, 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform a qualification conversion, producing an lvalue. 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_QualificationConversionLValue, 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform an implicit conversion sequence. 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ConversionSequence, 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform list-initialization without a constructor 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ListInitialization, 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform list-initialization with a constructor. 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ListConstructorCall, 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform initialization via a constructor. 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ConstructorInitialization, 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Zero-initialize the object 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ZeroInitialization, 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief C assignment 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_CAssignment, 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Initialization by string 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_StringInit, 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief An initialization that "converts" an Objective-C object 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// (not a point to an object) to another Objective-C object type. 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ObjCObjectConversion, 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Array initialization (from an array rvalue). 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// This is a GNU C extension. 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ArrayInit, 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Pass an object by indirect copy-and-restore. 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_PassByIndirectCopyRestore, 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Pass an object by indirect restore. 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_PassByIndirectRestore, 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Produce an Objective-C object pointer. 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SK_ProduceObjCObject 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief A single step in the initialization sequence. 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru class Step { 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public: 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The kind of conversion or initialization step we are taking. 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru StepKind Kind; 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // \brief The type that results from this initialization. 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType Type; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru union { 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind == SK_ResolvedOverloadedFunction or Kind == 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// SK_UserConversion, the function that the expression should be 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// resolved to or the conversion function to call, respectively. 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// When Kind == SK_ConstructorInitialization or SK_ListConstruction, 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the constructor to be called. 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// Always a FunctionDecl, plus a Boolean flag telling if it was 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// selected from an overloaded set having size greater than 1. 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// For conversion decls, the naming class is the source type. 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// For construct decls, the naming class is the target type. 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct { 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool HadMultipleCandidates; 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FunctionDecl *Function; 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DeclAccessPair FoundDecl; 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } Function; 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief When Kind = SK_ConversionSequence, the implicit conversion 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// sequence 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ImplicitConversionSequence *ICS; 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void Destroy(); 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The kind of initialization sequence computed. 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum SequenceKind SequenceKind; 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Steps taken by this initialization. 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SmallVector<Step, 4> Steps; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Describes why initialization failed. 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum FailureKind { 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Too many initializers provided for a reference. 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_TooManyInitsForReference, 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Array must be initialized with an initializer list. 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ArrayNeedsInitList, 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Array must be initialized with an initializer list or a 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// string literal. 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ArrayNeedsInitListOrStringLiteral, 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Array type mismatch. 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ArrayTypeMismatch, 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Non-constant array initializer 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_NonConstantArrayInit, 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Cannot resolve the address of an overloaded function. 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_AddressOfOverloadFailed, 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Overloading due to reference initialization failed. 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ReferenceInitOverloadFailed, 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Non-const lvalue reference binding to a temporary. 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_NonConstLValueReferenceBindingToTemporary, 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Non-const lvalue reference binding to an lvalue of unrelated 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// type. 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_NonConstLValueReferenceBindingToUnrelated, 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Rvalue reference binding to an lvalue. 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_RValueReferenceBindingToLValue, 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Reference binding drops qualifiers. 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ReferenceInitDropsQualifiers, 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Reference binding failed. 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ReferenceInitFailed, 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Implicit conversion failed. 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ConversionFailed, 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Implicit conversion failed. 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ConversionFromPropertyFailed, 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Too many initializers for scalar 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_TooManyInitsForScalar, 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Reference initialization from an initializer list 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ReferenceBindingToInitList, 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Initialization of some unused destination type with an 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initializer list. 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_InitListBadDestinationType, 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Overloading for a user-defined conversion failed. 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_UserConversionOverloadFailed, 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Overloaded for initialization by constructor failed. 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ConstructorOverloadFailed, 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Default-initialization of a 'const' object. 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_DefaultInitOfConst, 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Initialization of an incomplete type. 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_Incomplete, 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief List initialization failed at some point. 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FK_ListInitializationFailed 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The reason why initialization failed. 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FailureKind Failure; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The failed result of overload resolution. 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OverloadingResult FailedOverloadResult; 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief The candidate set created when initialization failed. 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OverloadCandidateSet FailedCandidateSet; 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 65859d709d503bab6e2b61931737e662dd293b40578ccornelius /// \brief Prints a follow-up note that highlights the location of 65959d709d503bab6e2b61931737e662dd293b40578ccornelius /// the initialized entity, if it's remote. 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void PrintInitLocationNote(Sema &S, const InitializedEntity &Entity); 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Try to perform initialization of the given entity, creating a 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// record of the steps required to perform the initialization. 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// The generated initialization sequence will either contain enough 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// information to diagnose 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param S the semantic analysis object. 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param Entity the entity being initialized. 67259d709d503bab6e2b61931737e662dd293b40578ccornelius /// 67359d709d503bab6e2b61931737e662dd293b40578ccornelius /// \param Kind the kind of initialization being performed. 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param Args the argument(s) provided for initialization. 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param NumArgs the number of arguments provided for initialization. 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru InitializationSequence(Sema &S, 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity &Entity, 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializationKind &Kind, 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Expr **Args, 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned NumArgs); 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ~InitializationSequence(); 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Perform the actual initialization of the given entity based on 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the computed initialization sequence. 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param S the semantic analysis object. 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param Entity the entity being initialized. 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param Kind the kind of initialization being performed. 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param Args the argument(s) provided for initialization, ownership of 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// which is transferred into the routine. 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param ResultType if non-NULL, will be set to the type of the 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// initialized object, which is the type of the declaration in most 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// cases. However, when the initialized object is a variable of 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// incomplete array type and the initializer is an initializer 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// list, this type will be set to the completed array type. 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \returns an expression that performs the actual object initialization, if 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the initialization is well-formed. Otherwise, emits diagnostics 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// and returns an invalid expression. 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ExprResult Perform(Sema &S, 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity &Entity, 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializationKind &Kind, 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MultiExprArg Args, 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType *ResultType = 0); 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Diagnose an potentially-invalid initialization sequence. 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \returns true if the initialization sequence was ill-formed, 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// false otherwise. 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool Diagnose(Sema &S, 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializedEntity &Entity, 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const InitializationKind &Kind, 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Expr **Args, unsigned NumArgs); 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine the kind of initialization sequence computed. 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum SequenceKind getKind() const { return SequenceKind; } 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Set the kind of sequence computed. 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void setSequenceKind(enum SequenceKind SK) { SequenceKind = SK; } 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether the initialization sequence is valid. 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru operator bool() const { return !Failed(); } 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether the initialization sequence is invalid. 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool Failed() const { return SequenceKind == FailedSequence; } 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru typedef SmallVector<Step, 4>::const_iterator step_iterator; 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru step_iterator step_begin() const { return Steps.begin(); } 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru step_iterator step_end() const { return Steps.end(); } 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization is a direct reference 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// binding (C++ [dcl.init.ref]). 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isDirectReferenceBinding() const; 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization failed due to an ambiguity. 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isAmbiguous() const; 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine whether this initialization is direct call to a 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// constructor. 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool isConstructorInitialization() const; 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Returns whether the last step in this initialization sequence is a 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// narrowing conversion, defined by C++0x [dcl.init.list]p7. 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// If this function returns true, *isInitializerConstant will be set to 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// describe whether *Initializer was a constant expression. If 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// *isInitializerConstant is set to true, *ConstantValue will be set to the 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// evaluated value of *Initializer. 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool endsWithNarrowing(ASTContext &Ctx, const Expr *Initializer, 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool *isInitializerConstant, 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru APValue *ConstantValue) const; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step in the initialization that resolves the address 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// of an overloaded function to a specific function declaration. 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param Function the function to which the overloaded function reference 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// resolves. 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddAddressOverloadResolutionStep(FunctionDecl *Function, 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DeclAccessPair Found); 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step in the initialization that performs a derived-to- 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// base cast. 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param BaseType the base type to which we will be casting. 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param IsLValue true if the result of this cast will be treated as 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// an lvalue. 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddDerivedToBaseCastStep(QualType BaseType, 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ExprValueKind Category); 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step binding a reference to an object. 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param BindingTemporary True if we are binding a reference to a temporary 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// object (thereby extending its lifetime); false if we are binding to an 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// lvalue or an lvalue treated as an rvalue. 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param UnnecessaryCopy True if we should check for a copy 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// constructor for a completely unnecessary but 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddReferenceBindingStep(QualType T, bool BindingTemporary); 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step that makes an extraneous copy of the input 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// to a temporary of the same class type. 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// This extraneous copy only occurs during reference binding in 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// C++98/03, where we are permitted (but not required) to introduce 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// an extra copy. At a bare minimum, we must check that we could 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// call the copy constructor, and produce a diagnostic if the copy 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// constructor is inaccessible or no copy constructor matches. 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \param T The type of the temporary being created. 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddExtraneousCopyToTemporary(QualType T); 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step invoking a conversion function, which is either 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// a constructor or a conversion function. 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddUserConversionStep(FunctionDecl *Function, 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DeclAccessPair FoundDecl, 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType T); 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step that performs a qualification conversion to the 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// given type. 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddQualificationConversionStep(QualType Ty, 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ExprValueKind Category); 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a new step that applies an implicit conversion sequence. 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddConversionSequenceStep(const ImplicitConversionSequence &ICS, 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType T); 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a list-initialiation step. 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddListInitializationStep(QualType T); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a constructor-initialization step. 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddConstructorInitializationStep(CXXConstructorDecl *Constructor, 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AccessSpecifier Access, 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QualType T); 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a zero-initialization step. 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddZeroInitializationStep(QualType T); 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a C assignment step. 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // FIXME: It isn't clear whether this should ever be needed; 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ideally, we would handle everything needed in C in the common 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // path. However, that isn't the case yet. 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddCAssignmentStep(QualType T); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a string init step. 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddStringInitStep(QualType T); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add an Objective-C object conversion step, which is 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// always a no-op. 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddObjCObjectConversionStep(QualType T); 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add an array initialization step. 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddArrayInitStep(QualType T); 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a step to pass an object by indirect copy-restore. 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddPassByIndirectCopyRestoreStep(QualType T, bool shouldCopy); 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Add a step to "produce" an Objective-C object (by 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// retaining it). 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void AddProduceObjCObjectStep(QualType T); 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Note that this initialization sequence failed. 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void SetFailed(FailureKind Failure) { 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SequenceKind = FailedSequence; 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->Failure = Failure; 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Note that this initialization sequence failed due to failed 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// overload resolution. 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void SetOverloadFailure(FailureKind Failure, OverloadingResult Result); 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Retrieve a reference to the candidate set when overload 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// resolution fails. 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OverloadCandidateSet &getFailedCandidateSet() { 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FailedCandidateSet; 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// brief Get the overloading result, for when the initialization 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// sequence failed due to a bad overload. 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OverloadingResult getFailedOverloadResult() const { 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FailedOverloadResult; 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Determine why initialization failed. 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FailureKind getFailureKind() const { 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(Failed() && "Not an initialization failure!"); 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Failure; 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Dump a representation of this initialization sequence to 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// the given stream, for debugging purposes. 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void dump(raw_ostream &OS) const; 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// \brief Dump a representation of this initialization sequence to 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /// standard error, for debugging purposes. 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void dump() const; 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} // end namespace clang 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif // LLVM_CLANG_SEMA_INITIALIZATION_H 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru