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