clang 20.0.0git
Decl.cpp
Go to the documentation of this file.
1//===- Decl.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 subclasses.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/AST/Decl.h"
14#include "Linkage.h"
17#include "clang/AST/ASTLambda.h"
19#include "clang/AST/Attr.h"
21#include "clang/AST/DeclBase.h"
22#include "clang/AST/DeclCXX.h"
23#include "clang/AST/DeclObjC.h"
27#include "clang/AST/Expr.h"
28#include "clang/AST/ExprCXX.h"
30#include "clang/AST/ODRHash.h"
36#include "clang/AST/Stmt.h"
38#include "clang/AST/Type.h"
39#include "clang/AST/TypeLoc.h"
42#include "clang/Basic/LLVM.h"
44#include "clang/Basic/Linkage.h"
45#include "clang/Basic/Module.h"
55#include "llvm/ADT/APSInt.h"
56#include "llvm/ADT/ArrayRef.h"
57#include "llvm/ADT/STLExtras.h"
58#include "llvm/ADT/SmallVector.h"
59#include "llvm/ADT/StringRef.h"
60#include "llvm/ADT/StringSwitch.h"
61#include "llvm/Support/Casting.h"
62#include "llvm/Support/ErrorHandling.h"
63#include "llvm/Support/raw_ostream.h"
64#include "llvm/TargetParser/Triple.h"
65#include <algorithm>
66#include <cassert>
67#include <cstddef>
68#include <cstring>
69#include <memory>
70#include <optional>
71#include <string>
72#include <tuple>
73#include <type_traits>
74
75using namespace clang;
76
79}
80
81void PrettyDeclStackTraceEntry::print(raw_ostream &OS) const {
82 SourceLocation Loc = this->Loc;
83 if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation();
84 if (Loc.isValid()) {
85 Loc.print(OS, Context.getSourceManager());
86 OS << ": ";
87 }
88 OS << Message;
89
90 if (auto *ND = dyn_cast_if_present<NamedDecl>(TheDecl)) {
91 OS << " '";
92 ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), true);
93 OS << "'";
94 }
95
96 OS << '\n';
97}
98
99// Defined here so that it can be inlined into its direct callers.
100bool Decl::isOutOfLine() const {
102}
103
104TranslationUnitDecl::TranslationUnitDecl(ASTContext &ctx)
105 : Decl(TranslationUnit, nullptr, SourceLocation()),
106 DeclContext(TranslationUnit), redeclarable_base(ctx), Ctx(ctx) {}
107
108//===----------------------------------------------------------------------===//
109// NamedDecl Implementation
110//===----------------------------------------------------------------------===//
111
112// Visibility rules aren't rigorously externally specified, but here
113// are the basic principles behind what we implement:
114//
115// 1. An explicit visibility attribute is generally a direct expression
116// of the user's intent and should be honored. Only the innermost
117// visibility attribute applies. If no visibility attribute applies,
118// global visibility settings are considered.
119//
120// 2. There is one caveat to the above: on or in a template pattern,
121// an explicit visibility attribute is just a default rule, and
122// visibility can be decreased by the visibility of template
123// arguments. But this, too, has an exception: an attribute on an
124// explicit specialization or instantiation causes all the visibility
125// restrictions of the template arguments to be ignored.
126//
127// 3. A variable that does not otherwise have explicit visibility can
128// be restricted by the visibility of its type.
129//
130// 4. A visibility restriction is explicit if it comes from an
131// attribute (or something like it), not a global visibility setting.
132// When emitting a reference to an external symbol, visibility
133// restrictions are ignored unless they are explicit.
134//
135// 5. When computing the visibility of a non-type, including a
136// non-type member of a class, only non-type visibility restrictions
137// are considered: the 'visibility' attribute, global value-visibility
138// settings, and a few special cases like __private_extern.
139//
140// 6. When computing the visibility of a type, including a type member
141// of a class, only type visibility restrictions are considered:
142// the 'type_visibility' attribute and global type-visibility settings.
143// However, a 'visibility' attribute counts as a 'type_visibility'
144// attribute on any declaration that only has the former.
145//
146// The visibility of a "secondary" entity, like a template argument,
147// is computed using the kind of that entity, not the kind of the
148// primary entity for which we are computing visibility. For example,
149// the visibility of a specialization of either of these templates:
150// template <class T, bool (&compare)(T, X)> bool has_match(list<T>, X);
151// template <class T, bool (&compare)(T, X)> class matcher;
152// is restricted according to the type visibility of the argument 'T',
153// the type visibility of 'bool(&)(T,X)', and the value visibility of
154// the argument function 'compare'. That 'has_match' is a value
155// and 'matcher' is a type only matters when looking for attributes
156// and settings from the immediate context.
157
158/// Does this computation kind permit us to consider additional
159/// visibility settings from attributes and the like?
161 return computation.IgnoreExplicitVisibility;
162}
163
164/// Given an LVComputationKind, return one of the same type/value sort
165/// that records that it already has explicit visibility.
168 Kind.IgnoreExplicitVisibility = true;
169 return Kind;
170}
171
172static std::optional<Visibility> getExplicitVisibility(const NamedDecl *D,
173 LVComputationKind kind) {
174 assert(!kind.IgnoreExplicitVisibility &&
175 "asking for explicit visibility when we shouldn't be");
176 return D->getExplicitVisibility(kind.getExplicitVisibilityKind());
177}
178
179/// Is the given declaration a "type" or a "value" for the purposes of
180/// visibility computation?
181static bool usesTypeVisibility(const NamedDecl *D) {
182 return isa<TypeDecl>(D) ||
183 isa<ClassTemplateDecl>(D) ||
184 isa<ObjCInterfaceDecl>(D);
185}
186
187/// Does the given declaration have member specialization information,
188/// and if so, is it an explicit specialization?
189template <class T>
190static std::enable_if_t<!std::is_base_of_v<RedeclarableTemplateDecl, T>, bool>
192 if (const MemberSpecializationInfo *member =
193 D->getMemberSpecializationInfo()) {
194 return member->isExplicitSpecialization();
195 }
196 return false;
197}
198
199/// For templates, this question is easier: a member template can't be
200/// explicitly instantiated, so there's a single bit indicating whether
201/// or not this is an explicit member specialization.
203 return D->isMemberSpecialization();
204}
205
206/// Given a visibility attribute, return the explicit visibility
207/// associated with it.
208template <class T>
209static Visibility getVisibilityFromAttr(const T *attr) {
210 switch (attr->getVisibility()) {
211 case T::Default:
212 return DefaultVisibility;
213 case T::Hidden:
214 return HiddenVisibility;
215 case T::Protected:
216 return ProtectedVisibility;
217 }
218 llvm_unreachable("bad visibility kind");
219}
220
221/// Return the explicit visibility of the given declaration.
222static std::optional<Visibility>
224 // If we're ultimately computing the visibility of a type, look for
225 // a 'type_visibility' attribute before looking for 'visibility'.
226 if (kind == NamedDecl::VisibilityForType) {
227 if (const auto *A = D->getAttr<TypeVisibilityAttr>()) {
228 return getVisibilityFromAttr(A);
229 }
230 }
231
232 // If this declaration has an explicit visibility attribute, use it.
233 if (const auto *A = D->getAttr<VisibilityAttr>()) {
234 return getVisibilityFromAttr(A);
235 }
236
237 return std::nullopt;
238}
239
240LinkageInfo LinkageComputer::getLVForType(const Type &T,
241 LVComputationKind computation) {
242 if (computation.IgnoreAllVisibility)
243 return LinkageInfo(T.getLinkage(), DefaultVisibility, true);
245}
246
247/// Get the most restrictive linkage for the types in the given
248/// template parameter list. For visibility purposes, template
249/// parameters are part of the signature of a template.
250LinkageInfo LinkageComputer::getLVForTemplateParameterList(
251 const TemplateParameterList *Params, LVComputationKind computation) {
252 LinkageInfo LV;
253 for (const NamedDecl *P : *Params) {
254 // Template type parameters are the most common and never
255 // contribute to visibility, pack or not.
256 if (isa<TemplateTypeParmDecl>(P))
257 continue;
258
259 // Non-type template parameters can be restricted by the value type, e.g.
260 // template <enum X> class A { ... };
261 // We have to be careful here, though, because we can be dealing with
262 // dependent types.
263 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) {
264 // Handle the non-pack case first.
265 if (!NTTP->isExpandedParameterPack()) {
266 if (!NTTP->getType()->isDependentType()) {
267 LV.merge(getLVForType(*NTTP->getType(), computation));
268 }
269 continue;
270 }
271
272 // Look at all the types in an expanded pack.
273 for (unsigned i = 0, n = NTTP->getNumExpansionTypes(); i != n; ++i) {
274 QualType type = NTTP->getExpansionType(i);
275 if (!type->isDependentType())
277 }
278 continue;
279 }
280
281 // Template template parameters can be restricted by their
282 // template parameters, recursively.
283 const auto *TTP = cast<TemplateTemplateParmDecl>(P);
284
285 // Handle the non-pack case first.
286 if (!TTP->isExpandedParameterPack()) {
287 LV.merge(getLVForTemplateParameterList(TTP->getTemplateParameters(),
288 computation));
289 continue;
290 }
291
292 // Look at all expansions in an expanded pack.
293 for (unsigned i = 0, n = TTP->getNumExpansionTemplateParameters();
294 i != n; ++i) {
295 LV.merge(getLVForTemplateParameterList(
296 TTP->getExpansionTemplateParameters(i), computation));
297 }
298 }
299
300 return LV;
301}
302
304 const Decl *Ret = nullptr;
305 const DeclContext *DC = D->getDeclContext();
306 while (DC->getDeclKind() != Decl::TranslationUnit) {
307 if (isa<FunctionDecl>(DC) || isa<BlockDecl>(DC))
308 Ret = cast<Decl>(DC);
309 DC = DC->getParent();
310 }
311 return Ret;
312}
313
314/// Get the most restrictive linkage for the types and
315/// declarations in the given template argument list.
316///
317/// Note that we don't take an LVComputationKind because we always
318/// want to honor the visibility of template arguments in the same way.
320LinkageComputer::getLVForTemplateArgumentList(ArrayRef<TemplateArgument> Args,
321 LVComputationKind computation) {
322 LinkageInfo LV;
323
324 for (const TemplateArgument &Arg : Args) {
325 switch (Arg.getKind()) {
329 continue;
330
332 LV.merge(getLVForType(*Arg.getAsType(), computation));
333 continue;
334
336 const NamedDecl *ND = Arg.getAsDecl();
337 assert(!usesTypeVisibility(ND));
338 LV.merge(getLVForDecl(ND, computation));
339 continue;
340 }
341
343 LV.merge(getTypeLinkageAndVisibility(Arg.getNullPtrType()));
344 continue;
345
347 LV.merge(getLVForValue(Arg.getAsStructuralValue(), computation));
348 continue;
349
352 if (TemplateDecl *Template =
353 Arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl())
354 LV.merge(getLVForDecl(Template, computation));
355 continue;
356
358 LV.merge(getLVForTemplateArgumentList(Arg.getPackAsArray(), computation));
359 continue;
360 }
361 llvm_unreachable("bad template argument kind");
362 }
363
364 return LV;
365}
366
368LinkageComputer::getLVForTemplateArgumentList(const TemplateArgumentList &TArgs,
369 LVComputationKind computation) {
370 return getLVForTemplateArgumentList(TArgs.asArray(), computation);
371}
372
374 const FunctionTemplateSpecializationInfo *specInfo) {
375 // Include visibility from the template parameters and arguments
376 // only if this is not an explicit instantiation or specialization
377 // with direct explicit visibility. (Implicit instantiations won't
378 // have a direct attribute.)
380 return true;
381
382 return !fn->hasAttr<VisibilityAttr>();
383}
384
385/// Merge in template-related linkage and visibility for the given
386/// function template specialization.
387///
388/// We don't need a computation kind here because we can assume
389/// LVForValue.
390///
391/// \param[out] LV the computation to use for the parent
392void LinkageComputer::mergeTemplateLV(
393 LinkageInfo &LV, const FunctionDecl *fn,
395 LVComputationKind computation) {
396 bool considerVisibility =
398
399 FunctionTemplateDecl *temp = specInfo->getTemplate();
400 // Merge information from the template declaration.
401 LinkageInfo tempLV = getLVForDecl(temp, computation);
402 // The linkage of the specialization should be consistent with the
403 // template declaration.
404 LV.setLinkage(tempLV.getLinkage());
405
406 // Merge information from the template parameters.
407 LinkageInfo paramsLV =
408 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
409 LV.mergeMaybeWithVisibility(paramsLV, considerVisibility);
410
411 // Merge information from the template arguments.
412 const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments;
413 LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation);
414 LV.mergeMaybeWithVisibility(argsLV, considerVisibility);
415}
416
417/// Does the given declaration have a direct visibility attribute
418/// that would match the given rules?
420 LVComputationKind computation) {
421 if (computation.IgnoreAllVisibility)
422 return false;
423
424 return (computation.isTypeVisibility() && D->hasAttr<TypeVisibilityAttr>()) ||
425 D->hasAttr<VisibilityAttr>();
426}
427
428/// Should we consider visibility associated with the template
429/// arguments and parameters of the given class template specialization?
432 LVComputationKind computation) {
433 // Include visibility from the template parameters and arguments
434 // only if this is not an explicit instantiation or specialization
435 // with direct explicit visibility (and note that implicit
436 // instantiations won't have a direct attribute).
437 //
438 // Furthermore, we want to ignore template parameters and arguments
439 // for an explicit specialization when computing the visibility of a
440 // member thereof with explicit visibility.
441 //
442 // This is a bit complex; let's unpack it.
443 //
444 // An explicit class specialization is an independent, top-level
445 // declaration. As such, if it or any of its members has an
446 // explicit visibility attribute, that must directly express the
447 // user's intent, and we should honor it. The same logic applies to
448 // an explicit instantiation of a member of such a thing.
449
450 // Fast path: if this is not an explicit instantiation or
451 // specialization, we always want to consider template-related
452 // visibility restrictions.
454 return true;
455
456 // This is the 'member thereof' check.
457 if (spec->isExplicitSpecialization() &&
458 hasExplicitVisibilityAlready(computation))
459 return false;
460
461 return !hasDirectVisibilityAttribute(spec, computation);
462}
463
464/// Merge in template-related linkage and visibility for the given
465/// class template specialization.
466void LinkageComputer::mergeTemplateLV(
468 LVComputationKind computation) {
469 bool considerVisibility = shouldConsiderTemplateVisibility(spec, computation);
470
471 // Merge information from the template parameters, but ignore
472 // visibility if we're only considering template arguments.
474 // Merge information from the template declaration.
475 LinkageInfo tempLV = getLVForDecl(temp, computation);
476 // The linkage of the specialization should be consistent with the
477 // template declaration.
478 LV.setLinkage(tempLV.getLinkage());
479
480 LinkageInfo paramsLV =
481 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
482 LV.mergeMaybeWithVisibility(paramsLV,
483 considerVisibility && !hasExplicitVisibilityAlready(computation));
484
485 // Merge information from the template arguments. We ignore
486 // template-argument visibility if we've got an explicit
487 // instantiation with a visibility attribute.
488 const TemplateArgumentList &templateArgs = spec->getTemplateArgs();
489 LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation);
490 if (considerVisibility)
491 LV.mergeVisibility(argsLV);
492 LV.mergeExternalVisibility(argsLV);
493}
494
495/// Should we consider visibility associated with the template
496/// arguments and parameters of the given variable template
497/// specialization? As usual, follow class template specialization
498/// logic up to initialization.
501 LVComputationKind computation) {
502 // Include visibility from the template parameters and arguments
503 // only if this is not an explicit instantiation or specialization
504 // with direct explicit visibility (and note that implicit
505 // instantiations won't have a direct attribute).
507 return true;
508
509 // An explicit variable specialization is an independent, top-level
510 // declaration. As such, if it has an explicit visibility attribute,
511 // that must directly express the user's intent, and we should honor
512 // it.
513 if (spec->isExplicitSpecialization() &&
514 hasExplicitVisibilityAlready(computation))
515 return false;
516
517 return !hasDirectVisibilityAttribute(spec, computation);
518}
519
520/// Merge in template-related linkage and visibility for the given
521/// variable template specialization. As usual, follow class template
522/// specialization logic up to initialization.
523void LinkageComputer::mergeTemplateLV(LinkageInfo &LV,
525 LVComputationKind computation) {
526 bool considerVisibility = shouldConsiderTemplateVisibility(spec, computation);
527
528 // Merge information from the template parameters, but ignore
529 // visibility if we're only considering template arguments.
531 LinkageInfo tempLV =
532 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
533 LV.mergeMaybeWithVisibility(tempLV,
534 considerVisibility && !hasExplicitVisibilityAlready(computation));
535
536 // Merge information from the template arguments. We ignore
537 // template-argument visibility if we've got an explicit
538 // instantiation with a visibility attribute.
539 const TemplateArgumentList &templateArgs = spec->getTemplateArgs();
540 LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation);
541 if (considerVisibility)
542 LV.mergeVisibility(argsLV);
543 LV.mergeExternalVisibility(argsLV);
544}
545
547 // FIXME: we should warn if -fvisibility-inlines-hidden is used with c.
548 const LangOptions &Opts = D->getASTContext().getLangOpts();
549 if (!Opts.CPlusPlus || !Opts.InlineVisibilityHidden)
550 return false;
551
552 const auto *FD = dyn_cast<FunctionDecl>(D);
553 if (!FD)
554 return false;
555
558 = FD->getTemplateSpecializationInfo()) {
559 TSK = spec->getTemplateSpecializationKind();
560 } else if (MemberSpecializationInfo *MSI =
561 FD->getMemberSpecializationInfo()) {
562 TSK = MSI->getTemplateSpecializationKind();
563 }
564
565 const FunctionDecl *Def = nullptr;
566 // InlineVisibilityHidden only applies to definitions, and
567 // isInlined() only gives meaningful answers on definitions
568 // anyway.
571 FD->hasBody(Def) && Def->isInlined() && !Def->hasAttr<GNUInlineAttr>();
572}
573
574template <typename T> static bool isFirstInExternCContext(T *D) {
575 const T *First = D->getFirstDecl();
576 return First->isInExternCContext();
577}
578
579static bool isSingleLineLanguageLinkage(const Decl &D) {
580 if (const auto *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext()))
581 if (!SD->hasBraces())
582 return true;
583 return false;
584}
585
587 return LinkageInfo::external();
588}
589
591 if (auto *TD = dyn_cast<TemplateDecl>(D))
592 D = TD->getTemplatedDecl();
593 if (D) {
594 if (auto *VD = dyn_cast<VarDecl>(D))
595 return VD->getStorageClass();
596 if (auto *FD = dyn_cast<FunctionDecl>(D))
597 return FD->getStorageClass();
598 }
599 return SC_None;
600}
601
603LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D,
604 LVComputationKind computation,
605 bool IgnoreVarTypeLinkage) {
607 "Not a name having namespace scope");
608 ASTContext &Context = D->getASTContext();
609 const auto *Var = dyn_cast<VarDecl>(D);
610
611 // C++ [basic.link]p3:
612 // A name having namespace scope (3.3.6) has internal linkage if it
613 // is the name of
614
616 (Context.getLangOpts().C23 && Var && Var->isConstexpr())) {
617 // - a variable, variable template, function, or function template
618 // that is explicitly declared static; or
619 // (This bullet corresponds to C99 6.2.2p3.)
620
621 // C23 6.2.2p3
622 // If the declaration of a file scope identifier for
623 // an object contains any of the storage-class specifiers static or
624 // constexpr then the identifier has internal linkage.
625 return LinkageInfo::internal();
626 }
627
628 if (Var) {
629 // - a non-template variable of non-volatile const-qualified type, unless
630 // - it is explicitly declared extern, or
631 // - it is declared in the purview of a module interface unit
632 // (outside the private-module-fragment, if any) or module partition, or
633 // - it is inline, or
634 // - it was previously declared and the prior declaration did not have
635 // internal linkage
636 // (There is no equivalent in C99.)
637 if (Context.getLangOpts().CPlusPlus && Var->getType().isConstQualified() &&
638 !Var->getType().isVolatileQualified() && !Var->isInline() &&
639 ![Var]() {
640 // Check if it is module purview except private module fragment
641 // and implementation unit.
642 if (auto *M = Var->getOwningModule())
643 return M->isInterfaceOrPartition() || M->isImplicitGlobalModule();
644 return false;
645 }() &&
646 !isa<VarTemplateSpecializationDecl>(Var) &&
647 !Var->getDescribedVarTemplate()) {
648 const VarDecl *PrevVar = Var->getPreviousDecl();
649 if (PrevVar)
650 return getLVForDecl(PrevVar, computation);
651
652 if (Var->getStorageClass() != SC_Extern &&
653 Var->getStorageClass() != SC_PrivateExtern &&
655 return LinkageInfo::internal();
656 }
657
658 for (const VarDecl *PrevVar = Var->getPreviousDecl(); PrevVar;
659 PrevVar = PrevVar->getPreviousDecl()) {
660 if (PrevVar->getStorageClass() == SC_PrivateExtern &&
661 Var->getStorageClass() == SC_None)
662 return getDeclLinkageAndVisibility(PrevVar);
663 // Explicitly declared static.
664 if (PrevVar->getStorageClass() == SC_Static)
665 return LinkageInfo::internal();
666 }
667 } else if (const auto *IFD = dyn_cast<IndirectFieldDecl>(D)) {
668 // - a data member of an anonymous union.
669 const VarDecl *VD = IFD->getVarDecl();
670 assert(VD && "Expected a VarDecl in this IndirectFieldDecl!");
671 return getLVForNamespaceScopeDecl(VD, computation, IgnoreVarTypeLinkage);
672 }
673 assert(!isa<FieldDecl>(D) && "Didn't expect a FieldDecl!");
674
675 // FIXME: This gives internal linkage to names that should have no linkage
676 // (those not covered by [basic.link]p6).
677 if (D->isInAnonymousNamespace()) {
678 const auto *Var = dyn_cast<VarDecl>(D);
679 const auto *Func = dyn_cast<FunctionDecl>(D);
680 // FIXME: The check for extern "C" here is not justified by the standard
681 // wording, but we retain it from the pre-DR1113 model to avoid breaking
682 // code.
683 //
684 // C++11 [basic.link]p4:
685 // An unnamed namespace or a namespace declared directly or indirectly
686 // within an unnamed namespace has internal linkage.
687 if ((!Var || !isFirstInExternCContext(Var)) &&
689 return LinkageInfo::internal();
690 }
691
692 // Set up the defaults.
693
694 // C99 6.2.2p5:
695 // If the declaration of an identifier for an object has file
696 // scope and no storage-class specifier, its linkage is
697 // external.
699
700 if (!hasExplicitVisibilityAlready(computation)) {
701 if (std::optional<Visibility> Vis = getExplicitVisibility(D, computation)) {
702 LV.mergeVisibility(*Vis, true);
703 } else {
704 // If we're declared in a namespace with a visibility attribute,
705 // use that namespace's visibility, and it still counts as explicit.
706 for (const DeclContext *DC = D->getDeclContext();
707 !isa<TranslationUnitDecl>(DC);
708 DC = DC->getParent()) {
709 const auto *ND = dyn_cast<NamespaceDecl>(DC);
710 if (!ND) continue;
711 if (std::optional<Visibility> Vis =
712 getExplicitVisibility(ND, computation)) {
713 LV.mergeVisibility(*Vis, true);
714 break;
715 }
716 }
717 }
718
719 // Add in global settings if the above didn't give us direct visibility.
720 if (!LV.isVisibilityExplicit()) {
721 // Use global type/value visibility as appropriate.
722 Visibility globalVisibility =
723 computation.isValueVisibility()
724 ? Context.getLangOpts().getValueVisibilityMode()
725 : Context.getLangOpts().getTypeVisibilityMode();
726 LV.mergeVisibility(globalVisibility, /*explicit*/ false);
727
728 // If we're paying attention to global visibility, apply
729 // -finline-visibility-hidden if this is an inline method.
731 LV.mergeVisibility(HiddenVisibility, /*visibilityExplicit=*/false);
732 }
733 }
734
735 // C++ [basic.link]p4:
736
737 // A name having namespace scope that has not been given internal linkage
738 // above and that is the name of
739 // [...bullets...]
740 // has its linkage determined as follows:
741 // - if the enclosing namespace has internal linkage, the name has
742 // internal linkage; [handled above]
743 // - otherwise, if the declaration of the name is attached to a named
744 // module and is not exported, the name has module linkage;
745 // - otherwise, the name has external linkage.
746 // LV is currently set up to handle the last two bullets.
747 //
748 // The bullets are:
749
750 // - a variable; or
751 if (const auto *Var = dyn_cast<VarDecl>(D)) {
752 // GCC applies the following optimization to variables and static
753 // data members, but not to functions:
754 //
755 // Modify the variable's LV by the LV of its type unless this is
756 // C or extern "C". This follows from [basic.link]p9:
757 // A type without linkage shall not be used as the type of a
758 // variable or function with external linkage unless
759 // - the entity has C language linkage, or
760 // - the entity is declared within an unnamed namespace, or
761 // - the entity is not used or is defined in the same
762 // translation unit.
763 // and [basic.link]p10:
764 // ...the types specified by all declarations referring to a
765 // given variable or function shall be identical...
766 // C does not have an equivalent rule.
767 //
768 // Ignore this if we've got an explicit attribute; the user
769 // probably knows what they're doing.
770 //
771 // Note that we don't want to make the variable non-external
772 // because of this, but unique-external linkage suits us.
773
774 if (Context.getLangOpts().CPlusPlus && !isFirstInExternCContext(Var) &&
775 !IgnoreVarTypeLinkage) {
776 LinkageInfo TypeLV = getLVForType(*Var->getType(), computation);
777 if (!isExternallyVisible(TypeLV.getLinkage()))
779 if (!LV.isVisibilityExplicit())
780 LV.mergeVisibility(TypeLV);
781 }
782
783 if (Var->getStorageClass() == SC_PrivateExtern)
785
786 // Note that Sema::MergeVarDecl already takes care of implementing
787 // C99 6.2.2p4 and propagating the visibility attribute, so we don't have
788 // to do it here.
789
790 // As per function and class template specializations (below),
791 // consider LV for the template and template arguments. We're at file
792 // scope, so we do not need to worry about nested specializations.
793 if (const auto *spec = dyn_cast<VarTemplateSpecializationDecl>(Var)) {
794 mergeTemplateLV(LV, spec, computation);
795 }
796
797 // - a function; or
798 } else if (const auto *Function = dyn_cast<FunctionDecl>(D)) {
799 // In theory, we can modify the function's LV by the LV of its
800 // type unless it has C linkage (see comment above about variables
801 // for justification). In practice, GCC doesn't do this, so it's
802 // just too painful to make work.
803
804 if (Function->getStorageClass() == SC_PrivateExtern)
806
807 // OpenMP target declare device functions are not callable from the host so
808 // they should not be exported from the device image. This applies to all
809 // functions as the host-callable kernel functions are emitted at codegen.
810 if (Context.getLangOpts().OpenMP &&
811 Context.getLangOpts().OpenMPIsTargetDevice &&
812 ((Context.getTargetInfo().getTriple().isAMDGPU() ||
813 Context.getTargetInfo().getTriple().isNVPTX()) ||
814 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Function)))
815 LV.mergeVisibility(HiddenVisibility, /*newExplicit=*/false);
816
817 // Note that Sema::MergeCompatibleFunctionDecls already takes care of
818 // merging storage classes and visibility attributes, so we don't have to
819 // look at previous decls in here.
820
821 // In C++, then if the type of the function uses a type with
822 // unique-external linkage, it's not legally usable from outside
823 // this translation unit. However, we should use the C linkage
824 // rules instead for extern "C" declarations.
825 if (Context.getLangOpts().CPlusPlus && !isFirstInExternCContext(Function)) {
826 // Only look at the type-as-written. Otherwise, deducing the return type
827 // of a function could change its linkage.
828 QualType TypeAsWritten = Function->getType();
829 if (TypeSourceInfo *TSI = Function->getTypeSourceInfo())
830 TypeAsWritten = TSI->getType();
831 if (!isExternallyVisible(TypeAsWritten->getLinkage()))
833 }
834
835 // Consider LV from the template and the template arguments.
836 // We're at file scope, so we do not need to worry about nested
837 // specializations.
839 = Function->getTemplateSpecializationInfo()) {
840 mergeTemplateLV(LV, Function, specInfo, computation);
841 }
842
843 // - a named class (Clause 9), or an unnamed class defined in a
844 // typedef declaration in which the class has the typedef name
845 // for linkage purposes (7.1.3); or
846 // - a named enumeration (7.2), or an unnamed enumeration
847 // defined in a typedef declaration in which the enumeration
848 // has the typedef name for linkage purposes (7.1.3); or
849 } else if (const auto *Tag = dyn_cast<TagDecl>(D)) {
850 // Unnamed tags have no linkage.
851 if (!Tag->hasNameForLinkage())
852 return LinkageInfo::none();
853
854 // If this is a class template specialization, consider the
855 // linkage of the template and template arguments. We're at file
856 // scope, so we do not need to worry about nested specializations.
857 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(Tag)) {
858 mergeTemplateLV(LV, spec, computation);
859 }
860
861 // FIXME: This is not part of the C++ standard any more.
862 // - an enumerator belonging to an enumeration with external linkage; or
863 } else if (isa<EnumConstantDecl>(D)) {
864 LinkageInfo EnumLV = getLVForDecl(cast<NamedDecl>(D->getDeclContext()),
865 computation);
866 if (!isExternalFormalLinkage(EnumLV.getLinkage()))
867 return LinkageInfo::none();
868 LV.merge(EnumLV);
869
870 // - a template
871 } else if (const auto *temp = dyn_cast<TemplateDecl>(D)) {
872 bool considerVisibility = !hasExplicitVisibilityAlready(computation);
873 LinkageInfo tempLV =
874 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
875 LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
876
877 // An unnamed namespace or a namespace declared directly or indirectly
878 // within an unnamed namespace has internal linkage. All other namespaces
879 // have external linkage.
880 //
881 // We handled names in anonymous namespaces above.
882 } else if (isa<NamespaceDecl>(D)) {
883 return LV;
884
885 // By extension, we assign external linkage to Objective-C
886 // interfaces.
887 } else if (isa<ObjCInterfaceDecl>(D)) {
888 // fallout
889
890 } else if (auto *TD = dyn_cast<TypedefNameDecl>(D)) {
891 // A typedef declaration has linkage if it gives a type a name for
892 // linkage purposes.
893 if (!TD->getAnonDeclWithTypedefName(/*AnyRedecl*/true))
894 return LinkageInfo::none();
895
896 } else if (isa<MSGuidDecl>(D)) {
897 // A GUID behaves like an inline variable with external linkage. Fall
898 // through.
899
900 // Everything not covered here has no linkage.
901 } else {
902 return LinkageInfo::none();
903 }
904
905 // If we ended up with non-externally-visible linkage, visibility should
906 // always be default.
908 return LinkageInfo(LV.getLinkage(), DefaultVisibility, false);
909
910 return LV;
911}
912
914LinkageComputer::getLVForClassMember(const NamedDecl *D,
915 LVComputationKind computation,
916 bool IgnoreVarTypeLinkage) {
917 // Only certain class members have linkage. Note that fields don't
918 // really have linkage, but it's convenient to say they do for the
919 // purposes of calculating linkage of pointer-to-data-member
920 // template arguments.
921 //
922 // Templates also don't officially have linkage, but since we ignore
923 // the C++ standard and look at template arguments when determining
924 // linkage and visibility of a template specialization, we might hit
925 // a template template argument that way. If we do, we need to
926 // consider its linkage.
927 if (!(isa<CXXMethodDecl>(D) ||
928 isa<VarDecl>(D) ||
929 isa<FieldDecl>(D) ||
930 isa<IndirectFieldDecl>(D) ||
931 isa<TagDecl>(D) ||
932 isa<TemplateDecl>(D)))
933 return LinkageInfo::none();
934
935 LinkageInfo LV;
936
937 // If we have an explicit visibility attribute, merge that in.
938 if (!hasExplicitVisibilityAlready(computation)) {
939 if (std::optional<Visibility> Vis = getExplicitVisibility(D, computation))
940 LV.mergeVisibility(*Vis, true);
941 // If we're paying attention to global visibility, apply
942 // -finline-visibility-hidden if this is an inline method.
943 //
944 // Note that we do this before merging information about
945 // the class visibility.
947 LV.mergeVisibility(HiddenVisibility, /*visibilityExplicit=*/false);
948 }
949
950 // If this class member has an explicit visibility attribute, the only
951 // thing that can change its visibility is the template arguments, so
952 // only look for them when processing the class.
953 LVComputationKind classComputation = computation;
954 if (LV.isVisibilityExplicit())
955 classComputation = withExplicitVisibilityAlready(computation);
956
957 LinkageInfo classLV =
958 getLVForDecl(cast<RecordDecl>(D->getDeclContext()), classComputation);
959 // The member has the same linkage as the class. If that's not externally
960 // visible, we don't need to compute anything about the linkage.
961 // FIXME: If we're only computing linkage, can we bail out here?
962 if (!isExternallyVisible(classLV.getLinkage()))
963 return classLV;
964
965
966 // Otherwise, don't merge in classLV yet, because in certain cases
967 // we need to completely ignore the visibility from it.
968
969 // Specifically, if this decl exists and has an explicit attribute.
970 const NamedDecl *explicitSpecSuppressor = nullptr;
971
972 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
973 // Only look at the type-as-written. Otherwise, deducing the return type
974 // of a function could change its linkage.
975 QualType TypeAsWritten = MD->getType();
976 if (TypeSourceInfo *TSI = MD->getTypeSourceInfo())
977 TypeAsWritten = TSI->getType();
978 if (!isExternallyVisible(TypeAsWritten->getLinkage()))
980
981 // If this is a method template specialization, use the linkage for
982 // the template parameters and arguments.
984 = MD->getTemplateSpecializationInfo()) {
985 mergeTemplateLV(LV, MD, spec, computation);
986 if (spec->isExplicitSpecialization()) {
987 explicitSpecSuppressor = MD;
988 } else if (isExplicitMemberSpecialization(spec->getTemplate())) {
989 explicitSpecSuppressor = spec->getTemplate()->getTemplatedDecl();
990 }
991 } else if (isExplicitMemberSpecialization(MD)) {
992 explicitSpecSuppressor = MD;
993 }
994
995 // OpenMP target declare device functions are not callable from the host so
996 // they should not be exported from the device image. This applies to all
997 // functions as the host-callable kernel functions are emitted at codegen.
998 ASTContext &Context = D->getASTContext();
999 if (Context.getLangOpts().OpenMP &&
1000 Context.getLangOpts().OpenMPIsTargetDevice &&
1001 ((Context.getTargetInfo().getTriple().isAMDGPU() ||
1002 Context.getTargetInfo().getTriple().isNVPTX()) ||
1003 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(MD)))
1004 LV.mergeVisibility(HiddenVisibility, /*newExplicit=*/false);
1005
1006 } else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
1007 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
1008 mergeTemplateLV(LV, spec, computation);
1009 if (spec->isExplicitSpecialization()) {
1010 explicitSpecSuppressor = spec;
1011 } else {
1012 const ClassTemplateDecl *temp = spec->getSpecializedTemplate();
1014 explicitSpecSuppressor = temp->getTemplatedDecl();
1015 }
1016 }
1017 } else if (isExplicitMemberSpecialization(RD)) {
1018 explicitSpecSuppressor = RD;
1019 }
1020
1021 // Static data members.
1022 } else if (const auto *VD = dyn_cast<VarDecl>(D)) {
1023 if (const auto *spec = dyn_cast<VarTemplateSpecializationDecl>(VD))
1024 mergeTemplateLV(LV, spec, computation);
1025
1026 // Modify the variable's linkage by its type, but ignore the
1027 // type's visibility unless it's a definition.
1028 if (!IgnoreVarTypeLinkage) {
1029 LinkageInfo typeLV = getLVForType(*VD->getType(), computation);
1030 // FIXME: If the type's linkage is not externally visible, we can
1031 // give this static data member UniqueExternalLinkage.
1032 if (!LV.isVisibilityExplicit() && !classLV.isVisibilityExplicit())
1033 LV.mergeVisibility(typeLV);
1034 LV.mergeExternalVisibility(typeLV);
1035 }
1036
1038 explicitSpecSuppressor = VD;
1039 }
1040
1041 // Template members.
1042 } else if (const auto *temp = dyn_cast<TemplateDecl>(D)) {
1043 bool considerVisibility =
1044 (!LV.isVisibilityExplicit() &&
1045 !classLV.isVisibilityExplicit() &&
1046 !hasExplicitVisibilityAlready(computation));
1047 LinkageInfo tempLV =
1048 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
1049 LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
1050
1051 if (const auto *redeclTemp = dyn_cast<RedeclarableTemplateDecl>(temp)) {
1052 if (isExplicitMemberSpecialization(redeclTemp)) {
1053 explicitSpecSuppressor = temp->getTemplatedDecl();
1054 }
1055 }
1056 }
1057
1058 // We should never be looking for an attribute directly on a template.
1059 assert(!explicitSpecSuppressor || !isa<TemplateDecl>(explicitSpecSuppressor));
1060
1061 // If this member is an explicit member specialization, and it has
1062 // an explicit attribute, ignore visibility from the parent.
1063 bool considerClassVisibility = true;
1064 if (explicitSpecSuppressor &&
1065 // optimization: hasDVA() is true only with explicit visibility.
1066 LV.isVisibilityExplicit() &&
1067 classLV.getVisibility() != DefaultVisibility &&
1068 hasDirectVisibilityAttribute(explicitSpecSuppressor, computation)) {
1069 considerClassVisibility = false;
1070 }
1071
1072 // Finally, merge in information from the class.
1073 LV.mergeMaybeWithVisibility(classLV, considerClassVisibility);
1074 return LV;
1075}
1076
1077void NamedDecl::anchor() {}
1078
1080 if (!hasCachedLinkage())
1081 return true;
1082
1085 .getLinkage();
1086 return L == getCachedLinkage();
1087}
1088
1089bool NamedDecl::isPlaceholderVar(const LangOptions &LangOpts) const {
1090 // [C++2c] [basic.scope.scope]/p5
1091 // A declaration is name-independent if its name is _ and it declares
1092 // - a variable with automatic storage duration,
1093 // - a structured binding not inhabiting a namespace scope,
1094 // - the variable introduced by an init-capture
1095 // - or a non-static data member.
1096
1097 if (!LangOpts.CPlusPlus || !getIdentifier() ||
1098 !getIdentifier()->isPlaceholder())
1099 return false;
1100 if (isa<FieldDecl>(this))
1101 return true;
1102 if (const auto *IFD = dyn_cast<IndirectFieldDecl>(this)) {
1103 if (!getDeclContext()->isFunctionOrMethod() &&
1104 !getDeclContext()->isRecord())
1105 return false;
1106 const VarDecl *VD = IFD->getVarDecl();
1107 return !VD || VD->getStorageDuration() == SD_Automatic;
1108 }
1109 // and it declares a variable with automatic storage duration
1110 if (const auto *VD = dyn_cast<VarDecl>(this)) {
1111 if (isa<ParmVarDecl>(VD))
1112 return false;
1113 if (VD->isInitCapture())
1114 return true;
1116 }
1117 if (const auto *BD = dyn_cast<BindingDecl>(this);
1119 const VarDecl *VD = BD->getHoldingVar();
1121 }
1122 return false;
1123}
1124
1126NamedDecl::isReserved(const LangOptions &LangOpts) const {
1127 const IdentifierInfo *II = getIdentifier();
1128
1129 // This triggers at least for CXXLiteralIdentifiers, which we already checked
1130 // at lexing time.
1131 if (!II)
1133
1134 ReservedIdentifierStatus Status = II->isReserved(LangOpts);
1135 if (isReservedAtGlobalScope(Status) && !isReservedInAllContexts(Status)) {
1136 // This name is only reserved at global scope. Check if this declaration
1137 // conflicts with a global scope declaration.
1138 if (isa<ParmVarDecl>(this) || isTemplateParameter())
1140
1141 // C++ [dcl.link]/7:
1142 // Two declarations [conflict] if [...] one declares a function or
1143 // variable with C language linkage, and the other declares [...] a
1144 // variable that belongs to the global scope.
1145 //
1146 // Therefore names that are reserved at global scope are also reserved as
1147 // names of variables and functions with C language linkage.
1149 if (DC->isTranslationUnit())
1150 return Status;
1151 if (auto *VD = dyn_cast<VarDecl>(this))
1152 if (VD->isExternC())
1154 if (auto *FD = dyn_cast<FunctionDecl>(this))
1155 if (FD->isExternC())
1158 }
1159
1160 return Status;
1161}
1162
1164 StringRef name = getName();
1165 if (name.empty()) return SFF_None;
1166
1167 if (name.front() == 'C')
1168 if (name == "CFStringCreateWithFormat" ||
1169 name == "CFStringCreateWithFormatAndArguments" ||
1170 name == "CFStringAppendFormat" ||
1171 name == "CFStringAppendFormatAndArguments")
1172 return SFF_CFString;
1173 return SFF_None;
1174}
1175
1177 // We don't care about visibility here, so ask for the cheapest
1178 // possible visibility analysis.
1179 return LinkageComputer{}
1181 .getLinkage();
1182}
1183
1185 // FIXME: Handle isModulePrivate.
1186 switch (D->getModuleOwnershipKind()) {
1190 return false;
1193 return D->isInNamedModule();
1194 }
1195 llvm_unreachable("unexpected module ownership kind");
1196}
1197
1198/// Get the linkage from a semantic point of view. Entities in
1199/// anonymous namespaces are external (in c++98).
1201 Linkage InternalLinkage = getLinkageInternal();
1202
1203 // C++ [basic.link]p4.8:
1204 // - if the declaration of the name is attached to a named module and is not
1205 // exported
1206 // the name has module linkage;
1207 //
1208 // [basic.namespace.general]/p2
1209 // A namespace is never attached to a named module and never has a name with
1210 // module linkage.
1211 if (isInNamedModule() && InternalLinkage == Linkage::External &&
1213 cast<NamedDecl>(this->getCanonicalDecl())) &&
1214 !isa<NamespaceDecl>(this))
1215 InternalLinkage = Linkage::Module;
1216
1217 return clang::getFormalLinkage(InternalLinkage);
1218}
1219
1222}
1223
1224static std::optional<Visibility>
1227 bool IsMostRecent) {
1228 assert(!IsMostRecent || ND == ND->getMostRecentDecl());
1229
1230 // Check the declaration itself first.
1231 if (std::optional<Visibility> V = getVisibilityOf(ND, kind))
1232 return V;
1233
1234 // If this is a member class of a specialization of a class template
1235 // and the corresponding decl has explicit visibility, use that.
1236 if (const auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
1237 CXXRecordDecl *InstantiatedFrom = RD->getInstantiatedFromMemberClass();
1238 if (InstantiatedFrom)
1239 return getVisibilityOf(InstantiatedFrom, kind);
1240 }
1241
1242 // If there wasn't explicit visibility there, and this is a
1243 // specialization of a class template, check for visibility
1244 // on the pattern.
1245 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1246 // Walk all the template decl till this point to see if there are
1247 // explicit visibility attributes.
1248 const auto *TD = spec->getSpecializedTemplate()->getTemplatedDecl();
1249 while (TD != nullptr) {
1250 auto Vis = getVisibilityOf(TD, kind);
1251 if (Vis != std::nullopt)
1252 return Vis;
1253 TD = TD->getPreviousDecl();
1254 }
1255 return std::nullopt;
1256 }
1257
1258 // Use the most recent declaration.
1259 if (!IsMostRecent && !isa<NamespaceDecl>(ND)) {
1260 const NamedDecl *MostRecent = ND->getMostRecentDecl();
1261 if (MostRecent != ND)
1262 return getExplicitVisibilityAux(MostRecent, kind, true);
1263 }
1264
1265 if (const auto *Var = dyn_cast<VarDecl>(ND)) {
1266 if (Var->isStaticDataMember()) {
1267 VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember();
1268 if (InstantiatedFrom)
1269 return getVisibilityOf(InstantiatedFrom, kind);
1270 }
1271
1272 if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Var))
1273 return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(),
1274 kind);
1275
1276 return std::nullopt;
1277 }
1278 // Also handle function template specializations.
1279 if (const auto *fn = dyn_cast<FunctionDecl>(ND)) {
1280 // If the function is a specialization of a template with an
1281 // explicit visibility attribute, use that.
1282 if (FunctionTemplateSpecializationInfo *templateInfo
1284 return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl(),
1285 kind);
1286
1287 // If the function is a member of a specialization of a class template
1288 // and the corresponding decl has explicit visibility, use that.
1289 FunctionDecl *InstantiatedFrom = fn->getInstantiatedFromMemberFunction();
1290 if (InstantiatedFrom)
1291 return getVisibilityOf(InstantiatedFrom, kind);
1292
1293 return std::nullopt;
1294 }
1295
1296 // The visibility of a template is stored in the templated decl.
1297 if (const auto *TD = dyn_cast<TemplateDecl>(ND))
1298 return getVisibilityOf(TD->getTemplatedDecl(), kind);
1299
1300 return std::nullopt;
1301}
1302
1303std::optional<Visibility>
1305 return getExplicitVisibilityAux(this, kind, false);
1306}
1307
1308LinkageInfo LinkageComputer::getLVForClosure(const DeclContext *DC,
1309 Decl *ContextDecl,
1310 LVComputationKind computation) {
1311 // This lambda has its linkage/visibility determined by its owner.
1312 const NamedDecl *Owner;
1313 if (!ContextDecl)
1314 Owner = dyn_cast<NamedDecl>(DC);
1315 else if (isa<ParmVarDecl>(ContextDecl))
1316 Owner =
1317 dyn_cast<NamedDecl>(ContextDecl->getDeclContext()->getRedeclContext());
1318 else if (isa<ImplicitConceptSpecializationDecl>(ContextDecl)) {
1319 // Replace with the concept's owning decl, which is either a namespace or a
1320 // TU, so this needs a dyn_cast.
1321 Owner = dyn_cast<NamedDecl>(ContextDecl->getDeclContext());
1322 } else {
1323 Owner = cast<NamedDecl>(ContextDecl);
1324 }
1325
1326 if (!Owner)
1327 return LinkageInfo::none();
1328
1329 // If the owner has a deduced type, we need to skip querying the linkage and
1330 // visibility of that type, because it might involve this closure type. The
1331 // only effect of this is that we might give a lambda VisibleNoLinkage rather
1332 // than NoLinkage when we don't strictly need to, which is benign.
1333 auto *VD = dyn_cast<VarDecl>(Owner);
1334 LinkageInfo OwnerLV =
1335 VD && VD->getType()->getContainedDeducedType()
1336 ? computeLVForDecl(Owner, computation, /*IgnoreVarTypeLinkage*/true)
1337 : getLVForDecl(Owner, computation);
1338
1339 // A lambda never formally has linkage. But if the owner is externally
1340 // visible, then the lambda is too. We apply the same rules to blocks.
1341 if (!isExternallyVisible(OwnerLV.getLinkage()))
1342 return LinkageInfo::none();
1344 OwnerLV.isVisibilityExplicit());
1345}
1346
1347LinkageInfo LinkageComputer::getLVForLocalDecl(const NamedDecl *D,
1348 LVComputationKind computation) {
1349 if (const auto *Function = dyn_cast<FunctionDecl>(D)) {
1350 if (Function->isInAnonymousNamespace() &&
1352 return LinkageInfo::internal();
1353
1354 // This is a "void f();" which got merged with a file static.
1355 if (Function->getCanonicalDecl()->getStorageClass() == SC_Static)
1356 return LinkageInfo::internal();
1357
1358 LinkageInfo LV;
1359 if (!hasExplicitVisibilityAlready(computation)) {
1360 if (std::optional<Visibility> Vis =
1361 getExplicitVisibility(Function, computation))
1362 LV.mergeVisibility(*Vis, true);
1363 }
1364
1365 // Note that Sema::MergeCompatibleFunctionDecls already takes care of
1366 // merging storage classes and visibility attributes, so we don't have to
1367 // look at previous decls in here.
1368
1369 return LV;
1370 }
1371
1372 if (const auto *Var = dyn_cast<VarDecl>(D)) {
1373 if (Var->hasExternalStorage()) {
1374 if (Var->isInAnonymousNamespace() && !isFirstInExternCContext(Var))
1375 return LinkageInfo::internal();
1376
1377 LinkageInfo LV;
1378 if (Var->getStorageClass() == SC_PrivateExtern)
1380 else if (!hasExplicitVisibilityAlready(computation)) {
1381 if (std::optional<Visibility> Vis =
1382 getExplicitVisibility(Var, computation))
1383 LV.mergeVisibility(*Vis, true);
1384 }
1385
1386 if (const VarDecl *Prev = Var->getPreviousDecl()) {
1387 LinkageInfo PrevLV = getLVForDecl(Prev, computation);
1388 if (PrevLV.getLinkage() != Linkage::Invalid)
1389 LV.setLinkage(PrevLV.getLinkage());
1390 LV.mergeVisibility(PrevLV);
1391 }
1392
1393 return LV;
1394 }
1395
1396 if (!Var->isStaticLocal())
1397 return LinkageInfo::none();
1398 }
1399
1400 ASTContext &Context = D->getASTContext();
1401 if (!Context.getLangOpts().CPlusPlus)
1402 return LinkageInfo::none();
1403
1404 const Decl *OuterD = getOutermostFuncOrBlockContext(D);
1405 if (!OuterD || OuterD->isInvalidDecl())
1406 return LinkageInfo::none();
1407
1408 LinkageInfo LV;
1409 if (const auto *BD = dyn_cast<BlockDecl>(OuterD)) {
1410 if (!BD->getBlockManglingNumber())
1411 return LinkageInfo::none();
1412
1413 LV = getLVForClosure(BD->getDeclContext()->getRedeclContext(),
1414 BD->getBlockManglingContextDecl(), computation);
1415 } else {
1416 const auto *FD = cast<FunctionDecl>(OuterD);
1417 if (!FD->isInlined() &&
1418 !isTemplateInstantiation(FD->getTemplateSpecializationKind()))
1419 return LinkageInfo::none();
1420
1421 // If a function is hidden by -fvisibility-inlines-hidden option and
1422 // is not explicitly attributed as a hidden function,
1423 // we should not make static local variables in the function hidden.
1424 LV = getLVForDecl(FD, computation);
1425 if (isa<VarDecl>(D) && useInlineVisibilityHidden(FD) &&
1426 !LV.isVisibilityExplicit() &&
1427 !Context.getLangOpts().VisibilityInlinesHiddenStaticLocalVar) {
1428 assert(cast<VarDecl>(D)->isStaticLocal());
1429 // If this was an implicitly hidden inline method, check again for
1430 // explicit visibility on the parent class, and use that for static locals
1431 // if present.
1432 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
1433 LV = getLVForDecl(MD->getParent(), computation);
1434 if (!LV.isVisibilityExplicit()) {
1435 Visibility globalVisibility =
1436 computation.isValueVisibility()
1437 ? Context.getLangOpts().getValueVisibilityMode()
1438 : Context.getLangOpts().getTypeVisibilityMode();
1439 return LinkageInfo(Linkage::VisibleNone, globalVisibility,
1440 /*visibilityExplicit=*/false);
1441 }
1442 }
1443 }
1445 return LinkageInfo::none();
1448}
1449
1451 LVComputationKind computation,
1452 bool IgnoreVarTypeLinkage) {
1453 // Internal_linkage attribute overrides other considerations.
1454 if (D->hasAttr<InternalLinkageAttr>())
1455 return LinkageInfo::internal();
1456
1457 // Objective-C: treat all Objective-C declarations as having external
1458 // linkage.
1459 switch (D->getKind()) {
1460 default:
1461 break;
1462
1463 // Per C++ [basic.link]p2, only the names of objects, references,
1464 // functions, types, templates, namespaces, and values ever have linkage.
1465 //
1466 // Note that the name of a typedef, namespace alias, using declaration,
1467 // and so on are not the name of the corresponding type, namespace, or
1468 // declaration, so they do *not* have linkage.
1469 case Decl::ImplicitParam:
1470 case Decl::Label:
1471 case Decl::NamespaceAlias:
1472 case Decl::ParmVar:
1473 case Decl::Using:
1474 case Decl::UsingEnum:
1475 case Decl::UsingShadow:
1476 case Decl::UsingDirective:
1477 return LinkageInfo::none();
1478
1479 case Decl::EnumConstant:
1480 // C++ [basic.link]p4: an enumerator has the linkage of its enumeration.
1481 if (D->getASTContext().getLangOpts().CPlusPlus)
1482 return getLVForDecl(cast<EnumDecl>(D->getDeclContext()), computation);
1484
1485 case Decl::Typedef:
1486 case Decl::TypeAlias:
1487 // A typedef declaration has linkage if it gives a type a name for
1488 // linkage purposes.
1489 if (!cast<TypedefNameDecl>(D)
1490 ->getAnonDeclWithTypedefName(/*AnyRedecl*/true))
1491 return LinkageInfo::none();
1492 break;
1493
1494 case Decl::TemplateTemplateParm: // count these as external
1495 case Decl::NonTypeTemplateParm:
1496 case Decl::ObjCAtDefsField:
1497 case Decl::ObjCCategory:
1498 case Decl::ObjCCategoryImpl:
1499 case Decl::ObjCCompatibleAlias:
1500 case Decl::ObjCImplementation:
1501 case Decl::ObjCMethod:
1502 case Decl::ObjCProperty:
1503 case Decl::ObjCPropertyImpl:
1504 case Decl::ObjCProtocol:
1505 return getExternalLinkageFor(D);
1506
1507 case Decl::CXXRecord: {
1508 const auto *Record = cast<CXXRecordDecl>(D);
1509 if (Record->isLambda()) {
1510 if (Record->hasKnownLambdaInternalLinkage() ||
1511 !Record->getLambdaManglingNumber()) {
1512 // This lambda has no mangling number, so it's internal.
1513 return LinkageInfo::internal();
1514 }
1515
1516 return getLVForClosure(
1517 Record->getDeclContext()->getRedeclContext(),
1518 Record->getLambdaContextDecl(), computation);
1519 }
1520
1521 break;
1522 }
1523
1524 case Decl::TemplateParamObject: {
1525 // The template parameter object can be referenced from anywhere its type
1526 // and value can be referenced.
1527 auto *TPO = cast<TemplateParamObjectDecl>(D);
1528 LinkageInfo LV = getLVForType(*TPO->getType(), computation);
1529 LV.merge(getLVForValue(TPO->getValue(), computation));
1530 return LV;
1531 }
1532 }
1533
1534 // Handle linkage for namespace-scope names.
1536 return getLVForNamespaceScopeDecl(D, computation, IgnoreVarTypeLinkage);
1537
1538 // C++ [basic.link]p5:
1539 // In addition, a member function, static data member, a named
1540 // class or enumeration of class scope, or an unnamed class or
1541 // enumeration defined in a class-scope typedef declaration such
1542 // that the class or enumeration has the typedef name for linkage
1543 // purposes (7.1.3), has external linkage if the name of the class
1544 // has external linkage.
1545 if (D->getDeclContext()->isRecord())
1546 return getLVForClassMember(D, computation, IgnoreVarTypeLinkage);
1547
1548 // C++ [basic.link]p6:
1549 // The name of a function declared in block scope and the name of
1550 // an object declared by a block scope extern declaration have
1551 // linkage. If there is a visible declaration of an entity with
1552 // linkage having the same name and type, ignoring entities
1553 // declared outside the innermost enclosing namespace scope, the
1554 // block scope declaration declares that same entity and receives
1555 // the linkage of the previous declaration. If there is more than
1556 // one such matching entity, the program is ill-formed. Otherwise,
1557 // if no matching entity is found, the block scope entity receives
1558 // external linkage.
1560 return getLVForLocalDecl(D, computation);
1561
1562 // C++ [basic.link]p6:
1563 // Names not covered by these rules have no linkage.
1564 return LinkageInfo::none();
1565}
1566
1567/// getLVForDecl - Get the linkage and visibility for the given declaration.
1569 LVComputationKind computation) {
1570 // Internal_linkage attribute overrides other considerations.
1571 if (D->hasAttr<InternalLinkageAttr>())
1572 return LinkageInfo::internal();
1573
1574 if (computation.IgnoreAllVisibility && D->hasCachedLinkage())
1576
1577 if (std::optional<LinkageInfo> LI = lookup(D, computation))
1578 return *LI;
1579
1580 LinkageInfo LV = computeLVForDecl(D, computation);
1581 if (D->hasCachedLinkage())
1582 assert(D->getCachedLinkage() == LV.getLinkage());
1583
1585 cache(D, computation, LV);
1586
1587#ifndef NDEBUG
1588 // In C (because of gnu inline) and in c++ with microsoft extensions an
1589 // static can follow an extern, so we can have two decls with different
1590 // linkages.
1591 const LangOptions &Opts = D->getASTContext().getLangOpts();
1592 if (!Opts.CPlusPlus || Opts.MicrosoftExt)
1593 return LV;
1594
1595 // We have just computed the linkage for this decl. By induction we know
1596 // that all other computed linkages match, check that the one we just
1597 // computed also does.
1598 NamedDecl *Old = nullptr;
1599 for (auto *I : D->redecls()) {
1600 auto *T = cast<NamedDecl>(I);
1601 if (T == D)
1602 continue;
1603 if (!T->isInvalidDecl() && T->hasCachedLinkage()) {
1604 Old = T;
1605 break;
1606 }
1607 }
1608 assert(!Old || Old->getCachedLinkage() == D->getCachedLinkage());
1609#endif
1610
1611 return LV;
1612}
1613
1618 LVComputationKind CK(EK);
1619 return getLVForDecl(D, D->getASTContext().getLangOpts().IgnoreXCOFFVisibility
1620 ? CK.forLinkageOnly()
1621 : CK);
1622}
1623
1625 if (isa<NamespaceDecl>(this))
1626 // Namespaces never have module linkage. It is the entities within them
1627 // that [may] do.
1628 return nullptr;
1629
1630 Module *M = getOwningModule();
1631 if (!M)
1632 return nullptr;
1633
1634 switch (M->Kind) {
1636 // Module map modules have no special linkage semantics.
1637 return nullptr;
1638
1643 return M;
1644
1648 // The global module shouldn't change the linkage.
1649 return nullptr;
1650
1652 // The private module fragment is part of its containing module for linkage
1653 // purposes.
1654 return M->Parent;
1655 }
1656
1657 llvm_unreachable("unknown module kind");
1658}
1659
1660void NamedDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
1661 Name.print(OS, Policy);
1662}
1663
1664void NamedDecl::printName(raw_ostream &OS) const {
1665 printName(OS, getASTContext().getPrintingPolicy());
1666}
1667
1669 std::string QualName;
1670 llvm::raw_string_ostream OS(QualName);
1671 printQualifiedName(OS, getASTContext().getPrintingPolicy());
1672 return QualName;
1673}
1674
1675void NamedDecl::printQualifiedName(raw_ostream &OS) const {
1676 printQualifiedName(OS, getASTContext().getPrintingPolicy());
1677}
1678
1680 const PrintingPolicy &P) const {
1681 if (getDeclContext()->isFunctionOrMethod()) {
1682 // We do not print '(anonymous)' for function parameters without name.
1683 printName(OS, P);
1684 return;
1685 }
1687 if (getDeclName())
1688 OS << *this;
1689 else {
1690 // Give the printName override a chance to pick a different name before we
1691 // fall back to "(anonymous)".
1692 SmallString<64> NameBuffer;
1693 llvm::raw_svector_ostream NameOS(NameBuffer);
1694 printName(NameOS, P);
1695 if (NameBuffer.empty())
1696 OS << "(anonymous)";
1697 else
1698 OS << NameBuffer;
1699 }
1700}
1701
1702void NamedDecl::printNestedNameSpecifier(raw_ostream &OS) const {
1703 printNestedNameSpecifier(OS, getASTContext().getPrintingPolicy());
1704}
1705
1707 const PrintingPolicy &P) const {
1708 const DeclContext *Ctx = getDeclContext();
1709
1710 // For ObjC methods and properties, look through categories and use the
1711 // interface as context.
1712 if (auto *MD = dyn_cast<ObjCMethodDecl>(this)) {
1713 if (auto *ID = MD->getClassInterface())
1714 Ctx = ID;
1715 } else if (auto *PD = dyn_cast<ObjCPropertyDecl>(this)) {
1716 if (auto *MD = PD->getGetterMethodDecl())
1717 if (auto *ID = MD->getClassInterface())
1718 Ctx = ID;
1719 } else if (auto *ID = dyn_cast<ObjCIvarDecl>(this)) {
1720 if (auto *CI = ID->getContainingInterface())
1721 Ctx = CI;
1722 }
1723
1724 if (Ctx->isFunctionOrMethod())
1725 return;
1726
1727 using ContextsTy = SmallVector<const DeclContext *, 8>;
1728 ContextsTy Contexts;
1729
1730 // Collect named contexts.
1731 DeclarationName NameInScope = getDeclName();
1732 for (; Ctx; Ctx = Ctx->getParent()) {
1733 // Suppress anonymous namespace if requested.
1734 if (P.SuppressUnwrittenScope && isa<NamespaceDecl>(Ctx) &&
1735 cast<NamespaceDecl>(Ctx)->isAnonymousNamespace())
1736 continue;
1737
1738 // Suppress inline namespace if it doesn't make the result ambiguous.
1739 if (P.SuppressInlineNamespace && Ctx->isInlineNamespace() && NameInScope &&
1740 cast<NamespaceDecl>(Ctx)->isRedundantInlineQualifierFor(NameInScope))
1741 continue;
1742
1743 // Skip non-named contexts such as linkage specifications and ExportDecls.
1744 const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx);
1745 if (!ND)
1746 continue;
1747
1748 Contexts.push_back(Ctx);
1749 NameInScope = ND->getDeclName();
1750 }
1751
1752 for (const DeclContext *DC : llvm::reverse(Contexts)) {
1753 if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1754 OS << Spec->getName();
1755 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1757 OS, TemplateArgs.asArray(), P,
1758 Spec->getSpecializedTemplate()->getTemplateParameters());
1759 } else if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) {
1760 if (ND->isAnonymousNamespace()) {
1761 OS << (P.MSVCFormatting ? "`anonymous namespace\'"
1762 : "(anonymous namespace)");
1763 }
1764 else
1765 OS << *ND;
1766 } else if (const auto *RD = dyn_cast<RecordDecl>(DC)) {
1767 if (!RD->getIdentifier())
1768 OS << "(anonymous " << RD->getKindName() << ')';
1769 else
1770 OS << *RD;
1771 } else if (const auto *FD = dyn_cast<FunctionDecl>(DC)) {
1772 const FunctionProtoType *FT = nullptr;
1773 if (FD->hasWrittenPrototype())
1774 FT = dyn_cast<FunctionProtoType>(FD->getType()->castAs<FunctionType>());
1775
1776 OS << *FD << '(';
1777 if (FT) {
1778 unsigned NumParams = FD->getNumParams();
1779 for (unsigned i = 0; i < NumParams; ++i) {
1780 if (i)
1781 OS << ", ";
1782 OS << FD->getParamDecl(i)->getType().stream(P);
1783 }
1784
1785 if (FT->isVariadic()) {
1786 if (NumParams > 0)
1787 OS << ", ";
1788 OS << "...";
1789 }
1790 }
1791 OS << ')';
1792 } else if (const auto *ED = dyn_cast<EnumDecl>(DC)) {
1793 // C++ [dcl.enum]p10: Each enum-name and each unscoped
1794 // enumerator is declared in the scope that immediately contains
1795 // the enum-specifier. Each scoped enumerator is declared in the
1796 // scope of the enumeration.
1797 // For the case of unscoped enumerator, do not include in the qualified
1798 // name any information about its enum enclosing scope, as its visibility
1799 // is global.
1800 if (ED->isScoped())
1801 OS << *ED;
1802 else
1803 continue;
1804 } else {
1805 OS << *cast<NamedDecl>(DC);
1806 }
1807 OS << "::";
1808 }
1809}
1810
1812 const PrintingPolicy &Policy,
1813 bool Qualified) const {
1814 if (Qualified)
1815 printQualifiedName(OS, Policy);
1816 else
1817 printName(OS, Policy);
1818}
1819
1820template<typename T> static bool isRedeclarableImpl(Redeclarable<T> *) {
1821 return true;
1822}
1823static bool isRedeclarableImpl(...) { return false; }
1825 switch (K) {
1826#define DECL(Type, Base) \
1827 case Decl::Type: \
1828 return isRedeclarableImpl((Type##Decl *)nullptr);
1829#define ABSTRACT_DECL(DECL)
1830#include "clang/AST/DeclNodes.inc"
1831 }
1832 llvm_unreachable("unknown decl kind");
1833}
1834
1836 bool IsKnownNewer) const {
1837 assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
1838
1839 // Never replace one imported declaration with another; we need both results
1840 // when re-exporting.
1841 if (OldD->isFromASTFile() && isFromASTFile())
1842 return false;
1843
1844 // A kind mismatch implies that the declaration is not replaced.
1845 if (OldD->getKind() != getKind())
1846 return false;
1847
1848 // For method declarations, we never replace. (Why?)
1849 if (isa<ObjCMethodDecl>(this))
1850 return false;
1851
1852 // For parameters, pick the newer one. This is either an error or (in
1853 // Objective-C) permitted as an extension.
1854 if (isa<ParmVarDecl>(this))
1855 return true;
1856
1857 // Inline namespaces can give us two declarations with the same
1858 // name and kind in the same scope but different contexts; we should
1859 // keep both declarations in this case.
1860 if (!this->getDeclContext()->getRedeclContext()->Equals(
1861 OldD->getDeclContext()->getRedeclContext()))
1862 return false;
1863
1864 // Using declarations can be replaced if they import the same name from the
1865 // same context.
1866 if (const auto *UD = dyn_cast<UsingDecl>(this)) {
1867 ASTContext &Context = getASTContext();
1868 return Context.getCanonicalNestedNameSpecifier(UD->getQualifier()) ==
1870 cast<UsingDecl>(OldD)->getQualifier());
1871 }
1872 if (const auto *UUVD = dyn_cast<UnresolvedUsingValueDecl>(this)) {
1873 ASTContext &Context = getASTContext();
1874 return Context.getCanonicalNestedNameSpecifier(UUVD->getQualifier()) ==
1876 cast<UnresolvedUsingValueDecl>(OldD)->getQualifier());
1877 }
1878
1879 if (isRedeclarable(getKind())) {
1880 if (getCanonicalDecl() != OldD->getCanonicalDecl())
1881 return false;
1882
1883 if (IsKnownNewer)
1884 return true;
1885
1886 // Check whether this is actually newer than OldD. We want to keep the
1887 // newer declaration. This loop will usually only iterate once, because
1888 // OldD is usually the previous declaration.
1889 for (const auto *D : redecls()) {
1890 if (D == OldD)
1891 break;
1892
1893 // If we reach the canonical declaration, then OldD is not actually older
1894 // than this one.
1895 //
1896 // FIXME: In this case, we should not add this decl to the lookup table.
1897 if (D->isCanonicalDecl())
1898 return false;
1899 }
1900
1901 // It's a newer declaration of the same kind of declaration in the same
1902 // scope: we want this decl instead of the existing one.
1903 return true;
1904 }
1905
1906 // In all other cases, we need to keep both declarations in case they have
1907 // different visibility. Any attempt to use the name will result in an
1908 // ambiguity if more than one is visible.
1909 return false;
1910}
1911
1913 switch (getFormalLinkage()) {
1914 case Linkage::Invalid:
1915 llvm_unreachable("Linkage hasn't been computed!");
1916 case Linkage::None:
1917 return false;
1918 case Linkage::Internal:
1919 return true;
1922 llvm_unreachable("Non-formal linkage is not allowed here!");
1923 case Linkage::Module:
1924 case Linkage::External:
1925 return true;
1926 }
1927 llvm_unreachable("Unhandled Linkage enum");
1928}
1929
1930NamedDecl *NamedDecl::getUnderlyingDeclImpl() {
1931 NamedDecl *ND = this;
1932 if (auto *UD = dyn_cast<UsingShadowDecl>(ND))
1933 ND = UD->getTargetDecl();
1934
1935 if (auto *AD = dyn_cast<ObjCCompatibleAliasDecl>(ND))
1936 return AD->getClassInterface();
1937
1938 if (auto *AD = dyn_cast<NamespaceAliasDecl>(ND))
1939 return AD->getNamespace();
1940
1941 return ND;
1942}
1943
1945 if (!isCXXClassMember())
1946 return false;
1947
1948 const NamedDecl *D = this;
1949 if (isa<UsingShadowDecl>(D))
1950 D = cast<UsingShadowDecl>(D)->getTargetDecl();
1951
1952 if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<MSPropertyDecl>(D))
1953 return true;
1954 if (const auto *MD = dyn_cast_if_present<CXXMethodDecl>(D->getAsFunction()))
1955 return MD->isInstance();
1956 return false;
1957}
1958
1959//===----------------------------------------------------------------------===//
1960// DeclaratorDecl Implementation
1961//===----------------------------------------------------------------------===//
1962
1963template <typename DeclT>
1965 if (decl->getNumTemplateParameterLists() > 0)
1966 return decl->getTemplateParameterList(0)->getTemplateLoc();
1967 return decl->getInnerLocStart();
1968}
1969
1972 if (TSI) return TSI->getTypeLoc().getBeginLoc();
1973 return SourceLocation();
1974}
1975
1978 if (TSI) return TSI->getTypeLoc().getEndLoc();
1979 return SourceLocation();
1980}
1981
1983 if (QualifierLoc) {
1984 // Make sure the extended decl info is allocated.
1985 if (!hasExtInfo()) {
1986 // Save (non-extended) type source info pointer.
1987 auto *savedTInfo = DeclInfo.get<TypeSourceInfo*>();
1988 // Allocate external info struct.
1989 DeclInfo = new (getASTContext()) ExtInfo;
1990 // Restore savedTInfo into (extended) decl info.
1991 getExtInfo()->TInfo = savedTInfo;
1992 }
1993 // Set qualifier info.
1994 getExtInfo()->QualifierLoc = QualifierLoc;
1995 } else if (hasExtInfo()) {
1996 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
1997 getExtInfo()->QualifierLoc = QualifierLoc;
1998 }
1999}
2000
2002 assert(TrailingRequiresClause);
2003 // Make sure the extended decl info is allocated.
2004 if (!hasExtInfo()) {
2005 // Save (non-extended) type source info pointer.
2006 auto *savedTInfo = DeclInfo.get<TypeSourceInfo*>();
2007 // Allocate external info struct.
2008 DeclInfo = new (getASTContext()) ExtInfo;
2009 // Restore savedTInfo into (extended) decl info.
2010 getExtInfo()->TInfo = savedTInfo;
2011 }
2012 // Set requires clause info.
2013 getExtInfo()->TrailingRequiresClause = TrailingRequiresClause;
2014}
2015
2018 assert(!TPLists.empty());
2019 // Make sure the extended decl info is allocated.
2020 if (!hasExtInfo()) {
2021 // Save (non-extended) type source info pointer.
2022 auto *savedTInfo = DeclInfo.get<TypeSourceInfo*>();
2023 // Allocate external info struct.
2024 DeclInfo = new (getASTContext()) ExtInfo;
2025 // Restore savedTInfo into (extended) decl info.
2026 getExtInfo()->TInfo = savedTInfo;
2027 }
2028 // Set the template parameter lists info.
2029 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
2030}
2031
2033 return getTemplateOrInnerLocStart(this);
2034}
2035
2036// Helper function: returns true if QT is or contains a type
2037// having a postfix component.
2038static bool typeIsPostfix(QualType QT) {
2039 while (true) {
2040 const Type* T = QT.getTypePtr();
2041 switch (T->getTypeClass()) {
2042 default:
2043 return false;
2044 case Type::Pointer:
2045 QT = cast<PointerType>(T)->getPointeeType();
2046 break;
2047 case Type::BlockPointer:
2048 QT = cast<BlockPointerType>(T)->getPointeeType();
2049 break;
2050 case Type::MemberPointer:
2051 QT = cast<MemberPointerType>(T)->getPointeeType();
2052 break;
2053 case Type::LValueReference:
2054 case Type::RValueReference:
2055 QT = cast<ReferenceType>(T)->getPointeeType();
2056 break;
2057 case Type::PackExpansion:
2058 QT = cast<PackExpansionType>(T)->getPattern();
2059 break;
2060 case Type::Paren:
2061 case Type::ConstantArray:
2062 case Type::DependentSizedArray:
2063 case Type::IncompleteArray:
2064 case Type::VariableArray:
2065 case Type::FunctionProto:
2066 case Type::FunctionNoProto:
2067 return true;
2068 }
2069 }
2070}
2071
2073 SourceLocation RangeEnd = getLocation();
2074 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
2075 // If the declaration has no name or the type extends past the name take the
2076 // end location of the type.
2077 if (!getDeclName() || typeIsPostfix(TInfo->getType()))
2078 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
2079 }
2080 return SourceRange(getOuterLocStart(), RangeEnd);
2081}
2082
2085 // Free previous template parameters (if any).
2086 if (NumTemplParamLists > 0) {
2087 Context.Deallocate(TemplParamLists);
2088 TemplParamLists = nullptr;
2090 }
2091 // Set info on matched template parameter lists (if any).
2092 if (!TPLists.empty()) {
2093 TemplParamLists = new (Context) TemplateParameterList *[TPLists.size()];
2094 NumTemplParamLists = TPLists.size();
2095 std::copy(TPLists.begin(), TPLists.end(), TemplParamLists);
2096 }
2097}
2098
2099//===----------------------------------------------------------------------===//
2100// VarDecl Implementation
2101//===----------------------------------------------------------------------===//
2102
2104 switch (SC) {
2105 case SC_None: break;
2106 case SC_Auto: return "auto";
2107 case SC_Extern: return "extern";
2108 case SC_PrivateExtern: return "__private_extern__";
2109 case SC_Register: return "register";
2110 case SC_Static: return "static";
2111 }
2112
2113 llvm_unreachable("Invalid storage class");
2114}
2115
2117 SourceLocation StartLoc, SourceLocation IdLoc,
2118 const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
2119 StorageClass SC)
2120 : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc),
2122 static_assert(sizeof(VarDeclBitfields) <= sizeof(unsigned),
2123 "VarDeclBitfields too large!");
2124 static_assert(sizeof(ParmVarDeclBitfields) <= sizeof(unsigned),
2125 "ParmVarDeclBitfields too large!");
2126 static_assert(sizeof(NonParmVarDeclBitfields) <= sizeof(unsigned),
2127 "NonParmVarDeclBitfields too large!");
2128 AllBits = 0;
2129 VarDeclBits.SClass = SC;
2130 // Everything else is implicitly initialized to false.
2131}
2132
2134 SourceLocation IdL, const IdentifierInfo *Id,
2136 return new (C, DC) VarDecl(Var, C, DC, StartL, IdL, Id, T, TInfo, S);
2137}
2138
2140 return new (C, ID)
2141 VarDecl(Var, C, nullptr, SourceLocation(), SourceLocation(), nullptr,
2142 QualType(), nullptr, SC_None);
2143}
2144
2146 assert(isLegalForVariable(SC));
2147 VarDeclBits.SClass = SC;
2148}
2149
2151 switch (VarDeclBits.TSCSpec) {
2152 case TSCS_unspecified:
2153 if (!hasAttr<ThreadAttr>() &&
2154 !(getASTContext().getLangOpts().OpenMPUseTLS &&
2155 getASTContext().getTargetInfo().isTLSSupported() &&
2156 hasAttr<OMPThreadPrivateDeclAttr>()))
2157 return TLS_None;
2158 return ((getASTContext().getLangOpts().isCompatibleWithMSVC(
2160 hasAttr<OMPThreadPrivateDeclAttr>())
2161 ? TLS_Dynamic
2162 : TLS_Static;
2163 case TSCS___thread: // Fall through.
2164 case TSCS__Thread_local:
2165 return TLS_Static;
2166 case TSCS_thread_local:
2167 return TLS_Dynamic;
2168 }
2169 llvm_unreachable("Unknown thread storage class specifier!");
2170}
2171
2173 if (const Expr *Init = getInit()) {
2174 SourceLocation InitEnd = Init->getEndLoc();
2175 // If Init is implicit, ignore its source range and fallback on
2176 // DeclaratorDecl::getSourceRange() to handle postfix elements.
2177 if (InitEnd.isValid() && InitEnd != getLocation())
2178 return SourceRange(getOuterLocStart(), InitEnd);
2179 }
2181}
2182
2183template<typename T>
2185 // C++ [dcl.link]p1: All function types, function names with external linkage,
2186 // and variable names with external linkage have a language linkage.
2187 if (!D.hasExternalFormalLinkage())
2188 return NoLanguageLinkage;
2189
2190 // Language linkage is a C++ concept, but saying that everything else in C has
2191 // C language linkage fits the implementation nicely.
2192 if (!D.getASTContext().getLangOpts().CPlusPlus)
2193 return CLanguageLinkage;
2194
2195 // C++ [dcl.link]p4: A C language linkage is ignored in determining the
2196 // language linkage of the names of class members and the function type of
2197 // class member functions.
2198 const DeclContext *DC = D.getDeclContext();
2199 if (DC->isRecord())
2200 return CXXLanguageLinkage;
2201
2202 // If the first decl is in an extern "C" context, any other redeclaration
2203 // will have C language linkage. If the first one is not in an extern "C"
2204 // context, we would have reported an error for any other decl being in one.
2206 return CLanguageLinkage;
2207 return CXXLanguageLinkage;
2208}
2209
2210template<typename T>
2211static bool isDeclExternC(const T &D) {
2212 // Since the context is ignored for class members, they can only have C++
2213 // language linkage or no language linkage.
2214 const DeclContext *DC = D.getDeclContext();
2215 if (DC->isRecord()) {
2216 assert(D.getASTContext().getLangOpts().CPlusPlus);
2217 return false;
2218 }
2219
2220 return D.getLanguageLinkage() == CLanguageLinkage;
2221}
2222
2224 return getDeclLanguageLinkage(*this);
2225}
2226
2228 return isDeclExternC(*this);
2229}
2230
2233}
2234
2237}
2238
2240
2244 return DeclarationOnly;
2245
2246 // C++ [basic.def]p2:
2247 // A declaration is a definition unless [...] it contains the 'extern'
2248 // specifier or a linkage-specification and neither an initializer [...],
2249 // it declares a non-inline static data member in a class declaration [...],
2250 // it declares a static data member outside a class definition and the variable
2251 // was defined within the class with the constexpr specifier [...],
2252 // C++1y [temp.expl.spec]p15:
2253 // An explicit specialization of a static data member or an explicit
2254 // specialization of a static data member template is a definition if the
2255 // declaration includes an initializer; otherwise, it is a declaration.
2256 //
2257 // FIXME: How do you declare (but not define) a partial specialization of
2258 // a static data member template outside the containing class?
2259 if (isStaticDataMember()) {
2260 if (isOutOfLine() &&
2261 !(getCanonicalDecl()->isInline() &&
2263 (hasInit() ||
2264 // If the first declaration is out-of-line, this may be an
2265 // instantiation of an out-of-line partial specialization of a variable
2266 // template for which we have not yet instantiated the initializer.
2271 isa<VarTemplatePartialSpecializationDecl>(this)))
2272 return Definition;
2273 if (!isOutOfLine() && isInline())
2274 return Definition;
2275 return DeclarationOnly;
2276 }
2277 // C99 6.7p5:
2278 // A definition of an identifier is a declaration for that identifier that
2279 // [...] causes storage to be reserved for that object.
2280 // Note: that applies for all non-file-scope objects.
2281 // C99 6.9.2p1:
2282 // If the declaration of an identifier for an object has file scope and an
2283 // initializer, the declaration is an external definition for the identifier
2284 if (hasInit())
2285 return Definition;
2286
2287 if (hasDefiningAttr())
2288 return Definition;
2289
2290 if (const auto *SAA = getAttr<SelectAnyAttr>())
2291 if (!SAA->isInherited())
2292 return Definition;
2293
2294 // A variable template specialization (other than a static data member
2295 // template or an explicit specialization) is a declaration until we
2296 // instantiate its initializer.
2297 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(this)) {
2298 if (VTSD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
2299 !isa<VarTemplatePartialSpecializationDecl>(VTSD) &&
2300 !VTSD->IsCompleteDefinition)
2301 return DeclarationOnly;
2302 }
2303
2304 if (hasExternalStorage())
2305 return DeclarationOnly;
2306
2307 // [dcl.link] p7:
2308 // A declaration directly contained in a linkage-specification is treated
2309 // as if it contains the extern specifier for the purpose of determining
2310 // the linkage of the declared name and whether it is a definition.
2311 if (isSingleLineLanguageLinkage(*this))
2312 return DeclarationOnly;
2313
2314 // C99 6.9.2p2:
2315 // A declaration of an object that has file scope without an initializer,
2316 // and without a storage class specifier or the scs 'static', constitutes
2317 // a tentative definition.
2318 // No such thing in C++.
2319 if (!C.getLangOpts().CPlusPlus && isFileVarDecl())
2320 return TentativeDefinition;
2321
2322 // What's left is (in C, block-scope) declarations without initializers or
2323 // external storage. These are definitions.
2324 return Definition;
2325}
2326
2330 return nullptr;
2331
2332 VarDecl *LastTentative = nullptr;
2333
2334 // Loop through the declaration chain, starting with the most recent.
2336 Decl = Decl->getPreviousDecl()) {
2337 Kind = Decl->isThisDeclarationADefinition();
2338 if (Kind == Definition)
2339 return nullptr;
2340 // Record the first (most recent) TentativeDefinition that is encountered.
2341 if (Kind == TentativeDefinition && !LastTentative)
2342 LastTentative = Decl;
2343 }
2344
2345 return LastTentative;
2346}
2347
2350 for (auto *I : First->redecls()) {
2351 if (I->isThisDeclarationADefinition(C) == Definition)
2352 return I;
2353 }
2354 return nullptr;
2355}
2356
2359
2360 const VarDecl *First = getFirstDecl();
2361 for (auto *I : First->redecls()) {
2362 Kind = std::max(Kind, I->isThisDeclarationADefinition(C));
2363 if (Kind == Definition)
2364 break;
2365 }
2366
2367 return Kind;
2368}
2369
2371 for (auto *I : redecls()) {
2372 if (auto Expr = I->getInit()) {
2373 D = I;
2374 return Expr;
2375 }
2376 }
2377 return nullptr;
2378}
2379
2380bool VarDecl::hasInit() const {
2381 if (auto *P = dyn_cast<ParmVarDecl>(this))
2382 if (P->hasUnparsedDefaultArg() || P->hasUninstantiatedDefaultArg())
2383 return false;
2384
2385 if (auto *Eval = getEvaluatedStmt())
2386 return Eval->Value.isValid();
2387
2388 return !Init.isNull();
2389}
2390
2392 if (!hasInit())
2393 return nullptr;
2394
2395 if (auto *S = Init.dyn_cast<Stmt *>())
2396 return cast<Expr>(S);
2397
2398 auto *Eval = getEvaluatedStmt();
2399
2400 return cast<Expr>(Eval->Value.get(
2401 Eval->Value.isOffset() ? getASTContext().getExternalSource() : nullptr));
2402}
2403
2405 if (auto *ES = Init.dyn_cast<EvaluatedStmt *>())
2406 return ES->Value.getAddressOfPointer(getASTContext().getExternalSource());
2407
2408 return Init.getAddrOfPtr1();
2409}
2410
2412 VarDecl *Def = nullptr;
2413 for (auto *I : redecls()) {
2414 if (I->hasInit())
2415 return I;
2416
2417 if (I->isThisDeclarationADefinition()) {
2418 if (isStaticDataMember())
2419 return I;
2420 Def = I;
2421 }
2422 }
2423 return Def;
2424}
2425
2427 if (Decl::isOutOfLine())
2428 return true;
2429
2430 if (!isStaticDataMember())
2431 return false;
2432
2433 // If this static data member was instantiated from a static data member of
2434 // a class template, check whether that static data member was defined
2435 // out-of-line.
2437 return VD->isOutOfLine();
2438
2439 return false;
2440}
2441
2443 if (auto *Eval = Init.dyn_cast<EvaluatedStmt *>()) {
2444 Eval->~EvaluatedStmt();
2445 getASTContext().Deallocate(Eval);
2446 }
2447
2448 Init = I;
2449}
2450
2452 const LangOptions &Lang = C.getLangOpts();
2453
2454 // OpenCL permits const integral variables to be used in constant
2455 // expressions, like in C++98.
2456 if (!Lang.CPlusPlus && !Lang.OpenCL && !Lang.C23)
2457 return false;
2458
2459 // Function parameters are never usable in constant expressions.
2460 if (isa<ParmVarDecl>(this))
2461 return false;
2462
2463 // The values of weak variables are never usable in constant expressions.
2464 if (isWeak())
2465 return false;
2466
2467 // In C++11, any variable of reference type can be used in a constant
2468 // expression if it is initialized by a constant expression.
2469 if (Lang.CPlusPlus11 && getType()->isReferenceType())
2470 return true;
2471
2472 // Only const objects can be used in constant expressions in C++. C++98 does
2473 // not require the variable to be non-volatile, but we consider this to be a
2474 // defect.
2475 if (!getType().isConstant(C) || getType().isVolatileQualified())
2476 return false;
2477
2478 // In C++, but not in C, const, non-volatile variables of integral or
2479 // enumeration types can be used in constant expressions.
2480 if (getType()->isIntegralOrEnumerationType() && !Lang.C23)
2481 return true;
2482
2483 // C23 6.6p7: An identifier that is:
2484 // ...
2485 // - declared with storage-class specifier constexpr and has an object type,
2486 // is a named constant, ... such a named constant is a constant expression
2487 // with the type and value of the declared object.
2488 // Additionally, in C++11, non-volatile constexpr variables can be used in
2489 // constant expressions.
2490 return (Lang.CPlusPlus11 || Lang.C23) && isConstexpr();
2491}
2492
2494 // C++2a [expr.const]p3:
2495 // A variable is usable in constant expressions after its initializing
2496 // declaration is encountered...
2497 const VarDecl *DefVD = nullptr;
2498 const Expr *Init = getAnyInitializer(DefVD);
2499 if (!Init || Init->isValueDependent() || getType()->isDependentType())
2500 return false;
2501 // ... if it is a constexpr variable, or it is of reference type or of
2502 // const-qualified integral or enumeration type, ...
2503 if (!DefVD->mightBeUsableInConstantExpressions(Context))
2504 return false;
2505 // ... and its initializer is a constant initializer.
2506 if (Context.getLangOpts().CPlusPlus && !DefVD->hasConstantInitialization())
2507 return false;
2508 // C++98 [expr.const]p1:
2509 // An integral constant-expression can involve only [...] const variables
2510 // or static data members of integral or enumeration types initialized with
2511 // [integer] constant expressions (dcl.init)
2512 if ((Context.getLangOpts().CPlusPlus || Context.getLangOpts().OpenCL) &&
2513 !Context.getLangOpts().CPlusPlus11 && !DefVD->hasICEInitializer(Context))
2514 return false;
2515 return true;
2516}
2517
2518/// Convert the initializer for this declaration to the elaborated EvaluatedStmt
2519/// form, which contains extra information on the evaluated value of the
2520/// initializer.
2522 auto *Eval = Init.dyn_cast<EvaluatedStmt *>();
2523 if (!Eval) {
2524 // Note: EvaluatedStmt contains an APValue, which usually holds
2525 // resources not allocated from the ASTContext. We need to do some
2526 // work to avoid leaking those, but we do so in VarDecl::evaluateValue
2527 // where we can detect whether there's anything to clean up or not.
2528 Eval = new (getASTContext()) EvaluatedStmt;
2529 Eval->Value = Init.get<Stmt *>();
2530 Init = Eval;
2531 }
2532 return Eval;
2533}
2534
2536 return Init.dyn_cast<EvaluatedStmt *>();
2537}
2538
2541 return evaluateValueImpl(Notes, hasConstantInitialization());
2542}
2543
2544APValue *VarDecl::evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
2545 bool IsConstantInitialization) const {
2547
2548 const auto *Init = getInit();
2549 assert(!Init->isValueDependent());
2550
2551 // We only produce notes indicating why an initializer is non-constant the
2552 // first time it is evaluated. FIXME: The notes won't always be emitted the
2553 // first time we try evaluation, so might not be produced at all.
2554 if (Eval->WasEvaluated)
2555 return Eval->Evaluated.isAbsent() ? nullptr : &Eval->Evaluated;
2556
2557 if (Eval->IsEvaluating) {
2558 // FIXME: Produce a diagnostic for self-initialization.
2559 return nullptr;
2560 }
2561
2562 Eval->IsEvaluating = true;
2563
2564 ASTContext &Ctx = getASTContext();
2565 bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, Ctx, this, Notes,
2566 IsConstantInitialization);
2567
2568 // In C++, or in C23 if we're initialising a 'constexpr' variable, this isn't
2569 // a constant initializer if we produced notes. In that case, we can't keep
2570 // the result, because it may only be correct under the assumption that the
2571 // initializer is a constant context.
2572 if (IsConstantInitialization &&
2573 (Ctx.getLangOpts().CPlusPlus ||
2574 (isConstexpr() && Ctx.getLangOpts().C23)) &&
2575 !Notes.empty())
2576 Result = false;
2577
2578 // Ensure the computed APValue is cleaned up later if evaluation succeeded,
2579 // or that it's empty (so that there's nothing to clean up) if evaluation
2580 // failed.
2581 if (!Result)
2582 Eval->Evaluated = APValue();
2583 else if (Eval->Evaluated.needsCleanup())
2584 Ctx.addDestruction(&Eval->Evaluated);
2585
2586 Eval->IsEvaluating = false;
2587 Eval->WasEvaluated = true;
2588
2589 return Result ? &Eval->Evaluated : nullptr;
2590}
2591
2593 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2594 if (Eval->WasEvaluated)
2595 return &Eval->Evaluated;
2596
2597 return nullptr;
2598}
2599
2600bool VarDecl::hasICEInitializer(const ASTContext &Context) const {
2601 const Expr *Init = getInit();
2602 assert(Init && "no initializer");
2603
2605 if (!Eval->CheckedForICEInit) {
2606 Eval->CheckedForICEInit = true;
2607 Eval->HasICEInit = Init->isIntegerConstantExpr(Context);
2608 }
2609 return Eval->HasICEInit;
2610}
2611
2613 // In C, all globals (and only globals) have constant initialization.
2615 return true;
2616
2617 // In C++, it depends on whether the evaluation at the point of definition
2618 // was evaluatable as a constant initializer.
2619 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2620 return Eval->HasConstantInitialization;
2621
2622 return false;
2623}
2624
2628 // If we ask for the value before we know whether we have a constant
2629 // initializer, we can compute the wrong value (for example, due to
2630 // std::is_constant_evaluated()).
2631 assert(!Eval->WasEvaluated &&
2632 "already evaluated var value before checking for constant init");
2633 assert((getASTContext().getLangOpts().CPlusPlus ||
2635 "only meaningful in C++/C23");
2636
2637 assert(!getInit()->isValueDependent());
2638
2639 // Evaluate the initializer to check whether it's a constant expression.
2641 evaluateValueImpl(Notes, true) && Notes.empty();
2642
2643 // If evaluation as a constant initializer failed, allow re-evaluation as a
2644 // non-constant initializer if we later find we want the value.
2645 if (!Eval->HasConstantInitialization)
2646 Eval->WasEvaluated = false;
2647
2648 return Eval->HasConstantInitialization;
2649}
2650
2652 return isa<PackExpansionType>(getType());
2653}
2654
2655template<typename DeclT>
2656static DeclT *getDefinitionOrSelf(DeclT *D) {
2657 assert(D);
2658 if (auto *Def = D->getDefinition())
2659 return Def;
2660 return D;
2661}
2662
2664 return hasAttr<BlocksAttr>() && NonParmVarDeclBits.EscapingByref;
2665}
2666
2668 return hasAttr<BlocksAttr>() && !NonParmVarDeclBits.EscapingByref;
2669}
2670
2672 QualType T = getType();
2673 return T->isDependentType() || T->isUndeducedType() ||
2674 llvm::any_of(specific_attrs<AlignedAttr>(), [](const AlignedAttr *AA) {
2675 return AA->isAlignmentDependent();
2676 });
2677}
2678
2680 const VarDecl *VD = this;
2681
2682 // If this is an instantiated member, walk back to the template from which
2683 // it was instantiated.
2685 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
2687 while (auto *NewVD = VD->getInstantiatedFromStaticDataMember())
2688 VD = NewVD;
2689 }
2690 }
2691
2692 // If it's an instantiated variable template specialization, find the
2693 // template or partial specialization from which it was instantiated.
2694 if (auto *VDTemplSpec = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
2695 if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) {
2696 auto From = VDTemplSpec->getInstantiatedFrom();
2697 if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) {
2698 while (!VTD->isMemberSpecialization()) {
2699 auto *NewVTD = VTD->getInstantiatedFromMemberTemplate();
2700 if (!NewVTD)
2701 break;
2702 VTD = NewVTD;
2703 }
2704 return getDefinitionOrSelf(VTD->getTemplatedDecl());
2705 }
2706 if (auto *VTPSD =
2707 From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
2708 while (!VTPSD->isMemberSpecialization()) {
2709 auto *NewVTPSD = VTPSD->getInstantiatedFromMember();
2710 if (!NewVTPSD)
2711 break;
2712 VTPSD = NewVTPSD;
2713 }
2714 return getDefinitionOrSelf<VarDecl>(VTPSD);
2715 }
2716 }
2717 }
2718
2719 // If this is the pattern of a variable template, find where it was
2720 // instantiated from. FIXME: Is this necessary?
2721 if (VarTemplateDecl *VarTemplate = VD->getDescribedVarTemplate()) {
2722 while (!VarTemplate->isMemberSpecialization()) {
2723 auto *NewVT = VarTemplate->getInstantiatedFromMemberTemplate();
2724 if (!NewVT)
2725 break;
2726 VarTemplate = NewVT;
2727 }
2728
2729 return getDefinitionOrSelf(VarTemplate->getTemplatedDecl());
2730 }
2731
2732 if (VD == this)
2733 return nullptr;
2734 return getDefinitionOrSelf(const_cast<VarDecl*>(VD));
2735}
2736
2739 return cast<VarDecl>(MSI->getInstantiatedFrom());
2740
2741 return nullptr;
2742}
2743
2745 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2746 return Spec->getSpecializationKind();
2747
2749 return MSI->getTemplateSpecializationKind();
2750
2751 return TSK_Undeclared;
2752}
2753
2757 return MSI->getTemplateSpecializationKind();
2758
2759 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2760 return Spec->getSpecializationKind();
2761
2762 return TSK_Undeclared;
2763}
2764
2766 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2767 return Spec->getPointOfInstantiation();
2768
2770 return MSI->getPointOfInstantiation();
2771
2772 return SourceLocation();
2773}
2774
2777 .dyn_cast<VarTemplateDecl *>();
2778}
2779
2782}
2783
2785 const auto &LangOpts = getASTContext().getLangOpts();
2786 // In CUDA mode without relocatable device code, variables of form 'extern
2787 // __shared__ Foo foo[]' are pointers to the base of the GPU core's shared
2788 // memory pool. These are never undefined variables, even if they appear
2789 // inside of an anon namespace or static function.
2790 //
2791 // With CUDA relocatable device code enabled, these variables don't get
2792 // special handling; they're treated like regular extern variables.
2793 if (LangOpts.CUDA && !LangOpts.GPURelocatableDeviceCode &&
2794 hasExternalStorage() && hasAttr<CUDASharedAttr>() &&
2795 isa<IncompleteArrayType>(getType()))
2796 return true;
2797
2798 return hasDefinition();
2799}
2800
2801bool VarDecl::isNoDestroy(const ASTContext &Ctx) const {
2802 return hasGlobalStorage() && (hasAttr<NoDestroyAttr>() ||
2803 (!Ctx.getLangOpts().RegisterStaticDestructors &&
2804 !hasAttr<AlwaysDestroyAttr>()));
2805}
2806
2809 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2810 if (Eval->HasConstantDestruction)
2811 return QualType::DK_none;
2812
2813 if (isNoDestroy(Ctx))
2814 return QualType::DK_none;
2815
2816 return getType().isDestructedType();
2817}
2818
2820 assert(hasInit() && "Expect initializer to check for flexible array init");
2821 auto *Ty = getType()->getAs<RecordType>();
2822 if (!Ty || !Ty->getDecl()->hasFlexibleArrayMember())
2823 return false;
2824 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens());
2825 if (!List)
2826 return false;
2827 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1);
2828 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType());
2829 if (!InitTy)
2830 return false;
2831 return !InitTy->isZeroSize();
2832}
2833
2835 assert(hasInit() && "Expect initializer to check for flexible array init");
2836 auto *Ty = getType()->getAs<RecordType>();
2837 if (!Ty || !Ty->getDecl()->hasFlexibleArrayMember())
2838 return CharUnits::Zero();
2839 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens());
2840 if (!List || List->getNumInits() == 0)
2841 return CharUnits::Zero();
2842 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1);
2843 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType());
2844 if (!InitTy)
2845 return CharUnits::Zero();
2846 CharUnits FlexibleArraySize = Ctx.getTypeSizeInChars(InitTy);
2847 const ASTRecordLayout &RL = Ctx.getASTRecordLayout(Ty->getDecl());
2848 CharUnits FlexibleArrayOffset =
2850 if (FlexibleArrayOffset + FlexibleArraySize < RL.getSize())
2851 return CharUnits::Zero();
2852 return FlexibleArrayOffset + FlexibleArraySize - RL.getSize();
2853}
2854
2856 if (isStaticDataMember())
2857 // FIXME: Remove ?
2858 // return getASTContext().getInstantiatedFromStaticDataMember(this);
2860 .dyn_cast<MemberSpecializationInfo *>();
2861 return nullptr;
2862}
2863
2865 SourceLocation PointOfInstantiation) {
2866 assert((isa<VarTemplateSpecializationDecl>(this) ||
2868 "not a variable or static data member template specialization");
2869
2871 dyn_cast<VarTemplateSpecializationDecl>(this)) {
2872 Spec->setSpecializationKind(TSK);
2873 if (TSK != TSK_ExplicitSpecialization &&
2874 PointOfInstantiation.isValid() &&
2875 Spec->getPointOfInstantiation().isInvalid()) {
2876 Spec->setPointOfInstantiation(PointOfInstantiation);
2878 L->InstantiationRequested(this);
2879 }
2881 MSI->setTemplateSpecializationKind(TSK);
2882 if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() &&
2883 MSI->getPointOfInstantiation().isInvalid()) {
2884 MSI->setPointOfInstantiation(PointOfInstantiation);
2886 L->InstantiationRequested(this);
2887 }
2888 }
2889}
2890
2891void
2894 assert(getASTContext().getTemplateOrSpecializationInfo(this).isNull() &&
2895 "Previous template or instantiation?");
2897}
2898
2899//===----------------------------------------------------------------------===//
2900// ParmVarDecl Implementation
2901//===----------------------------------------------------------------------===//
2902
2904 SourceLocation StartLoc, SourceLocation IdLoc,
2905 const IdentifierInfo *Id, QualType T,
2906 TypeSourceInfo *TInfo, StorageClass S,
2907 Expr *DefArg) {
2908 return new (C, DC) ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo,
2909 S, DefArg);
2910}
2911
2914 QualType T = TSI ? TSI->getType() : getType();
2915 if (const auto *DT = dyn_cast<DecayedType>(T))
2916 return DT->getOriginalType();
2917 return T;
2918}
2919
2921 return new (C, ID)
2922 ParmVarDecl(ParmVar, C, nullptr, SourceLocation(), SourceLocation(),
2923 nullptr, QualType(), nullptr, SC_None, nullptr);
2924}
2925
2927 if (!hasInheritedDefaultArg()) {
2928 SourceRange ArgRange = getDefaultArgRange();
2929 if (ArgRange.isValid())
2930 return SourceRange(getOuterLocStart(), ArgRange.getEnd());
2931 }
2932
2933 // DeclaratorDecl considers the range of postfix types as overlapping with the
2934 // declaration name, but this is not the case with parameters in ObjC methods.
2935 if (isa<ObjCMethodDecl>(getDeclContext()))
2937
2939}
2940
2942 // ns_consumed only affects code generation in ARC
2943 if (hasAttr<NSConsumedAttr>())
2944 return getASTContext().getLangOpts().ObjCAutoRefCount;
2945
2946 // FIXME: isParamDestroyedInCallee() should probably imply
2947 // isDestructedType()
2948 const auto *RT = getType()->getAs<RecordType>();
2949 if (RT && RT->getDecl()->isParamDestroyedInCallee() &&
2951 return true;
2952
2953 return false;
2954}
2955
2957 assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!");
2958 assert(!hasUninstantiatedDefaultArg() &&
2959 "Default argument is not yet instantiated!");
2960
2961 Expr *Arg = getInit();
2962 if (auto *E = dyn_cast_if_present<FullExpr>(Arg))
2963 return E->getSubExpr();
2964
2965 return Arg;
2966}
2967
2969 ParmVarDeclBits.DefaultArgKind = DAK_Normal;
2970 Init = defarg;
2971}
2972
2974 switch (ParmVarDeclBits.DefaultArgKind) {
2975 case DAK_None:
2976 case DAK_Unparsed:
2977 // Nothing we can do here.
2978 return SourceRange();
2979
2980 case DAK_Uninstantiated:
2982
2983 case DAK_Normal:
2984 if (const Expr *E = getInit())
2985 return E->getSourceRange();
2986
2987 // Missing an actual expression, may be invalid.
2988 return SourceRange();
2989 }
2990 llvm_unreachable("Invalid default argument kind.");
2991}
2992
2994 ParmVarDeclBits.DefaultArgKind = DAK_Uninstantiated;
2995 Init = arg;
2996}
2997
2999 assert(hasUninstantiatedDefaultArg() &&
3000 "Wrong kind of initialization expression!");
3001 return cast_if_present<Expr>(Init.get<Stmt *>());
3002}
3003
3005 // FIXME: We should just return false for DAK_None here once callers are
3006 // prepared for the case that we encountered an invalid default argument and
3007 // were unable to even build an invalid expression.
3009 !Init.isNull();
3010}
3011
3012void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) {
3013 getASTContext().setParameterIndex(this, parameterIndex);
3014 ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel;
3015}
3016
3017unsigned ParmVarDecl::getParameterIndexLarge() const {
3018 return getASTContext().getParameterIndex(this);
3019}
3020
3021//===----------------------------------------------------------------------===//
3022// FunctionDecl Implementation
3023//===----------------------------------------------------------------------===//
3024
3026 SourceLocation StartLoc,
3027 const DeclarationNameInfo &NameInfo, QualType T,
3028 TypeSourceInfo *TInfo, StorageClass S,
3029 bool UsesFPIntrin, bool isInlineSpecified,
3030 ConstexprSpecKind ConstexprKind,
3031 Expr *TrailingRequiresClause)
3032 : DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo,
3033 StartLoc),
3034 DeclContext(DK), redeclarable_base(C), Body(), ODRHash(0),
3035 EndRangeLoc(NameInfo.getEndLoc()), DNLoc(NameInfo.getInfo()) {
3036 assert(T.isNull() || T->isFunctionType());
3037 FunctionDeclBits.SClass = S;
3039 FunctionDeclBits.IsInlineSpecified = isInlineSpecified;
3040 FunctionDeclBits.IsVirtualAsWritten = false;
3041 FunctionDeclBits.IsPureVirtual = false;
3042 FunctionDeclBits.HasInheritedPrototype = false;
3043 FunctionDeclBits.HasWrittenPrototype = true;
3044 FunctionDeclBits.IsDeleted = false;
3045 FunctionDeclBits.IsTrivial = false;
3046 FunctionDeclBits.IsTrivialForCall = false;
3047 FunctionDeclBits.IsDefaulted = false;
3048 FunctionDeclBits.IsExplicitlyDefaulted = false;
3049 FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
3050 FunctionDeclBits.IsIneligibleOrNotSelected = false;
3051 FunctionDeclBits.HasImplicitReturnZero = false;
3052 FunctionDeclBits.IsLateTemplateParsed = false;
3053 FunctionDeclBits.ConstexprKind = static_cast<uint64_t>(ConstexprKind);
3054 FunctionDeclBits.BodyContainsImmediateEscalatingExpression = false;
3055 FunctionDeclBits.InstantiationIsPending = false;
3056 FunctionDeclBits.UsesSEHTry = false;
3057 FunctionDeclBits.UsesFPIntrin = UsesFPIntrin;
3058 FunctionDeclBits.HasSkippedBody = false;
3059 FunctionDeclBits.WillHaveBody = false;
3060 FunctionDeclBits.IsMultiVersion = false;
3061 FunctionDeclBits.DeductionCandidateKind =
3062 static_cast<unsigned char>(DeductionCandidate::Normal);
3063 FunctionDeclBits.HasODRHash = false;
3064 FunctionDeclBits.FriendConstraintRefersToEnclosingTemplate = false;
3065 if (TrailingRequiresClause)
3066 setTrailingRequiresClause(TrailingRequiresClause);
3067}
3068
3070 raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
3073 if (TemplateArgs)
3074 printTemplateArgumentList(OS, TemplateArgs->asArray(), Policy);
3075}
3076
3078 if (const auto *FT = getType()->getAs<FunctionProtoType>())
3079 return FT->isVariadic();
3080 return false;
3081}
3082
3085 ASTContext &Context, ArrayRef<DeclAccessPair> Lookups,
3086 StringLiteral *DeletedMessage) {
3087 static constexpr size_t Alignment =
3088 std::max({alignof(DefaultedOrDeletedFunctionInfo),
3089 alignof(DeclAccessPair), alignof(StringLiteral *)});
3090 size_t Size = totalSizeToAlloc<DeclAccessPair, StringLiteral *>(
3091 Lookups.size(), DeletedMessage != nullptr);
3092
3094 new (Context.Allocate(Size, Alignment)) DefaultedOrDeletedFunctionInfo;
3095 Info->NumLookups = Lookups.size();
3096 Info->HasDeletedMessage = DeletedMessage != nullptr;
3097
3098 std::uninitialized_copy(Lookups.begin(), Lookups.end(),
3099 Info->getTrailingObjects<DeclAccessPair>());
3100 if (DeletedMessage)
3101 *Info->getTrailingObjects<StringLiteral *>() = DeletedMessage;
3102 return Info;
3103}
3104
3107 assert(!FunctionDeclBits.HasDefaultedOrDeletedInfo && "already have this");
3108 assert(!Body && "can't replace function body with defaulted function info");
3109
3110 FunctionDeclBits.HasDefaultedOrDeletedInfo = true;
3112}
3113
3115 FunctionDeclBits.IsDeleted = D;
3116
3117 if (Message) {
3118 assert(isDeletedAsWritten() && "Function must be deleted");
3119 if (FunctionDeclBits.HasDefaultedOrDeletedInfo)
3121 else
3123 getASTContext(), /*Lookups=*/{}, Message));
3124 }
3125}
3126
3128 StringLiteral *Message) {
3129 // We should never get here with the DefaultedOrDeletedInfo populated, but
3130 // no space allocated for the deleted message, since that would require
3131 // recreating this, but setDefaultedOrDeletedInfo() disallows overwriting
3132 // an already existing DefaultedOrDeletedFunctionInfo.
3133 assert(HasDeletedMessage &&
3134 "No space to store a delete message in this DefaultedOrDeletedInfo");
3135 *getTrailingObjects<StringLiteral *>() = Message;
3136}
3137
3140 return FunctionDeclBits.HasDefaultedOrDeletedInfo ? DefaultedOrDeletedInfo
3141 : nullptr;
3142}
3143
3145 for (const auto *I : redecls()) {
3146 if (I->doesThisDeclarationHaveABody()) {
3147 Definition = I;
3148 return true;
3149 }
3150 }
3151
3152 return false;
3153}
3154
3156 const Stmt *S = getBody();
3157 if (!S) {
3158 // Since we don't have a body for this function, we don't know if it's
3159 // trivial or not.
3160 return false;
3161 }
3162
3163 if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty())
3164 return true;
3165 return false;
3166}
3167
3169 if (!getFriendObjectKind())
3170 return false;
3171
3172 // Check for a friend function instantiated from a friend function
3173 // definition in a templated class.
3174 if (const FunctionDecl *InstantiatedFrom =
3176 return InstantiatedFrom->getFriendObjectKind() &&
3177 InstantiatedFrom->isThisDeclarationADefinition();
3178
3179 // Check for a friend function template instantiated from a friend
3180 // function template definition in a templated class.
3181 if (const FunctionTemplateDecl *Template = getDescribedFunctionTemplate()) {
3182 if (const FunctionTemplateDecl *InstantiatedFrom =
3184 return InstantiatedFrom->getFriendObjectKind() &&
3185 InstantiatedFrom->isThisDeclarationADefinition();
3186 }
3187
3188 return false;
3189}
3190
3192 bool CheckForPendingFriendDefinition) const {
3193 for (const FunctionDecl *FD : redecls()) {
3194 if (FD->isThisDeclarationADefinition()) {
3195 Definition = FD;
3196 return true;
3197 }
3198
3199 // If this is a friend function defined in a class template, it does not
3200 // have a body until it is used, nevertheless it is a definition, see
3201 // [temp.inst]p2:
3202 //
3203 // ... for the purpose of determining whether an instantiated redeclaration
3204 // is valid according to [basic.def.odr] and [class.mem], a declaration that
3205 // corresponds to a definition in the template is considered to be a
3206 // definition.
3207 //
3208 // The following code must produce redefinition error:
3209 //
3210 // template<typename T> struct C20 { friend void func_20() {} };
3211 // C20<int> c20i;
3212 // void func_20() {}
3213 //
3214 if (CheckForPendingFriendDefinition &&
3215 FD->isThisDeclarationInstantiatedFromAFriendDefinition()) {
3216 Definition = FD;
3217 return true;
3218 }
3219 }
3220
3221 return false;
3222}
3223
3225 if (!hasBody(Definition))
3226 return nullptr;
3227
3228 assert(!Definition->FunctionDeclBits.HasDefaultedOrDeletedInfo &&
3229 "definition should not have a body");
3230 if (Definition->Body)
3231 return Definition->Body.get(getASTContext().getExternalSource());
3232
3233 return nullptr;
3234}
3235
3237 FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
3238 Body = LazyDeclStmtPtr(B);
3239 if (B)
3240 EndRangeLoc = B->getEndLoc();
3241}
3242
3244 FunctionDeclBits.IsPureVirtual = P;
3245 if (P)
3246 if (auto *Parent = dyn_cast<CXXRecordDecl>(getDeclContext()))
3247 Parent->markedVirtualFunctionPure();
3248}
3249
3250template<std::size_t Len>
3251static bool isNamed(const NamedDecl *ND, const char (&Str)[Len]) {
3252 const IdentifierInfo *II = ND->getIdentifier();
3253 return II && II->isStr(Str);
3254}
3255
3257 // C++23 [expr.const]/p17
3258 // An immediate-escalating function is
3259 // - the call operator of a lambda that is not declared with the consteval
3260 // specifier,
3261 if (isLambdaCallOperator(this) && !isConsteval())
3262 return true;
3263 // - a defaulted special member function that is not declared with the
3264 // consteval specifier,
3265 if (isDefaulted() && !isConsteval())
3266 return true;
3267 // - a function that results from the instantiation of a templated entity
3268 // defined with the constexpr specifier.
3270 if (TK != TK_NonTemplate && TK != TK_DependentNonTemplate &&
3272 return true;
3273 return false;
3274}
3275
3277 // C++23 [expr.const]/p18
3278 // An immediate function is a function or constructor that is
3279 // - declared with the consteval specifier
3280 if (isConsteval())
3281 return true;
3282 // - an immediate-escalating function F whose function body contains an
3283 // immediate-escalating expression
3285 return true;
3286
3287 if (const auto *MD = dyn_cast<CXXMethodDecl>(this);
3288 MD && MD->isLambdaStaticInvoker())
3289 return MD->getParent()->getLambdaCallOperator()->isImmediateFunction();
3290
3291 return false;
3292}
3293
3295 return isNamed(this, "main") && !getLangOpts().Freestanding &&
3297 isExternC());
3298}
3299
3301 const TranslationUnitDecl *TUnit =
3302 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext());
3303 if (!TUnit)
3304 return false;
3305
3306 // Even though we aren't really targeting MSVCRT if we are freestanding,
3307 // semantic analysis for these functions remains the same.
3308
3309 // MSVCRT entry points only exist on MSVCRT targets.
3310 if (!TUnit->getASTContext().getTargetInfo().getTriple().isOSMSVCRT())
3311 return false;
3312
3313 // Nameless functions like constructors cannot be entry points.
3314 if (!getIdentifier())
3315 return false;
3316
3317 return llvm::StringSwitch<bool>(getName())
3318 .Cases("main", // an ANSI console app
3319 "wmain", // a Unicode console App
3320 "WinMain", // an ANSI GUI app
3321 "wWinMain", // a Unicode GUI app
3322 "DllMain", // a DLL
3323 true)
3324 .Default(false);
3325}
3326
3328 if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName)
3329 return false;
3330 if (getDeclName().getCXXOverloadedOperator() != OO_New &&
3331 getDeclName().getCXXOverloadedOperator() != OO_Delete &&
3332 getDeclName().getCXXOverloadedOperator() != OO_Array_New &&
3333 getDeclName().getCXXOverloadedOperator() != OO_Array_Delete)
3334 return false;
3335
3337 return false;
3338
3339 const auto *proto = getType()->castAs<FunctionProtoType>();
3340 if (proto->getNumParams() != 2 || proto->isVariadic())
3341 return false;
3342
3343 const ASTContext &Context =
3344 cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext())
3345 ->getASTContext();
3346
3347 // The result type and first argument type are constant across all
3348 // these operators. The second argument must be exactly void*.
3349 return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy);
3350}
3351
3353 std::optional<unsigned> *AlignmentParam, bool *IsNothrow) const {
3354 if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName)
3355 return false;
3356 if (getDeclName().getCXXOverloadedOperator() != OO_New &&
3357 getDeclName().getCXXOverloadedOperator() != OO_Delete &&
3358 getDeclName().getCXXOverloadedOperator() != OO_Array_New &&
3359 getDeclName().getCXXOverloadedOperator() != OO_Array_Delete)
3360 return false;
3361
3362 if (isa<CXXRecordDecl>(getDeclContext()))
3363 return false;
3364
3365 // This can only fail for an invalid 'operator new' declaration.
3367 return false;
3368
3369 const auto *FPT = getType()->castAs<FunctionProtoType>();
3370 if (FPT->getNumParams() == 0 || FPT->getNumParams() > 4 || FPT->isVariadic())
3371 return false;
3372
3373 // If this is a single-parameter function, it must be a replaceable global
3374 // allocation or deallocation function.
3375 if (FPT->getNumParams() == 1)
3376 return true;
3377
3378 unsigned Params = 1;
3379 QualType Ty = FPT->getParamType(Params);
3380 const ASTContext &Ctx = getASTContext();
3381
3382 auto Consume = [&] {
3383 ++Params;
3384 Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType();
3385 };
3386
3387 // In C++14, the next parameter can be a 'std::size_t' for sized delete.
3388 bool IsSizedDelete = false;
3389 if (Ctx.getLangOpts().SizedDeallocation &&
3390 (getDeclName().getCXXOverloadedOperator() == OO_Delete ||
3391 getDeclName().getCXXOverloadedOperator() == OO_Array_Delete) &&
3392 Ctx.hasSameType(Ty, Ctx.getSizeType())) {
3393 IsSizedDelete = true;
3394 Consume();
3395 }
3396
3397 // In C++17, the next parameter can be a 'std::align_val_t' for aligned
3398 // new/delete.
3399 if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT()) {
3400 Consume();
3401 if (AlignmentParam)
3402 *AlignmentParam = Params;
3403 }
3404
3405 // If this is not a sized delete, the next parameter can be a
3406 // 'const std::nothrow_t&'.
3407 if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) {
3408 Ty = Ty->getPointeeType();
3410 return false;
3411 if (Ty->isNothrowT()) {
3412 if (IsNothrow)
3413 *IsNothrow = true;
3414 Consume();
3415 }
3416 }
3417
3418 // Finally, recognize the not yet standard versions of new that take a
3419 // hot/cold allocation hint (__hot_cold_t). These are currently supported by
3420 // tcmalloc (see
3421 // https://github.com/google/tcmalloc/blob/220043886d4e2efff7a5702d5172cb8065253664/tcmalloc/malloc_extension.h#L53).
3422 if (!IsSizedDelete && !Ty.isNull() && Ty->isEnumeralType()) {
3423 QualType T = Ty;
3424 while (const auto *TD = T->getAs<TypedefType>())
3425 T = TD->getDecl()->getUnderlyingType();
3426 const IdentifierInfo *II =
3427 T->castAs<EnumType>()->getDecl()->getIdentifier();
3428 if (II && II->isStr("__hot_cold_t"))
3429 Consume();
3430 }
3431
3432 return Params == FPT->getNumParams();
3433}
3434
3436 if (!getBuiltinID())
3437 return false;
3438
3439 const FunctionDecl *Definition;
3440 if (!hasBody(Definition))
3441 return false;
3442
3443 if (!Definition->isInlineSpecified() ||
3444 !Definition->hasAttr<AlwaysInlineAttr>())
3445 return false;
3446
3447 ASTContext &Context = getASTContext();
3448 switch (Context.GetGVALinkageForFunction(Definition)) {
3449 case GVA_Internal:
3450 case GVA_DiscardableODR:
3451 case GVA_StrongODR:
3452 return false;
3454 case GVA_StrongExternal:
3455 return true;
3456 }
3457 llvm_unreachable("Unknown GVALinkage");
3458}
3459
3461 // C++ P0722:
3462 // Within a class C, a single object deallocation function with signature
3463 // (T, std::destroying_delete_t, <more params>)
3464 // is a destroying operator delete.
3465 if (!isa<CXXMethodDecl>(this) || getOverloadedOperator() != OO_Delete ||
3466 getNumParams() < 2)
3467 return false;
3468
3469 auto *RD = getParamDecl(1)->getType()->getAsCXXRecordDecl();
3470 return RD && RD->isInStdNamespace() && RD->getIdentifier() &&
3471 RD->getIdentifier()->isStr("destroying_delete_t");
3472}
3473
3475 return getDeclLanguageLinkage(*this);
3476}
3477
3479 return isDeclExternC(*this);
3480}
3481
3483 if (hasAttr<OpenCLKernelAttr>())
3484 return true;
3486}
3487
3490}
3491
3493 if (const auto *Method = dyn_cast<CXXMethodDecl>(this))
3494 return Method->isStatic();
3495
3497 return false;
3498
3499 for (const DeclContext *DC = getDeclContext();
3500 DC->isNamespace();
3501 DC = DC->getParent()) {
3502 if (const auto *Namespace = cast<NamespaceDecl>(DC)) {
3503 if (!Namespace->getDeclName())
3504 return false;
3505 }
3506 }
3507
3508 return true;
3509}
3510
3512 if (hasAttr<NoReturnAttr>() || hasAttr<CXX11NoReturnAttr>() ||
3513 hasAttr<C11NoReturnAttr>())
3514 return true;
3515
3516 if (auto *FnTy = getType()->getAs<FunctionType>())
3517 return FnTy->getNoReturnAttr();
3518
3519 return false;
3520}
3521
3523 // C++20 [temp.friend]p9:
3524 // A non-template friend declaration with a requires-clause [or]
3525 // a friend function template with a constraint that depends on a template
3526 // parameter from an enclosing template [...] does not declare the same
3527 // function or function template as a declaration in any other scope.
3528
3529 // If this isn't a friend then it's not a member-like constrained friend.
3530 if (!getFriendObjectKind()) {
3531 return false;
3532 }
3533
3535 // If these friends don't have constraints, they aren't constrained, and
3536 // thus don't fall under temp.friend p9. Else the simple presence of a
3537 // constraint makes them unique.
3539 }
3540
3542}
3543
3545 if (hasAttr<TargetAttr>())
3547 if (hasAttr<TargetVersionAttr>())
3549 if (hasAttr<CPUDispatchAttr>())
3551 if (hasAttr<CPUSpecificAttr>())
3553 if (hasAttr<TargetClonesAttr>())
3556}
3557
3559 return isMultiVersion() && hasAttr<CPUDispatchAttr>();
3560}
3561
3563 return isMultiVersion() && hasAttr<CPUSpecificAttr>();
3564}
3565
3567 return isMultiVersion() &&
3568 (hasAttr<TargetAttr>() || hasAttr<TargetVersionAttr>());
3569}
3570
3572 if (!isMultiVersion())
3573 return false;
3574 if (hasAttr<TargetAttr>())
3575 return getAttr<TargetAttr>()->isDefaultVersion();
3576 return hasAttr<TargetVersionAttr>() &&
3577 getAttr<TargetVersionAttr>()->isDefaultVersion();
3578}
3579
3581 return isMultiVersion() && hasAttr<TargetClonesAttr>();
3582}
3583
3585 return isMultiVersion() && hasAttr<TargetVersionAttr>();
3586}
3587
3588void
3591
3593 FunctionTemplateDecl *PrevFunTmpl
3594 = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : nullptr;
3595 assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch");
3596 FunTmpl->setPreviousDecl(PrevFunTmpl);
3597 }
3598
3599 if (PrevDecl && PrevDecl->isInlined())
3600 setImplicitlyInline(true);
3601}
3602
3604
3605/// Returns a value indicating whether this function corresponds to a builtin
3606/// function.
3607///
3608/// The function corresponds to a built-in function if it is declared at
3609/// translation scope or within an extern "C" block and its name matches with
3610/// the name of a builtin. The returned value will be 0 for functions that do
3611/// not correspond to a builtin, a value of type \c Builtin::ID if in the
3612/// target-independent range \c [1,Builtin::First), or a target-specific builtin
3613/// value.
3614///
3615/// \param ConsiderWrapperFunctions If true, we should consider wrapper
3616/// functions as their wrapped builtins. This shouldn't be done in general, but
3617/// it's useful in Sema to diagnose calls to wrappers based on their semantics.
3618unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const {
3619 unsigned BuiltinID = 0;
3620
3621 if (const auto *ABAA = getAttr<ArmBuiltinAliasAttr>()) {
3622 BuiltinID = ABAA->getBuiltinName()->getBuiltinID();
3623 } else if (const auto *BAA = getAttr<BuiltinAliasAttr>()) {
3624 BuiltinID = BAA->getBuiltinName()->getBuiltinID();
3625 } else if (const auto *A = getAttr<BuiltinAttr>()) {
3626 BuiltinID = A->getID();
3627 }
3628
3629 if (!BuiltinID)
3630 return 0;
3631
3632 // If the function is marked "overloadable", it has a different mangled name
3633 // and is not the C library function.
3634 if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>() &&
3635 (!hasAttr<ArmBuiltinAliasAttr>() && !hasAttr<BuiltinAliasAttr>()))
3636 return 0;
3637
3638 const ASTContext &Context = getASTContext();
3639 if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3640 return BuiltinID;
3641
3642 // This function has the name of a known C library
3643 // function. Determine whether it actually refers to the C library
3644 // function or whether it just has the same name.
3645
3646 // If this is a static function, it's not a builtin.
3647 if (!ConsiderWrapperFunctions && getStorageClass() == SC_Static)
3648 return 0;
3649
3650 // OpenCL v1.2 s6.9.f - The library functions defined in
3651 // the C99 standard headers are not available.
3652 if (Context.getLangOpts().OpenCL &&
3653 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3654 return 0;
3655
3656 // CUDA does not have device-side standard library. printf and malloc are the
3657 // only special cases that are supported by device-side runtime.
3658 if (Context.getLangOpts().CUDA && hasAttr<CUDADeviceAttr>() &&
3659 !hasAttr<CUDAHostAttr>() &&
3660 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3661 return 0;
3662
3663 // As AMDGCN implementation of OpenMP does not have a device-side standard
3664 // library, none of the predefined library functions except printf and malloc
3665 // should be treated as a builtin i.e. 0 should be returned for them.
3666 if (Context.getTargetInfo().getTriple().isAMDGCN() &&
3667 Context.getLangOpts().OpenMPIsTargetDevice &&
3668 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
3669 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3670 return 0;
3671
3672 return BuiltinID;
3673}
3674
3675/// getNumParams - Return the number of parameters this function must have
3676/// based on its FunctionType. This is the length of the ParamInfo array
3677/// after it has been created.
3679 const auto *FPT = getType()->getAs<FunctionProtoType>();
3680 return FPT ? FPT->getNumParams() : 0;
3681}
3682
3683void FunctionDecl::setParams(ASTContext &C,
3684 ArrayRef<ParmVarDecl *> NewParamInfo) {
3685 assert(!ParamInfo && "Already has param info!");
3686 assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!");
3687
3688 // Zero params -> null pointer.
3689 if (!NewParamInfo.empty()) {
3690 ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
3691 std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo);
3692 }
3693}
3694
3695/// getMinRequiredArguments - Returns the minimum number of arguments
3696/// needed to call this function. This may be fewer than the number of
3697/// function parameters, if some of the parameters have default
3698/// arguments (in C++) or are parameter packs (C++11).
3701 return getNumParams();
3702
3703 // Note that it is possible for a parameter with no default argument to
3704 // follow a parameter with a default argument.
3705 unsigned NumRequiredArgs = 0;
3706 unsigned MinParamsSoFar = 0;
3707 for (auto *Param : parameters()) {
3708 if (!Param->isParameterPack()) {
3709 ++MinParamsSoFar;
3710 if (!Param->hasDefaultArg())
3711 NumRequiredArgs = MinParamsSoFar;
3712 }
3713 }
3714 return NumRequiredArgs;
3715}
3716
3719}
3720
3722 return getNumParams() -
3723 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3724}
3725
3727 return getMinRequiredArguments() -
3728 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3729}
3730
3732 return getNumParams() == 1 ||
3733 (getNumParams() > 1 &&
3734 llvm::all_of(llvm::drop_begin(parameters()),
3735 [](ParmVarDecl *P) { return P->hasDefaultArg(); }));
3736}
3737
3738/// The combination of the extern and inline keywords under MSVC forces
3739/// the function to be required.
3740///
3741/// Note: This function assumes that we will only get called when isInlined()
3742/// would return true for this FunctionDecl.
3744 assert(isInlined() && "expected to get called on an inlined function!");
3745
3746 const ASTContext &Context = getASTContext();
3747 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() &&
3748 !hasAttr<DLLExportAttr>())
3749 return false;
3750
3751 for (const FunctionDecl *FD = getMostRecentDecl(); FD;
3752 FD = FD->getPreviousDecl())
3753 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3754 return true;
3755
3756 return false;
3757}
3758
3759static bool redeclForcesDefMSVC(const FunctionDecl *Redecl) {
3760 if (Redecl->getStorageClass() != SC_Extern)
3761 return false;
3762
3763 for (const FunctionDecl *FD = Redecl->getPreviousDecl(); FD;
3764 FD = FD->getPreviousDecl())
3765 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3766 return false;
3767
3768 return true;
3769}
3770
3771static bool RedeclForcesDefC99(const FunctionDecl *Redecl) {
3772 // Only consider file-scope declarations in this test.
3773 if (!Redecl->getLexicalDeclContext()->isTranslationUnit())
3774 return false;
3775
3776 // Only consider explicit declarations; the presence of a builtin for a
3777 // libcall shouldn't affect whether a definition is externally visible.
3778 if (Redecl->isImplicit())
3779 return false;
3780
3781 if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern)
3782 return true; // Not an inline definition
3783
3784 return false;
3785}
3786
3787/// For a function declaration in C or C++, determine whether this
3788/// declaration causes the definition to be externally visible.
3789///
3790/// For instance, this determines if adding the current declaration to the set
3791/// of redeclarations of the given functions causes
3792/// isInlineDefinitionExternallyVisible to change from false to true.
3794 assert(!doesThisDeclarationHaveABody() &&
3795 "Must have a declaration without a body.");
3796
3797 const ASTContext &Context = getASTContext();
3798
3799 if (Context.getLangOpts().MSVCCompat) {
3800 const FunctionDecl *Definition;
3801 if (hasBody(Definition) && Definition->isInlined() &&
3802 redeclForcesDefMSVC(this))
3803 return true;
3804 }
3805
3806 if (Context.getLangOpts().CPlusPlus)
3807 return false;
3808
3809 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
3810 // With GNU inlining, a declaration with 'inline' but not 'extern', forces
3811 // an externally visible definition.
3812 //
3813 // FIXME: What happens if gnu_inline gets added on after the first
3814 // declaration?
3816 return false;
3817
3818 const FunctionDecl *Prev = this;
3819 bool FoundBody = false;
3820 while ((Prev = Prev->getPreviousDecl())) {
3821 FoundBody |= Prev->doesThisDeclarationHaveABody();
3822
3823 if (Prev->doesThisDeclarationHaveABody()) {
3824 // If it's not the case that both 'inline' and 'extern' are
3825 // specified on the definition, then it is always externally visible.
3826 if (!Prev->isInlineSpecified() ||
3827 Prev->getStorageClass() != SC_Extern)
3828 return false;
3829 } else if (Prev->isInlineSpecified() &&
3830 Prev->getStorageClass() != SC_Extern) {
3831 return false;
3832 }
3833 }
3834 return FoundBody;
3835 }
3836
3837 // C99 6.7.4p6:
3838 // [...] If all of the file scope declarations for a function in a
3839 // translation unit include the inline function specifier without extern,
3840 // then the definition in that translation unit is an inline definition.
3842 return false;
3843 const FunctionDecl *Prev = this;
3844 bool FoundBody = false;
3845 while ((Prev = Prev->getPreviousDecl())) {
3846 FoundBody |= Prev->doesThisDeclarationHaveABody();
3847 if (RedeclForcesDefC99(Prev))
3848 return false;
3849 }
3850 return FoundBody;
3851}
3852
3854 const TypeSourceInfo *TSI = getTypeSourceInfo();
3855 return TSI ? TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>()
3856 : FunctionTypeLoc();
3857}
3858
3861 if (!FTL)
3862 return SourceRange();
3863
3864 // Skip self-referential return types.
3866 SourceRange RTRange = FTL.getReturnLoc().getSourceRange();
3867 SourceLocation Boundary = getNameInfo().getBeginLoc();
3868 if (RTRange.isInvalid() || Boundary.isInvalid() ||
3869 !SM.isBeforeInTranslationUnit(RTRange.getEnd(), Boundary))
3870 return SourceRange();
3871
3872 return RTRange;
3873}
3874
3876 unsigned NP = getNumParams();
3877 SourceLocation EllipsisLoc = getEllipsisLoc();
3878
3879 if (NP == 0 && EllipsisLoc.isInvalid())
3880 return SourceRange();
3881
3883 NP > 0 ? ParamInfo[0]->getSourceRange().getBegin() : EllipsisLoc;
3884 SourceLocation End = EllipsisLoc.isValid()
3885 ? EllipsisLoc
3886 : ParamInfo[NP - 1]->getSourceRange().getEnd();
3887
3888 return SourceRange(Begin, End);
3889}
3890
3893 return FTL ? FTL.getExceptionSpecRange() : SourceRange();
3894}
3895
3896/// For an inline function definition in C, or for a gnu_inline function
3897/// in C++, determine whether the definition will be externally visible.
3898///
3899/// Inline function definitions are always available for inlining optimizations.
3900/// However, depending on the language dialect, declaration specifiers, and
3901/// attributes, the definition of an inline function may or may not be
3902/// "externally" visible to other translation units in the program.
3903///
3904/// In C99, inline definitions are not externally visible by default. However,
3905/// if even one of the global-scope declarations is marked "extern inline", the
3906/// inline definition becomes externally visible (C99 6.7.4p6).
3907///
3908/// In GNU89 mode, or if the gnu_inline attribute is attached to the function
3909/// definition, we use the GNU semantics for inline, which are nearly the
3910/// opposite of C99 semantics. In particular, "inline" by itself will create
3911/// an externally visible symbol, but "extern inline" will not create an
3912/// externally visible symbol.
3915 hasAttr<AliasAttr>()) &&
3916 "Must be a function definition");
3917 assert(isInlined() && "Function must be inline");
3918 ASTContext &Context = getASTContext();
3919
3920 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
3921 // Note: If you change the logic here, please change
3922 // doesDeclarationForceExternallyVisibleDefinition as well.
3923 //
3924 // If it's not the case that both 'inline' and 'extern' are
3925 // specified on the definition, then this inline definition is
3926 // externally visible.
3927 if (Context.getLangOpts().CPlusPlus)
3928 return false;
3930 return true;
3931
3932 // If any declaration is 'inline' but not 'extern', then this definition
3933 // is externally visible.
3934 for (auto *Redecl : redecls()) {
3935 if (Redecl->isInlineSpecified() &&
3936 Redecl->getStorageClass() != SC_Extern)
3937 return true;
3938 }
3939
3940 return false;
3941 }
3942
3943 // The rest of this function is C-only.
3944 assert(!Context.getLangOpts().CPlusPlus &&
3945 "should not use C inline rules in C++");
3946
3947 // C99 6.7.4p6:
3948 // [...] If all of the file scope declarations for a function in a
3949 // translation unit include the inline function specifier without extern,
3950 // then the definition in that translation unit is an inline definition.
3951 for (auto *Redecl : redecls()) {
3952 if (RedeclForcesDefC99(Redecl))
3953 return true;
3954 }
3955
3956 // C99 6.7.4p6:
3957 // An inline definition does not provide an external definition for the
3958 // function, and does not forbid an external definition in another
3959 // translation unit.
3960 return false;
3961}
3962
3963/// getOverloadedOperator - Which C++ overloaded operator this
3964/// function represents, if any.
3966 if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
3968 return OO_None;
3969}
3970
3971/// getLiteralIdentifier - The literal suffix identifier this function
3972/// represents, if any.
3976 return nullptr;
3977}
3978
3980 if (TemplateOrSpecialization.isNull())
3981 return TK_NonTemplate;
3982 if (const auto *ND = TemplateOrSpecialization.dyn_cast<NamedDecl *>()) {
3983 if (isa<FunctionDecl>(ND))
3985 assert(isa<FunctionTemplateDecl>(ND) &&
3986 "No other valid types in NamedDecl");
3987 return TK_FunctionTemplate;
3988 }
3989 if (TemplateOrSpecialization.is<MemberSpecializationInfo *>())
3991 if (TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>())
3993 if (TemplateOrSpecialization.is
3996
3997 llvm_unreachable("Did we miss a TemplateOrSpecialization type?");
3998}
3999
4002 return cast<FunctionDecl>(Info->getInstantiatedFrom());
4003
4004 return nullptr;
4005}
4006
4008 if (auto *MSI =
4009 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4010 return MSI;
4011 if (auto *FTSI = TemplateOrSpecialization
4012 .dyn_cast<FunctionTemplateSpecializationInfo *>())
4013 return FTSI->getMemberSpecializationInfo();
4014 return nullptr;
4015}
4016
4017void
4018FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C,
4019 FunctionDecl *FD,
4021 assert(TemplateOrSpecialization.isNull() &&
4022 "Member function is already a specialization");
4024 = new (C) MemberSpecializationInfo(FD, TSK);
4025 TemplateOrSpecialization = Info;
4026}
4027
4029 return dyn_cast_if_present<FunctionTemplateDecl>(
4030 TemplateOrSpecialization.dyn_cast<NamedDecl *>());
4031}
4032
4034 FunctionTemplateDecl *Template) {
4035 assert(TemplateOrSpecialization.isNull() &&
4036 "Member function is already a specialization");
4037 TemplateOrSpecialization = Template;
4038}
4039
4041 return TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>() ||
4042 TemplateOrSpecialization
4043 .is<DependentFunctionTemplateSpecializationInfo *>();
4044}
4045
4047 assert(TemplateOrSpecialization.isNull() &&
4048 "Function is already a specialization");
4049 TemplateOrSpecialization = FD;
4050}
4051
4053 return dyn_cast_if_present<FunctionDecl>(
4054 TemplateOrSpecialization.dyn_cast<NamedDecl *>());
4055}
4056
4058 // If the function is invalid, it can't be implicitly instantiated.
4059 if (isInvalidDecl())
4060 return false;
4061
4063 case TSK_Undeclared:
4066 return false;
4067
4069 return true;
4070
4072 // Handled below.
4073 break;
4074 }
4075
4076 // Find the actual template from which we will instantiate.
4077 const FunctionDecl *PatternDecl = getTemplateInstantiationPattern();
4078 bool HasPattern = false;
4079 if (PatternDecl)
4080 HasPattern = PatternDecl->hasBody(PatternDecl);
4081
4082 // C++0x [temp.explicit]p9:
4083 // Except for inline functions, other explicit instantiation declarations
4084 // have the effect of suppressing the implicit instantiation of the entity
4085 // to which they refer.
4086 if (!HasPattern || !PatternDecl)
4087 return true;
4088
4089 return PatternDecl->isInlined();
4090}
4091
4093 // FIXME: Remove this, it's not clear what it means. (Which template
4094 // specialization kind?)
4096}
4097
4100 // If this is a generic lambda call operator specialization, its
4101 // instantiation pattern is always its primary template's pattern
4102 // even if its primary template was instantiated from another
4103 // member template (which happens with nested generic lambdas).
4104 // Since a lambda's call operator's body is transformed eagerly,
4105 // we don't have to go hunting for a prototype definition template
4106 // (i.e. instantiated-from-member-template) to use as an instantiation
4107 // pattern.
4108
4110 dyn_cast<CXXMethodDecl>(this))) {
4111 assert(getPrimaryTemplate() && "not a generic lambda call operator?");
4112 return getDefinitionOrSelf(getPrimaryTemplate()->getTemplatedDecl());
4113 }
4114
4115 // Check for a declaration of this function that was instantiated from a
4116 // friend definition.
4117 const FunctionDecl *FD = nullptr;
4118 if (!isDefined(FD, /*CheckForPendingFriendDefinition=*/true))
4119 FD = this;
4120
4122 if (ForDefinition &&
4124 return nullptr;
4125 return getDefinitionOrSelf(cast<FunctionDecl>(Info->getInstantiatedFrom()));
4126 }
4127
4128 if (ForDefinition &&
4130 return nullptr;
4131
4132 if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
4133 // If we hit a point where the user provided a specialization of this
4134 // template, we're done looking.
4135 while (!ForDefinition || !Primary->isMemberSpecialization()) {
4136 auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate();
4137 if (!NewPrimary)
4138 break;
4139 Primary = NewPrimary;
4140 }
4141
4142 return getDefinitionOrSelf(Primary->getTemplatedDecl());
4143 }
4144
4145 return nullptr;
4146}
4147
4150 = TemplateOrSpecialization
4151 .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4152 return Info->getTemplate();
4153 }
4154 return nullptr;
4155}
4156
4159 return TemplateOrSpecialization
4161}
4162
4166 = TemplateOrSpecialization
4167 .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4168 return Info->TemplateArguments;
4169 }
4170 return nullptr;
4171}
4172
4176 = TemplateOrSpecialization
4177 .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4178 return Info->TemplateArgumentsAsWritten;
4179 }
4181 TemplateOrSpecialization
4182 .dyn_cast<DependentFunctionTemplateSpecializationInfo *>()) {
4183 return Info->TemplateArgumentsAsWritten;
4184 }
4185 return nullptr;
4186}
4187
4188void FunctionDecl::setFunctionTemplateSpecialization(
4189 ASTContext &C, FunctionTemplateDecl *Template,
4190 TemplateArgumentList *TemplateArgs, void *InsertPos,
4192 const TemplateArgumentListInfo *TemplateArgsAsWritten,
4193 SourceLocation PointOfInstantiation) {
4194 assert((TemplateOrSpecialization.isNull() ||
4195 TemplateOrSpecialization.is<MemberSpecializationInfo *>()) &&
4196 "Member function is already a specialization");
4197 assert(TSK != TSK_Undeclared &&
4198 "Must specify the type of function template specialization");
4199 assert((TemplateOrSpecialization.isNull() ||
4202 "Member specialization must be an explicit specialization");
4205 C, this, Template, TSK, TemplateArgs, TemplateArgsAsWritten,
4206 PointOfInstantiation,
4207 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>());
4208 TemplateOrSpecialization = Info;
4209 Template->addSpecialization(Info, InsertPos);
4210}
4211
4213 ASTContext &Context, const UnresolvedSetImpl &Templates,
4214 const TemplateArgumentListInfo *TemplateArgs) {
4215 assert(TemplateOrSpecialization.isNull());
4218 TemplateArgs);
4219 TemplateOrSpecialization = Info;
4220}
4221
4224 return TemplateOrSpecialization
4226}
4227
4230 ASTContext &Context, const UnresolvedSetImpl &Candidates,
4231 const TemplateArgumentListInfo *TArgs) {
4232 const auto *TArgsWritten =
4233 TArgs ? ASTTemplateArgumentListInfo::Create(Context, *TArgs) : nullptr;
4234 return new (Context.Allocate(
4235 totalSizeToAlloc<FunctionTemplateDecl *>(Candidates.size())))
4236 DependentFunctionTemplateSpecializationInfo(Candidates, TArgsWritten);
4237}
4238
4239DependentFunctionTemplateSpecializationInfo::
4240 DependentFunctionTemplateSpecializationInfo(
4241 const UnresolvedSetImpl &Candidates,
4242 const ASTTemplateArgumentListInfo *TemplateArgsWritten)
4243 : NumCandidates(Candidates.size()),
4244 TemplateArgumentsAsWritten(TemplateArgsWritten) {
4245 std::transform(Candidates.begin(), Candidates.end(),
4246 getTrailingObjects<FunctionTemplateDecl *>(),
4247 [](NamedDecl *ND) {
4248 return cast<FunctionTemplateDecl>(ND->getUnderlyingDecl());
4249 });
4250}
4251
4253 // For a function template specialization, query the specialization
4254 // information object.
4256 TemplateOrSpecialization
4257 .dyn_cast<FunctionTemplateSpecializationInfo *>())
4258 return FTSInfo->getTemplateSpecializationKind();
4259
4260 if (MemberSpecializationInfo *MSInfo =
4261 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4262 return MSInfo->getTemplateSpecializationKind();
4263
4264 // A dependent function template specialization is an explicit specialization,
4265 // except when it's a friend declaration.
4266 if (TemplateOrSpecialization
4267 .is<DependentFunctionTemplateSpecializationInfo *>() &&
4270
4271 return TSK_Undeclared;
4272}
4273
4276 // This is the same as getTemplateSpecializationKind(), except that for a
4277 // function that is both a function template specialization and a member
4278 // specialization, we prefer the member specialization information. Eg:
4279 //
4280 // template<typename T> struct A {
4281 // template<typename U> void f() {}
4282 // template<> void f<int>() {}
4283 // };
4284 //
4285 // Within the templated CXXRecordDecl, A<T>::f<int> is a dependent function
4286 // template specialization; both getTemplateSpecializationKind() and
4287 // getTemplateSpecializationKindForInstantiation() will return
4288 // TSK_ExplicitSpecialization.
4289 //
4290 // For A<int>::f<int>():
4291 // * getTemplateSpecializationKind() will return TSK_ExplicitSpecialization
4292 // * getTemplateSpecializationKindForInstantiation() will return
4293 // TSK_ImplicitInstantiation
4294 //
4295 // This reflects the facts that A<int>::f<int> is an explicit specialization
4296 // of A<int>::f, and that A<int>::f<int> should be implicitly instantiated
4297 // from A::f<int> if a definition is needed.
4299 TemplateOrSpecialization
4300 .dyn_cast<FunctionTemplateSpecializationInfo *>()) {
4301 if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo())
4302 return MSInfo->getTemplateSpecializationKind();
4303 return FTSInfo->getTemplateSpecializationKind();
4304 }
4305
4306 if (MemberSpecializationInfo *MSInfo =
4307 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4308 return MSInfo->getTemplateSpecializationKind();
4309
4310 if (TemplateOrSpecialization
4311 .is<DependentFunctionTemplateSpecializationInfo *>() &&
4314
4315 return TSK_Undeclared;
4316}
4317
4318void
4320 SourceLocation PointOfInstantiation) {
4322 = TemplateOrSpecialization.dyn_cast<
4324 FTSInfo->setTemplateSpecializationKind(TSK);
4325 if (TSK != TSK_ExplicitSpecialization &&
4326 PointOfInstantiation.isValid() &&
4327 FTSInfo->getPointOfInstantiation().isInvalid()) {
4328 FTSInfo->setPointOfInstantiation(PointOfInstantiation);
4330 L->InstantiationRequested(this);
4331 }
4332 } else if (MemberSpecializationInfo *MSInfo
4333 = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) {
4334 MSInfo->setTemplateSpecializationKind(TSK);
4335 if (TSK != TSK_ExplicitSpecialization &&
4336 PointOfInstantiation.isValid() &&
4337 MSInfo->getPointOfInstantiation().isInvalid()) {
4338 MSInfo->setPointOfInstantiation(PointOfInstantiation);
4340 L->InstantiationRequested(this);
4341 }
4342 } else
4343 llvm_unreachable("Function cannot have a template specialization kind");
4344}
4345
4348 = TemplateOrSpecialization.dyn_cast<
4350 return FTSInfo->getPointOfInstantiation();
4351 if (MemberSpecializationInfo *MSInfo =
4352 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4353 return MSInfo->getPointOfInstantiation();
4354
4355 return SourceLocation();
4356}
4357
4359 if (Decl::isOutOfLine())
4360 return true;
4361
4362 // If this function was instantiated from a member function of a
4363 // class template, check whether that member function was defined out-of-line.
4365 const FunctionDecl *Definition;
4366 if (FD->hasBody(Definition))
4367 return Definition->isOutOfLine();
4368 }
4369
4370 // If this function was instantiated from a function template,
4371 // check whether that function template was defined out-of-line.
4372 if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) {
4373 const FunctionDecl *Definition;
4374 if (FunTmpl->getTemplatedDecl()->hasBody(Definition))
4375 return Definition->isOutOfLine();
4376 }
4377
4378 return false;
4379}
4380
4382 return SourceRange(getOuterLocStart(), EndRangeLoc);
4383}
4384
4386 IdentifierInfo *FnInfo = getIdentifier();
4387
4388 if (!FnInfo)
4389 return 0;
4390
4391 // Builtin handling.
4392 switch (getBuiltinID()) {
4393 case Builtin::BI__builtin_memset:
4394 case Builtin::BI__builtin___memset_chk:
4395 case Builtin::BImemset:
4396 return Builtin::BImemset;
4397
4398 case Builtin::BI__builtin_memcpy:
4399 case Builtin::BI__builtin___memcpy_chk:
4400 case Builtin::BImemcpy:
4401 return Builtin::BImemcpy;
4402
4403 case Builtin::BI__builtin_mempcpy:
4404 case Builtin::BI__builtin___mempcpy_chk:
4405 case Builtin::BImempcpy:
4406 return Builtin::BImempcpy;
4407
4408 case Builtin::BI__builtin_memmove:
4409 case Builtin::BI__builtin___memmove_chk:
4410 case Builtin::BImemmove:
4411 return Builtin::BImemmove;
4412
4413 case Builtin::BIstrlcpy:
4414 case Builtin::BI__builtin___strlcpy_chk:
4415 return Builtin::BIstrlcpy;
4416
4417 case Builtin::BIstrlcat:
4418 case Builtin::BI__builtin___strlcat_chk:
4419 return Builtin::BIstrlcat;
4420
4421 case Builtin::BI__builtin_memcmp:
4422 case Builtin::BImemcmp:
4423 return Builtin::BImemcmp;
4424
4425 case Builtin::BI__builtin_bcmp:
4426 case Builtin::BIbcmp:
4427 return Builtin::BIbcmp;
4428
4429 case Builtin::BI__builtin_strncpy:
4430 case Builtin::BI__builtin___strncpy_chk:
4431 case Builtin::BIstrncpy:
4432 return Builtin::BIstrncpy;
4433
4434 case Builtin::BI__builtin_strncmp:
4435 case Builtin::BIstrncmp:
4436 return Builtin::BIstrncmp;
4437
4438 case Builtin::BI__builtin_strncasecmp:
4439 case Builtin::BIstrncasecmp:
4440 return Builtin::BIstrncasecmp;
4441
4442 case Builtin::BI__builtin_strncat:
4443 case Builtin::BI__builtin___strncat_chk:
4444 case Builtin::BIstrncat:
4445 return Builtin::BIstrncat;
4446
4447 case Builtin::BI__builtin_strndup:
4448 case Builtin::BIstrndup:
4449 return Builtin::BIstrndup;
4450
4451 case Builtin::BI__builtin_strlen:
4452 case Builtin::BIstrlen:
4453 return Builtin::BIstrlen;
4454
4455 case Builtin::BI__builtin_bzero:
4456 case Builtin::BIbzero:
4457 return Builtin::BIbzero;
4458
4459 case Builtin::BI__builtin_bcopy:
4460 case Builtin::BIbcopy:
4461 return Builtin::BIbcopy;
4462
4463 case Builtin::BIfree:
4464 return Builtin::BIfree;
4465
4466 default:
4467 if (isExternC()) {
4468 if (FnInfo->isStr("memset"))
4469 return Builtin::BImemset;
4470 if (FnInfo->isStr("memcpy"))
4471 return Builtin::BImemcpy;
4472 if (FnInfo->isStr("mempcpy"))
4473 return Builtin::BImempcpy;
4474 if (FnInfo->isStr("memmove"))
4475 return Builtin::BImemmove;
4476 if (FnInfo->isStr("memcmp"))
4477 return Builtin::BImemcmp;
4478 if (FnInfo->isStr("bcmp"))
4479 return Builtin::BIbcmp;
4480 if (FnInfo->isStr("strncpy"))
4481 return Builtin::BIstrncpy;
4482 if (FnInfo->isStr("strncmp"))
4483 return Builtin::BIstrncmp;
4484 if (FnInfo->isStr("strncasecmp"))
4485 return Builtin::BIstrncasecmp;
4486 if (FnInfo->isStr("strncat"))
4487 return Builtin::BIstrncat;
4488 if (FnInfo->isStr("strndup"))
4489 return Builtin::BIstrndup;
4490 if (FnInfo->isStr("strlen"))
4491 return Builtin::BIstrlen;
4492 if (FnInfo->isStr("bzero"))
4493 return Builtin::BIbzero;
4494 if (FnInfo->isStr("bcopy"))
4495 return Builtin::BIbcopy;
4496 } else if (isInStdNamespace()) {
4497 if (FnInfo->isStr("free"))
4498 return Builtin::BIfree;
4499 }
4500 break;
4501 }
4502 return 0;
4503}
4504
4506 assert(hasODRHash());
4507 return ODRHash;
4508}
4509
4511 if (hasODRHash())
4512 return ODRHash;
4513
4514 if (auto *FT = getInstantiatedFromMemberFunction()) {
4515 setHasODRHash(true);
4516 ODRHash = FT->getODRHash();
4517 return ODRHash;
4518 }
4519
4520 class ODRHash Hash;
4521 Hash.AddFunctionDecl(this);
4522 setHasODRHash(true);
4523 ODRHash = Hash.CalculateHash();
4524 return ODRHash;
4525}
4526
4527//===----------------------------------------------------------------------===//
4528// FieldDecl Implementation
4529//===----------------------------------------------------------------------===//
4530
4532 SourceLocation StartLoc, SourceLocation IdLoc,
4533 const IdentifierInfo *Id, QualType T,
4534 TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
4535 InClassInitStyle InitStyle) {
4536 return new (C, DC) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo,
4537 BW, Mutable, InitStyle);
4538}
4539
4541 return new (C, ID) FieldDecl(Field, nullptr, SourceLocation(),
4542 SourceLocation(), nullptr, QualType(), nullptr,
4543 nullptr, false, ICIS_NoInit);
4544}
4545
4547 if (!isImplicit() || getDeclName())
4548 return false;
4549
4550 if (const auto *Record = getType()->getAs<RecordType>())
4551 return Record->getDecl()->isAnonymousStructOrUnion();
4552
4553 return false;
4554}
4555
4557 if (!hasInClassInitializer())
4558 return nullptr;
4559
4560 LazyDeclStmtPtr InitPtr = BitField ? InitAndBitWidth->Init : Init;
4561 return cast_if_present<Expr>(
4562 InitPtr.isOffset() ? InitPtr.get(getASTContext().getExternalSource())
4563 : InitPtr.get(nullptr));
4564}
4565
4567 setLazyInClassInitializer(LazyDeclStmtPtr(NewInit));
4568}
4569
4570void FieldDecl::setLazyInClassInitializer(LazyDeclStmtPtr NewInit) {
4572 if (BitField)
4573 InitAndBitWidth->Init = NewInit;
4574 else
4575 Init = NewInit;
4576}
4577
4578unsigned FieldDecl::getBitWidthValue(const ASTContext &Ctx) const {
4579 assert(isBitField() && "not a bitfield");
4580 return getBitWidth()->EvaluateKnownConstInt(Ctx).getZExtValue();
4581}
4582
4585 getBitWidthValue(Ctx) == 0;
4586}
4587
4588bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
4589 if (isZeroLengthBitField(Ctx))
4590 return true;
4591
4592 // C++2a [intro.object]p7:
4593 // An object has nonzero size if it
4594 // -- is not a potentially-overlapping subobject, or
4595 if (!hasAttr<NoUniqueAddressAttr>())
4596 return false;
4597
4598 // -- is not of class type, or
4599 const auto *RT = getType()->getAs<RecordType>();
4600 if (!RT)
4601 return false;
4602 const RecordDecl *RD = RT->getDecl()->getDefinition();
4603 if (!RD) {
4604 assert(isInvalidDecl() && "valid field has incomplete type");
4605 return false;
4606 }
4607
4608 // -- [has] virtual member functions or virtual base classes, or
4609 // -- has subobjects of nonzero size or bit-fields of nonzero length
4610 const auto *CXXRD = cast<CXXRecordDecl>(RD);
4611 if (!CXXRD->isEmpty())
4612 return false;
4613
4614 // Otherwise, [...] the circumstances under which the object has zero size
4615 // are implementation-defined.
4616 if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
4617 return true;
4618
4619 // MS ABI: has nonzero size if it is a class type with class type fields,
4620 // whether or not they have nonzero size
4621 return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
4622 return Field->getType()->getAs<RecordType>();
4623 });
4624}
4625
4627 return hasAttr<NoUniqueAddressAttr>() && getType()->getAsCXXRecordDecl();
4628}
4629
4631 const FieldDecl *Canonical = getCanonicalDecl();
4632 if (Canonical != this)
4633 return Canonical->getFieldIndex();
4634
4635 if (CachedFieldIndex) return CachedFieldIndex - 1;
4636
4637 unsigned Index = 0;
4638 const RecordDecl *RD = getParent()->getDefinition();
4639 assert(RD && "requested index for field of struct with no definition");
4640
4641 for (auto *Field : RD->fields()) {
4642 Field->getCanonicalDecl()->CachedFieldIndex = Index + 1;
4643 assert(Field->getCanonicalDecl()->CachedFieldIndex == Index + 1 &&
4644 "overflow in field numbering");
4645 ++Index;
4646 }
4647
4648 assert(CachedFieldIndex && "failed to find field in parent");
4649 return CachedFieldIndex - 1;
4650}
4651
4653 const Expr *FinalExpr = getInClassInitializer();
4654 if (!FinalExpr)
4655 FinalExpr = getBitWidth();
4656 if (FinalExpr)
4657 return SourceRange(getInnerLocStart(), FinalExpr->getEndLoc());
4659}
4660
4662 assert((getParent()->isLambda() || getParent()->isCapturedRecord()) &&
4663 "capturing type in non-lambda or captured record.");
4664 assert(StorageKind == ISK_NoInit && !BitField &&
4665 "bit-field or field with default member initializer cannot capture "
4666 "VLA type");
4667 StorageKind = ISK_CapturedVLAType;
4668 CapturedVLAType = VLAType;
4669}
4670
4671void FieldDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
4672 // Print unnamed members using name of their type.
4674 this->getType().print(OS, Policy);
4675 return;
4676 }
4677 // Otherwise, do the normal printing.
4678 DeclaratorDecl::printName(OS, Policy);
4679}
4680
4682 const auto *CAT = getType()->getAs<CountAttributedType>();
4683 if (!CAT)
4684 return nullptr;
4685
4686 const auto *CountDRE = cast<DeclRefExpr>(CAT->getCountExpr());
4687 const auto *CountDecl = CountDRE->getDecl();
4688 if (const auto *IFD = dyn_cast<IndirectFieldDecl>(CountDecl))
4689 CountDecl = IFD->getAnonField();
4690
4691 return dyn_cast<FieldDecl>(CountDecl);
4692}
4693
4694//===----------------------------------------------------------------------===//
4695// TagDecl Implementation
4696//===----------------------------------------------------------------------===//
4697
4699 SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl,
4700 SourceLocation StartL)
4701 : TypeDecl(DK, DC, L, Id, StartL), DeclContext(DK), redeclarable_base(C),
4702 TypedefNameDeclOrQualifier((TypedefNameDecl *)nullptr) {
4703 assert((DK != Enum || TK == TagTypeKind::Enum) &&
4704 "EnumDecl not matched with TagTypeKind::Enum");
4705 setPreviousDecl(PrevDecl);
4706 setTagKind(TK);
4707 setCompleteDefinition(false);
4708 setBeingDefined(false);
4710 setFreeStanding(false);
4712 TagDeclBits.IsThisDeclarationADemotedDefinition = false;
4713}
4714
4716 return getTemplateOrInnerLocStart(this);
4717}
4718
4720 SourceLocation RBraceLoc = BraceRange.getEnd();
4721 SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
4722 return SourceRange(getOuterLocStart(), E);
4723}
4724
4726
4728 TypedefNameDeclOrQualifier = TDD;
4729 if (const Type *T = getTypeForDecl()) {
4730 (void)T;
4731 assert(T->isLinkageValid());
4732 }
4733 assert(isLinkageValid());
4734}
4735
4737 setBeingDefined(true);
4738
4739 if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
4740 struct CXXRecordDecl::DefinitionData *Data =
4741 new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
4742 for (auto *I : redecls())
4743 cast<CXXRecordDecl>(I)->DefinitionData = Data;
4744 }
4745}
4746
4748 assert((!isa<CXXRecordDecl>(this) ||
4749 cast<CXXRecordDecl>(this)->hasDefinition()) &&
4750 "definition completed but not started");
4751
4753 setBeingDefined(false);
4754
4756 L->CompletedTagDefinition(this);
4757}
4758
4761 return const_cast<TagDecl *>(this);
4762
4763 // If it's possible for us to have an out-of-date definition, check now.
4764 if (mayHaveOutOfDateDef()) {
4765 if (IdentifierInfo *II = getIdentifier()) {
4766 if (II->isOutOfDate()) {
4767 updateOutOfDate(*II);
4768 }
4769 }
4770 }
4771
4772 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(this))
4773 return CXXRD->getDefinition();
4774
4775 for (auto *R : redecls())
4776 if (R->isCompleteDefinition())
4777 return R;
4778
4779 return nullptr;
4780}
4781
4783 if (QualifierLoc) {
4784 // Make sure the extended qualifier info is allocated.
4785 if (!hasExtInfo())
4786 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
4787 // Set qualifier info.
4788 getExtInfo()->QualifierLoc = QualifierLoc;
4789 } else {
4790 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
4791 if (hasExtInfo()) {
4792 if (getExtInfo()->NumTemplParamLists == 0) {
4793 getASTContext().Deallocate(getExtInfo());
4794 TypedefNameDeclOrQualifier = (TypedefNameDecl *)nullptr;
4795 }
4796 else
4797 getExtInfo()->QualifierLoc = QualifierLoc;
4798 }
4799 }
4800}
4801
4802void TagDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
4804 // If the name is supposed to have an identifier but does not have one, then
4805 // the tag is anonymous and we should print it differently.
4806 if (Name.isIdentifier() && !Name.getAsIdentifierInfo()) {
4807 // If the caller wanted to print a qualified name, they've already printed
4808 // the scope. And if the caller doesn't want that, the scope information
4809 // is already printed as part of the type.
4810 PrintingPolicy Copy(Policy);
4811 Copy.SuppressScope = true;
4813 return;
4814 }
4815 // Otherwise, do the normal printing.
4816 Name.print(OS, Policy);
4817}
4818
4821 assert(!TPLists.empty());
4822 // Make sure the extended decl info is allocated.
4823 if (!hasExtInfo())
4824 // Allocate external info struct.
4825 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
4826 // Set the template parameter lists info.
4827 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
4828}
4829
4830//===----------------------------------------------------------------------===//
4831// EnumDecl Implementation
4832//===----------------------------------------------------------------------===//
4833
4834EnumDecl::EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
4835 SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl,
4836 bool Scoped, bool ScopedUsingClassTag, bool Fixed)
4837 : TagDecl(Enum, TagTypeKind::Enum, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
4838 assert(Scoped || !ScopedUsingClassTag);
4839 IntegerType = nullptr;
4840 setNumPositiveBits(0);
4841 setNumNegativeBits(0);
4842 setScoped(Scoped);
4843 setScopedUsingClassTag(ScopedUsingClassTag);
4844 setFixed(Fixed);
4845 setHasODRHash(false);
4846 ODRHash = 0;
4847}
4848
4849void EnumDecl::anchor() {}
4850
4852 SourceLocation StartLoc, SourceLocation IdLoc,
4854 EnumDecl *PrevDecl, bool IsScoped,
4855 bool IsScopedUsingClassTag, bool IsFixed) {
4856 auto *Enum = new (C, DC) EnumDecl(C, DC, StartLoc, IdLoc, Id, PrevDecl,
4857 IsScoped, IsScopedUsingClassTag, IsFixed);
4858 Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
4859 C.getTypeDeclType(Enum, PrevDecl);
4860 return Enum;
4861}
4862
4864 EnumDecl *Enum =
4865 new (C, ID) EnumDecl(C, nullptr, SourceLocation(), SourceLocation(),
4866 nullptr, nullptr, false, false, false);
4867 Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
4868 return Enum;
4869}
4870
4872 if (const TypeSourceInfo *TI = getIntegerTypeSourceInfo())
4873 return TI->getTypeLoc().getSourceRange();
4874 return SourceRange();
4875}
4876
4878 QualType NewPromotionType,
4879 unsigned NumPositiveBits,
4880 unsigned NumNegativeBits) {
4881 assert(!isCompleteDefinition() && "Cannot redefine enums!");
4882 if (!IntegerType)
4883 IntegerType = NewType.getTypePtr();
4884 PromotionType = NewPromotionType;
4885 setNumPositiveBits(NumPositiveBits);
4886 setNumNegativeBits(NumNegativeBits);
4888}
4889
4891 if (const auto *A = getAttr<EnumExtensibilityAttr>())
4892 return A->getExtensibility() == EnumExtensibilityAttr::Closed;
4893 return true;
4894}
4895
4897 return isClosed() && hasAttr<FlagEnumAttr>();
4898}
4899
4901 return isClosed() && !hasAttr<FlagEnumAttr>();
4902}
4903
4906 return MSI->getTemplateSpecializationKind();
4907
4908 return TSK_Undeclared;
4909}
4910
4912 SourceLocation PointOfInstantiation) {
4914 assert(MSI && "Not an instantiated member enumeration?");
4916 if (TSK != TSK_ExplicitSpecialization &&
4917 PointOfInstantiation.isValid() &&
4919 MSI->setPointOfInstantiation(PointOfInstantiation);
4920}
4921
4924 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
4926 while (auto *NewED = ED->getInstantiatedFromMemberEnum())
4927 ED = NewED;
4928 return getDefinitionOrSelf(ED);
4929 }
4930 }
4931
4933 "couldn't find pattern for enum instantiation");
4934 return nullptr;
4935}
4936
4938 if (SpecializationInfo)
4939 return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom());
4940
4941 return nullptr;
4942}
4943
4944void EnumDecl::setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED,
4946 assert(!SpecializationInfo && "Member enum is already a specialization");
4947 SpecializationInfo = new (C) MemberSpecializationInfo(ED, TSK);
4948}
4949
4951 if (hasODRHash())
4952 return ODRHash;
4953
4954 class ODRHash Hash;
4955 Hash.AddEnumDecl(this);
4956 setHasODRHash(true);
4957 ODRHash = Hash.CalculateHash();
4958 return ODRHash;
4959}
4960
4962 auto Res = TagDecl::getSourceRange();
4963 // Set end-point to enum-base, e.g. enum foo : ^bar
4964 if (auto *TSI = getIntegerTypeSourceInfo()) {
4965 // TagDecl doesn't know about the enum base.
4966 if (!getBraceRange().getEnd().isValid())
4967 Res.setEnd(TSI->getTypeLoc().getEndLoc());
4968 }
4969 return Res;
4970}
4971
4972void EnumDecl::getValueRange(llvm::APInt &Max, llvm::APInt &Min) const {
4973 unsigned Bitwidth = getASTContext().getIntWidth(getIntegerType());
4974 unsigned NumNegativeBits = getNumNegativeBits();
4975 unsigned NumPositiveBits = getNumPositiveBits();
4976
4977 if (NumNegativeBits) {
4978 unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
4979 Max = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
4980 Min = -Max;
4981 } else {
4982 Max = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
4983 Min = llvm::APInt::getZero(Bitwidth);
4984 }
4985}
4986
4987//===----------------------------------------------------------------------===//
4988// RecordDecl Implementation
4989//===----------------------------------------------------------------------===//
4990
4992 DeclContext *DC, SourceLocation StartLoc,
4994 RecordDecl *PrevDecl)
4995 : TagDecl(DK, TK, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
4996 assert(classof(static_cast<Decl *>(this)) && "Invalid Kind!");
4999 setHasObjectMember(false);
5000 setHasVolatileMember(false);
5010 setIsRandomized(false);
5011 setODRHash(0);
5012}
5013
5015 SourceLocation StartLoc, SourceLocation IdLoc,
5016 IdentifierInfo *Id, RecordDecl* PrevDecl) {
5017 RecordDecl *R = new (C, DC) RecordDecl(Record, TK, C, DC,
5018 StartLoc, IdLoc, Id, PrevDecl);
5019 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
5020
5021 C.getTypeDeclType(R, PrevDecl);
5022 return R;
5023}
5024
5026 GlobalDeclID ID) {
5027 RecordDecl *R = new (C, ID)
5029 SourceLocation(), nullptr, nullptr);
5030 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
5031 return R;
5032}
5033
5035 return isImplicit() && getDeclName() && getDeclContext()->isRecord() &&
5036 cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName();
5037}
5038
5040 if (auto RD = dyn_cast<CXXRecordDecl>(this))
5041 return RD->isLambda();
5042 return false;
5043}
5044
5046 return hasAttr<CapturedRecordAttr>();
5047}
5048
5050 addAttr(CapturedRecordAttr::CreateImplicit(getASTContext()));
5051}
5052
5054 if (isUnion())
5055 return true;
5056
5057 if (const RecordDecl *Def = getDefinition()) {
5058 for (const FieldDecl *FD : Def->fields()) {
5059 const RecordType *RT = FD->getType()->getAs<RecordType>();
5060 if (RT && RT->getDecl()->isOrContainsUnion())
5061 return true;
5062 }
5063 }
5064
5065 return false;
5066}
5067
5070 LoadFieldsFromExternalStorage();
5071 // This is necessary for correctness for C++ with modules.
5072 // FIXME: Come up with a test case that breaks without definition.
5073 if (RecordDecl *D = getDefinition(); D && D != this)
5074 return D->field_begin();
5076}
5077
5078/// completeDefinition - Notes that the definition of this type is now
5079/// complete.
5081 assert(!isCompleteDefinition() && "Cannot redefine record!");
5083
5084 ASTContext &Ctx = getASTContext();
5085
5086 // Layouts are dumped when computed, so if we are dumping for all complete
5087 // types, we need to force usage to get types that wouldn't be used elsewhere.
5088 //
5089 // If the type is dependent, then we can't compute its layout because there
5090 // is no way for us to know the size or alignment of a dependent type. Also
5091 // ignore declarations marked as invalid since 'getASTRecordLayout()' asserts
5092 // on that.
5093 if (Ctx.getLangOpts().DumpRecordLayoutsComplete && !isDependentType() &&
5094 !isInvalidDecl())
5095 (void)Ctx.getASTRecordLayout(this);
5096}
5097
5098/// isMsStruct - Get whether or not this record uses ms_struct layout.
5099/// This which can be turned on with an attribute, pragma, or the
5100/// -mms-bitfields command-line option.
5102 return hasAttr<MSStructAttr>() || C.getLangOpts().MSBitfields == 1;
5103}
5104
5106 std::tie(FirstDecl, LastDecl) = DeclContext::BuildDeclChain(Decls, false);
5107 LastDecl->NextInContextAndBits.setPointer(nullptr);
5108 setIsRandomized(true);
5109}
5110
5111void RecordDecl::LoadFieldsFromExternalStorage() const {
5113 assert(hasExternalLexicalStorage() && Source && "No external storage?");
5114
5115 // Notify that we have a RecordDecl doing some initialization.
5116 ExternalASTSource::Deserializing TheFields(Source);
5117
5120 Source->FindExternalLexicalDecls(this, [](Decl::Kind K) {
5122 }, Decls);
5123
5124#ifndef NDEBUG
5125 // Check that all decls we got were FieldDecls.
5126 for (unsigned i=0, e=Decls.size(); i != e; ++i)
5127 assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i]));
5128#endif
5129
5130 if (Decls.empty())
5131 return;
5132
5133 auto [ExternalFirst, ExternalLast] =
5134 BuildDeclChain(Decls,
5135 /*FieldsAlreadyLoaded=*/false);
5136 ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
5137 FirstDecl = ExternalFirst;
5138 if (!LastDecl)
5139 LastDecl = ExternalLast;
5140}
5141
5142bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
5143 ASTContext &Context = getASTContext();
5144 const SanitizerMask EnabledAsanMask = Context.getLangOpts().Sanitize.Mask &
5145 (SanitizerKind::Address | SanitizerKind::KernelAddress);
5146 if (!EnabledAsanMask || !Context.getLangOpts().SanitizeAddressFieldPadding)
5147 return false;
5148 const auto &NoSanitizeList = Context.getNoSanitizeList();
5149 const auto *CXXRD = dyn_cast<CXXRecordDecl>(this);
5150 // We may be able to relax some of these requirements.
5151 int ReasonToReject = -1;
5152 if (!CXXRD || CXXRD->isExternCContext())
5153 ReasonToReject = 0; // is not C++.
5154 else if (CXXRD->hasAttr<PackedAttr>())
5155 ReasonToReject = 1; // is packed.
5156 else if (CXXRD->isUnion())
5157 ReasonToReject = 2; // is a union.
5158 else if (CXXRD->isTriviallyCopyable())
5159 ReasonToReject = 3; // is trivially copyable.
5160 else if (CXXRD->hasTrivialDestructor())
5161 ReasonToReject = 4; // has trivial destructor.
5162 else if (CXXRD->isStandardLayout())
5163 ReasonToReject = 5; // is standard layout.
5164 else if (NoSanitizeList.containsLocation(EnabledAsanMask, getLocation(),
5165 "field-padding"))
5166 ReasonToReject = 6; // is in an excluded file.
5168 EnabledAsanMask, getQualifiedNameAsString(), "field-padding"))
5169 ReasonToReject = 7; // The type is excluded.
5170
5171 if (EmitRemark) {
5172 if (ReasonToReject >= 0)
5173 Context.getDiagnostics().Report(
5174 getLocation(),
5175 diag::remark_sanitize_address_insert_extra_padding_rejected)
5176 << getQualifiedNameAsString() << ReasonToReject;
5177 else
5178 Context.getDiagnostics().Report(
5179 getLocation(),
5180 diag::remark_sanitize_address_insert_extra_padding_accepted)
5182 }
5183 return ReasonToReject < 0;
5184}
5185
5187 for (const auto *I : fields()) {
5188 if (I->getIdentifier())
5189 return I;
5190
5191 if (const auto *RT = I->getType()->getAs<RecordType>())
5192 if (const FieldDecl *NamedDataMember =
5193 RT->getDecl()->findFirstNamedDataMember())
5194 return NamedDataMember;
5195 }
5196
5197 // We didn't find a named data member.
5198 return nullptr;
5199}
5200
5202 if (hasODRHash())
5203 return RecordDeclBits.ODRHash;
5204
5205 // Only calculate hash on first call of getODRHash per record.
5206 ODRHash Hash;
5207 Hash.AddRecordDecl(this);
5208 // For RecordDecl the ODRHash is stored in the remaining 26
5209 // bit of RecordDeclBits, adjust the hash to accomodate.
5210 setODRHash(Hash.CalculateHash() >> 6);
5211 return RecordDeclBits.ODRHash;
5212}
5213
5214//===----------------------------------------------------------------------===//
5215// BlockDecl Implementation
5216//===----------------------------------------------------------------------===//
5217
5219 : Decl(Block, DC, CaretLoc), DeclContext(Block) {
5220 setIsVariadic(false);
5221 setCapturesCXXThis(false);
5224 setDoesNotEscape(false);
5225 setCanAvoidCopyToHeap(false);
5226}
5227
5229 assert(!ParamInfo && "Already has param info!");
5230
5231 // Zero params -> null pointer.
5232 if (!NewParamInfo.empty()) {
5233 NumParams = NewParamInfo.size();
5234 ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
5235 std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo);
5236 }
5237}
5238
5240 bool CapturesCXXThis) {
5241 this->setCapturesCXXThis(CapturesCXXThis);
5242 this->NumCaptures = Captures.size();
5243
5244 if (Captures.empty()) {
5245 this->Captures = nullptr;
5246 return;
5247 }
5248
5249 this->Captures = Captures.copy(Context).data();
5250}
5251
5252bool BlockDecl::capturesVariable(const VarDecl *variable) const {
5253 for (const auto &I : captures())
5254 // Only auto vars can be captured, so no redeclaration worries.
5255 if (I.getVariable() == variable)
5256 return true;
5257
5258 return false;
5259}
5260
5262 return SourceRange(getLocation(), Body ? Body->getEndLoc() : getLocation());
5263}
5264
5265//===----------------------------------------------------------------------===//
5266// Other Decl Allocation/Deallocation Method Implementations
5267//===----------------------------------------------------------------------===//
5268
5269void TranslationUnitDecl::anchor() {}
5270
5272 return new (C, (DeclContext *)nullptr) TranslationUnitDecl(C);
5273}
5274
5276 AnonymousNamespace = D;
5277
5278 if (ASTMutationListener *Listener = Ctx.getASTMutationListener())
5279 Listener->AddedAnonymousNamespace(this, D);
5280}
5281
5282void PragmaCommentDecl::anchor() {}
5283
5286 SourceLocation CommentLoc,
5287 PragmaMSCommentKind CommentKind,
5288 StringRef Arg) {
5289 PragmaCommentDecl *PCD =
5290 new (C, DC, additionalSizeToAlloc<char>(Arg.size() + 1))
5291 PragmaCommentDecl(DC, CommentLoc, CommentKind);
5292 memcpy(PCD->getTrailingObjects<char>(), Arg.data(), Arg.size());
5293 PCD->getTrailingObjects<char>()[Arg.size()] = '\0';
5294 return PCD;
5295}
5296
5299 unsigned ArgSize) {
5300 return new (C, ID, additionalSizeToAlloc<char>(ArgSize + 1))
5302}
5303
5304void PragmaDetectMismatchDecl::anchor() {}
5305
5308 SourceLocation Loc, StringRef Name,
5309 StringRef Value) {
5310 size_t ValueStart = Name.size() + 1;
5312 new (C, DC, additionalSizeToAlloc<char>(ValueStart + Value.size() + 1))
5313 PragmaDetectMismatchDecl(DC, Loc, ValueStart);
5314 memcpy(PDMD->getTrailingObjects<char>(), Name.data(), Name.size());
5315 PDMD->getTrailingObjects<char>()[Name.size()] = '\0';
5316 memcpy(PDMD->getTrailingObjects<char>() + ValueStart, Value.data(),
5317 Value.size());
5318 PDMD->getTrailingObjects<char>()[ValueStart + Value.size()] = '\0';
5319 return PDMD;
5320}
5321
5324 unsigned NameValueSize) {
5325 return new (C, ID, additionalSizeToAlloc<char>(NameValueSize + 1))
5327}
5328
5329void ExternCContextDecl::anchor() {}
5330
5332 TranslationUnitDecl *DC) {
5333 return new (C, DC) ExternCContextDecl(DC);
5334}
5335
5336void LabelDecl::anchor() {}
5337
5339 SourceLocation IdentL, IdentifierInfo *II) {
5340 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, IdentL);
5341}
5342
5344 SourceLocation IdentL, IdentifierInfo *II,
5345 SourceLocation GnuLabelL) {
5346 assert(GnuLabelL != IdentL && "Use this only for GNU local labels");
5347 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, GnuLabelL);
5348}
5349
5351 return new (C, ID) LabelDecl(nullptr, SourceLocation(), nullptr, nullptr,
5352 SourceLocation());
5353}
5354
5355void LabelDecl::setMSAsmLabel(StringRef Name) {
5356char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];
5357 memcpy(Buffer, Name.data(), Name.size());
5358 Buffer[Name.size()] = '\0';
5359 MSAsmName = Buffer;
5360}
5361
5362void ValueDecl::anchor() {}
5363
5364bool ValueDecl::isWeak() const {
5365 auto *MostRecent = getMostRecentDecl();
5366 return MostRecent->hasAttr<WeakAttr>() ||
5367 MostRecent->hasAttr<WeakRefAttr>() || isWeakImported();
5368}
5369
5371 if (auto *Var = llvm::dyn_cast<VarDecl>(this))
5372 return Var->isInitCapture();
5373 return false;
5374}
5375
5376void ImplicitParamDecl::anchor() {}
5377
5379 SourceLocation IdLoc,
5381 ImplicitParamKind ParamKind) {
5382 return new (C, DC) ImplicitParamDecl(C, DC, IdLoc, Id, Type, ParamKind);
5383}
5384
5386 ImplicitParamKind ParamKind) {
5387 return new (C, nullptr) ImplicitParamDecl(C, Type, ParamKind);
5388}
5389
5391 GlobalDeclID ID) {
5393}
5394
5397 const DeclarationNameInfo &NameInfo, QualType T,
5398 TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin,
5399 bool isInlineSpecified, bool hasWrittenPrototype,
5400 ConstexprSpecKind ConstexprKind,
5401 Expr *TrailingRequiresClause) {
5402 FunctionDecl *New = new (C, DC) FunctionDecl(
5403 Function, C, DC, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
5404 isInlineSpecified, ConstexprKind, TrailingRequiresClause);
5406 return New;
5407}
5408
5410 return new (C, ID) FunctionDecl(
5412 nullptr, SC_None, false, false, ConstexprSpecKind::Unspecified, nullptr);
5413}
5414
5416 return new (C, DC) BlockDecl(DC, L);
5417}
5418
5420 return new (C, ID) BlockDecl(nullptr, SourceLocation());
5421}
5422
5423CapturedDecl::CapturedDecl(DeclContext *DC, unsigned NumParams)
5424 : Decl(Captured, DC, SourceLocation()), DeclContext(Captured),
5425 NumParams(NumParams), ContextParam(0), BodyAndNothrow(nullptr, false) {}
5426
5428 unsigned NumParams) {
5429 return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5430 CapturedDecl(DC, NumParams);
5431}
5432
5434 unsigned NumParams) {
5435 return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5436 CapturedDecl(nullptr, NumParams);
5437}
5438
5439Stmt *CapturedDecl::getBody() const { return BodyAndNothrow.getPointer(); }
5440void CapturedDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); }
5441
5442bool CapturedDecl::isNothrow() const { return BodyAndNothrow.getInt(); }
5443void CapturedDecl::setNothrow(bool Nothrow) { BodyAndNothrow.setInt(Nothrow); }
5444
5447 QualType T, Expr *E, const llvm::APSInt &V)
5448 : ValueDecl(EnumConstant, DC, L, Id, T), Init((Stmt *)E) {
5449 setInitVal(C, V);
5450}
5451
5455 Expr *E, const llvm::APSInt &V) {
5456 return new (C, CD) EnumConstantDecl(C, CD, L, Id, T, E, V);
5457}
5458
5460 GlobalDeclID ID) {
5461 return new (C, ID) EnumConstantDecl(C, nullptr, SourceLocation(), nullptr,
5462 QualType(), nullptr, llvm::APSInt());
5463}
5464
5465void IndirectFieldDecl::anchor() {}
5466
5467IndirectFieldDecl::IndirectFieldDecl(ASTContext &C, DeclContext *DC,
5469 QualType T,
5471 : ValueDecl(IndirectField, DC, L, N, T), Chaining(CH.data()),
5472 ChainingSize(CH.size()) {
5473 // In C++, indirect field declarations conflict with tag declarations in the
5474 // same scope, so add them to IDNS_Tag so that tag redeclaration finds them.
5475 if (C.getLangOpts().CPlusPlus)
5477}
5478
5481 const IdentifierInfo *Id, QualType T,
5483 return new (C, DC) IndirectFieldDecl(C, DC, L, Id, T, CH);
5484}
5485
5487 GlobalDeclID ID) {
5488 return new (C, ID)
5490 QualType(), std::nullopt);
5491}
5492
5495 if (Init)
5496 End = Init->getEndLoc();
5497 return SourceRange(getLocation(), End);
5498}
5499
5500void TypeDecl::anchor() {}
5501
5503 SourceLocation StartLoc, SourceLocation IdLoc,
5504 const IdentifierInfo *Id,
5505 TypeSourceInfo *TInfo) {
5506 return new (C, DC) TypedefDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5507}
5508
5509void TypedefNameDecl::anchor() {}
5510
5512 if (auto *TT = getTypeSourceInfo()->getType()->getAs<TagType>()) {
5513 auto *OwningTypedef = TT->getDecl()->getTypedefNameForAnonDecl();
5514 auto *ThisTypedef = this;
5515 if (AnyRedecl && OwningTypedef) {
5516 OwningTypedef = OwningTypedef->getCanonicalDecl();
5517 ThisTypedef = ThisTypedef->getCanonicalDecl();
5518 }
5519 if (OwningTypedef == ThisTypedef)
5520 return TT->getDecl();
5521 }
5522
5523 return nullptr;
5524}
5525
5526bool TypedefNameDecl::isTransparentTagSlow() const {
5527 auto determineIsTransparent = [&]() {
5528 if (auto *TT = getUnderlyingType()->getAs<TagType>()) {
5529 if (auto *TD = TT->getDecl()) {
5530 if (TD->getName() != getName())
5531 return false;
5532 SourceLocation TTLoc = getLocation();
5533 SourceLocation TDLoc = TD->getLocation();
5534 if (!TTLoc.isMacroID() || !TDLoc.isMacroID())
5535 return false;
5537 return SM.getSpellingLoc(TTLoc) == SM.getSpellingLoc(TDLoc);
5538 }
5539 }
5540 return false;
5541 };
5542
5543 bool isTransparent = determineIsTransparent();
5544 MaybeModedTInfo.setInt((isTransparent << 1) | 1);
5545 return isTransparent;
5546}
5547
5549 return new (C, ID) TypedefDecl(C, nullptr, SourceLocation(), SourceLocation(),
5550 nullptr, nullptr);
5551}
5552
5554 SourceLocation StartLoc,
5555 SourceLocation IdLoc,
5556 const IdentifierInfo *Id,
5557 TypeSourceInfo *TInfo) {
5558 return new (C, DC) TypeAliasDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5559}
5560
5562 GlobalDeclID ID) {
5563 return new (C, ID) TypeAliasDecl(C, nullptr, SourceLocation(),
5564 SourceLocation(), nullptr, nullptr);
5565}
5566
5568 SourceLocation RangeEnd = getLocation();
5569 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
5570 if (typeIsPostfix(TInfo->getType()))
5571 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5572 }
5573 return SourceRange(getBeginLoc(), RangeEnd);
5574}
5575
5577 SourceLocation RangeEnd = getBeginLoc();
5578 if (TypeSourceInfo *TInfo = getTypeSourceInfo())
5579 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5580 return SourceRange(getBeginLoc(), RangeEnd);
5581}
5582
5583void FileScopeAsmDecl::anchor() {}
5584
5586 StringLiteral *Str,
5587 SourceLocation AsmLoc,
5588 SourceLocation RParenLoc) {
5589 return new (C, DC) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc);
5590}
5591
5593 GlobalDeclID ID) {
5594 return new (C, ID) FileScopeAsmDecl(nullptr, nullptr, SourceLocation(),
5595 SourceLocation());
5596}
5597
5598void TopLevelStmtDecl::anchor() {}
5599
5601 assert(C.getLangOpts().IncrementalExtensions &&
5602 "Must be used only in incremental mode");
5603
5604 SourceLocation Loc = Statement ? Statement->getBeginLoc() : SourceLocation();
5605 DeclContext *DC = C.getTranslationUnitDecl();
5606
5607 return new (C, DC) TopLevelStmtDecl(DC, Loc, Statement);
5608}
5609
5611 GlobalDeclID ID) {
5612 return new (C, ID)
5613 TopLevelStmtDecl(/*DC=*/nullptr, SourceLocation(), /*S=*/nullptr);
5614}
5615
5617 return SourceRange(getLocation(), Statement->getEndLoc());
5618}
5619
5621 assert(S);
5622 Statement = S;
5623 setLocation(Statement->getBeginLoc());
5624}
5625
5626void EmptyDecl::anchor() {}
5627
5629 return new (C, DC) EmptyDecl(DC, L);
5630}
5631
5633 return new (C, ID) EmptyDecl(nullptr, SourceLocation());
5634}
5635
5636HLSLBufferDecl::HLSLBufferDecl(DeclContext *DC, bool CBuffer,
5638 SourceLocation IDLoc, SourceLocation LBrace)
5639 : NamedDecl(Decl::Kind::HLSLBuffer, DC, IDLoc, DeclarationName(ID)),
5640 DeclContext(Decl::Kind::HLSLBuffer), LBraceLoc(LBrace), KwLoc(KwLoc),
5641 IsCBuffer(CBuffer) {}
5642
5644 DeclContext *LexicalParent, bool CBuffer,
5646 SourceLocation IDLoc,
5647 SourceLocation LBrace) {
5648 // For hlsl like this
5649 // cbuffer A {
5650 // cbuffer B {
5651 // }
5652 // }
5653 // compiler should treat it as
5654 // cbuffer A {
5655 // }
5656 // cbuffer B {
5657 // }
5658 // FIXME: support nested buffers if required for back-compat.
5659 DeclContext *DC = LexicalParent;
5661 new (C, DC) HLSLBufferDecl(DC, CBuffer, KwLoc, ID, IDLoc, LBrace);
5662 return Result;
5663}
5664
5666 GlobalDeclID ID) {
5667 return new (C, ID) HLSLBufferDecl(nullptr, false, SourceLocation(), nullptr,
5669}
5670
5671//===----------------------------------------------------------------------===//
5672// ImportDecl Implementation
5673//===----------------------------------------------------------------------===//
5674
5675/// Retrieve the number of module identifiers needed to name the given
5676/// module.
5677static unsigned getNumModuleIdentifiers(Module *Mod) {
5678 unsigned Result = 1;
5679 while (Mod->Parent) {
5680 Mod = Mod->Parent;
5681 ++Result;
5682 }
5683 return Result;
5684}
5685
5686ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
5687 Module *Imported,
5688 ArrayRef<SourceLocation> IdentifierLocs)
5689 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
5690 NextLocalImportAndComplete(nullptr, true) {
5691 assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size());
5692 auto *StoredLocs = getTrailingObjects<SourceLocation>();
5693 std::uninitialized_copy(IdentifierLocs.begin(), IdentifierLocs.end(),
5694 StoredLocs);
5695}
5696
5697ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
5698 Module *Imported, SourceLocation EndLoc)
5699 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
5700 NextLocalImportAndComplete(nullptr, false) {
5701 *getTrailingObjects<SourceLocation>() = EndLoc;
5702}
5703
5705 SourceLocation StartLoc, Module *Imported,
5706 ArrayRef<SourceLocation> IdentifierLocs) {
5707 return new (C, DC,
5708 additionalSizeToAlloc<SourceLocation>(IdentifierLocs.size()))
5709 ImportDecl(DC, StartLoc, Imported, IdentifierLocs);
5710}
5711
5713 SourceLocation StartLoc,
5714 Module *Imported,
5715 SourceLocation EndLoc) {
5716 ImportDecl *Import = new (C, DC, additionalSizeToAlloc<SourceLocation>(1))
5717 ImportDecl(DC, StartLoc, Imported, EndLoc);
5718 Import->setImplicit();
5719 return Import;
5720}
5721
5723 unsigned NumLocations) {
5724 return new (C, ID, additionalSizeToAlloc<SourceLocation>(NumLocations))
5726}
5727
5729 if (!isImportComplete())
5730 return std::nullopt;
5731
5732 const auto *StoredLocs = getTrailingObjects<SourceLocation>();
5733 return llvm::ArrayRef(StoredLocs,
5735}
5736
5738 if (!isImportComplete())
5739 return SourceRange(getLocation(), *getTrailingObjects<SourceLocation>());
5740
5741 return SourceRange(getLocation(), getIdentifierLocs().back());
5742}
5743
5744//===----------------------------------------------------------------------===//
5745// ExportDecl Implementation
5746//===----------------------------------------------------------------------===//
5747
5748void ExportDecl::anchor() {}
5749
5751 SourceLocation ExportLoc) {
5752 return new (C, DC) ExportDecl(DC, ExportLoc);
5753}
5754
5756 return new (C, ID) ExportDecl(nullptr, SourceLocation());
5757}
5758
5760 bool IncludeLocallyStreaming) {
5761 if (IncludeLocallyStreaming)
5762 if (FD->hasAttr<ArmLocallyStreamingAttr>())
5763 return true;
5764
5765 if (const Type *Ty = FD->getType().getTypePtrOrNull())
5766 if (const auto *FPT = Ty->getAs<FunctionProtoType>())
5767 if (FPT->getAArch64SMEAttributes() &
5769 return true;
5770
5771 return false;
5772}
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3341
NodeId Parent
Definition: ASTDiff.cpp:191
This file provides some common utility functions for processing Lambda related AST Constructs.
StringRef P
static char ID
Definition: Arena.cpp:183
#define SM(sm)
Definition: Cuda.cpp:83
Defines enum values for all the target-independent builtin functions.
const Decl * D
enum clang::sema::@1655::IndirectLocalPathEntry::EntryKind Kind
Expr * E
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
static bool isFirstInExternCContext(T *D)
Definition: Decl.cpp:574
static bool isRedeclarableImpl(Redeclarable< T > *)
Definition: Decl.cpp:1820
static bool isDeclExternC(const T &D)
Definition: Decl.cpp:2211
static bool hasExplicitVisibilityAlready(LVComputationKind computation)
Does this computation kind permit us to consider additional visibility settings from attributes and t...
Definition: Decl.cpp:160
static bool RedeclForcesDefC99(const FunctionDecl *Redecl)
Definition: Decl.cpp:3771
static bool isExportedFromModuleInterfaceUnit(const NamedDecl *D)
Definition: Decl.cpp:1184
static bool isRedeclarable(Decl::Kind K)
Definition: Decl.cpp:1824
static bool redeclForcesDefMSVC(const FunctionDecl *Redecl)
Definition: Decl.cpp:3759
static bool usesTypeVisibility(const NamedDecl *D)
Is the given declaration a "type" or a "value" for the purposes of visibility computation?
Definition: Decl.cpp:181
static std::optional< Visibility > getVisibilityOf(const NamedDecl *D, NamedDecl::ExplicitVisibilityKind kind)
Return the explicit visibility of the given declaration.
Definition: Decl.cpp:223
static LanguageLinkage getDeclLanguageLinkage(const T &D)
Definition: Decl.cpp:2184
static LVComputationKind withExplicitVisibilityAlready(LVComputationKind Kind)
Given an LVComputationKind, return one of the same type/value sort that records that it already has e...
Definition: Decl.cpp:167
static std::enable_if_t<!std::is_base_of_v< RedeclarableTemplateDecl, T >, bool > isExplicitMemberSpecialization(const T *D)
Does the given declaration have member specialization information, and if so, is it an explicit speci...
Definition: Decl.cpp:191
static unsigned getNumModuleIdentifiers(Module *Mod)
Retrieve the number of module identifiers needed to name the given module.
Definition: Decl.cpp:5677
static bool isSingleLineLanguageLinkage(const Decl &D)
Definition: Decl.cpp:579
static bool useInlineVisibilityHidden(const NamedDecl *D)
Definition: Decl.cpp:546
static bool shouldConsiderTemplateVisibility(const FunctionDecl *fn, const FunctionTemplateSpecializationInfo *specInfo)
Definition: Decl.cpp:373
static bool hasDirectVisibilityAttribute(const NamedDecl *D, LVComputationKind computation)
Does the given declaration have a direct visibility attribute that would match the given rules?
Definition: Decl.cpp:419
static DeclT * getDefinitionOrSelf(DeclT *D)
Definition: Decl.cpp:2656
static Visibility getVisibilityFromAttr(const T *attr)
Given a visibility attribute, return the explicit visibility associated with it.
Definition: Decl.cpp:209
static const Decl * getOutermostFuncOrBlockContext(const Decl *D)
Definition: Decl.cpp:303
static bool typeIsPostfix(QualType QT)
Definition: Decl.cpp:2038
static LinkageInfo getExternalLinkageFor(const NamedDecl *D)
Definition: Decl.cpp:586
static StorageClass getStorageClass(const Decl *D)
Definition: Decl.cpp:590
static std::optional< Visibility > getExplicitVisibilityAux(const NamedDecl *ND, NamedDecl::ExplicitVisibilityKind kind, bool IsMostRecent)
Definition: Decl.cpp:1225
static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl)
Definition: Decl.cpp:1964
static bool isNamed(const NamedDecl *ND, const char(&Str)[Len])
Definition: Decl.cpp:3251
static std::optional< Visibility > getExplicitVisibility(const NamedDecl *D, LVComputationKind kind)
Definition: Decl.cpp:172
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition: MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static std::string getName(const CallEvent &Call)
Defines the clang::SanitizerKind enum.
uint32_t Id
Definition: SemaARM.cpp:1144
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
static const TypeInfo & getInfo(unsigned id)
Definition: Types.cpp:47
SourceLocation Begin
Defines the clang::Visibility enumeration and various utility functions.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
bool isAbsent() const
Definition: APValue.h:397
bool needsCleanup() const
Returns whether the object performed allocations.
Definition: APValue.cpp:431
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:187
SourceManager & getSourceManager()
Definition: ASTContext.h:721
const ConstantArrayType * getAsConstantArrayType(QualType T) const
Definition: ASTContext.h:2825
unsigned getIntWidth(QualType T) const
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
Definition: ASTContext.h:1242
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
Definition: ASTContext.h:2644
CanQualType VoidPtrTy
Definition: ASTContext.h:1146
void Deallocate(void *Ptr) const
Definition: ASTContext.h:740
Builtin::Context & BuiltinInfo
Definition: ASTContext.h:662
const LangOptions & getLangOpts() const
Definition: ASTContext.h:797
void setParameterIndex(const ParmVarDecl *D, unsigned index)
Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...
Decl * getPrimaryMergedDecl(Decl *D)
Definition: ASTContext.h:1057
const NoSanitizeList & getNoSanitizeList() const
Definition: ASTContext.h:807
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition: ASTContext.h:713
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
void * Allocate(size_t Size, unsigned Align=8) const
Definition: ASTContext.h:734
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
DiagnosticsEngine & getDiagnostics() const
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:779
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
Definition: ASTContext.h:3171
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition: ASTContext.h:1227
NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
unsigned getParameterIndex(const ParmVarDecl *D) const
Used by ParmVarDecl to retrieve on the side the index of the parameter when it exceeds the size of th...
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
Definition: RecordLayout.h:38
CharUnits getSize() const
getSize - Get the record size in characters.
Definition: RecordLayout.h:193
unsigned getFieldCount() const
getFieldCount - Get the number of fields in the layout.
Definition: RecordLayout.h:196
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Definition: RecordLayout.h:200
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4471
BlockDecl(DeclContext *DC, SourceLocation CaretLoc)
Definition: Decl.cpp:5218
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition: Decl.cpp:5228
void setDoesNotEscape(bool B=true)
Definition: Decl.h:4623
void setCapturesCXXThis(bool B=true)
Definition: Decl.h:4604
void setCanAvoidCopyToHeap(bool B=true)
Definition: Decl.h:4628
void setIsConversionFromLambda(bool val=true)
Definition: Decl.h:4618
void setBlockMissingReturnType(bool val=true)
Definition: Decl.h:4610
ArrayRef< Capture > captures() const
Definition: Decl.h:4598
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5261
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5419
void setIsVariadic(bool value)
Definition: Decl.h:4547
bool capturesVariable(const VarDecl *var) const
Definition: Decl.cpp:5252
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition: Decl.cpp:5239
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition: Decl.cpp:5415
bool isPredefinedLibFunction(unsigned ID) const
Determines whether this builtin is a predefined libc/libm function, such as "malloc",...
Definition: Builtins.h:160
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
Definition: DeclCXX.cpp:1915
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4670
void setBody(Stmt *B)
Definition: Decl.cpp:5440
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition: Decl.cpp:5433
bool isNothrow() const
Definition: Decl.cpp:5442
void setNothrow(bool Nothrow=true)
Definition: Decl.cpp:5443
static CapturedDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition: Decl.cpp:5427
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition: Decl.cpp:5439
CharUnits - This is an opaque type for sizes expressed in character units.
Definition: CharUnits.h:38
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Definition: CharUnits.h:53
Declaration of a class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
Represents a class template specialization, which refers to a class template with a given set of temp...
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
bool isZeroSize() const
Return true if the size is zero.
Definition: Type.h:3674
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
Definition: Type.h:3295
A POD class for pairing a NamedDecl* with an access specifier.
decl_iterator - Iterates through the declarations stored within this context.
Definition: DeclBase.h:2307
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition: DeclBase.h:2370
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:2090
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition: DeclBase.h:2219
FunctionDeclBitfields FunctionDeclBits
Definition: DeclBase.h:2025
bool isFileContext() const
Definition: DeclBase.h:2161
static std::pair< Decl *, Decl * > BuildDeclChain(ArrayRef< Decl * > Decls, bool FieldsAlreadyLoaded)
Build up a chain of declarations.
Definition: DeclBase.cpp:1523
TagDeclBitfields TagDeclBits
Definition: DeclBase.h:2021
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1399
bool isNamespace() const
Definition: DeclBase.h:2179
bool isTranslationUnit() const
Definition: DeclBase.h:2166
bool isRecord() const
Definition: DeclBase.h:2170
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
Definition: DeclBase.cpp:1988
RecordDeclBitfields RecordDeclBits
Definition: DeclBase.h:2023
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
Definition: DeclBase.h:2060
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition: DeclBase.h:2665
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
Definition: DeclBase.h:2066
bool isInlineNamespace() const
Definition: DeclBase.cpp:1312
bool isFunctionOrMethod() const
Definition: DeclBase.h:2142
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1384
Decl::Kind getDeclKind() const
Definition: DeclBase.h:2083
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition: DeclBase.h:1051
bool isInStdNamespace() const
Definition: DeclBase.cpp:425
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition: DeclBase.h:1216
T * getAttr() const
Definition: DeclBase.h:580
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:523
void addAttr(Attr *A)
Definition: DeclBase.cpp:1013
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition: DeclBase.h:600
bool isInNamedModule() const
Whether this declaration comes from a named module.
Definition: DeclBase.cpp:1167
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
Definition: Decl.cpp:100
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
Definition: DeclBase.cpp:843
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
Definition: DeclBase.h:866
ASTMutationListener * getASTMutationListener() const
Definition: DeclBase.cpp:533
bool hasCachedLinkage() const
Definition: DeclBase.h:428
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
@ FOK_None
Not a friend object.
Definition: DeclBase.h:1207
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition: DeclBase.h:974
llvm::PointerIntPair< Decl *, 3, ModuleOwnershipKind > NextInContextAndBits
The next declaration within the same lexical DeclContext.
Definition: DeclBase.h:249
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition: DeclBase.h:836
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition: DeclBase.cpp:249
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition: DeclBase.h:787
Linkage getCachedLinkage() const
Definition: DeclBase.h:420
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition: DeclBase.h:2767
bool isInvalidDecl() const
Definition: DeclBase.h:595
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
Definition: DeclBase.cpp:610
SourceLocation getLocation() const
Definition: DeclBase.h:446
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
Definition: DeclBase.h:115
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
Definition: DeclBase.h:125
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition: DeclBase.h:1039
void setLocation(SourceLocation L)
Definition: DeclBase.h:447
DeclContext * getDeclContext()
Definition: DeclBase.h:455
bool isInAnonymousNamespace() const
Definition: DeclBase.cpp:415
void setCachedLinkage(Linkage L) const
Definition: DeclBase.h:424
friend class RecordDecl
Definition: DeclBase.h:334
void updateOutOfDate(IdentifierInfo &II) const
Update a potentially out-of-date declaration.
Definition: DeclBase.cpp:63
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
Definition: Decl.cpp:1624
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:908
bool hasAttr() const
Definition: DeclBase.h:584
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclBase.h:968
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Kind getKind() const
Definition: DeclBase.h:449
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
Definition: DeclBase.cpp:529
The name of a declaration.
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
Represents a ValueDecl that came out of a declarator.
Definition: Decl.h:731
SourceLocation getTypeSpecEndLoc() const
Definition: Decl.cpp:1976
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
Definition: Decl.h:774
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
Definition: Decl.cpp:2032
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:2072
SourceLocation getTypeSpecStartLoc() const
Definition: Decl.cpp:1970
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:783
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition: Decl.cpp:1982
void setTrailingRequiresClause(Expr *TrailingRequiresClause)
Definition: Decl.cpp:2001
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Definition: Decl.h:807
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:760
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition: Decl.cpp:2016
Provides information about a dependent function-template specialization declaration.
Definition: DeclTemplate.h:689
static DependentFunctionTemplateSpecializationInfo * Create(ASTContext &Context, const UnresolvedSetImpl &Candidates, const TemplateArgumentListInfo *TemplateArgs)
Definition: Decl.cpp:4229
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1547
Represents an empty-declaration.
Definition: Decl.h:4909
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition: Decl.cpp:5628
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5632
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3274
EnumConstantDecl(const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition: Decl.cpp:5445
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5459
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition: Decl.h:3299
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition: Decl.cpp:5452
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5493
Represents an enum.
Definition: Decl.h:3844
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition: Decl.h:4103
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
Definition: Decl.h:4041
unsigned getODRHash()
Definition: Decl.cpp:4950
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For an enumeration member that was instantiated from a member enumeration of a templated class,...
Definition: Decl.cpp:4911
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
Definition: Decl.cpp:4851
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
Definition: Decl.h:4020
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:4863
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
Definition: Decl.cpp:4896
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
Definition: Decl.cpp:4871
SourceRange getSourceRange() const override LLVM_READONLY
Overrides to provide correct range when there's an enum-base specifier with forward declarations.
Definition: Decl.cpp:4961
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition: Decl.h:4004
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
Definition: Decl.cpp:4937
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
Definition: Decl.h:4030
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Definition: Decl.cpp:4904
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
Definition: Decl.cpp:4890
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
Definition: Decl.cpp:4922
bool isClosedNonFlag() const
Returns true if this enum is annotated with neither flag_enum nor enum_extensibility(open).
Definition: Decl.cpp:4900
void getValueRange(llvm::APInt &Max, llvm::APInt &Min) const
Calculates the [Min,Max) values the enum can store based on the NumPositiveBits and NumNegativeBits.
Definition: Decl.cpp:4972
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Definition: Type.h:5991
Represents a standard C++ module export declaration.
Definition: Decl.h:4862
static ExportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExportLoc)
Definition: Decl.cpp:5750
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5755
This represents one expression.
Definition: Expr.h:110
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition: Expr.h:175
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
QualType getType() const
Definition: Expr.h:142
Declaration context for names declared as extern "C" in C++.
Definition: Decl.h:222
static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)
Definition: Decl.cpp:5331
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Abstract interface for external sources of AST nodes.
virtual void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Result)
Finds all declarations lexically contained within the given DeclContext, after applying an optional f...
Represents a member of a struct/union/class.
Definition: Decl.h:3030
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Definition: Decl.cpp:4556
bool isBitField() const
Determines whether this field is a bitfield.
Definition: Decl.h:3121
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition: Decl.h:3191
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
Definition: Decl.cpp:4630
LazyDeclStmtPtr Init
Definition: Decl.h:3080
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
Definition: Decl.cpp:4546
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4652
bool isZeroLengthBitField(const ASTContext &Ctx) const
Is this a zero-length bit-field? Such bit-fields aren't really bit-fields at all and instead act as a...
Definition: Decl.cpp:4583
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:4540
unsigned getBitWidthValue(const ASTContext &Ctx) const
Computes the bit width of this field, if this is a bit field.
Definition: Decl.cpp:4578
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Definition: Decl.cpp:4566
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition: Decl.h:3247
bool isZeroSize(const ASTContext &Ctx) const
Determine if this field is a subobject of zero size, that is, either a zero-length bit-field or a fie...
Definition: Decl.cpp:4588
InitAndBitWidthStorage * InitAndBitWidth
Definition: Decl.h:3084
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
Definition: Decl.cpp:4531
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
Definition: Decl.h:3258
static bool classofKind(Kind K)
Definition: Decl.h:3263
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Definition: Decl.h:3124
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
Definition: Decl.h:3134
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition: Decl.cpp:4671
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
Definition: Decl.cpp:4681
bool isPotentiallyOverlapping() const
Determine if this field is of potentially-overlapping class type, that is, subobject with the [[no_un...
Definition: Decl.cpp:4626
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
Definition: Decl.cpp:4661
const VariableArrayType * CapturedVLAType
Definition: Decl.h:3086
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, StringLiteral *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Definition: Decl.cpp:5585
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5592
Stashed information about a defaulted/deleted function body.
Definition: Decl.h:1960
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Definition: Decl.cpp:3084
void setDeletedMessage(StringLiteral *Message)
Definition: Decl.cpp:3127
Represents a function declaration or definition.
Definition: Decl.h:1932
unsigned getMemoryFunctionKind() const
Identify a memory copying or setting function.
Definition: Decl.cpp:4385
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
Definition: Decl.cpp:3580
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition: Decl.h:2562
const ParmVarDecl * getParamDecl(unsigned i) const
Definition: Decl.h:2669
bool hasTrivialBody() const
Returns whether the function has a trivial body that does not require any specific codegen.
Definition: Decl.cpp:3155
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition: Decl.cpp:3699
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition: Decl.cpp:4040
void setPreviousDeclaration(FunctionDecl *PrevDecl)
Definition: Decl.cpp:3589
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition: Decl.cpp:4033
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition: Decl.cpp:4028
void setIsPureVirtual(bool P=true)
Definition: Decl.cpp:3243
bool isImmediateFunction() const
Definition: Decl.cpp:3276
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition: Decl.cpp:3105
SourceLocation getEllipsisLoc() const
Returns the location of the ellipsis of a variadic function.
Definition: Decl.h:2155
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
Definition: Decl.cpp:3859
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition: Decl.cpp:3460
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5409
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition: Decl.cpp:3618
SourceLocation getPointOfInstantiation() const
Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...
Definition: Decl.cpp:4346
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
Definition: Decl.cpp:3522
bool hasCXXExplicitFunctionObjectParameter() const
Definition: Decl.cpp:3717
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition: Decl.h:2793
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
Definition: Decl.h:2781
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
Definition: Decl.h:2378
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition: Decl.cpp:3511
ArrayRef< ParmVarDecl * > parameters() const
Definition: Decl.h:2646
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
Definition: Decl.cpp:3562
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
Definition: Decl.cpp:4099
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
Definition: Decl.cpp:3743
unsigned getMinRequiredExplicitArguments() const
Returns the minimum number of non-object arguments needed to call this function.
Definition: Decl.cpp:3726
bool BodyContainsImmediateEscalatingExpressions() const
Definition: Decl.h:2415
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition: Decl.cpp:3474
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition: Decl.cpp:4148
bool hasWrittenPrototype() const
Whether this function has a written prototype.
Definition: Decl.h:2373
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition: Decl.cpp:4007
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition: Decl.cpp:4158
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:3603
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
Definition: Decl.cpp:3853
bool isVariadic() const
Whether this function is variadic.
Definition: Decl.cpp:3077
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition: Decl.h:2258
bool isConstexprSpecified() const
Definition: Decl.h:2404
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
Definition: Decl.cpp:4223
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition: Decl.cpp:4164
SourceRange getExceptionSpecSourceRange() const
Attempt to compute an informative source range covering the function exception specification,...
Definition: Decl.cpp:3891
bool hasBody() const override
Returns true if this Decl represents a declaration for a body of code, such as a function or method d...
Definition: Decl.h:2185
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
Definition: Decl.cpp:3300
unsigned getODRHash()
Returns ODRHash of the function.
Definition: Decl.cpp:4510
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Determine the kind of template specialization this function represents for the purpose of template in...
Definition: Decl.cpp:4275
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
Definition: Decl.cpp:4092
unsigned getNumNonObjectParams() const
Definition: Decl.cpp:3721
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition: Decl.h:1937
@ TK_MemberSpecialization
Definition: Decl.h:1944
@ TK_DependentNonTemplate
Definition: Decl.h:1953
@ TK_FunctionTemplateSpecialization
Definition: Decl.h:1948
@ TK_DependentFunctionTemplateSpecialization
Definition: Decl.h:1951
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:2760
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
Definition: Decl.cpp:4358
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
Definition: Decl.cpp:3435
bool FriendConstraintRefersToEnclosingTemplate() const
Definition: Decl.h:2580
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition: Decl.cpp:3979
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition: Decl.cpp:4046
bool isDeletedAsWritten() const
Definition: Decl.h:2469
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Definition: Decl.cpp:3327
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
Definition: Decl.cpp:4212
bool isInExternCContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C" linkage spec.
Definition: Decl.cpp:3482
FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass S, bool UsesFPIntrin, bool isInlineSpecified, ConstexprSpecKind ConstexprKind, Expr *TrailingRequiresClause=nullptr)
Definition: Decl.cpp:3025
bool isImplicitlyInstantiable() const
Determines whether this function is a function template specialization or a member of a class templat...
Definition: Decl.cpp:4057
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition: Decl.cpp:3478
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition: Decl.h:2232
bool isDefined() const
Definition: Decl.h:2208
LazyDeclStmtPtr Body
The body of the function.
Definition: Decl.h:1998
bool isImmediateEscalating() const
Definition: Decl.cpp:3256
DefaultedOrDeletedFunctionInfo * DefaultedOrDeletedInfo
Information about a future defaulted function definition.
Definition: Decl.h:2000
bool isInExternCXXContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C++" linkage spec.
Definition: Decl.cpp:3488
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition: Decl.cpp:3294
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition: Decl.h:2788
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
Definition: Decl.cpp:3584
bool isReplaceableGlobalAllocationFunction(std::optional< unsigned > *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
Definition: Decl.cpp:3352
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, Expr *TrailingRequiresClause=nullptr)
Definition: Decl.h:2121
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
Definition: Decl.cpp:3168
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
Definition: Decl.cpp:3558
bool isDefaulted() const
Whether this function is defaulted.
Definition: Decl.h:2310
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4381
FunctionDecl * getInstantiatedFromDecl() const
Definition: Decl.cpp:4052
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Determine what kind of template instantiation this function represents.
Definition: Decl.cpp:4319
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
Definition: Decl.cpp:3973
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition: Decl.cpp:3965
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition: Decl.cpp:4252
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
Definition: Decl.cpp:3793
bool isConsteval() const
Definition: Decl.h:2407
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
Definition: Decl.cpp:3566
void setBody(Stmt *B)
Definition: Decl.cpp:3236
bool isGlobal() const
Determines whether this is a global function.
Definition: Decl.cpp:3492
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
Definition: Decl.cpp:3731
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition: Decl.cpp:3114
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
Definition: Decl.cpp:3571
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
Definition: Decl.cpp:4000
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
Definition: Decl.cpp:3913
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition: Decl.cpp:3678
DeclarationNameInfo getNameInfo() const
Definition: Decl.h:2143
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Definition: Decl.cpp:3144
SourceRange getParametersSourceRange() const
Attempt to compute an informative source range covering the function parameters, including the ellips...
Definition: Decl.cpp:3875
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition: Decl.h:2771
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
Definition: Decl.cpp:3544
DefaultedOrDeletedFunctionInfo * getDefalutedOrDeletedInfo() const
Definition: Decl.cpp:3139
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
Definition: Decl.cpp:3069
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Definition: Decl.h:2558
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Definition: Decl.cpp:4174
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5002
unsigned getNumParams() const
Definition: Type.h:5255
bool isVariadic() const
Whether this function prototype is variadic.
Definition: Type.h:5379
Declaration of a template function.
Definition: DeclTemplate.h:957
void addSpecialization(FunctionTemplateSpecializationInfo *Info, void *InsertPos)
Add a specialization of this function template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
Provides information about a function template specialization, which is a FunctionDecl that has been ...
Definition: DeclTemplate.h:467
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
Definition: DeclTemplate.h:481
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
Definition: DeclTemplate.h:522
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
Definition: DeclTemplate.h:536
Wrapper for source info for functions.
Definition: TypeLoc.h:1428
SourceRange getExceptionSpecRange() const
Definition: TypeLoc.h:1480
TypeLoc getReturnLoc() const
Definition: TypeLoc.h:1509
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4308
@ SME_PStateSMEnabledMask
Definition: Type.h:4574
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition: Decl.h:4924
static HLSLBufferDecl * Create(ASTContext &C, DeclContext *LexicalParent, bool CBuffer, SourceLocation KwLoc, IdentifierInfo *ID, SourceLocation IDLoc, SourceLocation LBrace)
Definition: Decl.cpp:5643
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5665
One of these records is kept for each identifier that is lexed.
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine whether this is a name reserved for the implementation (C99 7.1.3, C++ [lib....
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition: Decl.cpp:5378
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5390
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition: Decl.h:4783
static ImportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, ArrayRef< SourceLocation > IdentifierLocs)
Create a new module import declaration.
Definition: Decl.cpp:5704
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5737
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition: Decl.cpp:5722
ArrayRef< SourceLocation > getIdentifierLocs() const
Retrieves the locations of each of the identifiers that make up the complete module name in the impor...
Definition: Decl.cpp:5728
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition: Decl.h:4841
static ImportDecl * CreateImplicit(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, SourceLocation EndLoc)
Create a new module import declaration for an implicitly-generated import.
Definition: Decl.cpp:5712
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3318
static bool classofKind(Kind K)
Definition: Decl.h:3363
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, llvm::MutableArrayRef< NamedDecl * > CH)
Definition: Decl.cpp:5480
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5486
Represents the declaration of a label.
Definition: Decl.h:499
void setMSAsmLabel(StringRef Name)
Definition: Decl.cpp:5355
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
Definition: Decl.cpp:5338
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5350
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:476
SanitizerSet Sanitize
Set of enabled sanitizers.
Definition: LangOptions.h:482
LinkageInfo getTypeLinkageAndVisibility(const Type *T)
Definition: Type.cpp:4680
LinkageInfo computeLVForDecl(const NamedDecl *D, LVComputationKind computation, bool IgnoreVarTypeLinkage=false)
Definition: Decl.cpp:1450
LinkageInfo getLVForDecl(const NamedDecl *D, LVComputationKind computation)
getLVForDecl - Get the linkage and visibility for the given declaration.
Definition: Decl.cpp:1568
LinkageInfo getDeclLinkageAndVisibility(const NamedDecl *D)
Definition: Decl.cpp:1614
Visibility getVisibility() const
Definition: Visibility.h:89
static LinkageInfo external()
Definition: Visibility.h:72
static LinkageInfo none()
Definition: Visibility.h:81
void setLinkage(Linkage L)
Definition: Visibility.h:92
void mergeExternalVisibility(Linkage L)
Definition: Visibility.h:101
void mergeMaybeWithVisibility(LinkageInfo other, bool withVis)
Merge linkage and conditionally merge visibility.
Definition: Visibility.h:143
Linkage getLinkage() const
Definition: Visibility.h:88
static LinkageInfo internal()
Definition: Visibility.h:75
static LinkageInfo visible_none()
Definition: Visibility.h:84
static LinkageInfo uniqueExternal()
Definition: Visibility.h:78
void mergeVisibility(Visibility newVis, bool newExplicit)
Merge in the visibility 'newVis'.
Definition: Visibility.h:116
bool isVisibilityExplicit() const
Definition: Visibility.h:90
void merge(LinkageInfo other)
Merge both linkage and visibility.
Definition: Visibility.h:137
Provides information a specialization of a member of a class template, which may be a member function...
Definition: DeclTemplate.h:615
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the template specialization kind.
Definition: DeclTemplate.h:646
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
Definition: DeclTemplate.h:637
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
Definition: DeclTemplate.h:655
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Definition: DeclTemplate.h:660
NamedDecl * getInstantiatedFrom() const
Retrieve the member declaration from which this member was instantiated.
Definition: DeclTemplate.h:634
Describes a module or submodule.
Definition: Module.h:105
Module * Parent
The parent of this module.
Definition: Module.h:154
ModuleKind Kind
The kind of this module.
Definition: Module.h:150
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
Definition: Module.h:128
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition: Module.h:119
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
Definition: Module.h:146
@ ModulePartitionInterface
This is a C++20 module partition interface.
Definition: Module.h:131
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
Definition: Module.h:125
@ ModuleHeaderUnit
This is a C++20 header unit.
Definition: Module.h:122
@ ModulePartitionImplementation
This is a C++20 module partition implementation.
Definition: Module.h:134
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition: Module.h:141
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition: Module.h:138
This represents a decl that may have a name.
Definition: Decl.h:249
ExplicitVisibilityKind
Kinds of explicit visibility.
Definition: Decl.h:427
@ VisibilityForValue
Do an LV computation for, ultimately, a non-type declaration.
Definition: Decl.h:436
@ VisibilityForType
Do an LV computation for, ultimately, a type.
Definition: Decl.h:431
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
Definition: Decl.cpp:1176
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition: Decl.h:270
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
Definition: Decl.cpp:1220
bool isLinkageValid() const
True if the computed linkage is valid.
Definition: Decl.cpp:1079
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition: Decl.h:276
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition: Decl.cpp:1089
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:315
std::string getQualifiedNameAsString() const
Definition: Decl.cpp:1668
std::optional< Visibility > getExplicitVisibility(ExplicitVisibilityKind kind) const
If visibility was explicitly specified for this declaration, return that visibility.
Definition: Decl.cpp:1304
NamedDecl * getMostRecentDecl()
Definition: Decl.h:476
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Definition: Decl.cpp:1811
bool declarationReplaces(const NamedDecl *OldD, bool IsKnownNewer=true) const
Determine whether this declaration, if known to be well-formed within its context,...
Definition: Decl.cpp:1835
ObjCStringFormatFamily getObjCFStringFormattingFamily() const
Definition: Decl.cpp:1163
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Definition: Decl.cpp:1200
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
Definition: Decl.cpp:1675
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
Definition: Decl.cpp:1660
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
Definition: Decl.cpp:1944
bool hasLinkage() const
Determine whether this declaration has linkage.
Definition: Decl.cpp:1912
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
Definition: Decl.cpp:1126
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Definition: Decl.h:372
void printNestedNameSpecifier(raw_ostream &OS) const
Print only the nested name specifier part of a fully-qualified name, including the '::' at the end.
Definition: Decl.cpp:1702
Represent a C++ namespace.
Definition: Decl.h:547
A C++ nested-name-specifier augmented with source location information.
bool containsType(SanitizerMask Mask, StringRef MangledTypeName, StringRef Category=StringRef()) const
bool containsLocation(SanitizerMask Mask, SourceLocation Loc, StringRef Category=StringRef()) const
void AddEnumDecl(const EnumDecl *Enum)
Definition: ODRHash.cpp:754
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Definition: ODRHash.cpp:661
void AddRecordDecl(const RecordDecl *Record)
Definition: ODRHash.cpp:616
unsigned CalculateHash()
Definition: ODRHash.cpp:225
Represents a parameter to a function.
Definition: Decl.h:1722
void setDefaultArg(Expr *defarg)
Definition: Decl.cpp:2968
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:2920
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
Definition: Decl.h:1851
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
Definition: Decl.cpp:2973
void setUninstantiatedDefaultArg(Expr *arg)
Definition: Decl.cpp:2993
bool hasUninstantiatedDefaultArg() const
Definition: Decl.h:1855
bool isDestroyedInCallee() const
Determines whether this parameter is destroyed in the callee function.
Definition: Decl.cpp:2941
bool hasInheritedDefaultArg() const
Definition: Decl.h:1867
bool isExplicitObjectParameter() const
Definition: Decl.h:1810
QualType getOriginalType() const
Definition: Decl.cpp:2912
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Definition: Decl.cpp:2903
Expr * getDefaultArg()
Definition: Decl.cpp:2956
Expr * getUninstantiatedDefaultArg()
Definition: Decl.cpp:2998
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
Definition: Decl.cpp:3004
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:2926
Represents a #pragma comment line.
Definition: Decl.h:142
static PragmaCommentDecl * Create(const ASTContext &C, TranslationUnitDecl *DC, SourceLocation CommentLoc, PragmaMSCommentKind CommentKind, StringRef Arg)
Definition: Decl.cpp:5284
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition: Decl.cpp:5297
Represents a #pragma detect_mismatch line.
Definition: Decl.h:176
static PragmaDetectMismatchDecl * Create(const ASTContext &C, TranslationUnitDecl *DC, SourceLocation Loc, StringRef Name, StringRef Value)
Definition: Decl.cpp:5307
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition: Decl.cpp:5323
void print(raw_ostream &OS) const override
Definition: Decl.cpp:81
A (possibly-)qualified type.
Definition: Type.h:941
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: Type.h:1008
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition: Type.h:7750
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition: Type.h:1542
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition: Type.h:7796
const Type * getTypePtrOrNull() const
Definition: Type.h:7754
Represents a struct/union/class.
Definition: Decl.h:4145
bool hasLoadedFieldsFromExternalStorage() const
Definition: Decl.h:4214
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition: Decl.cpp:5201
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
Definition: Decl.cpp:5039
bool isMsStruct(const ASTContext &C) const
Get whether or not this is an ms_struct which can be turned on with an attribute, pragma,...
Definition: Decl.cpp:5101
void setAnonymousStructOrUnion(bool Anon)
Definition: Decl.h:4201
const FieldDecl * findFirstNamedDataMember() const
Finds the first data member which has a name.
Definition: Decl.cpp:5186
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition: Decl.h:4283
void setNonTrivialToPrimitiveCopy(bool V)
Definition: Decl.h:4235
bool isCapturedRecord() const
Determine whether this record is a record for captured variables in CapturedStmt construct.
Definition: Decl.cpp:5045
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition: Decl.h:4267
field_range fields() const
Definition: Decl.h:4351
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition: Decl.h:4259
void setHasFlexibleArrayMember(bool V)
Definition: Decl.h:4182
void setParamDestroyedInCallee(bool V)
Definition: Decl.h:4291
void setNonTrivialToPrimitiveDestroy(bool V)
Definition: Decl.h:4243
void setHasObjectMember(bool val)
Definition: Decl.h:4206
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
Definition: Decl.cpp:5014
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
Definition: Decl.cpp:5034
void setHasVolatileMember(bool val)
Definition: Decl.h:4210
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition: Decl.h:4251
void reorderDecls(const SmallVectorImpl< Decl * > &Decls)
Definition: Decl.cpp:5105
void setIsRandomized(bool V)
Definition: Decl.h:4297
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5025
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition: Decl.cpp:5142
static bool classof(const Decl *D)
Definition: Decl.h:4366
bool isOrContainsUnion() const
Returns whether this record is a union, or contains (at any nesting level) a union member.
Definition: Decl.cpp:5053
virtual void completeDefinition()
Note that the definition of this type is now complete.
Definition: Decl.cpp:5080
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition: Decl.h:4336
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
Definition: Decl.cpp:5049
specific_decl_iterator< FieldDecl > field_iterator
Definition: Decl.h:4348
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition: Decl.h:4227
void setHasLoadedFieldsFromExternalStorage(bool val) const
Definition: Decl.h:4218
field_iterator field_begin() const
Definition: Decl.cpp:5068
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:5965
RecordDecl * getDecl() const
Definition: Type.h:5975
Declaration of a redeclarable template.
Definition: DeclTemplate.h:716
Provides common interface for the Decls that can be redeclared.
Definition: Redeclarable.h:84
VarDecl * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Definition: Redeclarable.h:217
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Definition: Redeclarable.h:205
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
Definition: Redeclarable.h:227
void setPreviousDecl(FunctionDecl *PrevDecl)
Set the previous declaration.
Definition: Decl.h:4978
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition: Redeclarable.h:297
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
void print(raw_ostream &OS, const SourceManager &SM) const
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
bool isInvalid() const
SourceLocation getEnd() const
SourceLocation getBegin() const
bool isValid() const
Stmt - This represents one statement.
Definition: Stmt.h:84
SourceLocation getEndLoc() const LLVM_READONLY
Definition: Stmt.cpp:350
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:326
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.cpp:338
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3561
void setTagKind(TagKind TK)
Definition: Decl.h:3760
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition: Decl.h:3679
SourceRange getBraceRange() const
Definition: Decl.h:3640
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
Definition: Decl.cpp:4759
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
Definition: Decl.h:3694
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition: Decl.h:3664
void setMayHaveOutOfDateDef(bool V=true)
Indicates whether it is possible for declarations of this kind to have an out-of-date definition.
Definition: Decl.h:3622
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition: Decl.h:3789
void startDefinition()
Starts the definition of this tag declaration.
Definition: Decl.cpp:4736
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:4725
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
Definition: Decl.cpp:4727
bool mayHaveOutOfDateDef() const
Indicates whether it is possible for declarations of this kind to have an out-of-date definition.
Definition: Decl.h:3710
SourceLocation getOuterLocStart() const
Return SourceLocation representing start of source range taking into account any outer template decla...
Definition: Decl.cpp:4715
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4719
bool isUnion() const
Definition: Decl.h:3767
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
Definition: Decl.h:3616
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition: Decl.cpp:4782
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition: Decl.cpp:4819
void completeDefinition()
Completes the definition of this tag declaration.
Definition: Decl.cpp:4747
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition: Decl.cpp:4802
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition: Decl.h:3702
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Definition: Decl.h:3715
TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl, SourceLocation StartL)
Definition: Decl.cpp:4698
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition: Decl.h:3667
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Definition: TargetCXXABI.h:136
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1256
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Definition: TargetInfo.h:1327
A convenient class for passing around template argument information.
Definition: TemplateBase.h:632
A template argument list.
Definition: DeclTemplate.h:244
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Definition: DeclTemplate.h:274
Represents a template argument.
Definition: TemplateBase.h:61
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
Definition: TemplateBase.h:74
@ Template
The template argument is a template name that was provided for a template template parameter.
Definition: TemplateBase.h:93
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
Definition: TemplateBase.h:89
@ Pack
The template argument is actually a parameter pack.
Definition: TemplateBase.h:107
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
Definition: TemplateBase.h:97
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
Definition: TemplateBase.h:78
@ Type
The template argument is a type.
Definition: TemplateBase.h:70
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
Definition: TemplateBase.h:67
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
Definition: TemplateBase.h:82
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
Definition: TemplateBase.h:103
The base class of all kinds of template declarations (e.g., class, function, etc.).
Definition: DeclTemplate.h:394
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Definition: DeclTemplate.h:413
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
A declaration that models statements at global scope.
Definition: Decl.h:4434
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5610
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Definition: Decl.cpp:5600
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5616
void setStmt(Stmt *S)
Definition: Decl.cpp:5620
The top declaration context.
Definition: Decl.h:84
static TranslationUnitDecl * Create(ASTContext &C)
Definition: Decl.cpp:5271
ASTContext & getASTContext() const
Definition: Decl.h:120
void setAnonymousNamespace(NamespaceDecl *D)
Definition: Decl.cpp:5275
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition: Decl.h:3532
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5561
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition: Decl.cpp:5553
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5576
Represents a declaration of a type.
Definition: Decl.h:3367
const Type * getTypeForDecl() const
Definition: Decl.h:3391
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:3394
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition: TypeLoc.h:89
TypeLoc IgnoreParens() const
Definition: TypeLoc.h:1225
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition: TypeLoc.h:153
SourceLocation getEndLoc() const
Get the end source location.
Definition: TypeLoc.cpp:235
SourceLocation getBeginLoc() const
Get the begin source location.
Definition: TypeLoc.cpp:192
A container of type source information.
Definition: Type.h:7721
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition: TypeLoc.h:256
QualType getType() const
Return the type wrapped by this type source info.
Definition: Type.h:7732
The base class of the type hierarchy.
Definition: Type.h:1829
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.cpp:1882
bool isLinkageValid() const
True if the computed linkage is valid.
Definition: Type.cpp:4670
bool isNothrowT() const
Definition: Type.cpp:3061
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:8607
bool isReferenceType() const
Definition: Type.h:8021
bool isEnumeralType() const
Definition: Type.h:8107
bool isAlignValT() const
Definition: Type.cpp:3070
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition: Type.cpp:705
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2695
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition: Type.cpp:2011
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition: Type.h:8453
bool isFunctionType() const
Definition: Type.h:7999
Linkage getLinkage() const
Determine the linkage of this type.
Definition: Type.cpp:4582
TypeClass getTypeClass() const
Definition: Type.h:2334
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8540
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3511
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition: Decl.cpp:5502
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5567
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5548
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3409
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:3459
QualType getUnderlyingType() const
Definition: Decl.h:3464
TypedefNameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this typedef-name.
Definition: Decl.h:3481
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
Definition: Decl.cpp:5511
A set of unresolved declarations.
Definition: UnresolvedSet.h:62
unsigned size() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:667
QualType getType() const
Definition: Decl.h:678
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Definition: Decl.cpp:5364
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition: Decl.cpp:5370
Represents a variable declaration or definition.
Definition: Decl.h:879
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition: Decl.cpp:2775
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition: Decl.cpp:2133
Stmt ** getInitAddress()
Retrieve the address of the initializer expression.
Definition: Decl.cpp:2404
DefinitionKind isThisDeclarationADefinition() const
Definition: Decl.h:1256
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition: Decl.h:1510
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
Definition: Decl.cpp:2892
TLSKind getTLSKind() const
Definition: Decl.cpp:2150
@ DAK_Unparsed
Definition: Decl.h:955
@ DAK_Normal
Definition: Decl.h:957
@ DAK_Uninstantiated
Definition: Decl.h:956
bool hasInit() const
Definition: Decl.cpp:2380
bool hasICEInitializer(const ASTContext &Context) const
Determine whether the initializer of this variable is an integer constant expression.
Definition: Decl.cpp:2600
ParmVarDeclBitfields ParmVarDeclBits
Definition: Decl.h:1072
DefinitionKind hasDefinition() const
Definition: Decl.h:1262
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition: Decl.cpp:2103
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:2172
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
Definition: Decl.cpp:2426
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:2239
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
Definition: Decl.cpp:2819
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed? If so, the variable need not have a usable destr...
Definition: Decl.cpp:2801
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition: Decl.h:1519
void setStorageClass(StorageClass SC)
Definition: Decl.cpp:2145
APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition: Decl.cpp:2539
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition: Decl.h:1231
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:2139
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
Definition: Decl.cpp:2679
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition: Decl.h:1174
VarDeclBitfields VarDeclBits
Definition: Decl.h:1071
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
Definition: Decl.cpp:2834
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
Definition: Decl.cpp:2612
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition: Decl.cpp:2223
unsigned AllBits
Definition: Decl.h:1070
EvaluatedStmt * getEvaluatedStmt() const
Definition: Decl.cpp:2535
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
Definition: Decl.cpp:2451
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition: Decl.cpp:2521
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
Definition: Decl.cpp:2737
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
Definition: Decl.h:1290
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
Definition: Decl.cpp:2864
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition: Decl.cpp:2808
bool checkForConstantInitialization(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the initializer of this variable to determine whether it's a constant initializer.
Definition: Decl.cpp:2625
bool isInline() const
Whether this variable is (C++1z) inline.
Definition: Decl.h:1492
const Expr * getInit() const
Definition: Decl.h:1316
bool isNonEscapingByref() const
Indicates the capture is a __block variable that is never captured by an escaping block.
Definition: Decl.cpp:2667
bool isInExternCContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C" linkage spec.
Definition: Decl.cpp:2231
NonParmVarDeclBitfields NonParmVarDeclBits
Definition: Decl.h:1073
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
Definition: Decl.h:1165
InitType Init
The initializer for this variable or, for a ParmVarDecl, the C++ default argument.
Definition: Decl.h:925
APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or NULL if the value is not yet kn...
Definition: Decl.cpp:2592
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
Definition: Decl.cpp:2411
TLSKind
Kinds of thread-local storage.
Definition: Decl.h:897
@ TLS_Static
TLS with a known-constant initializer.
Definition: Decl.h:902
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition: Decl.h:905
@ TLS_None
Not a TLS variable.
Definition: Decl.h:899
void setInit(Expr *I)
Definition: Decl.cpp:2442
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
Definition: Decl.cpp:2327
@ TentativeDefinition
This declaration is a tentative definition.
Definition: Decl.h:1246
@ DeclarationOnly
This declaration is only a declaration.
Definition: Decl.h:1243
@ Definition
This declaration is definitely a definition.
Definition: Decl.h:1249
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition: Decl.cpp:2780
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
Definition: Decl.cpp:2227
VarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass SC)
Definition: Decl.cpp:2116
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition: Decl.h:1177
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:1116
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
Definition: Decl.cpp:2663
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
Definition: Decl.h:1417
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
Definition: Decl.cpp:2493
bool isInExternCXXContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C++" linkage spec.
Definition: Decl.cpp:2235
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Definition: Decl.cpp:2765
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
Definition: Decl.cpp:2671
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Get the template specialization kind of this variable for the purposes of template instantiation.
Definition: Decl.cpp:2755
VarDecl * getDefinition()
Definition: Decl.h:1278
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Definition: Decl.cpp:2744
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Definition: Decl.h:1306
bool isKnownToBeDefined() const
Definition: Decl.cpp:2784
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
Definition: Decl.cpp:2651
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Definition: Decl.cpp:2855
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
Represents a variable template specialization, which refers to a variable template with a given set o...
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:3795
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
Definition: OperatorKinds.h:21
@ OO_None
Not an overloaded operator.
Definition: OperatorKinds.h:22
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition: Specifiers.h:212
ObjCStringFormatFamily
@ CPlusPlus
Definition: LangStandard.h:56
@ GVA_StrongODR
Definition: Linkage.h:77
@ GVA_StrongExternal
Definition: Linkage.h:76
@ GVA_AvailableExternally
Definition: Linkage.h:74
@ GVA_DiscardableODR
Definition: Linkage.h:75
@ GVA_Internal
Definition: Linkage.h:73
bool isReservedInAllContexts(ReservedIdentifierStatus Status)
Determine whether an identifier is reserved in all contexts.
PragmaMSCommentKind
Definition: PragmaKinds.h:14
@ PCK_Unknown
Definition: PragmaKinds.h:15
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition: Specifiers.h:35
Decl * getPrimaryMergedDecl(Decl *D)
Get the primary declaration for a declaration from an AST file.
Definition: Decl.cpp:77
InClassInitStyle
In-class initialization styles for non-static data members.
Definition: Specifiers.h:271
@ ICIS_NoInit
No in-class initializer.
Definition: Specifiers.h:272
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
Linkage getFormalLinkage(Linkage L)
Definition: Linkage.h:106
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
Definition: Linkage.h:63
@ CLanguageLinkage
Definition: Linkage.h:64
@ CXXLanguageLinkage
Definition: Linkage.h:65
@ NoLanguageLinkage
Definition: Linkage.h:66
StorageClass
Storage classes.
Definition: Specifiers.h:248
@ SC_Auto
Definition: Specifiers.h:256
@ SC_PrivateExtern
Definition: Specifiers.h:253
@ SC_Extern
Definition: Specifiers.h:251
@ SC_Register
Definition: Specifiers.h:257
@ SC_Static
Definition: Specifiers.h:252
@ SC_None
Definition: Specifiers.h:250
@ TSCS_thread_local
C++11 thread_local.
Definition: Specifiers.h:241
@ TSCS_unspecified
Definition: Specifiers.h:236
@ TSCS__Thread_local
C11 _Thread_local.
Definition: Specifiers.h:244
@ TSCS___thread
GNU __thread.
Definition: Specifiers.h:238
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition: Linkage.h:24
@ VisibleNone
No linkage according to the standard, but is visible from other translation units because of types de...
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ UniqueExternal
External linkage within a unique namespace.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ SD_Automatic
Automatic storage duration (most local variables).
Definition: Specifiers.h:329
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition: ASTLambda.h:27
@ Result
The result type of a method or function.
TagTypeKind
The kind of a tag type.
Definition: Type.h:6690
@ Struct
The "struct" keyword.
@ Enum
The "enum" keyword.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
bool isLegalForVariable(StorageClass SC)
Checks whether the given storage class is legal for variables.
Definition: Specifiers.h:266
const FunctionProtoType * T
MultiVersionKind
Definition: Decl.h:1911
void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)
Print a template argument list, including the '<' and '>' enclosing the template arguments.
bool isReservedAtGlobalScope(ReservedIdentifierStatus Status)
Determine whether an identifier is reserved for use as a name at global scope.
bool isExternalFormalLinkage(Linkage L)
Definition: Linkage.h:117
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition: Specifiers.h:188
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition: Specifiers.h:206
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition: Specifiers.h:202
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition: Specifiers.h:198
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition: Specifiers.h:194
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition: Specifiers.h:191
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition: Decl.cpp:5759
ReservedIdentifierStatus
bool isExternallyVisible(Linkage L)
Definition: Linkage.h:90
ImplicitParamKind
Defines the kind of the implicit parameter: is this an implicit parameter with pointer to 'this',...
Definition: Decl.h:1658
@ Other
Other implicit parameter.
Visibility
Describes the different kinds of visibility that a declaration may have.
Definition: Visibility.h:34
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
Definition: Visibility.h:37
@ ProtectedVisibility
Objects with "protected" visibility are seen by the dynamic linker but always dynamically resolve to ...
Definition: Visibility.h:42
@ DefaultVisibility
Objects with "default" visibility are seen by the dynamic linker and act like normal objects.
Definition: Visibility.h:46
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
Definition: ASTLambda.h:53
#define true
Definition: stdbool.h:25
#define false
Definition: stdbool.h:26
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Definition: TemplateBase.h:676
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
A placeholder type used to construct an empty shell of a decl-derived type that will be filled in lat...
Definition: DeclBase.h:102
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
Structure used to store a statement, the constant value to which it was evaluated (if any),...
Definition: Decl.h:844
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition: Decl.h:862
bool WasEvaluated
Whether this statement was already evaluated.
Definition: Decl.h:846
bool CheckedForICEInit
Definition: Decl.h:867
LazyDeclStmtPtr Value
Definition: Decl.h:869
APValue Evaluated
Definition: Decl.h:870
bool IsEvaluating
Whether this statement is being evaluated.
Definition: Decl.h:849
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition: Decl.h:855
bool HasICEInit
In C++98, whether the initializer is an ICE.
Definition: Decl.h:866
Kinds of LV computation.
Definition: Linkage.h:29
bool isTypeVisibility() const
Definition: Linkage.h:53
unsigned IgnoreExplicitVisibility
Whether explicit visibility attributes should be ignored.
Definition: Linkage.h:37
unsigned IgnoreAllVisibility
Whether all visibility should be ignored.
Definition: Linkage.h:41
static LVComputationKind forLinkageOnly()
Do an LV computation when we only care about the linkage.
Definition: Linkage.h:61
bool isValueVisibility() const
Definition: Linkage.h:56
bool isOffset() const
Whether this pointer is currently stored as an offset.
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Definition: Decl.h:704
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
Definition: Decl.h:718
NestedNameSpecifierLoc QualifierLoc
Definition: Decl.h:705
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
Definition: Decl.h:711
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Sets info about "outer" template parameter lists.
Definition: Decl.cpp:2083
SanitizerMask Mask
Bitmask of enabled sanitizers.
Definition: Sanitizers.h:182