Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- DeclBase.h - Base Classes for representing declarations --*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
//  This file defines the Decl and DeclContext interfaces.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_CLANG_AST_DECLBASE_H
14
#define LLVM_CLANG_AST_DECLBASE_H
15
 
16
#include "clang/AST/ASTDumperUtils.h"
17
#include "clang/AST/AttrIterator.h"
18
#include "clang/AST/DeclarationName.h"
19
#include "clang/Basic/IdentifierTable.h"
20
#include "clang/Basic/LLVM.h"
21
#include "clang/Basic/SourceLocation.h"
22
#include "clang/Basic/Specifiers.h"
23
#include "llvm/ADT/ArrayRef.h"
24
#include "llvm/ADT/PointerIntPair.h"
25
#include "llvm/ADT/PointerUnion.h"
26
#include "llvm/ADT/iterator.h"
27
#include "llvm/ADT/iterator_range.h"
28
#include "llvm/Support/Casting.h"
29
#include "llvm/Support/Compiler.h"
30
#include "llvm/Support/PrettyStackTrace.h"
31
#include "llvm/Support/VersionTuple.h"
32
#include <algorithm>
33
#include <cassert>
34
#include <cstddef>
35
#include <iterator>
36
#include <string>
37
#include <type_traits>
38
#include <utility>
39
 
