• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- DeclCXX.h - Classes for representing C++ declarations -*- 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  /// \file
11  /// \brief Defines the C++ Decl subclasses, other than those for templates
12  /// (found in DeclTemplate.h) and friends (in DeclFriend.h).
13  ///
14  //===----------------------------------------------------------------------===//
15  
16  #ifndef LLVM_CLANG_AST_DECLCXX_H
17  #define LLVM_CLANG_AST_DECLCXX_H
18  
19  #include "clang/AST/ASTUnresolvedSet.h"
20  #include "clang/AST/Attr.h"
21  #include "clang/AST/Decl.h"
22  #include "clang/AST/Expr.h"
23  #include "clang/AST/LambdaCapture.h"
24  #include "llvm/ADT/DenseMap.h"
25  #include "llvm/ADT/PointerIntPair.h"
26  #include "llvm/Support/Compiler.h"
27  
28  namespace clang {
29  
30  class ClassTemplateDecl;
31  class ClassTemplateSpecializationDecl;
32  class CXXBasePath;
33  class CXXBasePaths;
34  class CXXConstructorDecl;
35  class CXXConversionDecl;
36  class CXXDestructorDecl;
37  class CXXMethodDecl;
38  class CXXRecordDecl;
39  class CXXMemberLookupCriteria;
40  class CXXFinalOverriderMap;
41  class CXXIndirectPrimaryBaseSet;
42  class FriendDecl;
43  class LambdaExpr;
44  class UsingDecl;
45  
46  /// \brief Represents any kind of function declaration, whether it is a
47  /// concrete function or a function template.
48  class AnyFunctionDecl {
49    NamedDecl *Function;
50  
AnyFunctionDecl(NamedDecl * ND)51    AnyFunctionDecl(NamedDecl *ND) : Function(ND) { }
52  
53  public:
AnyFunctionDecl(FunctionDecl * FD)54    AnyFunctionDecl(FunctionDecl *FD) : Function(FD) { }
55    AnyFunctionDecl(FunctionTemplateDecl *FTD);
56  
57    /// \brief Implicily converts any function or function template into a
58    /// named declaration.
59    operator NamedDecl *() const { return Function; }
60  
61    /// \brief Retrieve the underlying function or function template.
get()62    NamedDecl *get() const { return Function; }
63  
getFromNamedDecl(NamedDecl * ND)64    static AnyFunctionDecl getFromNamedDecl(NamedDecl *ND) {
65      return AnyFunctionDecl(ND);
66    }
67  };
68  
69  } // end namespace clang
70  
71  namespace llvm {
72    // Provide PointerLikeTypeTraits for non-cvr pointers.
73    template<>
74    class PointerLikeTypeTraits< ::clang::AnyFunctionDecl> {
75    public:
getAsVoidPointer(::clang::AnyFunctionDecl F)76      static inline void *getAsVoidPointer(::clang::AnyFunctionDecl F) {
77        return F.get();
78      }
getFromVoidPointer(void * P)79      static inline ::clang::AnyFunctionDecl getFromVoidPointer(void *P) {
80        return ::clang::AnyFunctionDecl::getFromNamedDecl(
81                                        static_cast< ::clang::NamedDecl*>(P));
82      }
83  
84      enum { NumLowBitsAvailable = 2 };
85    };
86  
87  } // end namespace llvm
88  
89  namespace clang {
90  
91  /// \brief Represents an access specifier followed by colon ':'.
92  ///
93  /// An objects of this class represents sugar for the syntactic occurrence
94  /// of an access specifier followed by a colon in the list of member
95  /// specifiers of a C++ class definition.
96  ///
97  /// Note that they do not represent other uses of access specifiers,
98  /// such as those occurring in a list of base specifiers.
99  /// Also note that this class has nothing to do with so-called
100  /// "access declarations" (C++98 11.3 [class.access.dcl]).
101  class AccessSpecDecl : public Decl {
102    virtual void anchor();
103    /// \brief The location of the ':'.
104    SourceLocation ColonLoc;
105  
AccessSpecDecl(AccessSpecifier AS,DeclContext * DC,SourceLocation ASLoc,SourceLocation ColonLoc)106    AccessSpecDecl(AccessSpecifier AS, DeclContext *DC,
107                   SourceLocation ASLoc, SourceLocation ColonLoc)
108      : Decl(AccessSpec, DC, ASLoc), ColonLoc(ColonLoc) {
109      setAccess(AS);
110    }
AccessSpecDecl(EmptyShell Empty)111    AccessSpecDecl(EmptyShell Empty)
112      : Decl(AccessSpec, Empty) { }
113  public:
114    /// \brief The location of the access specifier.
getAccessSpecifierLoc()115    SourceLocation getAccessSpecifierLoc() const { return getLocation(); }
116    /// \brief Sets the location of the access specifier.
setAccessSpecifierLoc(SourceLocation ASLoc)117    void setAccessSpecifierLoc(SourceLocation ASLoc) { setLocation(ASLoc); }
118  
119    /// \brief The location of the colon following the access specifier.
getColonLoc()120    SourceLocation getColonLoc() const { return ColonLoc; }
121    /// \brief Sets the location of the colon.
setColonLoc(SourceLocation CLoc)122    void setColonLoc(SourceLocation CLoc) { ColonLoc = CLoc; }
123  
getSourceRange()124    SourceRange getSourceRange() const override LLVM_READONLY {
125      return SourceRange(getAccessSpecifierLoc(), getColonLoc());
126    }
127  
Create(ASTContext & C,AccessSpecifier AS,DeclContext * DC,SourceLocation ASLoc,SourceLocation ColonLoc)128    static AccessSpecDecl *Create(ASTContext &C, AccessSpecifier AS,
129                                  DeclContext *DC, SourceLocation ASLoc,
130                                  SourceLocation ColonLoc) {
131      return new (C, DC) AccessSpecDecl(AS, DC, ASLoc, ColonLoc);
132    }
133    static AccessSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID);
134  
135    // Implement isa/cast/dyncast/etc.
classof(const Decl * D)136    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)137    static bool classofKind(Kind K) { return K == AccessSpec; }
138  };
139  
140  
141  /// \brief Represents a base class of a C++ class.
142  ///
143  /// Each CXXBaseSpecifier represents a single, direct base class (or
144  /// struct) of a C++ class (or struct). It specifies the type of that
145  /// base class, whether it is a virtual or non-virtual base, and what
146  /// level of access (public, protected, private) is used for the
147  /// derivation. For example:
148  ///
149  /// \code
150  ///   class A { };
151  ///   class B { };
152  ///   class C : public virtual A, protected B { };
153  /// \endcode
154  ///
155  /// In this code, C will have two CXXBaseSpecifiers, one for "public
156  /// virtual A" and the other for "protected B".
157  class CXXBaseSpecifier {
158    /// \brief The source code range that covers the full base
159    /// specifier, including the "virtual" (if present) and access
160    /// specifier (if present).
161    SourceRange Range;
162  
163    /// \brief The source location of the ellipsis, if this is a pack
164    /// expansion.
165    SourceLocation EllipsisLoc;
166  
167    /// \brief Whether this is a virtual base class or not.
168    bool Virtual : 1;
169  
170    /// \brief Whether this is the base of a class (true) or of a struct (false).
171    ///
172    /// This determines the mapping from the access specifier as written in the
173    /// source code to the access specifier used for semantic analysis.
174    bool BaseOfClass : 1;
175  
176    /// \brief Access specifier as written in the source code (may be AS_none).
177    ///
178    /// The actual type of data stored here is an AccessSpecifier, but we use
179    /// "unsigned" here to work around a VC++ bug.
180    unsigned Access : 2;
181  
182    /// \brief Whether the class contains a using declaration
183    /// to inherit the named class's constructors.
184    bool InheritConstructors : 1;
185  
186    /// \brief The type of the base class.
187    ///
188    /// This will be a class or struct (or a typedef of such). The source code
189    /// range does not include the \c virtual or the access specifier.
190    TypeSourceInfo *BaseTypeInfo;
191  
192  public:
CXXBaseSpecifier()193    CXXBaseSpecifier() { }
194  
CXXBaseSpecifier(SourceRange R,bool V,bool BC,AccessSpecifier A,TypeSourceInfo * TInfo,SourceLocation EllipsisLoc)195    CXXBaseSpecifier(SourceRange R, bool V, bool BC, AccessSpecifier A,
196                     TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
197      : Range(R), EllipsisLoc(EllipsisLoc), Virtual(V), BaseOfClass(BC),
198        Access(A), InheritConstructors(false), BaseTypeInfo(TInfo) { }
199  
200    /// \brief Retrieves the source range that contains the entire base specifier.
getSourceRange()201    SourceRange getSourceRange() const LLVM_READONLY { return Range; }
getLocStart()202    SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
getLocEnd()203    SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
204  
205    /// \brief Determines whether the base class is a virtual base class (or not).
isVirtual()206    bool isVirtual() const { return Virtual; }
207  
208    /// \brief Determine whether this base class is a base of a class declared
209    /// with the 'class' keyword (vs. one declared with the 'struct' keyword).
isBaseOfClass()210    bool isBaseOfClass() const { return BaseOfClass; }
211  
212    /// \brief Determine whether this base specifier is a pack expansion.
isPackExpansion()213    bool isPackExpansion() const { return EllipsisLoc.isValid(); }
214  
215    /// \brief Determine whether this base class's constructors get inherited.
getInheritConstructors()216    bool getInheritConstructors() const { return InheritConstructors; }
217  
218    /// \brief Set that this base class's constructors should be inherited.
219    void setInheritConstructors(bool Inherit = true) {
220      InheritConstructors = Inherit;
221    }
222  
223    /// \brief For a pack expansion, determine the location of the ellipsis.
getEllipsisLoc()224    SourceLocation getEllipsisLoc() const {
225      return EllipsisLoc;
226    }
227  
228    /// \brief Returns the access specifier for this base specifier.
229    ///
230    /// This is the actual base specifier as used for semantic analysis, so
231    /// the result can never be AS_none. To retrieve the access specifier as
232    /// written in the source code, use getAccessSpecifierAsWritten().
getAccessSpecifier()233    AccessSpecifier getAccessSpecifier() const {
234      if ((AccessSpecifier)Access == AS_none)
235        return BaseOfClass? AS_private : AS_public;
236      else
237        return (AccessSpecifier)Access;
238    }
239  
240    /// \brief Retrieves the access specifier as written in the source code
241    /// (which may mean that no access specifier was explicitly written).
242    ///
243    /// Use getAccessSpecifier() to retrieve the access specifier for use in
244    /// semantic analysis.
getAccessSpecifierAsWritten()245    AccessSpecifier getAccessSpecifierAsWritten() const {
246      return (AccessSpecifier)Access;
247    }
248  
249    /// \brief Retrieves the type of the base class.
250    ///
251    /// This type will always be an unqualified class type.
getType()252    QualType getType() const {
253      return BaseTypeInfo->getType().getUnqualifiedType();
254    }
255  
256    /// \brief Retrieves the type and source location of the base class.
getTypeSourceInfo()257    TypeSourceInfo *getTypeSourceInfo() const { return BaseTypeInfo; }
258  };
259  
260  /// \brief A lazy pointer to the definition data for a declaration.
261  /// FIXME: This is a little CXXRecordDecl-specific that the moment.
262  template<typename Decl, typename T> class LazyDefinitionDataPtr {
263    llvm::PointerUnion<T *, Decl *> DataOrCanonicalDecl;
264  
update()265    LazyDefinitionDataPtr update() {
266      if (Decl *Canon = DataOrCanonicalDecl.template dyn_cast<Decl*>()) {
267        if (Canon->isCanonicalDecl())
268          Canon->getMostRecentDecl();
269        else
270          // Declaration isn't canonical any more;
271          // update it and perform path compression.
272          *this = Canon->getPreviousDecl()->DefinitionData.update();
273      }
274      return *this;
275    }
276  
277  public:
LazyDefinitionDataPtr(Decl * Canon)278    LazyDefinitionDataPtr(Decl *Canon) : DataOrCanonicalDecl(Canon) {}
LazyDefinitionDataPtr(T * Data)279    LazyDefinitionDataPtr(T *Data) : DataOrCanonicalDecl(Data) {}
getNotUpdated()280    T *getNotUpdated() { return DataOrCanonicalDecl.template dyn_cast<T*>(); }
get()281    T *get() { return update().getNotUpdated(); }
282  };
283  
284  /// \brief Represents a C++ struct/union/class.
285  class CXXRecordDecl : public RecordDecl {
286  
287    friend void TagDecl::startDefinition();
288  
289    /// Values used in DefinitionData fields to represent special members.
290    enum SpecialMemberFlags {
291      SMF_DefaultConstructor = 0x1,
292      SMF_CopyConstructor = 0x2,
293      SMF_MoveConstructor = 0x4,
294      SMF_CopyAssignment = 0x8,
295      SMF_MoveAssignment = 0x10,
296      SMF_Destructor = 0x20,
297      SMF_All = 0x3f
298    };
299  
300    struct DefinitionData {
301      DefinitionData(CXXRecordDecl *D);
302  
303      /// \brief True if this class has any user-declared constructors.
304      bool UserDeclaredConstructor : 1;
305  
306      /// \brief The user-declared special members which this class has.
307      unsigned UserDeclaredSpecialMembers : 6;
308  
309      /// \brief True when this class is an aggregate.
310      bool Aggregate : 1;
311  
312      /// \brief True when this class is a POD-type.
313      bool PlainOldData : 1;
314  
315      /// true when this class is empty for traits purposes,
316      /// i.e. has no data members other than 0-width bit-fields, has no
317      /// virtual function/base, and doesn't inherit from a non-empty
318      /// class. Doesn't take union-ness into account.
319      bool Empty : 1;
320  
321      /// \brief True when this class is polymorphic, i.e., has at
322      /// least one virtual member or derives from a polymorphic class.
323      bool Polymorphic : 1;
324  
325      /// \brief True when this class is abstract, i.e., has at least
326      /// one pure virtual function, (that can come from a base class).
327      bool Abstract : 1;
328  
329      /// \brief True when this class has standard layout.
330      ///
331      /// C++11 [class]p7.  A standard-layout class is a class that:
332      /// * has no non-static data members of type non-standard-layout class (or
333      ///   array of such types) or reference,
334      /// * has no virtual functions (10.3) and no virtual base classes (10.1),
335      /// * has the same access control (Clause 11) for all non-static data
336      ///   members
337      /// * has no non-standard-layout base classes,
338      /// * either has no non-static data members in the most derived class and at
339      ///   most one base class with non-static data members, or has no base
340      ///   classes with non-static data members, and
341      /// * has no base classes of the same type as the first non-static data
342      ///   member.
343      bool IsStandardLayout : 1;
344  
345      /// \brief True when there are no non-empty base classes.
346      ///
347      /// This is a helper bit of state used to implement IsStandardLayout more
348      /// efficiently.
349      bool HasNoNonEmptyBases : 1;
350  
351      /// \brief True when there are private non-static data members.
352      bool HasPrivateFields : 1;
353  
354      /// \brief True when there are protected non-static data members.
355      bool HasProtectedFields : 1;
356  
357      /// \brief True when there are private non-static data members.
358      bool HasPublicFields : 1;
359  
360      /// \brief True if this class (or any subobject) has mutable fields.
361      bool HasMutableFields : 1;
362  
363      /// \brief True if this class (or any nested anonymous struct or union)
364      /// has variant members.
365      bool HasVariantMembers : 1;
366  
367      /// \brief True if there no non-field members declared by the user.
368      bool HasOnlyCMembers : 1;
369  
370      /// \brief True if any field has an in-class initializer, including those
371      /// within anonymous unions or structs.
372      bool HasInClassInitializer : 1;
373  
374      /// \brief True if any field is of reference type, and does not have an
375      /// in-class initializer.
376      ///
377      /// In this case, value-initialization of this class is illegal in C++98
378      /// even if the class has a trivial default constructor.
379      bool HasUninitializedReferenceMember : 1;
380  
381      /// \brief These flags are \c true if a defaulted corresponding special
382      /// member can't be fully analyzed without performing overload resolution.
383      /// @{
384      bool NeedOverloadResolutionForMoveConstructor : 1;
385      bool NeedOverloadResolutionForMoveAssignment : 1;
386      bool NeedOverloadResolutionForDestructor : 1;
387      /// @}
388  
389      /// \brief These flags are \c true if an implicit defaulted corresponding
390      /// special member would be defined as deleted.
391      /// @{
392      bool DefaultedMoveConstructorIsDeleted : 1;
393      bool DefaultedMoveAssignmentIsDeleted : 1;
394      bool DefaultedDestructorIsDeleted : 1;
395      /// @}
396  
397      /// \brief The trivial special members which this class has, per
398      /// C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25,
399      /// C++11 [class.dtor]p5, or would have if the member were not suppressed.
400      ///
401      /// This excludes any user-declared but not user-provided special members
402      /// which have been declared but not yet defined.
403      unsigned HasTrivialSpecialMembers : 6;
404  
405      /// \brief The declared special members of this class which are known to be
406      /// non-trivial.
407      ///
408      /// This excludes any user-declared but not user-provided special members
409      /// which have been declared but not yet defined, and any implicit special
410      /// members which have not yet been declared.
411      unsigned DeclaredNonTrivialSpecialMembers : 6;
412  
413      /// \brief True when this class has a destructor with no semantic effect.
414      bool HasIrrelevantDestructor : 1;
415  
416      /// \brief True when this class has at least one user-declared constexpr
417      /// constructor which is neither the copy nor move constructor.
418      bool HasConstexprNonCopyMoveConstructor : 1;
419  
420      /// \brief True if a defaulted default constructor for this class would
421      /// be constexpr.
422      bool DefaultedDefaultConstructorIsConstexpr : 1;
423  
424      /// \brief True if this class has a constexpr default constructor.
425      ///
426      /// This is true for either a user-declared constexpr default constructor
427      /// or an implicitly declared constexpr default constructor.
428      bool HasConstexprDefaultConstructor : 1;
429  
430      /// \brief True when this class contains at least one non-static data
431      /// member or base class of non-literal or volatile type.
432      bool HasNonLiteralTypeFieldsOrBases : 1;
433  
434      /// \brief True when visible conversion functions are already computed
435      /// and are available.
436      bool ComputedVisibleConversions : 1;
437  
438      /// \brief Whether we have a C++11 user-provided default constructor (not
439      /// explicitly deleted or defaulted).
440      bool UserProvidedDefaultConstructor : 1;
441  
442      /// \brief The special members which have been declared for this class,
443      /// either by the user or implicitly.
444      unsigned DeclaredSpecialMembers : 6;
445  
446      /// \brief Whether an implicit copy constructor would have a const-qualified
447      /// parameter.
448      bool ImplicitCopyConstructorHasConstParam : 1;
449  
450      /// \brief Whether an implicit copy assignment operator would have a
451      /// const-qualified parameter.
452      bool ImplicitCopyAssignmentHasConstParam : 1;
453  
454      /// \brief Whether any declared copy constructor has a const-qualified
455      /// parameter.
456      bool HasDeclaredCopyConstructorWithConstParam : 1;
457  
458      /// \brief Whether any declared copy assignment operator has either a
459      /// const-qualified reference parameter or a non-reference parameter.
460      bool HasDeclaredCopyAssignmentWithConstParam : 1;
461  
462      /// \brief Whether this class describes a C++ lambda.
463      bool IsLambda : 1;
464  
465      /// \brief Whether we are currently parsing base specifiers.
466      bool IsParsingBaseSpecifiers : 1;
467  
468      /// \brief The number of base class specifiers in Bases.
469      unsigned NumBases;
470  
471      /// \brief The number of virtual base class specifiers in VBases.
472      unsigned NumVBases;
473  
474      /// \brief Base classes of this class.
475      ///
476      /// FIXME: This is wasted space for a union.
477      LazyCXXBaseSpecifiersPtr Bases;
478  
479      /// \brief direct and indirect virtual base classes of this class.
480      LazyCXXBaseSpecifiersPtr VBases;
481  
482      /// \brief The conversion functions of this C++ class (but not its
483      /// inherited conversion functions).
484      ///
485      /// Each of the entries in this overload set is a CXXConversionDecl.
486      LazyASTUnresolvedSet Conversions;
487  
488      /// \brief The conversion functions of this C++ class and all those
489      /// inherited conversion functions that are visible in this class.
490      ///
491      /// Each of the entries in this overload set is a CXXConversionDecl or a
492      /// FunctionTemplateDecl.
493      LazyASTUnresolvedSet VisibleConversions;
494  
495      /// \brief The declaration which defines this record.
496      CXXRecordDecl *Definition;
497  
498      /// \brief The first friend declaration in this class, or null if there
499      /// aren't any.
500      ///
501      /// This is actually currently stored in reverse order.
502      LazyDeclPtr FirstFriend;
503  
504      /// \brief Retrieve the set of direct base classes.
getBasesDefinitionData505      CXXBaseSpecifier *getBases() const {
506        if (!Bases.isOffset())
507          return Bases.get(nullptr);
508        return getBasesSlowCase();
509      }
510  
511      /// \brief Retrieve the set of virtual base classes.
getVBasesDefinitionData512      CXXBaseSpecifier *getVBases() const {
513        if (!VBases.isOffset())
514          return VBases.get(nullptr);
515        return getVBasesSlowCase();
516      }
517  
518    private:
519      CXXBaseSpecifier *getBasesSlowCase() const;
520      CXXBaseSpecifier *getVBasesSlowCase() const;
521    };
522  
523    typedef LazyDefinitionDataPtr<CXXRecordDecl, struct DefinitionData>
524        DefinitionDataPtr;
525    friend class LazyDefinitionDataPtr<CXXRecordDecl, struct DefinitionData>;
526  
527    mutable DefinitionDataPtr DefinitionData;
528  
529    /// \brief Describes a C++ closure type (generated by a lambda expression).
530    struct LambdaDefinitionData : public DefinitionData {
531      typedef LambdaCapture Capture;
532  
LambdaDefinitionDataLambdaDefinitionData533      LambdaDefinitionData(CXXRecordDecl *D, TypeSourceInfo *Info,
534                           bool Dependent, bool IsGeneric,
535                           LambdaCaptureDefault CaptureDefault)
536        : DefinitionData(D), Dependent(Dependent), IsGenericLambda(IsGeneric),
537          CaptureDefault(CaptureDefault), NumCaptures(0), NumExplicitCaptures(0),
538          ManglingNumber(0), ContextDecl(nullptr), Captures(nullptr),
539          MethodTyInfo(Info) {
540        IsLambda = true;
541  
542        // C++11 [expr.prim.lambda]p3:
543        //   This class type is neither an aggregate nor a literal type.
544        Aggregate = false;
545        PlainOldData = false;
546        HasNonLiteralTypeFieldsOrBases = true;
547      }
548  
549      /// \brief Whether this lambda is known to be dependent, even if its
550      /// context isn't dependent.
551      ///
552      /// A lambda with a non-dependent context can be dependent if it occurs
553      /// within the default argument of a function template, because the
554      /// lambda will have been created with the enclosing context as its
555      /// declaration context, rather than function. This is an unfortunate
556      /// artifact of having to parse the default arguments before.
557      unsigned Dependent : 1;
558  
559      /// \brief Whether this lambda is a generic lambda.
560      unsigned IsGenericLambda : 1;
561  
562      /// \brief The Default Capture.
563      unsigned CaptureDefault : 2;
564  
565      /// \brief The number of captures in this lambda is limited 2^NumCaptures.
566      unsigned NumCaptures : 15;
567  
568      /// \brief The number of explicit captures in this lambda.
569      unsigned NumExplicitCaptures : 13;
570  
571      /// \brief The number used to indicate this lambda expression for name
572      /// mangling in the Itanium C++ ABI.
573      unsigned ManglingNumber;
574  
575      /// \brief The declaration that provides context for this lambda, if the
576      /// actual DeclContext does not suffice. This is used for lambdas that
577      /// occur within default arguments of function parameters within the class
578      /// or within a data member initializer.
579      Decl *ContextDecl;
580  
581      /// \brief The list of captures, both explicit and implicit, for this
582      /// lambda.
583      Capture *Captures;
584  
585      /// \brief The type of the call method.
586      TypeSourceInfo *MethodTyInfo;
587  
588    };
589  
data()590    struct DefinitionData &data() const {
591      auto *DD = DefinitionData.get();
592      assert(DD && "queried property of class with no definition");
593      return *DD;
594    }
595  
getLambdaData()596    struct LambdaDefinitionData &getLambdaData() const {
597      // No update required: a merged definition cannot change any lambda
598      // properties.
599      auto *DD = DefinitionData.getNotUpdated();
600      assert(DD && DD->IsLambda && "queried lambda property of non-lambda class");
601      return static_cast<LambdaDefinitionData&>(*DD);
602    }
603  
604    /// \brief The template or declaration that this declaration
605    /// describes or was instantiated from, respectively.
606    ///
607    /// For non-templates, this value will be null. For record
608    /// declarations that describe a class template, this will be a
609    /// pointer to a ClassTemplateDecl. For member
610    /// classes of class template specializations, this will be the
611    /// MemberSpecializationInfo referring to the member class that was
612    /// instantiated or specialized.
613    llvm::PointerUnion<ClassTemplateDecl*, MemberSpecializationInfo*>
614      TemplateOrInstantiation;
615  
616    friend class DeclContext;
617    friend class LambdaExpr;
618  
619    /// \brief Called from setBases and addedMember to notify the class that a
620    /// direct or virtual base class or a member of class type has been added.
621    void addedClassSubobject(CXXRecordDecl *Base);
622  
623    /// \brief Notify the class that member has been added.
624    ///
625    /// This routine helps maintain information about the class based on which
626    /// members have been added. It will be invoked by DeclContext::addDecl()
627    /// whenever a member is added to this record.
628    void addedMember(Decl *D);
629  
630    void markedVirtualFunctionPure();
631    friend void FunctionDecl::setPure(bool);
632  
633    friend class ASTNodeImporter;
634  
635    /// \brief Get the head of our list of friend declarations, possibly
636    /// deserializing the friends from an external AST source.
637    FriendDecl *getFirstFriend() const;
638  
639  protected:
640    CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C, DeclContext *DC,
641                  SourceLocation StartLoc, SourceLocation IdLoc,
642                  IdentifierInfo *Id, CXXRecordDecl *PrevDecl);
643  
644  public:
645    /// \brief Iterator that traverses the base classes of a class.
646    typedef CXXBaseSpecifier*       base_class_iterator;
647  
648    /// \brief Iterator that traverses the base classes of a class.
649    typedef const CXXBaseSpecifier* base_class_const_iterator;
650  
getCanonicalDecl()651    CXXRecordDecl *getCanonicalDecl() override {
652      return cast<CXXRecordDecl>(RecordDecl::getCanonicalDecl());
653    }
getCanonicalDecl()654    virtual const CXXRecordDecl *getCanonicalDecl() const {
655      return cast<CXXRecordDecl>(RecordDecl::getCanonicalDecl());
656    }
657  
getPreviousDecl()658    CXXRecordDecl *getPreviousDecl() {
659      return cast_or_null<CXXRecordDecl>(
660              static_cast<RecordDecl *>(this)->getPreviousDecl());
661    }
getPreviousDecl()662    const CXXRecordDecl *getPreviousDecl() const {
663      return const_cast<CXXRecordDecl*>(this)->getPreviousDecl();
664    }
665  
getMostRecentDecl()666    CXXRecordDecl *getMostRecentDecl() {
667      return cast<CXXRecordDecl>(
668              static_cast<RecordDecl *>(this)->getMostRecentDecl());
669    }
670  
getMostRecentDecl()671    const CXXRecordDecl *getMostRecentDecl() const {
672      return const_cast<CXXRecordDecl*>(this)->getMostRecentDecl();
673    }
674  
getDefinition()675    CXXRecordDecl *getDefinition() const {
676      auto *DD = DefinitionData.get();
677      return DD ? DD->Definition : nullptr;
678    }
679  
hasDefinition()680    bool hasDefinition() const { return DefinitionData.get(); }
681  
682    static CXXRecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
683                                 SourceLocation StartLoc, SourceLocation IdLoc,
684                                 IdentifierInfo *Id,
685                                 CXXRecordDecl *PrevDecl = nullptr,
686                                 bool DelayTypeCreation = false);
687    static CXXRecordDecl *CreateLambda(const ASTContext &C, DeclContext *DC,
688                                       TypeSourceInfo *Info, SourceLocation Loc,
689                                       bool DependentLambda, bool IsGeneric,
690                                       LambdaCaptureDefault CaptureDefault);
691    static CXXRecordDecl *CreateDeserialized(const ASTContext &C, unsigned ID);
692  
isDynamicClass()693    bool isDynamicClass() const {
694      return data().Polymorphic || data().NumVBases != 0;
695    }
696  
setIsParsingBaseSpecifiers()697    void setIsParsingBaseSpecifiers() { data().IsParsingBaseSpecifiers = true; }
698  
isParsingBaseSpecifiers()699    bool isParsingBaseSpecifiers() const {
700      return data().IsParsingBaseSpecifiers;
701    }
702  
703    /// \brief Sets the base classes of this struct or class.
704    void setBases(CXXBaseSpecifier const * const *Bases, unsigned NumBases);
705  
706    /// \brief Retrieves the number of base classes of this class.
getNumBases()707    unsigned getNumBases() const { return data().NumBases; }
708  
709    typedef llvm::iterator_range<base_class_iterator> base_class_range;
710    typedef llvm::iterator_range<base_class_const_iterator>
711      base_class_const_range;
712  
bases()713    base_class_range bases() {
714      return base_class_range(bases_begin(), bases_end());
715    }
bases()716    base_class_const_range bases() const {
717      return base_class_const_range(bases_begin(), bases_end());
718    }
719  
bases_begin()720    base_class_iterator bases_begin() { return data().getBases(); }
bases_begin()721    base_class_const_iterator bases_begin() const { return data().getBases(); }
bases_end()722    base_class_iterator bases_end() { return bases_begin() + data().NumBases; }
bases_end()723    base_class_const_iterator bases_end() const {
724      return bases_begin() + data().NumBases;
725    }
726  
727    /// \brief Retrieves the number of virtual base classes of this class.
getNumVBases()728    unsigned getNumVBases() const { return data().NumVBases; }
729  
vbases()730    base_class_range vbases() {
731      return base_class_range(vbases_begin(), vbases_end());
732    }
vbases()733    base_class_const_range vbases() const {
734      return base_class_const_range(vbases_begin(), vbases_end());
735    }
736  
vbases_begin()737    base_class_iterator vbases_begin() { return data().getVBases(); }
vbases_begin()738    base_class_const_iterator vbases_begin() const { return data().getVBases(); }
vbases_end()739    base_class_iterator vbases_end() { return vbases_begin() + data().NumVBases; }
vbases_end()740    base_class_const_iterator vbases_end() const {
741      return vbases_begin() + data().NumVBases;
742    }
743  
744    /// \brief Determine whether this class has any dependent base classes which
745    /// are not the current instantiation.
746    bool hasAnyDependentBases() const;
747  
748    /// Iterator access to method members.  The method iterator visits
749    /// all method members of the class, including non-instance methods,
750    /// special methods, etc.
751    typedef specific_decl_iterator<CXXMethodDecl> method_iterator;
752    typedef llvm::iterator_range<specific_decl_iterator<CXXMethodDecl>>
753      method_range;
754  
methods()755    method_range methods() const {
756      return method_range(method_begin(), method_end());
757    }
758  
759    /// \brief Method begin iterator.  Iterates in the order the methods
760    /// were declared.
method_begin()761    method_iterator method_begin() const {
762      return method_iterator(decls_begin());
763    }
764    /// \brief Method past-the-end iterator.
method_end()765    method_iterator method_end() const {
766      return method_iterator(decls_end());
767    }
768  
769    /// Iterator access to constructor members.
770    typedef specific_decl_iterator<CXXConstructorDecl> ctor_iterator;
771    typedef llvm::iterator_range<specific_decl_iterator<CXXConstructorDecl>>
772      ctor_range;
773  
ctors()774    ctor_range ctors() const { return ctor_range(ctor_begin(), ctor_end()); }
775  
ctor_begin()776    ctor_iterator ctor_begin() const {
777      return ctor_iterator(decls_begin());
778    }
ctor_end()779    ctor_iterator ctor_end() const {
780      return ctor_iterator(decls_end());
781    }
782  
783    /// An iterator over friend declarations.  All of these are defined
784    /// in DeclFriend.h.
785    class friend_iterator;
786    typedef llvm::iterator_range<friend_iterator> friend_range;
787  
788    friend_range friends() const;
789    friend_iterator friend_begin() const;
790    friend_iterator friend_end() const;
791    void pushFriendDecl(FriendDecl *FD);
792  
793    /// Determines whether this record has any friends.
hasFriends()794    bool hasFriends() const {
795      return data().FirstFriend.isValid();
796    }
797  
798    /// \brief \c true if we know for sure that this class has a single,
799    /// accessible, unambiguous move constructor that is not deleted.
hasSimpleMoveConstructor()800    bool hasSimpleMoveConstructor() const {
801      return !hasUserDeclaredMoveConstructor() && hasMoveConstructor() &&
802             !data().DefaultedMoveConstructorIsDeleted;
803    }
804    /// \brief \c true if we know for sure that this class has a single,
805    /// accessible, unambiguous move assignment operator that is not deleted.
hasSimpleMoveAssignment()806    bool hasSimpleMoveAssignment() const {
807      return !hasUserDeclaredMoveAssignment() && hasMoveAssignment() &&
808             !data().DefaultedMoveAssignmentIsDeleted;
809    }
810    /// \brief \c true if we know for sure that this class has an accessible
811    /// destructor that is not deleted.
hasSimpleDestructor()812    bool hasSimpleDestructor() const {
813      return !hasUserDeclaredDestructor() &&
814             !data().DefaultedDestructorIsDeleted;
815    }
816  
817    /// \brief Determine whether this class has any default constructors.
hasDefaultConstructor()818    bool hasDefaultConstructor() const {
819      return (data().DeclaredSpecialMembers & SMF_DefaultConstructor) ||
820             needsImplicitDefaultConstructor();
821    }
822  
823    /// \brief Determine if we need to declare a default constructor for
824    /// this class.
825    ///
826    /// This value is used for lazy creation of default constructors.
needsImplicitDefaultConstructor()827    bool needsImplicitDefaultConstructor() const {
828      return !data().UserDeclaredConstructor &&
829             !(data().DeclaredSpecialMembers & SMF_DefaultConstructor) &&
830             // C++14 [expr.prim.lambda]p20:
831             //   The closure type associated with a lambda-expression has no
832             //   default constructor.
833             !isLambda();
834    }
835  
836    /// \brief Determine whether this class has any user-declared constructors.
837    ///
838    /// When true, a default constructor will not be implicitly declared.
hasUserDeclaredConstructor()839    bool hasUserDeclaredConstructor() const {
840      return data().UserDeclaredConstructor;
841    }
842  
843    /// \brief Whether this class has a user-provided default constructor
844    /// per C++11.
hasUserProvidedDefaultConstructor()845    bool hasUserProvidedDefaultConstructor() const {
846      return data().UserProvidedDefaultConstructor;
847    }
848  
849    /// \brief Determine whether this class has a user-declared copy constructor.
850    ///
851    /// When false, a copy constructor will be implicitly declared.
hasUserDeclaredCopyConstructor()852    bool hasUserDeclaredCopyConstructor() const {
853      return data().UserDeclaredSpecialMembers & SMF_CopyConstructor;
854    }
855  
856    /// \brief Determine whether this class needs an implicit copy
857    /// constructor to be lazily declared.
needsImplicitCopyConstructor()858    bool needsImplicitCopyConstructor() const {
859      return !(data().DeclaredSpecialMembers & SMF_CopyConstructor);
860    }
861  
862    /// \brief Determine whether we need to eagerly declare a defaulted copy
863    /// constructor for this class.
needsOverloadResolutionForCopyConstructor()864    bool needsOverloadResolutionForCopyConstructor() const {
865      return data().HasMutableFields;
866    }
867  
868    /// \brief Determine whether an implicit copy constructor for this type
869    /// would have a parameter with a const-qualified reference type.
implicitCopyConstructorHasConstParam()870    bool implicitCopyConstructorHasConstParam() const {
871      return data().ImplicitCopyConstructorHasConstParam;
872    }
873  
874    /// \brief Determine whether this class has a copy constructor with
875    /// a parameter type which is a reference to a const-qualified type.
hasCopyConstructorWithConstParam()876    bool hasCopyConstructorWithConstParam() const {
877      return data().HasDeclaredCopyConstructorWithConstParam ||
878             (needsImplicitCopyConstructor() &&
879              implicitCopyConstructorHasConstParam());
880    }
881  
882    /// \brief Whether this class has a user-declared move constructor or
883    /// assignment operator.
884    ///
885    /// When false, a move constructor and assignment operator may be
886    /// implicitly declared.
hasUserDeclaredMoveOperation()887    bool hasUserDeclaredMoveOperation() const {
888      return data().UserDeclaredSpecialMembers &
889               (SMF_MoveConstructor | SMF_MoveAssignment);
890    }
891  
892    /// \brief Determine whether this class has had a move constructor
893    /// declared by the user.
hasUserDeclaredMoveConstructor()894    bool hasUserDeclaredMoveConstructor() const {
895      return data().UserDeclaredSpecialMembers & SMF_MoveConstructor;
896    }
897  
898    /// \brief Determine whether this class has a move constructor.
hasMoveConstructor()899    bool hasMoveConstructor() const {
900      return (data().DeclaredSpecialMembers & SMF_MoveConstructor) ||
901             needsImplicitMoveConstructor();
902    }
903  
904    /// \brief Set that we attempted to declare an implicitly move
905    /// constructor, but overload resolution failed so we deleted it.
setImplicitMoveConstructorIsDeleted()906    void setImplicitMoveConstructorIsDeleted() {
907      assert((data().DefaultedMoveConstructorIsDeleted ||
908              needsOverloadResolutionForMoveConstructor()) &&
909             "move constructor should not be deleted");
910      data().DefaultedMoveConstructorIsDeleted = true;
911    }
912  
913    /// \brief Determine whether this class should get an implicit move
914    /// constructor or if any existing special member function inhibits this.
needsImplicitMoveConstructor()915    bool needsImplicitMoveConstructor() const {
916      return !(data().DeclaredSpecialMembers & SMF_MoveConstructor) &&
917             !hasUserDeclaredCopyConstructor() &&
918             !hasUserDeclaredCopyAssignment() &&
919             !hasUserDeclaredMoveAssignment() &&
920             !hasUserDeclaredDestructor();
921    }
922  
923    /// \brief Determine whether we need to eagerly declare a defaulted move
924    /// constructor for this class.
needsOverloadResolutionForMoveConstructor()925    bool needsOverloadResolutionForMoveConstructor() const {
926      return data().NeedOverloadResolutionForMoveConstructor;
927    }
928  
929    /// \brief Determine whether this class has a user-declared copy assignment
930    /// operator.
931    ///
932    /// When false, a copy assigment operator will be implicitly declared.
hasUserDeclaredCopyAssignment()933    bool hasUserDeclaredCopyAssignment() const {
934      return data().UserDeclaredSpecialMembers & SMF_CopyAssignment;
935    }
936  
937    /// \brief Determine whether this class needs an implicit copy
938    /// assignment operator to be lazily declared.
needsImplicitCopyAssignment()939    bool needsImplicitCopyAssignment() const {
940      return !(data().DeclaredSpecialMembers & SMF_CopyAssignment);
941    }
942  
943    /// \brief Determine whether we need to eagerly declare a defaulted copy
944    /// assignment operator for this class.
needsOverloadResolutionForCopyAssignment()945    bool needsOverloadResolutionForCopyAssignment() const {
946      return data().HasMutableFields;
947    }
948  
949    /// \brief Determine whether an implicit copy assignment operator for this
950    /// type would have a parameter with a const-qualified reference type.
implicitCopyAssignmentHasConstParam()951    bool implicitCopyAssignmentHasConstParam() const {
952      return data().ImplicitCopyAssignmentHasConstParam;
953    }
954  
955    /// \brief Determine whether this class has a copy assignment operator with
956    /// a parameter type which is a reference to a const-qualified type or is not
957    /// a reference.
hasCopyAssignmentWithConstParam()958    bool hasCopyAssignmentWithConstParam() const {
959      return data().HasDeclaredCopyAssignmentWithConstParam ||
960             (needsImplicitCopyAssignment() &&
961              implicitCopyAssignmentHasConstParam());
962    }
963  
964    /// \brief Determine whether this class has had a move assignment
965    /// declared by the user.
hasUserDeclaredMoveAssignment()966    bool hasUserDeclaredMoveAssignment() const {
967      return data().UserDeclaredSpecialMembers & SMF_MoveAssignment;
968    }
969  
970    /// \brief Determine whether this class has a move assignment operator.
hasMoveAssignment()971    bool hasMoveAssignment() const {
972      return (data().DeclaredSpecialMembers & SMF_MoveAssignment) ||
973             needsImplicitMoveAssignment();
974    }
975  
976    /// \brief Set that we attempted to declare an implicit move assignment
977    /// operator, but overload resolution failed so we deleted it.
setImplicitMoveAssignmentIsDeleted()978    void setImplicitMoveAssignmentIsDeleted() {
979      assert((data().DefaultedMoveAssignmentIsDeleted ||
980              needsOverloadResolutionForMoveAssignment()) &&
981             "move assignment should not be deleted");
982      data().DefaultedMoveAssignmentIsDeleted = true;
983    }
984  
985    /// \brief Determine whether this class should get an implicit move
986    /// assignment operator or if any existing special member function inhibits
987    /// this.
needsImplicitMoveAssignment()988    bool needsImplicitMoveAssignment() const {
989      return !(data().DeclaredSpecialMembers & SMF_MoveAssignment) &&
990             !hasUserDeclaredCopyConstructor() &&
991             !hasUserDeclaredCopyAssignment() &&
992             !hasUserDeclaredMoveConstructor() &&
993             !hasUserDeclaredDestructor();
994    }
995  
996    /// \brief Determine whether we need to eagerly declare a move assignment
997    /// operator for this class.
needsOverloadResolutionForMoveAssignment()998    bool needsOverloadResolutionForMoveAssignment() const {
999      return data().NeedOverloadResolutionForMoveAssignment;
1000    }
1001  
1002    /// \brief Determine whether this class has a user-declared destructor.
1003    ///
1004    /// When false, a destructor will be implicitly declared.
hasUserDeclaredDestructor()1005    bool hasUserDeclaredDestructor() const {
1006      return data().UserDeclaredSpecialMembers & SMF_Destructor;
1007    }
1008  
1009    /// \brief Determine whether this class needs an implicit destructor to
1010    /// be lazily declared.
needsImplicitDestructor()1011    bool needsImplicitDestructor() const {
1012      return !(data().DeclaredSpecialMembers & SMF_Destructor);
1013    }
1014  
1015    /// \brief Determine whether we need to eagerly declare a destructor for this
1016    /// class.
needsOverloadResolutionForDestructor()1017    bool needsOverloadResolutionForDestructor() const {
1018      return data().NeedOverloadResolutionForDestructor;
1019    }
1020  
1021    /// \brief Determine whether this class describes a lambda function object.
isLambda()1022    bool isLambda() const {
1023      // An update record can't turn a non-lambda into a lambda.
1024      auto *DD = DefinitionData.getNotUpdated();
1025      return DD && DD->IsLambda;
1026    }
1027  
1028    /// \brief Determine whether this class describes a generic
1029    /// lambda function object (i.e. function call operator is
1030    /// a template).
1031    bool isGenericLambda() const;
1032  
1033    /// \brief Retrieve the lambda call operator of the closure type
1034    /// if this is a closure type.
1035    CXXMethodDecl *getLambdaCallOperator() const;
1036  
1037    /// \brief Retrieve the lambda static invoker, the address of which
1038    /// is returned by the conversion operator, and the body of which
1039    /// is forwarded to the lambda call operator.
1040    CXXMethodDecl *getLambdaStaticInvoker() const;
1041  
1042    /// \brief Retrieve the generic lambda's template parameter list.
1043    /// Returns null if the class does not represent a lambda or a generic
1044    /// lambda.
1045    TemplateParameterList *getGenericLambdaTemplateParameterList() const;
1046  
getLambdaCaptureDefault()1047    LambdaCaptureDefault getLambdaCaptureDefault() const {
1048      assert(isLambda());
1049      return static_cast<LambdaCaptureDefault>(getLambdaData().CaptureDefault);
1050    }
1051  
1052    /// \brief For a closure type, retrieve the mapping from captured
1053    /// variables and \c this to the non-static data members that store the
1054    /// values or references of the captures.
1055    ///
1056    /// \param Captures Will be populated with the mapping from captured
1057    /// variables to the corresponding fields.
1058    ///
1059    /// \param ThisCapture Will be set to the field declaration for the
1060    /// \c this capture.
1061    ///
1062    /// \note No entries will be added for init-captures, as they do not capture
1063    /// variables.
1064    void getCaptureFields(llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
1065                          FieldDecl *&ThisCapture) const;
1066  
1067    typedef const LambdaCapture *capture_const_iterator;
1068    typedef llvm::iterator_range<capture_const_iterator> capture_const_range;
1069  
captures()1070    capture_const_range captures() const {
1071      return capture_const_range(captures_begin(), captures_end());
1072    }
captures_begin()1073    capture_const_iterator captures_begin() const {
1074      return isLambda() ? getLambdaData().Captures : nullptr;
1075    }
captures_end()1076    capture_const_iterator captures_end() const {
1077      return isLambda() ? captures_begin() + getLambdaData().NumCaptures
1078                        : nullptr;
1079    }
1080  
1081    typedef UnresolvedSetIterator conversion_iterator;
conversion_begin()1082    conversion_iterator conversion_begin() const {
1083      return data().Conversions.get(getASTContext()).begin();
1084    }
conversion_end()1085    conversion_iterator conversion_end() const {
1086      return data().Conversions.get(getASTContext()).end();
1087    }
1088  
1089    /// Removes a conversion function from this class.  The conversion
1090    /// function must currently be a member of this class.  Furthermore,
1091    /// this class must currently be in the process of being defined.
1092    void removeConversion(const NamedDecl *Old);
1093  
1094    /// \brief Get all conversion functions visible in current class,
1095    /// including conversion function templates.
1096    llvm::iterator_range<conversion_iterator> getVisibleConversionFunctions();
1097  
1098    /// Determine whether this class is an aggregate (C++ [dcl.init.aggr]),
1099    /// which is a class with no user-declared constructors, no private
1100    /// or protected non-static data members, no base classes, and no virtual
1101    /// functions (C++ [dcl.init.aggr]p1).
isAggregate()1102    bool isAggregate() const { return data().Aggregate; }
1103  
1104    /// \brief Whether this class has any in-class initializers
1105    /// for non-static data members (including those in anonymous unions or
1106    /// structs).
hasInClassInitializer()1107    bool hasInClassInitializer() const { return data().HasInClassInitializer; }
1108  
1109    /// \brief Whether this class or any of its subobjects has any members of
1110    /// reference type which would make value-initialization ill-formed.
1111    ///
1112    /// Per C++03 [dcl.init]p5:
1113    ///  - if T is a non-union class type without a user-declared constructor,
1114    ///    then every non-static data member and base-class component of T is
1115    ///    value-initialized [...] A program that calls for [...]
1116    ///    value-initialization of an entity of reference type is ill-formed.
hasUninitializedReferenceMember()1117    bool hasUninitializedReferenceMember() const {
1118      return !isUnion() && !hasUserDeclaredConstructor() &&
1119             data().HasUninitializedReferenceMember;
1120    }
1121  
1122    /// \brief Whether this class is a POD-type (C++ [class]p4)
1123    ///
1124    /// For purposes of this function a class is POD if it is an aggregate
1125    /// that has no non-static non-POD data members, no reference data
1126    /// members, no user-defined copy assignment operator and no
1127    /// user-defined destructor.
1128    ///
1129    /// Note that this is the C++ TR1 definition of POD.
isPOD()1130    bool isPOD() const { return data().PlainOldData; }
1131  
1132    /// \brief True if this class is C-like, without C++-specific features, e.g.
1133    /// it contains only public fields, no bases, tag kind is not 'class', etc.
1134    bool isCLike() const;
1135  
1136    /// \brief Determine whether this is an empty class in the sense of
1137    /// (C++11 [meta.unary.prop]).
1138    ///
1139    /// A non-union class is empty iff it has a virtual function, virtual base,
1140    /// data member (other than 0-width bit-field) or inherits from a non-empty
1141    /// class.
1142    ///
1143    /// \note This does NOT include a check for union-ness.
isEmpty()1144    bool isEmpty() const { return data().Empty; }
1145  
1146    /// Whether this class is polymorphic (C++ [class.virtual]),
1147    /// which means that the class contains or inherits a virtual function.
isPolymorphic()1148    bool isPolymorphic() const { return data().Polymorphic; }
1149  
1150    /// \brief Determine whether this class has a pure virtual function.
1151    ///
1152    /// The class is is abstract per (C++ [class.abstract]p2) if it declares
1153    /// a pure virtual function or inherits a pure virtual function that is
1154    /// not overridden.
isAbstract()1155    bool isAbstract() const { return data().Abstract; }
1156  
1157    /// \brief Determine whether this class has standard layout per
1158    /// (C++ [class]p7)
isStandardLayout()1159    bool isStandardLayout() const { return data().IsStandardLayout; }
1160  
1161    /// \brief Determine whether this class, or any of its class subobjects,
1162    /// contains a mutable field.
hasMutableFields()1163    bool hasMutableFields() const { return data().HasMutableFields; }
1164  
1165    /// \brief Determine whether this class has any variant members.
hasVariantMembers()1166    bool hasVariantMembers() const { return data().HasVariantMembers; }
1167  
1168    /// \brief Determine whether this class has a trivial default constructor
1169    /// (C++11 [class.ctor]p5).
hasTrivialDefaultConstructor()1170    bool hasTrivialDefaultConstructor() const {
1171      return hasDefaultConstructor() &&
1172             (data().HasTrivialSpecialMembers & SMF_DefaultConstructor);
1173    }
1174  
1175    /// \brief Determine whether this class has a non-trivial default constructor
1176    /// (C++11 [class.ctor]p5).
hasNonTrivialDefaultConstructor()1177    bool hasNonTrivialDefaultConstructor() const {
1178      return (data().DeclaredNonTrivialSpecialMembers & SMF_DefaultConstructor) ||
1179             (needsImplicitDefaultConstructor() &&
1180              !(data().HasTrivialSpecialMembers & SMF_DefaultConstructor));
1181    }
1182  
1183    /// \brief Determine whether this class has at least one constexpr constructor
1184    /// other than the copy or move constructors.
hasConstexprNonCopyMoveConstructor()1185    bool hasConstexprNonCopyMoveConstructor() const {
1186      return data().HasConstexprNonCopyMoveConstructor ||
1187             (needsImplicitDefaultConstructor() &&
1188              defaultedDefaultConstructorIsConstexpr());
1189    }
1190  
1191    /// \brief Determine whether a defaulted default constructor for this class
1192    /// would be constexpr.
defaultedDefaultConstructorIsConstexpr()1193    bool defaultedDefaultConstructorIsConstexpr() const {
1194      return data().DefaultedDefaultConstructorIsConstexpr &&
1195             (!isUnion() || hasInClassInitializer() || !hasVariantMembers());
1196    }
1197  
1198    /// \brief Determine whether this class has a constexpr default constructor.
hasConstexprDefaultConstructor()1199    bool hasConstexprDefaultConstructor() const {
1200      return data().HasConstexprDefaultConstructor ||
1201             (needsImplicitDefaultConstructor() &&
1202              defaultedDefaultConstructorIsConstexpr());
1203    }
1204  
1205    /// \brief Determine whether this class has a trivial copy constructor
1206    /// (C++ [class.copy]p6, C++11 [class.copy]p12)
hasTrivialCopyConstructor()1207    bool hasTrivialCopyConstructor() const {
1208      return data().HasTrivialSpecialMembers & SMF_CopyConstructor;
1209    }
1210  
1211    /// \brief Determine whether this class has a non-trivial copy constructor
1212    /// (C++ [class.copy]p6, C++11 [class.copy]p12)
hasNonTrivialCopyConstructor()1213    bool hasNonTrivialCopyConstructor() const {
1214      return data().DeclaredNonTrivialSpecialMembers & SMF_CopyConstructor ||
1215             !hasTrivialCopyConstructor();
1216    }
1217  
1218    /// \brief Determine whether this class has a trivial move constructor
1219    /// (C++11 [class.copy]p12)
hasTrivialMoveConstructor()1220    bool hasTrivialMoveConstructor() const {
1221      return hasMoveConstructor() &&
1222             (data().HasTrivialSpecialMembers & SMF_MoveConstructor);
1223    }
1224  
1225    /// \brief Determine whether this class has a non-trivial move constructor
1226    /// (C++11 [class.copy]p12)
hasNonTrivialMoveConstructor()1227    bool hasNonTrivialMoveConstructor() const {
1228      return (data().DeclaredNonTrivialSpecialMembers & SMF_MoveConstructor) ||
1229             (needsImplicitMoveConstructor() &&
1230              !(data().HasTrivialSpecialMembers & SMF_MoveConstructor));
1231    }
1232  
1233    /// \brief Determine whether this class has a trivial copy assignment operator
1234    /// (C++ [class.copy]p11, C++11 [class.copy]p25)
hasTrivialCopyAssignment()1235    bool hasTrivialCopyAssignment() const {
1236      return data().HasTrivialSpecialMembers & SMF_CopyAssignment;
1237    }
1238  
1239    /// \brief Determine whether this class has a non-trivial copy assignment
1240    /// operator (C++ [class.copy]p11, C++11 [class.copy]p25)
hasNonTrivialCopyAssignment()1241    bool hasNonTrivialCopyAssignment() const {
1242      return data().DeclaredNonTrivialSpecialMembers & SMF_CopyAssignment ||
1243             !hasTrivialCopyAssignment();
1244    }
1245  
1246    /// \brief Determine whether this class has a trivial move assignment operator
1247    /// (C++11 [class.copy]p25)
hasTrivialMoveAssignment()1248    bool hasTrivialMoveAssignment() const {
1249      return hasMoveAssignment() &&
1250             (data().HasTrivialSpecialMembers & SMF_MoveAssignment);
1251    }
1252  
1253    /// \brief Determine whether this class has a non-trivial move assignment
1254    /// operator (C++11 [class.copy]p25)
hasNonTrivialMoveAssignment()1255    bool hasNonTrivialMoveAssignment() const {
1256      return (data().DeclaredNonTrivialSpecialMembers & SMF_MoveAssignment) ||
1257             (needsImplicitMoveAssignment() &&
1258              !(data().HasTrivialSpecialMembers & SMF_MoveAssignment));
1259    }
1260  
1261    /// \brief Determine whether this class has a trivial destructor
1262    /// (C++ [class.dtor]p3)
hasTrivialDestructor()1263    bool hasTrivialDestructor() const {
1264      return data().HasTrivialSpecialMembers & SMF_Destructor;
1265    }
1266  
1267    /// \brief Determine whether this class has a non-trivial destructor
1268    /// (C++ [class.dtor]p3)
hasNonTrivialDestructor()1269    bool hasNonTrivialDestructor() const {
1270      return !(data().HasTrivialSpecialMembers & SMF_Destructor);
1271    }
1272  
1273    /// \brief Determine whether this class has a destructor which has no
1274    /// semantic effect.
1275    ///
1276    /// Any such destructor will be trivial, public, defaulted and not deleted,
1277    /// and will call only irrelevant destructors.
hasIrrelevantDestructor()1278    bool hasIrrelevantDestructor() const {
1279      return data().HasIrrelevantDestructor;
1280    }
1281  
1282    /// \brief Determine whether this class has a non-literal or/ volatile type
1283    /// non-static data member or base class.
hasNonLiteralTypeFieldsOrBases()1284    bool hasNonLiteralTypeFieldsOrBases() const {
1285      return data().HasNonLiteralTypeFieldsOrBases;
1286    }
1287  
1288    /// \brief Determine whether this class is considered trivially copyable per
1289    /// (C++11 [class]p6).
1290    bool isTriviallyCopyable() const;
1291  
1292    /// \brief Determine whether this class is considered trivial.
1293    ///
1294    /// C++11 [class]p6:
1295    ///    "A trivial class is a class that has a trivial default constructor and
1296    ///    is trivially copiable."
isTrivial()1297    bool isTrivial() const {
1298      return isTriviallyCopyable() && hasTrivialDefaultConstructor();
1299    }
1300  
1301    /// \brief Determine whether this class is a literal type.
1302    ///
1303    /// C++11 [basic.types]p10:
1304    ///   A class type that has all the following properties:
1305    ///     - it has a trivial destructor
1306    ///     - every constructor call and full-expression in the
1307    ///       brace-or-equal-intializers for non-static data members (if any) is
1308    ///       a constant expression.
1309    ///     - it is an aggregate type or has at least one constexpr constructor
1310    ///       or constructor template that is not a copy or move constructor, and
1311    ///     - all of its non-static data members and base classes are of literal
1312    ///       types
1313    ///
1314    /// We resolve DR1361 by ignoring the second bullet. We resolve DR1452 by
1315    /// treating types with trivial default constructors as literal types.
isLiteral()1316    bool isLiteral() const {
1317      return hasTrivialDestructor() &&
1318             (isAggregate() || hasConstexprNonCopyMoveConstructor() ||
1319              hasTrivialDefaultConstructor()) &&
1320             !hasNonLiteralTypeFieldsOrBases();
1321    }
1322  
1323    /// \brief If this record is an instantiation of a member class,
1324    /// retrieves the member class from which it was instantiated.
1325    ///
1326    /// This routine will return non-null for (non-templated) member
1327    /// classes of class templates. For example, given:
1328    ///
1329    /// \code
1330    /// template<typename T>
1331    /// struct X {
1332    ///   struct A { };
1333    /// };
1334    /// \endcode
1335    ///
1336    /// The declaration for X<int>::A is a (non-templated) CXXRecordDecl
1337    /// whose parent is the class template specialization X<int>. For
1338    /// this declaration, getInstantiatedFromMemberClass() will return
1339    /// the CXXRecordDecl X<T>::A. When a complete definition of
1340    /// X<int>::A is required, it will be instantiated from the
1341    /// declaration returned by getInstantiatedFromMemberClass().
1342    CXXRecordDecl *getInstantiatedFromMemberClass() const;
1343  
1344    /// \brief If this class is an instantiation of a member class of a
1345    /// class template specialization, retrieves the member specialization
1346    /// information.
getMemberSpecializationInfo()1347    MemberSpecializationInfo *getMemberSpecializationInfo() const {
1348      return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1349    }
1350  
1351    /// \brief Specify that this record is an instantiation of the
1352    /// member class \p RD.
1353    void setInstantiationOfMemberClass(CXXRecordDecl *RD,
1354                                       TemplateSpecializationKind TSK);
1355  
1356    /// \brief Retrieves the class template that is described by this
1357    /// class declaration.
1358    ///
1359    /// Every class template is represented as a ClassTemplateDecl and a
1360    /// CXXRecordDecl. The former contains template properties (such as
1361    /// the template parameter lists) while the latter contains the
1362    /// actual description of the template's
1363    /// contents. ClassTemplateDecl::getTemplatedDecl() retrieves the
1364    /// CXXRecordDecl that from a ClassTemplateDecl, while
1365    /// getDescribedClassTemplate() retrieves the ClassTemplateDecl from
1366    /// a CXXRecordDecl.
getDescribedClassTemplate()1367    ClassTemplateDecl *getDescribedClassTemplate() const {
1368      return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl*>();
1369    }
1370  
setDescribedClassTemplate(ClassTemplateDecl * Template)1371    void setDescribedClassTemplate(ClassTemplateDecl *Template) {
1372      TemplateOrInstantiation = Template;
1373    }
1374  
1375    /// \brief Determine whether this particular class is a specialization or
1376    /// instantiation of a class template or member class of a class template,
1377    /// and how it was instantiated or specialized.
1378    TemplateSpecializationKind getTemplateSpecializationKind() const;
1379  
1380    /// \brief Set the kind of specialization or template instantiation this is.
1381    void setTemplateSpecializationKind(TemplateSpecializationKind TSK);
1382  
1383    /// \brief Retrieve the record declaration from which this record could be
1384    /// instantiated. Returns null if this class is not a template instantiation.
1385    const CXXRecordDecl *getTemplateInstantiationPattern() const;
1386  
getTemplateInstantiationPattern()1387    CXXRecordDecl *getTemplateInstantiationPattern() {
1388      return const_cast<CXXRecordDecl *>(const_cast<const CXXRecordDecl *>(this)
1389                                             ->getTemplateInstantiationPattern());
1390    }
1391  
1392    /// \brief Returns the destructor decl for this class.
1393    CXXDestructorDecl *getDestructor() const;
1394  
1395    /// \brief If the class is a local class [class.local], returns
1396    /// the enclosing function declaration.
isLocalClass()1397    const FunctionDecl *isLocalClass() const {
1398      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(getDeclContext()))
1399        return RD->isLocalClass();
1400  
1401      return dyn_cast<FunctionDecl>(getDeclContext());
1402    }
1403  
isLocalClass()1404    FunctionDecl *isLocalClass() {
1405      return const_cast<FunctionDecl*>(
1406          const_cast<const CXXRecordDecl*>(this)->isLocalClass());
1407    }
1408  
1409    /// \brief Determine whether this dependent class is a current instantiation,
1410    /// when viewed from within the given context.
1411    bool isCurrentInstantiation(const DeclContext *CurContext) const;
1412  
1413    /// \brief Determine whether this class is derived from the class \p Base.
1414    ///
1415    /// This routine only determines whether this class is derived from \p Base,
1416    /// but does not account for factors that may make a Derived -> Base class
1417    /// ill-formed, such as private/protected inheritance or multiple, ambiguous
1418    /// base class subobjects.
1419    ///
1420    /// \param Base the base class we are searching for.
1421    ///
1422    /// \returns true if this class is derived from Base, false otherwise.
1423    bool isDerivedFrom(const CXXRecordDecl *Base) const;
1424  
1425    /// \brief Determine whether this class is derived from the type \p Base.
1426    ///
1427    /// This routine only determines whether this class is derived from \p Base,
1428    /// but does not account for factors that may make a Derived -> Base class
1429    /// ill-formed, such as private/protected inheritance or multiple, ambiguous
1430    /// base class subobjects.
1431    ///
1432    /// \param Base the base class we are searching for.
1433    ///
1434    /// \param Paths will contain the paths taken from the current class to the
1435    /// given \p Base class.
1436    ///
1437    /// \returns true if this class is derived from \p Base, false otherwise.
1438    ///
1439    /// \todo add a separate paramaeter to configure IsDerivedFrom, rather than
1440    /// tangling input and output in \p Paths
1441    bool isDerivedFrom(const CXXRecordDecl *Base, CXXBasePaths &Paths) const;
1442  
1443    /// \brief Determine whether this class is virtually derived from
1444    /// the class \p Base.
1445    ///
1446    /// This routine only determines whether this class is virtually
1447    /// derived from \p Base, but does not account for factors that may
1448    /// make a Derived -> Base class ill-formed, such as
1449    /// private/protected inheritance or multiple, ambiguous base class
1450    /// subobjects.
1451    ///
1452    /// \param Base the base class we are searching for.
1453    ///
1454    /// \returns true if this class is virtually derived from Base,
1455    /// false otherwise.
1456    bool isVirtuallyDerivedFrom(const CXXRecordDecl *Base) const;
1457  
1458    /// \brief Determine whether this class is provably not derived from
1459    /// the type \p Base.
1460    bool isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const;
1461  
1462    /// \brief Function type used by forallBases() as a callback.
1463    ///
1464    /// \param BaseDefinition the definition of the base class
1465    ///
1466    /// \returns true if this base matched the search criteria
1467    typedef bool ForallBasesCallback(const CXXRecordDecl *BaseDefinition,
1468                                     void *UserData);
1469  
1470    /// \brief Determines if the given callback holds for all the direct
1471    /// or indirect base classes of this type.
1472    ///
1473    /// The class itself does not count as a base class.  This routine
1474    /// returns false if the class has non-computable base classes.
1475    ///
1476    /// \param BaseMatches Callback invoked for each (direct or indirect) base
1477    /// class of this type, or if \p AllowShortCircuit is true then until a call
1478    /// returns false.
1479    ///
1480    /// \param UserData Passed as the second argument of every call to
1481    /// \p BaseMatches.
1482    ///
1483    /// \param AllowShortCircuit if false, forces the callback to be called
1484    /// for every base class, even if a dependent or non-matching base was
1485    /// found.
1486    bool forallBases(ForallBasesCallback *BaseMatches, void *UserData,
1487                     bool AllowShortCircuit = true) const;
1488  
1489    /// \brief Function type used by lookupInBases() to determine whether a
1490    /// specific base class subobject matches the lookup criteria.
1491    ///
1492    /// \param Specifier the base-class specifier that describes the inheritance
1493    /// from the base class we are trying to match.
1494    ///
1495    /// \param Path the current path, from the most-derived class down to the
1496    /// base named by the \p Specifier.
1497    ///
1498    /// \param UserData a single pointer to user-specified data, provided to
1499    /// lookupInBases().
1500    ///
1501    /// \returns true if this base matched the search criteria, false otherwise.
1502    typedef bool BaseMatchesCallback(const CXXBaseSpecifier *Specifier,
1503                                     CXXBasePath &Path,
1504                                     void *UserData);
1505  
1506    /// \brief Look for entities within the base classes of this C++ class,
1507    /// transitively searching all base class subobjects.
1508    ///
1509    /// This routine uses the callback function \p BaseMatches to find base
1510    /// classes meeting some search criteria, walking all base class subobjects
1511    /// and populating the given \p Paths structure with the paths through the
1512    /// inheritance hierarchy that resulted in a match. On a successful search,
1513    /// the \p Paths structure can be queried to retrieve the matching paths and
1514    /// to determine if there were any ambiguities.
1515    ///
1516    /// \param BaseMatches callback function used to determine whether a given
1517    /// base matches the user-defined search criteria.
1518    ///
1519    /// \param UserData user data pointer that will be provided to \p BaseMatches.
1520    ///
1521    /// \param Paths used to record the paths from this class to its base class
1522    /// subobjects that match the search criteria.
1523    ///
1524    /// \returns true if there exists any path from this class to a base class
1525    /// subobject that matches the search criteria.
1526    bool lookupInBases(BaseMatchesCallback *BaseMatches, void *UserData,
1527                       CXXBasePaths &Paths) const;
1528  
1529    /// \brief Base-class lookup callback that determines whether the given
1530    /// base class specifier refers to a specific class declaration.
1531    ///
1532    /// This callback can be used with \c lookupInBases() to determine whether
1533    /// a given derived class has is a base class subobject of a particular type.
1534    /// The user data pointer should refer to the canonical CXXRecordDecl of the
1535    /// base class that we are searching for.
1536    static bool FindBaseClass(const CXXBaseSpecifier *Specifier,
1537                              CXXBasePath &Path, void *BaseRecord);
1538  
1539    /// \brief Base-class lookup callback that determines whether the
1540    /// given base class specifier refers to a specific class
1541    /// declaration and describes virtual derivation.
1542    ///
1543    /// This callback can be used with \c lookupInBases() to determine
1544    /// whether a given derived class has is a virtual base class
1545    /// subobject of a particular type.  The user data pointer should
1546    /// refer to the canonical CXXRecordDecl of the base class that we
1547    /// are searching for.
1548    static bool FindVirtualBaseClass(const CXXBaseSpecifier *Specifier,
1549                                     CXXBasePath &Path, void *BaseRecord);
1550  
1551    /// \brief Base-class lookup callback that determines whether there exists
1552    /// a tag with the given name.
1553    ///
1554    /// This callback can be used with \c lookupInBases() to find tag members
1555    /// of the given name within a C++ class hierarchy. The user data pointer
1556    /// is an opaque \c DeclarationName pointer.
1557    static bool FindTagMember(const CXXBaseSpecifier *Specifier,
1558                              CXXBasePath &Path, void *Name);
1559  
1560    /// \brief Base-class lookup callback that determines whether there exists
1561    /// a member with the given name.
1562    ///
1563    /// This callback can be used with \c lookupInBases() to find members
1564    /// of the given name within a C++ class hierarchy. The user data pointer
1565    /// is an opaque \c DeclarationName pointer.
1566    static bool FindOrdinaryMember(const CXXBaseSpecifier *Specifier,
1567                                   CXXBasePath &Path, void *Name);
1568  
1569    /// \brief Base-class lookup callback that determines whether there exists
1570    /// a member with the given name that can be used in a nested-name-specifier.
1571    ///
1572    /// This callback can be used with \c lookupInBases() to find membes of
1573    /// the given name within a C++ class hierarchy that can occur within
1574    /// nested-name-specifiers.
1575    static bool FindNestedNameSpecifierMember(const CXXBaseSpecifier *Specifier,
1576                                              CXXBasePath &Path,
1577                                              void *UserData);
1578  
1579    /// \brief Retrieve the final overriders for each virtual member
1580    /// function in the class hierarchy where this class is the
1581    /// most-derived class in the class hierarchy.
1582    void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const;
1583  
1584    /// \brief Get the indirect primary bases for this class.
1585    void getIndirectPrimaryBases(CXXIndirectPrimaryBaseSet& Bases) const;
1586  
1587    /// Renders and displays an inheritance diagram
1588    /// for this C++ class and all of its base classes (transitively) using
1589    /// GraphViz.
1590    void viewInheritance(ASTContext& Context) const;
1591  
1592    /// \brief Calculates the access of a decl that is reached
1593    /// along a path.
MergeAccess(AccessSpecifier PathAccess,AccessSpecifier DeclAccess)1594    static AccessSpecifier MergeAccess(AccessSpecifier PathAccess,
1595                                       AccessSpecifier DeclAccess) {
1596      assert(DeclAccess != AS_none);
1597      if (DeclAccess == AS_private) return AS_none;
1598      return (PathAccess > DeclAccess ? PathAccess : DeclAccess);
1599    }
1600  
1601    /// \brief Indicates that the declaration of a defaulted or deleted special
1602    /// member function is now complete.
1603    void finishedDefaultedOrDeletedMember(CXXMethodDecl *MD);
1604  
1605    /// \brief Indicates that the definition of this class is now complete.
1606    void completeDefinition() override;
1607  
1608    /// \brief Indicates that the definition of this class is now complete,
1609    /// and provides a final overrider map to help determine
1610    ///
1611    /// \param FinalOverriders The final overrider map for this class, which can
1612    /// be provided as an optimization for abstract-class checking. If NULL,
1613    /// final overriders will be computed if they are needed to complete the
1614    /// definition.
1615    void completeDefinition(CXXFinalOverriderMap *FinalOverriders);
1616  
1617    /// \brief Determine whether this class may end up being abstract, even though
1618    /// it is not yet known to be abstract.
1619    ///
1620    /// \returns true if this class is not known to be abstract but has any
1621    /// base classes that are abstract. In this case, \c completeDefinition()
1622    /// will need to compute final overriders to determine whether the class is
1623    /// actually abstract.
1624    bool mayBeAbstract() const;
1625  
1626    /// \brief If this is the closure type of a lambda expression, retrieve the
1627    /// number to be used for name mangling in the Itanium C++ ABI.
1628    ///
1629    /// Zero indicates that this closure type has internal linkage, so the
1630    /// mangling number does not matter, while a non-zero value indicates which
1631    /// lambda expression this is in this particular context.
getLambdaManglingNumber()1632    unsigned getLambdaManglingNumber() const {
1633      assert(isLambda() && "Not a lambda closure type!");
1634      return getLambdaData().ManglingNumber;
1635    }
1636  
1637    /// \brief Retrieve the declaration that provides additional context for a
1638    /// lambda, when the normal declaration context is not specific enough.
1639    ///
1640    /// Certain contexts (default arguments of in-class function parameters and
1641    /// the initializers of data members) have separate name mangling rules for
1642    /// lambdas within the Itanium C++ ABI. For these cases, this routine provides
1643    /// the declaration in which the lambda occurs, e.g., the function parameter
1644    /// or the non-static data member. Otherwise, it returns NULL to imply that
1645    /// the declaration context suffices.
getLambdaContextDecl()1646    Decl *getLambdaContextDecl() const {
1647      assert(isLambda() && "Not a lambda closure type!");
1648      return getLambdaData().ContextDecl;
1649    }
1650  
1651    /// \brief Set the mangling number and context declaration for a lambda
1652    /// class.
setLambdaMangling(unsigned ManglingNumber,Decl * ContextDecl)1653    void setLambdaMangling(unsigned ManglingNumber, Decl *ContextDecl) {
1654      getLambdaData().ManglingNumber = ManglingNumber;
1655      getLambdaData().ContextDecl = ContextDecl;
1656    }
1657  
1658    /// \brief Returns the inheritance model used for this record.
1659    MSInheritanceAttr::Spelling getMSInheritanceModel() const;
1660    /// \brief Calculate what the inheritance model would be for this class.
1661    MSInheritanceAttr::Spelling calculateInheritanceModel() const;
1662  
1663    /// In the Microsoft C++ ABI, use zero for the field offset of a null data
1664    /// member pointer if we can guarantee that zero is not a valid field offset,
1665    /// or if the member pointer has multiple fields.  Polymorphic classes have a
1666    /// vfptr at offset zero, so we can use zero for null.  If there are multiple
1667    /// fields, we can use zero even if it is a valid field offset because
1668    /// null-ness testing will check the other fields.
nullFieldOffsetIsZero()1669    bool nullFieldOffsetIsZero() const {
1670      return !MSInheritanceAttr::hasOnlyOneField(/*IsMemberFunction=*/false,
1671                                                 getMSInheritanceModel()) ||
1672             (hasDefinition() && isPolymorphic());
1673    }
1674  
1675    /// \brief Controls when vtordisps will be emitted if this record is used as a
1676    /// virtual base.
1677    MSVtorDispAttr::Mode getMSVtorDispMode() const;
1678  
1679    /// \brief Determine whether this lambda expression was known to be dependent
1680    /// at the time it was created, even if its context does not appear to be
1681    /// dependent.
1682    ///
1683    /// This flag is a workaround for an issue with parsing, where default
1684    /// arguments are parsed before their enclosing function declarations have
1685    /// been created. This means that any lambda expressions within those
1686    /// default arguments will have as their DeclContext the context enclosing
1687    /// the function declaration, which may be non-dependent even when the
1688    /// function declaration itself is dependent. This flag indicates when we
1689    /// know that the lambda is dependent despite that.
isDependentLambda()1690    bool isDependentLambda() const {
1691      return isLambda() && getLambdaData().Dependent;
1692    }
1693  
getLambdaTypeInfo()1694    TypeSourceInfo *getLambdaTypeInfo() const {
1695      return getLambdaData().MethodTyInfo;
1696    }
1697  
classof(const Decl * D)1698    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)1699    static bool classofKind(Kind K) {
1700      return K >= firstCXXRecord && K <= lastCXXRecord;
1701    }
1702  
1703    friend class ASTDeclReader;
1704    friend class ASTDeclWriter;
1705    friend class ASTReader;
1706    friend class ASTWriter;
1707  };
1708  
1709  /// \brief Represents a static or instance method of a struct/union/class.
1710  ///
1711  /// In the terminology of the C++ Standard, these are the (static and
1712  /// non-static) member functions, whether virtual or not.
1713  class CXXMethodDecl : public FunctionDecl {
1714    void anchor() override;
1715  protected:
CXXMethodDecl(Kind DK,ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,StorageClass SC,bool isInline,bool isConstexpr,SourceLocation EndLocation)1716    CXXMethodDecl(Kind DK, ASTContext &C, CXXRecordDecl *RD,
1717                  SourceLocation StartLoc, const DeclarationNameInfo &NameInfo,
1718                  QualType T, TypeSourceInfo *TInfo,
1719                  StorageClass SC, bool isInline,
1720                  bool isConstexpr, SourceLocation EndLocation)
1721      : FunctionDecl(DK, C, RD, StartLoc, NameInfo, T, TInfo,
1722                     SC, isInline, isConstexpr) {
1723      if (EndLocation.isValid())
1724        setRangeEnd(EndLocation);
1725    }
1726  
1727  public:
1728    static CXXMethodDecl *Create(ASTContext &C, CXXRecordDecl *RD,
1729                                 SourceLocation StartLoc,
1730                                 const DeclarationNameInfo &NameInfo,
1731                                 QualType T, TypeSourceInfo *TInfo,
1732                                 StorageClass SC,
1733                                 bool isInline,
1734                                 bool isConstexpr,
1735                                 SourceLocation EndLocation);
1736  
1737    static CXXMethodDecl *CreateDeserialized(ASTContext &C, unsigned ID);
1738  
1739    bool isStatic() const;
isInstance()1740    bool isInstance() const { return !isStatic(); }
1741  
1742    /// Returns true if the given operator is implicitly static in a record
1743    /// context.
isStaticOverloadedOperator(OverloadedOperatorKind OOK)1744    static bool isStaticOverloadedOperator(OverloadedOperatorKind OOK) {
1745      // [class.free]p1:
1746      // Any allocation function for a class T is a static member
1747      // (even if not explicitly declared static).
1748      // [class.free]p6 Any deallocation function for a class X is a static member
1749      // (even if not explicitly declared static).
1750      return OOK == OO_New || OOK == OO_Array_New || OOK == OO_Delete ||
1751             OOK == OO_Array_Delete;
1752    }
1753  
isConst()1754    bool isConst() const { return getType()->castAs<FunctionType>()->isConst(); }
isVolatile()1755    bool isVolatile() const { return getType()->castAs<FunctionType>()->isVolatile(); }
1756  
isVirtual()1757    bool isVirtual() const {
1758      CXXMethodDecl *CD =
1759        cast<CXXMethodDecl>(const_cast<CXXMethodDecl*>(this)->getCanonicalDecl());
1760  
1761      // Member function is virtual if it is marked explicitly so, or if it is
1762      // declared in __interface -- then it is automatically pure virtual.
1763      if (CD->isVirtualAsWritten() || CD->isPure())
1764        return true;
1765  
1766      return (CD->begin_overridden_methods() != CD->end_overridden_methods());
1767    }
1768  
1769    /// \brief Determine whether this is a usual deallocation function
1770    /// (C++ [basic.stc.dynamic.deallocation]p2), which is an overloaded
1771    /// delete or delete[] operator with a particular signature.
1772    bool isUsualDeallocationFunction() const;
1773  
1774    /// \brief Determine whether this is a copy-assignment operator, regardless
1775    /// of whether it was declared implicitly or explicitly.
1776    bool isCopyAssignmentOperator() const;
1777  
1778    /// \brief Determine whether this is a move assignment operator.
1779    bool isMoveAssignmentOperator() const;
1780  
getCanonicalDecl()1781    CXXMethodDecl *getCanonicalDecl() override {
1782      return cast<CXXMethodDecl>(FunctionDecl::getCanonicalDecl());
1783    }
getCanonicalDecl()1784    const CXXMethodDecl *getCanonicalDecl() const override {
1785      return const_cast<CXXMethodDecl*>(this)->getCanonicalDecl();
1786    }
1787  
getMostRecentDecl()1788    CXXMethodDecl *getMostRecentDecl() {
1789      return cast<CXXMethodDecl>(
1790              static_cast<FunctionDecl *>(this)->getMostRecentDecl());
1791    }
getMostRecentDecl()1792    const CXXMethodDecl *getMostRecentDecl() const {
1793      return const_cast<CXXMethodDecl*>(this)->getMostRecentDecl();
1794    }
1795  
1796    /// True if this method is user-declared and was not
1797    /// deleted or defaulted on its first declaration.
isUserProvided()1798    bool isUserProvided() const {
1799      return !(isDeleted() || getCanonicalDecl()->isDefaulted());
1800    }
1801  
1802    ///
1803    void addOverriddenMethod(const CXXMethodDecl *MD);
1804  
1805    typedef const CXXMethodDecl *const* method_iterator;
1806  
1807    method_iterator begin_overridden_methods() const;
1808    method_iterator end_overridden_methods() const;
1809    unsigned size_overridden_methods() const;
1810  
1811    /// Returns the parent of this method declaration, which
1812    /// is the class in which this method is defined.
getParent()1813    const CXXRecordDecl *getParent() const {
1814      return cast<CXXRecordDecl>(FunctionDecl::getParent());
1815    }
1816  
1817    /// Returns the parent of this method declaration, which
1818    /// is the class in which this method is defined.
getParent()1819    CXXRecordDecl *getParent() {
1820      return const_cast<CXXRecordDecl *>(
1821               cast<CXXRecordDecl>(FunctionDecl::getParent()));
1822    }
1823  
1824    /// \brief Returns the type of the \c this pointer.
1825    ///
1826    /// Should only be called for instance (i.e., non-static) methods.
1827    QualType getThisType(ASTContext &C) const;
1828  
getTypeQualifiers()1829    unsigned getTypeQualifiers() const {
1830      return getType()->getAs<FunctionProtoType>()->getTypeQuals();
1831    }
1832  
1833    /// \brief Retrieve the ref-qualifier associated with this method.
1834    ///
1835    /// In the following example, \c f() has an lvalue ref-qualifier, \c g()
1836    /// has an rvalue ref-qualifier, and \c h() has no ref-qualifier.
1837    /// @code
1838    /// struct X {
1839    ///   void f() &;
1840    ///   void g() &&;
1841    ///   void h();
1842    /// };
1843    /// @endcode
getRefQualifier()1844    RefQualifierKind getRefQualifier() const {
1845      return getType()->getAs<FunctionProtoType>()->getRefQualifier();
1846    }
1847  
1848    bool hasInlineBody() const;
1849  
1850    /// \brief Determine whether this is a lambda closure type's static member
1851    /// function that is used for the result of the lambda's conversion to
1852    /// function pointer (for a lambda with no captures).
1853    ///
1854    /// The function itself, if used, will have a placeholder body that will be
1855    /// supplied by IR generation to either forward to the function call operator
1856    /// or clone the function call operator.
1857    bool isLambdaStaticInvoker() const;
1858  
1859    /// \brief Find the method in \p RD that corresponds to this one.
1860    ///
1861    /// Find if \p RD or one of the classes it inherits from override this method.
1862    /// If so, return it. \p RD is assumed to be a subclass of the class defining
1863    /// this method (or be the class itself), unless \p MayBeBase is set to true.
1864    CXXMethodDecl *
1865    getCorrespondingMethodInClass(const CXXRecordDecl *RD,
1866                                  bool MayBeBase = false);
1867  
1868    const CXXMethodDecl *
1869    getCorrespondingMethodInClass(const CXXRecordDecl *RD,
1870                                  bool MayBeBase = false) const {
1871      return const_cast<CXXMethodDecl *>(this)
1872                ->getCorrespondingMethodInClass(RD, MayBeBase);
1873    }
1874  
1875    // Implement isa/cast/dyncast/etc.
classof(const Decl * D)1876    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)1877    static bool classofKind(Kind K) {
1878      return K >= firstCXXMethod && K <= lastCXXMethod;
1879    }
1880  };
1881  
1882  /// \brief Represents a C++ base or member initializer.
1883  ///
1884  /// This is part of a constructor initializer that
1885  /// initializes one non-static member variable or one base class. For
1886  /// example, in the following, both 'A(a)' and 'f(3.14159)' are member
1887  /// initializers:
1888  ///
1889  /// \code
1890  /// class A { };
1891  /// class B : public A {
1892  ///   float f;
1893  /// public:
1894  ///   B(A& a) : A(a), f(3.14159) { }
1895  /// };
1896  /// \endcode
1897  class CXXCtorInitializer {
1898    /// \brief Either the base class name/delegating constructor type (stored as
1899    /// a TypeSourceInfo*), an normal field (FieldDecl), or an anonymous field
1900    /// (IndirectFieldDecl*) being initialized.
1901    llvm::PointerUnion3<TypeSourceInfo *, FieldDecl *, IndirectFieldDecl *>
1902      Initializee;
1903  
1904    /// \brief The source location for the field name or, for a base initializer
1905    /// pack expansion, the location of the ellipsis.
1906    ///
1907    /// In the case of a delegating
1908    /// constructor, it will still include the type's source location as the
1909    /// Initializee points to the CXXConstructorDecl (to allow loop detection).
1910    SourceLocation MemberOrEllipsisLocation;
1911  
1912    /// \brief The argument used to initialize the base or member, which may
1913    /// end up constructing an object (when multiple arguments are involved).
1914    Stmt *Init;
1915  
1916    /// \brief Location of the left paren of the ctor-initializer.
1917    SourceLocation LParenLoc;
1918  
1919    /// \brief Location of the right paren of the ctor-initializer.
1920    SourceLocation RParenLoc;
1921  
1922    /// \brief If the initializee is a type, whether that type makes this
1923    /// a delegating initialization.
1924    bool IsDelegating : 1;
1925  
1926    /// \brief If the initializer is a base initializer, this keeps track
1927    /// of whether the base is virtual or not.
1928    bool IsVirtual : 1;
1929  
1930    /// \brief Whether or not the initializer is explicitly written
1931    /// in the sources.
1932    bool IsWritten : 1;
1933  
1934    /// If IsWritten is true, then this number keeps track of the textual order
1935    /// of this initializer in the original sources, counting from 0; otherwise,
1936    /// it stores the number of array index variables stored after this object
1937    /// in memory.
1938    unsigned SourceOrderOrNumArrayIndices : 13;
1939  
1940    CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
1941                       SourceLocation MemberLoc, SourceLocation L, Expr *Init,
1942                       SourceLocation R, VarDecl **Indices, unsigned NumIndices);
1943  
1944  public:
1945    /// \brief Creates a new base-class initializer.
1946    explicit
1947    CXXCtorInitializer(ASTContext &Context, TypeSourceInfo *TInfo, bool IsVirtual,
1948                       SourceLocation L, Expr *Init, SourceLocation R,
1949                       SourceLocation EllipsisLoc);
1950  
1951    /// \brief Creates a new member initializer.
1952    explicit
1953    CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
1954                       SourceLocation MemberLoc, SourceLocation L, Expr *Init,
1955                       SourceLocation R);
1956  
1957    /// \brief Creates a new anonymous field initializer.
1958    explicit
1959    CXXCtorInitializer(ASTContext &Context, IndirectFieldDecl *Member,
1960                       SourceLocation MemberLoc, SourceLocation L, Expr *Init,
1961                       SourceLocation R);
1962  
1963    /// \brief Creates a new delegating initializer.
1964    explicit
1965    CXXCtorInitializer(ASTContext &Context, TypeSourceInfo *TInfo,
1966                       SourceLocation L, Expr *Init, SourceLocation R);
1967  
1968    /// \brief Creates a new member initializer that optionally contains
1969    /// array indices used to describe an elementwise initialization.
1970    static CXXCtorInitializer *Create(ASTContext &Context, FieldDecl *Member,
1971                                      SourceLocation MemberLoc, SourceLocation L,
1972                                      Expr *Init, SourceLocation R,
1973                                      VarDecl **Indices, unsigned NumIndices);
1974  
1975    /// \brief Determine whether this initializer is initializing a base class.
isBaseInitializer()1976    bool isBaseInitializer() const {
1977      return Initializee.is<TypeSourceInfo*>() && !IsDelegating;
1978    }
1979  
1980    /// \brief Determine whether this initializer is initializing a non-static
1981    /// data member.
isMemberInitializer()1982    bool isMemberInitializer() const { return Initializee.is<FieldDecl*>(); }
1983  
isAnyMemberInitializer()1984    bool isAnyMemberInitializer() const {
1985      return isMemberInitializer() || isIndirectMemberInitializer();
1986    }
1987  
isIndirectMemberInitializer()1988    bool isIndirectMemberInitializer() const {
1989      return Initializee.is<IndirectFieldDecl*>();
1990    }
1991  
1992    /// \brief Determine whether this initializer is an implicit initializer
1993    /// generated for a field with an initializer defined on the member
1994    /// declaration.
1995    ///
1996    /// In-class member initializers (also known as "non-static data member
1997    /// initializations", NSDMIs) were introduced in C++11.
isInClassMemberInitializer()1998    bool isInClassMemberInitializer() const {
1999      return Init->getStmtClass() == Stmt::CXXDefaultInitExprClass;
2000    }
2001  
2002    /// \brief Determine whether this initializer is creating a delegating
2003    /// constructor.
isDelegatingInitializer()2004    bool isDelegatingInitializer() const {
2005      return Initializee.is<TypeSourceInfo*>() && IsDelegating;
2006    }
2007  
2008    /// \brief Determine whether this initializer is a pack expansion.
isPackExpansion()2009    bool isPackExpansion() const {
2010      return isBaseInitializer() && MemberOrEllipsisLocation.isValid();
2011    }
2012  
2013    // \brief For a pack expansion, returns the location of the ellipsis.
getEllipsisLoc()2014    SourceLocation getEllipsisLoc() const {
2015      assert(isPackExpansion() && "Initializer is not a pack expansion");
2016      return MemberOrEllipsisLocation;
2017    }
2018  
2019    /// If this is a base class initializer, returns the type of the
2020    /// base class with location information. Otherwise, returns an NULL
2021    /// type location.
2022    TypeLoc getBaseClassLoc() const;
2023  
2024    /// If this is a base class initializer, returns the type of the base class.
2025    /// Otherwise, returns null.
2026    const Type *getBaseClass() const;
2027  
2028    /// Returns whether the base is virtual or not.
isBaseVirtual()2029    bool isBaseVirtual() const {
2030      assert(isBaseInitializer() && "Must call this on base initializer!");
2031  
2032      return IsVirtual;
2033    }
2034  
2035    /// \brief Returns the declarator information for a base class or delegating
2036    /// initializer.
getTypeSourceInfo()2037    TypeSourceInfo *getTypeSourceInfo() const {
2038      return Initializee.dyn_cast<TypeSourceInfo *>();
2039    }
2040  
2041    /// \brief If this is a member initializer, returns the declaration of the
2042    /// non-static data member being initialized. Otherwise, returns null.
getMember()2043    FieldDecl *getMember() const {
2044      if (isMemberInitializer())
2045        return Initializee.get<FieldDecl*>();
2046      return nullptr;
2047    }
getAnyMember()2048    FieldDecl *getAnyMember() const {
2049      if (isMemberInitializer())
2050        return Initializee.get<FieldDecl*>();
2051      if (isIndirectMemberInitializer())
2052        return Initializee.get<IndirectFieldDecl*>()->getAnonField();
2053      return nullptr;
2054    }
2055  
getIndirectMember()2056    IndirectFieldDecl *getIndirectMember() const {
2057      if (isIndirectMemberInitializer())
2058        return Initializee.get<IndirectFieldDecl*>();
2059      return nullptr;
2060    }
2061  
getMemberLocation()2062    SourceLocation getMemberLocation() const {
2063      return MemberOrEllipsisLocation;
2064    }
2065  
2066    /// \brief Determine the source location of the initializer.
2067    SourceLocation getSourceLocation() const;
2068  
2069    /// \brief Determine the source range covering the entire initializer.
2070    SourceRange getSourceRange() const LLVM_READONLY;
2071  
2072    /// \brief Determine whether this initializer is explicitly written
2073    /// in the source code.
isWritten()2074    bool isWritten() const { return IsWritten; }
2075  
2076    /// \brief Return the source position of the initializer, counting from 0.
2077    /// If the initializer was implicit, -1 is returned.
getSourceOrder()2078    int getSourceOrder() const {
2079      return IsWritten ? static_cast<int>(SourceOrderOrNumArrayIndices) : -1;
2080    }
2081  
2082    /// \brief Set the source order of this initializer.
2083    ///
2084    /// This can only be called once for each initializer; it cannot be called
2085    /// on an initializer having a positive number of (implicit) array indices.
2086    ///
2087    /// This assumes that the initialzier was written in the source code, and
2088    /// ensures that isWritten() returns true.
setSourceOrder(int pos)2089    void setSourceOrder(int pos) {
2090      assert(!IsWritten &&
2091             "calling twice setSourceOrder() on the same initializer");
2092      assert(SourceOrderOrNumArrayIndices == 0 &&
2093             "setSourceOrder() used when there are implicit array indices");
2094      assert(pos >= 0 &&
2095             "setSourceOrder() used to make an initializer implicit");
2096      IsWritten = true;
2097      SourceOrderOrNumArrayIndices = static_cast<unsigned>(pos);
2098    }
2099  
getLParenLoc()2100    SourceLocation getLParenLoc() const { return LParenLoc; }
getRParenLoc()2101    SourceLocation getRParenLoc() const { return RParenLoc; }
2102  
2103    /// \brief Determine the number of implicit array indices used while
2104    /// described an array member initialization.
getNumArrayIndices()2105    unsigned getNumArrayIndices() const {
2106      return IsWritten ? 0 : SourceOrderOrNumArrayIndices;
2107    }
2108  
2109    /// \brief Retrieve a particular array index variable used to
2110    /// describe an array member initialization.
getArrayIndex(unsigned I)2111    VarDecl *getArrayIndex(unsigned I) {
2112      assert(I < getNumArrayIndices() && "Out of bounds member array index");
2113      return reinterpret_cast<VarDecl **>(this + 1)[I];
2114    }
getArrayIndex(unsigned I)2115    const VarDecl *getArrayIndex(unsigned I) const {
2116      assert(I < getNumArrayIndices() && "Out of bounds member array index");
2117      return reinterpret_cast<const VarDecl * const *>(this + 1)[I];
2118    }
setArrayIndex(unsigned I,VarDecl * Index)2119    void setArrayIndex(unsigned I, VarDecl *Index) {
2120      assert(I < getNumArrayIndices() && "Out of bounds member array index");
2121      reinterpret_cast<VarDecl **>(this + 1)[I] = Index;
2122    }
getArrayIndexes()2123    ArrayRef<VarDecl *> getArrayIndexes() {
2124      assert(getNumArrayIndices() != 0 && "Getting indexes for non-array init");
2125      return llvm::makeArrayRef(reinterpret_cast<VarDecl **>(this + 1),
2126                                getNumArrayIndices());
2127    }
2128  
2129    /// \brief Get the initializer.
getInit()2130    Expr *getInit() const { return static_cast<Expr*>(Init); }
2131  };
2132  
2133  /// \brief Represents a C++ constructor within a class.
2134  ///
2135  /// For example:
2136  ///
2137  /// \code
2138  /// class X {
2139  /// public:
2140  ///   explicit X(int); // represented by a CXXConstructorDecl.
2141  /// };
2142  /// \endcode
2143  class CXXConstructorDecl : public CXXMethodDecl {
2144    void anchor() override;
2145    /// \brief Whether this constructor declaration has the \c explicit keyword
2146    /// specified.
2147    bool IsExplicitSpecified : 1;
2148  
2149    /// \name Support for base and member initializers.
2150    /// \{
2151    /// \brief The arguments used to initialize the base or member.
2152    LazyCXXCtorInitializersPtr CtorInitializers;
2153    unsigned NumCtorInitializers;
2154    /// \}
2155  
CXXConstructorDecl(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isExplicitSpecified,bool isInline,bool isImplicitlyDeclared,bool isConstexpr)2156    CXXConstructorDecl(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2157                       const DeclarationNameInfo &NameInfo,
2158                       QualType T, TypeSourceInfo *TInfo,
2159                       bool isExplicitSpecified, bool isInline,
2160                       bool isImplicitlyDeclared, bool isConstexpr)
2161      : CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
2162                      SC_None, isInline, isConstexpr, SourceLocation()),
2163        IsExplicitSpecified(isExplicitSpecified), CtorInitializers(nullptr),
2164        NumCtorInitializers(0) {
2165      setImplicit(isImplicitlyDeclared);
2166    }
2167  
2168  public:
2169    static CXXConstructorDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2170    static CXXConstructorDecl *Create(ASTContext &C, CXXRecordDecl *RD,
2171                                      SourceLocation StartLoc,
2172                                      const DeclarationNameInfo &NameInfo,
2173                                      QualType T, TypeSourceInfo *TInfo,
2174                                      bool isExplicit,
2175                                      bool isInline, bool isImplicitlyDeclared,
2176                                      bool isConstexpr);
2177  
2178    /// \brief Determine whether this constructor declaration has the
2179    /// \c explicit keyword specified.
isExplicitSpecified()2180    bool isExplicitSpecified() const { return IsExplicitSpecified; }
2181  
2182    /// \brief Determine whether this constructor was marked "explicit" or not.
isExplicit()2183    bool isExplicit() const {
2184      return cast<CXXConstructorDecl>(getFirstDecl())->isExplicitSpecified();
2185    }
2186  
2187    /// \brief Iterates through the member/base initializer list.
2188    typedef CXXCtorInitializer **init_iterator;
2189  
2190    /// \brief Iterates through the member/base initializer list.
2191    typedef CXXCtorInitializer *const *init_const_iterator;
2192  
2193    typedef llvm::iterator_range<init_iterator> init_range;
2194    typedef llvm::iterator_range<init_const_iterator> init_const_range;
2195  
inits()2196    init_range inits() { return init_range(init_begin(), init_end()); }
inits()2197    init_const_range inits() const {
2198      return init_const_range(init_begin(), init_end());
2199    }
2200  
2201    /// \brief Retrieve an iterator to the first initializer.
init_begin()2202    init_iterator init_begin() {
2203      const auto *ConstThis = this;
2204      return const_cast<init_iterator>(ConstThis->init_begin());
2205    }
2206    /// \brief Retrieve an iterator to the first initializer.
2207    init_const_iterator init_begin() const;
2208  
2209    /// \brief Retrieve an iterator past the last initializer.
init_end()2210    init_iterator       init_end()       {
2211      return init_begin() + NumCtorInitializers;
2212    }
2213    /// \brief Retrieve an iterator past the last initializer.
init_end()2214    init_const_iterator init_end() const {
2215      return init_begin() + NumCtorInitializers;
2216    }
2217  
2218    typedef std::reverse_iterator<init_iterator> init_reverse_iterator;
2219    typedef std::reverse_iterator<init_const_iterator>
2220            init_const_reverse_iterator;
2221  
init_rbegin()2222    init_reverse_iterator init_rbegin() {
2223      return init_reverse_iterator(init_end());
2224    }
init_rbegin()2225    init_const_reverse_iterator init_rbegin() const {
2226      return init_const_reverse_iterator(init_end());
2227    }
2228  
init_rend()2229    init_reverse_iterator init_rend() {
2230      return init_reverse_iterator(init_begin());
2231    }
init_rend()2232    init_const_reverse_iterator init_rend() const {
2233      return init_const_reverse_iterator(init_begin());
2234    }
2235  
2236    /// \brief Determine the number of arguments used to initialize the member
2237    /// or base.
getNumCtorInitializers()2238    unsigned getNumCtorInitializers() const {
2239        return NumCtorInitializers;
2240    }
2241  
setNumCtorInitializers(unsigned numCtorInitializers)2242    void setNumCtorInitializers(unsigned numCtorInitializers) {
2243      NumCtorInitializers = numCtorInitializers;
2244    }
2245  
setCtorInitializers(CXXCtorInitializer ** Initializers)2246    void setCtorInitializers(CXXCtorInitializer **Initializers) {
2247      CtorInitializers = Initializers;
2248    }
2249  
2250    /// \brief Determine whether this constructor is a delegating constructor.
isDelegatingConstructor()2251    bool isDelegatingConstructor() const {
2252      return (getNumCtorInitializers() == 1) &&
2253             init_begin()[0]->isDelegatingInitializer();
2254    }
2255  
2256    /// \brief When this constructor delegates to another, retrieve the target.
2257    CXXConstructorDecl *getTargetConstructor() const;
2258  
2259    /// Whether this constructor is a default
2260    /// constructor (C++ [class.ctor]p5), which can be used to
2261    /// default-initialize a class of this type.
2262    bool isDefaultConstructor() const;
2263  
2264    /// \brief Whether this constructor is a copy constructor (C++ [class.copy]p2,
2265    /// which can be used to copy the class.
2266    ///
2267    /// \p TypeQuals will be set to the qualifiers on the
2268    /// argument type. For example, \p TypeQuals would be set to \c
2269    /// Qualifiers::Const for the following copy constructor:
2270    ///
2271    /// \code
2272    /// class X {
2273    /// public:
2274    ///   X(const X&);
2275    /// };
2276    /// \endcode
2277    bool isCopyConstructor(unsigned &TypeQuals) const;
2278  
2279    /// Whether this constructor is a copy
2280    /// constructor (C++ [class.copy]p2, which can be used to copy the
2281    /// class.
isCopyConstructor()2282    bool isCopyConstructor() const {
2283      unsigned TypeQuals = 0;
2284      return isCopyConstructor(TypeQuals);
2285    }
2286  
2287    /// \brief Determine whether this constructor is a move constructor
2288    /// (C++0x [class.copy]p3), which can be used to move values of the class.
2289    ///
2290    /// \param TypeQuals If this constructor is a move constructor, will be set
2291    /// to the type qualifiers on the referent of the first parameter's type.
2292    bool isMoveConstructor(unsigned &TypeQuals) const;
2293  
2294    /// \brief Determine whether this constructor is a move constructor
2295    /// (C++0x [class.copy]p3), which can be used to move values of the class.
isMoveConstructor()2296    bool isMoveConstructor() const {
2297      unsigned TypeQuals = 0;
2298      return isMoveConstructor(TypeQuals);
2299    }
2300  
2301    /// \brief Determine whether this is a copy or move constructor.
2302    ///
2303    /// \param TypeQuals Will be set to the type qualifiers on the reference
2304    /// parameter, if in fact this is a copy or move constructor.
2305    bool isCopyOrMoveConstructor(unsigned &TypeQuals) const;
2306  
2307    /// \brief Determine whether this a copy or move constructor.
isCopyOrMoveConstructor()2308    bool isCopyOrMoveConstructor() const {
2309      unsigned Quals;
2310      return isCopyOrMoveConstructor(Quals);
2311    }
2312  
2313    /// Whether this constructor is a
2314    /// converting constructor (C++ [class.conv.ctor]), which can be
2315    /// used for user-defined conversions.
2316    bool isConvertingConstructor(bool AllowExplicit) const;
2317  
2318    /// \brief Determine whether this is a member template specialization that
2319    /// would copy the object to itself. Such constructors are never used to copy
2320    /// an object.
2321    bool isSpecializationCopyingObject() const;
2322  
2323    /// \brief Get the constructor that this inheriting constructor is based on.
2324    const CXXConstructorDecl *getInheritedConstructor() const;
2325  
2326    /// \brief Set the constructor that this inheriting constructor is based on.
2327    void setInheritedConstructor(const CXXConstructorDecl *BaseCtor);
2328  
getCanonicalDecl()2329    const CXXConstructorDecl *getCanonicalDecl() const override {
2330      return cast<CXXConstructorDecl>(FunctionDecl::getCanonicalDecl());
2331    }
getCanonicalDecl()2332    CXXConstructorDecl *getCanonicalDecl() override {
2333      return cast<CXXConstructorDecl>(FunctionDecl::getCanonicalDecl());
2334    }
2335  
2336    // Implement isa/cast/dyncast/etc.
classof(const Decl * D)2337    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2338    static bool classofKind(Kind K) { return K == CXXConstructor; }
2339  
2340    friend class ASTDeclReader;
2341    friend class ASTDeclWriter;
2342  };
2343  
2344  /// \brief Represents a C++ destructor within a class.
2345  ///
2346  /// For example:
2347  ///
2348  /// \code
2349  /// class X {
2350  /// public:
2351  ///   ~X(); // represented by a CXXDestructorDecl.
2352  /// };
2353  /// \endcode
2354  class CXXDestructorDecl : public CXXMethodDecl {
2355    void anchor() override;
2356  
2357    FunctionDecl *OperatorDelete;
2358  
CXXDestructorDecl(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isInline,bool isImplicitlyDeclared)2359    CXXDestructorDecl(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2360                      const DeclarationNameInfo &NameInfo,
2361                      QualType T, TypeSourceInfo *TInfo,
2362                      bool isInline, bool isImplicitlyDeclared)
2363      : CXXMethodDecl(CXXDestructor, C, RD, StartLoc, NameInfo, T, TInfo,
2364                      SC_None, isInline, /*isConstexpr=*/false, SourceLocation()),
2365        OperatorDelete(nullptr) {
2366      setImplicit(isImplicitlyDeclared);
2367    }
2368  
2369  public:
2370    static CXXDestructorDecl *Create(ASTContext &C, CXXRecordDecl *RD,
2371                                     SourceLocation StartLoc,
2372                                     const DeclarationNameInfo &NameInfo,
2373                                     QualType T, TypeSourceInfo* TInfo,
2374                                     bool isInline,
2375                                     bool isImplicitlyDeclared);
2376    static CXXDestructorDecl *CreateDeserialized(ASTContext & C, unsigned ID);
2377  
2378    void setOperatorDelete(FunctionDecl *OD);
getOperatorDelete()2379    const FunctionDecl *getOperatorDelete() const {
2380      return cast<CXXDestructorDecl>(getFirstDecl())->OperatorDelete;
2381    }
2382  
2383    // Implement isa/cast/dyncast/etc.
classof(const Decl * D)2384    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2385    static bool classofKind(Kind K) { return K == CXXDestructor; }
2386  
2387    friend class ASTDeclReader;
2388    friend class ASTDeclWriter;
2389  };
2390  
2391  /// \brief Represents a C++ conversion function within a class.
2392  ///
2393  /// For example:
2394  ///
2395  /// \code
2396  /// class X {
2397  /// public:
2398  ///   operator bool();
2399  /// };
2400  /// \endcode
2401  class CXXConversionDecl : public CXXMethodDecl {
2402    void anchor() override;
2403    /// Whether this conversion function declaration is marked
2404    /// "explicit", meaning that it can only be applied when the user
2405    /// explicitly wrote a cast. This is a C++0x feature.
2406    bool IsExplicitSpecified : 1;
2407  
CXXConversionDecl(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isInline,bool isExplicitSpecified,bool isConstexpr,SourceLocation EndLocation)2408    CXXConversionDecl(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2409                      const DeclarationNameInfo &NameInfo,
2410                      QualType T, TypeSourceInfo *TInfo,
2411                      bool isInline, bool isExplicitSpecified,
2412                      bool isConstexpr, SourceLocation EndLocation)
2413      : CXXMethodDecl(CXXConversion, C, RD, StartLoc, NameInfo, T, TInfo,
2414                      SC_None, isInline, isConstexpr, EndLocation),
2415        IsExplicitSpecified(isExplicitSpecified) { }
2416  
2417  public:
2418    static CXXConversionDecl *Create(ASTContext &C, CXXRecordDecl *RD,
2419                                     SourceLocation StartLoc,
2420                                     const DeclarationNameInfo &NameInfo,
2421                                     QualType T, TypeSourceInfo *TInfo,
2422                                     bool isInline, bool isExplicit,
2423                                     bool isConstexpr,
2424                                     SourceLocation EndLocation);
2425    static CXXConversionDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2426  
2427    /// Whether this conversion function declaration is marked
2428    /// "explicit", meaning that it can only be used for direct initialization
2429    /// (including explitly written casts).  This is a C++11 feature.
isExplicitSpecified()2430    bool isExplicitSpecified() const { return IsExplicitSpecified; }
2431  
2432    /// \brief Whether this is an explicit conversion operator (C++11 and later).
2433    ///
2434    /// Explicit conversion operators are only considered for direct
2435    /// initialization, e.g., when the user has explicitly written a cast.
isExplicit()2436    bool isExplicit() const {
2437      return cast<CXXConversionDecl>(getFirstDecl())->isExplicitSpecified();
2438    }
2439  
2440    /// \brief Returns the type that this conversion function is converting to.
getConversionType()2441    QualType getConversionType() const {
2442      return getType()->getAs<FunctionType>()->getReturnType();
2443    }
2444  
2445    /// \brief Determine whether this conversion function is a conversion from
2446    /// a lambda closure type to a block pointer.
2447    bool isLambdaToBlockPointerConversion() const;
2448  
2449    // Implement isa/cast/dyncast/etc.
classof(const Decl * D)2450    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2451    static bool classofKind(Kind K) { return K == CXXConversion; }
2452  
2453    friend class ASTDeclReader;
2454    friend class ASTDeclWriter;
2455  };
2456  
2457  /// \brief Represents a linkage specification.
2458  ///
2459  /// For example:
2460  /// \code
2461  ///   extern "C" void foo();
2462  /// \endcode
2463  class LinkageSpecDecl : public Decl, public DeclContext {
2464    virtual void anchor();
2465  public:
2466    /// \brief Represents the language in a linkage specification.
2467    ///
2468    /// The values are part of the serialization ABI for
2469    /// ASTs and cannot be changed without altering that ABI.  To help
2470    /// ensure a stable ABI for this, we choose the DW_LANG_ encodings
2471    /// from the dwarf standard.
2472    enum LanguageIDs {
2473      lang_c = /* DW_LANG_C */ 0x0002,
2474      lang_cxx = /* DW_LANG_C_plus_plus */ 0x0004
2475    };
2476  private:
2477    /// \brief The language for this linkage specification.
2478    unsigned Language : 3;
2479    /// \brief True if this linkage spec has braces.
2480    ///
2481    /// This is needed so that hasBraces() returns the correct result while the
2482    /// linkage spec body is being parsed.  Once RBraceLoc has been set this is
2483    /// not used, so it doesn't need to be serialized.
2484    unsigned HasBraces : 1;
2485    /// \brief The source location for the extern keyword.
2486    SourceLocation ExternLoc;
2487    /// \brief The source location for the right brace (if valid).
2488    SourceLocation RBraceLoc;
2489  
LinkageSpecDecl(DeclContext * DC,SourceLocation ExternLoc,SourceLocation LangLoc,LanguageIDs lang,bool HasBraces)2490    LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
2491                    SourceLocation LangLoc, LanguageIDs lang, bool HasBraces)
2492      : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
2493        Language(lang), HasBraces(HasBraces), ExternLoc(ExternLoc),
2494        RBraceLoc(SourceLocation()) { }
2495  
2496  public:
2497    static LinkageSpecDecl *Create(ASTContext &C, DeclContext *DC,
2498                                   SourceLocation ExternLoc,
2499                                   SourceLocation LangLoc, LanguageIDs Lang,
2500                                   bool HasBraces);
2501    static LinkageSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2502  
2503    /// \brief Return the language specified by this linkage specification.
getLanguage()2504    LanguageIDs getLanguage() const { return LanguageIDs(Language); }
2505    /// \brief Set the language specified by this linkage specification.
setLanguage(LanguageIDs L)2506    void setLanguage(LanguageIDs L) { Language = L; }
2507  
2508    /// \brief Determines whether this linkage specification had braces in
2509    /// its syntactic form.
hasBraces()2510    bool hasBraces() const {
2511      assert(!RBraceLoc.isValid() || HasBraces);
2512      return HasBraces;
2513    }
2514  
getExternLoc()2515    SourceLocation getExternLoc() const { return ExternLoc; }
getRBraceLoc()2516    SourceLocation getRBraceLoc() const { return RBraceLoc; }
setExternLoc(SourceLocation L)2517    void setExternLoc(SourceLocation L) { ExternLoc = L; }
setRBraceLoc(SourceLocation L)2518    void setRBraceLoc(SourceLocation L) {
2519      RBraceLoc = L;
2520      HasBraces = RBraceLoc.isValid();
2521    }
2522  
getLocEnd()2523    SourceLocation getLocEnd() const LLVM_READONLY {
2524      if (hasBraces())
2525        return getRBraceLoc();
2526      // No braces: get the end location of the (only) declaration in context
2527      // (if present).
2528      return decls_empty() ? getLocation() : decls_begin()->getLocEnd();
2529    }
2530  
getSourceRange()2531    SourceRange getSourceRange() const override LLVM_READONLY {
2532      return SourceRange(ExternLoc, getLocEnd());
2533    }
2534  
classof(const Decl * D)2535    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2536    static bool classofKind(Kind K) { return K == LinkageSpec; }
castToDeclContext(const LinkageSpecDecl * D)2537    static DeclContext *castToDeclContext(const LinkageSpecDecl *D) {
2538      return static_cast<DeclContext *>(const_cast<LinkageSpecDecl*>(D));
2539    }
castFromDeclContext(const DeclContext * DC)2540    static LinkageSpecDecl *castFromDeclContext(const DeclContext *DC) {
2541      return static_cast<LinkageSpecDecl *>(const_cast<DeclContext*>(DC));
2542    }
2543  };
2544  
2545  /// \brief Represents C++ using-directive.
2546  ///
2547  /// For example:
2548  /// \code
2549  ///    using namespace std;
2550  /// \endcode
2551  ///
2552  /// \note UsingDirectiveDecl should be Decl not NamedDecl, but we provide
2553  /// artificial names for all using-directives in order to store
2554  /// them in DeclContext effectively.
2555  class UsingDirectiveDecl : public NamedDecl {
2556    void anchor() override;
2557    /// \brief The location of the \c using keyword.
2558    SourceLocation UsingLoc;
2559  
2560    /// \brief The location of the \c namespace keyword.
2561    SourceLocation NamespaceLoc;
2562  
2563    /// \brief The nested-name-specifier that precedes the namespace.
2564    NestedNameSpecifierLoc QualifierLoc;
2565  
2566    /// \brief The namespace nominated by this using-directive.
2567    NamedDecl *NominatedNamespace;
2568  
2569    /// Enclosing context containing both using-directive and nominated
2570    /// namespace.
2571    DeclContext *CommonAncestor;
2572  
2573    /// \brief Returns special DeclarationName used by using-directives.
2574    ///
2575    /// This is only used by DeclContext for storing UsingDirectiveDecls in
2576    /// its lookup structure.
getName()2577    static DeclarationName getName() {
2578      return DeclarationName::getUsingDirectiveName();
2579    }
2580  
UsingDirectiveDecl(DeclContext * DC,SourceLocation UsingLoc,SourceLocation NamespcLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation IdentLoc,NamedDecl * Nominated,DeclContext * CommonAncestor)2581    UsingDirectiveDecl(DeclContext *DC, SourceLocation UsingLoc,
2582                       SourceLocation NamespcLoc,
2583                       NestedNameSpecifierLoc QualifierLoc,
2584                       SourceLocation IdentLoc,
2585                       NamedDecl *Nominated,
2586                       DeclContext *CommonAncestor)
2587      : NamedDecl(UsingDirective, DC, IdentLoc, getName()), UsingLoc(UsingLoc),
2588        NamespaceLoc(NamespcLoc), QualifierLoc(QualifierLoc),
2589        NominatedNamespace(Nominated), CommonAncestor(CommonAncestor) { }
2590  
2591  public:
2592    /// \brief Retrieve the nested-name-specifier that qualifies the
2593    /// name of the namespace, with source-location information.
getQualifierLoc()2594    NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2595  
2596    /// \brief Retrieve the nested-name-specifier that qualifies the
2597    /// name of the namespace.
getQualifier()2598    NestedNameSpecifier *getQualifier() const {
2599      return QualifierLoc.getNestedNameSpecifier();
2600    }
2601  
getNominatedNamespaceAsWritten()2602    NamedDecl *getNominatedNamespaceAsWritten() { return NominatedNamespace; }
getNominatedNamespaceAsWritten()2603    const NamedDecl *getNominatedNamespaceAsWritten() const {
2604      return NominatedNamespace;
2605    }
2606  
2607    /// \brief Returns the namespace nominated by this using-directive.
2608    NamespaceDecl *getNominatedNamespace();
2609  
getNominatedNamespace()2610    const NamespaceDecl *getNominatedNamespace() const {
2611      return const_cast<UsingDirectiveDecl*>(this)->getNominatedNamespace();
2612    }
2613  
2614    /// \brief Returns the common ancestor context of this using-directive and
2615    /// its nominated namespace.
getCommonAncestor()2616    DeclContext *getCommonAncestor() { return CommonAncestor; }
getCommonAncestor()2617    const DeclContext *getCommonAncestor() const { return CommonAncestor; }
2618  
2619    /// \brief Return the location of the \c using keyword.
getUsingLoc()2620    SourceLocation getUsingLoc() const { return UsingLoc; }
2621  
2622    // FIXME: Could omit 'Key' in name.
2623    /// \brief Returns the location of the \c namespace keyword.
getNamespaceKeyLocation()2624    SourceLocation getNamespaceKeyLocation() const { return NamespaceLoc; }
2625  
2626    /// \brief Returns the location of this using declaration's identifier.
getIdentLocation()2627    SourceLocation getIdentLocation() const { return getLocation(); }
2628  
2629    static UsingDirectiveDecl *Create(ASTContext &C, DeclContext *DC,
2630                                      SourceLocation UsingLoc,
2631                                      SourceLocation NamespaceLoc,
2632                                      NestedNameSpecifierLoc QualifierLoc,
2633                                      SourceLocation IdentLoc,
2634                                      NamedDecl *Nominated,
2635                                      DeclContext *CommonAncestor);
2636    static UsingDirectiveDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2637  
getSourceRange()2638    SourceRange getSourceRange() const override LLVM_READONLY {
2639      return SourceRange(UsingLoc, getLocation());
2640    }
2641  
classof(const Decl * D)2642    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2643    static bool classofKind(Kind K) { return K == UsingDirective; }
2644  
2645    // Friend for getUsingDirectiveName.
2646    friend class DeclContext;
2647  
2648    friend class ASTDeclReader;
2649  };
2650  
2651  /// \brief Represents a C++ namespace alias.
2652  ///
2653  /// For example:
2654  ///
2655  /// \code
2656  /// namespace Foo = Bar;
2657  /// \endcode
2658  class NamespaceAliasDecl : public NamedDecl,
2659                             public Redeclarable<NamespaceAliasDecl> {
2660    void anchor() override;
2661  
2662    /// \brief The location of the \c namespace keyword.
2663    SourceLocation NamespaceLoc;
2664  
2665    /// \brief The location of the namespace's identifier.
2666    ///
2667    /// This is accessed by TargetNameLoc.
2668    SourceLocation IdentLoc;
2669  
2670    /// \brief The nested-name-specifier that precedes the namespace.
2671    NestedNameSpecifierLoc QualifierLoc;
2672  
2673    /// \brief The Decl that this alias points to, either a NamespaceDecl or
2674    /// a NamespaceAliasDecl.
2675    NamedDecl *Namespace;
2676  
NamespaceAliasDecl(ASTContext & C,DeclContext * DC,SourceLocation NamespaceLoc,SourceLocation AliasLoc,IdentifierInfo * Alias,NestedNameSpecifierLoc QualifierLoc,SourceLocation IdentLoc,NamedDecl * Namespace)2677    NamespaceAliasDecl(ASTContext &C, DeclContext *DC,
2678                       SourceLocation NamespaceLoc, SourceLocation AliasLoc,
2679                       IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc,
2680                       SourceLocation IdentLoc, NamedDecl *Namespace)
2681        : NamedDecl(NamespaceAlias, DC, AliasLoc, Alias), redeclarable_base(C),
2682          NamespaceLoc(NamespaceLoc), IdentLoc(IdentLoc),
2683          QualifierLoc(QualifierLoc), Namespace(Namespace) {}
2684  
2685    typedef Redeclarable<NamespaceAliasDecl> redeclarable_base;
2686    NamespaceAliasDecl *getNextRedeclarationImpl() override;
2687    NamespaceAliasDecl *getPreviousDeclImpl() override;
2688    NamespaceAliasDecl *getMostRecentDeclImpl() override;
2689  
2690    friend class ASTDeclReader;
2691  
2692  public:
2693    static NamespaceAliasDecl *Create(ASTContext &C, DeclContext *DC,
2694                                      SourceLocation NamespaceLoc,
2695                                      SourceLocation AliasLoc,
2696                                      IdentifierInfo *Alias,
2697                                      NestedNameSpecifierLoc QualifierLoc,
2698                                      SourceLocation IdentLoc,
2699                                      NamedDecl *Namespace);
2700  
2701    static NamespaceAliasDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2702  
2703    typedef redeclarable_base::redecl_range redecl_range;
2704    typedef redeclarable_base::redecl_iterator redecl_iterator;
2705    using redeclarable_base::redecls_begin;
2706    using redeclarable_base::redecls_end;
2707    using redeclarable_base::redecls;
2708    using redeclarable_base::getPreviousDecl;
2709    using redeclarable_base::getMostRecentDecl;
2710  
getCanonicalDecl()2711    NamespaceAliasDecl *getCanonicalDecl() override {
2712      return getFirstDecl();
2713    }
getCanonicalDecl()2714    const NamespaceAliasDecl *getCanonicalDecl() const {
2715      return getFirstDecl();
2716    }
2717  
2718    /// \brief Retrieve the nested-name-specifier that qualifies the
2719    /// name of the namespace, with source-location information.
getQualifierLoc()2720    NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2721  
2722    /// \brief Retrieve the nested-name-specifier that qualifies the
2723    /// name of the namespace.
getQualifier()2724    NestedNameSpecifier *getQualifier() const {
2725      return QualifierLoc.getNestedNameSpecifier();
2726    }
2727  
2728    /// \brief Retrieve the namespace declaration aliased by this directive.
getNamespace()2729    NamespaceDecl *getNamespace() {
2730      if (NamespaceAliasDecl *AD = dyn_cast<NamespaceAliasDecl>(Namespace))
2731        return AD->getNamespace();
2732  
2733      return cast<NamespaceDecl>(Namespace);
2734    }
2735  
getNamespace()2736    const NamespaceDecl *getNamespace() const {
2737      return const_cast<NamespaceAliasDecl*>(this)->getNamespace();
2738    }
2739  
2740    /// Returns the location of the alias name, i.e. 'foo' in
2741    /// "namespace foo = ns::bar;".
getAliasLoc()2742    SourceLocation getAliasLoc() const { return getLocation(); }
2743  
2744    /// Returns the location of the \c namespace keyword.
getNamespaceLoc()2745    SourceLocation getNamespaceLoc() const { return NamespaceLoc; }
2746  
2747    /// Returns the location of the identifier in the named namespace.
getTargetNameLoc()2748    SourceLocation getTargetNameLoc() const { return IdentLoc; }
2749  
2750    /// \brief Retrieve the namespace that this alias refers to, which
2751    /// may either be a NamespaceDecl or a NamespaceAliasDecl.
getAliasedNamespace()2752    NamedDecl *getAliasedNamespace() const { return Namespace; }
2753  
getSourceRange()2754    SourceRange getSourceRange() const override LLVM_READONLY {
2755      return SourceRange(NamespaceLoc, IdentLoc);
2756    }
2757  
classof(const Decl * D)2758    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2759    static bool classofKind(Kind K) { return K == NamespaceAlias; }
2760  };
2761  
2762  /// \brief Represents a shadow declaration introduced into a scope by a
2763  /// (resolved) using declaration.
2764  ///
2765  /// For example,
2766  /// \code
2767  /// namespace A {
2768  ///   void foo();
2769  /// }
2770  /// namespace B {
2771  ///   using A::foo; // <- a UsingDecl
2772  ///                 // Also creates a UsingShadowDecl for A::foo() in B
2773  /// }
2774  /// \endcode
2775  class UsingShadowDecl : public NamedDecl, public Redeclarable<UsingShadowDecl> {
2776    void anchor() override;
2777  
2778    /// The referenced declaration.
2779    NamedDecl *Underlying;
2780  
2781    /// \brief The using declaration which introduced this decl or the next using
2782    /// shadow declaration contained in the aforementioned using declaration.
2783    NamedDecl *UsingOrNextShadow;
2784    friend class UsingDecl;
2785  
UsingShadowDecl(ASTContext & C,DeclContext * DC,SourceLocation Loc,UsingDecl * Using,NamedDecl * Target)2786    UsingShadowDecl(ASTContext &C, DeclContext *DC, SourceLocation Loc,
2787                    UsingDecl *Using, NamedDecl *Target)
2788      : NamedDecl(UsingShadow, DC, Loc, DeclarationName()),
2789        redeclarable_base(C), Underlying(Target),
2790        UsingOrNextShadow(reinterpret_cast<NamedDecl *>(Using)) {
2791      if (Target) {
2792        setDeclName(Target->getDeclName());
2793        IdentifierNamespace = Target->getIdentifierNamespace();
2794      }
2795      setImplicit();
2796    }
2797  
2798    typedef Redeclarable<UsingShadowDecl> redeclarable_base;
getNextRedeclarationImpl()2799    UsingShadowDecl *getNextRedeclarationImpl() override {
2800      return getNextRedeclaration();
2801    }
getPreviousDeclImpl()2802    UsingShadowDecl *getPreviousDeclImpl() override {
2803      return getPreviousDecl();
2804    }
getMostRecentDeclImpl()2805    UsingShadowDecl *getMostRecentDeclImpl() override {
2806      return getMostRecentDecl();
2807    }
2808  
2809  public:
Create(ASTContext & C,DeclContext * DC,SourceLocation Loc,UsingDecl * Using,NamedDecl * Target)2810    static UsingShadowDecl *Create(ASTContext &C, DeclContext *DC,
2811                                   SourceLocation Loc, UsingDecl *Using,
2812                                   NamedDecl *Target) {
2813      return new (C, DC) UsingShadowDecl(C, DC, Loc, Using, Target);
2814    }
2815  
2816    static UsingShadowDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2817  
2818    typedef redeclarable_base::redecl_range redecl_range;
2819    typedef redeclarable_base::redecl_iterator redecl_iterator;
2820    using redeclarable_base::redecls_begin;
2821    using redeclarable_base::redecls_end;
2822    using redeclarable_base::redecls;
2823    using redeclarable_base::getPreviousDecl;
2824    using redeclarable_base::getMostRecentDecl;
2825  
getCanonicalDecl()2826    UsingShadowDecl *getCanonicalDecl() override {
2827      return getFirstDecl();
2828    }
getCanonicalDecl()2829    const UsingShadowDecl *getCanonicalDecl() const {
2830      return getFirstDecl();
2831    }
2832  
2833    /// \brief Gets the underlying declaration which has been brought into the
2834    /// local scope.
getTargetDecl()2835    NamedDecl *getTargetDecl() const { return Underlying; }
2836  
2837    /// \brief Sets the underlying declaration which has been brought into the
2838    /// local scope.
setTargetDecl(NamedDecl * ND)2839    void setTargetDecl(NamedDecl* ND) {
2840      assert(ND && "Target decl is null!");
2841      Underlying = ND;
2842      IdentifierNamespace = ND->getIdentifierNamespace();
2843    }
2844  
2845    /// \brief Gets the using declaration to which this declaration is tied.
2846    UsingDecl *getUsingDecl() const;
2847  
2848    /// \brief The next using shadow declaration contained in the shadow decl
2849    /// chain of the using declaration which introduced this decl.
getNextUsingShadowDecl()2850    UsingShadowDecl *getNextUsingShadowDecl() const {
2851      return dyn_cast_or_null<UsingShadowDecl>(UsingOrNextShadow);
2852    }
2853  
classof(const Decl * D)2854    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2855    static bool classofKind(Kind K) { return K == Decl::UsingShadow; }
2856  
2857    friend class ASTDeclReader;
2858    friend class ASTDeclWriter;
2859  };
2860  
2861  /// \brief Represents a C++ using-declaration.
2862  ///
2863  /// For example:
2864  /// \code
2865  ///    using someNameSpace::someIdentifier;
2866  /// \endcode
2867  class UsingDecl : public NamedDecl, public Mergeable<UsingDecl> {
2868    void anchor() override;
2869  
2870    /// \brief The source location of the 'using' keyword itself.
2871    SourceLocation UsingLocation;
2872  
2873    /// \brief The nested-name-specifier that precedes the name.
2874    NestedNameSpecifierLoc QualifierLoc;
2875  
2876    /// \brief Provides source/type location info for the declaration name
2877    /// embedded in the ValueDecl base class.
2878    DeclarationNameLoc DNLoc;
2879  
2880    /// \brief The first shadow declaration of the shadow decl chain associated
2881    /// with this using declaration.
2882    ///
2883    /// The bool member of the pair store whether this decl has the \c typename
2884    /// keyword.
2885    llvm::PointerIntPair<UsingShadowDecl *, 1, bool> FirstUsingShadow;
2886  
UsingDecl(DeclContext * DC,SourceLocation UL,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,bool HasTypenameKeyword)2887    UsingDecl(DeclContext *DC, SourceLocation UL,
2888              NestedNameSpecifierLoc QualifierLoc,
2889              const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
2890      : NamedDecl(Using, DC, NameInfo.getLoc(), NameInfo.getName()),
2891        UsingLocation(UL), QualifierLoc(QualifierLoc),
2892        DNLoc(NameInfo.getInfo()), FirstUsingShadow(nullptr, HasTypenameKeyword) {
2893    }
2894  
2895  public:
2896    /// \brief Return the source location of the 'using' keyword.
getUsingLoc()2897    SourceLocation getUsingLoc() const { return UsingLocation; }
2898  
2899    /// \brief Set the source location of the 'using' keyword.
setUsingLoc(SourceLocation L)2900    void setUsingLoc(SourceLocation L) { UsingLocation = L; }
2901  
2902    /// \brief Retrieve the nested-name-specifier that qualifies the name,
2903    /// with source-location information.
getQualifierLoc()2904    NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
2905  
2906    /// \brief Retrieve the nested-name-specifier that qualifies the name.
getQualifier()2907    NestedNameSpecifier *getQualifier() const {
2908      return QualifierLoc.getNestedNameSpecifier();
2909    }
2910  
getNameInfo()2911    DeclarationNameInfo getNameInfo() const {
2912      return DeclarationNameInfo(getDeclName(), getLocation(), DNLoc);
2913    }
2914  
2915    /// \brief Return true if it is a C++03 access declaration (no 'using').
isAccessDeclaration()2916    bool isAccessDeclaration() const { return UsingLocation.isInvalid(); }
2917  
2918    /// \brief Return true if the using declaration has 'typename'.
hasTypename()2919    bool hasTypename() const { return FirstUsingShadow.getInt(); }
2920  
2921    /// \brief Sets whether the using declaration has 'typename'.
setTypename(bool TN)2922    void setTypename(bool TN) { FirstUsingShadow.setInt(TN); }
2923  
2924    /// \brief Iterates through the using shadow declarations associated with
2925    /// this using declaration.
2926    class shadow_iterator {
2927      /// \brief The current using shadow declaration.
2928      UsingShadowDecl *Current;
2929  
2930    public:
2931      typedef UsingShadowDecl*          value_type;
2932      typedef UsingShadowDecl*          reference;
2933      typedef UsingShadowDecl*          pointer;
2934      typedef std::forward_iterator_tag iterator_category;
2935      typedef std::ptrdiff_t            difference_type;
2936  
shadow_iterator()2937      shadow_iterator() : Current(nullptr) { }
shadow_iterator(UsingShadowDecl * C)2938      explicit shadow_iterator(UsingShadowDecl *C) : Current(C) { }
2939  
2940      reference operator*() const { return Current; }
2941      pointer operator->() const { return Current; }
2942  
2943      shadow_iterator& operator++() {
2944        Current = Current->getNextUsingShadowDecl();
2945        return *this;
2946      }
2947  
2948      shadow_iterator operator++(int) {
2949        shadow_iterator tmp(*this);
2950        ++(*this);
2951        return tmp;
2952      }
2953  
2954      friend bool operator==(shadow_iterator x, shadow_iterator y) {
2955        return x.Current == y.Current;
2956      }
2957      friend bool operator!=(shadow_iterator x, shadow_iterator y) {
2958        return x.Current != y.Current;
2959      }
2960    };
2961  
2962    typedef llvm::iterator_range<shadow_iterator> shadow_range;
2963  
shadows()2964    shadow_range shadows() const {
2965      return shadow_range(shadow_begin(), shadow_end());
2966    }
shadow_begin()2967    shadow_iterator shadow_begin() const {
2968      return shadow_iterator(FirstUsingShadow.getPointer());
2969    }
shadow_end()2970    shadow_iterator shadow_end() const { return shadow_iterator(); }
2971  
2972    /// \brief Return the number of shadowed declarations associated with this
2973    /// using declaration.
shadow_size()2974    unsigned shadow_size() const {
2975      return std::distance(shadow_begin(), shadow_end());
2976    }
2977  
2978    void addShadowDecl(UsingShadowDecl *S);
2979    void removeShadowDecl(UsingShadowDecl *S);
2980  
2981    static UsingDecl *Create(ASTContext &C, DeclContext *DC,
2982                             SourceLocation UsingL,
2983                             NestedNameSpecifierLoc QualifierLoc,
2984                             const DeclarationNameInfo &NameInfo,
2985                             bool HasTypenameKeyword);
2986  
2987    static UsingDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2988  
2989    SourceRange getSourceRange() const override LLVM_READONLY;
2990  
2991    /// Retrieves the canonical declaration of this declaration.
getCanonicalDecl()2992    UsingDecl *getCanonicalDecl() override { return getFirstDecl(); }
getCanonicalDecl()2993    const UsingDecl *getCanonicalDecl() const { return getFirstDecl(); }
2994  
classof(const Decl * D)2995    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)2996    static bool classofKind(Kind K) { return K == Using; }
2997  
2998    friend class ASTDeclReader;
2999    friend class ASTDeclWriter;
3000  };
3001  
3002  /// \brief Represents a dependent using declaration which was not marked with
3003  /// \c typename.
3004  ///
3005  /// Unlike non-dependent using declarations, these *only* bring through
3006  /// non-types; otherwise they would break two-phase lookup.
3007  ///
3008  /// \code
3009  /// template \<class T> class A : public Base<T> {
3010  ///   using Base<T>::foo;
3011  /// };
3012  /// \endcode
3013  class UnresolvedUsingValueDecl : public ValueDecl,
3014                                   public Mergeable<UnresolvedUsingValueDecl> {
3015    void anchor() override;
3016  
3017    /// \brief The source location of the 'using' keyword
3018    SourceLocation UsingLocation;
3019  
3020    /// \brief The nested-name-specifier that precedes the name.
3021    NestedNameSpecifierLoc QualifierLoc;
3022  
3023    /// \brief Provides source/type location info for the declaration name
3024    /// embedded in the ValueDecl base class.
3025    DeclarationNameLoc DNLoc;
3026  
UnresolvedUsingValueDecl(DeclContext * DC,QualType Ty,SourceLocation UsingLoc,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo)3027    UnresolvedUsingValueDecl(DeclContext *DC, QualType Ty,
3028                             SourceLocation UsingLoc,
3029                             NestedNameSpecifierLoc QualifierLoc,
3030                             const DeclarationNameInfo &NameInfo)
3031      : ValueDecl(UnresolvedUsingValue, DC,
3032                  NameInfo.getLoc(), NameInfo.getName(), Ty),
3033        UsingLocation(UsingLoc), QualifierLoc(QualifierLoc),
3034        DNLoc(NameInfo.getInfo())
3035    { }
3036  
3037  public:
3038    /// \brief Returns the source location of the 'using' keyword.
getUsingLoc()3039    SourceLocation getUsingLoc() const { return UsingLocation; }
3040  
3041    /// \brief Set the source location of the 'using' keyword.
setUsingLoc(SourceLocation L)3042    void setUsingLoc(SourceLocation L) { UsingLocation = L; }
3043  
3044    /// \brief Return true if it is a C++03 access declaration (no 'using').
isAccessDeclaration()3045    bool isAccessDeclaration() const { return UsingLocation.isInvalid(); }
3046  
3047    /// \brief Retrieve the nested-name-specifier that qualifies the name,
3048    /// with source-location information.
getQualifierLoc()3049    NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3050  
3051    /// \brief Retrieve the nested-name-specifier that qualifies the name.
getQualifier()3052    NestedNameSpecifier *getQualifier() const {
3053      return QualifierLoc.getNestedNameSpecifier();
3054    }
3055  
getNameInfo()3056    DeclarationNameInfo getNameInfo() const {
3057      return DeclarationNameInfo(getDeclName(), getLocation(), DNLoc);
3058    }
3059  
3060    static UnresolvedUsingValueDecl *
3061      Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc,
3062             NestedNameSpecifierLoc QualifierLoc,
3063             const DeclarationNameInfo &NameInfo);
3064  
3065    static UnresolvedUsingValueDecl *
3066    CreateDeserialized(ASTContext &C, unsigned ID);
3067  
3068    SourceRange getSourceRange() const override LLVM_READONLY;
3069  
3070    /// Retrieves the canonical declaration of this declaration.
getCanonicalDecl()3071    UnresolvedUsingValueDecl *getCanonicalDecl() override {
3072      return getFirstDecl();
3073    }
getCanonicalDecl()3074    const UnresolvedUsingValueDecl *getCanonicalDecl() const {
3075      return getFirstDecl();
3076    }
3077  
classof(const Decl * D)3078    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)3079    static bool classofKind(Kind K) { return K == UnresolvedUsingValue; }
3080  
3081    friend class ASTDeclReader;
3082    friend class ASTDeclWriter;
3083  };
3084  
3085  /// \brief Represents a dependent using declaration which was marked with
3086  /// \c typename.
3087  ///
3088  /// \code
3089  /// template \<class T> class A : public Base<T> {
3090  ///   using typename Base<T>::foo;
3091  /// };
3092  /// \endcode
3093  ///
3094  /// The type associated with an unresolved using typename decl is
3095  /// currently always a typename type.
3096  class UnresolvedUsingTypenameDecl
3097      : public TypeDecl,
3098        public Mergeable<UnresolvedUsingTypenameDecl> {
3099    void anchor() override;
3100  
3101    /// \brief The source location of the 'typename' keyword
3102    SourceLocation TypenameLocation;
3103  
3104    /// \brief The nested-name-specifier that precedes the name.
3105    NestedNameSpecifierLoc QualifierLoc;
3106  
UnresolvedUsingTypenameDecl(DeclContext * DC,SourceLocation UsingLoc,SourceLocation TypenameLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TargetNameLoc,IdentifierInfo * TargetName)3107    UnresolvedUsingTypenameDecl(DeclContext *DC, SourceLocation UsingLoc,
3108                                SourceLocation TypenameLoc,
3109                                NestedNameSpecifierLoc QualifierLoc,
3110                                SourceLocation TargetNameLoc,
3111                                IdentifierInfo *TargetName)
3112      : TypeDecl(UnresolvedUsingTypename, DC, TargetNameLoc, TargetName,
3113                 UsingLoc),
3114        TypenameLocation(TypenameLoc), QualifierLoc(QualifierLoc) { }
3115  
3116    friend class ASTDeclReader;
3117  
3118  public:
3119    /// \brief Returns the source location of the 'using' keyword.
getUsingLoc()3120    SourceLocation getUsingLoc() const { return getLocStart(); }
3121  
3122    /// \brief Returns the source location of the 'typename' keyword.
getTypenameLoc()3123    SourceLocation getTypenameLoc() const { return TypenameLocation; }
3124  
3125    /// \brief Retrieve the nested-name-specifier that qualifies the name,
3126    /// with source-location information.
getQualifierLoc()3127    NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3128  
3129    /// \brief Retrieve the nested-name-specifier that qualifies the name.
getQualifier()3130    NestedNameSpecifier *getQualifier() const {
3131      return QualifierLoc.getNestedNameSpecifier();
3132    }
3133  
3134    static UnresolvedUsingTypenameDecl *
3135      Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc,
3136             SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc,
3137             SourceLocation TargetNameLoc, DeclarationName TargetName);
3138  
3139    static UnresolvedUsingTypenameDecl *
3140    CreateDeserialized(ASTContext &C, unsigned ID);
3141  
3142    /// Retrieves the canonical declaration of this declaration.
getCanonicalDecl()3143    UnresolvedUsingTypenameDecl *getCanonicalDecl() override {
3144      return getFirstDecl();
3145    }
getCanonicalDecl()3146    const UnresolvedUsingTypenameDecl *getCanonicalDecl() const {
3147      return getFirstDecl();
3148    }
3149  
classof(const Decl * D)3150    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)3151    static bool classofKind(Kind K) { return K == UnresolvedUsingTypename; }
3152  };
3153  
3154  /// \brief Represents a C++11 static_assert declaration.
3155  class StaticAssertDecl : public Decl {
3156    virtual void anchor();
3157    llvm::PointerIntPair<Expr *, 1, bool> AssertExprAndFailed;
3158    StringLiteral *Message;
3159    SourceLocation RParenLoc;
3160  
StaticAssertDecl(DeclContext * DC,SourceLocation StaticAssertLoc,Expr * AssertExpr,StringLiteral * Message,SourceLocation RParenLoc,bool Failed)3161    StaticAssertDecl(DeclContext *DC, SourceLocation StaticAssertLoc,
3162                     Expr *AssertExpr, StringLiteral *Message,
3163                     SourceLocation RParenLoc, bool Failed)
3164      : Decl(StaticAssert, DC, StaticAssertLoc),
3165        AssertExprAndFailed(AssertExpr, Failed), Message(Message),
3166        RParenLoc(RParenLoc) { }
3167  
3168  public:
3169    static StaticAssertDecl *Create(ASTContext &C, DeclContext *DC,
3170                                    SourceLocation StaticAssertLoc,
3171                                    Expr *AssertExpr, StringLiteral *Message,
3172                                    SourceLocation RParenLoc, bool Failed);
3173    static StaticAssertDecl *CreateDeserialized(ASTContext &C, unsigned ID);
3174  
getAssertExpr()3175    Expr *getAssertExpr() { return AssertExprAndFailed.getPointer(); }
getAssertExpr()3176    const Expr *getAssertExpr() const { return AssertExprAndFailed.getPointer(); }
3177  
getMessage()3178    StringLiteral *getMessage() { return Message; }
getMessage()3179    const StringLiteral *getMessage() const { return Message; }
3180  
isFailed()3181    bool isFailed() const { return AssertExprAndFailed.getInt(); }
3182  
getRParenLoc()3183    SourceLocation getRParenLoc() const { return RParenLoc; }
3184  
getSourceRange()3185    SourceRange getSourceRange() const override LLVM_READONLY {
3186      return SourceRange(getLocation(), getRParenLoc());
3187    }
3188  
classof(const Decl * D)3189    static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)3190    static bool classofKind(Kind K) { return K == StaticAssert; }
3191  
3192    friend class ASTDeclReader;
3193  };
3194  
3195  /// An instance of this class represents the declaration of a property
3196  /// member.  This is a Microsoft extension to C++, first introduced in
3197  /// Visual Studio .NET 2003 as a parallel to similar features in C#
3198  /// and Managed C++.
3199  ///
3200  /// A property must always be a non-static class member.
3201  ///
3202  /// A property member superficially resembles a non-static data
3203  /// member, except preceded by a property attribute:
3204  ///   __declspec(property(get=GetX, put=PutX)) int x;
3205  /// Either (but not both) of the 'get' and 'put' names may be omitted.
3206  ///
3207  /// A reference to a property is always an lvalue.  If the lvalue
3208  /// undergoes lvalue-to-rvalue conversion, then a getter name is
3209  /// required, and that member is called with no arguments.
3210  /// If the lvalue is assigned into, then a setter name is required,
3211  /// and that member is called with one argument, the value assigned.
3212  /// Both operations are potentially overloaded.  Compound assignments
3213  /// are permitted, as are the increment and decrement operators.
3214  ///
3215  /// The getter and putter methods are permitted to be overloaded,
3216  /// although their return and parameter types are subject to certain
3217  /// restrictions according to the type of the property.
3218  ///
3219  /// A property declared using an incomplete array type may
3220  /// additionally be subscripted, adding extra parameters to the getter
3221  /// and putter methods.
3222  class MSPropertyDecl : public DeclaratorDecl {
3223    IdentifierInfo *GetterId, *SetterId;
3224  
MSPropertyDecl(DeclContext * DC,SourceLocation L,DeclarationName N,QualType T,TypeSourceInfo * TInfo,SourceLocation StartL,IdentifierInfo * Getter,IdentifierInfo * Setter)3225    MSPropertyDecl(DeclContext *DC, SourceLocation L, DeclarationName N,
3226                   QualType T, TypeSourceInfo *TInfo, SourceLocation StartL,
3227                   IdentifierInfo *Getter, IdentifierInfo *Setter)
3228        : DeclaratorDecl(MSProperty, DC, L, N, T, TInfo, StartL),
3229          GetterId(Getter), SetterId(Setter) {}
3230  
3231  public:
3232    static MSPropertyDecl *Create(ASTContext &C, DeclContext *DC,
3233                                  SourceLocation L, DeclarationName N, QualType T,
3234                                  TypeSourceInfo *TInfo, SourceLocation StartL,
3235                                  IdentifierInfo *Getter, IdentifierInfo *Setter);
3236    static MSPropertyDecl *CreateDeserialized(ASTContext &C, unsigned ID);
3237  
classof(const Decl * D)3238    static bool classof(const Decl *D) { return D->getKind() == MSProperty; }
3239  
hasGetter()3240    bool hasGetter() const { return GetterId != nullptr; }
getGetterId()3241    IdentifierInfo* getGetterId() const { return GetterId; }
hasSetter()3242    bool hasSetter() const { return SetterId != nullptr; }
getSetterId()3243    IdentifierInfo* getSetterId() const { return SetterId; }
3244  
3245    friend class ASTDeclReader;
3246  };
3247  
3248  /// Insertion operator for diagnostics.  This allows sending an AccessSpecifier
3249  /// into a diagnostic with <<.
3250  const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
3251                                      AccessSpecifier AS);
3252  
3253  const PartialDiagnostic &operator<<(const PartialDiagnostic &DB,
3254                                      AccessSpecifier AS);
3255  
3256  } // end namespace clang
3257  
3258  #endif
3259