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 if (auto *M = D->getOwningModule())
588 return M->isInterfaceOrPartition();
589 return false;
590}
591
593 return LinkageInfo::external();
594}
595
597 if (auto *TD = dyn_cast<TemplateDecl>(D))
598 D = TD->getTemplatedDecl();
599 if (D) {
600 if (auto *VD = dyn_cast<VarDecl>(D))
601 return VD->getStorageClass();
602 if (auto *FD = dyn_cast<FunctionDecl>(D))
603 return FD->getStorageClass();
604 }
605 return SC_None;
606}
607
609LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D,
610 LVComputationKind computation,
611 bool IgnoreVarTypeLinkage) {
613 "Not a name having namespace scope");
614 ASTContext &Context = D->getASTContext();
615 const auto *Var = dyn_cast<VarDecl>(D);
616
617 // C++ [basic.link]p3:
618 // A name having namespace scope (3.3.6) has internal linkage if it
619 // is the name of
620
622 (Context.getLangOpts().C23 && Var && Var->isConstexpr())) {
623 // - a variable, variable template, function, or function template
624 // that is explicitly declared static; or
625 // (This bullet corresponds to C99 6.2.2p3.)
626
627 // C23 6.2.2p3
628 // If the declaration of a file scope identifier for
629 // an object contains any of the storage-class specifiers static or
630 // constexpr then the identifier has internal linkage.
631 return LinkageInfo::internal();
632 }
633
634 if (Var) {
635 // - a non-template variable of non-volatile const-qualified type, unless
636 // - it is explicitly declared extern, or
637 // - it is declared in the purview of a module interface unit
638 // (outside the private-module-fragment, if any) or module partition, or
639 // - it is inline, or
640 // - it was previously declared and the prior declaration did not have
641 // internal linkage
642 // (There is no equivalent in C99.)
643 if (Context.getLangOpts().CPlusPlus && Var->getType().isConstQualified() &&
644 !Var->getType().isVolatileQualified() && !Var->isInline() &&
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 const TranslationUnitDecl *tunit =
3296 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext());
3297 return tunit &&
3298 !tunit->getASTContext().getLangOpts().Freestanding &&
3299 isNamed(this, "main");
3300}
3301
3303 const TranslationUnitDecl *TUnit =
3304 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext());
3305 if (!TUnit)
3306 return false;
3307
3308 // Even though we aren't really targeting MSVCRT if we are freestanding,
3309 // semantic analysis for these functions remains the same.
3310
3311 // MSVCRT entry points only exist on MSVCRT targets.
3312 if (!TUnit->getASTContext().getTargetInfo().getTriple().isOSMSVCRT())
3313 return false;
3314
3315 // Nameless functions like constructors cannot be entry points.
3316 if (!getIdentifier())
3317 return false;
3318
3319 return llvm::StringSwitch<bool>(getName())
3320 .Cases("main", // an ANSI console app
3321 "wmain", // a Unicode console App
3322 "WinMain", // an ANSI GUI app
3323 "wWinMain", // a Unicode GUI app
3324 "DllMain", // a DLL
3325 true)
3326 .Default(false);
3327}
3328
3330 if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName)
3331 return false;
3332 if (getDeclName().getCXXOverloadedOperator() != OO_New &&
3333 getDeclName().getCXXOverloadedOperator() != OO_Delete &&
3334 getDeclName().getCXXOverloadedOperator() != OO_Array_New &&
3335 getDeclName().getCXXOverloadedOperator() != OO_Array_Delete)
3336 return false;
3337
3339 return false;
3340
3341 const auto *proto = getType()->castAs<FunctionProtoType>();
3342 if (proto->getNumParams() != 2 || proto->isVariadic())
3343 return false;
3344
3345 const ASTContext &Context =
3346 cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext())
3347 ->getASTContext();
3348
3349 // The result type and first argument type are constant across all
3350 // these operators. The second argument must be exactly void*.
3351 return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy);
3352}
3353
3355 std::optional<unsigned> *AlignmentParam, bool *IsNothrow) const {
3356 if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName)
3357 return false;
3358 if (getDeclName().getCXXOverloadedOperator() != OO_New &&
3359 getDeclName().getCXXOverloadedOperator() != OO_Delete &&
3360 getDeclName().getCXXOverloadedOperator() != OO_Array_New &&
3361 getDeclName().getCXXOverloadedOperator() != OO_Array_Delete)
3362 return false;
3363
3364 if (isa<CXXRecordDecl>(getDeclContext()))
3365 return false;
3366
3367 // This can only fail for an invalid 'operator new' declaration.
3369 return false;
3370
3371 const auto *FPT = getType()->castAs<FunctionProtoType>();
3372 if (FPT->getNumParams() == 0 || FPT->getNumParams() > 4 || FPT->isVariadic())
3373 return false;
3374
3375 // If this is a single-parameter function, it must be a replaceable global
3376 // allocation or deallocation function.
3377 if (FPT->getNumParams() == 1)
3378 return true;
3379
3380 unsigned Params = 1;
3381 QualType Ty = FPT->getParamType(Params);
3382 const ASTContext &Ctx = getASTContext();
3383
3384 auto Consume = [&] {
3385 ++Params;
3386 Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType();
3387 };
3388
3389 // In C++14, the next parameter can be a 'std::size_t' for sized delete.
3390 bool IsSizedDelete = false;
3391 if (Ctx.getLangOpts().SizedDeallocation &&
3392 (getDeclName().getCXXOverloadedOperator() == OO_Delete ||
3393 getDeclName().getCXXOverloadedOperator() == OO_Array_Delete) &&
3394 Ctx.hasSameType(Ty, Ctx.getSizeType())) {
3395 IsSizedDelete = true;
3396 Consume();
3397 }
3398
3399 // In C++17, the next parameter can be a 'std::align_val_t' for aligned
3400 // new/delete.
3401 if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT()) {
3402 Consume();
3403 if (AlignmentParam)
3404 *AlignmentParam = Params;
3405 }
3406
3407 // If this is not a sized delete, the next parameter can be a
3408 // 'const std::nothrow_t&'.
3409 if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) {
3410 Ty = Ty->getPointeeType();
3412 return false;
3413 if (Ty->isNothrowT()) {
3414 if (IsNothrow)
3415 *IsNothrow = true;
3416 Consume();
3417 }
3418 }
3419
3420 // Finally, recognize the not yet standard versions of new that take a
3421 // hot/cold allocation hint (__hot_cold_t). These are currently supported by
3422 // tcmalloc (see
3423 // https://github.com/google/tcmalloc/blob/220043886d4e2efff7a5702d5172cb8065253664/tcmalloc/malloc_extension.h#L53).
3424 if (!IsSizedDelete && !Ty.isNull() && Ty->isEnumeralType()) {
3425 QualType T = Ty;
3426 while (const auto *TD = T->getAs<TypedefType>())
3427 T = TD->getDecl()->getUnderlyingType();
3428 const IdentifierInfo *II =
3429 T->castAs<EnumType>()->getDecl()->getIdentifier();
3430 if (II && II->isStr("__hot_cold_t"))
3431 Consume();
3432 }
3433
3434 return Params == FPT->getNumParams();
3435}
3436
3438 if (!getBuiltinID())
3439 return false;
3440
3441 const FunctionDecl *Definition;
3442 if (!hasBody(Definition))
3443 return false;
3444
3445 if (!Definition->isInlineSpecified() ||
3446 !Definition->hasAttr<AlwaysInlineAttr>())
3447 return false;
3448
3449 ASTContext &Context = getASTContext();
3450 switch (Context.GetGVALinkageForFunction(Definition)) {
3451 case GVA_Internal:
3452 case GVA_DiscardableODR:
3453 case GVA_StrongODR:
3454 return false;
3456 case GVA_StrongExternal:
3457 return true;
3458 }
3459 llvm_unreachable("Unknown GVALinkage");
3460}
3461
3463 // C++ P0722:
3464 // Within a class C, a single object deallocation function with signature
3465 // (T, std::destroying_delete_t, <more params>)
3466 // is a destroying operator delete.
3467 if (!isa<CXXMethodDecl>(this) || getOverloadedOperator() != OO_Delete ||
3468 getNumParams() < 2)
3469 return false;
3470
3471 auto *RD = getParamDecl(1)->getType()->getAsCXXRecordDecl();
3472 return RD && RD->isInStdNamespace() && RD->getIdentifier() &&
3473 RD->getIdentifier()->isStr("destroying_delete_t");
3474}
3475
3477 return getDeclLanguageLinkage(*this);
3478}
3479
3481 return isDeclExternC(*this);
3482}
3483
3485 if (hasAttr<OpenCLKernelAttr>())
3486 return true;
3488}
3489
3492}
3493
3495 if (const auto *Method = dyn_cast<CXXMethodDecl>(this))
3496 return Method->isStatic();
3497
3499 return false;
3500
3501 for (const DeclContext *DC = getDeclContext();
3502 DC->isNamespace();
3503 DC = DC->getParent()) {
3504 if (const auto *Namespace = cast<NamespaceDecl>(DC)) {
3505 if (!Namespace->getDeclName())
3506 return false;
3507 }
3508 }
3509
3510 return true;
3511}
3512
3514 if (hasAttr<NoReturnAttr>() || hasAttr<CXX11NoReturnAttr>() ||
3515 hasAttr<C11NoReturnAttr>())
3516 return true;
3517
3518 if (auto *FnTy = getType()->getAs<FunctionType>())
3519 return FnTy->getNoReturnAttr();
3520
3521 return false;
3522}
3523
3525 // C++20 [temp.friend]p9:
3526 // A non-template friend declaration with a requires-clause [or]
3527 // a friend function template with a constraint that depends on a template
3528 // parameter from an enclosing template [...] does not declare the same
3529 // function or function template as a declaration in any other scope.
3530
3531 // If this isn't a friend then it's not a member-like constrained friend.
3532 if (!getFriendObjectKind()) {
3533 return false;
3534 }
3535
3537 // If these friends don't have constraints, they aren't constrained, and
3538 // thus don't fall under temp.friend p9. Else the simple presence of a
3539 // constraint makes them unique.
3541 }
3542
3544}
3545
3547 if (hasAttr<TargetAttr>())
3549 if (hasAttr<TargetVersionAttr>())
3551 if (hasAttr<CPUDispatchAttr>())
3553 if (hasAttr<CPUSpecificAttr>())
3555 if (hasAttr<TargetClonesAttr>())
3558}
3559
3561 return isMultiVersion() && hasAttr<CPUDispatchAttr>();
3562}
3563
3565 return isMultiVersion() && hasAttr<CPUSpecificAttr>();
3566}
3567
3569 return isMultiVersion() &&
3570 (hasAttr<TargetAttr>() || hasAttr<TargetVersionAttr>());
3571}
3572
3574 if (!isMultiVersion())
3575 return false;
3576 if (hasAttr<TargetAttr>())
3577 return getAttr<TargetAttr>()->isDefaultVersion();
3578 return hasAttr<TargetVersionAttr>() &&
3579 getAttr<TargetVersionAttr>()->isDefaultVersion();
3580}
3581
3583 return isMultiVersion() && hasAttr<TargetClonesAttr>();
3584}
3585
3587 return isMultiVersion() && hasAttr<TargetVersionAttr>();
3588}
3589
3590void
3593
3595 FunctionTemplateDecl *PrevFunTmpl
3596 = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : nullptr;
3597 assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch");
3598 FunTmpl->setPreviousDecl(PrevFunTmpl);
3599 }
3600
3601 if (PrevDecl && PrevDecl->isInlined())
3602 setImplicitlyInline(true);
3603}
3604
3606
3607/// Returns a value indicating whether this function corresponds to a builtin
3608/// function.
3609///
3610/// The function corresponds to a built-in function if it is declared at
3611/// translation scope or within an extern "C" block and its name matches with
3612/// the name of a builtin. The returned value will be 0 for functions that do
3613/// not correspond to a builtin, a value of type \c Builtin::ID if in the
3614/// target-independent range \c [1,Builtin::First), or a target-specific builtin
3615/// value.
3616///
3617/// \param ConsiderWrapperFunctions If true, we should consider wrapper
3618/// functions as their wrapped builtins. This shouldn't be done in general, but
3619/// it's useful in Sema to diagnose calls to wrappers based on their semantics.
3620unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const {
3621 unsigned BuiltinID = 0;
3622
3623 if (const auto *ABAA = getAttr<ArmBuiltinAliasAttr>()) {
3624 BuiltinID = ABAA->getBuiltinName()->getBuiltinID();
3625 } else if (const auto *BAA = getAttr<BuiltinAliasAttr>()) {
3626 BuiltinID = BAA->getBuiltinName()->getBuiltinID();
3627 } else if (const auto *A = getAttr<BuiltinAttr>()) {
3628 BuiltinID = A->getID();
3629 }
3630
3631 if (!BuiltinID)
3632 return 0;
3633
3634 // If the function is marked "overloadable", it has a different mangled name
3635 // and is not the C library function.
3636 if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>() &&
3637 (!hasAttr<ArmBuiltinAliasAttr>() && !hasAttr<BuiltinAliasAttr>()))
3638 return 0;
3639
3640 const ASTContext &Context = getASTContext();
3641 if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3642 return BuiltinID;
3643
3644 // This function has the name of a known C library
3645 // function. Determine whether it actually refers to the C library
3646 // function or whether it just has the same name.
3647
3648 // If this is a static function, it's not a builtin.
3649 if (!ConsiderWrapperFunctions && getStorageClass() == SC_Static)
3650 return 0;
3651
3652 // OpenCL v1.2 s6.9.f - The library functions defined in
3653 // the C99 standard headers are not available.
3654 if (Context.getLangOpts().OpenCL &&
3655 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3656 return 0;
3657
3658 // CUDA does not have device-side standard library. printf and malloc are the
3659 // only special cases that are supported by device-side runtime.
3660 if (Context.getLangOpts().CUDA && hasAttr<CUDADeviceAttr>() &&
3661 !hasAttr<CUDAHostAttr>() &&
3662 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3663 return 0;
3664
3665 // As AMDGCN implementation of OpenMP does not have a device-side standard
3666 // library, none of the predefined library functions except printf and malloc
3667 // should be treated as a builtin i.e. 0 should be returned for them.
3668 if (Context.getTargetInfo().getTriple().isAMDGCN() &&
3669 Context.getLangOpts().OpenMPIsTargetDevice &&
3670 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
3671 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3672 return 0;
3673
3674 return BuiltinID;
3675}
3676
3677/// getNumParams - Return the number of parameters this function must have
3678/// based on its FunctionType. This is the length of the ParamInfo array
3679/// after it has been created.
3681 const auto *FPT = getType()->getAs<FunctionProtoType>();
3682 return FPT ? FPT->getNumParams() : 0;
3683}
3684
3685void FunctionDecl::setParams(ASTContext &C,
3686 ArrayRef<ParmVarDecl *> NewParamInfo) {
3687 assert(!ParamInfo && "Already has param info!");
3688 assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!");
3689
3690 // Zero params -> null pointer.
3691 if (!NewParamInfo.empty()) {
3692 ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
3693 std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo);
3694 }
3695}
3696
3697/// getMinRequiredArguments - Returns the minimum number of arguments
3698/// needed to call this function. This may be fewer than the number of
3699/// function parameters, if some of the parameters have default
3700/// arguments (in C++) or are parameter packs (C++11).
3703 return getNumParams();
3704
3705 // Note that it is possible for a parameter with no default argument to
3706 // follow a parameter with a default argument.
3707 unsigned NumRequiredArgs = 0;
3708 unsigned MinParamsSoFar = 0;
3709 for (auto *Param : parameters()) {
3710 if (!Param->isParameterPack()) {
3711 ++MinParamsSoFar;
3712 if (!Param->hasDefaultArg())
3713 NumRequiredArgs = MinParamsSoFar;
3714 }
3715 }
3716 return NumRequiredArgs;
3717}
3718
3721}
3722
3724 return getNumParams() -
3725 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3726}
3727
3729 return getMinRequiredArguments() -
3730 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3731}
3732
3734 return getNumParams() == 1 ||
3735 (getNumParams() > 1 &&
3736 llvm::all_of(llvm::drop_begin(parameters()),
3737 [](ParmVarDecl *P) { return P->hasDefaultArg(); }));
3738}
3739
3740/// The combination of the extern and inline keywords under MSVC forces
3741/// the function to be required.
3742///
3743/// Note: This function assumes that we will only get called when isInlined()
3744/// would return true for this FunctionDecl.
3746 assert(isInlined() && "expected to get called on an inlined function!");
3747
3748 const ASTContext &Context = getASTContext();
3749 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() &&
3750 !hasAttr<DLLExportAttr>())
3751 return false;
3752
3753 for (const FunctionDecl *FD = getMostRecentDecl(); FD;
3754 FD = FD->getPreviousDecl())
3755 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3756 return true;
3757
3758 return false;
3759}
3760
3761static bool redeclForcesDefMSVC(const FunctionDecl *Redecl) {
3762 if (Redecl->getStorageClass() != SC_Extern)
3763 return false;
3764
3765 for (const FunctionDecl *FD = Redecl->getPreviousDecl(); FD;
3766 FD = FD->getPreviousDecl())
3767 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3768 return false;
3769
3770 return true;
3771}
3772
3773static bool RedeclForcesDefC99(const FunctionDecl *Redecl) {
3774 // Only consider file-scope declarations in this test.
3775 if (!Redecl->getLexicalDeclContext()->isTranslationUnit())
3776 return false;
3777
3778 // Only consider explicit declarations; the presence of a builtin for a
3779 // libcall shouldn't affect whether a definition is externally visible.
3780 if (Redecl->isImplicit())
3781 return false;
3782
3783 if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern)
3784 return true; // Not an inline definition
3785
3786 return false;
3787}
3788
3789/// For a function declaration in C or C++, determine whether this
3790/// declaration causes the definition to be externally visible.
3791///
3792/// For instance, this determines if adding the current declaration to the set
3793/// of redeclarations of the given functions causes
3794/// isInlineDefinitionExternallyVisible to change from false to true.
3796 assert(!doesThisDeclarationHaveABody() &&
3797 "Must have a declaration without a body.");
3798
3799 const ASTContext &Context = getASTContext();
3800
3801 if (Context.getLangOpts().MSVCCompat) {
3802 const FunctionDecl *Definition;
3803 if (hasBody(Definition) && Definition->isInlined() &&
3804 redeclForcesDefMSVC(this))
3805 return true;
3806 }
3807
3808 if (Context.getLangOpts().CPlusPlus)
3809 return false;
3810
3811 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
3812 // With GNU inlining, a declaration with 'inline' but not 'extern', forces
3813 // an externally visible definition.
3814 //
3815 // FIXME: What happens if gnu_inline gets added on after the first
3816 // declaration?
3818 return false;
3819
3820 const FunctionDecl *Prev = this;
3821 bool FoundBody = false;
3822 while ((Prev = Prev->getPreviousDecl())) {
3823 FoundBody |= Prev->doesThisDeclarationHaveABody();
3824
3825 if (Prev->doesThisDeclarationHaveABody()) {
3826 // If it's not the case that both 'inline' and 'extern' are
3827 // specified on the definition, then it is always externally visible.
3828 if (!Prev->isInlineSpecified() ||
3829 Prev->getStorageClass() != SC_Extern)
3830 return false;
3831 } else if (Prev->isInlineSpecified() &&
3832 Prev->getStorageClass() != SC_Extern) {
3833 return false;
3834 }
3835 }
3836 return FoundBody;
3837 }
3838
3839 // C99 6.7.4p6:
3840 // [...] If all of the file scope declarations for a function in a
3841 // translation unit include the inline function specifier without extern,
3842 // then the definition in that translation unit is an inline definition.
3844 return false;
3845 const FunctionDecl *Prev = this;
3846 bool FoundBody = false;
3847 while ((Prev = Prev->getPreviousDecl())) {
3848 FoundBody |= Prev->doesThisDeclarationHaveABody();
3849 if (RedeclForcesDefC99(Prev))
3850 return false;
3851 }
3852 return FoundBody;
3853}
3854
3856 const TypeSourceInfo *TSI = getTypeSourceInfo();
3857 return TSI ? TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>()
3858 : FunctionTypeLoc();
3859}
3860
3863 if (!FTL)
3864 return SourceRange();
3865
3866 // Skip self-referential return types.
3868 SourceRange RTRange = FTL.getReturnLoc().getSourceRange();
3869 SourceLocation Boundary = getNameInfo().getBeginLoc();
3870 if (RTRange.isInvalid() || Boundary.isInvalid() ||
3871 !SM.isBeforeInTranslationUnit(RTRange.getEnd(), Boundary))
3872 return SourceRange();
3873
3874 return RTRange;
3875}
3876
3878 unsigned NP = getNumParams();
3879 SourceLocation EllipsisLoc = getEllipsisLoc();
3880
3881 if (NP == 0 && EllipsisLoc.isInvalid())
3882 return SourceRange();
3883
3885 NP > 0 ? ParamInfo[0]->getSourceRange().getBegin() : EllipsisLoc;
3886 SourceLocation End = EllipsisLoc.isValid()
3887 ? EllipsisLoc
3888 : ParamInfo[NP - 1]->getSourceRange().getEnd();
3889
3890 return SourceRange(Begin, End);
3891}
3892
3895 return FTL ? FTL.getExceptionSpecRange() : SourceRange();
3896}
3897
3898/// For an inline function definition in C, or for a gnu_inline function
3899/// in C++, determine whether the definition will be externally visible.
3900///
3901/// Inline function definitions are always available for inlining optimizations.
3902/// However, depending on the language dialect, declaration specifiers, and
3903/// attributes, the definition of an inline function may or may not be
3904/// "externally" visible to other translation units in the program.
3905///
3906/// In C99, inline definitions are not externally visible by default. However,
3907/// if even one of the global-scope declarations is marked "extern inline", the
3908/// inline definition becomes externally visible (C99 6.7.4p6).
3909///
3910/// In GNU89 mode, or if the gnu_inline attribute is attached to the function
3911/// definition, we use the GNU semantics for inline, which are nearly the
3912/// opposite of C99 semantics. In particular, "inline" by itself will create
3913/// an externally visible symbol, but "extern inline" will not create an
3914/// externally visible symbol.
3917 hasAttr<AliasAttr>()) &&
3918 "Must be a function definition");
3919 assert(isInlined() && "Function must be inline");
3920 ASTContext &Context = getASTContext();
3921
3922 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
3923 // Note: If you change the logic here, please change
3924 // doesDeclarationForceExternallyVisibleDefinition as well.
3925 //
3926 // If it's not the case that both 'inline' and 'extern' are
3927 // specified on the definition, then this inline definition is
3928 // externally visible.
3929 if (Context.getLangOpts().CPlusPlus)
3930 return false;
3932 return true;
3933
3934 // If any declaration is 'inline' but not 'extern', then this definition
3935 // is externally visible.
3936 for (auto *Redecl : redecls()) {
3937 if (Redecl->isInlineSpecified() &&
3938 Redecl->getStorageClass() != SC_Extern)
3939 return true;
3940 }
3941
3942 return false;
3943 }
3944
3945 // The rest of this function is C-only.
3946 assert(!Context.getLangOpts().CPlusPlus &&
3947 "should not use C inline rules in C++");
3948
3949 // C99 6.7.4p6:
3950 // [...] If all of the file scope declarations for a function in a
3951 // translation unit include the inline function specifier without extern,
3952 // then the definition in that translation unit is an inline definition.
3953 for (auto *Redecl : redecls()) {
3954 if (RedeclForcesDefC99(Redecl))
3955 return true;
3956 }
3957
3958 // C99 6.7.4p6:
3959 // An inline definition does not provide an external definition for the
3960 // function, and does not forbid an external definition in another
3961 // translation unit.
3962 return false;
3963}
3964
3965/// getOverloadedOperator - Which C++ overloaded operator this
3966/// function represents, if any.
3968 if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
3970 return OO_None;
3971}
3972
3973/// getLiteralIdentifier - The literal suffix identifier this function
3974/// represents, if any.
3978 return nullptr;
3979}
3980
3982 if (TemplateOrSpecialization.isNull())
3983 return TK_NonTemplate;
3984 if (const auto *ND = TemplateOrSpecialization.dyn_cast<NamedDecl *>()) {
3985 if (isa<FunctionDecl>(ND))
3987 assert(isa<FunctionTemplateDecl>(ND) &&
3988 "No other valid types in NamedDecl");
3989 return TK_FunctionTemplate;
3990 }
3991 if (TemplateOrSpecialization.is<MemberSpecializationInfo *>())
3993 if (TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>())
3995 if (TemplateOrSpecialization.is
3998
3999 llvm_unreachable("Did we miss a TemplateOrSpecialization type?");
4000}
4001
4004 return cast<FunctionDecl>(Info->getInstantiatedFrom());
4005
4006 return nullptr;
4007}
4008
4010 if (auto *MSI =
4011 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4012 return MSI;
4013 if (auto *FTSI = TemplateOrSpecialization
4014 .dyn_cast<FunctionTemplateSpecializationInfo *>())
4015 return FTSI->getMemberSpecializationInfo();
4016 return nullptr;
4017}
4018
4019void
4020FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C,
4021 FunctionDecl *FD,
4023 assert(TemplateOrSpecialization.isNull() &&
4024 "Member function is already a specialization");
4026 = new (C) MemberSpecializationInfo(FD, TSK);
4027 TemplateOrSpecialization = Info;
4028}
4029
4031 return dyn_cast_if_present<FunctionTemplateDecl>(
4032 TemplateOrSpecialization.dyn_cast<NamedDecl *>());
4033}
4034
4036 FunctionTemplateDecl *Template) {
4037 assert(TemplateOrSpecialization.isNull() &&
4038 "Member function is already a specialization");
4039 TemplateOrSpecialization = Template;
4040}
4041
4043 return TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>() ||
4044 TemplateOrSpecialization
4045 .is<DependentFunctionTemplateSpecializationInfo *>();
4046}
4047
4049 assert(TemplateOrSpecialization.isNull() &&
4050 "Function is already a specialization");
4051 TemplateOrSpecialization = FD;
4052}
4053
4055 return dyn_cast_if_present<FunctionDecl>(
4056 TemplateOrSpecialization.dyn_cast<NamedDecl *>());
4057}
4058
4060 // If the function is invalid, it can't be implicitly instantiated.
4061 if (isInvalidDecl())
4062 return false;
4063
4065 case TSK_Undeclared:
4068 return false;
4069
4071 return true;
4072
4074 // Handled below.
4075 break;
4076 }
4077
4078 // Find the actual template from which we will instantiate.
4079 const FunctionDecl *PatternDecl = getTemplateInstantiationPattern();
4080 bool HasPattern = false;
4081 if (PatternDecl)
4082 HasPattern = PatternDecl->hasBody(PatternDecl);
4083
4084 // C++0x [temp.explicit]p9:
4085 // Except for inline functions, other explicit instantiation declarations
4086 // have the effect of suppressing the implicit instantiation of the entity
4087 // to which they refer.
4088 if (!HasPattern || !PatternDecl)
4089 return true;
4090
4091 return PatternDecl->isInlined();
4092}
4093
4095 // FIXME: Remove this, it's not clear what it means. (Which template
4096 // specialization kind?)
4098}
4099
4102 // If this is a generic lambda call operator specialization, its
4103 // instantiation pattern is always its primary template's pattern
4104 // even if its primary template was instantiated from another
4105 // member template (which happens with nested generic lambdas).
4106 // Since a lambda's call operator's body is transformed eagerly,
4107 // we don't have to go hunting for a prototype definition template
4108 // (i.e. instantiated-from-member-template) to use as an instantiation
4109 // pattern.
4110
4112 dyn_cast<CXXMethodDecl>(this))) {
4113 assert(getPrimaryTemplate() && "not a generic lambda call operator?");
4114 return getDefinitionOrSelf(getPrimaryTemplate()->getTemplatedDecl());
4115 }
4116
4117 // Check for a declaration of this function that was instantiated from a
4118 // friend definition.
4119 const FunctionDecl *FD = nullptr;
4120 if (!isDefined(FD, /*CheckForPendingFriendDefinition=*/true))
4121 FD = this;
4122
4124 if (ForDefinition &&
4126 return nullptr;
4127 return getDefinitionOrSelf(cast<FunctionDecl>(Info->getInstantiatedFrom()));
4128 }
4129
4130 if (ForDefinition &&
4132 return nullptr;
4133
4134 if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
4135 // If we hit a point where the user provided a specialization of this
4136 // template, we're done looking.
4137 while (!ForDefinition || !Primary->isMemberSpecialization()) {
4138 auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate();
4139 if (!NewPrimary)
4140 break;
4141 Primary = NewPrimary;
4142 }
4143
4144 return getDefinitionOrSelf(Primary->getTemplatedDecl());
4145 }
4146
4147 return nullptr;
4148}
4149
4152 = TemplateOrSpecialization
4153 .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4154 return Info->getTemplate();
4155 }
4156 return nullptr;
4157}
4158
4161 return TemplateOrSpecialization
4163}
4164
4168 = TemplateOrSpecialization
4169 .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4170 return Info->TemplateArguments;
4171 }
4172 return nullptr;
4173}
4174
4178 = TemplateOrSpecialization
4179 .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4180 return Info->TemplateArgumentsAsWritten;
4181 }
4183 TemplateOrSpecialization
4184 .dyn_cast<DependentFunctionTemplateSpecializationInfo *>()) {
4185 return Info->TemplateArgumentsAsWritten;
4186 }
4187 return nullptr;
4188}
4189
4190void FunctionDecl::setFunctionTemplateSpecialization(
4191 ASTContext &C, FunctionTemplateDecl *Template,
4192 TemplateArgumentList *TemplateArgs, void *InsertPos,
4194 const TemplateArgumentListInfo *TemplateArgsAsWritten,
4195 SourceLocation PointOfInstantiation) {
4196 assert((TemplateOrSpecialization.isNull() ||
4197 TemplateOrSpecialization.is<MemberSpecializationInfo *>()) &&
4198 "Member function is already a specialization");
4199 assert(TSK != TSK_Undeclared &&
4200 "Must specify the type of function template specialization");
4201 assert((TemplateOrSpecialization.isNull() ||
4204 "Member specialization must be an explicit specialization");
4207 C, this, Template, TSK, TemplateArgs, TemplateArgsAsWritten,
4208 PointOfInstantiation,
4209 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>());
4210 TemplateOrSpecialization = Info;
4211 Template->addSpecialization(Info, InsertPos);
4212}
4213
4215 ASTContext &Context, const UnresolvedSetImpl &Templates,
4216 const TemplateArgumentListInfo *TemplateArgs) {
4217 assert(TemplateOrSpecialization.isNull());
4220 TemplateArgs);
4221 TemplateOrSpecialization = Info;
4222}
4223
4226 return TemplateOrSpecialization
4228}
4229
4232 ASTContext &Context, const UnresolvedSetImpl &Candidates,
4233 const TemplateArgumentListInfo *TArgs) {
4234 const auto *TArgsWritten =
4235 TArgs ? ASTTemplateArgumentListInfo::Create(Context, *TArgs) : nullptr;
4236 return new (Context.Allocate(
4237 totalSizeToAlloc<FunctionTemplateDecl *>(Candidates.size())))
4238 DependentFunctionTemplateSpecializationInfo(Candidates, TArgsWritten);
4239}
4240
4241DependentFunctionTemplateSpecializationInfo::
4242 DependentFunctionTemplateSpecializationInfo(
4243 const UnresolvedSetImpl &Candidates,
4244 const ASTTemplateArgumentListInfo *TemplateArgsWritten)
4245 : NumCandidates(Candidates.size()),
4246 TemplateArgumentsAsWritten(TemplateArgsWritten) {
4247 std::transform(Candidates.begin(), Candidates.end(),
4248 getTrailingObjects<FunctionTemplateDecl *>(),
4249 [](NamedDecl *ND) {
4250 return cast<FunctionTemplateDecl>(ND->getUnderlyingDecl());
4251 });
4252}
4253
4255 // For a function template specialization, query the specialization
4256 // information object.
4258 TemplateOrSpecialization
4259 .dyn_cast<FunctionTemplateSpecializationInfo *>())
4260 return FTSInfo->getTemplateSpecializationKind();
4261
4262 if (MemberSpecializationInfo *MSInfo =
4263 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4264 return MSInfo->getTemplateSpecializationKind();
4265
4266 // A dependent function template specialization is an explicit specialization,
4267 // except when it's a friend declaration.
4268 if (TemplateOrSpecialization
4269 .is<DependentFunctionTemplateSpecializationInfo *>() &&
4272
4273 return TSK_Undeclared;
4274}
4275
4278 // This is the same as getTemplateSpecializationKind(), except that for a
4279 // function that is both a function template specialization and a member
4280 // specialization, we prefer the member specialization information. Eg:
4281 //
4282 // template<typename T> struct A {
4283 // template<typename U> void f() {}
4284 // template<> void f<int>() {}
4285 // };
4286 //
4287 // Within the templated CXXRecordDecl, A<T>::f<int> is a dependent function
4288 // template specialization; both getTemplateSpecializationKind() and
4289 // getTemplateSpecializationKindForInstantiation() will return
4290 // TSK_ExplicitSpecialization.
4291 //
4292 // For A<int>::f<int>():
4293 // * getTemplateSpecializationKind() will return TSK_ExplicitSpecialization
4294 // * getTemplateSpecializationKindForInstantiation() will return
4295 // TSK_ImplicitInstantiation
4296 //
4297 // This reflects the facts that A<int>::f<int> is an explicit specialization
4298 // of A<int>::f, and that A<int>::f<int> should be implicitly instantiated
4299 // from A::f<int> if a definition is needed.
4301 TemplateOrSpecialization
4302 .dyn_cast<FunctionTemplateSpecializationInfo *>()) {
4303 if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo())
4304 return MSInfo->getTemplateSpecializationKind();
4305 return FTSInfo->getTemplateSpecializationKind();
4306 }
4307
4308 if (MemberSpecializationInfo *MSInfo =
4309 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4310 return MSInfo->getTemplateSpecializationKind();
4311
4312 if (TemplateOrSpecialization
4313 .is<DependentFunctionTemplateSpecializationInfo *>() &&
4316
4317 return TSK_Undeclared;
4318}
4319
4320void
4322 SourceLocation PointOfInstantiation) {
4324 = TemplateOrSpecialization.dyn_cast<
4326 FTSInfo->setTemplateSpecializationKind(TSK);
4327 if (TSK != TSK_ExplicitSpecialization &&
4328 PointOfInstantiation.isValid() &&
4329 FTSInfo->getPointOfInstantiation().isInvalid()) {
4330 FTSInfo->setPointOfInstantiation(PointOfInstantiation);
4332 L->InstantiationRequested(this);
4333 }
4334 } else if (MemberSpecializationInfo *MSInfo
4335 = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) {
4336 MSInfo->setTemplateSpecializationKind(TSK);
4337 if (TSK != TSK_ExplicitSpecialization &&
4338 PointOfInstantiation.isValid() &&
4339 MSInfo->getPointOfInstantiation().isInvalid()) {
4340 MSInfo->setPointOfInstantiation(PointOfInstantiation);
4342 L->InstantiationRequested(this);
4343 }
4344 } else
4345 llvm_unreachable("Function cannot have a template specialization kind");
4346}
4347
4350 = TemplateOrSpecialization.dyn_cast<
4352 return FTSInfo->getPointOfInstantiation();
4353 if (MemberSpecializationInfo *MSInfo =
4354 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4355 return MSInfo->getPointOfInstantiation();
4356
4357 return SourceLocation();
4358}
4359
4361 if (Decl::isOutOfLine())
4362 return true;
4363
4364 // If this function was instantiated from a member function of a
4365 // class template, check whether that member function was defined out-of-line.
4367 const FunctionDecl *Definition;
4368 if (FD->hasBody(Definition))
4369 return Definition->isOutOfLine();
4370 }
4371
4372 // If this function was instantiated from a function template,
4373 // check whether that function template was defined out-of-line.
4374 if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) {
4375 const FunctionDecl *Definition;
4376 if (FunTmpl->getTemplatedDecl()->hasBody(Definition))
4377 return Definition->isOutOfLine();
4378 }
4379
4380 return false;
4381}
4382
4384 return SourceRange(getOuterLocStart(), EndRangeLoc);
4385}
4386
4388 IdentifierInfo *FnInfo = getIdentifier();
4389
4390 if (!FnInfo)
4391 return 0;
4392
4393 // Builtin handling.
4394 switch (getBuiltinID()) {
4395 case Builtin::BI__builtin_memset:
4396 case Builtin::BI__builtin___memset_chk:
4397 case Builtin::BImemset:
4398 return Builtin::BImemset;
4399
4400 case Builtin::BI__builtin_memcpy:
4401 case Builtin::BI__builtin___memcpy_chk:
4402 case Builtin::BImemcpy:
4403 return Builtin::BImemcpy;
4404
4405 case Builtin::BI__builtin_mempcpy:
4406 case Builtin::BI__builtin___mempcpy_chk:
4407 case Builtin::BImempcpy:
4408 return Builtin::BImempcpy;
4409
4410 case Builtin::BI__builtin_memmove:
4411 case Builtin::BI__builtin___memmove_chk:
4412 case Builtin::BImemmove:
4413 return Builtin::BImemmove;
4414
4415 case Builtin::BIstrlcpy:
4416 case Builtin::BI__builtin___strlcpy_chk:
4417 return Builtin::BIstrlcpy;
4418
4419 case Builtin::BIstrlcat:
4420 case Builtin::BI__builtin___strlcat_chk:
4421 return Builtin::BIstrlcat;
4422
4423 case Builtin::BI__builtin_memcmp:
4424 case Builtin::BImemcmp:
4425 return Builtin::BImemcmp;
4426
4427 case Builtin::BI__builtin_bcmp:
4428 case Builtin::BIbcmp:
4429 return Builtin::BIbcmp;
4430
4431 case Builtin::BI__builtin_strncpy:
4432 case Builtin::BI__builtin___strncpy_chk:
4433 case Builtin::BIstrncpy:
4434 return Builtin::BIstrncpy;
4435
4436 case Builtin::BI__builtin_strncmp:
4437 case Builtin::BIstrncmp:
4438 return Builtin::BIstrncmp;
4439
4440 case Builtin::BI__builtin_strncasecmp:
4441 case Builtin::BIstrncasecmp:
4442 return Builtin::BIstrncasecmp;
4443
4444 case Builtin::BI__builtin_strncat:
4445 case Builtin::BI__builtin___strncat_chk:
4446 case Builtin::BIstrncat:
4447 return Builtin::BIstrncat;
4448
4449 case Builtin::BI__builtin_strndup:
4450 case Builtin::BIstrndup:
4451 return Builtin::BIstrndup;
4452
4453 case Builtin::BI__builtin_strlen:
4454 case Builtin::BIstrlen:
4455 return Builtin::BIstrlen;
4456
4457 case Builtin::BI__builtin_bzero:
4458 case Builtin::BIbzero:
4459 return Builtin::BIbzero;
4460
4461 case Builtin::BI__builtin_bcopy:
4462 case Builtin::BIbcopy:
4463 return Builtin::BIbcopy;
4464
4465 case Builtin::BIfree:
4466 return Builtin::BIfree;
4467
4468 default:
4469 if (isExternC()) {
4470 if (FnInfo->isStr("memset"))
4471 return Builtin::BImemset;
4472 if (FnInfo->isStr("memcpy"))
4473 return Builtin::BImemcpy;
4474 if (FnInfo->isStr("mempcpy"))
4475 return Builtin::BImempcpy;
4476 if (FnInfo->isStr("memmove"))
4477 return Builtin::BImemmove;
4478 if (FnInfo->isStr("memcmp"))
4479 return Builtin::BImemcmp;
4480 if (FnInfo->isStr("bcmp"))
4481 return Builtin::BIbcmp;
4482 if (FnInfo->isStr("strncpy"))
4483 return Builtin::BIstrncpy;
4484 if (FnInfo->isStr("strncmp"))
4485 return Builtin::BIstrncmp;
4486 if (FnInfo->isStr("strncasecmp"))
4487 return Builtin::BIstrncasecmp;
4488 if (FnInfo->isStr("strncat"))
4489 return Builtin::BIstrncat;
4490 if (FnInfo->isStr("strndup"))
4491 return Builtin::BIstrndup;
4492 if (FnInfo->isStr("strlen"))
4493 return Builtin::BIstrlen;
4494 if (FnInfo->isStr("bzero"))
4495 return Builtin::BIbzero;
4496 if (FnInfo->isStr("bcopy"))
4497 return Builtin::BIbcopy;
4498 } else if (isInStdNamespace()) {
4499 if (FnInfo->isStr("free"))
4500 return Builtin::BIfree;
4501 }
4502 break;
4503 }
4504 return 0;
4505}
4506
4508 assert(hasODRHash());
4509 return ODRHash;
4510}
4511
4513 if (hasODRHash())
4514 return ODRHash;
4515
4516 if (auto *FT = getInstantiatedFromMemberFunction()) {
4517 setHasODRHash(true);
4518 ODRHash = FT->getODRHash();
4519 return ODRHash;
4520 }
4521
4522 class ODRHash Hash;
4523 Hash.AddFunctionDecl(this);
4524 setHasODRHash(true);
4525 ODRHash = Hash.CalculateHash();
4526 return ODRHash;
4527}
4528
4529//===----------------------------------------------------------------------===//
4530// FieldDecl Implementation
4531//===----------------------------------------------------------------------===//
4532
4534 SourceLocation StartLoc, SourceLocation IdLoc,
4535 const IdentifierInfo *Id, QualType T,
4536 TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
4537 InClassInitStyle InitStyle) {
4538 return new (C, DC) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo,
4539 BW, Mutable, InitStyle);
4540}
4541
4543 return new (C, ID) FieldDecl(Field, nullptr, SourceLocation(),
4544 SourceLocation(), nullptr, QualType(), nullptr,
4545 nullptr, false, ICIS_NoInit);
4546}
4547
4549 if (!isImplicit() || getDeclName())
4550 return false;
4551
4552 if (const auto *Record = getType()->getAs<RecordType>())
4553 return Record->getDecl()->isAnonymousStructOrUnion();
4554
4555 return false;
4556}
4557
4559 if (!hasInClassInitializer())
4560 return nullptr;
4561
4562 LazyDeclStmtPtr InitPtr = BitField ? InitAndBitWidth->Init : Init;
4563 return cast_if_present<Expr>(
4564 InitPtr.isOffset() ? InitPtr.get(getASTContext().getExternalSource())
4565 : InitPtr.get(nullptr));
4566}
4567
4569 setLazyInClassInitializer(LazyDeclStmtPtr(NewInit));
4570}
4571
4572void FieldDecl::setLazyInClassInitializer(LazyDeclStmtPtr NewInit) {
4574 if (BitField)
4575 InitAndBitWidth->Init = NewInit;
4576 else
4577 Init = NewInit;
4578}
4579
4580unsigned FieldDecl::getBitWidthValue(const ASTContext &Ctx) const {
4581 assert(isBitField() && "not a bitfield");
4582 return getBitWidth()->EvaluateKnownConstInt(Ctx).getZExtValue();
4583}
4584
4587 getBitWidthValue(Ctx) == 0;
4588}
4589
4590bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
4591 if (isZeroLengthBitField(Ctx))
4592 return true;
4593
4594 // C++2a [intro.object]p7:
4595 // An object has nonzero size if it
4596 // -- is not a potentially-overlapping subobject, or
4597 if (!hasAttr<NoUniqueAddressAttr>())
4598 return false;
4599
4600 // -- is not of class type, or
4601 const auto *RT = getType()->getAs<RecordType>();
4602 if (!RT)
4603 return false;
4604 const RecordDecl *RD = RT->getDecl()->getDefinition();
4605 if (!RD) {
4606 assert(isInvalidDecl() && "valid field has incomplete type");
4607 return false;
4608 }
4609
4610 // -- [has] virtual member functions or virtual base classes, or
4611 // -- has subobjects of nonzero size or bit-fields of nonzero length
4612 const auto *CXXRD = cast<CXXRecordDecl>(RD);
4613 if (!CXXRD->isEmpty())
4614 return false;
4615
4616 // Otherwise, [...] the circumstances under which the object has zero size
4617 // are implementation-defined.
4618 if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
4619 return true;
4620
4621 // MS ABI: has nonzero size if it is a class type with class type fields,
4622 // whether or not they have nonzero size
4623 return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
4624 return Field->getType()->getAs<RecordType>();
4625 });
4626}
4627
4629 return hasAttr<NoUniqueAddressAttr>() && getType()->getAsCXXRecordDecl();
4630}
4631
4633 const FieldDecl *Canonical = getCanonicalDecl();
4634 if (Canonical != this)
4635 return Canonical->getFieldIndex();
4636
4637 if (CachedFieldIndex) return CachedFieldIndex - 1;
4638
4639 unsigned Index = 0;
4640 const RecordDecl *RD = getParent()->getDefinition();
4641 assert(RD && "requested index for field of struct with no definition");
4642
4643 for (auto *Field : RD->fields()) {
4644 Field->getCanonicalDecl()->CachedFieldIndex = Index + 1;
4645 assert(Field->getCanonicalDecl()->CachedFieldIndex == Index + 1 &&
4646 "overflow in field numbering");
4647 ++Index;
4648 }
4649
4650 assert(CachedFieldIndex && "failed to find field in parent");
4651 return CachedFieldIndex - 1;
4652}
4653
4655 const Expr *FinalExpr = getInClassInitializer();
4656 if (!FinalExpr)
4657 FinalExpr = getBitWidth();
4658 if (FinalExpr)
4659 return SourceRange(getInnerLocStart(), FinalExpr->getEndLoc());
4661}
4662
4664 assert((getParent()->isLambda() || getParent()->isCapturedRecord()) &&
4665 "capturing type in non-lambda or captured record.");
4666 assert(StorageKind == ISK_NoInit && !BitField &&
4667 "bit-field or field with default member initializer cannot capture "
4668 "VLA type");
4669 StorageKind = ISK_CapturedVLAType;
4670 CapturedVLAType = VLAType;
4671}
4672
4673void FieldDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
4674 // Print unnamed members using name of their type.
4676 this->getType().print(OS, Policy);
4677 return;
4678 }
4679 // Otherwise, do the normal printing.
4680 DeclaratorDecl::printName(OS, Policy);
4681}
4682
4683//===----------------------------------------------------------------------===//
4684// TagDecl Implementation
4685//===----------------------------------------------------------------------===//
4686
4688 SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl,
4689 SourceLocation StartL)
4690 : TypeDecl(DK, DC, L, Id, StartL), DeclContext(DK), redeclarable_base(C),
4691 TypedefNameDeclOrQualifier((TypedefNameDecl *)nullptr) {
4692 assert((DK != Enum || TK == TagTypeKind::Enum) &&
4693 "EnumDecl not matched with TagTypeKind::Enum");
4694 setPreviousDecl(PrevDecl);
4695 setTagKind(TK);
4696 setCompleteDefinition(false);
4697 setBeingDefined(false);
4699 setFreeStanding(false);
4701 TagDeclBits.IsThisDeclarationADemotedDefinition = false;
4702}
4703
4705 return getTemplateOrInnerLocStart(this);
4706}
4707
4709 SourceLocation RBraceLoc = BraceRange.getEnd();
4710 SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
4711 return SourceRange(getOuterLocStart(), E);
4712}
4713
4715
4717 TypedefNameDeclOrQualifier = TDD;
4718 if (const Type *T = getTypeForDecl()) {
4719 (void)T;
4720 assert(T->isLinkageValid());
4721 }
4722 assert(isLinkageValid());
4723}
4724
4726 setBeingDefined(true);
4727
4728 if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
4729 struct CXXRecordDecl::DefinitionData *Data =
4730 new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
4731 for (auto *I : redecls())
4732 cast<CXXRecordDecl>(I)->DefinitionData = Data;
4733 }
4734}
4735
4737 assert((!isa<CXXRecordDecl>(this) ||
4738 cast<CXXRecordDecl>(this)->hasDefinition()) &&
4739 "definition completed but not started");
4740
4742 setBeingDefined(false);
4743
4745 L->CompletedTagDefinition(this);
4746}
4747
4750 return const_cast<TagDecl *>(this);
4751
4752 // If it's possible for us to have an out-of-date definition, check now.
4753 if (mayHaveOutOfDateDef()) {
4754 if (IdentifierInfo *II = getIdentifier()) {
4755 if (II->isOutOfDate()) {
4756 updateOutOfDate(*II);
4757 }
4758 }
4759 }
4760
4761 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(this))
4762 return CXXRD->getDefinition();
4763
4764 for (auto *R : redecls())
4765 if (R->isCompleteDefinition())
4766 return R;
4767
4768 return nullptr;
4769}
4770
4772 if (QualifierLoc) {
4773 // Make sure the extended qualifier info is allocated.
4774 if (!hasExtInfo())
4775 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
4776 // Set qualifier info.
4777 getExtInfo()->QualifierLoc = QualifierLoc;
4778 } else {
4779 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
4780 if (hasExtInfo()) {
4781 if (getExtInfo()->NumTemplParamLists == 0) {
4782 getASTContext().Deallocate(getExtInfo());
4783 TypedefNameDeclOrQualifier = (TypedefNameDecl *)nullptr;
4784 }
4785 else
4786 getExtInfo()->QualifierLoc = QualifierLoc;
4787 }
4788 }
4789}
4790
4791void TagDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
4793 // If the name is supposed to have an identifier but does not have one, then
4794 // the tag is anonymous and we should print it differently.
4795 if (Name.isIdentifier() && !Name.getAsIdentifierInfo()) {
4796 // If the caller wanted to print a qualified name, they've already printed
4797 // the scope. And if the caller doesn't want that, the scope information
4798 // is already printed as part of the type.
4799 PrintingPolicy Copy(Policy);
4800 Copy.SuppressScope = true;
4802 return;
4803 }
4804 // Otherwise, do the normal printing.
4805 Name.print(OS, Policy);
4806}
4807
4810 assert(!TPLists.empty());
4811 // Make sure the extended decl info is allocated.
4812 if (!hasExtInfo())
4813 // Allocate external info struct.
4814 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
4815 // Set the template parameter lists info.
4816 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
4817}
4818
4819//===----------------------------------------------------------------------===//
4820// EnumDecl Implementation
4821//===----------------------------------------------------------------------===//
4822
4823EnumDecl::EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
4824 SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl,
4825 bool Scoped, bool ScopedUsingClassTag, bool Fixed)
4826 : TagDecl(Enum, TagTypeKind::Enum, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
4827 assert(Scoped || !ScopedUsingClassTag);
4828 IntegerType = nullptr;
4829 setNumPositiveBits(0);
4830 setNumNegativeBits(0);
4831 setScoped(Scoped);
4832 setScopedUsingClassTag(ScopedUsingClassTag);
4833 setFixed(Fixed);
4834 setHasODRHash(false);
4835 ODRHash = 0;
4836}
4837
4838void EnumDecl::anchor() {}
4839
4841 SourceLocation StartLoc, SourceLocation IdLoc,
4843 EnumDecl *PrevDecl, bool IsScoped,
4844 bool IsScopedUsingClassTag, bool IsFixed) {
4845 auto *Enum = new (C, DC) EnumDecl(C, DC, StartLoc, IdLoc, Id, PrevDecl,
4846 IsScoped, IsScopedUsingClassTag, IsFixed);
4847 Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
4848 C.getTypeDeclType(Enum, PrevDecl);
4849 return Enum;
4850}
4851
4853 EnumDecl *Enum =
4854 new (C, ID) EnumDecl(C, nullptr, SourceLocation(), SourceLocation(),
4855 nullptr, nullptr, false, false, false);
4856 Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
4857 return Enum;
4858}
4859
4861 if (const TypeSourceInfo *TI = getIntegerTypeSourceInfo())
4862 return TI->getTypeLoc().getSourceRange();
4863 return SourceRange();
4864}
4865
4867 QualType NewPromotionType,
4868 unsigned NumPositiveBits,
4869 unsigned NumNegativeBits) {
4870 assert(!isCompleteDefinition() && "Cannot redefine enums!");
4871 if (!IntegerType)
4872 IntegerType = NewType.getTypePtr();
4873 PromotionType = NewPromotionType;
4874 setNumPositiveBits(NumPositiveBits);
4875 setNumNegativeBits(NumNegativeBits);
4877}
4878
4880 if (const auto *A = getAttr<EnumExtensibilityAttr>())
4881 return A->getExtensibility() == EnumExtensibilityAttr::Closed;
4882 return true;
4883}
4884
4886 return isClosed() && hasAttr<FlagEnumAttr>();
4887}
4888
4890 return isClosed() && !hasAttr<FlagEnumAttr>();
4891}
4892
4895 return MSI->getTemplateSpecializationKind();
4896
4897 return TSK_Undeclared;
4898}
4899
4901 SourceLocation PointOfInstantiation) {
4903 assert(MSI && "Not an instantiated member enumeration?");
4905 if (TSK != TSK_ExplicitSpecialization &&
4906 PointOfInstantiation.isValid() &&
4908 MSI->setPointOfInstantiation(PointOfInstantiation);
4909}
4910
4913 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
4915 while (auto *NewED = ED->getInstantiatedFromMemberEnum())
4916 ED = NewED;
4917 return getDefinitionOrSelf(ED);
4918 }
4919 }
4920
4922 "couldn't find pattern for enum instantiation");
4923 return nullptr;
4924}
4925
4927 if (SpecializationInfo)
4928 return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom());
4929
4930 return nullptr;
4931}
4932
4933void EnumDecl::setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED,
4935 assert(!SpecializationInfo && "Member enum is already a specialization");
4936 SpecializationInfo = new (C) MemberSpecializationInfo(ED, TSK);
4937}
4938
4940 if (hasODRHash())
4941 return ODRHash;
4942
4943 class ODRHash Hash;
4944 Hash.AddEnumDecl(this);
4945 setHasODRHash(true);
4946 ODRHash = Hash.CalculateHash();
4947 return ODRHash;
4948}
4949
4951 auto Res = TagDecl::getSourceRange();
4952 // Set end-point to enum-base, e.g. enum foo : ^bar
4953 if (auto *TSI = getIntegerTypeSourceInfo()) {
4954 // TagDecl doesn't know about the enum base.
4955 if (!getBraceRange().getEnd().isValid())
4956 Res.setEnd(TSI->getTypeLoc().getEndLoc());
4957 }
4958 return Res;
4959}
4960
4961void EnumDecl::getValueRange(llvm::APInt &Max, llvm::APInt &Min) const {
4962 unsigned Bitwidth = getASTContext().getIntWidth(getIntegerType());
4963 unsigned NumNegativeBits = getNumNegativeBits();
4964 unsigned NumPositiveBits = getNumPositiveBits();
4965
4966 if (NumNegativeBits) {
4967 unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
4968 Max = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
4969 Min = -Max;
4970 } else {
4971 Max = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
4972 Min = llvm::APInt::getZero(Bitwidth);
4973 }
4974}
4975
4976//===----------------------------------------------------------------------===//
4977// RecordDecl Implementation
4978//===----------------------------------------------------------------------===//
4979
4981 DeclContext *DC, SourceLocation StartLoc,
4983 RecordDecl *PrevDecl)
4984 : TagDecl(DK, TK, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
4985 assert(classof(static_cast<Decl *>(this)) && "Invalid Kind!");
4988 setHasObjectMember(false);
4989 setHasVolatileMember(false);
4999 setIsRandomized(false);
5000 setODRHash(0);
5001}
5002
5004 SourceLocation StartLoc, SourceLocation IdLoc,
5005 IdentifierInfo *Id, RecordDecl* PrevDecl) {
5006 RecordDecl *R = new (C, DC) RecordDecl(Record, TK, C, DC,
5007 StartLoc, IdLoc, Id, PrevDecl);
5008 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
5009
5010 C.getTypeDeclType(R, PrevDecl);
5011 return R;
5012}
5013
5015 GlobalDeclID ID) {
5016 RecordDecl *R = new (C, ID)
5018 SourceLocation(), nullptr, nullptr);
5019 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
5020 return R;
5021}
5022
5024 return isImplicit() && getDeclName() && getDeclContext()->isRecord() &&
5025 cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName();
5026}
5027
5029 if (auto RD = dyn_cast<CXXRecordDecl>(this))
5030 return RD->isLambda();
5031 return false;
5032}
5033
5035 return hasAttr<CapturedRecordAttr>();
5036}
5037
5039 addAttr(CapturedRecordAttr::CreateImplicit(getASTContext()));
5040}
5041
5043 if (isUnion())
5044 return true;
5045
5046 if (const RecordDecl *Def = getDefinition()) {
5047 for (const FieldDecl *FD : Def->fields()) {
5048 const RecordType *RT = FD->getType()->getAs<RecordType>();
5049 if (RT && RT->getDecl()->isOrContainsUnion())
5050 return true;
5051 }
5052 }
5053
5054 return false;
5055}
5056
5059 LoadFieldsFromExternalStorage();
5060 // This is necessary for correctness for C++ with modules.
5061 // FIXME: Come up with a test case that breaks without definition.
5062 if (RecordDecl *D = getDefinition(); D && D != this)
5063 return D->field_begin();
5065}
5066
5067/// completeDefinition - Notes that the definition of this type is now
5068/// complete.
5070 assert(!isCompleteDefinition() && "Cannot redefine record!");
5072
5073 ASTContext &Ctx = getASTContext();
5074
5075 // Layouts are dumped when computed, so if we are dumping for all complete
5076 // types, we need to force usage to get types that wouldn't be used elsewhere.
5077 //
5078 // If the type is dependent, then we can't compute its layout because there
5079 // is no way for us to know the size or alignment of a dependent type. Also
5080 // ignore declarations marked as invalid since 'getASTRecordLayout()' asserts
5081 // on that.
5082 if (Ctx.getLangOpts().DumpRecordLayoutsComplete && !isDependentType() &&
5083 !isInvalidDecl())
5084 (void)Ctx.getASTRecordLayout(this);
5085}
5086
5087/// isMsStruct - Get whether or not this record uses ms_struct layout.
5088/// This which can be turned on with an attribute, pragma, or the
5089/// -mms-bitfields command-line option.
5091 return hasAttr<MSStructAttr>() || C.getLangOpts().MSBitfields == 1;
5092}
5093
5095 std::tie(FirstDecl, LastDecl) = DeclContext::BuildDeclChain(Decls, false);
5096 LastDecl->NextInContextAndBits.setPointer(nullptr);
5097 setIsRandomized(true);
5098}
5099
5100void RecordDecl::LoadFieldsFromExternalStorage() const {
5102 assert(hasExternalLexicalStorage() && Source && "No external storage?");
5103
5104 // Notify that we have a RecordDecl doing some initialization.
5105 ExternalASTSource::Deserializing TheFields(Source);
5106
5109 Source->FindExternalLexicalDecls(this, [](Decl::Kind K) {
5111 }, Decls);
5112
5113#ifndef NDEBUG
5114 // Check that all decls we got were FieldDecls.
5115 for (unsigned i=0, e=Decls.size(); i != e; ++i)
5116 assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i]));
5117#endif
5118
5119 if (Decls.empty())
5120 return;
5121
5122 auto [ExternalFirst, ExternalLast] =
5123 BuildDeclChain(Decls,
5124 /*FieldsAlreadyLoaded=*/false);
5125 ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
5126 FirstDecl = ExternalFirst;
5127 if (!LastDecl)
5128 LastDecl = ExternalLast;
5129}
5130
5131bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
5132 ASTContext &Context = getASTContext();
5133 const SanitizerMask EnabledAsanMask = Context.getLangOpts().Sanitize.Mask &
5134 (SanitizerKind::Address | SanitizerKind::KernelAddress);
5135 if (!EnabledAsanMask || !Context.getLangOpts().SanitizeAddressFieldPadding)
5136 return false;
5137 const auto &NoSanitizeList = Context.getNoSanitizeList();
5138 const auto *CXXRD = dyn_cast<CXXRecordDecl>(this);
5139 // We may be able to relax some of these requirements.
5140 int ReasonToReject = -1;
5141 if (!CXXRD || CXXRD->isExternCContext())
5142 ReasonToReject = 0; // is not C++.
5143 else if (CXXRD->hasAttr<PackedAttr>())
5144 ReasonToReject = 1; // is packed.
5145 else if (CXXRD->isUnion())
5146 ReasonToReject = 2; // is a union.
5147 else if (CXXRD->isTriviallyCopyable())
5148 ReasonToReject = 3; // is trivially copyable.
5149 else if (CXXRD->hasTrivialDestructor())
5150 ReasonToReject = 4; // has trivial destructor.
5151 else if (CXXRD->isStandardLayout())
5152 ReasonToReject = 5; // is standard layout.
5153 else if (NoSanitizeList.containsLocation(EnabledAsanMask, getLocation(),
5154 "field-padding"))
5155 ReasonToReject = 6; // is in an excluded file.
5157 EnabledAsanMask, getQualifiedNameAsString(), "field-padding"))
5158 ReasonToReject = 7; // The type is excluded.
5159
5160 if (EmitRemark) {
5161 if (ReasonToReject >= 0)
5162 Context.getDiagnostics().Report(
5163 getLocation(),
5164 diag::remark_sanitize_address_insert_extra_padding_rejected)
5165 << getQualifiedNameAsString() << ReasonToReject;
5166 else
5167 Context.getDiagnostics().Report(
5168 getLocation(),
5169 diag::remark_sanitize_address_insert_extra_padding_accepted)
5171 }
5172 return ReasonToReject < 0;
5173}
5174
5176 for (const auto *I : fields()) {
5177 if (I->getIdentifier())
5178 return I;
5179
5180 if (const auto *RT = I->getType()->getAs<RecordType>())
5181 if (const FieldDecl *NamedDataMember =
5182 RT->getDecl()->findFirstNamedDataMember())
5183 return NamedDataMember;
5184 }
5185
5186 // We didn't find a named data member.
5187 return nullptr;
5188}
5189
5191 if (hasODRHash())
5192 return RecordDeclBits.ODRHash;
5193
5194 // Only calculate hash on first call of getODRHash per record.
5195 ODRHash Hash;
5196 Hash.AddRecordDecl(this);
5197 // For RecordDecl the ODRHash is stored in the remaining 26
5198 // bit of RecordDeclBits, adjust the hash to accomodate.
5199 setODRHash(Hash.CalculateHash() >> 6);
5200 return RecordDeclBits.ODRHash;
5201}
5202
5203//===----------------------------------------------------------------------===//
5204// BlockDecl Implementation
5205//===----------------------------------------------------------------------===//
5206
5208 : Decl(Block, DC, CaretLoc), DeclContext(Block) {
5209 setIsVariadic(false);
5210 setCapturesCXXThis(false);
5213 setDoesNotEscape(false);
5214 setCanAvoidCopyToHeap(false);
5215}
5216
5218 assert(!ParamInfo && "Already has param info!");
5219
5220 // Zero params -> null pointer.
5221 if (!NewParamInfo.empty()) {
5222 NumParams = NewParamInfo.size();
5223 ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
5224 std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo);
5225 }
5226}
5227
5229 bool CapturesCXXThis) {
5230 this->setCapturesCXXThis(CapturesCXXThis);
5231 this->NumCaptures = Captures.size();
5232
5233 if (Captures.empty()) {
5234 this->Captures = nullptr;
5235 return;
5236 }
5237
5238 this->Captures = Captures.copy(Context).data();
5239}
5240
5241bool BlockDecl::capturesVariable(const VarDecl *variable) const {
5242 for (const auto &I : captures())
5243 // Only auto vars can be captured, so no redeclaration worries.
5244 if (I.getVariable() == variable)
5245 return true;
5246
5247 return false;
5248}
5249
5251 return SourceRange(getLocation(), Body ? Body->getEndLoc() : getLocation());
5252}
5253
5254//===----------------------------------------------------------------------===//
5255// Other Decl Allocation/Deallocation Method Implementations
5256//===----------------------------------------------------------------------===//
5257
5258void TranslationUnitDecl::anchor() {}
5259
5261 return new (C, (DeclContext *)nullptr) TranslationUnitDecl(C);
5262}
5263
5265 AnonymousNamespace = D;
5266
5267 if (ASTMutationListener *Listener = Ctx.getASTMutationListener())
5268 Listener->AddedAnonymousNamespace(this, D);
5269}
5270
5271void PragmaCommentDecl::anchor() {}
5272
5275 SourceLocation CommentLoc,
5276 PragmaMSCommentKind CommentKind,
5277 StringRef Arg) {
5278 PragmaCommentDecl *PCD =
5279 new (C, DC, additionalSizeToAlloc<char>(Arg.size() + 1))
5280 PragmaCommentDecl(DC, CommentLoc, CommentKind);
5281 memcpy(PCD->getTrailingObjects<char>(), Arg.data(), Arg.size());
5282 PCD->getTrailingObjects<char>()[Arg.size()] = '\0';
5283 return PCD;
5284}
5285
5288 unsigned ArgSize) {
5289 return new (C, ID, additionalSizeToAlloc<char>(ArgSize + 1))
5291}
5292
5293void PragmaDetectMismatchDecl::anchor() {}
5294
5297 SourceLocation Loc, StringRef Name,
5298 StringRef Value) {
5299 size_t ValueStart = Name.size() + 1;
5301 new (C, DC, additionalSizeToAlloc<char>(ValueStart + Value.size() + 1))
5302 PragmaDetectMismatchDecl(DC, Loc, ValueStart);
5303 memcpy(PDMD->getTrailingObjects<char>(), Name.data(), Name.size());
5304 PDMD->getTrailingObjects<char>()[Name.size()] = '\0';
5305 memcpy(PDMD->getTrailingObjects<char>() + ValueStart, Value.data(),
5306 Value.size());
5307 PDMD->getTrailingObjects<char>()[ValueStart + Value.size()] = '\0';
5308 return PDMD;
5309}
5310
5313 unsigned NameValueSize) {
5314 return new (C, ID, additionalSizeToAlloc<char>(NameValueSize + 1))
5316}
5317
5318void ExternCContextDecl::anchor() {}
5319
5321 TranslationUnitDecl *DC) {
5322 return new (C, DC) ExternCContextDecl(DC);
5323}
5324
5325void LabelDecl::anchor() {}
5326
5328 SourceLocation IdentL, IdentifierInfo *II) {
5329 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, IdentL);
5330}
5331
5333 SourceLocation IdentL, IdentifierInfo *II,
5334 SourceLocation GnuLabelL) {
5335 assert(GnuLabelL != IdentL && "Use this only for GNU local labels");
5336 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, GnuLabelL);
5337}
5338
5340 return new (C, ID) LabelDecl(nullptr, SourceLocation(), nullptr, nullptr,
5341 SourceLocation());
5342}
5343
5344void LabelDecl::setMSAsmLabel(StringRef Name) {
5345char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];
5346 memcpy(Buffer, Name.data(), Name.size());
5347 Buffer[Name.size()] = '\0';
5348 MSAsmName = Buffer;
5349}
5350
5351void ValueDecl::anchor() {}
5352
5353bool ValueDecl::isWeak() const {
5354 auto *MostRecent = getMostRecentDecl();
5355 return MostRecent->hasAttr<WeakAttr>() ||
5356 MostRecent->hasAttr<WeakRefAttr>() || isWeakImported();
5357}
5358
5360 if (auto *Var = llvm::dyn_cast<VarDecl>(this))
5361 return Var->isInitCapture();
5362 return false;
5363}
5364
5365void ImplicitParamDecl::anchor() {}
5366
5368 SourceLocation IdLoc,
5370 ImplicitParamKind ParamKind) {
5371 return new (C, DC) ImplicitParamDecl(C, DC, IdLoc, Id, Type, ParamKind);
5372}
5373
5375 ImplicitParamKind ParamKind) {
5376 return new (C, nullptr) ImplicitParamDecl(C, Type, ParamKind);
5377}
5378
5380 GlobalDeclID ID) {
5382}
5383
5386 const DeclarationNameInfo &NameInfo, QualType T,
5387 TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin,
5388 bool isInlineSpecified, bool hasWrittenPrototype,
5389 ConstexprSpecKind ConstexprKind,
5390 Expr *TrailingRequiresClause) {
5391 FunctionDecl *New = new (C, DC) FunctionDecl(
5392 Function, C, DC, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
5393 isInlineSpecified, ConstexprKind, TrailingRequiresClause);
5395 return New;
5396}
5397
5399 return new (C, ID) FunctionDecl(
5401 nullptr, SC_None, false, false, ConstexprSpecKind::Unspecified, nullptr);
5402}
5403
5405 return new (C, DC) BlockDecl(DC, L);
5406}
5407
5409 return new (C, ID) BlockDecl(nullptr, SourceLocation());
5410}
5411
5412CapturedDecl::CapturedDecl(DeclContext *DC, unsigned NumParams)
5413 : Decl(Captured, DC, SourceLocation()), DeclContext(Captured),
5414 NumParams(NumParams), ContextParam(0), BodyAndNothrow(nullptr, false) {}
5415
5417 unsigned NumParams) {
5418 return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5419 CapturedDecl(DC, NumParams);
5420}
5421
5423 unsigned NumParams) {
5424 return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5425 CapturedDecl(nullptr, NumParams);
5426}
5427
5428Stmt *CapturedDecl::getBody() const { return BodyAndNothrow.getPointer(); }
5429void CapturedDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); }
5430
5431bool CapturedDecl::isNothrow() const { return BodyAndNothrow.getInt(); }
5432void CapturedDecl::setNothrow(bool Nothrow) { BodyAndNothrow.setInt(Nothrow); }
5433
5436 QualType T, Expr *E, const llvm::APSInt &V)
5437 : ValueDecl(EnumConstant, DC, L, Id, T), Init((Stmt *)E) {
5438 setInitVal(C, V);
5439}
5440
5444 Expr *E, const llvm::APSInt &V) {
5445 return new (C, CD) EnumConstantDecl(C, CD, L, Id, T, E, V);
5446}
5447
5449 GlobalDeclID ID) {
5450 return new (C, ID) EnumConstantDecl(C, nullptr, SourceLocation(), nullptr,
5451 QualType(), nullptr, llvm::APSInt());
5452}
5453
5454void IndirectFieldDecl::anchor() {}
5455
5456IndirectFieldDecl::IndirectFieldDecl(ASTContext &C, DeclContext *DC,
5458 QualType T,
5460 : ValueDecl(IndirectField, DC, L, N, T), Chaining(CH.data()),
5461 ChainingSize(CH.size()) {
5462 // In C++, indirect field declarations conflict with tag declarations in the
5463 // same scope, so add them to IDNS_Tag so that tag redeclaration finds them.
5464 if (C.getLangOpts().CPlusPlus)
5466}
5467
5470 const IdentifierInfo *Id, QualType T,
5472 return new (C, DC) IndirectFieldDecl(C, DC, L, Id, T, CH);
5473}
5474
5476 GlobalDeclID ID) {
5477 return new (C, ID)
5479 QualType(), std::nullopt);
5480}
5481
5484 if (Init)
5485 End = Init->getEndLoc();
5486 return SourceRange(getLocation(), End);
5487}
5488
5489void TypeDecl::anchor() {}
5490
5492 SourceLocation StartLoc, SourceLocation IdLoc,
5493 const IdentifierInfo *Id,
5494 TypeSourceInfo *TInfo) {
5495 return new (C, DC) TypedefDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5496}
5497
5498void TypedefNameDecl::anchor() {}
5499
5501 if (auto *TT = getTypeSourceInfo()->getType()->getAs<TagType>()) {
5502 auto *OwningTypedef = TT->getDecl()->getTypedefNameForAnonDecl();
5503 auto *ThisTypedef = this;
5504 if (AnyRedecl && OwningTypedef) {
5505 OwningTypedef = OwningTypedef->getCanonicalDecl();
5506 ThisTypedef = ThisTypedef->getCanonicalDecl();
5507 }
5508 if (OwningTypedef == ThisTypedef)
5509 return TT->getDecl();
5510 }
5511
5512 return nullptr;
5513}
5514
5515bool TypedefNameDecl::isTransparentTagSlow() const {
5516 auto determineIsTransparent = [&]() {
5517 if (auto *TT = getUnderlyingType()->getAs<TagType>()) {
5518 if (auto *TD = TT->getDecl()) {
5519 if (TD->getName() != getName())
5520 return false;
5521 SourceLocation TTLoc = getLocation();
5522 SourceLocation TDLoc = TD->getLocation();
5523 if (!TTLoc.isMacroID() || !TDLoc.isMacroID())
5524 return false;
5526 return SM.getSpellingLoc(TTLoc) == SM.getSpellingLoc(TDLoc);
5527 }
5528 }
5529 return false;
5530 };
5531
5532 bool isTransparent = determineIsTransparent();
5533 MaybeModedTInfo.setInt((isTransparent << 1) | 1);
5534 return isTransparent;
5535}
5536
5538 return new (C, ID) TypedefDecl(C, nullptr, SourceLocation(), SourceLocation(),
5539 nullptr, nullptr);
5540}
5541
5543 SourceLocation StartLoc,
5544 SourceLocation IdLoc,
5545 const IdentifierInfo *Id,
5546 TypeSourceInfo *TInfo) {
5547 return new (C, DC) TypeAliasDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5548}
5549
5551 GlobalDeclID ID) {
5552 return new (C, ID) TypeAliasDecl(C, nullptr, SourceLocation(),
5553 SourceLocation(), nullptr, nullptr);
5554}
5555
5557 SourceLocation RangeEnd = getLocation();
5558 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
5559 if (typeIsPostfix(TInfo->getType()))
5560 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5561 }
5562 return SourceRange(getBeginLoc(), RangeEnd);
5563}
5564
5566 SourceLocation RangeEnd = getBeginLoc();
5567 if (TypeSourceInfo *TInfo = getTypeSourceInfo())
5568 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5569 return SourceRange(getBeginLoc(), RangeEnd);
5570}
5571
5572void FileScopeAsmDecl::anchor() {}
5573
5575 StringLiteral *Str,
5576 SourceLocation AsmLoc,
5577 SourceLocation RParenLoc) {
5578 return new (C, DC) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc);
5579}
5580
5582 GlobalDeclID ID) {
5583 return new (C, ID) FileScopeAsmDecl(nullptr, nullptr, SourceLocation(),
5584 SourceLocation());
5585}
5586
5587void TopLevelStmtDecl::anchor() {}
5588
5590 assert(C.getLangOpts().IncrementalExtensions &&
5591 "Must be used only in incremental mode");
5592
5593 SourceLocation Loc = Statement ? Statement->getBeginLoc() : SourceLocation();
5594 DeclContext *DC = C.getTranslationUnitDecl();
5595
5596 return new (C, DC) TopLevelStmtDecl(DC, Loc, Statement);
5597}
5598
5600 GlobalDeclID ID) {
5601 return new (C, ID)
5602 TopLevelStmtDecl(/*DC=*/nullptr, SourceLocation(), /*S=*/nullptr);
5603}
5604
5606 return SourceRange(getLocation(), Statement->getEndLoc());
5607}
5608
5610 assert(S);
5611 Statement = S;
5612 setLocation(Statement->getBeginLoc());
5613}
5614
5615void EmptyDecl::anchor() {}
5616
5618 return new (C, DC) EmptyDecl(DC, L);
5619}
5620
5622 return new (C, ID) EmptyDecl(nullptr, SourceLocation());
5623}
5624
5625HLSLBufferDecl::HLSLBufferDecl(DeclContext *DC, bool CBuffer,
5627 SourceLocation IDLoc, SourceLocation LBrace)
5628 : NamedDecl(Decl::Kind::HLSLBuffer, DC, IDLoc, DeclarationName(ID)),
5629 DeclContext(Decl::Kind::HLSLBuffer), LBraceLoc(LBrace), KwLoc(KwLoc),
5630 IsCBuffer(CBuffer) {}
5631
5633 DeclContext *LexicalParent, bool CBuffer,
5635 SourceLocation IDLoc,
5636 SourceLocation LBrace) {
5637 // For hlsl like this
5638 // cbuffer A {
5639 // cbuffer B {
5640 // }
5641 // }
5642 // compiler should treat it as
5643 // cbuffer A {
5644 // }
5645 // cbuffer B {
5646 // }
5647 // FIXME: support nested buffers if required for back-compat.
5648 DeclContext *DC = LexicalParent;
5650 new (C, DC) HLSLBufferDecl(DC, CBuffer, KwLoc, ID, IDLoc, LBrace);
5651 return Result;
5652}
5653
5655 GlobalDeclID ID) {
5656 return new (C, ID) HLSLBufferDecl(nullptr, false, SourceLocation(), nullptr,
5658}
5659
5660//===----------------------------------------------------------------------===//
5661// ImportDecl Implementation
5662//===----------------------------------------------------------------------===//
5663
5664/// Retrieve the number of module identifiers needed to name the given
5665/// module.
5666static unsigned getNumModuleIdentifiers(Module *Mod) {
5667 unsigned Result = 1;
5668 while (Mod->Parent) {
5669 Mod = Mod->Parent;
5670 ++Result;
5671 }
5672 return Result;
5673}
5674
5675ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
5676 Module *Imported,
5677 ArrayRef<SourceLocation> IdentifierLocs)
5678 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
5679 NextLocalImportAndComplete(nullptr, true) {
5680 assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size());
5681 auto *StoredLocs = getTrailingObjects<SourceLocation>();
5682 std::uninitialized_copy(IdentifierLocs.begin(), IdentifierLocs.end(),
5683 StoredLocs);
5684}
5685
5686ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
5687 Module *Imported, SourceLocation EndLoc)
5688 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
5689 NextLocalImportAndComplete(nullptr, false) {
5690 *getTrailingObjects<SourceLocation>() = EndLoc;
5691}
5692
5694 SourceLocation StartLoc, Module *Imported,
5695 ArrayRef<SourceLocation> IdentifierLocs) {
5696 return new (C, DC,
5697 additionalSizeToAlloc<SourceLocation>(IdentifierLocs.size()))
5698 ImportDecl(DC, StartLoc, Imported, IdentifierLocs);
5699}
5700
5702 SourceLocation StartLoc,
5703 Module *Imported,
5704 SourceLocation EndLoc) {
5705 ImportDecl *Import = new (C, DC, additionalSizeToAlloc<SourceLocation>(1))
5706 ImportDecl(DC, StartLoc, Imported, EndLoc);
5707 Import->setImplicit();
5708 return Import;
5709}
5710
5712 unsigned NumLocations) {
5713 return new (C, ID, additionalSizeToAlloc<SourceLocation>(NumLocations))
5715}
5716
5718 if (!isImportComplete())
5719 return std::nullopt;
5720
5721 const auto *StoredLocs = getTrailingObjects<SourceLocation>();
5722 return llvm::ArrayRef(StoredLocs,
5724}
5725
5727 if (!isImportComplete())
5728 return SourceRange(getLocation(), *getTrailingObjects<SourceLocation>());
5729
5730 return SourceRange(getLocation(), getIdentifierLocs().back());
5731}
5732
5733//===----------------------------------------------------------------------===//
5734// ExportDecl Implementation
5735//===----------------------------------------------------------------------===//
5736
5737void ExportDecl::anchor() {}
5738
5740 SourceLocation ExportLoc) {
5741 return new (C, DC) ExportDecl(DC, ExportLoc);
5742}
5743
5745 return new (C, ID) ExportDecl(nullptr, SourceLocation());
5746}
5747
5749 bool IncludeLocallyStreaming) {
5750 if (IncludeLocallyStreaming)
5751 if (FD->hasAttr<ArmLocallyStreamingAttr>())
5752 return true;
5753
5754 if (const Type *Ty = FD->getType().getTypePtrOrNull())
5755 if (const auto *FPT = Ty->getAs<FunctionProtoType>())
5756 if (FPT->getAArch64SMEAttributes() &
5758 return true;
5759
5760 return false;
5761}
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3338
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
Expr * E
enum clang::sema::@1651::IndirectLocalPathEntry::EntryKind Kind
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:3773
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:3761
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 bool isDeclaredInModuleInterfaceOrPartition(const NamedDecl *D)
Definition: Decl.cpp:586
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:5666
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:592
static StorageClass getStorageClass(const Decl *D)
Definition: Decl.cpp:596
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:1143
SourceLocation Loc
Definition: SemaObjC.cpp:758
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:186
SourceManager & getSourceManager()
Definition: ASTContext.h:720
const ConstantArrayType * getAsConstantArrayType(QualType T) const
Definition: ASTContext.h:2822
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:1239
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:2641
CanQualType VoidPtrTy
Definition: ASTContext.h:1145
void Deallocate(void *Ptr) const
Definition: ASTContext.h:739
Builtin::Context & BuiltinInfo
Definition: ASTContext.h:661
const LangOptions & getLangOpts() const
Definition: ASTContext.h:796
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:1056
const NoSanitizeList & getNoSanitizeList() const
Definition: ASTContext.h:806
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:712
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:733
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:778
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:3168
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition: ASTContext.h:1224
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:4467
BlockDecl(DeclContext *DC, SourceLocation CaretLoc)
Definition: Decl.cpp:5207
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition: Decl.cpp:5217
void setDoesNotEscape(bool B=true)
Definition: Decl.h:4619
void setCapturesCXXThis(bool B=true)
Definition: Decl.h:4600
void setCanAvoidCopyToHeap(bool B=true)
Definition: Decl.h:4624
void setIsConversionFromLambda(bool val=true)
Definition: Decl.h:4614
void setBlockMissingReturnType(bool val=true)
Definition: Decl.h:4606
ArrayRef< Capture > captures() const
Definition: Decl.h:4594
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5250
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5408
void setIsVariadic(bool value)
Definition: Decl.h:4543
bool capturesVariable(const VarDecl *var) const
Definition: Decl.cpp:5241
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition: Decl.cpp:5228
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition: Decl.cpp:5404
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:1879
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4666
void setBody(Stmt *B)
Definition: Decl.cpp:5429
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition: Decl.cpp:5422
bool isNothrow() const
Definition: Decl.cpp:5431
void setNothrow(bool Nothrow=true)
Definition: Decl.cpp:5432
static CapturedDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition: Decl.cpp:5416
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:5428
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:3648
A POD class for pairing a NamedDecl* with an access specifier.
decl_iterator - Iterates through the declarations stored within this context.
Definition: DeclBase.h:2296
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition: DeclBase.h:2359
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1425
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:2079
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition: DeclBase.h:2208
FunctionDeclBitfields FunctionDeclBits
Definition: DeclBase.h:2014
bool isFileContext() const
Definition: DeclBase.h:2150
static std::pair< Decl *, Decl * > BuildDeclChain(ArrayRef< Decl * > Decls, bool FieldsAlreadyLoaded)
Build up a chain of declarations.
Definition: DeclBase.cpp:1499
TagDeclBitfields TagDeclBits
Definition: DeclBase.h:2010
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1375
bool isNamespace() const
Definition: DeclBase.h:2168
bool isTranslationUnit() const
Definition: DeclBase.h:2155
bool isRecord() const
Definition: DeclBase.h:2159
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
Definition: DeclBase.cpp:1964
RecordDeclBitfields RecordDeclBits
Definition: DeclBase.h:2012
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
Definition: DeclBase.h:2049
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition: DeclBase.h:2654
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
Definition: DeclBase.h:2055
bool isInlineNamespace() const
Definition: DeclBase.cpp:1288
bool isFunctionOrMethod() const
Definition: DeclBase.h:2131
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Definition: DeclBase.cpp:1360
Decl::Kind getDeclKind() const
Definition: DeclBase.h:2072
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:1040
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:1205
T * getAttr() const
Definition: DeclBase.h:579
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:523
void addAttr(Attr *A)
Definition: DeclBase.cpp:1014
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition: DeclBase.h:599
bool isInNamedModule() const
Whether this declaration comes from a named module.
Definition: DeclBase.cpp:1148
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:855
ASTMutationListener * getASTMutationListener() const
Definition: DeclBase.cpp:533
bool hasCachedLinkage() const
Definition: DeclBase.h:427
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
@ FOK_None
Not a friend object.
Definition: DeclBase.h:1196
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition: DeclBase.h:963
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:825
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:776
Linkage getCachedLinkage() const
Definition: DeclBase.h:419
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition: DeclBase.h:2756
bool isInvalidDecl() const
Definition: DeclBase.h:594
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:445
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:1028
void setLocation(SourceLocation L)
Definition: DeclBase.h:446
DeclContext * getDeclContext()
Definition: DeclBase.h:454
bool isInAnonymousNamespace() const
Definition: DeclBase.cpp:415
void setCachedLinkage(Linkage L) const
Definition: DeclBase.h:423
friend class RecordDecl
Definition: DeclBase.h:333
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:897
bool hasAttr() const
Definition: DeclBase.h:583
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclBase.h:957
@ 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:448
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:4231
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1547
Represents an empty-declaration.
Definition: Decl.h:4905
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition: Decl.cpp:5617
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5621
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3270
EnumConstantDecl(const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition: Decl.cpp:5434
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5448
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition: Decl.h:3295
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition: Decl.cpp:5441
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5482
Represents an enum.
Definition: Decl.h:3840
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition: Decl.h:4099
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
Definition: Decl.h:4037
unsigned getODRHash()
Definition: Decl.cpp:4939
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:4900
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
Definition: Decl.cpp:4840
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
Definition: Decl.h:4016
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:4852
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
Definition: Decl.cpp:4885
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
Definition: Decl.cpp:4860
SourceRange getSourceRange() const override LLVM_READONLY
Overrides to provide correct range when there's an enum-base specifier with forward declarations.
Definition: Decl.cpp:4950
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition: Decl.h:4000
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
Definition: Decl.cpp:4926
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
Definition: Decl.h:4026
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Definition: Decl.cpp:4893
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
Definition: Decl.cpp:4879
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
Definition: Decl.cpp:4911
bool isClosedNonFlag() const
Returns true if this enum is annotated with neither flag_enum nor enum_extensibility(open).
Definition: Decl.cpp:4889
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:4961
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Definition: Type.h:5962
Represents a standard C++ module export declaration.
Definition: Decl.h:4858
static ExportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExportLoc)
Definition: Decl.cpp:5739
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5744
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:5320
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:4558
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:4632
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:4548
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4654
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:4585
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:4542
unsigned getBitWidthValue(const ASTContext &Ctx) const
Computes the bit width of this field, if this is a bit field.
Definition: Decl.cpp:4580
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Definition: Decl.cpp:4568
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition: Decl.h:3243
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:4590
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:4533
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
Definition: Decl.h:3254
static bool classofKind(Kind K)
Definition: Decl.h:3259
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:4673
bool isPotentiallyOverlapping() const
Determine if this field is of potentially-overlapping class type, that is, subobject with the [[no_un...
Definition: Decl.cpp:4628
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
Definition: Decl.cpp:4663
const VariableArrayType * CapturedVLAType
Definition: Decl.h:3086
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, StringLiteral *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Definition: Decl.cpp:5574
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5581
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:4387
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
Definition: Decl.cpp:3582
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:3701
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition: Decl.cpp:4042
void setPreviousDeclaration(FunctionDecl *PrevDecl)
Definition: Decl.cpp:3591
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition: Decl.cpp:4035
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition: Decl.cpp:4030
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:3861
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition: Decl.cpp:3462
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5398
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition: Decl.cpp:3620
SourceLocation getPointOfInstantiation() const
Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...
Definition: Decl.cpp:4348
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
Definition: Decl.cpp:3524
bool hasCXXExplicitFunctionObjectParameter() const
Definition: Decl.cpp:3719
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:3513
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:3564
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:4101
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
Definition: Decl.cpp:3745
unsigned getMinRequiredExplicitArguments() const
Returns the minimum number of non-object arguments needed to call this function.
Definition: Decl.cpp:3728
bool BodyContainsImmediateEscalatingExpressions() const
Definition: Decl.h:2415
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition: Decl.cpp:3476
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition: Decl.cpp:4150
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:4009
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition: Decl.cpp:4160
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:3605
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
Definition: Decl.cpp:3855
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:4225
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition: Decl.cpp:4166
SourceRange getExceptionSpecSourceRange() const
Attempt to compute an informative source range covering the function exception specification,...
Definition: Decl.cpp:3893
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:3302
unsigned getODRHash()
Returns ODRHash of the function.
Definition: Decl.cpp:4512
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Determine the kind of template specialization this function represents for the purpose of template in...
Definition: Decl.cpp:4277
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
Definition: Decl.cpp:4094
unsigned getNumNonObjectParams() const
Definition: Decl.cpp:3723
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:4360
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
Definition: Decl.cpp:3437
bool FriendConstraintRefersToEnclosingTemplate() const
Definition: Decl.h:2580
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition: Decl.cpp:3981
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition: Decl.cpp:4048
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:3329
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:4214
bool isInExternCContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C" linkage spec.
Definition: Decl.cpp:3484
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:4059
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition: Decl.cpp:3480
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:3490
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:3586
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:3354
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:3560
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:4383
FunctionDecl * getInstantiatedFromDecl() const
Definition: Decl.cpp:4054
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Determine what kind of template instantiation this function represents.
Definition: Decl.cpp:4321
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
Definition: Decl.cpp:3975
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition: Decl.cpp:3967
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition: Decl.cpp:4254
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
Definition: Decl.cpp:3795
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:3568
void setBody(Stmt *B)
Definition: Decl.cpp:3236
bool isGlobal() const
Determines whether this is a global function.
Definition: Decl.cpp:3494
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
Definition: Decl.cpp:3733
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:3573
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
Definition: Decl.cpp:4002
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:3915
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition: Decl.cpp:3680
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:3877
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:3546
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:4176
Represents a prototype with parameter type info, e.g.
Definition: Type.h:4973
unsigned getNumParams() const
Definition: Type.h:5226
bool isVariadic() const
Whether this function prototype is variadic.
Definition: Type.h:5350
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:4278
@ SME_PStateSMEnabledMask
Definition: Type.h:4544
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition: Decl.h:4920
static HLSLBufferDecl * Create(ASTContext &C, DeclContext *LexicalParent, bool CBuffer, SourceLocation KwLoc, IdentifierInfo *ID, SourceLocation IDLoc, SourceLocation LBrace)
Definition: Decl.cpp:5632
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5654
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:5367
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5379
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition: Decl.h:4779
static ImportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, ArrayRef< SourceLocation > IdentifierLocs)
Create a new module import declaration.
Definition: Decl.cpp:5693
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5726
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition: Decl.cpp:5711
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:5717
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition: Decl.h:4837
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:5701
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3314
static bool classofKind(Kind K)
Definition: Decl.h:3359
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, llvm::MutableArrayRef< NamedDecl * > CH)
Definition: Decl.cpp:5469
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5475
Represents the declaration of a label.
Definition: Decl.h:499
void setMSAsmLabel(StringRef Name)
Definition: Decl.cpp:5344
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
Definition: Decl.cpp:5327
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5339
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:461
SanitizerSet Sanitize
Set of enabled sanitizers.
Definition: LangOptions.h:467
LinkageInfo getTypeLinkageAndVisibility(const Type *T)
Definition: Type.cpp:4673
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:753
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Definition: ODRHash.cpp:660
void AddRecordDecl(const RecordDecl *Record)
Definition: ODRHash.cpp:615
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:5273
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition: Decl.cpp:5286
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:5296
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition: Decl.cpp:5312
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:7743
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:7789
const Type * getTypePtrOrNull() const
Definition: Type.h:7747
Represents a struct/union/class.
Definition: Decl.h:4141
bool hasLoadedFieldsFromExternalStorage() const
Definition: Decl.h:4210
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition: Decl.cpp:5190
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
Definition: Decl.cpp:5028
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:5090
void setAnonymousStructOrUnion(bool Anon)
Definition: Decl.h:4197
const FieldDecl * findFirstNamedDataMember() const
Finds the first data member which has a name.
Definition: Decl.cpp:5175
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition: Decl.h:4279
void setNonTrivialToPrimitiveCopy(bool V)
Definition: Decl.h:4231
bool isCapturedRecord() const
Determine whether this record is a record for captured variables in CapturedStmt construct.
Definition: Decl.cpp:5034
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition: Decl.h:4263
field_range fields() const
Definition: Decl.h:4347
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition: Decl.h:4255
void setHasFlexibleArrayMember(bool V)
Definition: Decl.h:4178
void setParamDestroyedInCallee(bool V)
Definition: Decl.h:4287
void setNonTrivialToPrimitiveDestroy(bool V)
Definition: Decl.h:4239
void setHasObjectMember(bool val)
Definition: Decl.h:4202
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
Definition: Decl.cpp:5003
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
Definition: Decl.cpp:5023
void setHasVolatileMember(bool val)
Definition: Decl.h:4206
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition: Decl.h:4247
void reorderDecls(const SmallVectorImpl< Decl * > &Decls)
Definition: Decl.cpp:5094
void setIsRandomized(bool V)
Definition: Decl.h:4293
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5014
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition: Decl.cpp:5131
static bool classof(const Decl *D)
Definition: Decl.h:4362
bool isOrContainsUnion() const
Returns whether this record is a union, or contains (at any nesting level) a union member.
Definition: Decl.cpp:5042
virtual void completeDefinition()
Note that the definition of this type is now complete.
Definition: Decl.cpp:5069
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition: Decl.h:4332
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
Definition: Decl.cpp:5038
specific_decl_iterator< FieldDecl > field_iterator
Definition: Decl.h:4344
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition: Decl.h:4223
void setHasLoadedFieldsFromExternalStorage(bool val) const
Definition: Decl.h:4214
field_iterator field_begin() const
Definition: Decl.cpp:5057
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:5936
RecordDecl * getDecl() const
Definition: Type.h:5946
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:216
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Definition: Redeclarable.h:204
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
Definition: Redeclarable.h:226
void setPreviousDecl(FunctionDecl *PrevDecl)
Set the previous declaration.
Definition: Decl.h:4974
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition: Redeclarable.h:296
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:3557
void setTagKind(TagKind TK)
Definition: Decl.h:3756
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition: Decl.h:3675
SourceRange getBraceRange() const
Definition: Decl.h:3636
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
Definition: Decl.cpp:4748
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:3690
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition: Decl.h:3660
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:3618
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition: Decl.h:3785
void startDefinition()
Starts the definition of this tag declaration.
Definition: Decl.cpp:4725
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:4714
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
Definition: Decl.cpp:4716
bool mayHaveOutOfDateDef() const
Indicates whether it is possible for declarations of this kind to have an out-of-date definition.
Definition: Decl.h:3706
SourceLocation getOuterLocStart() const
Return SourceLocation representing start of source range taking into account any outer template decla...
Definition: Decl.cpp:4704
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4708
bool isUnion() const
Definition: Decl.h:3763
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
Definition: Decl.h:3612
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition: Decl.cpp:4771
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition: Decl.cpp:4808
void completeDefinition()
Completes the definition of this tag declaration.
Definition: Decl.cpp:4736
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition: Decl.cpp:4791
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition: Decl.h:3698
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Definition: Decl.h:3711
TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl, SourceLocation StartL)
Definition: Decl.cpp:4687
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition: Decl.h:3663
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:4430
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5599
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Definition: Decl.cpp:5589
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5605
void setStmt(Stmt *S)
Definition: Decl.cpp:5609
The top declaration context.
Definition: Decl.h:84
static TranslationUnitDecl * Create(ASTContext &C)
Definition: Decl.cpp:5260
ASTContext & getASTContext() const
Definition: Decl.h:120
void setAnonymousNamespace(NamespaceDecl *D)
Definition: Decl.cpp:5264
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition: Decl.h:3528
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5550
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition: Decl.cpp:5542
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5565
Represents a declaration of a type.
Definition: Decl.h:3363
const Type * getTypeForDecl() const
Definition: Decl.h:3387
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:3390
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:7714
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:7725
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:4663
bool isNothrowT() const
Definition: Type.cpp:3058
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:8583
bool isReferenceType() const
Definition: Type.h:8010
bool isEnumeralType() const
Definition: Type.h:8096
bool isAlignValT() const
Definition: Type.cpp:3067
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:2672
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:8429
bool isFunctionType() const
Definition: Type.h:7992
Linkage getLinkage() const
Determine the linkage of this type.
Definition: Type.cpp:4575
TypeClass getTypeClass() const
Definition: Type.h:2316
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8516
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3507
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition: Decl.cpp:5491
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:5556
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5537
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3405
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:3455
QualType getUnderlyingType() const
Definition: Decl.h:3460
TypedefNameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this typedef-name.
Definition: Decl.h:3477
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
Definition: Decl.cpp:5500
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:5353
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition: Decl.cpp:5359
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:3769
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:209
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:268
@ ICIS_NoInit
No in-class initializer.
Definition: Specifiers.h:269
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:245
@ SC_Auto
Definition: Specifiers.h:253
@ SC_PrivateExtern
Definition: Specifiers.h:250
@ SC_Extern
Definition: Specifiers.h:248
@ SC_Register
Definition: Specifiers.h:254
@ SC_Static
Definition: Specifiers.h:249
@ SC_None
Definition: Specifiers.h:247
@ TSCS_thread_local
C++11 thread_local.
Definition: Specifiers.h:238
@ TSCS_unspecified
Definition: Specifiers.h:233
@ TSCS__Thread_local
C11 _Thread_local.
Definition: Specifiers.h:241
@ TSCS___thread
GNU __thread.
Definition: Specifiers.h:235
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:326
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:6683
@ 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:263
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:185
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition: Specifiers.h:203
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition: Specifiers.h:199
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition: Specifiers.h:195
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition: Specifiers.h:191
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition: Specifiers.h:188
@ 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:5748
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