Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/AST/DeclBase.cpp
35260 views
1
//===- DeclBase.cpp - Declaration AST Node Implementation -----------------===//
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 implements the Decl and DeclContext classes.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "clang/AST/DeclBase.h"
14
#include "clang/AST/ASTContext.h"
15
#include "clang/AST/ASTLambda.h"
16
#include "clang/AST/ASTMutationListener.h"
17
#include "clang/AST/Attr.h"
18
#include "clang/AST/AttrIterator.h"
19
#include "clang/AST/Decl.h"
20
#include "clang/AST/DeclCXX.h"
21
#include "clang/AST/DeclContextInternals.h"
22
#include "clang/AST/DeclFriend.h"
23
#include "clang/AST/DeclObjC.h"
24
#include "clang/AST/DeclOpenMP.h"
25
#include "clang/AST/DeclTemplate.h"
26
#include "clang/AST/DependentDiagnostic.h"
27
#include "clang/AST/ExternalASTSource.h"
28
#include "clang/AST/Stmt.h"
29
#include "clang/AST/Type.h"
30
#include "clang/Basic/IdentifierTable.h"
31
#include "clang/Basic/LLVM.h"
32
#include "clang/Basic/Module.h"
33
#include "clang/Basic/ObjCRuntime.h"
34
#include "clang/Basic/PartialDiagnostic.h"
35
#include "clang/Basic/SourceLocation.h"
36
#include "clang/Basic/TargetInfo.h"
37
#include "llvm/ADT/ArrayRef.h"
38
#include "llvm/ADT/PointerIntPair.h"
39
#include "llvm/ADT/SmallVector.h"
40
#include "llvm/ADT/StringRef.h"
41
#include "llvm/Support/Casting.h"
42
#include "llvm/Support/ErrorHandling.h"
43
#include "llvm/Support/MathExtras.h"
44
#include "llvm/Support/VersionTuple.h"
45
#include "llvm/Support/raw_ostream.h"
46
#include <algorithm>
47
#include <cassert>
48
#include <cstddef>
49
#include <string>
50
#include <tuple>
51
#include <utility>
52
53
using namespace clang;
54
55
//===----------------------------------------------------------------------===//
56
// Statistics
57
//===----------------------------------------------------------------------===//
58
59
#define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
60
#define ABSTRACT_DECL(DECL)
61
#include "clang/AST/DeclNodes.inc"
62
63
void Decl::updateOutOfDate(IdentifierInfo &II) const {
64
getASTContext().getExternalSource()->updateOutOfDateIdentifier(II);
65
}
66
67
#define DECL(DERIVED, BASE) \
68
static_assert(alignof(Decl) >= alignof(DERIVED##Decl), \
69
"Alignment sufficient after objects prepended to " #DERIVED);
70
#define ABSTRACT_DECL(DECL)
71
#include "clang/AST/DeclNodes.inc"
72
73
void *Decl::operator new(std::size_t Size, const ASTContext &Context,
74
GlobalDeclID ID, std::size_t Extra) {
75
// Allocate an extra 8 bytes worth of storage, which ensures that the
76
// resulting pointer will still be 8-byte aligned.
77
static_assert(sizeof(uint64_t) >= alignof(Decl), "Decl won't be misaligned");
78
void *Start = Context.Allocate(Size + Extra + 8);
79
void *Result = (char*)Start + 8;
80
81
uint64_t *PrefixPtr = (uint64_t *)Result - 1;
82
83
*PrefixPtr = ID.getRawValue();
84
85
// We leave the upper 16 bits to store the module IDs. 48 bits should be
86
// sufficient to store a declaration ID.
87
assert(*PrefixPtr < llvm::maskTrailingOnes<uint64_t>(48));
88
89
return Result;
90
}
91
92
void *Decl::operator new(std::size_t Size, const ASTContext &Ctx,
93
DeclContext *Parent, std::size_t Extra) {
94
assert(!Parent || &Parent->getParentASTContext() == &Ctx);
95
// With local visibility enabled, we track the owning module even for local
96
// declarations. We create the TU decl early and may not yet know what the
97
// LangOpts are, so conservatively allocate the storage.
98
if (Ctx.getLangOpts().trackLocalOwningModule() || !Parent) {
99
// Ensure required alignment of the resulting object by adding extra
100
// padding at the start if required.
101
size_t ExtraAlign =
102
llvm::offsetToAlignment(sizeof(Module *), llvm::Align(alignof(Decl)));
103
auto *Buffer = reinterpret_cast<char *>(
104
::operator new(ExtraAlign + sizeof(Module *) + Size + Extra, Ctx));
105
Buffer += ExtraAlign;
106
auto *ParentModule =
107
Parent ? cast<Decl>(Parent)->getOwningModule() : nullptr;
108
return new (Buffer) Module*(ParentModule) + 1;
109
}
110
return ::operator new(Size + Extra, Ctx);
111
}
112
113
GlobalDeclID Decl::getGlobalID() const {
114
if (!isFromASTFile())
115
return GlobalDeclID();
116
// See the comments in `Decl::operator new` for details.
117
uint64_t ID = *((const uint64_t *)this - 1);
118
return GlobalDeclID(ID & llvm::maskTrailingOnes<uint64_t>(48));
119
}
120
121
unsigned Decl::getOwningModuleID() const {
122
if (!isFromASTFile())
123
return 0;
124
125
uint64_t ID = *((const uint64_t *)this - 1);
126
return ID >> 48;
127
}
128
129
void Decl::setOwningModuleID(unsigned ID) {
130
assert(isFromASTFile() && "Only works on a deserialized declaration");
131
uint64_t *IDAddress = (uint64_t *)this - 1;
132
*IDAddress &= llvm::maskTrailingOnes<uint64_t>(48);
133
*IDAddress |= (uint64_t)ID << 48;
134
}
135
136
Module *Decl::getOwningModuleSlow() const {
137
assert(isFromASTFile() && "Not from AST file?");
138
return getASTContext().getExternalSource()->getModule(getOwningModuleID());
139
}
140
141
bool Decl::hasLocalOwningModuleStorage() const {
142
return getASTContext().getLangOpts().trackLocalOwningModule();
143
}
144
145
const char *Decl::getDeclKindName() const {
146
switch (DeclKind) {
147
default: llvm_unreachable("Declaration not in DeclNodes.inc!");
148
#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
149
#define ABSTRACT_DECL(DECL)
150
#include "clang/AST/DeclNodes.inc"
151
}
152
}
153
154
void Decl::setInvalidDecl(bool Invalid) {
155
InvalidDecl = Invalid;
156
assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition());
157
if (!Invalid) {
158
return;
159
}
160
161
if (!isa<ParmVarDecl>(this)) {
162
// Defensive maneuver for ill-formed code: we're likely not to make it to
163
// a point where we set the access specifier, so default it to "public"
164
// to avoid triggering asserts elsewhere in the front end.
165
setAccess(AS_public);
166
}
167
168
// Marking a DecompositionDecl as invalid implies all the child BindingDecl's
169
// are invalid too.
170
if (auto *DD = dyn_cast<DecompositionDecl>(this)) {
171
for (auto *Binding : DD->bindings()) {
172
Binding->setInvalidDecl();
173
}
174
}
175
}
176
177
bool DeclContext::hasValidDeclKind() const {
178
switch (getDeclKind()) {
179
#define DECL(DERIVED, BASE) case Decl::DERIVED: return true;
180
#define ABSTRACT_DECL(DECL)
181
#include "clang/AST/DeclNodes.inc"
182
}
183
return false;
184
}
185
186
const char *DeclContext::getDeclKindName() const {
187
switch (getDeclKind()) {
188
#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
189
#define ABSTRACT_DECL(DECL)
190
#include "clang/AST/DeclNodes.inc"
191
}
192
llvm_unreachable("Declaration context not in DeclNodes.inc!");
193
}
194
195
bool Decl::StatisticsEnabled = false;
196
void Decl::EnableStatistics() {
197
StatisticsEnabled = true;
198
}
199
200
void Decl::PrintStats() {
201
llvm::errs() << "\n*** Decl Stats:\n";
202
203
int totalDecls = 0;
204
#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
205
#define ABSTRACT_DECL(DECL)
206
#include "clang/AST/DeclNodes.inc"
207
llvm::errs() << " " << totalDecls << " decls total.\n";
208
209
int totalBytes = 0;
210
#define DECL(DERIVED, BASE) \
211
if (n##DERIVED##s > 0) { \
212
totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl)); \
213
llvm::errs() << " " << n##DERIVED##s << " " #DERIVED " decls, " \
214
<< sizeof(DERIVED##Decl) << " each (" \
215
<< n##DERIVED##s * sizeof(DERIVED##Decl) \
216
<< " bytes)\n"; \
217
}
218
#define ABSTRACT_DECL(DECL)
219
#include "clang/AST/DeclNodes.inc"
220
221
llvm::errs() << "Total bytes = " << totalBytes << "\n";
222
}
223
224
void Decl::add(Kind k) {
225
switch (k) {
226
#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
227
#define ABSTRACT_DECL(DECL)
228
#include "clang/AST/DeclNodes.inc"
229
}
230
}
231
232
bool Decl::isTemplateParameterPack() const {
233
if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(this))
234
return TTP->isParameterPack();
235
if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(this))
236
return NTTP->isParameterPack();
237
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(this))
238
return TTP->isParameterPack();
239
return false;
240
}
241
242
bool Decl::isParameterPack() const {
243
if (const auto *Var = dyn_cast<VarDecl>(this))
244
return Var->isParameterPack();
245
246
return isTemplateParameterPack();
247
}
248
249
FunctionDecl *Decl::getAsFunction() {
250
if (auto *FD = dyn_cast<FunctionDecl>(this))
251
return FD;
252
if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
253
return FTD->getTemplatedDecl();
254
return nullptr;
255
}
256
257
bool Decl::isTemplateDecl() const {
258
return isa<TemplateDecl>(this);
259
}
260
261
TemplateDecl *Decl::getDescribedTemplate() const {
262
if (auto *FD = dyn_cast<FunctionDecl>(this))
263
return FD->getDescribedFunctionTemplate();
264
if (auto *RD = dyn_cast<CXXRecordDecl>(this))
265
return RD->getDescribedClassTemplate();
266
if (auto *VD = dyn_cast<VarDecl>(this))
267
return VD->getDescribedVarTemplate();
268
if (auto *AD = dyn_cast<TypeAliasDecl>(this))
269
return AD->getDescribedAliasTemplate();
270
271
return nullptr;
272
}
273
274
const TemplateParameterList *Decl::getDescribedTemplateParams() const {
275
if (auto *TD = getDescribedTemplate())
276
return TD->getTemplateParameters();
277
if (auto *CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(this))
278
return CTPSD->getTemplateParameters();
279
if (auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(this))
280
return VTPSD->getTemplateParameters();
281
return nullptr;
282
}
283
284
bool Decl::isTemplated() const {
285
// A declaration is templated if it is a template or a template pattern, or
286
// is within (lexcially for a friend or local function declaration,
287
// semantically otherwise) a dependent context.
288
if (auto *AsDC = dyn_cast<DeclContext>(this))
289
return AsDC->isDependentContext();
290
auto *DC = getFriendObjectKind() || isLocalExternDecl()
291
? getLexicalDeclContext() : getDeclContext();
292
return DC->isDependentContext() || isTemplateDecl() ||
293
getDescribedTemplateParams();
294
}
295
296
unsigned Decl::getTemplateDepth() const {
297
if (auto *DC = dyn_cast<DeclContext>(this))
298
if (DC->isFileContext())
299
return 0;
300
301
if (auto *TPL = getDescribedTemplateParams())
302
return TPL->getDepth() + 1;
303
304
// If this is a dependent lambda, there might be an enclosing variable
305
// template. In this case, the next step is not the parent DeclContext (or
306
// even a DeclContext at all).
307
auto *RD = dyn_cast<CXXRecordDecl>(this);
308
if (RD && RD->isDependentLambda())
309
if (Decl *Context = RD->getLambdaContextDecl())
310
return Context->getTemplateDepth();
311
312
const DeclContext *DC =
313
getFriendObjectKind() ? getLexicalDeclContext() : getDeclContext();
314
return cast<Decl>(DC)->getTemplateDepth();
315
}
316
317
const DeclContext *Decl::getParentFunctionOrMethod(bool LexicalParent) const {
318
for (const DeclContext *DC = LexicalParent ? getLexicalDeclContext()
319
: getDeclContext();
320
DC && !DC->isFileContext(); DC = DC->getParent())
321
if (DC->isFunctionOrMethod())
322
return DC;
323
324
return nullptr;
325
}
326
327
//===----------------------------------------------------------------------===//
328
// PrettyStackTraceDecl Implementation
329
//===----------------------------------------------------------------------===//
330
331
void PrettyStackTraceDecl::print(raw_ostream &OS) const {
332
SourceLocation TheLoc = Loc;
333
if (TheLoc.isInvalid() && TheDecl)
334
TheLoc = TheDecl->getLocation();
335
336
if (TheLoc.isValid()) {
337
TheLoc.print(OS, SM);
338
OS << ": ";
339
}
340
341
OS << Message;
342
343
if (const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
344
OS << " '";
345
DN->printQualifiedName(OS);
346
OS << '\'';
347
}
348
OS << '\n';
349
}
350
351
//===----------------------------------------------------------------------===//
352
// Decl Implementation
353
//===----------------------------------------------------------------------===//
354
355
// Out-of-line virtual method providing a home for Decl.
356
Decl::~Decl() = default;
357
358
void Decl::setDeclContext(DeclContext *DC) {
359
DeclCtx = DC;
360
}
361
362
void Decl::setLexicalDeclContext(DeclContext *DC) {
363
if (DC == getLexicalDeclContext())
364
return;
365
366
if (isInSemaDC()) {
367
setDeclContextsImpl(getDeclContext(), DC, getASTContext());
368
} else {
369
getMultipleDC()->LexicalDC = DC;
370
}
371
372
// FIXME: We shouldn't be changing the lexical context of declarations
373
// imported from AST files.
374
if (!isFromASTFile()) {
375
setModuleOwnershipKind(getModuleOwnershipKindForChildOf(DC));
376
if (hasOwningModule())
377
setLocalOwningModule(cast<Decl>(DC)->getOwningModule());
378
}
379
380
assert(
381
(getModuleOwnershipKind() != ModuleOwnershipKind::VisibleWhenImported ||
382
getOwningModule()) &&
383
"hidden declaration has no owning module");
384
}
385
386
void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
387
ASTContext &Ctx) {
388
if (SemaDC == LexicalDC) {
389
DeclCtx = SemaDC;
390
} else {
391
auto *MDC = new (Ctx) Decl::MultipleDC();
392
MDC->SemanticDC = SemaDC;
393
MDC->LexicalDC = LexicalDC;
394
DeclCtx = MDC;
395
}
396
}
397
398
bool Decl::isInLocalScopeForInstantiation() const {
399
const DeclContext *LDC = getLexicalDeclContext();
400
if (!LDC->isDependentContext())
401
return false;
402
while (true) {
403
if (LDC->isFunctionOrMethod())
404
return true;
405
if (!isa<TagDecl>(LDC))
406
return false;
407
if (const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
408
if (CRD->isLambda())
409
return true;
410
LDC = LDC->getLexicalParent();
411
}
412
return false;
413
}
414
415
bool Decl::isInAnonymousNamespace() const {
416
for (const DeclContext *DC = getDeclContext(); DC; DC = DC->getParent()) {
417
if (const auto *ND = dyn_cast<NamespaceDecl>(DC))
418
if (ND->isAnonymousNamespace())
419
return true;
420
}
421
422
return false;
423
}
424
425
bool Decl::isInStdNamespace() const {
426
const DeclContext *DC = getDeclContext();
427
return DC && DC->getNonTransparentContext()->isStdNamespace();
428
}
429
430
bool Decl::isFileContextDecl() const {
431
const auto *DC = dyn_cast<DeclContext>(this);
432
return DC && DC->isFileContext();
433
}
434
435
bool Decl::isFlexibleArrayMemberLike(
436
ASTContext &Ctx, const Decl *D, QualType Ty,
437
LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel,
438
bool IgnoreTemplateOrMacroSubstitution) {
439
// For compatibility with existing code, we treat arrays of length 0 or
440
// 1 as flexible array members.
441
const auto *CAT = Ctx.getAsConstantArrayType(Ty);
442
if (CAT) {
443
using FAMKind = LangOptions::StrictFlexArraysLevelKind;
444
445
llvm::APInt Size = CAT->getSize();
446
if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
447
return false;
448
449
// GCC extension, only allowed to represent a FAM.
450
if (Size.isZero())
451
return true;
452
453
if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete && Size.uge(1))
454
return false;
455
456
if (StrictFlexArraysLevel == FAMKind::OneZeroOrIncomplete && Size.uge(2))
457
return false;
458
} else if (!Ctx.getAsIncompleteArrayType(Ty)) {
459
return false;
460
}
461
462
if (const auto *OID = dyn_cast_if_present<ObjCIvarDecl>(D))
463
return OID->getNextIvar() == nullptr;
464
465
const auto *FD = dyn_cast_if_present<FieldDecl>(D);
466
if (!FD)
467
return false;
468
469
if (CAT) {
470
// GCC treats an array memeber of a union as an FAM if the size is one or
471
// zero.
472
llvm::APInt Size = CAT->getSize();
473
if (FD->getParent()->isUnion() && (Size.isZero() || Size.isOne()))
474
return true;
475
}
476
477
// Don't consider sizes resulting from macro expansions or template argument
478
// substitution to form C89 tail-padded arrays.
479
if (IgnoreTemplateOrMacroSubstitution) {
480
TypeSourceInfo *TInfo = FD->getTypeSourceInfo();
481
while (TInfo) {
482
TypeLoc TL = TInfo->getTypeLoc();
483
484
// Look through typedefs.
485
if (TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>()) {
486
const TypedefNameDecl *TDL = TTL.getTypedefNameDecl();
487
TInfo = TDL->getTypeSourceInfo();
488
continue;
489
}
490
491
if (auto CTL = TL.getAs<ConstantArrayTypeLoc>()) {
492
if (const Expr *SizeExpr =
493
dyn_cast_if_present<IntegerLiteral>(CTL.getSizeExpr());
494
!SizeExpr || SizeExpr->getExprLoc().isMacroID())
495
return false;
496
}
497
498
break;
499
}
500
}
501
502
// Test that the field is the last in the structure.
503
RecordDecl::field_iterator FI(
504
DeclContext::decl_iterator(const_cast<FieldDecl *>(FD)));
505
return ++FI == FD->getParent()->field_end();
506
}
507
508
TranslationUnitDecl *Decl::getTranslationUnitDecl() {
509
if (auto *TUD = dyn_cast<TranslationUnitDecl>(this))
510
return TUD;
511
512
DeclContext *DC = getDeclContext();
513
assert(DC && "This decl is not contained in a translation unit!");
514
515
while (!DC->isTranslationUnit()) {
516
DC = DC->getParent();
517
assert(DC && "This decl is not contained in a translation unit!");
518
}
519
520
return cast<TranslationUnitDecl>(DC);
521
}
522
523
ASTContext &Decl::getASTContext() const {
524
return getTranslationUnitDecl()->getASTContext();
525
}
526
527
/// Helper to get the language options from the ASTContext.
528
/// Defined out of line to avoid depending on ASTContext.h.
529
const LangOptions &Decl::getLangOpts() const {
530
return getASTContext().getLangOpts();
531
}
532
533
ASTMutationListener *Decl::getASTMutationListener() const {
534
return getASTContext().getASTMutationListener();
535
}
536
537
unsigned Decl::getMaxAlignment() const {
538
if (!hasAttrs())
539
return 0;
540
541
unsigned Align = 0;
542
const AttrVec &V = getAttrs();
543
ASTContext &Ctx = getASTContext();
544
specific_attr_iterator<AlignedAttr> I(V.begin()), E(V.end());
545
for (; I != E; ++I) {
546
if (!I->isAlignmentErrorDependent())
547
Align = std::max(Align, I->getAlignment(Ctx));
548
}
549
return Align;
550
}
551
552
bool Decl::isUsed(bool CheckUsedAttr) const {
553
const Decl *CanonD = getCanonicalDecl();
554
if (CanonD->Used)
555
return true;
556
557
// Check for used attribute.
558
// Ask the most recent decl, since attributes accumulate in the redecl chain.
559
if (CheckUsedAttr && getMostRecentDecl()->hasAttr<UsedAttr>())
560
return true;
561
562
// The information may have not been deserialized yet. Force deserialization
563
// to complete the needed information.
564
return getMostRecentDecl()->getCanonicalDecl()->Used;
565
}
566
567
void Decl::markUsed(ASTContext &C) {
568
if (isUsed(false))
569
return;
570
571
if (C.getASTMutationListener())
572
C.getASTMutationListener()->DeclarationMarkedUsed(this);
573
574
setIsUsed();
575
}
576
577
bool Decl::isReferenced() const {
578
if (Referenced)
579
return true;
580
581
// Check redeclarations.
582
for (const auto *I : redecls())
583
if (I->Referenced)
584
return true;
585
586
return false;
587
}
588
589
ExternalSourceSymbolAttr *Decl::getExternalSourceSymbolAttr() const {
590
const Decl *Definition = nullptr;
591
if (auto *ID = dyn_cast<ObjCInterfaceDecl>(this)) {
592
Definition = ID->getDefinition();
593
} else if (auto *PD = dyn_cast<ObjCProtocolDecl>(this)) {
594
Definition = PD->getDefinition();
595
} else if (auto *TD = dyn_cast<TagDecl>(this)) {
596
Definition = TD->getDefinition();
597
}
598
if (!Definition)
599
Definition = this;
600
601
if (auto *attr = Definition->getAttr<ExternalSourceSymbolAttr>())
602
return attr;
603
if (auto *dcd = dyn_cast<Decl>(getDeclContext())) {
604
return dcd->getAttr<ExternalSourceSymbolAttr>();
605
}
606
607
return nullptr;
608
}
609
610
bool Decl::hasDefiningAttr() const {
611
return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>() ||
612
hasAttr<LoaderUninitializedAttr>();
613
}
614
615
const Attr *Decl::getDefiningAttr() const {
616
if (auto *AA = getAttr<AliasAttr>())
617
return AA;
618
if (auto *IFA = getAttr<IFuncAttr>())
619
return IFA;
620
if (auto *NZA = getAttr<LoaderUninitializedAttr>())
621
return NZA;
622
return nullptr;
623
}
624
625
static StringRef getRealizedPlatform(const AvailabilityAttr *A,
626
const ASTContext &Context) {
627
// Check if this is an App Extension "platform", and if so chop off
628
// the suffix for matching with the actual platform.
629
StringRef RealizedPlatform = A->getPlatform()->getName();
630
if (!Context.getLangOpts().AppExt)
631
return RealizedPlatform;
632
size_t suffix = RealizedPlatform.rfind("_app_extension");
633
if (suffix != StringRef::npos)
634
return RealizedPlatform.slice(0, suffix);
635
return RealizedPlatform;
636
}
637
638
/// Determine the availability of the given declaration based on
639
/// the target platform.
640
///
641
/// When it returns an availability result other than \c AR_Available,
642
/// if the \p Message parameter is non-NULL, it will be set to a
643
/// string describing why the entity is unavailable.
644
///
645
/// FIXME: Make these strings localizable, since they end up in
646
/// diagnostics.
647
static AvailabilityResult CheckAvailability(ASTContext &Context,
648
const AvailabilityAttr *A,
649
std::string *Message,
650
VersionTuple EnclosingVersion) {
651
if (EnclosingVersion.empty())
652
EnclosingVersion = Context.getTargetInfo().getPlatformMinVersion();
653
654
if (EnclosingVersion.empty())
655
return AR_Available;
656
657
StringRef ActualPlatform = A->getPlatform()->getName();
658
StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
659
660
// Match the platform name.
661
if (getRealizedPlatform(A, Context) != TargetPlatform)
662
return AR_Available;
663
664
StringRef PrettyPlatformName
665
= AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
666
667
if (PrettyPlatformName.empty())
668
PrettyPlatformName = ActualPlatform;
669
670
std::string HintMessage;
671
if (!A->getMessage().empty()) {
672
HintMessage = " - ";
673
HintMessage += A->getMessage();
674
}
675
676
// Make sure that this declaration has not been marked 'unavailable'.
677
if (A->getUnavailable()) {
678
if (Message) {
679
Message->clear();
680
llvm::raw_string_ostream Out(*Message);
681
Out << "not available on " << PrettyPlatformName
682
<< HintMessage;
683
}
684
685
return AR_Unavailable;
686
}
687
688
// Make sure that this declaration has already been introduced.
689
if (!A->getIntroduced().empty() &&
690
EnclosingVersion < A->getIntroduced()) {
691
IdentifierInfo *IIEnv = A->getEnvironment();
692
StringRef TargetEnv =
693
Context.getTargetInfo().getTriple().getEnvironmentName();
694
StringRef EnvName = llvm::Triple::getEnvironmentTypeName(
695
Context.getTargetInfo().getTriple().getEnvironment());
696
// Matching environment or no environment on attribute
697
if (!IIEnv || (!TargetEnv.empty() && IIEnv->getName() == TargetEnv)) {
698
if (Message) {
699
Message->clear();
700
llvm::raw_string_ostream Out(*Message);
701
VersionTuple VTI(A->getIntroduced());
702
Out << "introduced in " << PrettyPlatformName << " " << VTI << " "
703
<< EnvName << HintMessage;
704
}
705
}
706
// Non-matching environment or no environment on target
707
else {
708
if (Message) {
709
Message->clear();
710
llvm::raw_string_ostream Out(*Message);
711
Out << "not available on " << PrettyPlatformName << " " << EnvName
712
<< HintMessage;
713
}
714
}
715
716
return A->getStrict() ? AR_Unavailable : AR_NotYetIntroduced;
717
}
718
719
// Make sure that this declaration hasn't been obsoleted.
720
if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
721
if (Message) {
722
Message->clear();
723
llvm::raw_string_ostream Out(*Message);
724
VersionTuple VTO(A->getObsoleted());
725
Out << "obsoleted in " << PrettyPlatformName << ' '
726
<< VTO << HintMessage;
727
}
728
729
return AR_Unavailable;
730
}
731
732
// Make sure that this declaration hasn't been deprecated.
733
if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
734
if (Message) {
735
Message->clear();
736
llvm::raw_string_ostream Out(*Message);
737
VersionTuple VTD(A->getDeprecated());
738
Out << "first deprecated in " << PrettyPlatformName << ' '
739
<< VTD << HintMessage;
740
}
741
742
return AR_Deprecated;
743
}
744
745
return AR_Available;
746
}
747
748
AvailabilityResult Decl::getAvailability(std::string *Message,
749
VersionTuple EnclosingVersion,
750
StringRef *RealizedPlatform) const {
751
if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
752
return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
753
RealizedPlatform);
754
755
AvailabilityResult Result = AR_Available;
756
std::string ResultMessage;
757
758
for (const auto *A : attrs()) {
759
if (const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
760
if (Result >= AR_Deprecated)
761
continue;
762
763
if (Message)
764
ResultMessage = std::string(Deprecated->getMessage());
765
766
Result = AR_Deprecated;
767
continue;
768
}
769
770
if (const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
771
if (Message)
772
*Message = std::string(Unavailable->getMessage());
773
return AR_Unavailable;
774
}
775
776
if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
777
AvailabilityResult AR = CheckAvailability(getASTContext(), Availability,
778
Message, EnclosingVersion);
779
780
if (AR == AR_Unavailable) {
781
if (RealizedPlatform)
782
*RealizedPlatform = Availability->getPlatform()->getName();
783
return AR_Unavailable;
784
}
785
786
if (AR > Result) {
787
Result = AR;
788
if (Message)
789
ResultMessage.swap(*Message);
790
}
791
continue;
792
}
793
}
794
795
if (Message)
796
Message->swap(ResultMessage);
797
return Result;
798
}
799
800
VersionTuple Decl::getVersionIntroduced() const {
801
const ASTContext &Context = getASTContext();
802
StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
803
for (const auto *A : attrs()) {
804
if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
805
if (getRealizedPlatform(Availability, Context) != TargetPlatform)
806
continue;
807
if (!Availability->getIntroduced().empty())
808
return Availability->getIntroduced();
809
}
810
}
811
return {};
812
}
813
814
bool Decl::canBeWeakImported(bool &IsDefinition) const {
815
IsDefinition = false;
816
817
// Variables, if they aren't definitions.
818
if (const auto *Var = dyn_cast<VarDecl>(this)) {
819
if (Var->isThisDeclarationADefinition()) {
820
IsDefinition = true;
821
return false;
822
}
823
return true;
824
}
825
// Functions, if they aren't definitions.
826
if (const auto *FD = dyn_cast<FunctionDecl>(this)) {
827
if (FD->hasBody()) {
828
IsDefinition = true;
829
return false;
830
}
831
return true;
832
833
}
834
// Objective-C classes, if this is the non-fragile runtime.
835
if (isa<ObjCInterfaceDecl>(this) &&
836
getASTContext().getLangOpts().ObjCRuntime.hasWeakClassImport()) {
837
return true;
838
}
839
// Nothing else.
840
return false;
841
}
842
843
bool Decl::isWeakImported() const {
844
bool IsDefinition;
845
if (!canBeWeakImported(IsDefinition))
846
return false;
847
848
for (const auto *A : getMostRecentDecl()->attrs()) {
849
if (isa<WeakImportAttr>(A))
850
return true;
851
852
if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
853
if (CheckAvailability(getASTContext(), Availability, nullptr,
854
VersionTuple()) == AR_NotYetIntroduced)
855
return true;
856
}
857
}
858
859
return false;
860
}
861
862
unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
863
switch (DeclKind) {
864
case Function:
865
case CXXDeductionGuide:
866
case CXXMethod:
867
case CXXConstructor:
868
case ConstructorUsingShadow:
869
case CXXDestructor:
870
case CXXConversion:
871
case EnumConstant:
872
case Var:
873
case ImplicitParam:
874
case ParmVar:
875
case ObjCMethod:
876
case ObjCProperty:
877
case MSProperty:
878
case HLSLBuffer:
879
return IDNS_Ordinary;
880
case Label:
881
return IDNS_Label;
882
case IndirectField:
883
return IDNS_Ordinary | IDNS_Member;
884
885
case Binding:
886
case NonTypeTemplateParm:
887
case VarTemplate:
888
case Concept:
889
// These (C++-only) declarations are found by redeclaration lookup for
890
// tag types, so we include them in the tag namespace.
891
return IDNS_Ordinary | IDNS_Tag;
892
893
case ObjCCompatibleAlias:
894
case ObjCInterface:
895
return IDNS_Ordinary | IDNS_Type;
896
897
case Typedef:
898
case TypeAlias:
899
case TemplateTypeParm:
900
case ObjCTypeParam:
901
return IDNS_Ordinary | IDNS_Type;
902
903
case UnresolvedUsingTypename:
904
return IDNS_Ordinary | IDNS_Type | IDNS_Using;
905
906
case UsingShadow:
907
return 0; // we'll actually overwrite this later
908
909
case UnresolvedUsingValue:
910
return IDNS_Ordinary | IDNS_Using;
911
912
case Using:
913
case UsingPack:
914
case UsingEnum:
915
return IDNS_Using;
916
917
case ObjCProtocol:
918
return IDNS_ObjCProtocol;
919
920
case Field:
921
case ObjCAtDefsField:
922
case ObjCIvar:
923
return IDNS_Member;
924
925
case Record:
926
case CXXRecord:
927
case Enum:
928
return IDNS_Tag | IDNS_Type;
929
930
case Namespace:
931
case NamespaceAlias:
932
return IDNS_Namespace;
933
934
case FunctionTemplate:
935
return IDNS_Ordinary;
936
937
case ClassTemplate:
938
case TemplateTemplateParm:
939
case TypeAliasTemplate:
940
return IDNS_Ordinary | IDNS_Tag | IDNS_Type;
941
942
case UnresolvedUsingIfExists:
943
return IDNS_Type | IDNS_Ordinary;
944
945
case OMPDeclareReduction:
946
return IDNS_OMPReduction;
947
948
case OMPDeclareMapper:
949
return IDNS_OMPMapper;
950
951
// Never have names.
952
case Friend:
953
case FriendTemplate:
954
case AccessSpec:
955
case LinkageSpec:
956
case Export:
957
case FileScopeAsm:
958
case TopLevelStmt:
959
case StaticAssert:
960
case ObjCPropertyImpl:
961
case PragmaComment:
962
case PragmaDetectMismatch:
963
case Block:
964
case Captured:
965
case TranslationUnit:
966
case ExternCContext:
967
case Decomposition:
968
case MSGuid:
969
case UnnamedGlobalConstant:
970
case TemplateParamObject:
971
972
case UsingDirective:
973
case BuiltinTemplate:
974
case ClassTemplateSpecialization:
975
case ClassTemplatePartialSpecialization:
976
case VarTemplateSpecialization:
977
case VarTemplatePartialSpecialization:
978
case ObjCImplementation:
979
case ObjCCategory:
980
case ObjCCategoryImpl:
981
case Import:
982
case OMPThreadPrivate:
983
case OMPAllocate:
984
case OMPRequires:
985
case OMPCapturedExpr:
986
case Empty:
987
case LifetimeExtendedTemporary:
988
case RequiresExprBody:
989
case ImplicitConceptSpecialization:
990
// Never looked up by name.
991
return 0;
992
}
993
994
llvm_unreachable("Invalid DeclKind!");
995
}
996
997
void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
998
assert(!HasAttrs && "Decl already contains attrs.");
999
1000
AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
1001
assert(AttrBlank.empty() && "HasAttrs was wrong?");
1002
1003
AttrBlank = attrs;
1004
HasAttrs = true;
1005
}
1006
1007
void Decl::dropAttrs() {
1008
if (!HasAttrs) return;
1009
1010
HasAttrs = false;
1011
getASTContext().eraseDeclAttrs(this);
1012
}
1013
1014
void Decl::addAttr(Attr *A) {
1015
if (!hasAttrs()) {
1016
setAttrs(AttrVec(1, A));
1017
return;
1018
}
1019
1020
AttrVec &Attrs = getAttrs();
1021
if (!A->isInherited()) {
1022
Attrs.push_back(A);
1023
return;
1024
}
1025
1026
// Attribute inheritance is processed after attribute parsing. To keep the
1027
// order as in the source code, add inherited attributes before non-inherited
1028
// ones.
1029
auto I = Attrs.begin(), E = Attrs.end();
1030
for (; I != E; ++I) {
1031
if (!(*I)->isInherited())
1032
break;
1033
}
1034
Attrs.insert(I, A);
1035
}
1036
1037
const AttrVec &Decl::getAttrs() const {
1038
assert(HasAttrs && "No attrs to get!");
1039
return getASTContext().getDeclAttrs(this);
1040
}
1041
1042
Decl *Decl::castFromDeclContext (const DeclContext *D) {
1043
Decl::Kind DK = D->getDeclKind();
1044
switch (DK) {
1045
#define DECL(NAME, BASE)
1046
#define DECL_CONTEXT(NAME) \
1047
case Decl::NAME: \
1048
return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
1049
#include "clang/AST/DeclNodes.inc"
1050
default:
1051
llvm_unreachable("a decl that inherits DeclContext isn't handled");
1052
}
1053
}
1054
1055
DeclContext *Decl::castToDeclContext(const Decl *D) {
1056
Decl::Kind DK = D->getKind();
1057
switch(DK) {
1058
#define DECL(NAME, BASE)
1059
#define DECL_CONTEXT(NAME) \
1060
case Decl::NAME: \
1061
return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
1062
#include "clang/AST/DeclNodes.inc"
1063
default:
1064
llvm_unreachable("a decl that inherits DeclContext isn't handled");
1065
}
1066
}
1067
1068
SourceLocation Decl::getBodyRBrace() const {
1069
// Special handling of FunctionDecl to avoid de-serializing the body from PCH.
1070
// FunctionDecl stores EndRangeLoc for this purpose.
1071
if (const auto *FD = dyn_cast<FunctionDecl>(this)) {
1072
const FunctionDecl *Definition;
1073
if (FD->hasBody(Definition))
1074
return Definition->getSourceRange().getEnd();
1075
return {};
1076
}
1077
1078
if (Stmt *Body = getBody())
1079
return Body->getSourceRange().getEnd();
1080
1081
return {};
1082
}
1083
1084
bool Decl::AccessDeclContextCheck() const {
1085
#ifndef NDEBUG
1086
// Suppress this check if any of the following hold:
1087
// 1. this is the translation unit (and thus has no parent)
1088
// 2. this is a template parameter (and thus doesn't belong to its context)
1089
// 3. this is a non-type template parameter
1090
// 4. the context is not a record
1091
// 5. it's invalid
1092
// 6. it's a C++0x static_assert.
1093
// 7. it's a block literal declaration
1094
// 8. it's a temporary with lifetime extended due to being default value.
1095
if (isa<TranslationUnitDecl>(this) || isa<TemplateTypeParmDecl>(this) ||
1096
isa<NonTypeTemplateParmDecl>(this) || !getDeclContext() ||
1097
!isa<CXXRecordDecl>(getDeclContext()) || isInvalidDecl() ||
1098
isa<StaticAssertDecl>(this) || isa<BlockDecl>(this) ||
1099
// FIXME: a ParmVarDecl can have ClassTemplateSpecialization
1100
// as DeclContext (?).
1101
isa<ParmVarDecl>(this) ||
1102
// FIXME: a ClassTemplateSpecialization or CXXRecordDecl can have
1103
// AS_none as access specifier.
1104
isa<CXXRecordDecl>(this) || isa<LifetimeExtendedTemporaryDecl>(this))
1105
return true;
1106
1107
assert(Access != AS_none &&
1108
"Access specifier is AS_none inside a record decl");
1109
#endif
1110
return true;
1111
}
1112
1113
bool Decl::isInExportDeclContext() const {
1114
const DeclContext *DC = getLexicalDeclContext();
1115
1116
while (DC && !isa<ExportDecl>(DC))
1117
DC = DC->getLexicalParent();
1118
1119
return isa_and_nonnull<ExportDecl>(DC);
1120
}
1121
1122
bool Decl::isInAnotherModuleUnit() const {
1123
auto *M = getOwningModule();
1124
1125
if (!M)
1126
return false;
1127
1128
// FIXME or NOTE: maybe we need to be clear about the semantics
1129
// of clang header modules. e.g., if this lives in a clang header
1130
// module included by the current unit, should we return false
1131
// here?
1132
//
1133
// This is clear for header units as the specification says the
1134
// header units live in a synthesised translation unit. So we
1135
// can return false here.
1136
M = M->getTopLevelModule();
1137
if (!M->isNamedModule())
1138
return false;
1139
1140
return M != getASTContext().getCurrentNamedModule();
1141
}
1142
1143
bool Decl::isInCurrentModuleUnit() const {
1144
auto *M = getOwningModule();
1145
1146
if (!M || !M->isNamedModule())
1147
return false;
1148
1149
return M == getASTContext().getCurrentNamedModule();
1150
}
1151
1152
bool Decl::shouldEmitInExternalSource() const {
1153
ExternalASTSource *Source = getASTContext().getExternalSource();
1154
if (!Source)
1155
return false;
1156
1157
return Source->hasExternalDefinitions(this) == ExternalASTSource::EK_Always;
1158
}
1159
1160
bool Decl::isFromExplicitGlobalModule() const {
1161
return getOwningModule() && getOwningModule()->isExplicitGlobalModule();
1162
}
1163
1164
bool Decl::isFromGlobalModule() const {
1165
return getOwningModule() && getOwningModule()->isGlobalModule();
1166
}
1167
1168
bool Decl::isInNamedModule() const {
1169
return getOwningModule() && getOwningModule()->isNamedModule();
1170
}
1171
1172
static Decl::Kind getKind(const Decl *D) { return D->getKind(); }
1173
static Decl::Kind getKind(const DeclContext *DC) { return DC->getDeclKind(); }
1174
1175
int64_t Decl::getID() const {
1176
return getASTContext().getAllocator().identifyKnownAlignedObject<Decl>(this);
1177
}
1178
1179
const FunctionType *Decl::getFunctionType(bool BlocksToo) const {
1180
QualType Ty;
1181
if (isa<BindingDecl>(this))
1182
return nullptr;
1183
else if (const auto *D = dyn_cast<ValueDecl>(this))
1184
Ty = D->getType();
1185
else if (const auto *D = dyn_cast<TypedefNameDecl>(this))
1186
Ty = D->getUnderlyingType();
1187
else
1188
return nullptr;
1189
1190
if (Ty->isFunctionPointerType())
1191
Ty = Ty->castAs<PointerType>()->getPointeeType();
1192
else if (Ty->isFunctionReferenceType())
1193
Ty = Ty->castAs<ReferenceType>()->getPointeeType();
1194
else if (BlocksToo && Ty->isBlockPointerType())
1195
Ty = Ty->castAs<BlockPointerType>()->getPointeeType();
1196
1197
return Ty->getAs<FunctionType>();
1198
}
1199
1200
bool Decl::isFunctionPointerType() const {
1201
QualType Ty;
1202
if (const auto *D = dyn_cast<ValueDecl>(this))
1203
Ty = D->getType();
1204
else if (const auto *D = dyn_cast<TypedefNameDecl>(this))
1205
Ty = D->getUnderlyingType();
1206
else
1207
return false;
1208
1209
return Ty.getCanonicalType()->isFunctionPointerType();
1210
}
1211
1212
DeclContext *Decl::getNonTransparentDeclContext() {
1213
assert(getDeclContext());
1214
return getDeclContext()->getNonTransparentContext();
1215
}
1216
1217
/// Starting at a given context (a Decl or DeclContext), look for a
1218
/// code context that is not a closure (a lambda, block, etc.).
1219
template <class T> static Decl *getNonClosureContext(T *D) {
1220
if (getKind(D) == Decl::CXXMethod) {
1221
auto *MD = cast<CXXMethodDecl>(D);
1222
if (MD->getOverloadedOperator() == OO_Call &&
1223
MD->getParent()->isLambda())
1224
return getNonClosureContext(MD->getParent()->getParent());
1225
return MD;
1226
}
1227
if (auto *FD = dyn_cast<FunctionDecl>(D))
1228
return FD;
1229
if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
1230
return MD;
1231
if (auto *BD = dyn_cast<BlockDecl>(D))
1232
return getNonClosureContext(BD->getParent());
1233
if (auto *CD = dyn_cast<CapturedDecl>(D))
1234
return getNonClosureContext(CD->getParent());
1235
return nullptr;
1236
}
1237
1238
Decl *Decl::getNonClosureContext() {
1239
return ::getNonClosureContext(this);
1240
}
1241
1242
Decl *DeclContext::getNonClosureAncestor() {
1243
return ::getNonClosureContext(this);
1244
}
1245
1246
//===----------------------------------------------------------------------===//
1247
// DeclContext Implementation
1248
//===----------------------------------------------------------------------===//
1249
1250
DeclContext::DeclContext(Decl::Kind K) {
1251
DeclContextBits.DeclKind = K;
1252
setHasExternalLexicalStorage(false);
1253
setHasExternalVisibleStorage(false);
1254
setNeedToReconcileExternalVisibleStorage(false);
1255
setHasLazyLocalLexicalLookups(false);
1256
setHasLazyExternalLexicalLookups(false);
1257
setUseQualifiedLookup(false);
1258
}
1259
1260
bool DeclContext::classof(const Decl *D) {
1261
Decl::Kind DK = D->getKind();
1262
switch (DK) {
1263
#define DECL(NAME, BASE)
1264
#define DECL_CONTEXT(NAME) case Decl::NAME:
1265
#include "clang/AST/DeclNodes.inc"
1266
return true;
1267
default:
1268
return false;
1269
}
1270
}
1271
1272
DeclContext::~DeclContext() = default;
1273
1274
/// Find the parent context of this context that will be
1275
/// used for unqualified name lookup.
1276
///
1277
/// Generally, the parent lookup context is the semantic context. However, for
1278
/// a friend function the parent lookup context is the lexical context, which
1279
/// is the class in which the friend is declared.
1280
DeclContext *DeclContext::getLookupParent() {
1281
// FIXME: Find a better way to identify friends.
1282
if (isa<FunctionDecl>(this))
1283
if (getParent()->getRedeclContext()->isFileContext() &&
1284
getLexicalParent()->getRedeclContext()->isRecord())
1285
return getLexicalParent();
1286
1287
// A lookup within the call operator of a lambda never looks in the lambda
1288
// class; instead, skip to the context in which that closure type is
1289
// declared.
1290
if (isLambdaCallOperator(this))
1291
return getParent()->getParent();
1292
1293
return getParent();
1294
}
1295
1296
const BlockDecl *DeclContext::getInnermostBlockDecl() const {
1297
const DeclContext *Ctx = this;
1298
1299
do {
1300
if (Ctx->isClosure())
1301
return cast<BlockDecl>(Ctx);
1302
Ctx = Ctx->getParent();
1303
} while (Ctx);
1304
1305
return nullptr;
1306
}
1307
1308
bool DeclContext::isInlineNamespace() const {
1309
return isNamespace() &&
1310
cast<NamespaceDecl>(this)->isInline();
1311
}
1312
1313
bool DeclContext::isStdNamespace() const {
1314
if (!isNamespace())
1315
return false;
1316
1317
const auto *ND = cast<NamespaceDecl>(this);
1318
if (ND->isInline()) {
1319
return ND->getParent()->isStdNamespace();
1320
}
1321
1322
if (!getParent()->getRedeclContext()->isTranslationUnit())
1323
return false;
1324
1325
const IdentifierInfo *II = ND->getIdentifier();
1326
return II && II->isStr("std");
1327
}
1328
1329
bool DeclContext::isDependentContext() const {
1330
if (isFileContext())
1331
return false;
1332
1333
if (isa<ClassTemplatePartialSpecializationDecl>(this))
1334
return true;
1335
1336
if (const auto *Record = dyn_cast<CXXRecordDecl>(this)) {
1337
if (Record->getDescribedClassTemplate())
1338
return true;
1339
1340
if (Record->isDependentLambda())
1341
return true;
1342
if (Record->isNeverDependentLambda())
1343
return false;
1344
}
1345
1346
if (const auto *Function = dyn_cast<FunctionDecl>(this)) {
1347
if (Function->getDescribedFunctionTemplate())
1348
return true;
1349
1350
// Friend function declarations are dependent if their *lexical*
1351
// context is dependent.
1352
if (cast<Decl>(this)->getFriendObjectKind())
1353
return getLexicalParent()->isDependentContext();
1354
}
1355
1356
// FIXME: A variable template is a dependent context, but is not a
1357
// DeclContext. A context within it (such as a lambda-expression)
1358
// should be considered dependent.
1359
1360
return getParent() && getParent()->isDependentContext();
1361
}
1362
1363
bool DeclContext::isTransparentContext() const {
1364
if (getDeclKind() == Decl::Enum)
1365
return !cast<EnumDecl>(this)->isScoped();
1366
1367
return isa<LinkageSpecDecl, ExportDecl, HLSLBufferDecl>(this);
1368
}
1369
1370
static bool isLinkageSpecContext(const DeclContext *DC,
1371
LinkageSpecLanguageIDs ID) {
1372
while (DC->getDeclKind() != Decl::TranslationUnit) {
1373
if (DC->getDeclKind() == Decl::LinkageSpec)
1374
return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
1375
DC = DC->getLexicalParent();
1376
}
1377
return false;
1378
}
1379
1380
bool DeclContext::isExternCContext() const {
1381
return isLinkageSpecContext(this, LinkageSpecLanguageIDs::C);
1382
}
1383
1384
const LinkageSpecDecl *DeclContext::getExternCContext() const {
1385
const DeclContext *DC = this;
1386
while (DC->getDeclKind() != Decl::TranslationUnit) {
1387
if (DC->getDeclKind() == Decl::LinkageSpec &&
1388
cast<LinkageSpecDecl>(DC)->getLanguage() == LinkageSpecLanguageIDs::C)
1389
return cast<LinkageSpecDecl>(DC);
1390
DC = DC->getLexicalParent();
1391
}
1392
return nullptr;
1393
}
1394
1395
bool DeclContext::isExternCXXContext() const {
1396
return isLinkageSpecContext(this, LinkageSpecLanguageIDs::CXX);
1397
}
1398
1399
bool DeclContext::Encloses(const DeclContext *DC) const {
1400
if (getPrimaryContext() != this)
1401
return getPrimaryContext()->Encloses(DC);
1402
1403
for (; DC; DC = DC->getParent())
1404
if (!isa<LinkageSpecDecl>(DC) && !isa<ExportDecl>(DC) &&
1405
DC->getPrimaryContext() == this)
1406
return true;
1407
return false;
1408
}
1409
1410
DeclContext *DeclContext::getNonTransparentContext() {
1411
DeclContext *DC = this;
1412
while (DC->isTransparentContext()) {
1413
DC = DC->getParent();
1414
assert(DC && "All transparent contexts should have a parent!");
1415
}
1416
return DC;
1417
}
1418
1419
DeclContext *DeclContext::getPrimaryContext() {
1420
switch (getDeclKind()) {
1421
case Decl::ExternCContext:
1422
case Decl::LinkageSpec:
1423
case Decl::Export:
1424
case Decl::TopLevelStmt:
1425
case Decl::Block:
1426
case Decl::Captured:
1427
case Decl::OMPDeclareReduction:
1428
case Decl::OMPDeclareMapper:
1429
case Decl::RequiresExprBody:
1430
// There is only one DeclContext for these entities.
1431
return this;
1432
1433
case Decl::HLSLBuffer:
1434
// Each buffer, even with the same name, is a distinct construct.
1435
// Multiple buffers with the same name are allowed for backward
1436
// compatibility.
1437
// As long as buffers have unique resource bindings the names don't matter.
1438
// The names get exposed via the CPU-side reflection API which
1439
// supports querying bindings, so we cannot remove them.
1440
return this;
1441
1442
case Decl::TranslationUnit:
1443
return static_cast<TranslationUnitDecl *>(this)->getFirstDecl();
1444
case Decl::Namespace:
1445
return static_cast<NamespaceDecl *>(this)->getFirstDecl();
1446
1447
case Decl::ObjCMethod:
1448
return this;
1449
1450
case Decl::ObjCInterface:
1451
if (auto *OID = dyn_cast<ObjCInterfaceDecl>(this))
1452
if (auto *Def = OID->getDefinition())
1453
return Def;
1454
return this;
1455
1456
case Decl::ObjCProtocol:
1457
if (auto *OPD = dyn_cast<ObjCProtocolDecl>(this))
1458
if (auto *Def = OPD->getDefinition())
1459
return Def;
1460
return this;
1461
1462
case Decl::ObjCCategory:
1463
return this;
1464
1465
case Decl::ObjCImplementation:
1466
case Decl::ObjCCategoryImpl:
1467
return this;
1468
1469
default:
1470
if (getDeclKind() >= Decl::firstTag && getDeclKind() <= Decl::lastTag) {
1471
// If this is a tag type that has a definition or is currently
1472
// being defined, that definition is our primary context.
1473
auto *Tag = cast<TagDecl>(this);
1474
1475
if (TagDecl *Def = Tag->getDefinition())
1476
return Def;
1477
1478
if (const auto *TagTy = dyn_cast<TagType>(Tag->getTypeForDecl())) {
1479
// Note, TagType::getDecl returns the (partial) definition one exists.
1480
TagDecl *PossiblePartialDef = TagTy->getDecl();
1481
if (PossiblePartialDef->isBeingDefined())
1482
return PossiblePartialDef;
1483
} else {
1484
assert(isa<InjectedClassNameType>(Tag->getTypeForDecl()));
1485
}
1486
1487
return Tag;
1488
}
1489
1490
assert(getDeclKind() >= Decl::firstFunction &&
1491
getDeclKind() <= Decl::lastFunction &&
1492
"Unknown DeclContext kind");
1493
return this;
1494
}
1495
}
1496
1497
template <typename T>
1498
void collectAllContextsImpl(T *Self, SmallVectorImpl<DeclContext *> &Contexts) {
1499
for (T *D = Self->getMostRecentDecl(); D; D = D->getPreviousDecl())
1500
Contexts.push_back(D);
1501
1502
std::reverse(Contexts.begin(), Contexts.end());
1503
}
1504
1505
void DeclContext::collectAllContexts(SmallVectorImpl<DeclContext *> &Contexts) {
1506
Contexts.clear();
1507
1508
Decl::Kind Kind = getDeclKind();
1509
1510
if (Kind == Decl::TranslationUnit)
1511
collectAllContextsImpl(static_cast<TranslationUnitDecl *>(this), Contexts);
1512
else if (Kind == Decl::Namespace)
1513
collectAllContextsImpl(static_cast<NamespaceDecl *>(this), Contexts);
1514
else
1515
Contexts.push_back(this);
1516
}
1517
1518
std::pair<Decl *, Decl *>
1519
DeclContext::BuildDeclChain(ArrayRef<Decl *> Decls,
1520
bool FieldsAlreadyLoaded) {
1521
// Build up a chain of declarations via the Decl::NextInContextAndBits field.
1522
Decl *FirstNewDecl = nullptr;
1523
Decl *PrevDecl = nullptr;
1524
for (auto *D : Decls) {
1525
if (FieldsAlreadyLoaded && isa<FieldDecl>(D))
1526
continue;
1527
1528
if (PrevDecl)
1529
PrevDecl->NextInContextAndBits.setPointer(D);
1530
else
1531
FirstNewDecl = D;
1532
1533
PrevDecl = D;
1534
}
1535
1536
return std::make_pair(FirstNewDecl, PrevDecl);
1537
}
1538
1539
/// We have just acquired external visible storage, and we already have
1540
/// built a lookup map. For every name in the map, pull in the new names from
1541
/// the external storage.
1542
void DeclContext::reconcileExternalVisibleStorage() const {
1543
assert(hasNeedToReconcileExternalVisibleStorage() && LookupPtr);
1544
setNeedToReconcileExternalVisibleStorage(false);
1545
1546
for (auto &Lookup : *LookupPtr)
1547
Lookup.second.setHasExternalDecls();
1548
}
1549
1550
/// Load the declarations within this lexical storage from an
1551
/// external source.
1552
/// \return \c true if any declarations were added.
1553
bool
1554
DeclContext::LoadLexicalDeclsFromExternalStorage() const {
1555
ExternalASTSource *Source = getParentASTContext().getExternalSource();
1556
assert(hasExternalLexicalStorage() && Source && "No external storage?");
1557
1558
// Notify that we have a DeclContext that is initializing.
1559
ExternalASTSource::Deserializing ADeclContext(Source);
1560
1561
// Load the external declarations, if any.
1562
SmallVector<Decl*, 64> Decls;
1563
setHasExternalLexicalStorage(false);
1564
Source->FindExternalLexicalDecls(this, Decls);
1565
1566
if (Decls.empty())
1567
return false;
1568
1569
// We may have already loaded just the fields of this record, in which case
1570
// we need to ignore them.
1571
bool FieldsAlreadyLoaded = false;
1572
if (const auto *RD = dyn_cast<RecordDecl>(this))
1573
FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1574
1575
// Splice the newly-read declarations into the beginning of the list
1576
// of declarations.
1577
Decl *ExternalFirst, *ExternalLast;
1578
std::tie(ExternalFirst, ExternalLast) =
1579
BuildDeclChain(Decls, FieldsAlreadyLoaded);
1580
ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
1581
FirstDecl = ExternalFirst;
1582
if (!LastDecl)
1583
LastDecl = ExternalLast;
1584
return true;
1585
}
1586
1587
DeclContext::lookup_result
1588
ExternalASTSource::SetNoExternalVisibleDeclsForName(const DeclContext *DC,
1589
DeclarationName Name) {
1590
ASTContext &Context = DC->getParentASTContext();
1591
StoredDeclsMap *Map;
1592
if (!(Map = DC->LookupPtr))
1593
Map = DC->CreateStoredDeclsMap(Context);
1594
if (DC->hasNeedToReconcileExternalVisibleStorage())
1595
DC->reconcileExternalVisibleStorage();
1596
1597
(*Map)[Name].removeExternalDecls();
1598
1599
return DeclContext::lookup_result();
1600
}
1601
1602
DeclContext::lookup_result
1603
ExternalASTSource::SetExternalVisibleDeclsForName(const DeclContext *DC,
1604
DeclarationName Name,
1605
ArrayRef<NamedDecl*> Decls) {
1606
ASTContext &Context = DC->getParentASTContext();
1607
StoredDeclsMap *Map;
1608
if (!(Map = DC->LookupPtr))
1609
Map = DC->CreateStoredDeclsMap(Context);
1610
if (DC->hasNeedToReconcileExternalVisibleStorage())
1611
DC->reconcileExternalVisibleStorage();
1612
1613
StoredDeclsList &List = (*Map)[Name];
1614
List.replaceExternalDecls(Decls);
1615
return List.getLookupResult();
1616
}
1617
1618
DeclContext::decl_iterator DeclContext::decls_begin() const {
1619
if (hasExternalLexicalStorage())
1620
LoadLexicalDeclsFromExternalStorage();
1621
return decl_iterator(FirstDecl);
1622
}
1623
1624
bool DeclContext::decls_empty() const {
1625
if (hasExternalLexicalStorage())
1626
LoadLexicalDeclsFromExternalStorage();
1627
1628
return !FirstDecl;
1629
}
1630
1631
bool DeclContext::containsDecl(Decl *D) const {
1632
return (D->getLexicalDeclContext() == this &&
1633
(D->NextInContextAndBits.getPointer() || D == LastDecl));
1634
}
1635
1636
bool DeclContext::containsDeclAndLoad(Decl *D) const {
1637
if (hasExternalLexicalStorage())
1638
LoadLexicalDeclsFromExternalStorage();
1639
return containsDecl(D);
1640
}
1641
1642
/// shouldBeHidden - Determine whether a declaration which was declared
1643
/// within its semantic context should be invisible to qualified name lookup.
1644
static bool shouldBeHidden(NamedDecl *D) {
1645
// Skip unnamed declarations.
1646
if (!D->getDeclName())
1647
return true;
1648
1649
// Skip entities that can't be found by name lookup into a particular
1650
// context.
1651
if ((D->getIdentifierNamespace() == 0 && !isa<UsingDirectiveDecl>(D)) ||
1652
D->isTemplateParameter())
1653
return true;
1654
1655
// Skip friends and local extern declarations unless they're the first
1656
// declaration of the entity.
1657
if ((D->isLocalExternDecl() || D->getFriendObjectKind()) &&
1658
D != D->getCanonicalDecl())
1659
return true;
1660
1661
// Skip template specializations.
1662
// FIXME: This feels like a hack. Should DeclarationName support
1663
// template-ids, or is there a better way to keep specializations
1664
// from being visible?
1665
if (isa<ClassTemplateSpecializationDecl>(D))
1666
return true;
1667
if (auto *FD = dyn_cast<FunctionDecl>(D))
1668
if (FD->isFunctionTemplateSpecialization())
1669
return true;
1670
1671
// Hide destructors that are invalid. There should always be one destructor,
1672
// but if it is an invalid decl, another one is created. We need to hide the
1673
// invalid one from places that expect exactly one destructor, like the
1674
// serialization code.
1675
if (isa<CXXDestructorDecl>(D) && D->isInvalidDecl())
1676
return true;
1677
1678
return false;
1679
}
1680
1681
void DeclContext::removeDecl(Decl *D) {
1682
assert(D->getLexicalDeclContext() == this &&
1683
"decl being removed from non-lexical context");
1684
assert((D->NextInContextAndBits.getPointer() || D == LastDecl) &&
1685
"decl is not in decls list");
1686
1687
// Remove D from the decl chain. This is O(n) but hopefully rare.
1688
if (D == FirstDecl) {
1689
if (D == LastDecl)
1690
FirstDecl = LastDecl = nullptr;
1691
else
1692
FirstDecl = D->NextInContextAndBits.getPointer();
1693
} else {
1694
for (Decl *I = FirstDecl; true; I = I->NextInContextAndBits.getPointer()) {
1695
assert(I && "decl not found in linked list");
1696
if (I->NextInContextAndBits.getPointer() == D) {
1697
I->NextInContextAndBits.setPointer(D->NextInContextAndBits.getPointer());
1698
if (D == LastDecl) LastDecl = I;
1699
break;
1700
}
1701
}
1702
}
1703
1704
// Mark that D is no longer in the decl chain.
1705
D->NextInContextAndBits.setPointer(nullptr);
1706
1707
// Remove D from the lookup table if necessary.
1708
if (isa<NamedDecl>(D)) {
1709
auto *ND = cast<NamedDecl>(D);
1710
1711
// Do not try to remove the declaration if that is invisible to qualified
1712
// lookup. E.g. template specializations are skipped.
1713
if (shouldBeHidden(ND))
1714
return;
1715
1716
// Remove only decls that have a name
1717
if (!ND->getDeclName())
1718
return;
1719
1720
auto *DC = D->getDeclContext();
1721
do {
1722
StoredDeclsMap *Map = DC->getPrimaryContext()->LookupPtr;
1723
if (Map) {
1724
StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1725
assert(Pos != Map->end() && "no lookup entry for decl");
1726
StoredDeclsList &List = Pos->second;
1727
List.remove(ND);
1728
// Clean up the entry if there are no more decls.
1729
if (List.isNull())
1730
Map->erase(Pos);
1731
}
1732
} while (DC->isTransparentContext() && (DC = DC->getParent()));
1733
}
1734
}
1735
1736
void DeclContext::addHiddenDecl(Decl *D) {
1737
assert(D->getLexicalDeclContext() == this &&
1738
"Decl inserted into wrong lexical context");
1739
assert(!D->getNextDeclInContext() && D != LastDecl &&
1740
"Decl already inserted into a DeclContext");
1741
1742
if (FirstDecl) {
1743
LastDecl->NextInContextAndBits.setPointer(D);
1744
LastDecl = D;
1745
} else {
1746
FirstDecl = LastDecl = D;
1747
}
1748
1749
// Notify a C++ record declaration that we've added a member, so it can
1750
// update its class-specific state.
1751
if (auto *Record = dyn_cast<CXXRecordDecl>(this))
1752
Record->addedMember(D);
1753
1754
// If this is a newly-created (not de-serialized) import declaration, wire
1755
// it in to the list of local import declarations.
1756
if (!D->isFromASTFile()) {
1757
if (auto *Import = dyn_cast<ImportDecl>(D))
1758
D->getASTContext().addedLocalImportDecl(Import);
1759
}
1760
}
1761
1762
void DeclContext::addDecl(Decl *D) {
1763
addHiddenDecl(D);
1764
1765
if (auto *ND = dyn_cast<NamedDecl>(D))
1766
ND->getDeclContext()->getPrimaryContext()->
1767
makeDeclVisibleInContextWithFlags(ND, false, true);
1768
}
1769
1770
void DeclContext::addDeclInternal(Decl *D) {
1771
addHiddenDecl(D);
1772
1773
if (auto *ND = dyn_cast<NamedDecl>(D))
1774
ND->getDeclContext()->getPrimaryContext()->
1775
makeDeclVisibleInContextWithFlags(ND, true, true);
1776
}
1777
1778
/// buildLookup - Build the lookup data structure with all of the
1779
/// declarations in this DeclContext (and any other contexts linked
1780
/// to it or transparent contexts nested within it) and return it.
1781
///
1782
/// Note that the produced map may miss out declarations from an
1783
/// external source. If it does, those entries will be marked with
1784
/// the 'hasExternalDecls' flag.
1785
StoredDeclsMap *DeclContext::buildLookup() {
1786
assert(this == getPrimaryContext() && "buildLookup called on non-primary DC");
1787
1788
if (!hasLazyLocalLexicalLookups() &&
1789
!hasLazyExternalLexicalLookups())
1790
return LookupPtr;
1791
1792
SmallVector<DeclContext *, 2> Contexts;
1793
collectAllContexts(Contexts);
1794
1795
if (hasLazyExternalLexicalLookups()) {
1796
setHasLazyExternalLexicalLookups(false);
1797
for (auto *DC : Contexts) {
1798
if (DC->hasExternalLexicalStorage()) {
1799
bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1800
setHasLazyLocalLexicalLookups(
1801
hasLazyLocalLexicalLookups() | LoadedDecls );
1802
}
1803
}
1804
1805
if (!hasLazyLocalLexicalLookups())
1806
return LookupPtr;
1807
}
1808
1809
for (auto *DC : Contexts)
1810
buildLookupImpl(DC, hasExternalVisibleStorage());
1811
1812
// We no longer have any lazy decls.
1813
setHasLazyLocalLexicalLookups(false);
1814
return LookupPtr;
1815
}
1816
1817
/// buildLookupImpl - Build part of the lookup data structure for the
1818
/// declarations contained within DCtx, which will either be this
1819
/// DeclContext, a DeclContext linked to it, or a transparent context
1820
/// nested within it.
1821
void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) {
1822
for (auto *D : DCtx->noload_decls()) {
1823
// Insert this declaration into the lookup structure, but only if
1824
// it's semantically within its decl context. Any other decls which
1825
// should be found in this context are added eagerly.
1826
//
1827
// If it's from an AST file, don't add it now. It'll get handled by
1828
// FindExternalVisibleDeclsByName if needed. Exception: if we're not
1829
// in C++, we do not track external visible decls for the TU, so in
1830
// that case we need to collect them all here.
1831
if (auto *ND = dyn_cast<NamedDecl>(D))
1832
if (ND->getDeclContext() == DCtx && !shouldBeHidden(ND) &&
1833
(!ND->isFromASTFile() ||
1834
(isTranslationUnit() &&
1835
!getParentASTContext().getLangOpts().CPlusPlus)))
1836
makeDeclVisibleInContextImpl(ND, Internal);
1837
1838
// If this declaration is itself a transparent declaration context
1839
// or inline namespace, add the members of this declaration of that
1840
// context (recursively).
1841
if (auto *InnerCtx = dyn_cast<DeclContext>(D))
1842
if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1843
buildLookupImpl(InnerCtx, Internal);
1844
}
1845
}
1846
1847
DeclContext::lookup_result
1848
DeclContext::lookup(DeclarationName Name) const {
1849
// For transparent DeclContext, we should lookup in their enclosing context.
1850
if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export)
1851
return getParent()->lookup(Name);
1852
1853
const DeclContext *PrimaryContext = getPrimaryContext();
1854
if (PrimaryContext != this)
1855
return PrimaryContext->lookup(Name);
1856
1857
// If we have an external source, ensure that any later redeclarations of this
1858
// context have been loaded, since they may add names to the result of this
1859
// lookup (or add external visible storage).
1860
ExternalASTSource *Source = getParentASTContext().getExternalSource();
1861
if (Source)
1862
(void)cast<Decl>(this)->getMostRecentDecl();
1863
1864
if (hasExternalVisibleStorage()) {
1865
assert(Source && "external visible storage but no external source?");
1866
1867
if (hasNeedToReconcileExternalVisibleStorage())
1868
reconcileExternalVisibleStorage();
1869
1870
StoredDeclsMap *Map = LookupPtr;
1871
1872
if (hasLazyLocalLexicalLookups() ||
1873
hasLazyExternalLexicalLookups())
1874
// FIXME: Make buildLookup const?
1875
Map = const_cast<DeclContext*>(this)->buildLookup();
1876
1877
if (!Map)
1878
Map = CreateStoredDeclsMap(getParentASTContext());
1879
1880
// If we have a lookup result with no external decls, we are done.
1881
std::pair<StoredDeclsMap::iterator, bool> R =
1882
Map->insert(std::make_pair(Name, StoredDeclsList()));
1883
if (!R.second && !R.first->second.hasExternalDecls())
1884
return R.first->second.getLookupResult();
1885
1886
if (Source->FindExternalVisibleDeclsByName(this, Name) || !R.second) {
1887
if (StoredDeclsMap *Map = LookupPtr) {
1888
StoredDeclsMap::iterator I = Map->find(Name);
1889
if (I != Map->end())
1890
return I->second.getLookupResult();
1891
}
1892
}
1893
1894
return {};
1895
}
1896
1897
StoredDeclsMap *Map = LookupPtr;
1898
if (hasLazyLocalLexicalLookups() ||
1899
hasLazyExternalLexicalLookups())
1900
Map = const_cast<DeclContext*>(this)->buildLookup();
1901
1902
if (!Map)
1903
return {};
1904
1905
StoredDeclsMap::iterator I = Map->find(Name);
1906
if (I == Map->end())
1907
return {};
1908
1909
return I->second.getLookupResult();
1910
}
1911
1912
DeclContext::lookup_result
1913
DeclContext::noload_lookup(DeclarationName Name) {
1914
// For transparent DeclContext, we should lookup in their enclosing context.
1915
if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export)
1916
return getParent()->noload_lookup(Name);
1917
1918
DeclContext *PrimaryContext = getPrimaryContext();
1919
if (PrimaryContext != this)
1920
return PrimaryContext->noload_lookup(Name);
1921
1922
loadLazyLocalLexicalLookups();
1923
StoredDeclsMap *Map = LookupPtr;
1924
if (!Map)
1925
return {};
1926
1927
StoredDeclsMap::iterator I = Map->find(Name);
1928
return I != Map->end() ? I->second.getLookupResult()
1929
: lookup_result();
1930
}
1931
1932
// If we have any lazy lexical declarations not in our lookup map, add them
1933
// now. Don't import any external declarations, not even if we know we have
1934
// some missing from the external visible lookups.
1935
void DeclContext::loadLazyLocalLexicalLookups() {
1936
if (hasLazyLocalLexicalLookups()) {
1937
SmallVector<DeclContext *, 2> Contexts;
1938
collectAllContexts(Contexts);
1939
for (auto *Context : Contexts)
1940
buildLookupImpl(Context, hasExternalVisibleStorage());
1941
setHasLazyLocalLexicalLookups(false);
1942
}
1943
}
1944
1945
void DeclContext::localUncachedLookup(DeclarationName Name,
1946
SmallVectorImpl<NamedDecl *> &Results) {
1947
Results.clear();
1948
1949
// If there's no external storage, just perform a normal lookup and copy
1950
// the results.
1951
if (!hasExternalVisibleStorage() && !hasExternalLexicalStorage() && Name) {
1952
lookup_result LookupResults = lookup(Name);
1953
Results.insert(Results.end(), LookupResults.begin(), LookupResults.end());
1954
if (!Results.empty())
1955
return;
1956
}
1957
1958
// If we have a lookup table, check there first. Maybe we'll get lucky.
1959
// FIXME: Should we be checking these flags on the primary context?
1960
if (Name && !hasLazyLocalLexicalLookups() &&
1961
!hasLazyExternalLexicalLookups()) {
1962
if (StoredDeclsMap *Map = LookupPtr) {
1963
StoredDeclsMap::iterator Pos = Map->find(Name);
1964
if (Pos != Map->end()) {
1965
Results.insert(Results.end(),
1966
Pos->second.getLookupResult().begin(),
1967
Pos->second.getLookupResult().end());
1968
return;
1969
}
1970
}
1971
}
1972
1973
// Slow case: grovel through the declarations in our chain looking for
1974
// matches.
1975
// FIXME: If we have lazy external declarations, this will not find them!
1976
// FIXME: Should we CollectAllContexts and walk them all here?
1977
for (Decl *D = FirstDecl; D; D = D->getNextDeclInContext()) {
1978
if (auto *ND = dyn_cast<NamedDecl>(D))
1979
if (ND->getDeclName() == Name)
1980
Results.push_back(ND);
1981
}
1982
}
1983
1984
DeclContext *DeclContext::getRedeclContext() {
1985
DeclContext *Ctx = this;
1986
1987
// In C, a record type is the redeclaration context for its fields only. If
1988
// we arrive at a record context after skipping anything else, we should skip
1989
// the record as well. Currently, this means skipping enumerations because
1990
// they're the only transparent context that can exist within a struct or
1991
// union.
1992
bool SkipRecords = getDeclKind() == Decl::Kind::Enum &&
1993
!getParentASTContext().getLangOpts().CPlusPlus;
1994
1995
// Skip through contexts to get to the redeclaration context. Transparent
1996
// contexts are always skipped.
1997
while ((SkipRecords && Ctx->isRecord()) || Ctx->isTransparentContext())
1998
Ctx = Ctx->getParent();
1999
return Ctx;
2000
}
2001
2002
DeclContext *DeclContext::getEnclosingNamespaceContext() {
2003
DeclContext *Ctx = this;
2004
// Skip through non-namespace, non-translation-unit contexts.
2005
while (!Ctx->isFileContext())
2006
Ctx = Ctx->getParent();
2007
return Ctx->getPrimaryContext();
2008
}
2009
2010
RecordDecl *DeclContext::getOuterLexicalRecordContext() {
2011
// Loop until we find a non-record context.
2012
RecordDecl *OutermostRD = nullptr;
2013
DeclContext *DC = this;
2014
while (DC->isRecord()) {
2015
OutermostRD = cast<RecordDecl>(DC);
2016
DC = DC->getLexicalParent();
2017
}
2018
return OutermostRD;
2019
}
2020
2021
bool DeclContext::InEnclosingNamespaceSetOf(const DeclContext *O) const {
2022
// For non-file contexts, this is equivalent to Equals.
2023
if (!isFileContext())
2024
return O->Equals(this);
2025
2026
do {
2027
if (O->Equals(this))
2028
return true;
2029
2030
const auto *NS = dyn_cast<NamespaceDecl>(O);
2031
if (!NS || !NS->isInline())
2032
break;
2033
O = NS->getParent();
2034
} while (O);
2035
2036
return false;
2037
}
2038
2039
void DeclContext::makeDeclVisibleInContext(NamedDecl *D) {
2040
DeclContext *PrimaryDC = this->getPrimaryContext();
2041
DeclContext *DeclDC = D->getDeclContext()->getPrimaryContext();
2042
// If the decl is being added outside of its semantic decl context, we
2043
// need to ensure that we eagerly build the lookup information for it.
2044
PrimaryDC->makeDeclVisibleInContextWithFlags(D, false, PrimaryDC == DeclDC);
2045
}
2046
2047
void DeclContext::makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal,
2048
bool Recoverable) {
2049
assert(this == getPrimaryContext() && "expected a primary DC");
2050
2051
if (!isLookupContext()) {
2052
if (isTransparentContext())
2053
getParent()->getPrimaryContext()
2054
->makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
2055
return;
2056
}
2057
2058
// Skip declarations which should be invisible to name lookup.
2059
if (shouldBeHidden(D))
2060
return;
2061
2062
// If we already have a lookup data structure, perform the insertion into
2063
// it. If we might have externally-stored decls with this name, look them
2064
// up and perform the insertion. If this decl was declared outside its
2065
// semantic context, buildLookup won't add it, so add it now.
2066
//
2067
// FIXME: As a performance hack, don't add such decls into the translation
2068
// unit unless we're in C++, since qualified lookup into the TU is never
2069
// performed.
2070
if (LookupPtr || hasExternalVisibleStorage() ||
2071
((!Recoverable || D->getDeclContext() != D->getLexicalDeclContext()) &&
2072
(getParentASTContext().getLangOpts().CPlusPlus ||
2073
!isTranslationUnit()))) {
2074
// If we have lazily omitted any decls, they might have the same name as
2075
// the decl which we are adding, so build a full lookup table before adding
2076
// this decl.
2077
buildLookup();
2078
makeDeclVisibleInContextImpl(D, Internal);
2079
} else {
2080
setHasLazyLocalLexicalLookups(true);
2081
}
2082
2083
// If we are a transparent context or inline namespace, insert into our
2084
// parent context, too. This operation is recursive.
2085
if (isTransparentContext() || isInlineNamespace())
2086
getParent()->getPrimaryContext()->
2087
makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
2088
2089
auto *DCAsDecl = cast<Decl>(this);
2090
// Notify that a decl was made visible unless we are a Tag being defined.
2091
if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
2092
if (ASTMutationListener *L = DCAsDecl->getASTMutationListener())
2093
L->AddedVisibleDecl(this, D);
2094
}
2095
2096
void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) {
2097
// Find or create the stored declaration map.
2098
StoredDeclsMap *Map = LookupPtr;
2099
if (!Map) {
2100
ASTContext *C = &getParentASTContext();
2101
Map = CreateStoredDeclsMap(*C);
2102
}
2103
2104
// If there is an external AST source, load any declarations it knows about
2105
// with this declaration's name.
2106
// If the lookup table contains an entry about this name it means that we
2107
// have already checked the external source.
2108
if (!Internal)
2109
if (ExternalASTSource *Source = getParentASTContext().getExternalSource())
2110
if (hasExternalVisibleStorage() &&
2111
Map->find(D->getDeclName()) == Map->end())
2112
Source->FindExternalVisibleDeclsByName(this, D->getDeclName());
2113
2114
// Insert this declaration into the map.
2115
StoredDeclsList &DeclNameEntries = (*Map)[D->getDeclName()];
2116
2117
if (Internal) {
2118
// If this is being added as part of loading an external declaration,
2119
// this may not be the only external declaration with this name.
2120
// In this case, we never try to replace an existing declaration; we'll
2121
// handle that when we finalize the list of declarations for this name.
2122
DeclNameEntries.setHasExternalDecls();
2123
DeclNameEntries.prependDeclNoReplace(D);
2124
return;
2125
}
2126
2127
DeclNameEntries.addOrReplaceDecl(D);
2128
}
2129
2130
UsingDirectiveDecl *DeclContext::udir_iterator::operator*() const {
2131
return cast<UsingDirectiveDecl>(*I);
2132
}
2133
2134
/// Returns iterator range [First, Last) of UsingDirectiveDecls stored within
2135
/// this context.
2136
DeclContext::udir_range DeclContext::using_directives() const {
2137
// FIXME: Use something more efficient than normal lookup for using
2138
// directives. In C++, using directives are looked up more than anything else.
2139
lookup_result Result = lookup(UsingDirectiveDecl::getName());
2140
return udir_range(Result.begin(), Result.end());
2141
}
2142
2143
//===----------------------------------------------------------------------===//
2144
// Creation and Destruction of StoredDeclsMaps. //
2145
//===----------------------------------------------------------------------===//
2146
2147
StoredDeclsMap *DeclContext::CreateStoredDeclsMap(ASTContext &C) const {
2148
assert(!LookupPtr && "context already has a decls map");
2149
assert(getPrimaryContext() == this &&
2150
"creating decls map on non-primary context");
2151
2152
StoredDeclsMap *M;
2153
bool Dependent = isDependentContext();
2154
if (Dependent)
2155
M = new DependentStoredDeclsMap();
2156
else
2157
M = new StoredDeclsMap();
2158
M->Previous = C.LastSDM;
2159
C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M, Dependent);
2160
LookupPtr = M;
2161
return M;
2162
}
2163
2164
void ASTContext::ReleaseDeclContextMaps() {
2165
// It's okay to delete DependentStoredDeclsMaps via a StoredDeclsMap
2166
// pointer because the subclass doesn't add anything that needs to
2167
// be deleted.
2168
StoredDeclsMap::DestroyAll(LastSDM.getPointer(), LastSDM.getInt());
2169
LastSDM.setPointer(nullptr);
2170
}
2171
2172
void StoredDeclsMap::DestroyAll(StoredDeclsMap *Map, bool Dependent) {
2173
while (Map) {
2174
// Advance the iteration before we invalidate memory.
2175
llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
2176
2177
if (Dependent)
2178
delete static_cast<DependentStoredDeclsMap*>(Map);
2179
else
2180
delete Map;
2181
2182
Map = Next.getPointer();
2183
Dependent = Next.getInt();
2184
}
2185
}
2186
2187
DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C,
2188
DeclContext *Parent,
2189
const PartialDiagnostic &PDiag) {
2190
assert(Parent->isDependentContext()
2191
&& "cannot iterate dependent diagnostics of non-dependent context");
2192
Parent = Parent->getPrimaryContext();
2193
if (!Parent->LookupPtr)
2194
Parent->CreateStoredDeclsMap(C);
2195
2196
auto *Map = static_cast<DependentStoredDeclsMap *>(Parent->LookupPtr);
2197
2198
// Allocate the copy of the PartialDiagnostic via the ASTContext's
2199
// BumpPtrAllocator, rather than the ASTContext itself.
2200
DiagnosticStorage *DiagStorage = nullptr;
2201
if (PDiag.hasStorage())
2202
DiagStorage = new (C) DiagnosticStorage;
2203
2204
auto *DD = new (C) DependentDiagnostic(PDiag, DiagStorage);
2205
2206
// TODO: Maybe we shouldn't reverse the order during insertion.
2207
DD->NextDiagnostic = Map->FirstDiagnostic;
2208
Map->FirstDiagnostic = DD;
2209
2210
return DD;
2211
}
2212
2213
unsigned DeclIDBase::getLocalDeclIndex() const {
2214
return ID & llvm::maskTrailingOnes<DeclID>(32);
2215
}
2216
2217