40
namespace clang {
41
 
42
class ASTContext;
43
class ASTMutationListener;
44
class Attr;
45
class BlockDecl;
46
class DeclContext;
47
class ExternalSourceSymbolAttr;
48
class FunctionDecl;
49
class FunctionType;
50
class IdentifierInfo;
51
enum Linkage : unsigned char;
52
class LinkageSpecDecl;
53
class Module;
54
class NamedDecl;
55
class ObjCContainerDecl;
56
class ObjCMethodDecl;
57
struct PrintingPolicy;
58
class RecordDecl;
59
class SourceManager;
60
class Stmt;
61
class StoredDeclsMap;
62
class TemplateDecl;
63
class TemplateParameterList;
64
class TranslationUnitDecl;
65
class UsingDirectiveDecl;
66
 
67
/// Captures the result of checking the availability of a
68
/// declaration.
69
enum AvailabilityResult {
70
  AR_Available = 0,
71
  AR_NotYetIntroduced,
72
  AR_Deprecated,
73
  AR_Unavailable
74
};
75
 
76
/// Decl - This represents one declaration (or definition), e.g. a variable,
77
/// typedef, function, struct, etc.
78
///
79
/// Note: There are objects tacked on before the *beginning* of Decl
80
/// (and its subclasses) in its Decl::operator new(). Proper alignment
81
/// of all subclasses (not requiring more than the alignment of Decl) is
82
/// asserted in DeclBase.cpp.
83
class alignas(8) Decl {
84
public:
85
  /// Lists the kind of concrete classes of Decl.
86
  enum Kind {
87
#define DECL(DERIVED, BASE) DERIVED,
88
#define ABSTRACT_DECL(DECL)
89
#define DECL_RANGE(BASE, START, END) \
90
        first##BASE = START, last##BASE = END,
91
#define LAST_DECL_RANGE(BASE, START, END) \
92
        first##BASE = START, last##BASE = END
93
#include "clang/AST/DeclNodes.inc"
94
  };
95
 
96
  /// A placeholder type used to construct an empty shell of a
97
  /// decl-derived type that will be filled in later (e.g., by some
98
  /// deserialization method).
99
  struct EmptyShell {};
100
 
101
  /// IdentifierNamespace - The different namespaces in which
102
  /// declarations may appear.  According to C99 6.2.3, there are
103
  /// four namespaces, labels, tags, members and ordinary
104
  /// identifiers.  C++ describes lookup completely differently:
105
  /// certain lookups merely "ignore" certain kinds of declarations,
106
  /// usually based on whether the declaration is of a type, etc.
107
  ///
108
  /// These are meant as bitmasks, so that searches in
109
  /// C++ can look into the "tag" namespace during ordinary lookup.
110
  ///
111
  /// Decl currently provides 15 bits of IDNS bits.
112
  enum IdentifierNamespace {
113
    /// Labels, declared with 'x:' and referenced with 'goto x'.
114
    IDNS_Label               = 0x0001,
115
 
116
    /// Tags, declared with 'struct foo;' and referenced with
117
    /// 'struct foo'.  All tags are also types.  This is what
118
    /// elaborated-type-specifiers look for in C.
119
    /// This also contains names that conflict with tags in the
120
    /// same scope but that are otherwise ordinary names (non-type
121
    /// template parameters and indirect field declarations).
122
    IDNS_Tag                 = 0x0002,
123
 
124
    /// Types, declared with 'struct foo', typedefs, etc.
125
    /// This is what elaborated-type-specifiers look for in C++,
126
    /// but note that it's ill-formed to find a non-tag.
127
    IDNS_Type                = 0x0004,
128
 
129
    /// Members, declared with object declarations within tag
130
    /// definitions.  In C, these can only be found by "qualified"
131
    /// lookup in member expressions.  In C++, they're found by
132
    /// normal lookup.
133
    IDNS_Member              = 0x0008,
134
 
135
    /// Namespaces, declared with 'namespace foo {}'.
136
    /// Lookup for nested-name-specifiers find these.
137
    IDNS_Namespace           = 0x0010,
138
 
139
    /// Ordinary names.  In C, everything that's not a label, tag,
140
    /// member, or function-local extern ends up here.
141
    IDNS_Ordinary            = 0x0020,
142
 
143
    /// Objective C \@protocol.
144
    IDNS_ObjCProtocol        = 0x0040,
145
 
146
    /// This declaration is a friend function.  A friend function
147
    /// declaration is always in this namespace but may also be in
148
    /// IDNS_Ordinary if it was previously declared.
149
    IDNS_OrdinaryFriend      = 0x0080,
150
 
151
    /// This declaration is a friend class.  A friend class
152
    /// declaration is always in this namespace but may also be in
153
    /// IDNS_Tag|IDNS_Type if it was previously declared.
154
    IDNS_TagFriend           = 0x0100,
155
 
156
    /// This declaration is a using declaration.  A using declaration
157
    /// *introduces* a number of other declarations into the current
158
    /// scope, and those declarations use the IDNS of their targets,
159
    /// but the actual using declarations go in this namespace.
160
    IDNS_Using               = 0x0200,
161
 
162
    /// This declaration is a C++ operator declared in a non-class
163
    /// context.  All such operators are also in IDNS_Ordinary.
164
    /// C++ lexical operator lookup looks for these.
165
    IDNS_NonMemberOperator   = 0x0400,
166
 
167
    /// This declaration is a function-local extern declaration of a
168
    /// variable or function. This may also be IDNS_Ordinary if it
169
    /// has been declared outside any function. These act mostly like
170
    /// invisible friend declarations, but are also visible to unqualified
171
    /// lookup within the scope of the declaring function.
172
    IDNS_LocalExtern         = 0x0800,
173
 
174
    /// This declaration is an OpenMP user defined reduction construction.
175
    IDNS_OMPReduction        = 0x1000,
176
 
177
    /// This declaration is an OpenMP user defined mapper.
178
    IDNS_OMPMapper           = 0x2000,
179
  };
180
 
181
  /// ObjCDeclQualifier - 'Qualifiers' written next to the return and
182
  /// parameter types in method declarations.  Other than remembering
183
  /// them and mangling them into the method's signature string, these
184
  /// are ignored by the compiler; they are consumed by certain
185
  /// remote-messaging frameworks.
186
  ///
187
  /// in, inout, and out are mutually exclusive and apply only to
188
  /// method parameters.  bycopy and byref are mutually exclusive and
189
  /// apply only to method parameters (?).  oneway applies only to
190
  /// results.  All of these expect their corresponding parameter to
191
  /// have a particular type.  None of this is currently enforced by
192
  /// clang.
193
  ///
194
  /// This should be kept in sync with ObjCDeclSpec::ObjCDeclQualifier.
195
  enum ObjCDeclQualifier {
196
    OBJC_TQ_None = 0x0,
197
    OBJC_TQ_In = 0x1,
198
    OBJC_TQ_Inout = 0x2,
199
    OBJC_TQ_Out = 0x4,
200
    OBJC_TQ_Bycopy = 0x8,
201
    OBJC_TQ_Byref = 0x10,
202
    OBJC_TQ_Oneway = 0x20,
203
 
204
    /// The nullability qualifier is set when the nullability of the
205
    /// result or parameter was expressed via a context-sensitive
206
    /// keyword.
207
    OBJC_TQ_CSNullability = 0x40
208
  };
209
 
210
  /// The kind of ownership a declaration has, for visibility purposes.
211
  /// This enumeration is designed such that higher values represent higher
212
  /// levels of name hiding.
213
  enum class ModuleOwnershipKind : unsigned {
214
    /// This declaration is not owned by a module.
215
    Unowned,
216
 
217
    /// This declaration has an owning module, but is globally visible
218
    /// (typically because its owning module is visible and we know that
219
    /// modules cannot later become hidden in this compilation).
220
    /// After serialization and deserialization, this will be converted
221
    /// to VisibleWhenImported.
222
    Visible,
223
 
224
    /// This declaration has an owning module, and is visible when that
225
    /// module is imported.
226
    VisibleWhenImported,
227
 
228
    /// This declaration has an owning module, and is visible to lookups
229
    /// that occurs within that module. And it is reachable in other module
230
    /// when the owning module is transitively imported.
231
    ReachableWhenImported,
232
 
233
    /// This declaration has an owning module, but is only visible to
234
    /// lookups that occur within that module.
235
    /// The discarded declarations in global module fragment belongs
236
    /// to this group too.
237
    ModulePrivate
238
  };
239
 
240
protected:
241
  /// The next declaration within the same lexical
242
  /// DeclContext. These pointers form the linked list that is
243
  /// traversed via DeclContext's decls_begin()/decls_end().
244
  ///
245
  /// The extra three bits are used for the ModuleOwnershipKind.
246
  llvm::PointerIntPair<Decl *, 3, ModuleOwnershipKind> NextInContextAndBits;
247
 
248
private:
249
  friend class DeclContext;
250
 
251
  struct MultipleDC {
252
    DeclContext *SemanticDC;
253
    DeclContext *LexicalDC;
254
  };
255
 
256
  /// DeclCtx - Holds either a DeclContext* or a MultipleDC*.
257
  /// For declarations that don't contain C++ scope specifiers, it contains
258
  /// the DeclContext where the Decl was declared.
259
  /// For declarations with C++ scope specifiers, it contains a MultipleDC*
260
  /// with the context where it semantically belongs (SemanticDC) and the
261
  /// context where it was lexically declared (LexicalDC).
262
  /// e.g.:
263
  ///
264
  ///   namespace A {
265
  ///      void f(); // SemanticDC == LexicalDC == 'namespace A'
266
  ///   }
267
  ///   void A::f(); // SemanticDC == namespace 'A'
268
  ///                // LexicalDC == global namespace
269
  llvm::PointerUnion<DeclContext*, MultipleDC*> DeclCtx;
270
 
271
  bool isInSemaDC() const { return DeclCtx.is<DeclContext*>(); }
272
  bool isOutOfSemaDC() const { return DeclCtx.is<MultipleDC*>(); }
273
 
274
  MultipleDC *getMultipleDC() const {
275
    return DeclCtx.get<MultipleDC*>();
276
  }
277
 
278
  DeclContext *getSemanticDC() const {
279
    return DeclCtx.get<DeclContext*>();
280
  }
281
 
282
  /// Loc - The location of this decl.
283
  SourceLocation Loc;
284
 
285
  /// DeclKind - This indicates which class this is.
286
  unsigned DeclKind : 7;
287
 
288
  /// InvalidDecl - This indicates a semantic error occurred.
289
  unsigned InvalidDecl :  1;
290
 
291
  /// HasAttrs - This indicates whether the decl has attributes or not.
292
  unsigned HasAttrs : 1;
293
 
294
  /// Implicit - Whether this declaration was implicitly generated by
295
  /// the implementation rather than explicitly written by the user.
296
  unsigned Implicit : 1;
297
 
298
  /// Whether this declaration was "used", meaning that a definition is
299
  /// required.
300
  unsigned Used : 1;
301
 
302
  /// Whether this declaration was "referenced".
303
  /// The difference with 'Used' is whether the reference appears in a
304
  /// evaluated context or not, e.g. functions used in uninstantiated templates
305
  /// are regarded as "referenced" but not "used".
306
  unsigned Referenced : 1;
307
 
308
  /// Whether this declaration is a top-level declaration (function,
309
  /// global variable, etc.) that is lexically inside an objc container
310
  /// definition.
311
  unsigned TopLevelDeclInObjCContainer : 1;
312
 
313
  /// Whether statistic collection is enabled.
314
  static bool StatisticsEnabled;
315
 
316
protected:
317
  friend class ASTDeclReader;
318
  friend class ASTDeclWriter;
319
  friend class ASTNodeImporter;
320
  friend class ASTReader;
321
  friend class CXXClassMemberWrapper;
322
  friend class LinkageComputer;
323
  friend class RecordDecl;
324
  template<typename decl_type> friend class Redeclarable;
325
 
326
  /// Access - Used by C++ decls for the access specifier.
327
  // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum
328
  unsigned Access : 2;
329
 
330
  /// Whether this declaration was loaded from an AST file.
331
  unsigned FromASTFile : 1;
332
 
333
  /// IdentifierNamespace - This specifies what IDNS_* namespace this lives in.
334
  unsigned IdentifierNamespace : 14;
335
 
336
  /// If 0, we have not computed the linkage of this declaration.
337
  /// Otherwise, it is the linkage + 1.
338
  mutable unsigned CacheValidAndLinkage : 3;
339
 
340
  /// Allocate memory for a deserialized declaration.
341
  ///
342
  /// This routine must be used to allocate memory for any declaration that is
343
  /// deserialized from a module file.
344
  ///
345
  /// \param Size The size of the allocated object.
346
  /// \param Ctx The context in which we will allocate memory.
347
  /// \param ID The global ID of the deserialized declaration.
348
  /// \param Extra The amount of extra space to allocate after the object.
349
  void *operator new(std::size_t Size, const ASTContext &Ctx, unsigned ID,
350
                     std::size_t Extra = 0);
351
 
352
  /// Allocate memory for a non-deserialized declaration.
353
  void *operator new(std::size_t Size, const ASTContext &Ctx,
354
                     DeclContext *Parent, std::size_t Extra = 0);
355
 
356
private:
357
  bool AccessDeclContextCheck() const;
358
 
359
  /// Get the module ownership kind to use for a local lexical child of \p DC,
360
  /// which may be either a local or (rarely) an imported declaration.
361
  static ModuleOwnershipKind getModuleOwnershipKindForChildOf(DeclContext *DC) {
362
    if (DC) {
363
      auto *D = cast<Decl>(DC);
364
      auto MOK = D->getModuleOwnershipKind();
365
      if (MOK != ModuleOwnershipKind::Unowned &&
366
          (!D->isFromASTFile() || D->hasLocalOwningModuleStorage()))
367
        return MOK;
368
      // If D is not local and we have no local module storage, then we don't
369
      // need to track module ownership at all.
370
    }
371
    return ModuleOwnershipKind::Unowned;
372
  }
373
 
374
public:
375
  Decl() = delete;
376
  Decl(const Decl&) = delete;
377
  Decl(Decl &&) = delete;
378
  Decl &operator=(const Decl&) = delete;
379
  Decl &operator=(Decl&&) = delete;
380
 
381
protected:
382
  Decl(Kind DK, DeclContext *DC, SourceLocation L)
383
      : NextInContextAndBits(nullptr, getModuleOwnershipKindForChildOf(DC)),
384
        DeclCtx(DC), Loc(L), DeclKind(DK), InvalidDecl(false), HasAttrs(false),
385
        Implicit(false), Used(false), Referenced(false),
386
        TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
387
        IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
388
        CacheValidAndLinkage(0) {
389
    if (StatisticsEnabled) add(DK);
390
  }
391
 
392
  Decl(Kind DK, EmptyShell Empty)
393
      : DeclKind(DK), InvalidDecl(false), HasAttrs(false), Implicit(false),
394
        Used(false), Referenced(false), TopLevelDeclInObjCContainer(false),
395
        Access(AS_none), FromASTFile(0),
396
        IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
397
        CacheValidAndLinkage(0) {
398
    if (StatisticsEnabled) add(DK);
399
  }
400
 
401
  virtual ~Decl();
402
 
403
  /// Update a potentially out-of-date declaration.
404
  void updateOutOfDate(IdentifierInfo &II) const;
405
 
406
  Linkage getCachedLinkage() const {
407
    return Linkage(CacheValidAndLinkage - 1);
408
  }
409
 
410
  void setCachedLinkage(Linkage L) const {
411
    CacheValidAndLinkage = L + 1;
412
  }
413
 
414
  bool hasCachedLinkage() const {
415
    return CacheValidAndLinkage;
416
  }
417
 
418
public:
419
  /// Source range that this declaration covers.
420
  virtual SourceRange getSourceRange() const LLVM_READONLY {
421
    return SourceRange(getLocation(), getLocation());
422
  }
423
 
424
  SourceLocation getBeginLoc() const LLVM_READONLY {
425
    return getSourceRange().getBegin();
426
  }
427
 
428
  SourceLocation getEndLoc() const LLVM_READONLY {
429
    return getSourceRange().getEnd();
430
  }
431
 
432
  SourceLocation getLocation() const { return Loc; }
433
  void setLocation(SourceLocation L) { Loc = L; }
434
 
435
  Kind getKind() const { return static_cast<Kind>(DeclKind); }
436
  const char *getDeclKindName() const;
437
 
438
  Decl *getNextDeclInContext() { return NextInContextAndBits.getPointer(); }
439
  const Decl *getNextDeclInContext() const {return NextInContextAndBits.getPointer();}
440
 
441
  DeclContext *getDeclContext() {
442
    if (isInSemaDC())
443
      return getSemanticDC();
444
    return getMultipleDC()->SemanticDC;
445
  }
446
  const DeclContext *getDeclContext() const {
447
    return const_cast<Decl*>(this)->getDeclContext();
448
  }
449
 
450
  /// Return the non transparent context.
451
  /// See the comment of `DeclContext::isTransparentContext()` for the
452
  /// definition of transparent context.
453
  DeclContext *getNonTransparentDeclContext();
454
  const DeclContext *getNonTransparentDeclContext() const {
455
    return const_cast<Decl *>(this)->getNonTransparentDeclContext();
456
  }
457
 
458
  /// Find the innermost non-closure ancestor of this declaration,
459
  /// walking up through blocks, lambdas, etc.  If that ancestor is
460
  /// not a code context (!isFunctionOrMethod()), returns null.
461
  ///
462
  /// A declaration may be its own non-closure context.
463
  Decl *getNonClosureContext();
464
  const Decl *getNonClosureContext() const {
465
    return const_cast<Decl*>(this)->getNonClosureContext();
466
  }
467
 
468
  TranslationUnitDecl *getTranslationUnitDecl();
469
  const TranslationUnitDecl *getTranslationUnitDecl() const {
470
    return const_cast<Decl*>(this)->getTranslationUnitDecl();
471
  }
472
 
473
  bool isInAnonymousNamespace() const;
474
 
475
  bool isInStdNamespace() const;
476
 
477
  // Return true if this is a FileContext Decl.
478
  bool isFileContextDecl() const;
479
 
480
  ASTContext &getASTContext() const LLVM_READONLY;
481
 
482
  /// Helper to get the language options from the ASTContext.
483
  /// Defined out of line to avoid depending on ASTContext.h.
484
  const LangOptions &getLangOpts() const LLVM_READONLY;
485
 
486
  void setAccess(AccessSpecifier AS) {
487
    Access = AS;
488
    assert(AccessDeclContextCheck());
489
  }
490
 
491
  AccessSpecifier getAccess() const {
492
    assert(AccessDeclContextCheck());
493
    return AccessSpecifier(Access);
494
  }
495
 
496
  /// Retrieve the access specifier for this declaration, even though
497
  /// it may not yet have been properly set.
498
  AccessSpecifier getAccessUnsafe() const {
499
    return AccessSpecifier(Access);
500
  }
501
 
502
  bool hasAttrs() const { return HasAttrs; }
503
 
504
  void setAttrs(const AttrVec& Attrs) {
505
    return setAttrsImpl(Attrs, getASTContext());
506
  }
507
 
508
  AttrVec &getAttrs() {
509
    return const_cast<AttrVec&>(const_cast<const Decl*>(this)->getAttrs());
510
  }
511
 
512
  const AttrVec &getAttrs() const;
513
  void dropAttrs();
514
  void addAttr(Attr *A);
515
 
516
  using attr_iterator = AttrVec::const_iterator;
517
  using attr_range = llvm::iterator_range<attr_iterator>;
518
 
519
  attr_range attrs() const {
520
    return attr_range(attr_begin(), attr_end());
521
  }
522
 
523
  attr_iterator attr_begin() const {
524
    return hasAttrs() ? getAttrs().begin() : nullptr;
525
  }
526
  attr_iterator attr_end() const {
527
    return hasAttrs() ? getAttrs().end() : nullptr;
528
  }
529
 
530
  template <typename T>
531
  void dropAttr() {
532
    if (!HasAttrs) return;
533
 
534
    AttrVec &Vec = getAttrs();
535
    llvm::erase_if(Vec, [](Attr *A) { return isa<T>(A); });
536
 
537
    if (Vec.empty())
538
      HasAttrs = false;
539
  }
540
 
541
  template <typename T>
542
  llvm::iterator_range<specific_attr_iterator<T>> specific_attrs() const {
543
    return llvm::make_range(specific_attr_begin<T>(), specific_attr_end<T>());
544
  }
545
 
546
  template <typename T>
547
  specific_attr_iterator<T> specific_attr_begin() const {
548
    return specific_attr_iterator<T>(attr_begin());
549
  }
550
 
551
  template <typename T>
552
  specific_attr_iterator<T> specific_attr_end() const {
553
    return specific_attr_iterator<T>(attr_end());
554
  }
555
 
556
  template<typename T> T *getAttr() const {
557
    return hasAttrs() ? getSpecificAttr<T>(getAttrs()) : nullptr;
558
  }
559
 
560
  template<typename T> bool hasAttr() const {
561
    return hasAttrs() && hasSpecificAttr<T>(getAttrs());
562
  }
563
 
564
  /// getMaxAlignment - return the maximum alignment specified by attributes
565
  /// on this decl, 0 if there are none.
566
  unsigned getMaxAlignment() const;
567
 
568
  /// setInvalidDecl - Indicates the Decl had a semantic error. This
569
  /// allows for graceful error recovery.
570
  void setInvalidDecl(bool Invalid = true);
571
  bool isInvalidDecl() const { return (bool) InvalidDecl; }
572
 
573
  /// isImplicit - Indicates whether the declaration was implicitly
574
  /// generated by the implementation. If false, this declaration
575
  /// was written explicitly in the source code.
576
  bool isImplicit() const { return Implicit; }
577
  void setImplicit(bool I = true) { Implicit = I; }
578
 
579
  /// Whether *any* (re-)declaration of the entity was used, meaning that
580
  /// a definition is required.
581
  ///
582
  /// \param CheckUsedAttr When true, also consider the "used" attribute
583
  /// (in addition to the "used" bit set by \c setUsed()) when determining
584
  /// whether the function is used.
585
  bool isUsed(bool CheckUsedAttr = true) const;
586
 
587
  /// Set whether the declaration is used, in the sense of odr-use.
588
  ///
589
  /// This should only be used immediately after creating a declaration.
590
  /// It intentionally doesn't notify any listeners.
591
  void setIsUsed() { getCanonicalDecl()->Used = true; }
592
 
593
  /// Mark the declaration used, in the sense of odr-use.
594
  ///
595
  /// This notifies any mutation listeners in addition to setting a bit
596
  /// indicating the declaration is used.
597
  void markUsed(ASTContext &C);
598
 
599
  /// Whether any declaration of this entity was referenced.
600
  bool isReferenced() const;
601
 
602
  /// Whether this declaration was referenced. This should not be relied
603
  /// upon for anything other than debugging.
604
  bool isThisDeclarationReferenced() const { return Referenced; }
605
 
606
  void setReferenced(bool R = true) { Referenced = R; }
607
 
608
  /// Whether this declaration is a top-level declaration (function,
609
  /// global variable, etc.) that is lexically inside an objc container
610
  /// definition.
611
  bool isTopLevelDeclInObjCContainer() const {
612
    return TopLevelDeclInObjCContainer;
613
  }
614
 
615
  void setTopLevelDeclInObjCContainer(bool V = true) {
616
    TopLevelDeclInObjCContainer = V;
617
  }
618
 
619
  /// Looks on this and related declarations for an applicable
620
  /// external source symbol attribute.
621
  ExternalSourceSymbolAttr *getExternalSourceSymbolAttr() const;
622
 
623
  /// Whether this declaration was marked as being private to the
624
  /// module in which it was defined.
625
  bool isModulePrivate() const {
626
    return getModuleOwnershipKind() == ModuleOwnershipKind::ModulePrivate;
627
  }
628
 
629
  /// Whether this declaration was exported in a lexical context.
630
  /// e.g.:
631
  ///
632
  ///   export namespace A {
633
  ///      void f1();        // isInExportDeclContext() == true
634
  ///   }
635
  ///   void A::f1();        // isInExportDeclContext() == false
636
  ///
637
  ///   namespace B {
638
  ///      void f2();        // isInExportDeclContext() == false
639
  ///   }
640
  ///   export void B::f2(); // isInExportDeclContext() == true
641
  bool isInExportDeclContext() const;
642
 
643
  bool isInvisibleOutsideTheOwningModule() const {
644
    return getModuleOwnershipKind() > ModuleOwnershipKind::VisibleWhenImported;
645
  }
646
 
647
  /// FIXME: Implement discarding declarations actually in global module
648
  /// fragment. See [module.global.frag]p3,4 for details.
649
  bool isDiscardedInGlobalModuleFragment() const { return false; }
650
 
651
  /// Return true if this declaration has an attribute which acts as
652
  /// definition of the entity, such as 'alias' or 'ifunc'.
653
  bool hasDefiningAttr() const;
654
 
655
  /// Return this declaration's defining attribute if it has one.
656
  const Attr *getDefiningAttr() const;
657
 
658
protected:
659
  /// Specify that this declaration was marked as being private
660
  /// to the module in which it was defined.
661
  void setModulePrivate() {
662
    // The module-private specifier has no effect on unowned declarations.
663
    // FIXME: We should track this in some way for source fidelity.
664
    if (getModuleOwnershipKind() == ModuleOwnershipKind::Unowned)
665
      return;
666
    setModuleOwnershipKind(ModuleOwnershipKind::ModulePrivate);
667
  }
668
 
669
public:
670
  /// Set the FromASTFile flag. This indicates that this declaration
671
  /// was deserialized and not parsed from source code and enables
672
  /// features such as module ownership information.
673
  void setFromASTFile() {
674
    FromASTFile = true;
675
  }
676
 
677
  /// Set the owning module ID.  This may only be called for
678
  /// deserialized Decls.
679
  void setOwningModuleID(unsigned ID) {
680
    assert(isFromASTFile() && "Only works on a deserialized declaration");
681
    *((unsigned*)this - 2) = ID;
682
  }
683
 
684
public:
685
  /// Determine the availability of the given declaration.
686
  ///
687
  /// This routine will determine the most restrictive availability of
688
  /// the given declaration (e.g., preferring 'unavailable' to
689
  /// 'deprecated').
690
  ///
691
  /// \param Message If non-NULL and the result is not \c
692
  /// AR_Available, will be set to a (possibly empty) message
693
  /// describing why the declaration has not been introduced, is
694
  /// deprecated, or is unavailable.
695
  ///
696
  /// \param EnclosingVersion The version to compare with. If empty, assume the
697
  /// deployment target version.
698
  ///
699
  /// \param RealizedPlatform If non-NULL and the availability result is found
700
  /// in an available attribute it will set to the platform which is written in
701
  /// the available attribute.
702
  AvailabilityResult
703
  getAvailability(std::string *Message = nullptr,
704
                  VersionTuple EnclosingVersion = VersionTuple(),
705
                  StringRef *RealizedPlatform = nullptr) const;
706
 
707
  /// Retrieve the version of the target platform in which this
708
  /// declaration was introduced.
709
  ///
710
  /// \returns An empty version tuple if this declaration has no 'introduced'
711
  /// availability attributes, or the version tuple that's specified in the
712
  /// attribute otherwise.
713
  VersionTuple getVersionIntroduced() const;
714
 
715
  /// Determine whether this declaration is marked 'deprecated'.
716
  ///
717
  /// \param Message If non-NULL and the declaration is deprecated,
718
  /// this will be set to the message describing why the declaration
719
  /// was deprecated (which may be empty).
720
  bool isDeprecated(std::string *Message = nullptr) const {
721
    return getAvailability(Message) == AR_Deprecated;
722
  }
723
 
724
  /// Determine whether this declaration is marked 'unavailable'.
725
  ///
726
  /// \param Message If non-NULL and the declaration is unavailable,
727
  /// this will be set to the message describing why the declaration
728
  /// was made unavailable (which may be empty).
729
  bool isUnavailable(std::string *Message = nullptr) const {
730
    return getAvailability(Message) == AR_Unavailable;
731
  }
732
 
733
  /// Determine whether this is a weak-imported symbol.
734
  ///
735
  /// Weak-imported symbols are typically marked with the
736
  /// 'weak_import' attribute, but may also be marked with an
737
  /// 'availability' attribute where we're targing a platform prior to
738
  /// the introduction of this feature.
739
  bool isWeakImported() const;
740
 
741
  /// Determines whether this symbol can be weak-imported,
742
  /// e.g., whether it would be well-formed to add the weak_import
743
  /// attribute.
744
  ///
745
  /// \param IsDefinition Set to \c true to indicate that this
746
  /// declaration cannot be weak-imported because it has a definition.
747
  bool canBeWeakImported(bool &IsDefinition) const;
748
 
749
  /// Determine whether this declaration came from an AST file (such as
750
  /// a precompiled header or module) rather than having been parsed.
751
  bool isFromASTFile() const { return FromASTFile; }
752
 
753
  /// Retrieve the global declaration ID associated with this
754
  /// declaration, which specifies where this Decl was loaded from.
755
  unsigned getGlobalID() const {
756
    if (isFromASTFile())
757
      return *((const unsigned*)this - 1);
758
    return 0;
759
  }
760
 
761
  /// Retrieve the global ID of the module that owns this particular
762
  /// declaration.
763
  unsigned getOwningModuleID() const {
764
    if (isFromASTFile())
765
      return *((const unsigned*)this - 2);
766
    return 0;
767
  }
768
 
769
private:
770
  Module *getOwningModuleSlow() const;
771
 
772
protected:
773
  bool hasLocalOwningModuleStorage() const;
774
 
775
public:
776
  /// Get the imported owning module, if this decl is from an imported
777
  /// (non-local) module.
778
  Module *getImportedOwningModule() const {
779
    if (!isFromASTFile() || !hasOwningModule())
780
      return nullptr;
781
 
782
    return getOwningModuleSlow();
783
  }
784
 
785
  /// Get the local owning module, if known. Returns nullptr if owner is
786
  /// not yet known or declaration is not from a module.
787
  Module *getLocalOwningModule() const {
788
    if (isFromASTFile() || !hasOwningModule())
789
      return nullptr;
790
 
791
    assert(hasLocalOwningModuleStorage() &&
792
           "owned local decl but no local module storage");
793
    return reinterpret_cast<Module *const *>(this)[-1];
794
  }
795
  void setLocalOwningModule(Module *M) {
796
    assert(!isFromASTFile() && hasOwningModule() &&
797
           hasLocalOwningModuleStorage() &&
798
           "should not have a cached owning module");
799
    reinterpret_cast<Module **>(this)[-1] = M;
800
  }
801
 
802
  /// Is this declaration owned by some module?
803
  bool hasOwningModule() const {
804
    return getModuleOwnershipKind() != ModuleOwnershipKind::Unowned;
805
  }
806
 
807
  /// Get the module that owns this declaration (for visibility purposes).
808
  Module *getOwningModule() const {
809
    return isFromASTFile() ? getImportedOwningModule() : getLocalOwningModule();
810
  }
811
 
812
  /// Get the module that owns this declaration for linkage purposes.
813
  /// There only ever is such a module under the C++ Modules TS.
814
  ///
815
  /// \param IgnoreLinkage Ignore the linkage of the entity; assume that
816
  /// all declarations in a global module fragment are unowned.
817
  Module *getOwningModuleForLinkage(bool IgnoreLinkage = false) const;
818
 
819
  /// Determine whether this declaration is definitely visible to name lookup,
820
  /// independent of whether the owning module is visible.
821
  /// Note: The declaration may be visible even if this returns \c false if the
822
  /// owning module is visible within the query context. This is a low-level
823
  /// helper function; most code should be calling Sema::isVisible() instead.
824
  bool isUnconditionallyVisible() const {
825
    return (int)getModuleOwnershipKind() <= (int)ModuleOwnershipKind::Visible;
826
  }
827
 
828
  bool isReachable() const {
829
    return (int)getModuleOwnershipKind() <=
830
           (int)ModuleOwnershipKind::ReachableWhenImported;
831
  }
832
 
833
  /// Set that this declaration is globally visible, even if it came from a
834
  /// module that is not visible.
835
  void setVisibleDespiteOwningModule() {
836
    if (!isUnconditionallyVisible())
837
      setModuleOwnershipKind(ModuleOwnershipKind::Visible);
838
  }
839
 
840
  /// Get the kind of module ownership for this declaration.
841
  ModuleOwnershipKind getModuleOwnershipKind() const {
842
    return NextInContextAndBits.getInt();
843
  }
844
 
845
  /// Set whether this declaration is hidden from name lookup.
846
  void setModuleOwnershipKind(ModuleOwnershipKind MOK) {
847
    assert(!(getModuleOwnershipKind() == ModuleOwnershipKind::Unowned &&
848
             MOK != ModuleOwnershipKind::Unowned && !isFromASTFile() &&
849
             !hasLocalOwningModuleStorage()) &&
850
           "no storage available for owning module for this declaration");
851
    NextInContextAndBits.setInt(MOK);
852
  }
853
 
854
  unsigned getIdentifierNamespace() const {
855
    return IdentifierNamespace;
856
  }
857
 
858
  bool isInIdentifierNamespace(unsigned NS) const {
859
    return getIdentifierNamespace() & NS;
860
  }
861
 
862
  static unsigned getIdentifierNamespaceForKind(Kind DK);
863
 
864
  bool hasTagIdentifierNamespace() const {
865
    return isTagIdentifierNamespace(getIdentifierNamespace());
866
  }
867
 
868
  static bool isTagIdentifierNamespace(unsigned NS) {
869
    // TagDecls have Tag and Type set and may also have TagFriend.
870
    return (NS & ~IDNS_TagFriend) == (IDNS_Tag | IDNS_Type);
871
  }
872
 
873
  /// getLexicalDeclContext - The declaration context where this Decl was
874
  /// lexically declared (LexicalDC). May be different from
875
  /// getDeclContext() (SemanticDC).
876
  /// e.g.:
877
  ///
878
  ///   namespace A {
879
  ///      void f(); // SemanticDC == LexicalDC == 'namespace A'
880
  ///   }
881
  ///   void A::f(); // SemanticDC == namespace 'A'
882
  ///                // LexicalDC == global namespace
883
  DeclContext *getLexicalDeclContext() {
884
    if (isInSemaDC())
885
      return getSemanticDC();
886
    return getMultipleDC()->LexicalDC;
887
  }
888
  const DeclContext *getLexicalDeclContext() const {
889
    return const_cast<Decl*>(this)->getLexicalDeclContext();
890
  }
891
 
892
  /// Determine whether this declaration is declared out of line (outside its
893
  /// semantic context).
894
  virtual bool isOutOfLine() const;
895
 
896
  /// setDeclContext - Set both the semantic and lexical DeclContext
897
  /// to DC.
898
  void setDeclContext(DeclContext *DC);
899
 
900
  void setLexicalDeclContext(DeclContext *DC);
901
 
902
  /// Determine whether this declaration is a templated entity (whether it is
903
  // within the scope of a template parameter).
904
  bool isTemplated() const;
905
 
906
  /// Determine the number of levels of template parameter surrounding this
907
  /// declaration.
908
  unsigned getTemplateDepth() const;
909
 
910
  /// isDefinedOutsideFunctionOrMethod - This predicate returns true if this
911
  /// scoped decl is defined outside the current function or method.  This is
912
  /// roughly global variables and functions, but also handles enums (which
913
  /// could be defined inside or outside a function etc).
914
  bool isDefinedOutsideFunctionOrMethod() const {
915
    return getParentFunctionOrMethod() == nullptr;
916
  }
917
 
918
  /// Determine whether a substitution into this declaration would occur as
919
  /// part of a substitution into a dependent local scope. Such a substitution
920
  /// transitively substitutes into all constructs nested within this
921
  /// declaration.
922
  ///
923
  /// This recognizes non-defining declarations as well as members of local
924
  /// classes and lambdas:
925
  /// \code
926
  ///     template<typename T> void foo() { void bar(); }
927
  ///     template<typename T> void foo2() { class ABC { void bar(); }; }
928
  ///     template<typename T> inline int x = [](){ return 0; }();
929
  /// \endcode
930
  bool isInLocalScopeForInstantiation() const;
931
 
932
  /// If this decl is defined inside a function/method/block it returns
933
  /// the corresponding DeclContext, otherwise it returns null.
934
  const DeclContext *
935
  getParentFunctionOrMethod(bool LexicalParent = false) const;
936
  DeclContext *getParentFunctionOrMethod(bool LexicalParent = false) {
937
    return const_cast<DeclContext *>(
938
        const_cast<const Decl *>(this)->getParentFunctionOrMethod(
939
            LexicalParent));
940
  }
941
 
942
  /// Retrieves the "canonical" declaration of the given declaration.
943
  virtual Decl *getCanonicalDecl() { return this; }
944
  const Decl *getCanonicalDecl() const {
945
    return const_cast<Decl*>(this)->getCanonicalDecl();
946
  }
947
 
948
  /// Whether this particular Decl is a canonical one.
949
  bool isCanonicalDecl() const { return getCanonicalDecl() == this; }
950
 
951
protected:
952
  /// Returns the next redeclaration or itself if this is the only decl.
953
  ///
954
  /// Decl subclasses that can be redeclared should override this method so that
955
  /// Decl::redecl_iterator can iterate over them.
956
  virtual Decl *getNextRedeclarationImpl() { return this; }
957
 
958
  /// Implementation of getPreviousDecl(), to be overridden by any
959
  /// subclass that has a redeclaration chain.
960
  virtual Decl *getPreviousDeclImpl() { return nullptr; }
961
 
962
  /// Implementation of getMostRecentDecl(), to be overridden by any
963
  /// subclass that has a redeclaration chain.
964
  virtual Decl *getMostRecentDeclImpl() { return this; }
965
 
966
public:
967
  /// Iterates through all the redeclarations of the same decl.
968
  class redecl_iterator {
969
    /// Current - The current declaration.
970
    Decl *Current = nullptr;
971
    Decl *Starter;
972
 
973
  public:
974
    using value_type = Decl *;
975
    using reference = const value_type &;
976
    using pointer = const value_type *;
977
    using iterator_category = std::forward_iterator_tag;
978
    using difference_type = std::ptrdiff_t;
979
 
980
    redecl_iterator() = default;
981
    explicit redecl_iterator(Decl *C) : Current(C), Starter(C) {}
982
 
983
    reference operator*() const { return Current; }
984
    value_type operator->() const { return Current; }
985
 
986
    redecl_iterator& operator++() {
987
      assert(Current && "Advancing while iterator has reached end");
988
      // Get either previous decl or latest decl.
989
      Decl *Next = Current->getNextRedeclarationImpl();
990
      assert(Next && "Should return next redeclaration or itself, never null!");
991
      Current = (Next != Starter) ? Next : nullptr;
992
      return *this;
993
    }
994
 
995
    redecl_iterator operator++(int) {
996
      redecl_iterator tmp(*this);
997
      ++(*this);
998
      return tmp;
999
    }
1000
 
1001
    friend bool operator==(redecl_iterator x, redecl_iterator y) {
1002
      return x.Current == y.Current;
1003
    }
1004
 
1005
    friend bool operator!=(redecl_iterator x, redecl_iterator y) {
1006
      return x.Current != y.Current;
1007
    }
1008
  };
1009
 
1010
  using redecl_range = llvm::iterator_range<redecl_iterator>;
1011
 
1012
  /// Returns an iterator range for all the redeclarations of the same
1013
  /// decl. It will iterate at least once (when this decl is the only one).
1014
  redecl_range redecls() const {
1015
    return redecl_range(redecls_begin(), redecls_end());
1016
  }
1017
 
1018
  redecl_iterator redecls_begin() const {
1019
    return redecl_iterator(const_cast<Decl *>(this));
1020
  }
1021
 
1022
  redecl_iterator redecls_end() const { return redecl_iterator(); }
1023
 
1024
  /// Retrieve the previous declaration that declares the same entity
1025
  /// as this declaration, or NULL if there is no previous declaration.
1026
  Decl *getPreviousDecl() { return getPreviousDeclImpl(); }
1027
 
1028
  /// Retrieve the previous declaration that declares the same entity
1029
  /// as this declaration, or NULL if there is no previous declaration.
1030
  const Decl *getPreviousDecl() const {
1031
    return const_cast<Decl *>(this)->getPreviousDeclImpl();
1032
  }
1033
 
1034
  /// True if this is the first declaration in its redeclaration chain.
1035
  bool isFirstDecl() const {
1036
    return getPreviousDecl() == nullptr;
1037
  }
1038
 
1039
  /// Retrieve the most recent declaration that declares the same entity
1040
  /// as this declaration (which may be this declaration).
1041
  Decl *getMostRecentDecl() { return getMostRecentDeclImpl(); }
1042
 
1043
  /// Retrieve the most recent declaration that declares the same entity
1044
  /// as this declaration (which may be this declaration).
1045
  const Decl *getMostRecentDecl() const {
1046
    return const_cast<Decl *>(this)->getMostRecentDeclImpl();
1047
  }
1048
 
1049
  /// getBody - If this Decl represents a declaration for a body of code,
1050
  ///  such as a function or method definition, this method returns the
1051
  ///  top-level Stmt* of that body.  Otherwise this method returns null.
1052
  virtual Stmt* getBody() const { return nullptr; }
1053
 
1054
  /// Returns true if this \c Decl represents a declaration for a body of
1055
  /// code, such as a function or method definition.
1056
  /// Note that \c hasBody can also return true if any redeclaration of this
1057
  /// \c Decl represents a declaration for a body of code.
1058
  virtual bool hasBody() const { return getBody() != nullptr; }
1059
 
1060
  /// getBodyRBrace - Gets the right brace of the body, if a body exists.
1061
  /// This works whether the body is a CompoundStmt or a CXXTryStmt.
1062
  SourceLocation getBodyRBrace() const;
1063
 
1064
  // global temp stats (until we have a per-module visitor)
1065
  static void add(Kind k);
1066
  static void EnableStatistics();
1067
  static void PrintStats();
1068
 
1069
  /// isTemplateParameter - Determines whether this declaration is a
1070
  /// template parameter.
1071
  bool isTemplateParameter() const;
1072
 
1073
  /// isTemplateParameter - Determines whether this declaration is a
1074
  /// template parameter pack.
1075
  bool isTemplateParameterPack() const;
1076
 
1077
  /// Whether this declaration is a parameter pack.
1078
  bool isParameterPack() const;
1079
 
1080
  /// returns true if this declaration is a template
1081
  bool isTemplateDecl() const;
1082
 
1083
  /// Whether this declaration is a function or function template.
1084
  bool isFunctionOrFunctionTemplate() const {
1085
    return (DeclKind >= Decl::firstFunction &&
1086
            DeclKind <= Decl::lastFunction) ||
1087
           DeclKind == FunctionTemplate;
1088
  }
1089
 
1090
  /// If this is a declaration that describes some template, this
1091
  /// method returns that template declaration.
1092
  ///
1093
  /// Note that this returns nullptr for partial specializations, because they
1094
  /// are not modeled as TemplateDecls. Use getDescribedTemplateParams to handle
1095
  /// those cases.
1096
  TemplateDecl *getDescribedTemplate() const;
1097
 
1098
  /// If this is a declaration that describes some template or partial
1099
  /// specialization, this returns the corresponding template parameter list.
1100
  const TemplateParameterList *getDescribedTemplateParams() const;
1101
 
1102
  /// Returns the function itself, or the templated function if this is a
1103
  /// function template.
1104
  FunctionDecl *getAsFunction() LLVM_READONLY;
1105
 
1106
  const FunctionDecl *getAsFunction() const {
1107
    return const_cast<Decl *>(this)->getAsFunction();
1108
  }
1109
 
1110
  /// Changes the namespace of this declaration to reflect that it's
1111
  /// a function-local extern declaration.
1112
  ///
1113
  /// These declarations appear in the lexical context of the extern
1114
  /// declaration, but in the semantic context of the enclosing namespace
1115
  /// scope.
1116
  void setLocalExternDecl() {
1117
    Decl *Prev = getPreviousDecl();
1118
    IdentifierNamespace &= ~IDNS_Ordinary;
1119
 
1120
    // It's OK for the declaration to still have the "invisible friend" flag or
1121
    // the "conflicts with tag declarations in this scope" flag for the outer
1122
    // scope.
1123
    assert((IdentifierNamespace & ~(IDNS_OrdinaryFriend | IDNS_Tag)) == 0 &&
1124
           "namespace is not ordinary");
1125
 
1126
    IdentifierNamespace |= IDNS_LocalExtern;
1127
    if (Prev && Prev->getIdentifierNamespace() & IDNS_Ordinary)
1128
      IdentifierNamespace |= IDNS_Ordinary;
1129
  }
1130
 
1131
  /// Determine whether this is a block-scope declaration with linkage.
1132
  /// This will either be a local variable declaration declared 'extern', or a
1133
  /// local function declaration.
1134
  bool isLocalExternDecl() const {
1135
    return IdentifierNamespace & IDNS_LocalExtern;
1136
  }
1137
 
1138
  /// Changes the namespace of this declaration to reflect that it's
1139
  /// the object of a friend declaration.
1140
  ///
1141
  /// These declarations appear in the lexical context of the friending
1142
  /// class, but in the semantic context of the actual entity.  This property
1143
  /// applies only to a specific decl object;  other redeclarations of the
1144
  /// same entity may not (and probably don't) share this property.
1145
  void setObjectOfFriendDecl(bool PerformFriendInjection = false) {
1146
    unsigned OldNS = IdentifierNamespace;
1147
    assert((OldNS & (IDNS_Tag | IDNS_Ordinary |
1148
                     IDNS_TagFriend | IDNS_OrdinaryFriend |
1149
                     IDNS_LocalExtern | IDNS_NonMemberOperator)) &&
1150
           "namespace includes neither ordinary nor tag");
1151
    assert(!(OldNS & ~(IDNS_Tag | IDNS_Ordinary | IDNS_Type |
1152
                       IDNS_TagFriend | IDNS_OrdinaryFriend |
1153
                       IDNS_LocalExtern | IDNS_NonMemberOperator)) &&
1154
           "namespace includes other than ordinary or tag");
1155
 
1156
    Decl *Prev = getPreviousDecl();
1157
    IdentifierNamespace &= ~(IDNS_Ordinary | IDNS_Tag | IDNS_Type);
1158
 
1159
    if (OldNS & (IDNS_Tag | IDNS_TagFriend)) {
1160
      IdentifierNamespace |= IDNS_TagFriend;
1161
      if (PerformFriendInjection ||
1162
          (Prev && Prev->getIdentifierNamespace() & IDNS_Tag))
1163
        IdentifierNamespace |= IDNS_Tag | IDNS_Type;
1164
    }
1165
 
1166
    if (OldNS & (IDNS_Ordinary | IDNS_OrdinaryFriend |
1167
                 IDNS_LocalExtern | IDNS_NonMemberOperator)) {
1168
      IdentifierNamespace |= IDNS_OrdinaryFriend;
1169
      if (PerformFriendInjection ||
1170
          (Prev && Prev->getIdentifierNamespace() & IDNS_Ordinary))
1171
        IdentifierNamespace |= IDNS_Ordinary;
1172
    }
1173
  }
1174
 
1175
  enum FriendObjectKind {
1176
    FOK_None,      ///< Not a friend object.
1177
    FOK_Declared,  ///< A friend of a previously-declared entity.
1178
    FOK_Undeclared ///< A friend of a previously-undeclared entity.
1179
  };
1180
 
1181
  /// Determines whether this declaration is the object of a
1182
  /// friend declaration and, if so, what kind.
1183
  ///
1184
  /// There is currently no direct way to find the associated FriendDecl.
1185
  FriendObjectKind getFriendObjectKind() const {
1186
    unsigned mask =
1187
        (IdentifierNamespace & (IDNS_TagFriend | IDNS_OrdinaryFriend));
1188
    if (!mask) return FOK_None;
1189
    return (IdentifierNamespace & (IDNS_Tag | IDNS_Ordinary) ? FOK_Declared
1190
                                                             : FOK_Undeclared);
1191
  }
1192
 
1193
  /// Specifies that this declaration is a C++ overloaded non-member.
1194
  void setNonMemberOperator() {
1195
    assert(getKind() == Function || getKind() == FunctionTemplate);
1196
    assert((IdentifierNamespace & IDNS_Ordinary) &&
1197
           "visible non-member operators should be in ordinary namespace");
1198
    IdentifierNamespace |= IDNS_NonMemberOperator;
1199
  }
1200
 
1201
  static bool classofKind(Kind K) { return true; }
1202
  static DeclContext *castToDeclContext(const Decl *);
1203
  static Decl *castFromDeclContext(const DeclContext *);
1204
 
1205
  void print(raw_ostream &Out, unsigned Indentation = 0,
1206
             bool PrintInstantiation = false) const;
1207
  void print(raw_ostream &Out, const PrintingPolicy &Policy,
1208
             unsigned Indentation = 0, bool PrintInstantiation = false) const;
1209
  static void printGroup(Decl** Begin, unsigned NumDecls,
1210
                         raw_ostream &Out, const PrintingPolicy &Policy,
1211
                         unsigned Indentation = 0);
1212
 
1213
  // Debuggers don't usually respect default arguments.
1214
  void dump() const;
1215
 
1216
  // Same as dump(), but forces color printing.
1217
  void dumpColor() const;
1218
 
1219
  void dump(raw_ostream &Out, bool Deserialize = false,
1220
            ASTDumpOutputFormat OutputFormat = ADOF_Default) const;
1221
 
1222
  /// \return Unique reproducible object identifier
1223
  int64_t getID() const;
1224
 
1225
  /// Looks through the Decl's underlying type to extract a FunctionType
1226
  /// when possible. Will return null if the type underlying the Decl does not
1227
  /// have a FunctionType.
1228
  const FunctionType *getFunctionType(bool BlocksToo = true) const;
1229
 
1230
private:
1231
  void setAttrsImpl(const AttrVec& Attrs, ASTContext &Ctx);
1232
  void setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
1233
                           ASTContext &Ctx);
1234
 
1235
protected:
1236
  ASTMutationListener *getASTMutationListener() const;
1237
};
1238
 
