• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
InitializedEntity()123   InitializedEntity() { }
124 
125   /// \brief Create the initialization entity for a variable.
InitializedEntity(VarDecl * Var)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)
Kind(Kind)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.
InitializedEntity(FieldDecl * Member,const InitializedEntity * Parent)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.
InitializeVariable(VarDecl * Var)152   static InitializedEntity InitializeVariable(VarDecl *Var) {
153     return InitializedEntity(Var);
154   }
155 
156   /// \brief Create the initialization entity for a parameter.
InitializeParameter(ASTContext & Context,ParmVarDecl * Parm)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.
InitializeParameter(ASTContext & Context,QualType Type,bool Consumed)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.
InitializeResult(SourceLocation ReturnLoc,QualType Type,bool NRVO)186   static InitializedEntity InitializeResult(SourceLocation ReturnLoc,
187                                             QualType Type, bool NRVO) {
188     return InitializedEntity(EK_Result, ReturnLoc, Type, NRVO);
189   }
190 
InitializeBlock(SourceLocation BlockVarLoc,QualType Type,bool NRVO)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.
InitializeException(SourceLocation ThrowLoc,QualType Type,bool NRVO)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.
InitializeNew(SourceLocation NewLoc,QualType Type)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.
InitializeTemporary(QualType Type)208   static InitializedEntity InitializeTemporary(QualType Type) {
209     return InitializedEntity(EK_Temporary, SourceLocation(), Type);
210   }
211 
212   /// \brief Create the initialization entity for a temporary.
InitializeTemporary(TypeSourceInfo * TypeInfo)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.
InitializeDelegation(QualType Type)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.
InitializeElement(ASTContext & Context,unsigned Index,const InitializedEntity & Parent)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.
getKind()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.
getParent()255   const InitializedEntity *getParent() const { return Parent; }
256 
257   /// \brief Retrieve type being initialized.
getType()258   QualType getType() const { return Type; }
259 
260   /// \brief Retrieve complete type-source information for the object being
261   /// constructed, if known.
getTypeSourceInfo()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.
isParameterConsumed()282   bool isParameterConsumed() const {
283     assert(getKind() == EK_Parameter && "Not a parameter");
284     return (Parameter & 1);
285   }
286 
287   /// \brief Retrieve the base specifier.
getBaseSpecifier()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.
isInheritedVirtualBase()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.
getReturnLoc()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.
getThrowLoc()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.
setElementIndex(unsigned 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 
InitializationKind(StoredInitKind Kind,SourceLocation Loc1,SourceLocation Loc2,SourceLocation Loc3)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.
CreateDirect(SourceLocation InitLoc,SourceLocation LParenLoc,SourceLocation RParenLoc)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.
CreateCast(SourceRange TypeRange)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.
CreateCStyleCast(SourceLocation StartLoc,SourceRange TypeRange)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.
CreateFunctionalCast(SourceRange TypeRange)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.
CreateCopy(SourceLocation InitLoc,SourceLocation EqualLoc)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.
CreateDefault(SourceLocation InitLoc)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.
getKind()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.
isExplicitCast()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.
isCStyleOrFunctionalCast()433   bool isCStyleOrFunctionalCast() const {
434     return Kind == SIK_DirectCStyleCast || Kind == SIK_DirectFunctionalCast;
435   }
436 
437   /// brief Determine whether this is a C-style cast.
isCStyleCast()438   bool isCStyleCast() const {
439     return Kind == SIK_DirectCStyleCast;
440   }
441 
442   /// brief Determine whether this is a functional-style cast.
isFunctionalCast()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.
isImplicitValueInit()450   bool isImplicitValueInit() const { return Kind == SIK_ImplicitValue; }
451 
452   /// \brief Retrieve the location at which initialization is occurring.
getLocation()453   SourceLocation getLocation() const { return Locations[0]; }
454 
455   /// \brief Retrieve the source range that covers the initialization.
getRange()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).
getEqualLoc()462   SourceLocation getEqualLoc() const {
463     assert(Kind == SIK_Copy && "Only copy initialization has an '='");
464     return Locations[1];
465   }
466 
isCopyInit()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.
getParenRange()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.
getKind()714   enum SequenceKind getKind() const { return SequenceKind; }
715 
716   /// \brief Set the kind of sequence computed.
setSequenceKind(enum SequenceKind SK)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.
Failed()723   bool Failed() const { return SequenceKind == FailedSequence; }
724 
725   typedef llvm::SmallVector<Step, 4>::const_iterator step_iterator;
step_begin()726   step_iterator step_begin() const { return Steps.begin(); }
step_end()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.
SetFailed(FailureKind Failure)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.
getFailedCandidateSet()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.
getFailedOverloadResult()848   OverloadingResult getFailedOverloadResult() const {
849     return FailedOverloadResult;
850   }
851 
852   /// \brief Determine why initialization failed.
getFailureKind()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
870