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