1239
/// Determine whether two declarations declare the same entity.
1240
inline bool declaresSameEntity(const Decl *D1, const Decl *D2) {
1241
  if (!D1 || !D2)
1242
    return false;
1243
 
1244
  if (D1 == D2)
1245
    return true;
1246
 
1247
  return D1->getCanonicalDecl() == D2->getCanonicalDecl();
1248
}
1249
 
1250
/// PrettyStackTraceDecl - If a crash occurs, indicate that it happened when
1251
/// doing something to a specific decl.
1252
class PrettyStackTraceDecl : public llvm::PrettyStackTraceEntry {
1253
  const Decl *TheDecl;
1254
  SourceLocation Loc;
1255
  SourceManager &SM;
1256
  const char *Message;
1257
 
1258
public:
1259
  PrettyStackTraceDecl(const Decl *theDecl, SourceLocation L,
1260
                       SourceManager &sm, const char *Msg)
1261
      : TheDecl(theDecl), Loc(L), SM(sm), Message(Msg) {}
1262
 
1263
  void print(raw_ostream &OS) const override;
1264
};
1265
} // namespace clang
1266
 
1267
// Required to determine the layout of the PointerUnion<NamedDecl*> before
1268
// seeing the NamedDecl definition being first used in DeclListNode::operator*.
1269
namespace llvm {
1270
  template <> struct PointerLikeTypeTraits<::clang::NamedDecl *> {
1271
    static inline void *getAsVoidPointer(::clang::NamedDecl *P) { return P; }
1272
    static inline ::clang::NamedDecl *getFromVoidPointer(void *P) {
1273
      return static_cast<::clang::NamedDecl *>(P);
1274
    }
1275
    static constexpr int NumLowBitsAvailable = 3;
1276
  };
1277
}
1278
 
