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