1279
namespace clang {
1280
/// A list storing NamedDecls in the lookup tables.
1281
class DeclListNode {
1282
  friend class ASTContext; // allocate, deallocate nodes.
1283
  friend class StoredDeclsList;
1284
public:
1285
  using Decls = llvm::PointerUnion<NamedDecl*, DeclListNode*>;
1286
  class iterator {
1287
    friend class DeclContextLookupResult;
1288
    friend class StoredDeclsList;
1289
 
1290
    Decls Ptr;
1291
    iterator(Decls Node) : Ptr(Node) { }
1292
  public:
1293
    using difference_type = ptrdiff_t;
1294
    using value_type = NamedDecl*;
1295
    using pointer = void;
1296
    using reference = value_type;
1297
    using iterator_category = std::forward_iterator_tag;
1298
 
1299
    iterator() = default;
1300
 
1301
    reference operator*() const {
1302
      assert(Ptr && "dereferencing end() iterator");
1303
      if (DeclListNode *CurNode = Ptr.dyn_cast<DeclListNode*>())
1304
        return CurNode->D;
1305
      return Ptr.get<NamedDecl*>();
1306
    }
1307
    void operator->() const { } // Unsupported.
1308
    bool operator==(const iterator &X) const { return Ptr == X.Ptr; }
1309
    bool operator!=(const iterator &X) const { return Ptr != X.Ptr; }
1310
    inline iterator &operator++() { // ++It
1311
      assert(!Ptr.isNull() && "Advancing empty iterator");
1312
 
1313
      if (DeclListNode *CurNode = Ptr.dyn_cast<DeclListNode*>())
1314
        Ptr = CurNode->Rest;
1315
      else
1316
        Ptr = nullptr;
1317
      return *this;
1318
    }
1319
    iterator operator++(int) { // It++
1320
      iterator temp = *this;
1321
      ++(*this);
1322
      return temp;
1323
    }
1324
    // Enables the pattern for (iterator I =..., E = I.end(); I != E; ++I)
1325
    iterator end() { return iterator(); }
1326
  };
1327
private:
1328
  NamedDecl *D = nullptr;
1329
  Decls Rest = nullptr;
1330
  DeclListNode(NamedDecl *ND) : D(ND) {}
1331
};
1332
 
1333
/// The results of name lookup within a DeclContext.
1334
class DeclContextLookupResult {
1335
  using Decls = DeclListNode::Decls;
1336
 
1337
  /// When in collection form, this is what the Data pointer points to.
1338
  Decls Result;
1339
 
1340
public:
1341
  DeclContextLookupResult() = default;
1342
  DeclContextLookupResult(Decls Result) : Result(Result) {}
1343
 
1344
  using iterator = DeclListNode::iterator;
1345
  using const_iterator = iterator;
1346
  using reference = iterator::reference;
1347
 
1348
  iterator begin() { return iterator(Result); }
1349
  iterator end() { return iterator(); }
1350
  const_iterator begin() const {
1351
    return const_cast<DeclContextLookupResult*>(this)->begin();
1352
  }
1353
  const_iterator end() const { return iterator(); }
1354
 
1355
  bool empty() const { return Result.isNull();  }
1356
  bool isSingleResult() const { return Result.dyn_cast<NamedDecl*>(); }
1357
  reference front() const { return *begin(); }
1358
 
1359
  // Find the first declaration of the given type in the list. Note that this
1360
  // is not in general the earliest-declared declaration, and should only be
1361
  // used when it's not possible for there to be more than one match or where
1362
  // it doesn't matter which one is found.
1363
  template<class T> T *find_first() const {
1364
    for (auto *D : *this)
1365
      if (T *Decl = dyn_cast<T>(D))
1366
        return Decl;
1367
 
1368
    return nullptr;
1369
  }
1370
};
1371
 
1372
/// DeclContext - This is used only as base class of specific decl types that
1373
/// can act as declaration contexts. These decls are (only the top classes
1374
/// that directly derive from DeclContext are mentioned, not their subclasses):
1375
///
1376
///   TranslationUnitDecl
1377
///   ExternCContext
1378
///   NamespaceDecl
1379
///   TagDecl
1380
///   OMPDeclareReductionDecl
1381
///   OMPDeclareMapperDecl
1382
///   FunctionDecl
1383
///   ObjCMethodDecl
1384
///   ObjCContainerDecl
1385
///   LinkageSpecDecl
1386
///   ExportDecl
1387
///   BlockDecl
1388
///   CapturedDecl
1389
class DeclContext {
1390
  /// For makeDeclVisibleInContextImpl
1391
  friend class ASTDeclReader;
1392
  /// For reconcileExternalVisibleStorage, CreateStoredDeclsMap,
1393
  /// hasNeedToReconcileExternalVisibleStorage
1394
  friend class ExternalASTSource;
1395
  /// For CreateStoredDeclsMap
1396
  friend class DependentDiagnostic;
1397
  /// For hasNeedToReconcileExternalVisibleStorage,
1398
  /// hasLazyLocalLexicalLookups, hasLazyExternalLexicalLookups
1399
  friend class ASTWriter;
1400
 
1401
  // We use uint64_t in the bit-fields below since some bit-fields
1402
  // cross the unsigned boundary and this breaks the packing.
1403
 
1404
  /// Stores the bits used by DeclContext.
1405
  /// If modified NumDeclContextBit, the ctor of DeclContext and the accessor
1406
  /// methods in DeclContext should be updated appropriately.
1407
  class DeclContextBitfields {
1408
    friend class DeclContext;
1409
    /// DeclKind - This indicates which class this is.
1410
    uint64_t DeclKind : 7;
1411
 
1412
    /// Whether this declaration context also has some external
1413
    /// storage that contains additional declarations that are lexically
1414
    /// part of this context.
1415
    mutable uint64_t ExternalLexicalStorage : 1;
1416
 
1417
    /// Whether this declaration context also has some external
1418
    /// storage that contains additional declarations that are visible
1419
    /// in this context.
1420
    mutable uint64_t ExternalVisibleStorage : 1;
1421
 
1422
    /// Whether this declaration context has had externally visible
1423
    /// storage added since the last lookup. In this case, \c LookupPtr's
1424
    /// invariant may not hold and needs to be fixed before we perform
1425
    /// another lookup.
1426
    mutable uint64_t NeedToReconcileExternalVisibleStorage : 1;
1427
 
1428
    /// If \c true, this context may have local lexical declarations
1429
    /// that are missing from the lookup table.
1430
    mutable uint64_t HasLazyLocalLexicalLookups : 1;
1431
 
1432
    /// If \c true, the external source may have lexical declarations
1433
    /// that are missing from the lookup table.
1434
    mutable uint64_t HasLazyExternalLexicalLookups : 1;
1435
 
1436
    /// If \c true, lookups should only return identifier from
1437
    /// DeclContext scope (for example TranslationUnit). Used in
1438
    /// LookupQualifiedName()
1439
    mutable uint64_t UseQualifiedLookup : 1;
1440
  };
1441
 
1442
  /// Number of bits in DeclContextBitfields.
1443
  enum { NumDeclContextBits = 13 };
1444
 
1445
  /// Stores the bits used by TagDecl.
1446
  /// If modified NumTagDeclBits and the accessor
1447
  /// methods in TagDecl should be updated appropriately.
1448
  class TagDeclBitfields {
1449
    friend class TagDecl;
1450
    /// For the bits in DeclContextBitfields
1451
    uint64_t : NumDeclContextBits;
1452
 
1453
    /// The TagKind enum.
1454
    uint64_t TagDeclKind : 3;
1455
 
1456
    /// True if this is a definition ("struct foo {};"), false if it is a
1457
    /// declaration ("struct foo;").  It is not considered a definition
1458
    /// until the definition has been fully processed.
1459
    uint64_t IsCompleteDefinition : 1;
1460
 
1461
    /// True if this is currently being defined.
1462
    uint64_t IsBeingDefined : 1;
1463
 
1464
    /// True if this tag declaration is "embedded" (i.e., defined or declared
1465
    /// for the very first time) in the syntax of a declarator.
1466
    uint64_t IsEmbeddedInDeclarator : 1;
1467
 
1468
    /// True if this tag is free standing, e.g. "struct foo;".
1469
    uint64_t IsFreeStanding : 1;
1470
 
1471
    /// Indicates whether it is possible for declarations of this kind
1472
    /// to have an out-of-date definition.
1473
    ///
1474
    /// This option is only enabled when modules are enabled.
1475
    uint64_t MayHaveOutOfDateDef : 1;
1476
 
1477
    /// Has the full definition of this type been required by a use somewhere in
1478
    /// the TU.
1479
    uint64_t IsCompleteDefinitionRequired : 1;
1480
 
1481
    /// Whether this tag is a definition which was demoted due to
1482
    /// a module merge.
1483
    uint64_t IsThisDeclarationADemotedDefinition : 1;
1484
  };
1485
 
1486
  /// Number of non-inherited bits in TagDeclBitfields.
1487
  enum { NumTagDeclBits = 10 };
1488
 
1489
  /// Stores the bits used by EnumDecl.
1490
  /// If modified NumEnumDeclBit and the accessor
1491
  /// methods in EnumDecl should be updated appropriately.
1492
  class EnumDeclBitfields {
1493
    friend class EnumDecl;
1494
    /// For the bits in DeclContextBitfields.
1495
    uint64_t : NumDeclContextBits;
1496
    /// For the bits in TagDeclBitfields.
1497
    uint64_t : NumTagDeclBits;
1498
 
1499
    /// Width in bits required to store all the non-negative
1500
    /// enumerators of this enum.
1501
    uint64_t NumPositiveBits : 8;
1502
 
1503
    /// Width in bits required to store all the negative
1504
    /// enumerators of this enum.
1505
    uint64_t NumNegativeBits : 8;
1506
 
1507
    /// True if this tag declaration is a scoped enumeration. Only
1508
    /// possible in C++11 mode.
1509
    uint64_t IsScoped : 1;
1510
 
1511
    /// If this tag declaration is a scoped enum,
1512
    /// then this is true if the scoped enum was declared using the class
1513
    /// tag, false if it was declared with the struct tag. No meaning is
1514
    /// associated if this tag declaration is not a scoped enum.
1515
    uint64_t IsScopedUsingClassTag : 1;
1516
 
1517
    /// True if this is an enumeration with fixed underlying type. Only
1518
    /// possible in C++11, Microsoft extensions, or Objective C mode.
1519
    uint64_t IsFixed : 1;
1520
 
1521
    /// True if a valid hash is stored in ODRHash.
1522
    uint64_t HasODRHash : 1;
1523
  };
1524
 
1525
  /// Number of non-inherited bits in EnumDeclBitfields.
1526
  enum { NumEnumDeclBits = 20 };
1527
 
1528
  /// Stores the bits used by RecordDecl.
1529
  /// If modified NumRecordDeclBits and the accessor
1530
  /// methods in RecordDecl should be updated appropriately.
1531
  class RecordDeclBitfields {
1532
    friend class RecordDecl;
1533
    /// For the bits in DeclContextBitfields.
1534
    uint64_t : NumDeclContextBits;
1535
    /// For the bits in TagDeclBitfields.
1536
    uint64_t : NumTagDeclBits;
1537
 
1538
    /// This is true if this struct ends with a flexible
1539
    /// array member (e.g. int X[]) or if this union contains a struct that does.
1540
    /// If so, this cannot be contained in arrays or other structs as a member.
1541
    uint64_t HasFlexibleArrayMember : 1;
1542
 
1543
    /// Whether this is the type of an anonymous struct or union.
1544
    uint64_t AnonymousStructOrUnion : 1;
1545
 
1546
    /// This is true if this struct has at least one member
1547
    /// containing an Objective-C object pointer type.
1548
    uint64_t HasObjectMember : 1;
1549
 
1550
    /// This is true if struct has at least one member of
1551
    /// 'volatile' type.
1552
    uint64_t HasVolatileMember : 1;
1553
 
1554
    /// Whether the field declarations of this record have been loaded
1555
    /// from external storage. To avoid unnecessary deserialization of
1556
    /// methods/nested types we allow deserialization of just the fields
1557
    /// when needed.
1558
    mutable uint64_t LoadedFieldsFromExternalStorage : 1;
1559
 
1560
    /// Basic properties of non-trivial C structs.
1561
    uint64_t NonTrivialToPrimitiveDefaultInitialize : 1;
1562
    uint64_t NonTrivialToPrimitiveCopy : 1;
1563
    uint64_t NonTrivialToPrimitiveDestroy : 1;
1564
 
1565
    /// The following bits indicate whether this is or contains a C union that
1566
    /// is non-trivial to default-initialize, destruct, or copy. These bits
1567
    /// imply the associated basic non-triviality predicates declared above.
1568
    uint64_t HasNonTrivialToPrimitiveDefaultInitializeCUnion : 1;
1569
    uint64_t HasNonTrivialToPrimitiveDestructCUnion : 1;
1570
    uint64_t HasNonTrivialToPrimitiveCopyCUnion : 1;
1571
 
1572
    /// Indicates whether this struct is destroyed in the callee.
1573
    uint64_t ParamDestroyedInCallee : 1;
1574
 
1575
    /// Represents the way this type is passed to a function.
1576
    uint64_t ArgPassingRestrictions : 2;
1577
 
1578
    /// Indicates whether this struct has had its field layout randomized.
1579
    uint64_t IsRandomized : 1;
1580
 
1581
    /// True if a valid hash is stored in ODRHash. This should shave off some
1582
    /// extra storage and prevent CXXRecordDecl to store unused bits.
1583
    uint64_t ODRHash : 26;
1584
  };
1585
 
1586
  /// Number of non-inherited bits in RecordDeclBitfields.
1587
  enum { NumRecordDeclBits = 41 };
1588
 
1589
  /// Stores the bits used by OMPDeclareReductionDecl.
1590
  /// If modified NumOMPDeclareReductionDeclBits and the accessor
1591
  /// methods in OMPDeclareReductionDecl should be updated appropriately.
1592
  class OMPDeclareReductionDeclBitfields {
1593
    friend class OMPDeclareReductionDecl;
1594
    /// For the bits in DeclContextBitfields
1595
    uint64_t : NumDeclContextBits;
1596
 
1597
    /// Kind of initializer,
1598
    /// function call or omp_priv<init_expr> initializtion.
1599
    uint64_t InitializerKind : 2;
1600
  };
1601
 
1602
  /// Number of non-inherited bits in OMPDeclareReductionDeclBitfields.
1603
  enum { NumOMPDeclareReductionDeclBits = 2 };
1604
 
1605
  /// Stores the bits used by FunctionDecl.
1606
  /// If modified NumFunctionDeclBits and the accessor
1607
  /// methods in FunctionDecl and CXXDeductionGuideDecl
1608
  /// (for IsCopyDeductionCandidate) should be updated appropriately.
1609
  class FunctionDeclBitfields {
1610
    friend class FunctionDecl;
1611
    /// For IsCopyDeductionCandidate
1612
    friend class CXXDeductionGuideDecl;
1613
    /// For the bits in DeclContextBitfields.
1614
    uint64_t : NumDeclContextBits;
1615
 
1616
    uint64_t SClass : 3;
1617
    uint64_t IsInline : 1;
1618
    uint64_t IsInlineSpecified : 1;
1619
 
1620
    uint64_t IsVirtualAsWritten : 1;
1621
    uint64_t IsPure : 1;
1622
    uint64_t HasInheritedPrototype : 1;
1623
    uint64_t HasWrittenPrototype : 1;
1624
    uint64_t IsDeleted : 1;
1625
    /// Used by CXXMethodDecl
1626
    uint64_t IsTrivial : 1;
1627
 
1628
    /// This flag indicates whether this function is trivial for the purpose of
1629
    /// calls. This is meaningful only when this function is a copy/move
1630
    /// constructor or a destructor.
1631
    uint64_t IsTrivialForCall : 1;
1632
 
1633
    uint64_t IsDefaulted : 1;
1634
    uint64_t IsExplicitlyDefaulted : 1;
1635
    uint64_t HasDefaultedFunctionInfo : 1;
1636
 
1637
    /// For member functions of complete types, whether this is an ineligible
1638
    /// special member function or an unselected destructor. See
1639
    /// [class.mem.special].
1640
    uint64_t IsIneligibleOrNotSelected : 1;
1641
 
1642
    uint64_t HasImplicitReturnZero : 1;
1643
    uint64_t IsLateTemplateParsed : 1;
1644
 
1645
    /// Kind of contexpr specifier as defined by ConstexprSpecKind.
1646
    uint64_t ConstexprKind : 2;
1647
    uint64_t InstantiationIsPending : 1;
1648
 
1649
    /// Indicates if the function uses __try.
1650
    uint64_t UsesSEHTry : 1;
1651
 
1652
    /// Indicates if the function was a definition
1653
    /// but its body was skipped.
1654
    uint64_t HasSkippedBody : 1;
1655
 
1656
    /// Indicates if the function declaration will
1657
    /// have a body, once we're done parsing it.
1658
    uint64_t WillHaveBody : 1;
1659
 
1660
    /// Indicates that this function is a multiversioned
1661
    /// function using attribute 'target'.
1662
    uint64_t IsMultiVersion : 1;
1663
 
1664
    /// [C++17] Only used by CXXDeductionGuideDecl. Indicates that
1665
    /// the Deduction Guide is the implicitly generated 'copy
1666
    /// deduction candidate' (is used during overload resolution).
1667
    uint64_t IsCopyDeductionCandidate : 1;
1668
 
1669
    /// Store the ODRHash after first calculation.
1670
    uint64_t HasODRHash : 1;
1671
 
1672
    /// Indicates if the function uses Floating Point Constrained Intrinsics
1673
    uint64_t UsesFPIntrin : 1;
1674
 
1675
    // Indicates this function is a constrained friend, where the constraint
1676
    // refers to an enclosing template for hte purposes of [temp.friend]p9.
1677
    uint64_t FriendConstraintRefersToEnclosingTemplate : 1;
1678
  };
1679
 
1680
  /// Number of non-inherited bits in FunctionDeclBitfields.
1681
  enum { NumFunctionDeclBits = 29 };
1682
 
1683
  /// Stores the bits used by CXXConstructorDecl. If modified
1684
  /// NumCXXConstructorDeclBits and the accessor
1685
  /// methods in CXXConstructorDecl should be updated appropriately.
1686
  class CXXConstructorDeclBitfields {
1687
    friend class CXXConstructorDecl;
1688
    /// For the bits in DeclContextBitfields.
1689
    uint64_t : NumDeclContextBits;
1690
    /// For the bits in FunctionDeclBitfields.
1691
    uint64_t : NumFunctionDeclBits;
1692
 
1693
    /// 22 bits to fit in the remaining available space.
1694
    /// Note that this makes CXXConstructorDeclBitfields take
1695
    /// exactly 64 bits and thus the width of NumCtorInitializers
1696
    /// will need to be shrunk if some bit is added to NumDeclContextBitfields,
1697
    /// NumFunctionDeclBitfields or CXXConstructorDeclBitfields.
1698
    uint64_t NumCtorInitializers : 19;
1699
    uint64_t IsInheritingConstructor : 1;
1700
 
1701
    /// Whether this constructor has a trail-allocated explicit specifier.
1702
    uint64_t HasTrailingExplicitSpecifier : 1;
1703
    /// If this constructor does't have a trail-allocated explicit specifier.
1704
    /// Whether this constructor is explicit specified.
1705
    uint64_t IsSimpleExplicit : 1;
1706
  };
1707
 
1708
  /// Number of non-inherited bits in CXXConstructorDeclBitfields.
1709
  enum {
1710
    NumCXXConstructorDeclBits = 64 - NumDeclContextBits - NumFunctionDeclBits
1711
  };
1712
 
1713
  /// Stores the bits used by ObjCMethodDecl.
1714
  /// If modified NumObjCMethodDeclBits and the accessor
1715
  /// methods in ObjCMethodDecl should be updated appropriately.
1716
  class ObjCMethodDeclBitfields {
1717
    friend class ObjCMethodDecl;
1718
 
1719
    /// For the bits in DeclContextBitfields.
1720
    uint64_t : NumDeclContextBits;
1721
 
1722
    /// The conventional meaning of this method; an ObjCMethodFamily.
1723
    /// This is not serialized; instead, it is computed on demand and
1724
    /// cached.
1725
    mutable uint64_t Family : ObjCMethodFamilyBitWidth;
1726
 
1727
    /// instance (true) or class (false) method.
1728
    uint64_t IsInstance : 1;
1729
    uint64_t IsVariadic : 1;
1730
 
1731
    /// True if this method is the getter or setter for an explicit property.
1732
    uint64_t IsPropertyAccessor : 1;
1733
 
1734
    /// True if this method is a synthesized property accessor stub.
1735
    uint64_t IsSynthesizedAccessorStub : 1;
1736
 
1737
    /// Method has a definition.
1738
    uint64_t IsDefined : 1;
1739
 
1740
    /// Method redeclaration in the same interface.
1741
    uint64_t IsRedeclaration : 1;
1742
 
1743
    /// Is redeclared in the same interface.
1744
    mutable uint64_t HasRedeclaration : 1;
1745
 
1746
    /// \@required/\@optional
1747
    uint64_t DeclImplementation : 2;
1748
 
1749
    /// in, inout, etc.
1750
    uint64_t objcDeclQualifier : 7;
1751
 
1752
    /// Indicates whether this method has a related result type.
1753
    uint64_t RelatedResultType : 1;
1754
 
1755
    /// Whether the locations of the selector identifiers are in a
1756
    /// "standard" position, a enum SelectorLocationsKind.
1757
    uint64_t SelLocsKind : 2;
1758
 
1759
    /// Whether this method overrides any other in the class hierarchy.
1760
    ///
1761
    /// A method is said to override any method in the class's
1762
    /// base classes, its protocols, or its categories' protocols, that has
1763
    /// the same selector and is of the same kind (class or instance).
1764
    /// A method in an implementation is not considered as overriding the same
1765
    /// method in the interface or its categories.
1766
    uint64_t IsOverriding : 1;
1767
 
1768
    /// Indicates if the method was a definition but its body was skipped.
1769
    uint64_t HasSkippedBody : 1;
1770
  };
1771
 
1772
  /// Number of non-inherited bits in ObjCMethodDeclBitfields.
1773
  enum { NumObjCMethodDeclBits = 24 };
1774
 
1775
  /// Stores the bits used by ObjCContainerDecl.
1776
  /// If modified NumObjCContainerDeclBits and the accessor
1777
  /// methods in ObjCContainerDecl should be updated appropriately.
1778
  class ObjCContainerDeclBitfields {
1779
    friend class ObjCContainerDecl;
1780
    /// For the bits in DeclContextBitfields
1781
    uint32_t : NumDeclContextBits;
1782
 
1783
    // Not a bitfield but this saves space.
1784
    // Note that ObjCContainerDeclBitfields is full.
1785
    SourceLocation AtStart;
1786
  };
1787
 
1788
  /// Number of non-inherited bits in ObjCContainerDeclBitfields.
1789
  /// Note that here we rely on the fact that SourceLocation is 32 bits
1790
  /// wide. We check this with the static_assert in the ctor of DeclContext.
1791
  enum { NumObjCContainerDeclBits = 64 - NumDeclContextBits };
1792
 
1793
  /// Stores the bits used by LinkageSpecDecl.
1794
  /// If modified NumLinkageSpecDeclBits and the accessor
1795
  /// methods in LinkageSpecDecl should be updated appropriately.
1796
  class LinkageSpecDeclBitfields {
1797
    friend class LinkageSpecDecl;
1798
    /// For the bits in DeclContextBitfields.
1799
    uint64_t : NumDeclContextBits;
1800
 
1801
    /// The language for this linkage specification with values
1802
    /// in the enum LinkageSpecDecl::LanguageIDs.
1803
    uint64_t Language : 3;
1804
 
1805
    /// True if this linkage spec has braces.
1806
    /// This is needed so that hasBraces() returns the correct result while the
1807
    /// linkage spec body is being parsed.  Once RBraceLoc has been set this is
1808
    /// not used, so it doesn't need to be serialized.
1809
    uint64_t HasBraces : 1;
1810
  };
1811
 
1812
  /// Number of non-inherited bits in LinkageSpecDeclBitfields.
1813
  enum { NumLinkageSpecDeclBits = 4 };
1814
 
1815
  /// Stores the bits used by BlockDecl.
1816
  /// If modified NumBlockDeclBits and the accessor
1817
  /// methods in BlockDecl should be updated appropriately.
1818
  class BlockDeclBitfields {
1819
    friend class BlockDecl;
1820
    /// For the bits in DeclContextBitfields.
1821
    uint64_t : NumDeclContextBits;
1822
 
1823
    uint64_t IsVariadic : 1;
1824
    uint64_t CapturesCXXThis : 1;
1825
    uint64_t BlockMissingReturnType : 1;
1826
    uint64_t IsConversionFromLambda : 1;
1827
 
1828
    /// A bit that indicates this block is passed directly to a function as a
1829
    /// non-escaping parameter.
1830
    uint64_t DoesNotEscape : 1;
1831
 
1832
    /// A bit that indicates whether it's possible to avoid coying this block to
1833
    /// the heap when it initializes or is assigned to a local variable with
1834
    /// automatic storage.
1835
    uint64_t CanAvoidCopyToHeap : 1;
1836
  };
1837
 
1838
  /// Number of non-inherited bits in BlockDeclBitfields.
1839
  enum { NumBlockDeclBits = 5 };
1840
 
1841
  /// Pointer to the data structure used to lookup declarations
1842
  /// within this context (or a DependentStoredDeclsMap if this is a
1843
  /// dependent context). We maintain the invariant that, if the map
1844
  /// contains an entry for a DeclarationName (and we haven't lazily
1845
  /// omitted anything), then it contains all relevant entries for that
1846
  /// name (modulo the hasExternalDecls() flag).
1847
  mutable StoredDeclsMap *LookupPtr = nullptr;
1848
 
1849
protected:
1850
  /// This anonymous union stores the bits belonging to DeclContext and classes
1851
  /// deriving from it. The goal is to use otherwise wasted
1852
  /// space in DeclContext to store data belonging to derived classes.
1853
  /// The space saved is especially significient when pointers are aligned
1854
  /// to 8 bytes. In this case due to alignment requirements we have a
1855
  /// little less than 8 bytes free in DeclContext which we can use.
1856
  /// We check that none of the classes in this union is larger than
1857
  /// 8 bytes with static_asserts in the ctor of DeclContext.
1858
  union {
1859
    DeclContextBitfields DeclContextBits;
1860
    TagDeclBitfields TagDeclBits;
1861
    EnumDeclBitfields EnumDeclBits;
1862
    RecordDeclBitfields RecordDeclBits;
1863
    OMPDeclareReductionDeclBitfields OMPDeclareReductionDeclBits;
1864
    FunctionDeclBitfields FunctionDeclBits;
1865
    CXXConstructorDeclBitfields CXXConstructorDeclBits;
1866
    ObjCMethodDeclBitfields ObjCMethodDeclBits;
1867
    ObjCContainerDeclBitfields ObjCContainerDeclBits;
1868
    LinkageSpecDeclBitfields LinkageSpecDeclBits;
1869
    BlockDeclBitfields BlockDeclBits;
1870
 
1871
    static_assert(sizeof(DeclContextBitfields) <= 8,
1872
                  "DeclContextBitfields is larger than 8 bytes!");
1873
    static_assert(sizeof(TagDeclBitfields) <= 8,
1874
                  "TagDeclBitfields is larger than 8 bytes!");
1875
    static_assert(sizeof(EnumDeclBitfields) <= 8,
1876
                  "EnumDeclBitfields is larger than 8 bytes!");
1877
    static_assert(sizeof(RecordDeclBitfields) <= 8,
1878
                  "RecordDeclBitfields is larger than 8 bytes!");
1879
    static_assert(sizeof(OMPDeclareReductionDeclBitfields) <= 8,
1880
                  "OMPDeclareReductionDeclBitfields is larger than 8 bytes!");
1881
    static_assert(sizeof(FunctionDeclBitfields) <= 8,
1882
                  "FunctionDeclBitfields is larger than 8 bytes!");
1883
    static_assert(sizeof(CXXConstructorDeclBitfields) <= 8,
1884
                  "CXXConstructorDeclBitfields is larger than 8 bytes!");
1885
    static_assert(sizeof(ObjCMethodDeclBitfields) <= 8,
1886
                  "ObjCMethodDeclBitfields is larger than 8 bytes!");
1887
    static_assert(sizeof(ObjCContainerDeclBitfields) <= 8,
1888
                  "ObjCContainerDeclBitfields is larger than 8 bytes!");
1889
    static_assert(sizeof(LinkageSpecDeclBitfields) <= 8,
1890
                  "LinkageSpecDeclBitfields is larger than 8 bytes!");
1891
    static_assert(sizeof(BlockDeclBitfields) <= 8,
1892
                  "BlockDeclBitfields is larger than 8 bytes!");
1893
  };
1894
 
1895
  /// FirstDecl - The first declaration stored within this declaration
1896
  /// context.
1897
  mutable Decl *FirstDecl = nullptr;
1898
 
1899
  /// LastDecl - The last declaration stored within this declaration
1900
  /// context. FIXME: We could probably cache this value somewhere
1901
  /// outside of the DeclContext, to reduce the size of DeclContext by
1902
  /// another pointer.
1903
  mutable Decl *LastDecl = nullptr;
1904
 
1905
  /// Build up a chain of declarations.
1906
  ///
1907
  /// \returns the first/last pair of declarations.
1908
  static std::pair<Decl *, Decl *>
1909
  BuildDeclChain(ArrayRef<Decl*> Decls, bool FieldsAlreadyLoaded);
1910
 
1911
  DeclContext(Decl::Kind K);
1912
 
1913
public:
1914
  ~DeclContext();
1915
 
1916
  // For use when debugging; hasValidDeclKind() will always return true for
1917
  // a correctly constructed object within its lifetime.
1918
  bool hasValidDeclKind() const;
1919
 
1920
  Decl::Kind getDeclKind() const {
1921
    return static_cast<Decl::Kind>(DeclContextBits.DeclKind);
1922
  }
1923
 
1924
  const char *getDeclKindName() const;
1925
 
1926
  /// getParent - Returns the containing DeclContext.
1927
  DeclContext *getParent() {
1928
    return cast<Decl>(this)->getDeclContext();
1929
  }
1930
  const DeclContext *getParent() const {
1931
    return const_cast<DeclContext*>(this)->getParent();
1932
  }
1933
 
1934
  /// getLexicalParent - Returns the containing lexical DeclContext. May be
1935
  /// different from getParent, e.g.:
1936
  ///
1937
  ///   namespace A {
1938
  ///      struct S;
1939
  ///   }
1940
  ///   struct A::S {}; // getParent() == namespace 'A'
1941
  ///                   // getLexicalParent() == translation unit
1942
  ///
1943
  DeclContext *getLexicalParent() {
1944
    return cast<Decl>(this)->getLexicalDeclContext();
1945
  }
1946
  const DeclContext *getLexicalParent() const {
1947
    return const_cast<DeclContext*>(this)->getLexicalParent();
1948
  }
1949
 
1950
  DeclContext *getLookupParent();
1951
 
1952
  const DeclContext *getLookupParent() const {
1953
    return const_cast<DeclContext*>(this)->getLookupParent();
1954
  }
1955
 
1956
  ASTContext &getParentASTContext() const {
1957
    return cast<Decl>(this)->getASTContext();
1958
  }
1959
 
1960
  bool isClosure() const { return getDeclKind() == Decl::Block; }
1961
 
1962
  /// Return this DeclContext if it is a BlockDecl. Otherwise, return the
1963
  /// innermost enclosing BlockDecl or null if there are no enclosing blocks.
1964
  const BlockDecl *getInnermostBlockDecl() const;
1965
 
1966
  bool isObjCContainer() const {
1967
    switch (getDeclKind()) {
1968
    case Decl::ObjCCategory:
1969
    case Decl::ObjCCategoryImpl:
1970
    case Decl::ObjCImplementation:
1971
    case Decl::ObjCInterface:
1972
    case Decl::ObjCProtocol:
1973
      return true;
1974
    default:
1975
      return false;
1976
    }
1977
  }
1978
 
1979
  bool isFunctionOrMethod() const {
1980
    switch (getDeclKind()) {
1981
    case Decl::Block:
1982
    case Decl::Captured:
1983
    case Decl::ObjCMethod:
1984
      return true;
1985
    default:
1986
      return getDeclKind() >= Decl::firstFunction &&
1987
             getDeclKind() <= Decl::lastFunction;
1988
    }
1989
  }
1990
 
1991
  /// Test whether the context supports looking up names.
1992
  bool isLookupContext() const {
1993
    return !isFunctionOrMethod() && getDeclKind() != Decl::LinkageSpec &&
1994
           getDeclKind() != Decl::Export;
1995
  }
1996
 
1997
  bool isFileContext() const {
1998
    return getDeclKind() == Decl::TranslationUnit ||
1999
           getDeclKind() == Decl::Namespace;
2000
  }
2001
 
2002
  bool isTranslationUnit() const {
2003
    return getDeclKind() == Decl::TranslationUnit;
2004
  }
2005
 
2006
  bool isRecord() const {
2007
    return getDeclKind() >= Decl::firstRecord &&
2008
           getDeclKind() <= Decl::lastRecord;
2009
  }
2010
 
2011
  bool isNamespace() const { return getDeclKind() == Decl::Namespace; }
2012
 
2013
  bool isStdNamespace() const;
2014
 
2015
  bool isInlineNamespace() const;
2016
 
2017
  /// Determines whether this context is dependent on a
2018
  /// template parameter.
2019
  bool isDependentContext() const;
2020
 
2021
  /// isTransparentContext - Determines whether this context is a
2022
  /// "transparent" context, meaning that the members declared in this
2023
  /// context are semantically declared in the nearest enclosing
2024
  /// non-transparent (opaque) context but are lexically declared in
2025
  /// this context. For example, consider the enumerators of an
2026
  /// enumeration type:
2027
  /// @code
2028
  /// enum E {
2029
  ///   Val1
2030
  /// };
2031
  /// @endcode
2032
  /// Here, E is a transparent context, so its enumerator (Val1) will
2033
  /// appear (semantically) that it is in the same context of E.
2034
  /// Examples of transparent contexts include: enumerations (except for
2035
  /// C++0x scoped enums), C++ linkage specifications and export declaration.
2036
  bool isTransparentContext() const;
2037
 
2038
  /// Determines whether this context or some of its ancestors is a
2039
  /// linkage specification context that specifies C linkage.
2040
  bool isExternCContext() const;
2041
 
2042
  /// Retrieve the nearest enclosing C linkage specification context.
2043
  const LinkageSpecDecl *getExternCContext() const;
2044
 
2045
  /// Determines whether this context or some of its ancestors is a
2046
  /// linkage specification context that specifies C++ linkage.
2047
  bool isExternCXXContext() const;
2048
 
2049
  /// Determine whether this declaration context is equivalent
2050
  /// to the declaration context DC.
2051
  bool Equals(const DeclContext *DC) const {
2052
    return DC && this->getPrimaryContext() == DC->getPrimaryContext();
2053
  }
2054
 
2055
  /// Determine whether this declaration context encloses the
2056
  /// declaration context DC.
2057
  bool Encloses(const DeclContext *DC) const;
2058
 
2059
  /// Find the nearest non-closure ancestor of this context,
2060
  /// i.e. the innermost semantic parent of this context which is not
2061
  /// a closure.  A context may be its own non-closure ancestor.
2062
  Decl *getNonClosureAncestor();
2063
  const Decl *getNonClosureAncestor() const {
2064
    return const_cast<DeclContext*>(this)->getNonClosureAncestor();
2065
  }
2066
 
2067
  // Retrieve the nearest context that is not a transparent context.
2068
  DeclContext *getNonTransparentContext();
2069
  const DeclContext *getNonTransparentContext() const {
2070
    return const_cast<DeclContext *>(this)->getNonTransparentContext();
2071
  }
2072
 
2073
  /// getPrimaryContext - There may be many different
2074
  /// declarations of the same entity (including forward declarations
2075
  /// of classes, multiple definitions of namespaces, etc.), each with
2076
  /// a different set of declarations. This routine returns the
2077
  /// "primary" DeclContext structure, which will contain the
2078
  /// information needed to perform name lookup into this context.
2079
  DeclContext *getPrimaryContext();
2080
  const DeclContext *getPrimaryContext() const {
2081
    return const_cast<DeclContext*>(this)->getPrimaryContext();
2082
  }
2083
 
2084
  /// getRedeclContext - Retrieve the context in which an entity conflicts with
2085
  /// other entities of the same name, or where it is a redeclaration if the
2086
  /// two entities are compatible. This skips through transparent contexts.
2087
  DeclContext *getRedeclContext();
2088
  const DeclContext *getRedeclContext() const {
2089
    return const_cast<DeclContext *>(this)->getRedeclContext();
2090
  }
2091
 
2092
  /// Retrieve the nearest enclosing namespace context.
2093
  DeclContext *getEnclosingNamespaceContext();
2094
  const DeclContext *getEnclosingNamespaceContext() const {
2095
    return const_cast<DeclContext *>(this)->getEnclosingNamespaceContext();
2096
  }
2097
 
2098
  /// Retrieve the outermost lexically enclosing record context.
2099
  RecordDecl *getOuterLexicalRecordContext();
2100
  const RecordDecl *getOuterLexicalRecordContext() const {
2101
    return const_cast<DeclContext *>(this)->getOuterLexicalRecordContext();
2102
  }
2103
 
2104
  /// Test if this context is part of the enclosing namespace set of
2105
  /// the context NS, as defined in C++0x [namespace.def]p9. If either context
2106
  /// isn't a namespace, this is equivalent to Equals().
2107
  ///
2108
  /// The enclosing namespace set of a namespace is the namespace and, if it is
2109
  /// inline, its enclosing namespace, recursively.
2110
  bool InEnclosingNamespaceSetOf(const DeclContext *NS) const;
2111
 
2112
  /// Collects all of the declaration contexts that are semantically
2113
  /// connected to this declaration context.
2114
  ///
2115
  /// For declaration contexts that have multiple semantically connected but
2116
  /// syntactically distinct contexts, such as C++ namespaces, this routine
2117
  /// retrieves the complete set of such declaration contexts in source order.
2118
  /// For example, given:
2119
  ///
2120
  /// \code
2121
  /// namespace N {
2122
  ///   int x;
2123
  /// }
2124
  /// namespace N {
2125
  ///   int y;
2126
  /// }
2127
  /// \endcode
2128
  ///
2129
  /// The \c Contexts parameter will contain both definitions of N.
2130
  ///
2131
  /// \param Contexts Will be cleared and set to the set of declaration
2132
  /// contexts that are semanticaly connected to this declaration context,
2133
  /// in source order, including this context (which may be the only result,
2134
  /// for non-namespace contexts).
2135
  void collectAllContexts(SmallVectorImpl<DeclContext *> &Contexts);
2136
 
2137
  /// decl_iterator - Iterates through the declarations stored
2138
  /// within this context.
2139
  class decl_iterator {
2140
    /// Current - The current declaration.
2141
    Decl *Current = nullptr;
2142
 
2143
  public:
2144
    using value_type = Decl *;
2145
    using reference = const value_type &;
2146
    using pointer = const value_type *;
2147
    using iterator_category = std::forward_iterator_tag;
2148
    using difference_type = std::ptrdiff_t;
2149
 
2150
    decl_iterator() = default;
2151
    explicit decl_iterator(Decl *C) : Current(C) {}
2152
 
2153
    reference operator*() const { return Current; }
2154
 
2155
    // This doesn't meet the iterator requirements, but it's convenient
2156
    value_type operator->() const { return Current; }
2157
 
2158
    decl_iterator& operator++() {
2159
      Current = Current->getNextDeclInContext();
2160
      return *this;
2161
    }
2162
 
2163
    decl_iterator operator++(int) {
2164
      decl_iterator tmp(*this);
2165
      ++(*this);
2166
      return tmp;
2167
    }
2168
 
2169
    friend bool operator==(decl_iterator x, decl_iterator y) {
2170
      return x.Current == y.Current;
2171
    }
2172
 
2173
    friend bool operator!=(decl_iterator x, decl_iterator y) {
2174
      return x.Current != y.Current;
2175
    }
2176
  };
2177
 
2178
  using decl_range = llvm::iterator_range<decl_iterator>;
2179
 
2180
  /// decls_begin/decls_end - Iterate over the declarations stored in
2181
  /// this context.
2182
  decl_range decls() const { return decl_range(decls_begin(), decls_end()); }
2183
  decl_iterator decls_begin() const;
2184
  decl_iterator decls_end() const { return decl_iterator(); }
2185
  bool decls_empty() const;
2186
 
2187
  /// noload_decls_begin/end - Iterate over the declarations stored in this
2188
  /// context that are currently loaded; don't attempt to retrieve anything
2189
  /// from an external source.
2190
  decl_range noload_decls() const {
2191
    return decl_range(noload_decls_begin(), noload_decls_end());
2192
  }
2193
  decl_iterator noload_decls_begin() const { return decl_iterator(FirstDecl); }
2194
  decl_iterator noload_decls_end() const { return decl_iterator(); }
2195
 
2196
  /// specific_decl_iterator - Iterates over a subrange of
2197
  /// declarations stored in a DeclContext, providing only those that
2198
  /// are of type SpecificDecl (or a class derived from it). This
2199
  /// iterator is used, for example, to provide iteration over just
2200
  /// the fields within a RecordDecl (with SpecificDecl = FieldDecl).
2201
  template<typename SpecificDecl>
2202
  class specific_decl_iterator {
2203
    /// Current - The current, underlying declaration iterator, which
2204
    /// will either be NULL or will point to a declaration of
2205
    /// type SpecificDecl.
2206
    DeclContext::decl_iterator Current;
2207
 
2208
    /// SkipToNextDecl - Advances the current position up to the next
2209
    /// declaration of type SpecificDecl that also meets the criteria
2210
    /// required by Acceptable.
2211
    void SkipToNextDecl() {
2212
      while (*Current && !isa<SpecificDecl>(*Current))
2213
        ++Current;
2214
    }
2215
 
2216
  public:
2217
    using value_type = SpecificDecl *;
2218
    // TODO: Add reference and pointer types (with some appropriate proxy type)
2219
    // if we ever have a need for them.
2220
    using reference = void;
2221
    using pointer = void;
2222
    using difference_type =
2223
        std::iterator_traits<DeclContext::decl_iterator>::difference_type;
2224
    using iterator_category = std::forward_iterator_tag;
2225
 
2226
    specific_decl_iterator() = default;
2227
 
2228
    /// specific_decl_iterator - Construct a new iterator over a
2229
    /// subset of the declarations the range [C,
2230
    /// end-of-declarations). If A is non-NULL, it is a pointer to a
2231
    /// member function of SpecificDecl that should return true for
2232
    /// all of the SpecificDecl instances that will be in the subset
2233
    /// of iterators. For example, if you want Objective-C instance
2234
    /// methods, SpecificDecl will be ObjCMethodDecl and A will be
2235
    /// &ObjCMethodDecl::isInstanceMethod.
2236
    explicit specific_decl_iterator(DeclContext::decl_iterator C) : Current(C) {
2237
      SkipToNextDecl();
2238
    }
2239
 
2240
    value_type operator*() const { return cast<SpecificDecl>(*Current); }
2241
 
2242
    // This doesn't meet the iterator requirements, but it's convenient
2243
    value_type operator->() const { return **this; }
2244
 
2245
    specific_decl_iterator& operator++() {
2246
      ++Current;
2247
      SkipToNextDecl();
2248
      return *this;
2249
    }
2250
 
2251
    specific_decl_iterator operator++(int) {
2252
      specific_decl_iterator tmp(*this);
2253
      ++(*this);
2254
      return tmp;
2255
    }
2256
 
2257
    friend bool operator==(const specific_decl_iterator& x,
2258
                           const specific_decl_iterator& y) {
2259
      return x.Current == y.Current;
2260
    }
2261
 
2262
    friend bool operator!=(const specific_decl_iterator& x,
2263
                           const specific_decl_iterator& y) {
2264
      return x.Current != y.Current;
2265
    }
2266
  };
2267
 
2268
  /// Iterates over a filtered subrange of declarations stored
2269
  /// in a DeclContext.
2270
  ///
2271
  /// This iterator visits only those declarations that are of type
2272
  /// SpecificDecl (or a class derived from it) and that meet some
2273
  /// additional run-time criteria. This iterator is used, for
2274
  /// example, to provide access to the instance methods within an
2275
  /// Objective-C interface (with SpecificDecl = ObjCMethodDecl and
2276
  /// Acceptable = ObjCMethodDecl::isInstanceMethod).
2277
  template<typename SpecificDecl, bool (SpecificDecl::*Acceptable)() const>
2278
  class filtered_decl_iterator {
2279
    /// Current - The current, underlying declaration iterator, which
2280
    /// will either be NULL or will point to a declaration of
2281
    /// type SpecificDecl.
2282
    DeclContext::decl_iterator Current;
2283
 
2284
    /// SkipToNextDecl - Advances the current position up to the next
2285
    /// declaration of type SpecificDecl that also meets the criteria
2286
    /// required by Acceptable.
2287
    void SkipToNextDecl() {
2288
      while (*Current &&
2289
             (!isa<SpecificDecl>(*Current) ||
2290
              (Acceptable && !(cast<SpecificDecl>(*Current)->*Acceptable)())))
2291
        ++Current;
2292
    }
2293
 
2294
  public:
2295
    using value_type = SpecificDecl *;
2296
    // TODO: Add reference and pointer types (with some appropriate proxy type)
2297
    // if we ever have a need for them.
2298
    using reference = void;
2299
    using pointer = void;
2300
    using difference_type =
2301
        std::iterator_traits<DeclContext::decl_iterator>::difference_type;
2302
    using iterator_category = std::forward_iterator_tag;
2303
 
2304
    filtered_decl_iterator() = default;
2305
 
2306
    /// filtered_decl_iterator - Construct a new iterator over a
2307
    /// subset of the declarations the range [C,
2308
    /// end-of-declarations). If A is non-NULL, it is a pointer to a
2309
    /// member function of SpecificDecl that should return true for
2310
    /// all of the SpecificDecl instances that will be in the subset
2311
    /// of iterators. For example, if you want Objective-C instance
2312
    /// methods, SpecificDecl will be ObjCMethodDecl and A will be
2313
    /// &ObjCMethodDecl::isInstanceMethod.
2314
    explicit filtered_decl_iterator(DeclContext::decl_iterator C) : Current(C) {
2315
      SkipToNextDecl();
2316
    }
2317
 
2318
    value_type operator*() const { return cast<SpecificDecl>(*Current); }
2319
    value_type operator->() const { return cast<SpecificDecl>(*Current); }
2320
 
2321
    filtered_decl_iterator& operator++() {
2322
      ++Current;
2323
      SkipToNextDecl();
2324
      return *this;
2325
    }
2326
 
2327
    filtered_decl_iterator operator++(int) {
2328
      filtered_decl_iterator tmp(*this);
2329
      ++(*this);
2330
      return tmp;
2331
    }
2332
 
2333
    friend bool operator==(const filtered_decl_iterator& x,
2334
                           const filtered_decl_iterator& y) {
2335
      return x.Current == y.Current;
2336
    }
2337
 
2338
    friend bool operator!=(const filtered_decl_iterator& x,
2339
                           const filtered_decl_iterator& y) {
2340
      return x.Current != y.Current;
2341
    }
2342
  };
2343
 
2344
  /// Add the declaration D into this context.
2345
  ///
2346
  /// This routine should be invoked when the declaration D has first
2347
  /// been declared, to place D into the context where it was
2348
  /// (lexically) defined. Every declaration must be added to one
2349
  /// (and only one!) context, where it can be visited via
2350
  /// [decls_begin(), decls_end()). Once a declaration has been added
2351
  /// to its lexical context, the corresponding DeclContext owns the
2352
  /// declaration.
2353
  ///
2354
  /// If D is also a NamedDecl, it will be made visible within its
2355
  /// semantic context via makeDeclVisibleInContext.
2356
  void addDecl(Decl *D);
2357
 
2358
  /// Add the declaration D into this context, but suppress
2359
  /// searches for external declarations with the same name.
2360
  ///
2361
  /// Although analogous in function to addDecl, this removes an
2362
  /// important check.  This is only useful if the Decl is being
2363
  /// added in response to an external search; in all other cases,
2364
  /// addDecl() is the right function to use.
2365
  /// See the ASTImporter for use cases.
2366
  void addDeclInternal(Decl *D);
2367
 
2368
  /// Add the declaration D to this context without modifying
2369
  /// any lookup tables.
2370
  ///
2371
  /// This is useful for some operations in dependent contexts where
2372
  /// the semantic context might not be dependent;  this basically
2373
  /// only happens with friends.
2374
  void addHiddenDecl(Decl *D);
2375
 
2376
  /// Removes a declaration from this context.
2377
  void removeDecl(Decl *D);
2378
 
2379
  /// Checks whether a declaration is in this context.
2380
  bool containsDecl(Decl *D) const;
2381
 
2382
  /// Checks whether a declaration is in this context.
2383
  /// This also loads the Decls from the external source before the check.
2384
  bool containsDeclAndLoad(Decl *D) const;
2385
 
2386
  using lookup_result = DeclContextLookupResult;
2387
  using lookup_iterator = lookup_result::iterator;
2388
 
2389
  /// lookup - Find the declarations (if any) with the given Name in
2390
  /// this context. Returns a range of iterators that contains all of
2391
  /// the declarations with this name, with object, function, member,
2392
  /// and enumerator names preceding any tag name. Note that this
2393
  /// routine will not look into parent contexts.
2394
  lookup_result lookup(DeclarationName Name) const;
2395
 
2396
  /// Find the declarations with the given name that are visible
2397
  /// within this context; don't attempt to retrieve anything from an
2398
  /// external source.
2399
  lookup_result noload_lookup(DeclarationName Name);
2400
 
2401
  /// A simplistic name lookup mechanism that performs name lookup
2402
  /// into this declaration context without consulting the external source.
2403
  ///
2404
  /// This function should almost never be used, because it subverts the
2405
  /// usual relationship between a DeclContext and the external source.
2406
  /// See the ASTImporter for the (few, but important) use cases.
2407
  ///
2408
  /// FIXME: This is very inefficient; replace uses of it with uses of
2409
  /// noload_lookup.
2410
  void localUncachedLookup(DeclarationName Name,
2411
                           SmallVectorImpl<NamedDecl *> &Results);
2412
 
2413
  /// Makes a declaration visible within this context.
2414
  ///
2415
  /// This routine makes the declaration D visible to name lookup
2416
  /// within this context and, if this is a transparent context,
2417
  /// within its parent contexts up to the first enclosing
2418
  /// non-transparent context. Making a declaration visible within a
2419
  /// context does not transfer ownership of a declaration, and a
2420
  /// declaration can be visible in many contexts that aren't its
2421
  /// lexical context.
2422
  ///
2423
  /// If D is a redeclaration of an existing declaration that is
2424
  /// visible from this context, as determined by
2425
  /// NamedDecl::declarationReplaces, the previous declaration will be
2426
  /// replaced with D.
2427
  void makeDeclVisibleInContext(NamedDecl *D);
2428
 
2429
  /// all_lookups_iterator - An iterator that provides a view over the results
2430
  /// of looking up every possible name.
2431
  class all_lookups_iterator;
2432
 
2433
  using lookups_range = llvm::iterator_range<all_lookups_iterator>;
2434
 
2435
  lookups_range lookups() const;
2436
  // Like lookups(), but avoids loading external declarations.
2437
  // If PreserveInternalState, avoids building lookup data structures too.
2438
  lookups_range noload_lookups(bool PreserveInternalState) const;
2439
 
2440
  /// Iterators over all possible lookups within this context.
2441
  all_lookups_iterator lookups_begin() const;
2442
  all_lookups_iterator lookups_end() const;
2443
 
2444
  /// Iterators over all possible lookups within this context that are
2445
  /// currently loaded; don't attempt to retrieve anything from an external
2446
  /// source.
2447
  all_lookups_iterator noload_lookups_begin() const;
2448
  all_lookups_iterator noload_lookups_end() const;
2449
 
2450
  struct udir_iterator;
2451
 
2452
  using udir_iterator_base =
2453
      llvm::iterator_adaptor_base<udir_iterator, lookup_iterator,
2454
                                  typename lookup_iterator::iterator_category,
2455
                                  UsingDirectiveDecl *>;
2456
 
2457
  struct udir_iterator : udir_iterator_base {
2458
    udir_iterator(lookup_iterator I) : udir_iterator_base(I) {}
2459
 
2460
    UsingDirectiveDecl *operator*() const;
2461
  };
2462
 
2463
  using udir_range = llvm::iterator_range<udir_iterator>;
2464
 
2465
  udir_range using_directives() const;
2466
 
2467
  // These are all defined in DependentDiagnostic.h.
2468
  class ddiag_iterator;
2469
 
2470
  using ddiag_range = llvm::iterator_range<DeclContext::ddiag_iterator>;
2471
 
2472
  inline ddiag_range ddiags() const;
2473
 
2474
  // Low-level accessors
2475
 
2476
  /// Mark that there are external lexical declarations that we need
2477
  /// to include in our lookup table (and that are not available as external
2478
  /// visible lookups). These extra lookup results will be found by walking
2479
  /// the lexical declarations of this context. This should be used only if
2480
  /// setHasExternalLexicalStorage() has been called on any decl context for
2481
  /// which this is the primary context.
2482
  void setMustBuildLookupTable() {
2483
    assert(this == getPrimaryContext() &&
2484
           "should only be called on primary context");
2485
    DeclContextBits.HasLazyExternalLexicalLookups = true;
2486
  }
2487
 
2488
  /// Retrieve the internal representation of the lookup structure.
2489
  /// This may omit some names if we are lazily building the structure.
2490
  StoredDeclsMap *getLookupPtr() const { return LookupPtr; }
2491
 
2492
  /// Ensure the lookup structure is fully-built and return it.
2493
  StoredDeclsMap *buildLookup();
2494
 
2495
  /// Whether this DeclContext has external storage containing
2496
  /// additional declarations that are lexically in this context.
2497
  bool hasExternalLexicalStorage() const {
2498
    return DeclContextBits.ExternalLexicalStorage;
2499
  }
2500
 
2501
  /// State whether this DeclContext has external storage for
2502
  /// declarations lexically in this context.
2503
  void setHasExternalLexicalStorage(bool ES = true) const {
2504
    DeclContextBits.ExternalLexicalStorage = ES;
2505
  }
2506
 
2507
  /// Whether this DeclContext has external storage containing
2508
  /// additional declarations that are visible in this context.
2509
  bool hasExternalVisibleStorage() const {
2510
    return DeclContextBits.ExternalVisibleStorage;
2511
  }
2512
 
2513
  /// State whether this DeclContext has external storage for
2514
  /// declarations visible in this context.
2515
  void setHasExternalVisibleStorage(bool ES = true) const {
2516
    DeclContextBits.ExternalVisibleStorage = ES;
2517
    if (ES && LookupPtr)
2518
      DeclContextBits.NeedToReconcileExternalVisibleStorage = true;
2519
  }
2520
 
2521
  /// Determine whether the given declaration is stored in the list of
2522
  /// declarations lexically within this context.
2523
  bool isDeclInLexicalTraversal(const Decl *D) const {
2524
    return D && (D->NextInContextAndBits.getPointer() || D == FirstDecl ||
2525
                 D == LastDecl);
2526
  }
2527
 
2528
  bool setUseQualifiedLookup(bool use = true) const {
2529
    bool old_value = DeclContextBits.UseQualifiedLookup;
2530
    DeclContextBits.UseQualifiedLookup = use;
2531
    return old_value;
2532
  }
2533
 
2534
  bool shouldUseQualifiedLookup() const {
2535
    return DeclContextBits.UseQualifiedLookup;
2536
  }
2537
 
2538
  static bool classof(const Decl *D);
2539
  static bool classof(const DeclContext *D) { return true; }
2540
 
2541
  void dumpAsDecl() const;
2542
  void dumpAsDecl(const ASTContext *Ctx) const;
2543
  void dumpDeclContext() const;
2544
  void dumpLookups() const;
2545
  void dumpLookups(llvm::raw_ostream &OS, bool DumpDecls = false,
2546
                   bool Deserialize = false) const;
2547
 
2548
private:
2549
  /// Whether this declaration context has had externally visible
2550
  /// storage added since the last lookup. In this case, \c LookupPtr's
2551
  /// invariant may not hold and needs to be fixed before we perform
2552
  /// another lookup.
2553
  bool hasNeedToReconcileExternalVisibleStorage() const {
2554
    return DeclContextBits.NeedToReconcileExternalVisibleStorage;
2555
  }
2556
 
2557
  /// State that this declaration context has had externally visible
2558
  /// storage added since the last lookup. In this case, \c LookupPtr's
2559
  /// invariant may not hold and needs to be fixed before we perform
2560
  /// another lookup.
2561
  void setNeedToReconcileExternalVisibleStorage(bool Need = true) const {
2562
    DeclContextBits.NeedToReconcileExternalVisibleStorage = Need;
2563
  }
2564
 
2565
  /// If \c true, this context may have local lexical declarations
2566
  /// that are missing from the lookup table.
2567
  bool hasLazyLocalLexicalLookups() const {
2568
    return DeclContextBits.HasLazyLocalLexicalLookups;
2569
  }
2570
 
2571
  /// If \c true, this context may have local lexical declarations
2572
  /// that are missing from the lookup table.
2573
  void setHasLazyLocalLexicalLookups(bool HasLLLL = true) const {
2574
    DeclContextBits.HasLazyLocalLexicalLookups = HasLLLL;
2575
  }
2576
 
2577
  /// If \c true, the external source may have lexical declarations
2578
  /// that are missing from the lookup table.
2579
  bool hasLazyExternalLexicalLookups() const {
2580
    return DeclContextBits.HasLazyExternalLexicalLookups;
2581
  }
2582
 
2583
  /// If \c true, the external source may have lexical declarations
2584
  /// that are missing from the lookup table.
2585
  void setHasLazyExternalLexicalLookups(bool HasLELL = true) const {
2586
    DeclContextBits.HasLazyExternalLexicalLookups = HasLELL;
2587
  }
2588
 
2589
  void reconcileExternalVisibleStorage() const;
2590
  bool LoadLexicalDeclsFromExternalStorage() const;
2591
 
2592
  /// Makes a declaration visible within this context, but
2593
  /// suppresses searches for external declarations with the same
2594
  /// name.
2595
  ///
2596
  /// Analogous to makeDeclVisibleInContext, but for the exclusive
2597
  /// use of addDeclInternal().
2598
  void makeDeclVisibleInContextInternal(NamedDecl *D);
2599
 
2600
  StoredDeclsMap *CreateStoredDeclsMap(ASTContext &C) const;
2601
 
2602
  void loadLazyLocalLexicalLookups();
2603
  void buildLookupImpl(DeclContext *DCtx, bool Internal);
2604
  void makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal,
2605
                                         bool Rediscoverable);
2606
  void makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal);
2607
};
2608
 
2609
inline bool Decl::isTemplateParameter() const {
2610
  return getKind() == TemplateTypeParm || getKind() == NonTypeTemplateParm ||
2611
         getKind() == TemplateTemplateParm;
2612
}
2613
 
2614
// Specialization selected when ToTy is not a known subclass of DeclContext.
2615
template <class ToTy,
2616
          bool IsKnownSubtype = ::std::is_base_of<DeclContext, ToTy>::value>
2617
struct cast_convert_decl_context {
2618
  static const ToTy *doit(const DeclContext *Val) {
2619
    return static_cast<const ToTy*>(Decl::castFromDeclContext(Val));
2620
  }
2621
 
2622
  static ToTy *doit(DeclContext *Val) {
2623
    return static_cast<ToTy*>(Decl::castFromDeclContext(Val));
2624
  }
2625
};
2626
 
2627
// Specialization selected when ToTy is a known subclass of DeclContext.
2628
template <class ToTy>
2629
struct cast_convert_decl_context<ToTy, true> {
2630
  static const ToTy *doit(const DeclContext *Val) {
2631
    return static_cast<const ToTy*>(Val);
2632
  }
2633
 
2634
  static ToTy *doit(DeclContext *Val) {
2635
    return static_cast<ToTy*>(Val);
2636
  }
2637
};
2638
 
2639
} // namespace clang
2640
 
2641
namespace llvm {
2642
 
2643
/// isa<T>(DeclContext*)
2644
template <typename To>
2645
struct isa_impl<To, ::clang::DeclContext> {
2646
  static bool doit(const ::clang::DeclContext &Val) {
2647
    return To::classofKind(Val.getDeclKind());
2648
  }
2649
};
2650
 
2651
/// cast<T>(DeclContext*)
2652
template<class ToTy>
2653
struct cast_convert_val<ToTy,
2654
                        const ::clang::DeclContext,const ::clang::DeclContext> {
2655
  static const ToTy &doit(const ::clang::DeclContext &Val) {
2656
    return *::clang::cast_convert_decl_context<ToTy>::doit(&Val);
2657
  }
2658
};
2659
 
2660
template<class ToTy>
2661
struct cast_convert_val<ToTy, ::clang::DeclContext, ::clang::DeclContext> {
2662
  static ToTy &doit(::clang::DeclContext &Val) {
2663
    return *::clang::cast_convert_decl_context<ToTy>::doit(&Val);
2664
  }
2665
};
2666
 
2667
template<class ToTy>
2668
struct cast_convert_val<ToTy,
2669
                     const ::clang::DeclContext*, const ::clang::DeclContext*> {
2670
  static const ToTy *doit(const ::clang::DeclContext *Val) {
2671
    return ::clang::cast_convert_decl_context<ToTy>::doit(Val);
2672
  }
2673
};
2674
 
2675
template<class ToTy>
2676
struct cast_convert_val<ToTy, ::clang::DeclContext*, ::clang::DeclContext*> {
2677
  static ToTy *doit(::clang::DeclContext *Val) {
2678
    return ::clang::cast_convert_decl_context<ToTy>::doit(Val);
2679
  }
2680
};
2681
 
2682
/// Implement cast_convert_val for Decl -> DeclContext conversions.
2683
template<class FromTy>
2684
struct cast_convert_val< ::clang::DeclContext, FromTy, FromTy> {
2685
  static ::clang::DeclContext &doit(const FromTy &Val) {
2686
    return *FromTy::castToDeclContext(&Val);
2687
  }
2688
};
2689
 
2690
template<class FromTy>
2691
struct cast_convert_val< ::clang::DeclContext, FromTy*, FromTy*> {
2692
  static ::clang::DeclContext *doit(const FromTy *Val) {
2693
    return FromTy::castToDeclContext(Val);
2694
  }
2695
};
2696
 
2697
template<class FromTy>
2698
struct cast_convert_val< const ::clang::DeclContext, FromTy, FromTy> {
2699
  static const ::clang::DeclContext &doit(const FromTy &Val) {
2700
    return *FromTy::castToDeclContext(&Val);
2701
  }
2702
};
2703
 
2704
template<class FromTy>
2705
struct cast_convert_val< const ::clang::DeclContext, FromTy*, FromTy*> {
2706
  static const ::clang::DeclContext *doit(const FromTy *Val) {
2707
    return FromTy::castToDeclContext(Val);
2708
  }
2709
};
2710
 
2711
} // namespace llvm
2712
 
2713
#endif // LLVM_CLANG_AST_DECLBASE_H