clang 24.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"
26#include "clang/AST/Expr.h"
27#include "clang/AST/ExprCXX.h"
29#include "clang/AST/ODRHash.h"
35#include "clang/AST/Stmt.h"
37#include "clang/AST/Type.h"
38#include "clang/AST/TypeLoc.h"
41#include "clang/Basic/LLVM.h"
43#include "clang/Basic/Linkage.h"
44#include "clang/Basic/Module.h"
54#include "llvm/ADT/APSInt.h"
55#include "llvm/ADT/ArrayRef.h"
56#include "llvm/ADT/STLExtras.h"
57#include "llvm/ADT/SmallVector.h"
58#include "llvm/ADT/StringRef.h"
59#include "llvm/ADT/StringSwitch.h"
60#include "llvm/ADT/iterator_range.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 <optional>
70#include <string>
71#include <tuple>
72#include <type_traits>
73
74using namespace clang;
75
79
80void PrettyDeclStackTraceEntry::print(raw_ostream &OS) const {
81 SourceLocation Loc = this->Loc;
82 if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation();
83 if (Loc.isValid()) {
84 Loc.print(OS, Context.getSourceManager());
85 OS << ": ";
86 }
87 OS << Message;
88
89 if (auto *ND = dyn_cast_if_present<NamedDecl>(TheDecl)) {
90 OS << " '";
91 ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), true);
92 OS << "'";
93 }
94
95 OS << '\n';
96}
97
98// Defined here so that it can be inlined into its direct callers.
99bool Decl::isOutOfLine() const {
101}
102
103TranslationUnitDecl::TranslationUnitDecl(ASTContext &ctx)
104 : Decl(TranslationUnit, nullptr, SourceLocation()),
105 DeclContext(TranslationUnit), redeclarable_base(ctx), Ctx(ctx) {}
106
107//===----------------------------------------------------------------------===//
108// NamedDecl Implementation
109//===----------------------------------------------------------------------===//
110
111// Visibility rules aren't rigorously externally specified, but here
112// are the basic principles behind what we implement:
113//
114// 1. An explicit visibility attribute is generally a direct expression
115// of the user's intent and should be honored. Only the innermost
116// visibility attribute applies. If no visibility attribute applies,
117// global visibility settings are considered.
118//
119// 2. There is one caveat to the above: on or in a template pattern,
120// an explicit visibility attribute is just a default rule, and
121// visibility can be decreased by the visibility of template
122// arguments. But this, too, has an exception: an attribute on an
123// explicit specialization or instantiation causes all the visibility
124// restrictions of the template arguments to be ignored.
125//
126// 3. A variable that does not otherwise have explicit visibility can
127// be restricted by the visibility of its type.
128//
129// 4. A visibility restriction is explicit if it comes from an
130// attribute (or something like it), not a global visibility setting.
131// When emitting a reference to an external symbol, visibility
132// restrictions are ignored unless they are explicit.
133//
134// 5. When computing the visibility of a non-type, including a
135// non-type member of a class, only non-type visibility restrictions
136// are considered: the 'visibility' attribute, global value-visibility
137// settings, and a few special cases like __private_extern.
138//
139// 6. When computing the visibility of a type, including a type member
140// of a class, only type visibility restrictions are considered:
141// the 'type_visibility' attribute and global type-visibility settings.
142// However, a 'visibility' attribute counts as a 'type_visibility'
143// attribute on any declaration that only has the former.
144//
145// The visibility of a "secondary" entity, like a template argument,
146// is computed using the kind of that entity, not the kind of the
147// primary entity for which we are computing visibility. For example,
148// the visibility of a specialization of either of these templates:
149// template <class T, bool (&compare)(T, X)> bool has_match(list<T>, X);
150// template <class T, bool (&compare)(T, X)> class matcher;
151// is restricted according to the type visibility of the argument 'T',
152// the type visibility of 'bool(&)(T,X)', and the value visibility of
153// the argument function 'compare'. That 'has_match' is a value
154// and 'matcher' is a type only matters when looking for attributes
155// and settings from the immediate context.
156
157/// Does this computation kind permit us to consider additional
158/// visibility settings from attributes and the like?
160 return computation.IgnoreExplicitVisibility;
161}
162
163/// Given an LVComputationKind, return one of the same type/value sort
164/// that records that it already has explicit visibility.
167 Kind.IgnoreExplicitVisibility = true;
168 return Kind;
169}
170
171static std::optional<Visibility> getExplicitVisibility(const NamedDecl *D,
173 assert(!kind.IgnoreExplicitVisibility &&
174 "asking for explicit visibility when we shouldn't be");
175 return D->getExplicitVisibility(kind.getExplicitVisibilityKind());
176}
177
178/// Is the given declaration a "type" or a "value" for the purposes of
179/// visibility computation?
180static bool usesTypeVisibility(const NamedDecl *D) {
181 return isa<TypeDecl>(D) ||
184}
185
186/// Does the given declaration have member specialization information,
187/// and if so, is it an explicit specialization?
188template <class T>
189static std::enable_if_t<!std::is_base_of_v<RedeclarableTemplateDecl, T>, bool>
191 if (const MemberSpecializationInfo *member =
192 D->getMemberSpecializationInfo()) {
193 return member->isExplicitSpecialization();
194 }
195 return false;
196}
197
198/// For templates, this question is easier: a member template can't be
199/// explicitly instantiated, so there's a single bit indicating whether
200/// or not this is an explicit member specialization.
204
205/// Given a visibility attribute, return the explicit visibility
206/// associated with it.
207template <class T>
209 switch (attr->getVisibility()) {
210 case T::Default:
211 return DefaultVisibility;
212 case T::Hidden:
213 return HiddenVisibility;
214 case T::Protected:
215 return ProtectedVisibility;
216 }
217 llvm_unreachable("bad visibility kind");
218}
219
220/// Return the explicit visibility of the given declaration.
221static std::optional<Visibility>
223 // If we're ultimately computing the visibility of a type, look for
224 // a 'type_visibility' attribute before looking for 'visibility'.
226 if (const auto *A = D->getAttr<TypeVisibilityAttr>()) {
227 return getVisibilityFromAttr(A);
228 }
229 }
230
231 // If this declaration has an explicit visibility attribute, use it.
232 if (const auto *A = D->getAttr<VisibilityAttr>()) {
233 return getVisibilityFromAttr(A);
234 }
235
236 return std::nullopt;
237}
238
239LinkageInfo LinkageComputer::getLVForType(const Type &T,
240 LVComputationKind computation) {
241 if (computation.IgnoreAllVisibility)
242 return LinkageInfo(T.getLinkage(), DefaultVisibility, true);
244}
245
246/// Get the most restrictive linkage for the types in the given
247/// template parameter list. For visibility purposes, template
248/// parameters are part of the signature of a template.
249LinkageInfo LinkageComputer::getLVForTemplateParameterList(
250 const TemplateParameterList *Params, LVComputationKind computation) {
251 LinkageInfo LV;
252 for (const NamedDecl *P : *Params) {
253 // Template type parameters are the most common and never
254 // contribute to visibility, pack or not.
256 continue;
257
258 // Non-type template parameters can be restricted by the value type, e.g.
259 // template <enum X> class A { ... };
260 // We have to be careful here, though, because we can be dealing with
261 // dependent types.
262 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) {
263 // Handle the non-pack case first.
264 if (!NTTP->isExpandedParameterPack()) {
265 if (!NTTP->getType()->isDependentType()) {
266 LV.merge(getLVForType(*NTTP->getType(), computation));
267 }
268 continue;
269 }
270
271 // Look at all the types in an expanded pack.
272 for (unsigned i = 0, n = NTTP->getNumExpansionTypes(); i != n; ++i) {
273 QualType type = NTTP->getExpansionType(i);
274 if (!type->isDependentType())
276 }
277 continue;
278 }
279
280 // Template template parameters can be restricted by their
281 // template parameters, recursively.
282 const auto *TTP = cast<TemplateTemplateParmDecl>(P);
283
284 // Handle the non-pack case first.
285 if (!TTP->isExpandedParameterPack()) {
286 LV.merge(getLVForTemplateParameterList(TTP->getTemplateParameters(),
287 computation));
288 continue;
289 }
290
291 // Look at all expansions in an expanded pack.
292 for (unsigned i = 0, n = TTP->getNumExpansionTemplateParameters();
293 i != n; ++i) {
294 LV.merge(getLVForTemplateParameterList(
295 TTP->getExpansionTemplateParameters(i), computation));
296 }
297 }
298
299 return LV;
300}
301
302static const Decl *getOutermostFuncOrBlockContext(const Decl *D) {
303 const Decl *Ret = nullptr;
304 const DeclContext *DC = D->getDeclContext();
305 while (DC->getDeclKind() != Decl::TranslationUnit) {
306 if (isa<FunctionDecl>(DC) || isa<BlockDecl>(DC))
307 Ret = cast<Decl>(DC);
308 DC = DC->getParent();
309 }
310 return Ret;
311}
312
313/// Get the most restrictive linkage for the types and
314/// declarations in the given template argument list.
315///
316/// Note that we don't take an LVComputationKind because we always
317/// want to honor the visibility of template arguments in the same way.
319LinkageComputer::getLVForTemplateArgumentList(ArrayRef<TemplateArgument> Args,
320 LVComputationKind computation) {
321 LinkageInfo LV;
322
323 for (const TemplateArgument &Arg : Args) {
324 switch (Arg.getKind()) {
328 continue;
329
331 LV.merge(getLVForType(*Arg.getAsType(), computation));
332 continue;
333
335 const NamedDecl *ND = Arg.getAsDecl();
336 assert(!usesTypeVisibility(ND));
337 LV.merge(getLVForDecl(ND, computation));
338 continue;
339 }
340
342 LV.merge(getTypeLinkageAndVisibility(Arg.getNullPtrType()));
343 continue;
344
346 LV.merge(getLVForValue(Arg.getAsStructuralValue(), computation));
347 continue;
348
351 if (TemplateDecl *Template =
352 Arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl(
353 /*IgnoreDeduced=*/true))
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 and visibility of the specialization should be
403 // consistent with the template declaration.
404 LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
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.
473 ClassTemplateDecl *temp = spec->getSpecializedTemplate();
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.
530 VarTemplateDecl *temp = spec->getSpecializedTemplate();
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
589
591 if (auto *TD = dyn_cast<TemplateDecl>(D))
592 D = TD->getTemplatedDecl();
593 if (D) {
594 if (auto *VD = dyn_cast<VarDecl>(D))
595 return VD->getStorageClass();
596 if (auto *FD = dyn_cast<FunctionDecl>(D))
597 return FD->getStorageClass();
598 }
599 return SC_None;
600}
601
603LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D,
604 LVComputationKind computation,
605 bool IgnoreVarTypeLinkage) {
607 "Not a name having namespace scope");
608 ASTContext &Context = D->getASTContext();
609 const auto *Var = dyn_cast<VarDecl>(D);
610
611 // C++ [basic.link]p3:
612 // A name having namespace scope (3.3.6) has internal linkage if it
613 // is the name of
614
616 (Context.getLangOpts().C23 && Var && Var->isConstexpr())) {
617 // - a variable, variable template, function, or function template
618 // that is explicitly declared static; or
619 // (This bullet corresponds to C99 6.2.2p3.)
620
621 // C23 6.2.2p3
622 // If the declaration of a file scope identifier for
623 // an object contains any of the storage-class specifiers static or
624 // constexpr then the identifier has internal linkage.
625 return LinkageInfo::internal();
626 }
627
628 if (Var) {
629 // - a non-template variable of non-volatile const-qualified type, unless
630 // - it is explicitly declared extern, or
631 // - it is declared in the purview of a module interface unit
632 // (outside the private-module-fragment, if any) or module partition, or
633 // - it is inline, or
634 // - it was previously declared and the prior declaration did not have
635 // internal linkage
636 // (There is no equivalent in C99.)
637 if (Context.getLangOpts().CPlusPlus && Var->getType().isConstQualified() &&
638 !Var->getType().isVolatileQualified() && !Var->isInline() &&
639 ![Var]() {
640 // Check if it is module purview except private module fragment
641 // and implementation unit.
642 if (auto *M = Var->getOwningModule())
643 return M->isInterfaceOrPartition() || M->isImplicitGlobalModule();
644 return false;
645 }() &&
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.
698 LinkageInfo LV = getExternalLinkageFor(D);
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();
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().isGPU() ||
813 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Function)))
814 LV.mergeVisibility(HiddenVisibility, /*newExplicit=*/false);
815
816 // Note that Sema::MergeCompatibleFunctionDecls already takes care of
817 // merging storage classes and visibility attributes, so we don't have to
818 // look at previous decls in here.
819
820 // In C++, then if the type of the function uses a type with
821 // unique-external linkage, it's not legally usable from outside
822 // this translation unit. However, we should use the C linkage
823 // rules instead for extern "C" declarations.
824 if (Context.getLangOpts().CPlusPlus && !isFirstInExternCContext(Function)) {
825 // Only look at the type-as-written. Otherwise, deducing the return type
826 // of a function could change its linkage.
827 QualType TypeAsWritten = Function->getType();
828 if (TypeSourceInfo *TSI = Function->getTypeSourceInfo())
829 TypeAsWritten = TSI->getType();
830 if (!isExternallyVisible(TypeAsWritten->getLinkage()))
832 }
833
834 // Consider LV from the template and the template arguments.
835 // We're at file scope, so we do not need to worry about nested
836 // specializations.
837 if (FunctionTemplateSpecializationInfo *specInfo
838 = Function->getTemplateSpecializationInfo()) {
839 mergeTemplateLV(LV, Function, specInfo, computation);
840 }
841
842 // - a named class (Clause 9), or an unnamed class defined in a
843 // typedef declaration in which the class has the typedef name
844 // for linkage purposes (7.1.3); or
845 // - a named enumeration (7.2), or an unnamed enumeration
846 // defined in a typedef declaration in which the enumeration
847 // has the typedef name for linkage purposes (7.1.3); or
848 } else if (const auto *Tag = dyn_cast<TagDecl>(D)) {
849 // Unnamed tags have no linkage.
850 if (!Tag->hasNameForLinkage())
851 return LinkageInfo::none();
852
853 // If this is a class template specialization, consider the
854 // linkage of the template and template arguments. We're at file
855 // scope, so we do not need to worry about nested specializations.
856 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(Tag)) {
857 mergeTemplateLV(LV, spec, computation);
858 }
859
860 // FIXME: This is not part of the C++ standard any more.
861 // - an enumerator belonging to an enumeration with external linkage; or
862 } else if (isa<EnumConstantDecl>(D)) {
863 LinkageInfo EnumLV = getLVForDecl(cast<NamedDecl>(D->getDeclContext()),
864 computation);
865 if (!isExternalFormalLinkage(EnumLV.getLinkage()))
866 return LinkageInfo::none();
867 LV.merge(EnumLV);
868
869 // - a template
870 } else if (const auto *temp = dyn_cast<TemplateDecl>(D)) {
871 bool considerVisibility = !hasExplicitVisibilityAlready(computation);
872 LinkageInfo tempLV =
873 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
874 LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
875
876 // An unnamed namespace or a namespace declared directly or indirectly
877 // within an unnamed namespace has internal linkage. All other namespaces
878 // have external linkage.
879 //
880 // We handled names in anonymous namespaces above.
881 } else if (isa<NamespaceDecl>(D)) {
882 return LV;
883
884 // By extension, we assign external linkage to Objective-C
885 // interfaces.
886 } else if (isa<ObjCInterfaceDecl>(D)) {
887 // fallout
888
889 } else if (auto *TD = dyn_cast<TypedefNameDecl>(D)) {
890 // A typedef declaration has linkage if it gives a type a name for
891 // linkage purposes.
892 if (!TD->getAnonDeclWithTypedefName(/*AnyRedecl*/true))
893 return LinkageInfo::none();
894
895 } else if (isa<MSGuidDecl>(D)) {
896 // A GUID behaves like an inline variable with external linkage. Fall
897 // through.
898
899 // Everything not covered here has no linkage.
900 } else {
901 return LinkageInfo::none();
902 }
903
904 // If we ended up with non-externally-visible linkage, visibility should
905 // always be default.
907 return LinkageInfo(LV.getLinkage(), DefaultVisibility, false);
908
909 return LV;
910}
911
913LinkageComputer::getLVForClassMember(const NamedDecl *D,
914 LVComputationKind computation,
915 bool IgnoreVarTypeLinkage) {
916 // Only certain class members have linkage. Note that fields don't
917 // really have linkage, but it's convenient to say they do for the
918 // purposes of calculating linkage of pointer-to-data-member
919 // template arguments.
920 //
921 // Templates also don't officially have linkage, but since we ignore
922 // the C++ standard and look at template arguments when determining
923 // linkage and visibility of a template specialization, we might hit
924 // a template template argument that way. If we do, we need to
925 // consider its linkage.
926 if (!(isa<CXXMethodDecl>(D) ||
927 isa<VarDecl>(D) ||
928 isa<FieldDecl>(D) ||
930 isa<TagDecl>(D) ||
932 return LinkageInfo::none();
933
934 LinkageInfo LV;
935
936 // If we have an explicit visibility attribute, merge that in.
937 if (!hasExplicitVisibilityAlready(computation)) {
938 if (std::optional<Visibility> Vis = getExplicitVisibility(D, computation))
939 LV.mergeVisibility(*Vis, true);
940 // If we're paying attention to global visibility, apply
941 // -finline-visibility-hidden if this is an inline method.
942 //
943 // Note that we do this before merging information about
944 // the class visibility.
946 LV.mergeVisibility(HiddenVisibility, /*visibilityExplicit=*/false);
947 }
948
949 // If this class member has an explicit visibility attribute, the only
950 // thing that can change its visibility is the template arguments, so
951 // only look for them when processing the class.
952 LVComputationKind classComputation = computation;
953 if (LV.isVisibilityExplicit())
954 classComputation = withExplicitVisibilityAlready(computation);
955
956 LinkageInfo classLV =
957 getLVForDecl(cast<RecordDecl>(D->getDeclContext()), classComputation);
958 // The member has the same linkage as the class. If that's not externally
959 // visible, we don't need to compute anything about the linkage.
960 // FIXME: If we're only computing linkage, can we bail out here?
961 if (!isExternallyVisible(classLV.getLinkage()))
962 return classLV;
963
964
965 // Otherwise, don't merge in classLV yet, because in certain cases
966 // we need to completely ignore the visibility from it.
967
968 // Specifically, if this decl exists and has an explicit attribute.
969 const NamedDecl *explicitSpecSuppressor = nullptr;
970
971 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
972 // Only look at the type-as-written. Otherwise, deducing the return type
973 // of a function could change its linkage.
974 QualType TypeAsWritten = MD->getType();
975 if (TypeSourceInfo *TSI = MD->getTypeSourceInfo())
976 TypeAsWritten = TSI->getType();
977 if (!isExternallyVisible(TypeAsWritten->getLinkage()))
979
980 // If this is a method template specialization, use the linkage for
981 // the template parameters and arguments.
982 if (FunctionTemplateSpecializationInfo *spec
983 = MD->getTemplateSpecializationInfo()) {
984 mergeTemplateLV(LV, MD, spec, computation);
985 if (spec->isExplicitSpecialization()) {
986 explicitSpecSuppressor = MD;
987 } else if (isExplicitMemberSpecialization(spec->getTemplate())) {
988 explicitSpecSuppressor = spec->getTemplate()->getTemplatedDecl();
989 }
990 } else if (isExplicitMemberSpecialization(MD)) {
991 explicitSpecSuppressor = MD;
992 }
993
994 // OpenMP target declare device functions are not callable from the host so
995 // they should not be exported from the device image. This applies to all
996 // functions as the host-callable kernel functions are emitted at codegen.
997 ASTContext &Context = D->getASTContext();
998 if (Context.getLangOpts().OpenMP &&
999 Context.getLangOpts().OpenMPIsTargetDevice &&
1000 ((Context.getTargetInfo().getTriple().isAMDGPU() ||
1001 Context.getTargetInfo().getTriple().isNVPTX()) ||
1002 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(MD)))
1003 LV.mergeVisibility(HiddenVisibility, /*newExplicit=*/false);
1004
1005 } else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
1006 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
1007 mergeTemplateLV(LV, spec, computation);
1008 if (spec->isExplicitSpecialization()) {
1009 explicitSpecSuppressor = spec;
1010 } else {
1011 const ClassTemplateDecl *temp = spec->getSpecializedTemplate();
1013 explicitSpecSuppressor = temp->getTemplatedDecl();
1014 }
1015 }
1016 } else if (isExplicitMemberSpecialization(RD)) {
1017 explicitSpecSuppressor = RD;
1018 }
1019
1020 // Static data members.
1021 } else if (const auto *VD = dyn_cast<VarDecl>(D)) {
1022 if (const auto *spec = dyn_cast<VarTemplateSpecializationDecl>(VD))
1023 mergeTemplateLV(LV, spec, computation);
1024
1025 // Modify the variable's linkage by its type, but ignore the
1026 // type's visibility unless it's a definition.
1027 if (!IgnoreVarTypeLinkage) {
1028 LinkageInfo typeLV = getLVForType(*VD->getType(), computation);
1029 // FIXME: If the type's linkage is not externally visible, we can
1030 // give this static data member UniqueExternalLinkage.
1031 if (!LV.isVisibilityExplicit() && !classLV.isVisibilityExplicit())
1032 LV.mergeVisibility(typeLV);
1033 LV.mergeExternalVisibility(typeLV);
1034 }
1035
1037 explicitSpecSuppressor = VD;
1038 }
1039
1040 // Template members.
1041 } else if (const auto *temp = dyn_cast<TemplateDecl>(D)) {
1042 bool considerVisibility =
1043 (!LV.isVisibilityExplicit() &&
1044 !classLV.isVisibilityExplicit() &&
1045 !hasExplicitVisibilityAlready(computation));
1046 LinkageInfo tempLV =
1047 getLVForTemplateParameterList(temp->getTemplateParameters(), computation);
1048 LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
1049
1050 if (const auto *redeclTemp = dyn_cast<RedeclarableTemplateDecl>(temp)) {
1051 if (isExplicitMemberSpecialization(redeclTemp)) {
1052 explicitSpecSuppressor = temp->getTemplatedDecl();
1053 } else if (const RedeclarableTemplateDecl *from =
1054 redeclTemp->getInstantiatedFromMemberTemplate()) {
1055 // If no explicit visibility is specified yet, and this is an
1056 // instantiated member of a template, look up visibility there
1057 // as well.
1058 LinkageInfo fromLV = from->getLinkageAndVisibility();
1059 LV.mergeMaybeWithVisibility(fromLV, considerVisibility);
1060 }
1061 }
1062 }
1063
1064 // We should never be looking for an attribute directly on a template.
1065 assert(!explicitSpecSuppressor || !isa<TemplateDecl>(explicitSpecSuppressor));
1066
1067 // If this member is an explicit member specialization, and it has
1068 // an explicit attribute, ignore visibility from the parent.
1069 bool considerClassVisibility = true;
1070 if (explicitSpecSuppressor &&
1071 // optimization: hasDVA() is true only with explicit visibility.
1072 LV.isVisibilityExplicit() &&
1073 classLV.getVisibility() != DefaultVisibility &&
1074 hasDirectVisibilityAttribute(explicitSpecSuppressor, computation)) {
1075 considerClassVisibility = false;
1076 }
1077
1078 // Finally, merge in information from the class.
1079 LV.mergeMaybeWithVisibility(classLV, considerClassVisibility);
1080 return LV;
1081}
1082
1083void NamedDecl::anchor() {}
1084
1086 if (!hasCachedLinkage())
1087 return true;
1088
1090 .computeLVForDecl(this, LVComputationKind::forLinkageOnly())
1091 .getLinkage();
1092 return L == getCachedLinkage();
1093}
1094
1095bool NamedDecl::isPlaceholderVar(const LangOptions &LangOpts) const {
1096 // [C++2c] [basic.scope.scope]/p5
1097 // A declaration is name-independent if its name is _ and it declares
1098 // - a variable with automatic storage duration,
1099 // - a structured binding not inhabiting a namespace scope,
1100 // - the variable introduced by an init-capture
1101 // - or a non-static data member.
1102
1103 if (!LangOpts.CPlusPlus || !getIdentifier() ||
1104 !getIdentifier()->isPlaceholder())
1105 return false;
1106 if (isa<FieldDecl>(this))
1107 return true;
1108 if (const auto *IFD = dyn_cast<IndirectFieldDecl>(this)) {
1109 if (!getDeclContext()->isFunctionOrMethod() &&
1110 !getDeclContext()->isRecord())
1111 return false;
1112 const VarDecl *VD = IFD->getVarDecl();
1113 return !VD || VD->getStorageDuration() == SD_Automatic;
1114 }
1115 // and it declares a variable with automatic storage duration
1116 if (const auto *VD = dyn_cast<VarDecl>(this)) {
1117 if (isa<ParmVarDecl>(VD))
1118 return false;
1119 if (VD->isInitCapture())
1120 return true;
1122 }
1123 if (const auto *BD = dyn_cast<BindingDecl>(this);
1125 const VarDecl *VD = BD->getHoldingVar();
1127 }
1128 return false;
1129}
1130
1132NamedDecl::isReserved(const LangOptions &LangOpts) const {
1133 const IdentifierInfo *II = getIdentifier();
1134
1135 // This triggers at least for CXXLiteralIdentifiers, which we already checked
1136 // at lexing time.
1137 if (!II)
1139
1140 ReservedIdentifierStatus Status = II->isReserved(LangOpts);
1141 if (isReservedAtGlobalScope(Status) && !isReservedInAllContexts(Status)) {
1142 // This name is only reserved at global scope. Check if this declaration
1143 // conflicts with a global scope declaration.
1146
1147 // C++ [dcl.link]/7:
1148 // Two declarations [conflict] if [...] one declares a function or
1149 // variable with C language linkage, and the other declares [...] a
1150 // variable that belongs to the global scope.
1151 //
1152 // Therefore names that are reserved at global scope are also reserved as
1153 // names of variables and functions with C language linkage.
1155 if (DC->isTranslationUnit())
1156 return Status;
1157 if (auto *VD = dyn_cast<VarDecl>(this))
1158 if (VD->isExternC())
1160 if (auto *FD = dyn_cast<FunctionDecl>(this))
1161 if (FD->isExternC())
1164 }
1165
1166 return Status;
1167}
1168
1170 StringRef name = getName();
1171 if (name.empty()) return SFF_None;
1172
1173 if (name.front() == 'C')
1174 if (name == "CFStringCreateWithFormat" ||
1175 name == "CFStringCreateWithFormatAndArguments" ||
1176 name == "CFStringAppendFormat" ||
1177 name == "CFStringAppendFormatAndArguments")
1178 return SFF_CFString;
1179 return SFF_None;
1180}
1181
1183 // We don't care about visibility here, so ask for the cheapest
1184 // possible visibility analysis.
1185 return LinkageComputer{}
1186 .getLVForDecl(this, LVComputationKind::forLinkageOnly())
1187 .getLinkage();
1188}
1189
1191 // FIXME: Handle isModulePrivate.
1192 switch (D->getModuleOwnershipKind()) {
1197 return false;
1200 return D->isInNamedModule();
1201 }
1202 llvm_unreachable("unexpected module ownership kind");
1203}
1204
1205/// Get the linkage from a semantic point of view. Entities in
1206/// anonymous namespaces are external (in c++98).
1208 Linkage InternalLinkage = getLinkageInternal();
1209
1210 // C++ [basic.link]p4.8:
1211 // - if the declaration of the name is attached to a named module and is not
1212 // exported
1213 // the name has module linkage;
1214 //
1215 // [basic.namespace.general]/p2
1216 // A namespace is never attached to a named module and never has a name with
1217 // module linkage.
1218 if (isInNamedModule() && InternalLinkage == Linkage::External &&
1221 !isa<NamespaceDecl>(this))
1222 InternalLinkage = Linkage::Module;
1223
1224 return clang::getFormalLinkage(InternalLinkage);
1225}
1226
1228 return LinkageComputer{}.getDeclLinkageAndVisibility(this);
1229}
1230
1231static std::optional<Visibility>
1234 bool IsMostRecent) {
1235 assert(!IsMostRecent || ND == ND->getMostRecentDecl());
1236
1237 if (isa<ConceptDecl>(ND))
1238 return {};
1239
1240 // Check the declaration itself first.
1241 if (std::optional<Visibility> V = getVisibilityOf(ND, kind))
1242 return V;
1243
1244 // If this is a member class of a specialization of a class template
1245 // and the corresponding decl has explicit visibility, use that.
1246 if (const auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
1247 CXXRecordDecl *InstantiatedFrom = RD->getInstantiatedFromMemberClass();
1248 if (InstantiatedFrom)
1249 return getVisibilityOf(InstantiatedFrom, kind);
1250 }
1251
1252 // If there wasn't explicit visibility there, and this is a
1253 // specialization of a class template, check for visibility
1254 // on the pattern.
1255 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1256 // Walk all the template decl till this point to see if there are
1257 // explicit visibility attributes.
1258 const auto *TD = spec->getSpecializedTemplate()->getTemplatedDecl();
1259 while (TD != nullptr) {
1260 auto Vis = getVisibilityOf(TD, kind);
1261 if (Vis != std::nullopt)
1262 return Vis;
1263 TD = TD->getPreviousDecl();
1264 }
1265 return std::nullopt;
1266 }
1267
1268 // Use the most recent declaration.
1269 if (!IsMostRecent && !isa<NamespaceDecl>(ND)) {
1270 const NamedDecl *MostRecent = ND->getMostRecentDecl();
1271 if (MostRecent != ND)
1272 return getExplicitVisibilityAux(MostRecent, kind, true);
1273 }
1274
1275 if (const auto *Var = dyn_cast<VarDecl>(ND)) {
1276 if (Var->isStaticDataMember()) {
1277 VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember();
1278 if (InstantiatedFrom)
1279 return getVisibilityOf(InstantiatedFrom, kind);
1280 }
1281
1282 if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Var))
1283 return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(),
1284 kind);
1285
1286 return std::nullopt;
1287 }
1288 // Also handle function template specializations.
1289 if (const auto *fn = dyn_cast<FunctionDecl>(ND)) {
1290 // If the function is a specialization of a template with an
1291 // explicit visibility attribute, use that.
1292 if (FunctionTemplateSpecializationInfo *templateInfo
1294 return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl(),
1295 kind);
1296
1297 // If the function is a member of a specialization of a class template
1298 // and the corresponding decl has explicit visibility, use that.
1299 FunctionDecl *InstantiatedFrom = fn->getInstantiatedFromMemberFunction();
1300 if (InstantiatedFrom)
1301 return getVisibilityOf(InstantiatedFrom, kind);
1302
1303 return std::nullopt;
1304 }
1305
1306 // The visibility of a template is stored in the templated decl.
1307 if (const auto *TD = dyn_cast<TemplateDecl>(ND))
1308 return getVisibilityOf(TD->getTemplatedDecl(), kind);
1309
1310 return std::nullopt;
1311}
1312
1313std::optional<Visibility>
1317
1318LinkageInfo LinkageComputer::getLVForClosure(const DeclContext *DC,
1319 Decl *ContextDecl,
1320 LVComputationKind computation) {
1321 // This lambda has its linkage/visibility determined by its owner.
1322 const NamedDecl *Owner;
1323 if (!ContextDecl)
1324 Owner = dyn_cast<NamedDecl>(DC);
1325 else if (isa<ParmVarDecl>(ContextDecl))
1326 Owner =
1327 dyn_cast<NamedDecl>(ContextDecl->getDeclContext()->getRedeclContext());
1328 else if (isa<ImplicitConceptSpecializationDecl>(ContextDecl)) {
1329 // Replace with the concept's owning decl, which is either a namespace or a
1330 // TU, so this needs a dyn_cast.
1331 Owner = dyn_cast<NamedDecl>(ContextDecl->getDeclContext());
1332 } else {
1333 Owner = cast<NamedDecl>(ContextDecl);
1334 }
1335
1336 if (!Owner)
1337 return LinkageInfo::none();
1338
1339 // If the owner has a deduced type, we need to skip querying the linkage and
1340 // visibility of that type, because it might involve this closure type. The
1341 // only effect of this is that we might give a lambda VisibleNoLinkage rather
1342 // than NoLinkage when we don't strictly need to, which is benign.
1343 auto *VD = dyn_cast<VarDecl>(Owner);
1344 LinkageInfo OwnerLV =
1345 VD && VD->getType()->getContainedDeducedType()
1346 ? computeLVForDecl(Owner, computation, /*IgnoreVarTypeLinkage*/true)
1347 : getLVForDecl(Owner, computation);
1348
1349 // A lambda never formally has linkage. But if the owner is externally
1350 // visible, then the lambda is too. We apply the same rules to blocks.
1351 if (!isExternallyVisible(OwnerLV.getLinkage()))
1352 return LinkageInfo::none();
1353 return LinkageInfo(Linkage::VisibleNone, OwnerLV.getVisibility(),
1354 OwnerLV.isVisibilityExplicit());
1355}
1356
1357LinkageInfo LinkageComputer::getLVForLocalDecl(const NamedDecl *D,
1358 LVComputationKind computation) {
1359 if (const auto *Function = dyn_cast<FunctionDecl>(D)) {
1360 if (Function->isInAnonymousNamespace() &&
1362 return LinkageInfo::internal();
1363
1364 // This is a "void f();" which got merged with a file static.
1365 if (Function->getCanonicalDecl()->getStorageClass() == SC_Static)
1366 return LinkageInfo::internal();
1367
1368 LinkageInfo LV;
1369 if (!hasExplicitVisibilityAlready(computation)) {
1370 if (std::optional<Visibility> Vis =
1371 getExplicitVisibility(Function, computation))
1372 LV.mergeVisibility(*Vis, true);
1373 }
1374
1375 // Note that Sema::MergeCompatibleFunctionDecls already takes care of
1376 // merging storage classes and visibility attributes, so we don't have to
1377 // look at previous decls in here.
1378
1379 return LV;
1380 }
1381
1382 if (const auto *Var = dyn_cast<VarDecl>(D)) {
1383 if (Var->hasExternalStorage()) {
1384 if (Var->isInAnonymousNamespace() && !isFirstInExternCContext(Var))
1385 return LinkageInfo::internal();
1386
1387 LinkageInfo LV;
1388 if (Var->getStorageClass() == SC_PrivateExtern)
1390 else if (!hasExplicitVisibilityAlready(computation)) {
1391 if (std::optional<Visibility> Vis =
1392 getExplicitVisibility(Var, computation))
1393 LV.mergeVisibility(*Vis, true);
1394 }
1395
1396 if (const VarDecl *Prev = Var->getPreviousDecl()) {
1397 LinkageInfo PrevLV = getLVForDecl(Prev, computation);
1398 if (PrevLV.getLinkage() != Linkage::Invalid)
1399 LV.setLinkage(PrevLV.getLinkage());
1400 LV.mergeVisibility(PrevLV);
1401 }
1402
1403 return LV;
1404 }
1405
1406 if (!Var->isStaticLocal())
1407 return LinkageInfo::none();
1408 }
1409
1410 ASTContext &Context = D->getASTContext();
1411 if (!Context.getLangOpts().CPlusPlus)
1412 return LinkageInfo::none();
1413
1414 const Decl *OuterD = getOutermostFuncOrBlockContext(D);
1415 if (!OuterD || OuterD->isInvalidDecl())
1416 return LinkageInfo::none();
1417
1418 LinkageInfo LV;
1419 if (const auto *BD = dyn_cast<BlockDecl>(OuterD)) {
1420 if (!BD->getBlockManglingNumber())
1421 return LinkageInfo::none();
1422
1423 LV = getLVForClosure(BD->getDeclContext()->getRedeclContext(),
1424 BD->getBlockManglingContextDecl(), computation);
1425 } else {
1426 const auto *FD = cast<FunctionDecl>(OuterD);
1427 if (!FD->isInlined() &&
1428 !isTemplateInstantiation(FD->getTemplateSpecializationKind()))
1429 return LinkageInfo::none();
1430
1431 // If a function is hidden by -fvisibility-inlines-hidden option and
1432 // is not explicitly attributed as a hidden function,
1433 // we should not make static local variables in the function hidden.
1434 LV = getLVForDecl(FD, computation);
1436 !LV.isVisibilityExplicit() &&
1437 !Context.getLangOpts().VisibilityInlinesHiddenStaticLocalVar) {
1438 assert(cast<VarDecl>(D)->isStaticLocal());
1439 // If this was an implicitly hidden inline method, check again for
1440 // explicit visibility on the parent class, and use that for static locals
1441 // if present.
1442 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
1443 LV = getLVForDecl(MD->getParent(), computation);
1444 if (!LV.isVisibilityExplicit()) {
1445 Visibility globalVisibility =
1446 computation.isValueVisibility()
1447 ? Context.getLangOpts().getValueVisibilityMode()
1448 : Context.getLangOpts().getTypeVisibilityMode();
1449 return LinkageInfo(Linkage::VisibleNone, globalVisibility,
1450 /*visibilityExplicit=*/false);
1451 }
1452 }
1453 }
1455 return LinkageInfo::none();
1456 return LinkageInfo(Linkage::VisibleNone, LV.getVisibility(),
1458}
1459
1461 LVComputationKind computation,
1462 bool IgnoreVarTypeLinkage) {
1463 // Internal_linkage attribute overrides other considerations.
1464 if (D->hasAttr<InternalLinkageAttr>())
1465 return LinkageInfo::internal();
1466
1467 // Objective-C: treat all Objective-C declarations as having external
1468 // linkage.
1469 switch (D->getKind()) {
1470 default:
1471 break;
1472
1473 // Per C++ [basic.link]p2, only the names of objects, references,
1474 // functions, types, templates, namespaces, and values ever have linkage.
1475 //
1476 // Note that the name of a typedef, namespace alias, using declaration,
1477 // and so on are not the name of the corresponding type, namespace, or
1478 // declaration, so they do *not* have linkage.
1479 case Decl::ImplicitParam:
1480 case Decl::Label:
1481 case Decl::NamespaceAlias:
1482 case Decl::ParmVar:
1483 case Decl::Using:
1484 case Decl::UsingEnum:
1485 case Decl::UsingShadow:
1486 case Decl::UsingDirective:
1487 return LinkageInfo::none();
1488
1489 case Decl::EnumConstant:
1490 // C++ [basic.link]p4: an enumerator has the linkage of its enumeration.
1491 if (D->getASTContext().getLangOpts().CPlusPlus)
1492 return getLVForDecl(cast<EnumDecl>(D->getDeclContext()), computation);
1494
1495 case Decl::Typedef:
1496 case Decl::TypeAlias:
1497 // A typedef declaration has linkage if it gives a type a name for
1498 // linkage purposes.
1499 if (!cast<TypedefNameDecl>(D)
1500 ->getAnonDeclWithTypedefName(/*AnyRedecl*/true))
1501 return LinkageInfo::none();
1502 break;
1503
1504 case Decl::TemplateTemplateParm: // count these as external
1505 case Decl::NonTypeTemplateParm:
1506 case Decl::ObjCAtDefsField:
1507 case Decl::ObjCCategory:
1508 case Decl::ObjCCategoryImpl:
1509 case Decl::ObjCCompatibleAlias:
1510 case Decl::ObjCImplementation:
1511 case Decl::ObjCMethod:
1512 case Decl::ObjCProperty:
1513 case Decl::ObjCPropertyImpl:
1514 case Decl::ObjCProtocol:
1515 return getExternalLinkageFor(D);
1516
1517 case Decl::CXXRecord: {
1518 const auto *Record = cast<CXXRecordDecl>(D);
1519 if (Record->isLambda()) {
1520 if (Record->hasKnownLambdaInternalLinkage() ||
1521 !Record->getLambdaManglingNumber()) {
1522 // This lambda has no mangling number, so it's internal.
1523 return LinkageInfo::internal();
1524 }
1525
1526 return getLVForClosure(
1527 Record->getDeclContext()->getRedeclContext(),
1528 Record->getLambdaContextDecl(), computation);
1529 }
1530
1531 break;
1532 }
1533
1534 case Decl::TemplateParamObject: {
1535 // The template parameter object can be referenced from anywhere its type
1536 // and value can be referenced.
1537 auto *TPO = cast<TemplateParamObjectDecl>(D);
1538 LinkageInfo LV = getLVForType(*TPO->getType(), computation);
1539 LV.merge(getLVForValue(TPO->getValue(), computation));
1540 return LV;
1541 }
1542 }
1543
1544 // Handle linkage for namespace-scope names.
1546 return getLVForNamespaceScopeDecl(D, computation, IgnoreVarTypeLinkage);
1547
1548 // C++ [basic.link]p5:
1549 // In addition, a member function, static data member, a named
1550 // class or enumeration of class scope, or an unnamed class or
1551 // enumeration defined in a class-scope typedef declaration such
1552 // that the class or enumeration has the typedef name for linkage
1553 // purposes (7.1.3), has external linkage if the name of the class
1554 // has external linkage.
1555 if (D->getDeclContext()->isRecord())
1556 return getLVForClassMember(D, computation, IgnoreVarTypeLinkage);
1557
1558 // C++ [basic.link]p6:
1559 // The name of a function declared in block scope and the name of
1560 // an object declared by a block scope extern declaration have
1561 // linkage. If there is a visible declaration of an entity with
1562 // linkage having the same name and type, ignoring entities
1563 // declared outside the innermost enclosing namespace scope, the
1564 // block scope declaration declares that same entity and receives
1565 // the linkage of the previous declaration. If there is more than
1566 // one such matching entity, the program is ill-formed. Otherwise,
1567 // if no matching entity is found, the block scope entity receives
1568 // external linkage.
1569 if (D->getDeclContext()
1572 return getLVForLocalDecl(D, computation);
1573
1574 // C++ [basic.link]p6:
1575 // Names not covered by these rules have no linkage.
1576 return LinkageInfo::none();
1577}
1578
1579/// getLVForDecl - Get the linkage and visibility for the given declaration.
1581 LVComputationKind computation) {
1582 // Internal_linkage attribute overrides other considerations.
1583 if (D->hasAttr<InternalLinkageAttr>())
1584 return LinkageInfo::internal();
1585
1586 if (computation.IgnoreAllVisibility && D->hasCachedLinkage())
1587 return LinkageInfo(D->getCachedLinkage(), DefaultVisibility, false);
1588
1589 if (std::optional<LinkageInfo> LI = lookup(D, computation))
1590 return *LI;
1591
1592 LinkageInfo LV = computeLVForDecl(D, computation);
1593 if (D->hasCachedLinkage())
1594 assert(D->getCachedLinkage() == LV.getLinkage());
1595
1597 cache(D, computation, LV);
1598
1599#ifndef NDEBUG
1600 // In C (because of gnu inline) and in c++ with microsoft extensions an
1601 // static can follow an extern, so we can have two decls with different
1602 // linkages.
1603 const LangOptions &Opts = D->getASTContext().getLangOpts();
1604 if (!Opts.CPlusPlus || Opts.MicrosoftExt)
1605 return LV;
1606
1607 // We have just computed the linkage for this decl. By induction we know
1608 // that all other computed linkages match, check that the one we just
1609 // computed also does.
1610 // We can't assume the redecl chain is well formed at this point,
1611 // so keep track of already visited declarations.
1612 for (llvm::SmallPtrSet<const Decl *, 4> AlreadyVisited{D}; /**/; /**/) {
1613 D = cast<NamedDecl>(const_cast<NamedDecl *>(D)->getNextRedeclarationImpl());
1614 if (!AlreadyVisited.insert(D).second)
1615 break;
1616 if (D->isInvalidDecl())
1617 continue;
1618 if (auto OldLinkage = D->getCachedLinkage();
1619 OldLinkage != Linkage::Invalid) {
1620 assert(LV.getLinkage() == OldLinkage);
1621 break;
1622 }
1623 }
1624#endif
1625
1626 return LV;
1627}
1628
1638
1640 if (isa<NamespaceDecl>(this))
1641 // Namespaces never have module linkage. It is the entities within them
1642 // that [may] do.
1643 return nullptr;
1644
1645 Module *M = getOwningModule();
1646 if (!M)
1647 return nullptr;
1648
1649 switch (M->Kind) {
1651 // Module map modules have no special linkage semantics.
1652 return nullptr;
1653
1658 return M;
1659
1663 // The global module shouldn't change the linkage.
1664 return nullptr;
1665
1667 // The private module fragment is part of its containing module for linkage
1668 // purposes.
1669 return M->Parent;
1670 }
1671
1672 llvm_unreachable("unknown module kind");
1673}
1674
1675void NamedDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
1676 Name.print(OS, Policy);
1677}
1678
1679void NamedDecl::printName(raw_ostream &OS) const {
1680 printName(OS, getASTContext().getPrintingPolicy());
1681}
1682
1684 std::string QualName;
1685 llvm::raw_string_ostream OS(QualName);
1686 printQualifiedName(OS, getASTContext().getPrintingPolicy());
1687 return QualName;
1688}
1689
1690void NamedDecl::printQualifiedName(raw_ostream &OS) const {
1691 printQualifiedName(OS, getASTContext().getPrintingPolicy());
1692}
1693
1695 const PrintingPolicy &P) const {
1696 if (getDeclContext()->isFunctionOrMethod()) {
1697 // We do not print '(anonymous)' for function parameters without name.
1698 printName(OS, P);
1699 return;
1700 }
1702 if (getDeclName()) {
1703 printName(OS, P);
1704 } else {
1705 // Give the printName override a chance to pick a different name before we
1706 // fall back to "(anonymous)".
1707 SmallString<64> NameBuffer;
1708 llvm::raw_svector_ostream NameOS(NameBuffer);
1709 printName(NameOS, P);
1710 if (NameBuffer.empty())
1711 OS << "(anonymous)";
1712 else
1713 OS << NameBuffer;
1714 }
1715}
1716
1717void NamedDecl::printNestedNameSpecifier(raw_ostream &OS) const {
1718 printNestedNameSpecifier(OS, getASTContext().getPrintingPolicy());
1719}
1720
1722 const PrintingPolicy &P) const {
1723 const DeclContext *Ctx = getDeclContext();
1724
1725 // For ObjC methods and properties, look through categories and use the
1726 // interface as context.
1727 if (auto *MD = dyn_cast<ObjCMethodDecl>(this)) {
1728 if (auto *ID = MD->getClassInterface())
1729 Ctx = ID;
1730 } else if (auto *PD = dyn_cast<ObjCPropertyDecl>(this)) {
1731 if (auto *MD = PD->getGetterMethodDecl())
1732 if (auto *ID = MD->getClassInterface())
1733 Ctx = ID;
1734 } else if (auto *ID = dyn_cast<ObjCIvarDecl>(this)) {
1735 if (auto *CI = ID->getContainingInterface())
1736 Ctx = CI;
1737 }
1738
1739 if (Ctx->isFunctionOrMethod())
1740 return;
1741
1742 using ContextsTy = SmallVector<const DeclContext *, 8>;
1743 ContextsTy Contexts;
1744
1745 // Collect named contexts.
1746 DeclarationName NameInScope = getDeclName();
1747 for (; Ctx; Ctx = Ctx->getParent()) {
1748 if (P.Callbacks && P.Callbacks->isScopeVisible(Ctx))
1749 continue;
1750
1751 // Suppress anonymous namespace if requested.
1753 cast<NamespaceDecl>(Ctx)->isAnonymousNamespace())
1754 continue;
1755
1756 // Suppress inline namespace if it doesn't make the result ambiguous.
1757 if (Ctx->isInlineNamespace() && NameInScope) {
1759 llvm::to_underlying(
1762 llvm::to_underlying(
1764 cast<NamespaceDecl>(Ctx)->isRedundantInlineQualifierFor(
1765 NameInScope))) {
1766 continue;
1767 }
1768 }
1769
1770 // Suppress transparent contexts like export or HLSLBufferDecl context
1771 if (Ctx->isTransparentContext())
1772 continue;
1773
1774 // Skip non-named contexts such as linkage specifications and ExportDecls.
1775 const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx);
1776 if (!ND)
1777 continue;
1778
1779 Contexts.push_back(Ctx);
1780 NameInScope = ND->getDeclName();
1781 }
1782
1783 for (const DeclContext *DC : llvm::reverse(Contexts)) {
1784 if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1785 OS << Spec->getName();
1786 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1787 printTemplateArgumentList(
1788 OS, TemplateArgs.asArray(), P,
1789 Spec->getSpecializedTemplate()->getTemplateParameters());
1790 } else if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) {
1791 if (ND->isAnonymousNamespace()) {
1792 OS << (P.MSVCFormatting ? "`anonymous namespace\'"
1793 : "(anonymous namespace)");
1794 }
1795 else
1796 OS << *ND;
1797 } else if (const auto *RD = llvm::dyn_cast<RecordDecl>(DC)) {
1799 // As part of a scope we want to print anonymous names as:
1800 // ..::(anonymous struct)::..
1801 //
1802 // I.e., suppress tag locations, suppress leading keyword, *don't*
1803 // suppress tag in name
1804 Copy.SuppressTagKeyword = true;
1805 Copy.SuppressTagKeywordInAnonNames = false;
1806 Copy.AnonymousTagNameStyle =
1807 llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
1808 RD->printName(OS, Copy);
1809 } else if (const auto *FD = dyn_cast<FunctionDecl>(DC)) {
1810 const FunctionProtoType *FT = nullptr;
1811 if (FD->hasWrittenPrototype())
1812 FT = dyn_cast<FunctionProtoType>(FD->getType()->castAs<FunctionType>());
1813
1814 OS << *FD << '(';
1815 if (FT) {
1816 unsigned NumParams = FD->getNumParams();
1817 for (unsigned i = 0; i < NumParams; ++i) {
1818 if (i)
1819 OS << ", ";
1820 OS << FD->getParamDecl(i)->getType().stream(P);
1821 }
1822
1823 if (FT->isVariadic()) {
1824 if (NumParams > 0)
1825 OS << ", ";
1826 OS << "...";
1827 }
1828 }
1829 OS << ')';
1830 } else if (const auto *ED = dyn_cast<EnumDecl>(DC)) {
1831 // C++ [dcl.enum]p10: Each enum-name and each unscoped
1832 // enumerator is declared in the scope that immediately contains
1833 // the enum-specifier. Each scoped enumerator is declared in the
1834 // scope of the enumeration.
1835 // For the case of unscoped enumerator, do not include in the qualified
1836 // name any information about its enum enclosing scope, as its visibility
1837 // is global.
1838 if (ED->isScoped())
1839 OS << *ED;
1840 else
1841 continue;
1842 } else {
1843 OS << *cast<NamedDecl>(DC);
1844 }
1845 OS << "::";
1846 }
1847}
1848
1850 const PrintingPolicy &Policy,
1851 bool Qualified) const {
1852 if (Qualified)
1853 printQualifiedName(OS, Policy);
1854 else
1855 printName(OS, Policy);
1856}
1857
1858template<typename T> static bool isRedeclarableImpl(Redeclarable<T> *) {
1859 return true;
1860}
1861static bool isRedeclarableImpl(...) { return false; }
1863 switch (K) {
1864#define DECL(Type, Base) \
1865 case Decl::Type: \
1866 return isRedeclarableImpl((Type##Decl *)nullptr);
1867#define ABSTRACT_DECL(DECL)
1868#include "clang/AST/DeclNodes.inc"
1869 }
1870 llvm_unreachable("unknown decl kind");
1871}
1872
1874 bool IsKnownNewer) const {
1875 assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
1876
1877 // Never replace one imported declaration with another; we need both results
1878 // when re-exporting.
1879 if (OldD->isFromASTFile() && isFromASTFile())
1880 return false;
1881
1882 // A kind mismatch implies that the declaration is not replaced.
1883 if (OldD->getKind() != getKind())
1884 return false;
1885
1886 // For method declarations, we never replace. (Why?)
1887 if (isa<ObjCMethodDecl>(this))
1888 return false;
1889
1890 // For parameters, pick the newer one. This is either an error or (in
1891 // Objective-C) permitted as an extension.
1892 if (isa<ParmVarDecl>(this))
1893 return true;
1894
1895 // Inline namespaces can give us two declarations with the same
1896 // name and kind in the same scope but different contexts; we should
1897 // keep both declarations in this case.
1898 if (!this->getDeclContext()->getRedeclContext()->Equals(
1899 OldD->getDeclContext()->getRedeclContext()))
1900 return false;
1901
1902 // Using declarations can be replaced if they import the same name from the
1903 // same context.
1904 if (const auto *UD = dyn_cast<UsingDecl>(this))
1905 return UD->getQualifier().getCanonical() ==
1906
1907 cast<UsingDecl>(OldD)->getQualifier().getCanonical();
1908 if (const auto *UUVD = dyn_cast<UnresolvedUsingValueDecl>(this))
1909 return UUVD->getQualifier().getCanonical() ==
1910 cast<UnresolvedUsingValueDecl>(OldD)->getQualifier().getCanonical();
1911
1912 if (isRedeclarable(getKind())) {
1913 if (getCanonicalDecl() != OldD->getCanonicalDecl())
1914 return false;
1915
1916 if (IsKnownNewer)
1917 return true;
1918
1919 // Check whether this is actually newer than OldD. We want to keep the
1920 // newer declaration. This loop will usually only iterate once, because
1921 // OldD is usually the previous declaration.
1922 for (const auto *D : redecls()) {
1923 if (D == OldD)
1924 break;
1925
1926 // If we reach the canonical declaration, then OldD is not actually older
1927 // than this one.
1928 //
1929 // FIXME: In this case, we should not add this decl to the lookup table.
1930 if (D->isCanonicalDecl())
1931 return false;
1932 }
1933
1934 // It's a newer declaration of the same kind of declaration in the same
1935 // scope: we want this decl instead of the existing one.
1936 return true;
1937 }
1938
1939 // In all other cases, we need to keep both declarations in case they have
1940 // different visibility. Any attempt to use the name will result in an
1941 // ambiguity if more than one is visible.
1942 return false;
1943}
1944
1946 switch (getFormalLinkage()) {
1947 case Linkage::Invalid:
1948 llvm_unreachable("Linkage hasn't been computed!");
1949 case Linkage::None:
1950 return false;
1951 case Linkage::Internal:
1952 return true;
1955 llvm_unreachable("Non-formal linkage is not allowed here!");
1956 case Linkage::Module:
1957 case Linkage::External:
1958 return true;
1959 }
1960 llvm_unreachable("Unhandled Linkage enum");
1961}
1962
1963NamedDecl *NamedDecl::getUnderlyingDeclImpl() {
1964 NamedDecl *ND = this;
1965 if (auto *UD = dyn_cast<UsingShadowDecl>(ND))
1966 ND = UD->getTargetDecl();
1967
1968 if (auto *AD = dyn_cast<ObjCCompatibleAliasDecl>(ND))
1969 return AD->getClassInterface();
1970
1971 if (auto *AD = dyn_cast<NamespaceAliasDecl>(ND))
1972 return AD->getNamespace();
1973
1974 return ND;
1975}
1976
1978 if (!isCXXClassMember())
1979 return false;
1980
1981 const NamedDecl *D = this;
1982 if (isa<UsingShadowDecl>(D))
1983 D = cast<UsingShadowDecl>(D)->getTargetDecl();
1984
1986 return true;
1987 if (const auto *MD = dyn_cast_if_present<CXXMethodDecl>(D->getAsFunction()))
1988 return MD->isInstance();
1989 return false;
1990}
1991
1992//===----------------------------------------------------------------------===//
1993// DeclaratorDecl Implementation
1994//===----------------------------------------------------------------------===//
1995
1996template <typename DeclT>
1999 decl->getTemplateParameterLists();
2000 !TPLs.empty())
2001 return TPLs.front()->getTemplateLoc();
2002 return decl->getInnerLocStart();
2003}
2004
2007 if (TSI) return TSI->getTypeLoc().getBeginLoc();
2008 return SourceLocation();
2009}
2010
2013 if (TSI) return TSI->getTypeLoc().getEndLoc();
2014 return SourceLocation();
2015}
2016
2018 if (QualifierLoc) {
2019 // Make sure the extended decl info is allocated.
2020 if (!hasExtInfo()) {
2021 // Save (non-extended) type source info pointer.
2022 auto *savedTInfo = cast<TypeSourceInfo *>(DeclInfo);
2023 // Allocate external info struct.
2024 DeclInfo = new (getASTContext()) ExtInfo;
2025 // Restore savedTInfo into (extended) decl info.
2026 getExtInfo()->TInfo = savedTInfo;
2027 }
2028 // Set qualifier info.
2029 getExtInfo()->QualifierLoc = QualifierLoc;
2030 } else if (hasExtInfo()) {
2031 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
2032 getExtInfo()->QualifierLoc = QualifierLoc;
2033 }
2034}
2035
2037 assert(AC);
2038 // Make sure the extended decl info is allocated.
2039 if (!hasExtInfo()) {
2040 // Save (non-extended) type source info pointer.
2041 auto *savedTInfo = cast<TypeSourceInfo *>(DeclInfo);
2042 // Allocate external info struct.
2043 DeclInfo = new (getASTContext()) ExtInfo;
2044 // Restore savedTInfo into (extended) decl info.
2045 getExtInfo()->TInfo = savedTInfo;
2046 }
2047 // Set requires clause info.
2048 getExtInfo()->TrailingRequiresClause = AC;
2049}
2050
2053 assert(!TPLists.empty());
2054 // Make sure the extended decl info is allocated.
2055 if (!hasExtInfo()) {
2056 // Save (non-extended) type source info pointer.
2057 auto *savedTInfo = cast<TypeSourceInfo *>(DeclInfo);
2058 // Allocate external info struct.
2059 DeclInfo = new (getASTContext()) ExtInfo;
2060 // Restore savedTInfo into (extended) decl info.
2061 getExtInfo()->TInfo = savedTInfo;
2062 }
2063 // Set the template parameter lists info.
2064 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
2065}
2066
2070
2072 SourceLocation RangeEnd = getLocation();
2073 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
2074 // If the declaration has no name or the type extends past the name take the
2075 // end location of the type.
2076 if (!getDeclName() || TInfo->getType().hasPostfixDeclaratorSyntax())
2077 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
2078 }
2079 return SourceRange(getOuterLocStart(), RangeEnd);
2080}
2081
2084 // Free previous template parameters (if any).
2085 if (NumTemplParamLists > 0) {
2086 Context.Deallocate(TemplParamLists);
2087 TemplParamLists = nullptr;
2089 }
2090 // Set info on matched template parameter lists (if any).
2091 if (!TPLists.empty()) {
2092 TemplParamLists = new (Context) TemplateParameterList *[TPLists.size()];
2093 NumTemplParamLists = TPLists.size();
2094 llvm::copy(TPLists, TemplParamLists);
2095 }
2096}
2097
2098//===----------------------------------------------------------------------===//
2099// VarDecl Implementation
2100//===----------------------------------------------------------------------===//
2101
2103 switch (SC) {
2104 case SC_None: break;
2105 case SC_Auto: return "auto";
2106 case SC_Extern: return "extern";
2107 case SC_PrivateExtern: return "__private_extern__";
2108 case SC_Register: return "register";
2109 case SC_Static: return "static";
2110 }
2111
2112 llvm_unreachable("Invalid storage class");
2113}
2114
2116 SourceLocation StartLoc, SourceLocation IdLoc,
2117 const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
2118 StorageClass SC)
2119 : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc),
2121 static_assert(sizeof(VarDeclBitfields) <= sizeof(unsigned),
2122 "VarDeclBitfields too large!");
2123 static_assert(sizeof(ParmVarDeclBitfields) <= sizeof(unsigned),
2124 "ParmVarDeclBitfields too large!");
2125 static_assert(sizeof(NonParmVarDeclBitfields) <= sizeof(unsigned),
2126 "NonParmVarDeclBitfields too large!");
2127 AllBits = 0;
2128 VarDeclBits.SClass = SC;
2129 // Everything else is implicitly initialized to false.
2130}
2131
2133 SourceLocation IdL, const IdentifierInfo *Id,
2135 return new (C, DC) VarDecl(Var, C, DC, StartL, IdL, Id, T, TInfo, S);
2136}
2137
2139 return new (C, ID)
2140 VarDecl(Var, C, nullptr, SourceLocation(), SourceLocation(), nullptr,
2141 QualType(), nullptr, SC_None);
2142}
2143
2145 assert(isLegalForVariable(SC));
2146 VarDeclBits.SClass = SC;
2147}
2148
2150 switch (VarDeclBits.TSCSpec) {
2151 case TSCS_unspecified:
2152 if (!hasAttr<ThreadAttr>() &&
2153 !(getASTContext().getLangOpts().OpenMPUseTLS &&
2154 getASTContext().getTargetInfo().isTLSSupported() &&
2156 return TLS_None;
2157 return ((getASTContext().getLangOpts().isCompatibleWithMSVC(
2160 ? TLS_Dynamic
2161 : TLS_Static;
2162 case TSCS___thread: // Fall through.
2163 case TSCS__Thread_local:
2164 return TLS_Static;
2165 case TSCS_thread_local:
2166 return TLS_Dynamic;
2167 }
2168 llvm_unreachable("Unknown thread storage class specifier!");
2169}
2170
2172 if (const Expr *Init = getInit()) {
2173 SourceLocation InitEnd = Init->getEndLoc();
2174 // If Init is implicit, ignore its source range and fallback on
2175 // DeclaratorDecl::getSourceRange() to handle postfix elements.
2176 if (InitEnd.isValid() && InitEnd != getLocation())
2177 return SourceRange(getOuterLocStart(), InitEnd);
2178 }
2180}
2181
2182template<typename T>
2184 // C++ [dcl.link]p1: All function types, function names with external linkage,
2185 // and variable names with external linkage have a language linkage.
2186 if (!D.hasExternalFormalLinkage())
2187 return NoLanguageLinkage;
2188
2189 // Language linkage is a C++ concept, but saying that everything else in C has
2190 // C language linkage fits the implementation nicely.
2191 if (!D.getASTContext().getLangOpts().CPlusPlus)
2192 return CLanguageLinkage;
2193
2194 // C++ [dcl.link]p4: A C language linkage is ignored in determining the
2195 // language linkage of the names of class members and the function type of
2196 // class member functions.
2197 const DeclContext *DC = D.getDeclContext();
2198 if (DC->isRecord())
2199 return CXXLanguageLinkage;
2200
2201 // If the first decl is in an extern "C" context, any other redeclaration
2202 // will have C language linkage. If the first one is not in an extern "C"
2203 // context, we would have reported an error for any other decl being in one.
2205 return CLanguageLinkage;
2206 return CXXLanguageLinkage;
2207}
2208
2209template<typename T>
2210static bool isDeclExternC(const T &D) {
2211 // Since the context is ignored for class members, they can only have C++
2212 // language linkage or no language linkage.
2213 const DeclContext *DC = D.getDeclContext();
2214 if (DC->isRecord()) {
2215 assert(D.getASTContext().getLangOpts().CPlusPlus);
2216 return false;
2217 }
2218
2219 return D.getLanguageLinkage() == CLanguageLinkage;
2220}
2221
2225
2227 return isDeclExternC(*this);
2228}
2229
2233
2237
2239
2243 return DeclarationOnly;
2244
2245 // C++ [basic.def]p2:
2246 // A declaration is a definition unless [...] it contains the 'extern'
2247 // specifier or a linkage-specification and neither an initializer [...],
2248 // it declares a non-inline static data member in a class declaration [...],
2249 // it declares a static data member outside a class definition and the variable
2250 // was defined within the class with the constexpr specifier [...],
2251 // C++1y [temp.expl.spec]p15:
2252 // An explicit specialization of a static data member or an explicit
2253 // specialization of a static data member template is a definition if the
2254 // declaration includes an initializer; otherwise, it is a declaration.
2255 //
2256 // FIXME: How do you declare (but not define) a partial specialization of
2257 // a static data member template outside the containing class?
2258 if (isStaticDataMember()) {
2259 if (isOutOfLine() &&
2260 !(getCanonicalDecl()->isInline() &&
2262 (hasInit() ||
2263 // If the first declaration is out-of-line, this may be an
2264 // instantiation of an out-of-line partial specialization of a variable
2265 // template for which we have not yet instantiated the initializer.
2271 return Definition;
2272 if (!isOutOfLine() && isInline())
2273 return Definition;
2274 return DeclarationOnly;
2275 }
2276 // C99 6.7p5:
2277 // A definition of an identifier is a declaration for that identifier that
2278 // [...] causes storage to be reserved for that object.
2279 // Note: that applies for all non-file-scope objects.
2280 // C99 6.9.2p1:
2281 // If the declaration of an identifier for an object has file scope and an
2282 // initializer, the declaration is an external definition for the identifier
2283 if (hasInit())
2284 return Definition;
2285
2286 if (hasDefiningAttr())
2287 return Definition;
2288
2289 if (const auto *SAA = getAttr<SelectAnyAttr>())
2290 if (!SAA->isInherited())
2291 return Definition;
2292
2293 // A variable template specialization (other than a static data member
2294 // template or an explicit specialization) is a declaration until we
2295 // instantiate its initializer.
2296 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(this)) {
2297 if (VTSD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
2299 !VTSD->IsCompleteDefinition)
2300 return DeclarationOnly;
2301 }
2302
2303 if (hasExternalStorage())
2304 return DeclarationOnly;
2305
2306 // [dcl.link] p7:
2307 // A declaration directly contained in a linkage-specification is treated
2308 // as if it contains the extern specifier for the purpose of determining
2309 // the linkage of the declared name and whether it is a definition.
2310 if (isSingleLineLanguageLinkage(*this))
2311 return DeclarationOnly;
2312
2313 // C99 6.9.2p2:
2314 // A declaration of an object that has file scope without an initializer,
2315 // and without a storage class specifier or the scs 'static', constitutes
2316 // a tentative definition.
2317 // No such thing in C++.
2318 if (!C.getLangOpts().CPlusPlus && isFileVarDecl())
2319 return TentativeDefinition;
2320
2321 // What's left is (in C, block-scope) declarations without initializers or
2322 // external storage. These are definitions.
2323 return Definition;
2324}
2325
2329 return nullptr;
2330
2331 VarDecl *LastTentative = nullptr;
2332
2333 // Loop through the declaration chain, starting with the most recent.
2335 Decl = Decl->getPreviousDecl()) {
2336 Kind = Decl->isThisDeclarationADefinition();
2337 if (Kind == Definition)
2338 return nullptr;
2339 // Record the first (most recent) TentativeDefinition that is encountered.
2340 if (Kind == TentativeDefinition && !LastTentative)
2341 LastTentative = Decl;
2342 }
2343
2344 return LastTentative;
2345}
2346
2349 for (auto *I : First->redecls()) {
2350 if (I->isThisDeclarationADefinition(C) == Definition)
2351 return I;
2352 }
2353 return nullptr;
2354}
2355
2358
2359 const VarDecl *First = getFirstDecl();
2360 for (auto *I : First->redecls()) {
2361 Kind = std::max(Kind, I->isThisDeclarationADefinition(C));
2362 if (Kind == Definition)
2363 break;
2364 }
2365
2366 return Kind;
2367}
2368
2369const Expr *VarDecl::getAnyInitializer(const VarDecl *&D) const {
2370 for (auto *I : redecls()) {
2371 if (auto Expr = I->getInit()) {
2372 D = I;
2373 return Expr;
2374 }
2375 }
2376 return nullptr;
2377}
2378
2379bool VarDecl::hasInit() const {
2380 if (auto *P = dyn_cast<ParmVarDecl>(this))
2381 if (P->hasUnparsedDefaultArg() || P->hasUninstantiatedDefaultArg())
2382 return false;
2383
2384 if (auto *Eval = getEvaluatedStmt())
2385 return Eval->Value.isValid();
2386
2387 return !Init.isNull();
2388}
2389
2391 if (!hasInit())
2392 return nullptr;
2393
2394 if (auto *S = dyn_cast<Stmt *>(Init))
2395 return cast<Expr>(S);
2396
2397 auto *Eval = getEvaluatedStmt();
2398
2399 return cast<Expr>(Eval->Value.get(
2400 Eval->Value.isOffset() ? getASTContext().getExternalSource() : nullptr));
2401}
2402
2404 if (auto *ES = Init.dyn_cast<EvaluatedStmt *>())
2405 return ES->Value.getAddressOfPointer(getASTContext().getExternalSource());
2406
2407 return Init.getAddrOfPtr1();
2408}
2409
2411 VarDecl *Def = nullptr;
2412 for (auto *I : redecls()) {
2413 if (I->hasInit())
2414 return I;
2415
2416 if (I->isThisDeclarationADefinition()) {
2417 if (isStaticDataMember())
2418 return I;
2419 Def = I;
2420 }
2421 }
2422 return Def;
2423}
2424
2426 if (!hasInit())
2427 return false;
2428
2430 if (!ES->CheckedForSideEffects) {
2431 const Expr *E = getInit();
2432 ES->HasSideEffects =
2434 // We can get a value-dependent initializer during error recovery.
2435 (E->isValueDependent() || getType()->isDependentType() ||
2436 !evaluateValue());
2437 ES->CheckedForSideEffects = true;
2438 }
2439 return ES->HasSideEffects;
2440}
2441
2443 if (Decl::isOutOfLine())
2444 return true;
2445
2446 if (!isStaticDataMember())
2447 return false;
2448
2449 // If this static data member was instantiated from a static data member of
2450 // a class template, check whether that static data member was defined
2451 // out-of-line.
2453 return VD->isOutOfLine();
2454
2455 return false;
2456}
2457
2459 if (auto *Eval = dyn_cast_if_present<EvaluatedStmt *>(Init)) {
2460 Eval->~EvaluatedStmt();
2461 getASTContext().Deallocate(Eval);
2462 }
2463
2464 Init = I;
2465}
2466
2468 const LangOptions &Lang = C.getLangOpts();
2469
2470 // OpenCL permits const integral variables to be used in constant
2471 // expressions, like in C++98.
2472 if (!Lang.CPlusPlus && !Lang.OpenCL && !Lang.C23)
2473 return false;
2474
2475 // Function parameters are never usable in constant expressions.
2476 if (isa<ParmVarDecl>(this))
2477 return false;
2478
2479 // The values of weak variables are never usable in constant expressions.
2480 if (isWeak())
2481 return false;
2482
2483 // In C++11, any variable of reference type can be used in a constant
2484 // expression if it is initialized by a constant expression.
2485 if (Lang.CPlusPlus11 && getType()->isReferenceType())
2486 return true;
2487
2488 // Only const objects can be used in constant expressions in C++. C++98 does
2489 // not require the variable to be non-volatile, but we consider this to be a
2490 // defect.
2491 if (!getType().isConstant(C) || getType().isVolatileQualified())
2492 return false;
2493
2494 // In C++, but not in C, const, non-volatile variables of integral or
2495 // enumeration types can be used in constant expressions.
2496 if (getType()->isIntegralOrEnumerationType() && !Lang.C23)
2497 return true;
2498
2499 // C23 6.6p7: An identifier that is:
2500 // ...
2501 // - declared with storage-class specifier constexpr and has an object type,
2502 // is a named constant, ... such a named constant is a constant expression
2503 // with the type and value of the declared object.
2504 // Additionally, in C++11, non-volatile constexpr variables can be used in
2505 // constant expressions.
2506 return (Lang.CPlusPlus11 || Lang.C23) && isConstexpr();
2507}
2508
2510 // C++2a [expr.const]p3:
2511 // A variable is usable in constant expressions after its initializing
2512 // declaration is encountered...
2513 const VarDecl *DefVD = nullptr;
2514 const Expr *Init = getAnyInitializer(DefVD);
2515 if (!Init || Init->isValueDependent() || getType()->isDependentType())
2516 return false;
2517 // ... if it is a constexpr variable, or it is of reference type or of
2518 // const-qualified integral or enumeration type, ...
2519 if (!DefVD->mightBeUsableInConstantExpressions(Context))
2520 return false;
2521 // ... and its initializer is a constant initializer.
2522 if ((Context.getLangOpts().CPlusPlus || getLangOpts().C23) &&
2523 !DefVD->hasConstantInitialization())
2524 return false;
2525 // C++98 [expr.const]p1:
2526 // An integral constant-expression can involve only [...] const variables
2527 // or static data members of integral or enumeration types initialized with
2528 // [integer] constant expressions (dcl.init)
2529 if ((Context.getLangOpts().CPlusPlus || Context.getLangOpts().OpenCL) &&
2530 !Context.getLangOpts().CPlusPlus11 && !DefVD->hasICEInitializer(Context))
2531 return false;
2532 return true;
2533}
2534
2535/// Convert the initializer for this declaration to the elaborated EvaluatedStmt
2536/// form, which contains extra information on the evaluated value of the
2537/// initializer.
2539 auto *Eval = dyn_cast_if_present<EvaluatedStmt *>(Init);
2540 if (!Eval) {
2541 // Note: EvaluatedStmt contains an APValue, which usually holds
2542 // resources not allocated from the ASTContext. We need to do some
2543 // work to avoid leaking those, but we do so in VarDecl::evaluateValue
2544 // where we can detect whether there's anything to clean up or not.
2545 Eval = new (getASTContext()) EvaluatedStmt;
2546 Eval->Value = cast<Stmt *>(Init);
2547 Init = Eval;
2548 }
2549 return Eval;
2550}
2551
2553 return dyn_cast_if_present<EvaluatedStmt *>(Init);
2554}
2555
2557 return evaluateValueImpl(/*Notes=*/nullptr, hasConstantInitialization());
2558}
2559
2560const APValue *
2561VarDecl::evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> *Notes,
2562 bool IsConstantInitialization) const {
2564
2565 const auto *Init = getInit();
2566 assert(!Init->isValueDependent());
2567
2568 // We only produce notes indicating why an initializer is non-constant the
2569 // first time it is evaluated. FIXME: The notes won't always be emitted the
2570 // first time we try evaluation, so might not be produced at all.
2571 if (Eval->WasEvaluated)
2572 return Eval->Evaluated.isAbsent() ? nullptr : &Eval->Evaluated;
2573
2574 if (Eval->IsEvaluating) {
2575 // FIXME: Produce a diagnostic for self-initialization.
2576 return nullptr;
2577 }
2578
2579 Eval->IsEvaluating = true;
2580
2581 ASTContext &Ctx = getASTContext();
2582 Expr::EvalResult EStatus;
2583 EStatus.Diag = Notes;
2584 bool Result =
2585 Init->EvaluateAsInitializer(Ctx, this, EStatus, IsConstantInitialization);
2586 Eval->Evaluated = std::move(EStatus.Val);
2587
2588 // In C++, or in C23 if we're initialising a 'constexpr' variable, this isn't
2589 // a constant initializer if we produced notes. In that case, we can't keep
2590 // the result, because it may only be correct under the assumption that the
2591 // initializer is a constant context.
2592 if (IsConstantInitialization &&
2593 (Ctx.getLangOpts().CPlusPlus ||
2594 (isConstexpr() && Ctx.getLangOpts().C23)) &&
2595 EStatus.DiagEmitted)
2596 Result = false;
2597
2598 // Ensure the computed APValue is cleaned up later if evaluation succeeded,
2599 // or that it's empty (so that there's nothing to clean up) if evaluation
2600 // failed.
2601 if (!Result)
2602 Eval->Evaluated = APValue();
2603 else if (Eval->Evaluated.needsCleanup())
2604 Ctx.addDestruction(&Eval->Evaluated);
2605
2606 Eval->IsEvaluating = false;
2607 Eval->WasEvaluated = true;
2608
2609 return Result ? &Eval->Evaluated : nullptr;
2610}
2611
2613 if (EvaluatedStmt *Eval = getEvaluatedStmt();
2614 Eval && Eval->WasEvaluated && !Eval->Evaluated.isAbsent())
2615 return &Eval->Evaluated;
2616
2617 return nullptr;
2618}
2619
2620bool VarDecl::hasICEInitializer(const ASTContext &Context) const {
2621 const Expr *Init = getInit();
2622 assert(Init && "no initializer");
2623
2625 if (!Eval->CheckedForICEInit) {
2626 Eval->CheckedForICEInit = true;
2627 Eval->HasICEInit = Init->isIntegerConstantExpr(Context);
2628 }
2629 return Eval->HasICEInit;
2630}
2631
2633 // In C, all globals and constexpr variables should have constant
2634 // initialization. For constexpr variables in C check that initializer is a
2635 // constant initializer because they can be used in constant expressions.
2637 !isConstexpr())
2638 return true;
2639
2640 // In C++, it depends on whether the evaluation at the point of definition
2641 // was evaluatable as a constant initializer.
2642 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2643 return Eval->HasConstantInitialization;
2644
2645 return false;
2646}
2647
2651 // If we ask for the value before we know whether we have a constant
2652 // initializer, we can compute the wrong value (for example, due to
2653 // std::is_constant_evaluated()).
2654 assert(!Eval->WasEvaluated &&
2655 "already evaluated var value before checking for constant init");
2656 assert((getASTContext().getLangOpts().CPlusPlus ||
2658 "only meaningful in C++/C23");
2659
2660 assert(!getInit()->isValueDependent());
2661
2662 // Evaluate the initializer to check whether it's a constant expression.
2664 evaluateValueImpl(&Notes, true) && Notes.empty();
2665
2666 // If evaluation as a constant initializer failed, allow re-evaluation as a
2667 // non-constant initializer if we later find we want the value.
2668 if (!Eval->HasConstantInitialization)
2669 Eval->WasEvaluated = false;
2670
2671 return Eval->HasConstantInitialization;
2672}
2673
2675 return hasAttr<BlocksAttr>() && NonParmVarDeclBits.EscapingByref;
2676}
2677
2679 return hasAttr<BlocksAttr>() && !NonParmVarDeclBits.EscapingByref;
2680}
2681
2683 QualType T = getType();
2684 return T->isDependentType() || T->isUndeducedType() ||
2685 llvm::any_of(specific_attrs<AlignedAttr>(), [](const AlignedAttr *AA) {
2686 return AA->isAlignmentDependent();
2687 });
2688}
2689
2691 const VarDecl *VD = this;
2692
2693 // If this is an instantiated member, walk back to the template from which
2694 // it was instantiated.
2696 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
2698 while (auto *NewVD = VD->getInstantiatedFromStaticDataMember())
2699 VD = NewVD;
2700 }
2701 }
2702
2703 // If it's an instantiated variable template specialization, find the
2704 // template or partial specialization from which it was instantiated.
2705 if (auto *VDTemplSpec = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
2706 if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) {
2707 auto From = VDTemplSpec->getInstantiatedFrom();
2708 if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) {
2709 while (!VTD->isMemberSpecialization()) {
2710 auto *NewVTD = VTD->getInstantiatedFromMemberTemplate();
2711 if (!NewVTD)
2712 break;
2713 VTD = NewVTD;
2714 }
2715 return VTD->getTemplatedDecl();
2716 }
2717 if (auto *VTPSD =
2718 From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
2719 while (!VTPSD->isMemberSpecialization()) {
2720 auto *NewVTPSD = VTPSD->getInstantiatedFromMember();
2721 if (!NewVTPSD)
2722 break;
2723 VTPSD = NewVTPSD;
2724 }
2725 return VTPSD;
2726 }
2727 }
2728 }
2729
2730 if (VD == this)
2731 return nullptr;
2732 return const_cast<VarDecl *>(VD);
2733}
2734
2737 return cast<VarDecl>(MSI->getInstantiatedFrom());
2738
2739 return nullptr;
2740}
2741
2743 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2744 return Spec->getSpecializationKind();
2745
2747 return MSI->getTemplateSpecializationKind();
2748
2749 return TSK_Undeclared;
2750}
2751
2755 return MSI->getTemplateSpecializationKind();
2756
2757 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2758 return Spec->getSpecializationKind();
2759
2760 return TSK_Undeclared;
2761}
2762
2764 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2765 return Spec->getPointOfInstantiation();
2766
2768 return MSI->getPointOfInstantiation();
2769
2770 return SourceLocation();
2771}
2772
2774 return dyn_cast_if_present<VarTemplateDecl *>(
2775 getASTContext().getTemplateOrSpecializationInfo(this));
2776}
2777
2781
2783 const auto &LangOpts = getASTContext().getLangOpts();
2784 // In CUDA mode without relocatable device code, variables of form 'extern
2785 // __shared__ Foo foo[]' are pointers to the base of the GPU core's shared
2786 // memory pool. These are never undefined variables, even if they appear
2787 // inside of an anon namespace or static function.
2788 //
2789 // With CUDA relocatable device code enabled, these variables don't get
2790 // special handling; they're treated like regular extern variables.
2791 if (LangOpts.CUDA && !LangOpts.GPURelocatableDeviceCode &&
2794 return true;
2795
2796 return hasDefinition();
2797}
2798
2799bool VarDecl::isNoDestroy(const ASTContext &Ctx) const {
2800 if (!hasGlobalStorage())
2801 return false;
2803 return true;
2805 return false;
2806
2808 RSDKind K = Ctx.getLangOpts().getRegisterStaticDestructors();
2809 return K == RSDKind::None ||
2810 (K == RSDKind::ThreadLocal && getTLSKind() == TLS_None);
2811}
2812
2815 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2816 if (Eval->HasConstantDestruction)
2817 return QualType::DK_none;
2818
2819 if (isNoDestroy(Ctx))
2820 return QualType::DK_none;
2821
2822 return getType().isDestructedType();
2823}
2824
2826 assert(hasInit() && "Expect initializer to check for flexible array init");
2827 auto *D = getType()->getAsRecordDecl();
2828 if (!D || !D->hasFlexibleArrayMember())
2829 return false;
2830 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens());
2831 if (!List)
2832 return false;
2833 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1);
2834 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType());
2835 if (!InitTy)
2836 return false;
2837 return !InitTy->isZeroSize();
2838}
2839
2841 assert(hasInit() && "Expect initializer to check for flexible array init");
2842 auto *RD = getType()->getAsRecordDecl();
2843 if (!RD || !RD->hasFlexibleArrayMember())
2844 return CharUnits::Zero();
2845 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens());
2846 if (!List || List->getNumInits() == 0)
2847 return CharUnits::Zero();
2848 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1);
2849 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType());
2850 if (!InitTy)
2851 return CharUnits::Zero();
2852 CharUnits FlexibleArraySize = Ctx.getTypeSizeInChars(InitTy);
2853 const ASTRecordLayout &RL = Ctx.getASTRecordLayout(RD);
2854 CharUnits FlexibleArrayOffset =
2856 if (FlexibleArrayOffset + FlexibleArraySize < RL.getSize())
2857 return CharUnits::Zero();
2858 return FlexibleArrayOffset + FlexibleArraySize - RL.getSize();
2859}
2860
2862 if (isStaticDataMember())
2863 // FIXME: Remove ?
2864 // return getASTContext().getInstantiatedFromStaticDataMember(this);
2865 return dyn_cast_if_present<MemberSpecializationInfo *>(
2866 getASTContext().getTemplateOrSpecializationInfo(this));
2867 return nullptr;
2868}
2869
2871 SourceLocation PointOfInstantiation) {
2872 assert((isa<VarTemplateSpecializationDecl>(this) ||
2874 "not a variable or static data member template specialization");
2875
2877 dyn_cast<VarTemplateSpecializationDecl>(this)) {
2878 Spec->setSpecializationKind(TSK);
2879 if (TSK != TSK_ExplicitSpecialization &&
2880 PointOfInstantiation.isValid() &&
2881 Spec->getPointOfInstantiation().isInvalid()) {
2882 Spec->setPointOfInstantiation(PointOfInstantiation);
2884 L->InstantiationRequested(this);
2885 }
2887 MSI->setTemplateSpecializationKind(TSK);
2888 if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() &&
2889 MSI->getPointOfInstantiation().isInvalid()) {
2890 MSI->setPointOfInstantiation(PointOfInstantiation);
2892 L->InstantiationRequested(this);
2893 }
2894 }
2895}
2896
2897void
2900 assert(getASTContext().getTemplateOrSpecializationInfo(this).isNull() &&
2901 "Previous template or instantiation?");
2903}
2904
2906 QualType Type = getType();
2907 if (Type.hasAddressSpace())
2908 return;
2909 if (Type->isDependentType())
2910 return;
2911 if (Type->isSamplerT() || Type->isVoidType())
2912 return;
2913 assert(isa<ParmVarDecl>(this) || isa<ImplicitParamDecl>(this)
2914 ? !Type->isArrayType()
2916 Type = Ctxt.getAddrSpaceQualType(Type, AS);
2917 // Apply any qualifiers (including address space) from the array type to
2918 // the element type. This implements C99 6.7.3p8: "If the specification of
2919 // an array type includes any type qualifiers, the element type is so
2920 // qualified, not the array type."
2921 if (Type->isArrayType())
2922 Type = QualType(Ctxt.getAsArrayType(Type), 0);
2923 setType(Type);
2924}
2925
2927 assert(isa<ParmVarDecl>(this) || isa<ImplicitParamDecl>(this));
2928 if (Ctxt.getLangOpts().OpenCL)
2930}
2931
2932//===----------------------------------------------------------------------===//
2933// ParmVarDecl Implementation
2934//===----------------------------------------------------------------------===//
2935
2937 SourceLocation StartLoc, SourceLocation IdLoc,
2938 const IdentifierInfo *Id, QualType T,
2939 TypeSourceInfo *TInfo, StorageClass S,
2940 Expr *DefArg) {
2941 return new (C, DC) ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo,
2942 S, DefArg);
2943}
2944
2947 QualType T = TSI ? TSI->getType() : getType();
2948 if (const auto *DT = dyn_cast<DecayedType>(T))
2949 return DT->getOriginalType();
2950 return T;
2951}
2952
2954 return new (C, ID)
2955 ParmVarDecl(ParmVar, C, nullptr, SourceLocation(), SourceLocation(),
2956 nullptr, QualType(), nullptr, SC_None, nullptr);
2957}
2958
2960 if (!hasInheritedDefaultArg()) {
2961 SourceRange ArgRange = getDefaultArgRange();
2962 if (ArgRange.isValid())
2963 return SourceRange(getOuterLocStart(), ArgRange.getEnd());
2964 }
2965
2966 // DeclaratorDecl considers the range of postfix types as overlapping with the
2967 // declaration name, but this is not the case with parameters in ObjC methods.
2970
2972}
2973
2975 // ns_consumed only affects code generation in ARC
2977 return getASTContext().getLangOpts().ObjCAutoRefCount;
2978
2979 // FIXME: isParamDestroyedInCallee() should probably imply
2980 // isDestructedType()
2981 const auto *RT = getType()->getAsCanonical<RecordType>();
2982 if (RT && RT->getDecl()->getDefinitionOrSelf()->isParamDestroyedInCallee() &&
2983 getType().isDestructedType())
2984 return true;
2985
2986 return false;
2987}
2988
2990 assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!");
2991 assert(!hasUninstantiatedDefaultArg() &&
2992 "Default argument is not yet instantiated!");
2993
2994 Expr *Arg = getInit();
2995 if (auto *E = dyn_cast_if_present<FullExpr>(Arg))
2996 return E->getSubExpr();
2997
2998 return Arg;
2999}
3000
3002 ParmVarDeclBits.DefaultArgKind = DAK_Normal;
3003 Init = defarg;
3004}
3005
3007 switch (ParmVarDeclBits.DefaultArgKind) {
3008 case DAK_None:
3009 case DAK_Unparsed:
3010 // Nothing we can do here.
3011 return SourceRange();
3012
3013 case DAK_Uninstantiated:
3015
3016 case DAK_Normal:
3017 if (const Expr *E = getInit())
3018 return E->getSourceRange();
3019
3020 // Missing an actual expression, may be invalid.
3021 return SourceRange();
3022 }
3023 llvm_unreachable("Invalid default argument kind.");
3024}
3025
3027 ParmVarDeclBits.DefaultArgKind = DAK_Uninstantiated;
3028 Init = arg;
3029}
3030
3032 assert(hasUninstantiatedDefaultArg() &&
3033 "Wrong kind of initialization expression!");
3034 return cast_if_present<Expr>(cast<Stmt *>(Init));
3035}
3036
3038 // FIXME: We should just return false for DAK_None here once callers are
3039 // prepared for the case that we encountered an invalid default argument and
3040 // were unable to even build an invalid expression.
3042 !Init.isNull();
3043}
3044
3045void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) {
3046 getASTContext().setParameterIndex(this, parameterIndex);
3047 ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel;
3048}
3049
3050unsigned ParmVarDecl::getParameterIndexLarge() const {
3051 return getASTContext().getParameterIndex(this);
3052}
3053
3054//===----------------------------------------------------------------------===//
3055// FunctionDecl Implementation
3056//===----------------------------------------------------------------------===//
3057
3059 SourceLocation StartLoc,
3060 const DeclarationNameInfo &NameInfo, QualType T,
3061 TypeSourceInfo *TInfo, StorageClass S,
3063 ConstexprSpecKind ConstexprKind,
3064 const AssociatedConstraint &TrailingRequiresClause)
3065 : DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo,
3066 StartLoc),
3067 DeclContext(DK), redeclarable_base(C), Body(), ODRHash(0),
3068 EndRangeLoc(NameInfo.getEndLoc()), DNLoc(NameInfo.getInfo()) {
3069 assert(T.isNull() || T->isFunctionType());
3070 FunctionDeclBits.SClass = S;
3072 FunctionDeclBits.IsInlineSpecified = isInlineSpecified;
3073 FunctionDeclBits.IsVirtualAsWritten = false;
3074 FunctionDeclBits.IsPureVirtual = false;
3075 FunctionDeclBits.HasInheritedPrototype = false;
3076 FunctionDeclBits.HasWrittenPrototype = true;
3077 FunctionDeclBits.IsDeleted = false;
3078 FunctionDeclBits.IsTrivial = false;
3079 FunctionDeclBits.IsTrivialForCall = false;
3080 FunctionDeclBits.IsDefaulted = false;
3081 FunctionDeclBits.IsExplicitlyDefaulted = false;
3082 FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
3083 FunctionDeclBits.IsIneligibleOrNotSelected = false;
3084 FunctionDeclBits.HasImplicitReturnZero = false;
3085 FunctionDeclBits.IsLateTemplateParsed = false;
3086 FunctionDeclBits.IsInstantiatedFromMemberTemplate = false;
3087 FunctionDeclBits.ConstexprKind = static_cast<uint64_t>(ConstexprKind);
3088 FunctionDeclBits.BodyContainsImmediateEscalatingExpression = false;
3089 FunctionDeclBits.InstantiationIsPending = false;
3090 FunctionDeclBits.UsesSEHTry = false;
3091 FunctionDeclBits.UsesFPIntrin = UsesFPIntrin;
3092 FunctionDeclBits.HasSkippedBody = false;
3093 FunctionDeclBits.WillHaveBody = false;
3094 FunctionDeclBits.IsMultiVersion = false;
3095 FunctionDeclBits.DeductionCandidateKind =
3096 static_cast<unsigned char>(DeductionCandidate::Normal);
3097 FunctionDeclBits.HasODRHash = false;
3098 FunctionDeclBits.FriendConstraintRefersToEnclosingTemplate = false;
3099
3100 if (TrailingRequiresClause)
3101 setTrailingRequiresClause(TrailingRequiresClause);
3102}
3103
3105 raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
3108 if (TemplateArgs)
3109 printTemplateArgumentList(OS, TemplateArgs->asArray(), Policy);
3110}
3111
3113 if (const auto *FT = getType()->getAs<FunctionProtoType>())
3114 return FT->isVariadic();
3115 return false;
3116}
3117
3120 ASTContext &Context, ArrayRef<DeclAccessPair> Lookups,
3121 FPOptionsOverride FPFeatures, StringLiteral *DeletedMessage) {
3122 static constexpr size_t Alignment =
3123 std::max({alignof(DefaultedOrDeletedFunctionInfo),
3124 alignof(DeclAccessPair), alignof(StringLiteral *)});
3125 size_t Size = totalSizeToAlloc<DeclAccessPair, StringLiteral *>(
3126 Lookups.size(), DeletedMessage != nullptr);
3127
3129 new (Context.Allocate(Size, Alignment)) DefaultedOrDeletedFunctionInfo;
3130 Info->NumLookups = Lookups.size();
3131 Info->HasDeletedMessage = DeletedMessage != nullptr;
3132 Info->FPFeatures = FPFeatures;
3133
3134 llvm::uninitialized_copy(Lookups, Info->getTrailingObjects<DeclAccessPair>());
3135 if (DeletedMessage)
3136 *Info->getTrailingObjects<StringLiteral *>() = DeletedMessage;
3137 return Info;
3138}
3139
3142 assert(!FunctionDeclBits.HasDefaultedOrDeletedInfo && "already have this");
3143 assert(!Body && "can't replace function body with defaulted function info");
3144
3145 FunctionDeclBits.HasDefaultedOrDeletedInfo = true;
3147}
3148
3150 FunctionDeclBits.IsDeleted = D;
3151
3152 if (Message) {
3153 assert(isDeletedAsWritten() && "Function must be deleted");
3154 if (FunctionDeclBits.HasDefaultedOrDeletedInfo)
3155 DefaultedOrDeletedInfo->setDeletedMessage(Message);
3156 else
3158 getASTContext(), /*Lookups=*/{}, FPOptionsOverride(), Message));
3159 }
3160}
3161
3163 StringLiteral *Message) {
3164 // We should never get here with the DefaultedOrDeletedInfo populated, but
3165 // no space allocated for the deleted message, since that would require
3166 // recreating this, but setDefaultedOrDeletedInfo() disallows overwriting
3167 // an already existing DefaultedOrDeletedFunctionInfo.
3168 assert(HasDeletedMessage &&
3169 "No space to store a delete message in this DefaultedOrDeletedInfo");
3170 *getTrailingObjects<StringLiteral *>() = Message;
3171}
3172
3175 return FunctionDeclBits.HasDefaultedOrDeletedInfo ? DefaultedOrDeletedInfo
3176 : nullptr;
3177}
3178
3180 for (const auto *I : redecls()) {
3181 if (I->doesThisDeclarationHaveABody()) {
3182 Definition = I;
3183 return true;
3184 }
3185 }
3186
3187 return false;
3188}
3189
3191 const Stmt *S = getBody();
3192 if (!S) {
3193 // Since we don't have a body for this function, we don't know if it's
3194 // trivial or not.
3195 return false;
3196 }
3197
3198 if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty())
3199 return true;
3200 return false;
3201}
3202
3204 if (!getFriendObjectKind())
3205 return false;
3206
3207 // Check for a friend function instantiated from a friend function
3208 // definition in a templated class.
3209 if (const FunctionDecl *InstantiatedFrom =
3211 return InstantiatedFrom->getFriendObjectKind() &&
3212 InstantiatedFrom->isThisDeclarationADefinition();
3213
3214 // Check for a friend function template instantiated from a friend
3215 // function template definition in a templated class.
3217 if (const FunctionTemplateDecl *InstantiatedFrom =
3218 Template->getInstantiatedFromMemberTemplate())
3219 return InstantiatedFrom->getFriendObjectKind() &&
3220 InstantiatedFrom->isThisDeclarationADefinition();
3221 }
3222
3223 return false;
3224}
3225
3227 bool CheckForPendingFriendDefinition) const {
3228 for (const FunctionDecl *FD : redecls()) {
3229 if (FD->isThisDeclarationADefinition()) {
3230 Definition = FD;
3231 return true;
3232 }
3233
3234 // If this is a friend function defined in a class template, it does not
3235 // have a body until it is used, nevertheless it is a definition, see
3236 // [temp.inst]p2:
3237 //
3238 // ... for the purpose of determining whether an instantiated redeclaration
3239 // is valid according to [basic.def.odr] and [class.mem], a declaration that
3240 // corresponds to a definition in the template is considered to be a
3241 // definition.
3242 //
3243 // The following code must produce redefinition error:
3244 //
3245 // template<typename T> struct C20 { friend void func_20() {} };
3246 // C20<int> c20i;
3247 // void func_20() {}
3248 //
3249 if (CheckForPendingFriendDefinition &&
3250 FD->isThisDeclarationInstantiatedFromAFriendDefinition()) {
3251 Definition = FD;
3252 return true;
3253 }
3254 }
3255
3256 return false;
3257}
3258
3260 if (!hasBody(Definition))
3261 return nullptr;
3262
3263 assert(!Definition->FunctionDeclBits.HasDefaultedOrDeletedInfo &&
3264 "definition should not have a body");
3265 if (Definition->Body)
3266 return Definition->Body.get(getASTContext().getExternalSource());
3267
3268 return nullptr;
3269}
3270
3272 FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
3273 Body = LazyDeclStmtPtr(B);
3274 if (B)
3275 EndRangeLoc = B->getEndLoc();
3276}
3277
3279 FunctionDeclBits.IsPureVirtual = P;
3280 if (P)
3281 if (auto *Parent = dyn_cast<CXXRecordDecl>(getDeclContext()))
3282 Parent->markedVirtualFunctionPure();
3283}
3284
3285template<std::size_t Len>
3286static bool isNamed(const NamedDecl *ND, const char (&Str)[Len]) {
3287 const IdentifierInfo *II = ND->getIdentifier();
3288 return II && II->isStr(Str);
3289}
3290
3292 // C++23 [expr.const]/p17
3293 // An immediate-escalating function is
3294 // - the call operator of a lambda that is not declared with the consteval
3295 // specifier,
3296 if (isLambdaCallOperator(this) && !isConsteval())
3297 return true;
3298 // - a defaulted special member function that is not declared with the
3299 // consteval specifier,
3300 if (isDefaulted() && !isConsteval())
3301 return true;
3302
3303 if (auto *CD = dyn_cast<CXXConstructorDecl>(this);
3304 CD && CD->isInheritingConstructor())
3305 return CD->getInheritedConstructor().getConstructor();
3306
3307 // Destructors are not immediate escalating.
3308 if (isa<CXXDestructorDecl>(this))
3309 return false;
3310
3311 // - a function that results from the instantiation of a templated entity
3312 // defined with the constexpr specifier.
3314 if (TK != TK_NonTemplate && TK != TK_DependentNonTemplate &&
3316 return true;
3317 return false;
3318}
3319
3321 // C++23 [expr.const]/p18
3322 // An immediate function is a function or constructor that is
3323 // - declared with the consteval specifier
3324 if (isConsteval())
3325 return true;
3326 // - an immediate-escalating function F whose function body contains an
3327 // immediate-escalating expression
3329 return true;
3330
3331 if (auto *CD = dyn_cast<CXXConstructorDecl>(this);
3332 CD && CD->isInheritingConstructor())
3333 return CD->getInheritedConstructor()
3334 .getConstructor()
3335 ->isImmediateFunction();
3336
3338 P && P->isImmediateFunction())
3339 return true;
3340
3341 if (const auto *MD = dyn_cast<CXXMethodDecl>(this);
3342 MD && MD->isLambdaStaticInvoker())
3343 return MD->getParent()->getLambdaCallOperator()->isImmediateFunction();
3344
3345 return false;
3346}
3347
3349 return isNamed(this, "main") && !getLangOpts().Freestanding &&
3350 !getLangOpts().HLSL &&
3352 isExternC());
3353}
3354
3356 const TranslationUnitDecl *TUnit =
3357 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext());
3358 if (!TUnit)
3359 return false;
3360
3361 // Even though we aren't really targeting MSVCRT if we are freestanding,
3362 // semantic analysis for these functions remains the same.
3363
3364 // MSVCRT entry points only exist on MSVCRT targets.
3365 if (!TUnit->getASTContext().getTargetInfo().getTriple().isOSMSVCRT() &&
3366 !TUnit->getASTContext().getTargetInfo().getTriple().isUEFI())
3367 return false;
3368
3369 // Nameless functions like constructors cannot be entry points.
3370 if (!getIdentifier())
3371 return false;
3372
3373 return llvm::StringSwitch<bool>(getName())
3374 .Cases({"main", // an ANSI console app
3375 "wmain", // a Unicode console App
3376 "WinMain", // an ANSI GUI app
3377 "wWinMain", // a Unicode GUI app
3378 "DllMain"}, // a DLL
3379 true)
3380 .Default(false);
3381}
3382
3384 if (!getDeclName().isAnyOperatorNewOrDelete())
3385 return false;
3386
3388 return false;
3389
3391 return false;
3392
3393 const auto *proto = getType()->castAs<FunctionProtoType>();
3394 if (proto->getNumParams() != 2 || proto->isVariadic())
3395 return false;
3396
3397 const ASTContext &Context =
3399 ->getASTContext();
3400
3401 // The result type and first argument type are constant across all
3402 // these operators. The second argument must be exactly void*.
3403 return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy);
3404}
3405
3407 UnsignedOrNone *AlignmentParam, bool *IsNothrow) const {
3408 if (!getDeclName().isAnyOperatorNewOrDelete())
3409 return false;
3410
3412 return false;
3413
3414 // This can only fail for an invalid 'operator new' declaration.
3416 return false;
3417
3418 if (isVariadic())
3419 return false;
3420
3422 bool IsDelete = getDeclName().isAnyOperatorDelete();
3423 unsigned RequiredParameterCount =
3426 if (AlignmentParam)
3427 *AlignmentParam =
3428 /* type identity */ 1U + /* address */ IsDelete + /* size */ 1U;
3429 if (RequiredParameterCount == getNumParams())
3430 return true;
3431 if (getNumParams() > RequiredParameterCount + 1)
3432 return false;
3433 if (!getParamDecl(RequiredParameterCount)->getType()->isNothrowT())
3434 return false;
3435
3436 if (IsNothrow)
3437 *IsNothrow = true;
3438 return true;
3439 }
3440
3441 const auto *FPT = getType()->castAs<FunctionProtoType>();
3442 if (FPT->getNumParams() == 0 || FPT->getNumParams() > 4)
3443 return false;
3444
3445 // If this is a single-parameter function, it must be a replaceable global
3446 // allocation or deallocation function.
3447 if (FPT->getNumParams() == 1)
3448 return true;
3449
3450 unsigned Params = 1;
3451 QualType Ty = FPT->getParamType(Params);
3452 const ASTContext &Ctx = getASTContext();
3453
3454 auto Consume = [&] {
3455 ++Params;
3456 Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType();
3457 };
3458
3459 // In C++14, the next parameter can be a 'std::size_t' for sized delete.
3460 bool IsSizedDelete = false;
3461 if (Ctx.getLangOpts().SizedDeallocation &&
3462 getDeclName().isAnyOperatorDelete() &&
3463 Ctx.hasSameType(Ty, Ctx.getSizeType())) {
3464 IsSizedDelete = true;
3465 Consume();
3466 }
3467
3468 // In C++17, the next parameter can be a 'std::align_val_t' for aligned
3469 // new/delete.
3470 if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT()) {
3471 Consume();
3472 if (AlignmentParam)
3473 *AlignmentParam = Params;
3474 }
3475
3476 // If this is not a sized delete, the next parameter can be a
3477 // 'const std::nothrow_t&'.
3478 if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) {
3479 Ty = Ty->getPointeeType();
3481 return false;
3482 if (Ty->isNothrowT()) {
3483 if (IsNothrow)
3484 *IsNothrow = true;
3485 Consume();
3486 }
3487 }
3488
3489 // Finally, recognize the not yet standard versions of new that take a
3490 // hot/cold allocation hint (__hot_cold_t). These are currently supported by
3491 // tcmalloc (see
3492 // https://github.com/google/tcmalloc/blob/220043886d4e2efff7a5702d5172cb8065253664/tcmalloc/malloc_extension.h#L53).
3493 if (!IsSizedDelete && !Ty.isNull() && Ty->isEnumeralType()) {
3494 QualType T = Ty;
3495 while (const auto *TD = T->getAs<TypedefType>())
3496 T = TD->getDecl()->getUnderlyingType();
3497 const IdentifierInfo *II =
3498 T->castAsCanonical<EnumType>()->getDecl()->getIdentifier();
3499 if (II && II->isStr("__hot_cold_t"))
3500 Consume();
3501 }
3502
3503 return Params == FPT->getNumParams();
3504}
3505
3507 if (!getBuiltinID())
3508 return false;
3509
3510 const FunctionDecl *Definition;
3511 if (!hasBody(Definition))
3512 return false;
3513
3514 if (!Definition->isInlineSpecified() ||
3515 !Definition->hasAttr<AlwaysInlineAttr>())
3516 return false;
3517
3518 ASTContext &Context = getASTContext();
3519 switch (Context.GetGVALinkageForFunction(Definition)) {
3520 case GVA_Internal:
3521 case GVA_DiscardableODR:
3522 case GVA_StrongODR:
3523 return false;
3525 case GVA_StrongExternal:
3526 return true;
3527 }
3528 llvm_unreachable("Unknown GVALinkage");
3529}
3530
3534
3535void FunctionDecl::setIsDestroyingOperatorDelete(bool IsDestroyingDelete) {
3536 getASTContext().setIsDestroyingOperatorDelete(this, IsDestroyingDelete);
3537}
3538
3542
3546
3548 UsualDeleteParams Params;
3549
3550 // This function should only be called for operator delete declarations.
3551 assert(getDeclName().isAnyOperatorDelete());
3552 if (!getDeclName().isAnyOperatorDelete())
3553 return Params;
3554
3556 auto AI = FPT->param_type_begin(), AE = FPT->param_type_end();
3557
3560 assert(AI != AE);
3561 ++AI;
3562 }
3563
3564 // The first argument after the type-identity parameter (if any) is
3565 // always a void* (or C* for a destroying operator delete for class
3566 // type C).
3567 ++AI;
3568
3569 // The next parameter may be a std::destroying_delete_t.
3571 assert(!isTypeAwareAllocation(Params.TypeAwareDelete));
3572 Params.DestroyingDelete = true;
3573 assert(AI != AE);
3574 ++AI;
3575 }
3576
3577 // Figure out what other parameters we should be implicitly passing.
3578 if (AI != AE && (*AI)->isIntegerType()) {
3579 Params.Size = true;
3580 ++AI;
3581 } else
3582 assert(!isTypeAwareAllocation(Params.TypeAwareDelete));
3583
3584 if (AI != AE && (*AI)->isAlignValT()) {
3586 ++AI;
3587 } else
3588 assert(!isTypeAwareAllocation(Params.TypeAwareDelete));
3589
3590 assert(AI == AE && "unexpected usual deallocation function parameter");
3591 return Params;
3592}
3593
3597
3599 return isDeclExternC(*this);
3600}
3601
3603 if (DeviceKernelAttr::isOpenCLSpelling(getAttr<DeviceKernelAttr>()))
3604 return true;
3606}
3607
3611
3613 if (const auto *Method = dyn_cast<CXXMethodDecl>(this))
3614 return Method->isStatic();
3615
3617 return false;
3618
3619 for (const DeclContext *DC = getDeclContext();
3620 DC->isNamespace();
3621 DC = DC->getParent()) {
3622 if (const auto *Namespace = cast<NamespaceDecl>(DC)) {
3623 if (!Namespace->getDeclName())
3624 return false;
3625 }
3626 }
3627
3628 return true;
3629}
3630
3634 return true;
3635
3636 if (auto *FnTy = getType()->getAs<FunctionType>())
3637 return FnTy->getNoReturnAttr();
3638
3639 return false;
3640}
3641
3645
3647 // C++20 [temp.friend]p9:
3648 // A non-template friend declaration with a requires-clause [or]
3649 // a friend function template with a constraint that depends on a template
3650 // parameter from an enclosing template [...] does not declare the same
3651 // function or function template as a declaration in any other scope.
3652
3653 // If this isn't a friend then it's not a member-like constrained friend.
3654 if (!getFriendObjectKind()) {
3655 return false;
3656 }
3657
3659 // If these friends don't have constraints, they aren't constrained, and
3660 // thus don't fall under temp.friend p9. Else the simple presence of a
3661 // constraint makes them unique.
3663 }
3664
3666}
3667
3681
3685
3689
3694
3696 if (!isMultiVersion())
3697 return false;
3698 if (hasAttr<TargetAttr>())
3699 return getAttr<TargetAttr>()->isDefaultVersion();
3700 return hasAttr<TargetVersionAttr>() &&
3701 getAttr<TargetVersionAttr>()->isDefaultVersion();
3702}
3703
3707
3711
3712void
3715
3717 FunctionTemplateDecl *PrevFunTmpl
3718 = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : nullptr;
3719 assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch");
3720 FunTmpl->setPreviousDecl(PrevFunTmpl);
3721 }
3722
3723 if (PrevDecl && PrevDecl->isInlined())
3724 setImplicitlyInline(true);
3725}
3726
3728
3729/// Returns a value indicating whether this function corresponds to a builtin
3730/// function.
3731///
3732/// The function corresponds to a built-in function if it is declared at
3733/// translation scope or within an extern "C" block and its name matches with
3734/// the name of a builtin. The returned value will be 0 for functions that do
3735/// not correspond to a builtin, a value of type \c Builtin::ID if in the
3736/// target-independent range \c [1,Builtin::First), or a target-specific builtin
3737/// value.
3738///
3739/// \param ConsiderWrapperFunctions If true, we should consider wrapper
3740/// functions as their wrapped builtins. This shouldn't be done in general, but
3741/// it's useful in Sema to diagnose calls to wrappers based on their semantics.
3742unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const {
3743 unsigned BuiltinID = 0;
3744
3745 if (const auto *ABAA = getAttr<ArmBuiltinAliasAttr>()) {
3746 BuiltinID = ABAA->getBuiltinName()->getBuiltinID();
3747 } else if (const auto *BAA = getAttr<BuiltinAliasAttr>()) {
3748 BuiltinID = BAA->getBuiltinName()->getBuiltinID();
3749 } else if (const auto *A = getAttr<BuiltinAttr>()) {
3750 BuiltinID = A->getID();
3751 }
3752
3753 if (!BuiltinID)
3754 return 0;
3755
3756 // If the function is marked "overloadable", it has a different mangled name
3757 // and is not the C library function.
3758 if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>() &&
3760 return 0;
3761
3763 BuiltinID == Builtin::BI__builtin_counted_by_ref)
3764 return 0;
3765
3766 const ASTContext &Context = getASTContext();
3767 if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3768 return BuiltinID;
3769
3770 // This function has the name of a known C library
3771 // function. Determine whether it actually refers to the C library
3772 // function or whether it just has the same name.
3773
3774 // If this is a static function, it's not a builtin.
3775 if (!ConsiderWrapperFunctions && getStorageClass() == SC_Static)
3776 return 0;
3777
3778 // OpenCL v1.2 s6.9.f - The library functions defined in
3779 // the C99 standard headers are not available.
3780 if (Context.getLangOpts().OpenCL &&
3781 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3782 return 0;
3783
3784 // CUDA does not have device-side standard library. printf and malloc are the
3785 // only special cases that are supported by device-side runtime.
3786 if (Context.getLangOpts().CUDA && hasAttr<CUDADeviceAttr>() &&
3788 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3789 return 0;
3790
3791 // As AMDGCN implementation of OpenMP does not have a device-side standard
3792 // library, none of the predefined library functions except printf and malloc
3793 // should be treated as a builtin i.e. 0 should be returned for them.
3794 if (Context.getTargetInfo().getTriple().isAMDGCN() &&
3795 Context.getLangOpts().OpenMPIsTargetDevice &&
3796 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
3797 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3798 return 0;
3799
3800 return BuiltinID;
3801}
3802
3803/// getNumParams - Return the number of parameters this function must have
3804/// based on its FunctionType. This is the length of the ParamInfo array
3805/// after it has been created.
3807 const auto *FPT = getType()->getAs<FunctionProtoType>();
3808 return FPT ? FPT->getNumParams() : 0;
3809}
3810
3811void FunctionDecl::setParams(ASTContext &C,
3812 ArrayRef<ParmVarDecl *> NewParamInfo) {
3813 assert(!ParamInfo && "Already has param info!");
3814 assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!");
3815
3816 // Zero params -> null pointer.
3817 if (!NewParamInfo.empty()) {
3818 ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
3819 llvm::copy(NewParamInfo, ParamInfo);
3820 }
3821}
3822
3823/// getMinRequiredArguments - Returns the minimum number of arguments
3824/// needed to call this function. This may be fewer than the number of
3825/// function parameters, if some of the parameters have default
3826/// arguments (in C++) or are parameter packs (C++11).
3829 return getNumParams();
3830
3831 // Note that it is possible for a parameter with no default argument to
3832 // follow a parameter with a default argument.
3833 unsigned NumRequiredArgs = 0;
3834 unsigned MinParamsSoFar = 0;
3835 for (auto *Param : parameters()) {
3836 if (!Param->isParameterPack()) {
3837 ++MinParamsSoFar;
3838 if (!Param->hasDefaultArg())
3839 NumRequiredArgs = MinParamsSoFar;
3840 }
3841 }
3842 return NumRequiredArgs;
3843}
3844
3848
3850 return getNumParams() -
3851 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3852}
3853
3855 return getMinRequiredArguments() -
3856 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3857}
3858
3860 return getNumParams() == 1 ||
3861 (getNumParams() > 1 &&
3862 llvm::all_of(llvm::drop_begin(parameters()),
3863 [](ParmVarDecl *P) { return P->hasDefaultArg(); }));
3864}
3865
3866/// The combination of the extern and inline keywords under MSVC forces
3867/// the function to be required.
3868///
3869/// Note: This function assumes that we will only get called when isInlined()
3870/// would return true for this FunctionDecl.
3872 assert(isInlined() && "expected to get called on an inlined function!");
3873
3874 const ASTContext &Context = getASTContext();
3875 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() &&
3877 return false;
3878
3879 for (const FunctionDecl *FD = getMostRecentDecl(); FD;
3880 FD = FD->getPreviousDecl())
3881 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3882 return true;
3883
3884 return false;
3885}
3886
3887static bool redeclForcesDefMSVC(const FunctionDecl *Redecl) {
3888 if (Redecl->getStorageClass() != SC_Extern)
3889 return false;
3890
3891 for (const FunctionDecl *FD = Redecl->getPreviousDecl(); FD;
3892 FD = FD->getPreviousDecl())
3893 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3894 return false;
3895
3896 return true;
3897}
3898
3899static bool RedeclForcesDefC99(const FunctionDecl *Redecl) {
3900 // Only consider file-scope declarations in this test.
3901 if (!Redecl->getLexicalDeclContext()->isTranslationUnit())
3902 return false;
3903
3904 // Only consider explicit declarations; the presence of a builtin for a
3905 // libcall shouldn't affect whether a definition is externally visible.
3906 if (Redecl->isImplicit())
3907 return false;
3908
3909 if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern)
3910 return true; // Not an inline definition
3911
3912 return false;
3913}
3914
3915/// For a function declaration in C or C++, determine whether this
3916/// declaration causes the definition to be externally visible.
3917///
3918/// For instance, this determines if adding the current declaration to the set
3919/// of redeclarations of the given functions causes
3920/// isInlineDefinitionExternallyVisible to change from false to true.
3922 assert(!doesThisDeclarationHaveABody() &&
3923 "Must have a declaration without a body.");
3924
3925 const ASTContext &Context = getASTContext();
3926
3927 if (Context.getLangOpts().MSVCCompat) {
3928 const FunctionDecl *Definition;
3929 if (hasBody(Definition) && Definition->isInlined() &&
3930 redeclForcesDefMSVC(this))
3931 return true;
3932 }
3933
3934 if (Context.getLangOpts().CPlusPlus)
3935 return false;
3936
3937 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
3938 // With GNU inlining, a declaration with 'inline' but not 'extern', forces
3939 // an externally visible definition.
3940 //
3941 // FIXME: What happens if gnu_inline gets added on after the first
3942 // declaration?
3944 return false;
3945
3946 const FunctionDecl *Prev = this;
3947 bool FoundBody = false;
3948 while ((Prev = Prev->getPreviousDecl())) {
3949 FoundBody |= Prev->doesThisDeclarationHaveABody();
3950
3951 if (Prev->doesThisDeclarationHaveABody()) {
3952 // If it's not the case that both 'inline' and 'extern' are
3953 // specified on the definition, then it is always externally visible.
3954 if (!Prev->isInlineSpecified() ||
3955 Prev->getStorageClass() != SC_Extern)
3956 return false;
3957 } else if (Prev->isInlineSpecified() &&
3958 Prev->getStorageClass() != SC_Extern) {
3959 return false;
3960 }
3961 }
3962 return FoundBody;
3963 }
3964
3965 // C99 6.7.4p6:
3966 // [...] If all of the file scope declarations for a function in a
3967 // translation unit include the inline function specifier without extern,
3968 // then the definition in that translation unit is an inline definition.
3970 return false;
3971 const FunctionDecl *Prev = this;
3972 bool FoundBody = false;
3973 while ((Prev = Prev->getPreviousDecl())) {
3974 FoundBody |= Prev->doesThisDeclarationHaveABody();
3975 if (RedeclForcesDefC99(Prev))
3976 return false;
3977 }
3978 return FoundBody;
3979}
3980
3982 const TypeSourceInfo *TSI = getTypeSourceInfo();
3983
3984 if (!TSI)
3985 return FunctionTypeLoc();
3986
3987 TypeLoc TL = TSI->getTypeLoc();
3988 FunctionTypeLoc FTL;
3989
3990 while (!(FTL = TL.getAs<FunctionTypeLoc>())) {
3991 if (const auto PTL = TL.getAs<ParenTypeLoc>())
3992 TL = PTL.getInnerLoc();
3993 else if (const auto ATL = TL.getAs<AttributedTypeLoc>())
3994 TL = ATL.getEquivalentTypeLoc();
3995 else if (const auto MQTL = TL.getAs<MacroQualifiedTypeLoc>())
3996 TL = MQTL.getInnerLoc();
3997 else
3998 break;
3999 }
4000
4001 return FTL;
4002}
4003
4006 if (!FTL)
4007 return SourceRange();
4008
4009 // Skip self-referential return types.
4011 SourceRange RTRange = FTL.getReturnLoc().getSourceRange();
4012 SourceLocation Boundary = getNameInfo().getBeginLoc();
4013 if (RTRange.isInvalid() || Boundary.isInvalid() ||
4014 !SM.isBeforeInTranslationUnit(RTRange.getEnd(), Boundary))
4015 return SourceRange();
4016
4017 return RTRange;
4018}
4019
4021 unsigned NP = getNumParams();
4022 SourceLocation EllipsisLoc = getEllipsisLoc();
4023
4024 if (NP == 0 && EllipsisLoc.isInvalid())
4025 return SourceRange();
4026
4027 SourceLocation Begin =
4028 NP > 0 ? ParamInfo[0]->getSourceRange().getBegin() : EllipsisLoc;
4029 SourceLocation End = EllipsisLoc.isValid()
4030 ? EllipsisLoc
4031 : ParamInfo[NP - 1]->getSourceRange().getEnd();
4032
4033 return SourceRange(Begin, End);
4034}
4035
4040
4041/// For an inline function definition in C, or for a gnu_inline function
4042/// in C++, determine whether the definition will be externally visible.
4043///
4044/// Inline function definitions are always available for inlining optimizations.
4045/// However, depending on the language dialect, declaration specifiers, and
4046/// attributes, the definition of an inline function may or may not be
4047/// "externally" visible to other translation units in the program.
4048///
4049/// In C99, inline definitions are not externally visible by default. However,
4050/// if even one of the global-scope declarations is marked "extern inline", the
4051/// inline definition becomes externally visible (C99 6.7.4p6).
4052///
4053/// In GNU89 mode, or if the gnu_inline attribute is attached to the function
4054/// definition, we use the GNU semantics for inline, which are nearly the
4055/// opposite of C99 semantics. In particular, "inline" by itself will create
4056/// an externally visible symbol, but "extern inline" will not create an
4057/// externally visible symbol.
4060 hasAttr<AliasAttr>()) &&
4061 "Must be a function definition");
4062 assert(isInlined() && "Function must be inline");
4063 ASTContext &Context = getASTContext();
4064
4065 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
4066 // Note: If you change the logic here, please change
4067 // doesDeclarationForceExternallyVisibleDefinition as well.
4068 //
4069 // If it's not the case that both 'inline' and 'extern' are
4070 // specified on the definition, then this inline definition is
4071 // externally visible.
4072 if (Context.getLangOpts().CPlusPlus)
4073 return false;
4075 return true;
4076
4077 // If any declaration is 'inline' but not 'extern', then this definition
4078 // is externally visible.
4079 for (auto *Redecl : redecls()) {
4080 if (Redecl->isInlineSpecified() &&
4081 Redecl->getStorageClass() != SC_Extern)
4082 return true;
4083 }
4084
4085 return false;
4086 }
4087
4088 // The rest of this function is C-only.
4089 assert(!Context.getLangOpts().CPlusPlus &&
4090 "should not use C inline rules in C++");
4091
4092 // C99 6.7.4p6:
4093 // [...] If all of the file scope declarations for a function in a
4094 // translation unit include the inline function specifier without extern,
4095 // then the definition in that translation unit is an inline definition.
4096 for (auto *Redecl : redecls()) {
4097 if (RedeclForcesDefC99(Redecl))
4098 return true;
4099 }
4100
4101 // C99 6.7.4p6:
4102 // An inline definition does not provide an external definition for the
4103 // function, and does not forbid an external definition in another
4104 // translation unit.
4105 return false;
4106}
4107
4108/// getOverloadedOperator - Which C++ overloaded operator this
4109/// function represents, if any.
4115
4116/// getLiteralIdentifier - The literal suffix identifier this function
4117/// represents, if any.
4121 return nullptr;
4122}
4123
4125 if (TemplateOrSpecialization.isNull())
4126 return TK_NonTemplate;
4127 if (const auto *ND = dyn_cast<NamedDecl *>(TemplateOrSpecialization)) {
4128 if (isa<FunctionDecl>(ND))
4130 assert(isa<FunctionTemplateDecl>(ND) &&
4131 "No other valid types in NamedDecl");
4132 return TK_FunctionTemplate;
4133 }
4134 if (isa<MemberSpecializationInfo *>(TemplateOrSpecialization))
4136 if (isa<FunctionTemplateSpecializationInfo *>(TemplateOrSpecialization))
4139 TemplateOrSpecialization))
4141
4142 llvm_unreachable("Did we miss a TemplateOrSpecialization type?");
4143}
4144
4147 return cast<FunctionDecl>(Info->getInstantiatedFrom());
4148
4149 return nullptr;
4150}
4151
4153 if (auto *MSI = dyn_cast_if_present<MemberSpecializationInfo *>(
4154 TemplateOrSpecialization))
4155 return MSI;
4156 if (auto *FTSI = dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4157 TemplateOrSpecialization))
4158 return FTSI->getMemberSpecializationInfo();
4159 return nullptr;
4160}
4161
4162void
4163FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C,
4164 FunctionDecl *FD,
4166 assert(TemplateOrSpecialization.isNull() &&
4167 "Member function is already a specialization");
4169 = new (C) MemberSpecializationInfo(FD, TSK);
4170 TemplateOrSpecialization = Info;
4171}
4172
4174 return dyn_cast_if_present<FunctionTemplateDecl>(
4175 dyn_cast_if_present<NamedDecl *>(TemplateOrSpecialization));
4176}
4177
4180 assert(TemplateOrSpecialization.isNull() &&
4181 "Member function is already a specialization");
4182 TemplateOrSpecialization = Template;
4183}
4184
4186 return isa<FunctionTemplateSpecializationInfo *>(TemplateOrSpecialization) ||
4188 TemplateOrSpecialization);
4189}
4190
4192 assert(TemplateOrSpecialization.isNull() &&
4193 "Function is already a specialization");
4194 TemplateOrSpecialization = FD;
4195}
4196
4198 return dyn_cast_if_present<FunctionDecl>(
4199 TemplateOrSpecialization.dyn_cast<NamedDecl *>());
4200}
4201
4203 // If the function is invalid, it can't be implicitly instantiated.
4204 if (isInvalidDecl())
4205 return false;
4206
4208 case TSK_Undeclared:
4211 return false;
4212
4214 return true;
4215
4217 // Handled below.
4218 break;
4219 }
4220
4221 // Find the actual template from which we will instantiate.
4222 const FunctionDecl *PatternDecl = getTemplateInstantiationPattern();
4223 bool HasPattern = false;
4224 if (PatternDecl)
4225 HasPattern = PatternDecl->hasBody(PatternDecl);
4226
4227 // C++0x [temp.explicit]p9:
4228 // Except for inline functions, other explicit instantiation declarations
4229 // have the effect of suppressing the implicit instantiation of the entity
4230 // to which they refer.
4231 if (!HasPattern || !PatternDecl)
4232 return true;
4233
4234 return PatternDecl->isInlined();
4235}
4236
4238 // FIXME: Remove this, it's not clear what it means. (Which template
4239 // specialization kind?)
4241}
4242
4245 // If this is a generic lambda call operator specialization, its
4246 // instantiation pattern is always its primary template's pattern
4247 // even if its primary template was instantiated from another
4248 // member template (which happens with nested generic lambdas).
4249 // Since a lambda's call operator's body is transformed eagerly,
4250 // we don't have to go hunting for a prototype definition template
4251 // (i.e. instantiated-from-member-template) to use as an instantiation
4252 // pattern.
4253
4255 dyn_cast<CXXMethodDecl>(this))) {
4256 assert(getPrimaryTemplate() && "not a generic lambda call operator?");
4258 }
4259
4260 // Check for a declaration of this function that was instantiated from a
4261 // friend definition.
4262 const FunctionDecl *FD = nullptr;
4263 if (!isDefined(FD, /*CheckForPendingFriendDefinition=*/true))
4264 FD = this;
4265
4267 if (ForDefinition &&
4269 return nullptr;
4271 }
4272
4273 if (ForDefinition &&
4275 return nullptr;
4276
4277 if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
4278 // If we hit a point where the user provided a specialization of this
4279 // template, we're done looking.
4280 while (!ForDefinition || !Primary->isMemberSpecialization()) {
4281 auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate();
4282 if (!NewPrimary)
4283 break;
4284 Primary = NewPrimary;
4285 }
4286
4287 return Primary->getTemplatedDecl();
4288 }
4289
4290 return nullptr;
4291}
4292
4295 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4296 TemplateOrSpecialization)) {
4297 return Info->getTemplate();
4298 }
4299 return nullptr;
4300}
4301
4304 return dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4305 TemplateOrSpecialization);
4306}
4307
4311 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4312 TemplateOrSpecialization)) {
4313 return Info->TemplateArguments;
4314 }
4315 return nullptr;
4316}
4317
4321 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4322 TemplateOrSpecialization)) {
4323 return Info->TemplateArgumentsAsWritten;
4324 }
4326 dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
4327 TemplateOrSpecialization)) {
4328 return Info->TemplateArgumentsAsWritten;
4329 }
4330 return nullptr;
4331}
4332
4333void FunctionDecl::setFunctionTemplateSpecialization(
4335 TemplateArgumentList *TemplateArgs, void *InsertPos,
4337 const TemplateArgumentListInfo *TemplateArgsAsWritten,
4338 SourceLocation PointOfInstantiation) {
4339 assert((TemplateOrSpecialization.isNull() ||
4340 isa<MemberSpecializationInfo *>(TemplateOrSpecialization)) &&
4341 "Member function is already a specialization");
4342 assert(TSK != TSK_Undeclared &&
4343 "Must specify the type of function template specialization");
4344 assert((TemplateOrSpecialization.isNull() ||
4347 "Member specialization must be an explicit specialization");
4350 C, this, Template, TSK, TemplateArgs, TemplateArgsAsWritten,
4351 PointOfInstantiation,
4352 dyn_cast_if_present<MemberSpecializationInfo *>(
4353 TemplateOrSpecialization));
4354 TemplateOrSpecialization = Info;
4355 Template->addSpecialization(Info, InsertPos);
4356}
4357
4359 ASTContext &Context, const UnresolvedSetImpl &Templates,
4360 const TemplateArgumentListInfo *TemplateArgs) {
4361 assert(TemplateOrSpecialization.isNull());
4364 TemplateArgs);
4365 TemplateOrSpecialization = Info;
4366}
4367
4370 return dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
4371 TemplateOrSpecialization);
4372}
4373
4376 ASTContext &Context, const UnresolvedSetImpl &Candidates,
4377 const TemplateArgumentListInfo *TArgs) {
4378 const auto *TArgsWritten =
4379 TArgs ? ASTTemplateArgumentListInfo::Create(Context, *TArgs) : nullptr;
4380 return new (Context.Allocate(
4381 totalSizeToAlloc<FunctionTemplateDecl *>(Candidates.size())))
4382 DependentFunctionTemplateSpecializationInfo(Candidates, TArgsWritten);
4383}
4384
4385DependentFunctionTemplateSpecializationInfo::
4386 DependentFunctionTemplateSpecializationInfo(
4387 const UnresolvedSetImpl &Candidates,
4388 const ASTTemplateArgumentListInfo *TemplateArgsWritten)
4389 : NumCandidates(Candidates.size()),
4390 TemplateArgumentsAsWritten(TemplateArgsWritten) {
4391 std::transform(Candidates.begin(), Candidates.end(), getTrailingObjects(),
4392 [](NamedDecl *ND) {
4394 });
4395}
4396
4398 // For a function template specialization, query the specialization
4399 // information object.
4401 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4402 TemplateOrSpecialization))
4403 return FTSInfo->getTemplateSpecializationKind();
4404
4405 if (MemberSpecializationInfo *MSInfo =
4406 dyn_cast_if_present<MemberSpecializationInfo *>(
4407 TemplateOrSpecialization))
4408 return MSInfo->getTemplateSpecializationKind();
4409
4410 // A dependent function template specialization is an explicit specialization,
4411 // except when it's a friend declaration.
4413 TemplateOrSpecialization) &&
4416
4417 return TSK_Undeclared;
4418}
4419
4422 // This is the same as getTemplateSpecializationKind(), except that for a
4423 // function that is both a function template specialization and a member
4424 // specialization, we prefer the member specialization information. Eg:
4425 //
4426 // template<typename T> struct A {
4427 // template<typename U> void f() {}
4428 // template<> void f<int>() {}
4429 // };
4430 //
4431 // Within the templated CXXRecordDecl, A<T>::f<int> is a dependent function
4432 // template specialization; both getTemplateSpecializationKind() and
4433 // getTemplateSpecializationKindForInstantiation() will return
4434 // TSK_ExplicitSpecialization.
4435 //
4436 // For A<int>::f<int>():
4437 // * getTemplateSpecializationKind() will return TSK_ExplicitSpecialization
4438 // * getTemplateSpecializationKindForInstantiation() will return
4439 // TSK_ImplicitInstantiation
4440 //
4441 // This reflects the facts that A<int>::f<int> is an explicit specialization
4442 // of A<int>::f, and that A<int>::f<int> should be implicitly instantiated
4443 // from A::f<int> if a definition is needed.
4445 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4446 TemplateOrSpecialization)) {
4447 if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo())
4448 return MSInfo->getTemplateSpecializationKind();
4449 return FTSInfo->getTemplateSpecializationKind();
4450 }
4451
4452 if (MemberSpecializationInfo *MSInfo =
4453 dyn_cast_if_present<MemberSpecializationInfo *>(
4454 TemplateOrSpecialization))
4455 return MSInfo->getTemplateSpecializationKind();
4456
4458 TemplateOrSpecialization) &&
4461
4462 return TSK_Undeclared;
4463}
4464
4465void
4467 SourceLocation PointOfInstantiation) {
4469 dyn_cast<FunctionTemplateSpecializationInfo *>(
4470 TemplateOrSpecialization)) {
4471 FTSInfo->setTemplateSpecializationKind(TSK);
4472 if (TSK != TSK_ExplicitSpecialization &&
4473 PointOfInstantiation.isValid() &&
4474 FTSInfo->getPointOfInstantiation().isInvalid()) {
4475 FTSInfo->setPointOfInstantiation(PointOfInstantiation);
4477 L->InstantiationRequested(this);
4478 }
4479 } else if (MemberSpecializationInfo *MSInfo =
4480 dyn_cast<MemberSpecializationInfo *>(
4481 TemplateOrSpecialization)) {
4482 MSInfo->setTemplateSpecializationKind(TSK);
4483 if (TSK != TSK_ExplicitSpecialization &&
4484 PointOfInstantiation.isValid() &&
4485 MSInfo->getPointOfInstantiation().isInvalid()) {
4486 MSInfo->setPointOfInstantiation(PointOfInstantiation);
4488 L->InstantiationRequested(this);
4489 }
4490 } else
4491 llvm_unreachable("Function cannot have a template specialization kind");
4492}
4493
4495 auto HasImplicitAttr = [this](const Attr *A) {
4496 return A ? A->isImplicit() : isImplicit();
4497 };
4498 if (!HasImplicitAttr(getAttr<CUDAHostAttr>()) ||
4499 !HasImplicitAttr(getAttr<CUDADeviceAttr>()))
4500 return false;
4501 auto IsExplicitInstTSK = [](TemplateSpecializationKind TSK) {
4504 };
4505 if (IsExplicitInstTSK(getTemplateSpecializationKind()))
4506 return true;
4507 if (const auto *MD = dyn_cast<CXXMethodDecl>(this))
4508 if (const auto *Spec =
4509 dyn_cast<ClassTemplateSpecializationDecl>(MD->getParent()))
4510 return IsExplicitInstTSK(Spec->getTemplateSpecializationKind());
4511 return false;
4512}
4513
4516 = TemplateOrSpecialization.dyn_cast<
4518 return FTSInfo->getPointOfInstantiation();
4519 if (MemberSpecializationInfo *MSInfo =
4520 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4521 return MSInfo->getPointOfInstantiation();
4522
4523 return SourceLocation();
4524}
4525
4527 if (Decl::isOutOfLine())
4528 return true;
4529
4530 // If this function was instantiated from a member function of a
4531 // class template, check whether that member function was defined out-of-line.
4533 const FunctionDecl *Definition;
4534 if (FD->hasBody(Definition))
4535 return Definition->isOutOfLine();
4536 }
4537
4538 // If this function was instantiated from a function template,
4539 // check whether that function template was defined out-of-line.
4540 if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) {
4541 const FunctionDecl *Definition;
4542 if (FunTmpl->getTemplatedDecl()->hasBody(Definition))
4543 return Definition->isOutOfLine();
4544 }
4545
4546 return false;
4547}
4548
4550 return SourceRange(getOuterLocStart(), EndRangeLoc);
4551}
4552
4554 IdentifierInfo *FnInfo = getIdentifier();
4555
4556 if (!FnInfo)
4557 return 0;
4558
4559 // Builtin handling.
4560 switch (getBuiltinID()) {
4561 case Builtin::BI__builtin_memset:
4562 case Builtin::BI__builtin___memset_chk:
4563 case Builtin::BImemset:
4564 return Builtin::BImemset;
4565
4566 case Builtin::BI__builtin_memcpy:
4567 case Builtin::BI__builtin___memcpy_chk:
4568 case Builtin::BImemcpy:
4569 return Builtin::BImemcpy;
4570
4571 case Builtin::BI__builtin_mempcpy:
4572 case Builtin::BI__builtin___mempcpy_chk:
4573 case Builtin::BImempcpy:
4574 return Builtin::BImempcpy;
4575
4576 case Builtin::BI__builtin_trivially_relocate:
4577 case Builtin::BI__builtin_memmove:
4578 case Builtin::BI__builtin___memmove_chk:
4579 case Builtin::BImemmove:
4580 return Builtin::BImemmove;
4581
4582 case Builtin::BIstrlcpy:
4583 case Builtin::BI__builtin___strlcpy_chk:
4584 return Builtin::BIstrlcpy;
4585
4586 case Builtin::BIstrlcat:
4587 case Builtin::BI__builtin___strlcat_chk:
4588 return Builtin::BIstrlcat;
4589
4590 case Builtin::BI__builtin_memcmp:
4591 case Builtin::BImemcmp:
4592 return Builtin::BImemcmp;
4593
4594 case Builtin::BI__builtin_bcmp:
4595 case Builtin::BIbcmp:
4596 return Builtin::BIbcmp;
4597
4598 case Builtin::BI__builtin_strncpy:
4599 case Builtin::BI__builtin___strncpy_chk:
4600 case Builtin::BIstrncpy:
4601 return Builtin::BIstrncpy;
4602
4603 case Builtin::BI__builtin_strncmp:
4604 case Builtin::BIstrncmp:
4605 return Builtin::BIstrncmp;
4606
4607 case Builtin::BI__builtin_strncasecmp:
4608 case Builtin::BIstrncasecmp:
4609 return Builtin::BIstrncasecmp;
4610
4611 case Builtin::BI__builtin_strncat:
4612 case Builtin::BI__builtin___strncat_chk:
4613 case Builtin::BIstrncat:
4614 return Builtin::BIstrncat;
4615
4616 case Builtin::BI__builtin_strndup:
4617 case Builtin::BIstrndup:
4618 return Builtin::BIstrndup;
4619
4620 case Builtin::BI__builtin_strlen:
4621 case Builtin::BIstrlen:
4622 return Builtin::BIstrlen;
4623
4624 case Builtin::BI__builtin_bzero:
4625 case Builtin::BIbzero:
4626 return Builtin::BIbzero;
4627
4628 case Builtin::BI__builtin_bcopy:
4629 case Builtin::BIbcopy:
4630 return Builtin::BIbcopy;
4631
4632 case Builtin::BIfree:
4633 return Builtin::BIfree;
4634
4635 default:
4636 if (isExternC()) {
4637 if (FnInfo->isStr("memset"))
4638 return Builtin::BImemset;
4639 if (FnInfo->isStr("memcpy"))
4640 return Builtin::BImemcpy;
4641 if (FnInfo->isStr("mempcpy"))
4642 return Builtin::BImempcpy;
4643 if (FnInfo->isStr("memmove"))
4644 return Builtin::BImemmove;
4645 if (FnInfo->isStr("memcmp"))
4646 return Builtin::BImemcmp;
4647 if (FnInfo->isStr("bcmp"))
4648 return Builtin::BIbcmp;
4649 if (FnInfo->isStr("strncpy"))
4650 return Builtin::BIstrncpy;
4651 if (FnInfo->isStr("strncmp"))
4652 return Builtin::BIstrncmp;
4653 if (FnInfo->isStr("strncasecmp"))
4654 return Builtin::BIstrncasecmp;
4655 if (FnInfo->isStr("strncat"))
4656 return Builtin::BIstrncat;
4657 if (FnInfo->isStr("strndup"))
4658 return Builtin::BIstrndup;
4659 if (FnInfo->isStr("strlen"))
4660 return Builtin::BIstrlen;
4661 if (FnInfo->isStr("bzero"))
4662 return Builtin::BIbzero;
4663 if (FnInfo->isStr("bcopy"))
4664 return Builtin::BIbcopy;
4665 } else if (isInStdNamespace()) {
4666 if (FnInfo->isStr("free"))
4667 return Builtin::BIfree;
4668 }
4669 break;
4670 }
4671 return 0;
4672}
4673
4675 assert(hasODRHash());
4676 return ODRHash;
4677}
4678
4680 if (hasODRHash())
4681 return ODRHash;
4682
4683 if (auto *FT = getInstantiatedFromMemberFunction()) {
4684 setHasODRHash(true);
4685 ODRHash = FT->getODRHash();
4686 return ODRHash;
4687 }
4688
4689 class ODRHash Hash;
4690 Hash.AddFunctionDecl(this);
4691 setHasODRHash(true);
4692 ODRHash = Hash.CalculateHash();
4693 return ODRHash;
4694}
4695
4696//===----------------------------------------------------------------------===//
4697// FieldDecl Implementation
4698//===----------------------------------------------------------------------===//
4699
4701 SourceLocation StartLoc, SourceLocation IdLoc,
4702 const IdentifierInfo *Id, QualType T,
4703 TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
4704 InClassInitStyle InitStyle) {
4705 return new (C, DC) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo,
4706 BW, Mutable, InitStyle);
4707}
4708
4710 return new (C, ID) FieldDecl(Field, nullptr, SourceLocation(),
4711 SourceLocation(), nullptr, QualType(), nullptr,
4712 nullptr, false, ICIS_NoInit);
4713}
4714
4716 if (!isImplicit() || getDeclName())
4717 return false;
4718
4719 if (const auto *Record = getType()->getAsCanonical<RecordType>())
4720 return Record->getDecl()->isAnonymousStructOrUnion();
4721
4722 return false;
4723}
4724
4726 if (!hasInClassInitializer())
4727 return nullptr;
4728
4729 LazyDeclStmtPtr InitPtr = BitField ? InitAndBitWidth->Init : Init;
4730 return cast_if_present<Expr>(
4731 InitPtr.isOffset() ? InitPtr.get(getASTContext().getExternalSource())
4732 : InitPtr.get(nullptr));
4733}
4734
4736 setLazyInClassInitializer(LazyDeclStmtPtr(NewInit));
4737}
4738
4739void FieldDecl::setLazyInClassInitializer(LazyDeclStmtPtr NewInit) {
4741 if (BitField)
4742 InitAndBitWidth->Init = NewInit;
4743 else
4744 Init = NewInit;
4745}
4746
4748 const auto *CE = dyn_cast_if_present<ConstantExpr>(getBitWidth());
4749 return CE && CE->getAPValueResult().isInt();
4750}
4751
4753 assert(isBitField() && "not a bitfield");
4756 ->getAPValueResult()
4757 .getInt()
4758 .getZExtValue();
4759}
4760
4763 getBitWidthValue() == 0;
4764}
4765
4766bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
4768 return true;
4769
4770 // C++2a [intro.object]p7:
4771 // An object has nonzero size if it
4772 // -- is not a potentially-overlapping subobject, or
4774 return false;
4775
4776 // -- is not of class type, or
4777 const auto *RT = getType()->getAsCanonical<RecordType>();
4778 if (!RT)
4779 return false;
4780 const RecordDecl *RD = RT->getDecl()->getDefinition();
4781 if (!RD) {
4782 assert(isInvalidDecl() && "valid field has incomplete type");
4783 return false;
4784 }
4785
4786 // -- [has] virtual member functions or virtual base classes, or
4787 // -- has subobjects of nonzero size or bit-fields of nonzero length
4788 const auto *CXXRD = cast<CXXRecordDecl>(RD);
4789 if (!CXXRD->isEmpty())
4790 return false;
4791
4792 // Otherwise, [...] the circumstances under which the object has zero size
4793 // are implementation-defined.
4794 if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
4795 return true;
4796
4797 // MS ABI: has nonzero size if it is a class type with class type fields,
4798 // whether or not they have nonzero size
4799 return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
4800 return Field->getType()->isRecordType();
4801 });
4802}
4803
4807
4808void FieldDecl::setCachedFieldIndex() const {
4809 assert(this == getCanonicalDecl() &&
4810 "should be called on the canonical decl");
4811
4812 unsigned Index = 0;
4813 const RecordDecl *RD = getParent()->getDefinition();
4814 assert(RD && "requested index for field of struct with no definition");
4815
4816 for (auto *Field : RD->fields()) {
4817 Field->getCanonicalDecl()->CachedFieldIndex = Index + 1;
4818 assert(Field->getCanonicalDecl()->CachedFieldIndex == Index + 1 &&
4819 "overflow in field numbering");
4820 ++Index;
4821 }
4822
4823 assert(CachedFieldIndex && "failed to find field in parent");
4824}
4825
4827 const Expr *FinalExpr = getInClassInitializer();
4828 if (!FinalExpr)
4829 FinalExpr = getBitWidth();
4830 if (FinalExpr)
4831 return SourceRange(getInnerLocStart(), FinalExpr->getEndLoc());
4833}
4834
4836 assert((getParent()->isLambda() || getParent()->isCapturedRecord()) &&
4837 "capturing type in non-lambda or captured record.");
4838 assert(StorageKind == ISK_NoInit && !BitField &&
4839 "bit-field or field with default member initializer cannot capture "
4840 "VLA type");
4841 StorageKind = ISK_CapturedVLAType;
4842 CapturedVLAType = VLAType;
4843}
4844
4845void FieldDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
4846 // Print unnamed members using name of their type.
4848 this->getType().print(OS, Policy);
4849 return;
4850 }
4851 // Otherwise, do the normal printing.
4852 DeclaratorDecl::printName(OS, Policy);
4853}
4854
4856 const auto *CAT = getType()->getAs<CountAttributedType>();
4857 if (!CAT)
4858 return nullptr;
4859
4860 const auto *CountDRE = cast<DeclRefExpr>(CAT->getCountExpr());
4861 const auto *CountDecl = CountDRE->getDecl();
4862 if (const auto *IFD = dyn_cast<IndirectFieldDecl>(CountDecl))
4863 CountDecl = IFD->getAnonField();
4864
4865 return dyn_cast<FieldDecl>(CountDecl);
4866}
4867
4868//===----------------------------------------------------------------------===//
4869// TagDecl Implementation
4870//===----------------------------------------------------------------------===//
4871
4873 SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl,
4874 SourceLocation StartL)
4875 : TypeDecl(DK, DC, L, Id, StartL), DeclContext(DK), redeclarable_base(C),
4876 TypedefNameDeclOrQualifier((TypedefNameDecl *)nullptr) {
4877 assert((DK != Enum || TK == TagTypeKind::Enum) &&
4878 "EnumDecl not matched with TagTypeKind::Enum");
4879 setPreviousDecl(PrevDecl);
4880 setTagKind(TK);
4881 setCompleteDefinition(false);
4882 setBeingDefined(false);
4884 setFreeStanding(false);
4886 TagDeclBits.IsThisDeclarationADemotedDefinition = false;
4887}
4888
4892
4894 SourceLocation RBraceLoc = BraceRange.getEnd();
4895 SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
4896 return SourceRange(getOuterLocStart(), E);
4897}
4898
4900
4902 TypedefNameDeclOrQualifier = TDD;
4903 assert(isLinkageValid());
4904}
4905
4907 setBeingDefined(true);
4908
4909 if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
4910 struct CXXRecordDecl::DefinitionData *Data =
4911 new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
4912 for (auto *I : redecls())
4913 cast<CXXRecordDecl>(I)->DefinitionData = Data;
4914 }
4915}
4916
4918 assert((!isa<CXXRecordDecl>(this) ||
4920 "definition completed but not started");
4921
4923 setBeingDefined(false);
4924
4926 L->CompletedTagDefinition(this);
4927}
4928
4931 return const_cast<TagDecl *>(this);
4932
4933 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(this))
4934 return CXXRD->getDefinition();
4935
4936 for (TagDecl *R :
4938 if (R->isCompleteDefinition() || R->isBeingDefined())
4939 return R;
4940 return nullptr;
4941}
4942
4944 if (QualifierLoc) {
4945 // Make sure the extended qualifier info is allocated.
4946 if (!hasExtInfo())
4947 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
4948 // Set qualifier info.
4949 getExtInfo()->QualifierLoc = QualifierLoc;
4950 } else {
4951 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
4952 if (hasExtInfo()) {
4953 if (getExtInfo()->NumTemplParamLists == 0) {
4954 getASTContext().Deallocate(getExtInfo());
4955 TypedefNameDeclOrQualifier = (TypedefNameDecl *)nullptr;
4956 }
4957 else
4958 getExtInfo()->QualifierLoc = QualifierLoc;
4959 }
4960 }
4961}
4962
4964 llvm::raw_ostream &OS, const PrintingPolicy &Policy) const {
4965 PresumedLoc PLoc =
4967 if (!PLoc.isValid())
4968 return;
4969
4970 OS << " at ";
4971 StringRef File = PLoc.getFilename();
4972 llvm::SmallString<1024> WrittenFile(File);
4973 if (auto *Callbacks = Policy.Callbacks)
4974 WrittenFile = Callbacks->remapPath(File);
4975 // Fix inconsistent path separator created by
4976 // clang::DirectoryLookup::LookupFile when the file path is relative
4977 // path.
4978 llvm::sys::path::Style Style =
4979 llvm::sys::path::is_absolute(WrittenFile)
4980 ? llvm::sys::path::Style::native
4981 : (Policy.MSVCFormatting ? llvm::sys::path::Style::windows_backslash
4982 : llvm::sys::path::Style::posix);
4983 llvm::sys::path::native(WrittenFile, Style);
4984 OS << WrittenFile << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
4985}
4986
4987void TagDecl::printAnonymousTagDecl(llvm::raw_ostream &OS,
4988 const PrintingPolicy &Policy) const {
4990 assert(Typedef->getIdentifier() && "Typedef without identifier?");
4991 OS << Typedef->getIdentifier()->getName();
4992 return;
4993 }
4994
4995 bool SuppressTagKeywordInName = Policy.SuppressTagKeywordInAnonNames;
4996
4997 // Emit leading keyword. Since we printed a leading keyword make sure we
4998 // don't print the tag as part of the name too.
4999 if (!Policy.SuppressTagKeyword) {
5000 OS << getKindName() << ' ';
5001 SuppressTagKeywordInName = true;
5002 }
5003
5004 // Make an unambiguous representation for anonymous types, e.g.
5005 // (anonymous enum at /usr/include/string.h:120:9)
5006 OS << (Policy.MSVCFormatting ? '`' : '(');
5007
5008 if (isa<CXXRecordDecl>(this) && cast<CXXRecordDecl>(this)->isLambda()) {
5009 OS << "lambda";
5010 SuppressTagKeywordInName = true;
5011 } else if ((isa<RecordDecl>(this) &&
5012 cast<RecordDecl>(this)->isAnonymousStructOrUnion())) {
5013 OS << "anonymous";
5014 } else {
5015 OS << "unnamed";
5016 }
5017
5018 if (!SuppressTagKeywordInName)
5019 OS << ' ' << getKindName();
5020
5021 if (Policy.AnonymousTagNameStyle ==
5024
5025 OS << (Policy.MSVCFormatting ? '\'' : ')');
5026}
5027
5028void TagDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
5030 // If the name is supposed to have an identifier but does not have one, then
5031 // the tag is anonymous and we should print it differently.
5032 if (Name.isIdentifier() && !Name.getAsIdentifierInfo()) {
5033 printAnonymousTagDecl(OS, Policy);
5034
5035 return;
5036 }
5037
5038 // Otherwise, do the normal printing.
5039 Name.print(OS, Policy);
5040}
5041
5044 assert(!TPLists.empty());
5045 // Make sure the extended decl info is allocated.
5046 if (!hasExtInfo())
5047 // Allocate external info struct.
5048 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
5049 // Set the template parameter lists info.
5050 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
5051}
5052
5053//===----------------------------------------------------------------------===//
5054// EnumDecl Implementation
5055//===----------------------------------------------------------------------===//
5056
5057EnumDecl::EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
5058 SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl,
5059 bool Scoped, bool ScopedUsingClassTag, bool Fixed)
5060 : TagDecl(Enum, TagTypeKind::Enum, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
5061 assert(Scoped || !ScopedUsingClassTag);
5062 IntegerType = nullptr;
5063 setNumPositiveBits(0);
5064 setNumNegativeBits(0);
5065 setScoped(Scoped);
5066 setScopedUsingClassTag(ScopedUsingClassTag);
5067 setFixed(Fixed);
5068 setHasODRHash(false);
5069 ODRHash = 0;
5070}
5071
5072void EnumDecl::anchor() {}
5073
5075 SourceLocation StartLoc, SourceLocation IdLoc,
5076 IdentifierInfo *Id,
5077 EnumDecl *PrevDecl, bool IsScoped,
5078 bool IsScopedUsingClassTag, bool IsFixed) {
5079 return new (C, DC) EnumDecl(C, DC, StartLoc, IdLoc, Id, PrevDecl, IsScoped,
5080 IsScopedUsingClassTag, IsFixed);
5081}
5082
5084 return new (C, ID) EnumDecl(C, nullptr, SourceLocation(), SourceLocation(),
5085 nullptr, nullptr, false, false, false);
5086}
5087
5089 if (const TypeSourceInfo *TI = getIntegerTypeSourceInfo())
5090 return TI->getTypeLoc().getSourceRange();
5091 return SourceRange();
5092}
5093
5095 QualType NewPromotionType,
5096 unsigned NumPositiveBits,
5097 unsigned NumNegativeBits) {
5098 assert(!isCompleteDefinition() && "Cannot redefine enums!");
5099 if (!IntegerType)
5100 IntegerType = NewType.getTypePtr();
5101 PromotionType = NewPromotionType;
5102 setNumPositiveBits(NumPositiveBits);
5103 setNumNegativeBits(NumNegativeBits);
5105}
5106
5108 if (const auto *A = getAttr<EnumExtensibilityAttr>())
5109 return A->getExtensibility() == EnumExtensibilityAttr::Closed;
5110 return true;
5111}
5112
5114 return isClosed() && hasAttr<FlagEnumAttr>();
5115}
5116
5118 return isClosed() && !hasAttr<FlagEnumAttr>();
5119}
5120
5123 return MSI->getTemplateSpecializationKind();
5124
5125 return TSK_Undeclared;
5126}
5127
5129 SourceLocation PointOfInstantiation) {
5131 assert(MSI && "Not an instantiated member enumeration?");
5133 if (TSK != TSK_ExplicitSpecialization &&
5134 PointOfInstantiation.isValid() &&
5136 MSI->setPointOfInstantiation(PointOfInstantiation);
5137}
5138
5141 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
5142 EnumDecl *ED = getInstantiatedFromMemberEnum();
5143 while (auto *NewED = ED->getInstantiatedFromMemberEnum())
5144 ED = NewED;
5145 return ED;
5146 }
5147 }
5148
5150 "couldn't find pattern for enum instantiation");
5151 return nullptr;
5152}
5153
5155 if (SpecializationInfo)
5156 return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom());
5157
5158 return nullptr;
5159}
5160
5161void EnumDecl::setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED,
5163 assert(!SpecializationInfo && "Member enum is already a specialization");
5164 SpecializationInfo = new (C) MemberSpecializationInfo(ED, TSK);
5165}
5166
5168 if (hasODRHash())
5169 return ODRHash;
5170
5171 class ODRHash Hash;
5172 Hash.AddEnumDecl(this);
5173 setHasODRHash(true);
5174 ODRHash = Hash.CalculateHash();
5175 return ODRHash;
5176}
5177
5179 auto Res = TagDecl::getSourceRange();
5180 // Set end-point to enum-base, e.g. enum foo : ^bar
5181 if (auto *TSI = getIntegerTypeSourceInfo()) {
5182 // TagDecl doesn't know about the enum base.
5183 if (!getBraceRange().getEnd().isValid())
5184 Res.setEnd(TSI->getTypeLoc().getEndLoc());
5185 }
5186 return Res;
5187}
5188
5189void EnumDecl::getValueRange(llvm::APInt &Max, llvm::APInt &Min) const {
5190 unsigned Bitwidth = getASTContext().getIntWidth(getIntegerType());
5191 unsigned NumNegativeBits = getNumNegativeBits();
5192 unsigned NumPositiveBits = getNumPositiveBits();
5193
5194 if (NumNegativeBits) {
5195 unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
5196 Max = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
5197 Min = -Max;
5198 } else {
5199 Max = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
5200 Min = llvm::APInt::getZero(Bitwidth);
5201 }
5202}
5203
5204//===----------------------------------------------------------------------===//
5205// RecordDecl Implementation
5206//===----------------------------------------------------------------------===//
5207
5209 DeclContext *DC, SourceLocation StartLoc,
5210 SourceLocation IdLoc, IdentifierInfo *Id,
5211 RecordDecl *PrevDecl)
5212 : TagDecl(DK, TK, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
5213 assert(classof(static_cast<Decl *>(this)) && "Invalid Kind!");
5216 setHasObjectMember(false);
5217 setHasVolatileMember(false);
5228 setIsRandomized(false);
5229 setODRHash(0);
5230}
5231
5233 SourceLocation StartLoc, SourceLocation IdLoc,
5234 IdentifierInfo *Id, RecordDecl* PrevDecl) {
5235 return new (C, DC)
5236 RecordDecl(Record, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl);
5237}
5238
5240 GlobalDeclID ID) {
5241 return new (C, ID)
5243 SourceLocation(), nullptr, nullptr);
5244}
5245
5247 if (auto RD = dyn_cast<CXXRecordDecl>(this))
5248 return RD->isLambda();
5249 return false;
5250}
5251
5255
5257 addAttr(CapturedRecordAttr::CreateImplicit(getASTContext()));
5258}
5259
5261 if (isUnion())
5262 return true;
5263
5264 if (const RecordDecl *Def = getDefinition()) {
5265 for (const FieldDecl *FD : Def->fields()) {
5266 const RecordType *RT = FD->getType()->getAsCanonical<RecordType>();
5267 if (RT && RT->getDecl()->isOrContainsUnion())
5268 return true;
5269 }
5270 }
5271
5272 return false;
5273}
5274
5277 LoadFieldsFromExternalStorage();
5278 // This is necessary for correctness for C++ with modules.
5279 // FIXME: Come up with a test case that breaks without definition.
5280 if (RecordDecl *D = getDefinition(); D && D != this)
5281 return D->field_begin();
5283}
5284
5288
5289/// completeDefinition - Notes that the definition of this type is now
5290/// complete.
5292 assert(!isCompleteDefinition() && "Cannot redefine record!");
5294
5295 ASTContext &Ctx = getASTContext();
5296
5297 // Layouts are dumped when computed, so if we are dumping for all complete
5298 // types, we need to force usage to get types that wouldn't be used elsewhere.
5299 //
5300 // If the type is dependent, then we can't compute its layout because there
5301 // is no way for us to know the size or alignment of a dependent type. Also
5302 // ignore declarations marked as invalid since 'getASTRecordLayout()' asserts
5303 // on that.
5304 if (Ctx.getLangOpts().DumpRecordLayoutsComplete && !isDependentType() &&
5305 !isInvalidDecl())
5306 (void)Ctx.getASTRecordLayout(this);
5307}
5308
5309/// isMsStruct - Get whether or not this record uses ms_struct layout.
5310/// This which can be turned on with an attribute, pragma, or the
5311/// -mms-bitfields command-line option.
5314 return false;
5316 return true;
5317 auto LayoutCompatibility = C.getLangOpts().getLayoutCompatibility();
5318 if (LayoutCompatibility == LangOptions::LayoutCompatibilityKind::Default)
5319 return C.defaultsToMsStruct();
5320 return LayoutCompatibility == LangOptions::LayoutCompatibilityKind::Microsoft;
5321}
5322
5324 std::tie(FirstDecl, LastDecl) = DeclContext::BuildDeclChain(Decls, false);
5325 LastDecl->NextInContextAndBits.setPointer(nullptr);
5326 setIsRandomized(true);
5327}
5328
5329void RecordDecl::LoadFieldsFromExternalStorage() const {
5331 assert(hasExternalLexicalStorage() && Source && "No external storage?");
5332
5333 // Notify that we have a RecordDecl doing some initialization.
5334 ExternalASTSource::Deserializing TheFields(Source);
5335
5338 Source->FindExternalLexicalDecls(this, [](Decl::Kind K) {
5340 }, Decls);
5341
5342#ifndef NDEBUG
5343 // Check that all decls we got were FieldDecls.
5344 for (unsigned i=0, e=Decls.size(); i != e; ++i)
5345 assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i]));
5346#endif
5347
5348 if (Decls.empty())
5349 return;
5350
5351 auto [ExternalFirst, ExternalLast] =
5352 BuildDeclChain(Decls,
5353 /*FieldsAlreadyLoaded=*/false);
5354 ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
5355 FirstDecl = ExternalFirst;
5356 if (!LastDecl)
5357 LastDecl = ExternalLast;
5358}
5359
5360bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
5361 ASTContext &Context = getASTContext();
5362 const SanitizerMask EnabledAsanMask = Context.getLangOpts().Sanitize.Mask &
5363 (SanitizerKind::Address | SanitizerKind::KernelAddress);
5364 if (!EnabledAsanMask || !Context.getLangOpts().SanitizeAddressFieldPadding)
5365 return false;
5366 const auto &NoSanitizeList = Context.getNoSanitizeList();
5367 const auto *CXXRD = dyn_cast<CXXRecordDecl>(this);
5368 // We may be able to relax some of these requirements.
5369 int ReasonToReject = -1;
5370 if (!CXXRD || CXXRD->isExternCContext())
5371 ReasonToReject = 0; // is not C++.
5372 else if (CXXRD->hasAttr<PackedAttr>())
5373 ReasonToReject = 1; // is packed.
5374 else if (CXXRD->isUnion())
5375 ReasonToReject = 2; // is a union.
5376 else if (CXXRD->isTriviallyCopyable())
5377 ReasonToReject = 3; // is trivially copyable.
5378 else if (CXXRD->hasTrivialDestructor())
5379 ReasonToReject = 4; // has trivial destructor.
5380 else if (CXXRD->isStandardLayout())
5381 ReasonToReject = 5; // is standard layout.
5382 else if (NoSanitizeList.containsLocation(EnabledAsanMask, getLocation(),
5383 "field-padding"))
5384 ReasonToReject = 6; // is in an excluded file.
5386 EnabledAsanMask, getQualifiedNameAsString(), "field-padding"))
5387 ReasonToReject = 7; // The type is excluded.
5388
5389 if (EmitRemark) {
5390 if (ReasonToReject >= 0)
5391 Context.getDiagnostics().Report(
5392 getLocation(),
5393 diag::remark_sanitize_address_insert_extra_padding_rejected)
5394 << getQualifiedNameAsString() << ReasonToReject;
5395 else
5396 Context.getDiagnostics().Report(
5397 getLocation(),
5398 diag::remark_sanitize_address_insert_extra_padding_accepted)
5400 }
5401 return ReasonToReject < 0;
5402}
5403
5405 for (const auto *I : fields()) {
5406 if (I->getIdentifier())
5407 return I;
5408
5409 if (const auto *RD = I->getType()->getAsRecordDecl())
5410 if (const FieldDecl *NamedDataMember = RD->findFirstNamedDataMember())
5411 return NamedDataMember;
5412 }
5413
5414 // We didn't find a named data member.
5415 return nullptr;
5416}
5417
5419 if (hasODRHash())
5420 return RecordDeclBits.ODRHash;
5421
5422 // Only calculate hash on first call of getODRHash per record.
5423 ODRHash Hash;
5424 Hash.AddRecordDecl(this);
5425 // For RecordDecl the ODRHash is stored in the remaining
5426 // bits of RecordDeclBits, adjust the hash to accommodate.
5427 static_assert(sizeof(Hash.CalculateHash()) * CHAR_BIT == 32);
5428 setODRHash(Hash.CalculateHash() >> (32 - NumOdrHashBits));
5429 return RecordDeclBits.ODRHash;
5430}
5431
5432//===----------------------------------------------------------------------===//
5433// BlockDecl Implementation
5434//===----------------------------------------------------------------------===//
5435
5437 : Decl(Block, DC, CaretLoc), DeclContext(Block) {
5438 setIsVariadic(false);
5439 setCapturesCXXThis(false);
5442 setDoesNotEscape(false);
5443 setCanAvoidCopyToHeap(false);
5444}
5445
5447 assert(!ParamInfo && "Already has param info!");
5448
5449 // Zero params -> null pointer.
5450 if (!NewParamInfo.empty()) {
5451 NumParams = NewParamInfo.size();
5452 ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
5453 llvm::copy(NewParamInfo, ParamInfo);
5454 }
5455}
5456
5458 bool CapturesCXXThis) {
5459 this->setCapturesCXXThis(CapturesCXXThis);
5460 this->NumCaptures = Captures.size();
5461
5462 if (Captures.empty()) {
5463 this->Captures = nullptr;
5464 return;
5465 }
5466
5467 this->Captures = Captures.copy(Context).data();
5468}
5469
5470bool BlockDecl::capturesVariable(const VarDecl *variable) const {
5471 for (const auto &I : captures())
5472 // Only auto vars can be captured, so no redeclaration worries.
5473 if (I.getVariable() == variable)
5474 return true;
5475
5476 return false;
5477}
5478
5480 return SourceRange(getLocation(), Body ? Body->getEndLoc() : getLocation());
5481}
5482
5483//===----------------------------------------------------------------------===//
5484// Other Decl Allocation/Deallocation Method Implementations
5485//===----------------------------------------------------------------------===//
5486
5487void TranslationUnitDecl::anchor() {}
5488
5490 return new (C, (DeclContext *)nullptr) TranslationUnitDecl(C);
5491}
5492
5494 AnonymousNamespace = D;
5495
5496 if (ASTMutationListener *Listener = Ctx.getASTMutationListener())
5497 Listener->AddedAnonymousNamespace(this, D);
5498}
5499
5500void PragmaCommentDecl::anchor() {}
5501
5502PragmaCommentDecl *PragmaCommentDecl::Create(const ASTContext &C,
5504 SourceLocation CommentLoc,
5505 PragmaMSCommentKind CommentKind,
5506 StringRef Arg) {
5507 PragmaCommentDecl *PCD =
5508 new (C, DC, additionalSizeToAlloc<char>(Arg.size() + 1))
5509 PragmaCommentDecl(DC, CommentLoc, CommentKind);
5510 llvm::copy(Arg, PCD->getTrailingObjects());
5511 PCD->getTrailingObjects()[Arg.size()] = '\0';
5512 return PCD;
5513}
5514
5516 GlobalDeclID ID,
5517 unsigned ArgSize) {
5518 return new (C, ID, additionalSizeToAlloc<char>(ArgSize + 1))
5519 PragmaCommentDecl(nullptr, SourceLocation(), PCK_Unknown);
5520}
5521
5522void PragmaDetectMismatchDecl::anchor() {}
5523
5526 SourceLocation Loc, StringRef Name,
5527 StringRef Value) {
5528 size_t ValueStart = Name.size() + 1;
5529 PragmaDetectMismatchDecl *PDMD =
5530 new (C, DC, additionalSizeToAlloc<char>(ValueStart + Value.size() + 1))
5531 PragmaDetectMismatchDecl(DC, Loc, ValueStart);
5532 llvm::copy(Name, PDMD->getTrailingObjects());
5533 PDMD->getTrailingObjects()[Name.size()] = '\0';
5534 llvm::copy(Value, PDMD->getTrailingObjects() + ValueStart);
5535 PDMD->getTrailingObjects()[ValueStart + Value.size()] = '\0';
5536 return PDMD;
5537}
5538
5541 unsigned NameValueSize) {
5542 return new (C, ID, additionalSizeToAlloc<char>(NameValueSize + 1))
5543 PragmaDetectMismatchDecl(nullptr, SourceLocation(), 0);
5544}
5545
5546void ExternCContextDecl::anchor() {}
5547
5548ExternCContextDecl *ExternCContextDecl::Create(const ASTContext &C,
5549 TranslationUnitDecl *DC) {
5550 return new (C, DC) ExternCContextDecl(DC);
5551}
5552
5553void LabelDecl::anchor() {}
5554
5556 SourceLocation IdentL, IdentifierInfo *II) {
5557 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, IdentL);
5558}
5559
5561 SourceLocation IdentL, IdentifierInfo *II,
5562 SourceLocation GnuLabelL) {
5563 assert(GnuLabelL != IdentL && "Use this only for GNU local labels");
5564 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, GnuLabelL);
5565}
5566
5568 return new (C, ID) LabelDecl(nullptr, SourceLocation(), nullptr, nullptr,
5569 SourceLocation());
5570}
5571
5572void LabelDecl::setMSAsmLabel(StringRef Name) {
5573char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];
5574llvm::copy(Name, Buffer);
5575Buffer[Name.size()] = '\0';
5576MSAsmName = Buffer;
5577}
5578
5579void ValueDecl::anchor() {}
5580
5581bool ValueDecl::isWeak() const {
5582 auto *MostRecent = getMostRecentDecl();
5583 return MostRecent->hasAttr<WeakAttr>() ||
5584 MostRecent->hasAttr<WeakRefAttr>() || isWeakImported();
5585}
5586
5588 if (auto *Var = llvm::dyn_cast<VarDecl>(this))
5589 return Var->isInitCapture();
5590 return false;
5591}
5592
5594 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(this))
5595 return NTTP->isParameterPack();
5596
5597 return isa_and_nonnull<PackExpansionType>(getType().getTypePtrOrNull());
5598}
5599
5600void ImplicitParamDecl::anchor() {}
5601
5603 SourceLocation IdLoc,
5604 const IdentifierInfo *Id,
5605 QualType Type,
5606 ImplicitParamKind ParamKind) {
5607 auto *Parm = new (C, DC) ImplicitParamDecl(C, DC, IdLoc, Id, Type, ParamKind);
5609 return Parm;
5610}
5611
5613 ImplicitParamKind ParamKind) {
5614 auto *Parm = new (C, nullptr) ImplicitParamDecl(C, Type, ParamKind);
5616 return Parm;
5617}
5618
5623
5626 const DeclarationNameInfo &NameInfo, QualType T,
5627 TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin,
5629 ConstexprSpecKind ConstexprKind,
5630 const AssociatedConstraint &TrailingRequiresClause) {
5631 FunctionDecl *New = new (C, DC) FunctionDecl(
5632 Function, C, DC, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
5633 isInlineSpecified, ConstexprKind, TrailingRequiresClause);
5634 New->setHasWrittenPrototype(hasWrittenPrototype);
5635 return New;
5636}
5637
5639 return new (C, ID) FunctionDecl(
5641 nullptr, SC_None, false, false, ConstexprSpecKind::Unspecified,
5642 /*TrailingRequiresClause=*/{});
5643}
5644
5646 return hasAttr<CUDAGlobalAttr>() ||
5647 DeviceKernelAttr::isOpenCLSpelling(getAttr<DeviceKernelAttr>());
5648}
5649
5651 return new (C, DC) BlockDecl(DC, L);
5652}
5653
5657
5658OutlinedFunctionDecl::OutlinedFunctionDecl(DeclContext *DC, unsigned NumParams)
5659 : Decl(OutlinedFunction, DC, SourceLocation()),
5660 DeclContext(OutlinedFunction), NumParams(NumParams),
5661 BodyAndNothrow(nullptr, false) {}
5662
5664 DeclContext *DC,
5665 unsigned NumParams) {
5666 return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5667 OutlinedFunctionDecl(DC, NumParams);
5668}
5669
5672 unsigned NumParams) {
5673 return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5674 OutlinedFunctionDecl(nullptr, NumParams);
5675}
5676
5678 return BodyAndNothrow.getPointer();
5679}
5680void OutlinedFunctionDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); }
5681
5682bool OutlinedFunctionDecl::isNothrow() const { return BodyAndNothrow.getInt(); }
5684 BodyAndNothrow.setInt(Nothrow);
5685}
5686
5687CapturedDecl::CapturedDecl(DeclContext *DC, unsigned NumParams)
5688 : Decl(Captured, DC, SourceLocation()), DeclContext(Captured),
5689 NumParams(NumParams), ContextParam(0), BodyAndNothrow(nullptr, false) {}
5690
5692 unsigned NumParams) {
5693 return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5694 CapturedDecl(DC, NumParams);
5695}
5696
5698 unsigned NumParams) {
5699 return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5700 CapturedDecl(nullptr, NumParams);
5701}
5702
5703Stmt *CapturedDecl::getBody() const { return BodyAndNothrow.getPointer(); }
5704void CapturedDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); }
5705
5706bool CapturedDecl::isNothrow() const { return BodyAndNothrow.getInt(); }
5707void CapturedDecl::setNothrow(bool Nothrow) { BodyAndNothrow.setInt(Nothrow); }
5708
5711 QualType T, Expr *E, const llvm::APSInt &V)
5712 : ValueDecl(EnumConstant, DC, L, Id, T), Init((Stmt *)E) {
5713 setInitVal(C, V);
5714}
5715
5719 Expr *E, const llvm::APSInt &V) {
5720 return new (C, CD) EnumConstantDecl(C, CD, L, Id, T, E, V);
5721}
5722
5724 GlobalDeclID ID) {
5725 return new (C, ID) EnumConstantDecl(C, nullptr, SourceLocation(), nullptr,
5726 QualType(), nullptr, llvm::APSInt());
5727}
5728
5729void IndirectFieldDecl::anchor() {}
5730
5731IndirectFieldDecl::IndirectFieldDecl(ASTContext &C, DeclContext *DC,
5733 QualType T,
5735 : ValueDecl(IndirectField, DC, L, N, T), Chaining(CH.data()),
5736 ChainingSize(CH.size()) {
5737 // In C++, indirect field declarations conflict with tag declarations in the
5738 // same scope, so add them to IDNS_Tag so that tag redeclaration finds them.
5739 if (C.getLangOpts().CPlusPlus)
5741}
5742
5745 const IdentifierInfo *Id,
5746 QualType T,
5748 return new (C, DC) IndirectFieldDecl(C, DC, L, Id, T, CH);
5749}
5750
5752 GlobalDeclID ID) {
5753 return new (C, ID) IndirectFieldDecl(C, nullptr, SourceLocation(),
5754 DeclarationName(), QualType(), {});
5755}
5756
5759 if (Init)
5760 End = Init->getEndLoc();
5761 return SourceRange(getLocation(), End);
5762}
5763
5764void TypeDecl::anchor() {}
5765
5767 SourceLocation StartLoc, SourceLocation IdLoc,
5768 const IdentifierInfo *Id,
5769 TypeSourceInfo *TInfo) {
5770 return new (C, DC) TypedefDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5771}
5772
5773void TypedefNameDecl::anchor() {}
5774
5776 if (auto *TT = getTypeSourceInfo()->getType()->getAs<TagType>()) {
5777 auto *OwningTypedef = TT->getDecl()->getTypedefNameForAnonDecl();
5778 auto *ThisTypedef = this;
5779 if (AnyRedecl && OwningTypedef) {
5780 OwningTypedef = OwningTypedef->getCanonicalDecl();
5781 ThisTypedef = ThisTypedef->getCanonicalDecl();
5782 }
5783 if (OwningTypedef == ThisTypedef)
5784 return TT->getDecl()->getDefinitionOrSelf();
5785 }
5786
5787 return nullptr;
5788}
5789
5790bool TypedefNameDecl::isTransparentTagSlow() const {
5791 auto determineIsTransparent = [&]() {
5792 if (auto *TT = getUnderlyingType()->getAs<TagType>()) {
5793 if (auto *TD = TT->getDecl()) {
5794 if (TD->getName() != getName())
5795 return false;
5796 SourceLocation TTLoc = getLocation();
5797 SourceLocation TDLoc = TD->getLocation();
5798 if (!TTLoc.isMacroID() || !TDLoc.isMacroID())
5799 return false;
5801 return SM.getSpellingLoc(TTLoc) == SM.getSpellingLoc(TDLoc);
5802 }
5803 }
5804 return false;
5805 };
5806
5807 bool isTransparent = determineIsTransparent();
5808 MaybeModedTInfo.setInt((isTransparent << 1) | 1);
5809 return isTransparent;
5810}
5811
5813 return new (C, ID) TypedefDecl(C, nullptr, SourceLocation(), SourceLocation(),
5814 nullptr, nullptr);
5815}
5816
5818 SourceLocation StartLoc,
5819 SourceLocation IdLoc,
5820 const IdentifierInfo *Id,
5821 TypeSourceInfo *TInfo) {
5822 return new (C, DC) TypeAliasDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5823}
5824
5826 GlobalDeclID ID) {
5827 return new (C, ID) TypeAliasDecl(C, nullptr, SourceLocation(),
5828 SourceLocation(), nullptr, nullptr);
5829}
5830
5832 SourceLocation RangeEnd = getLocation();
5833 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
5834 if (TInfo->getType().hasPostfixDeclaratorSyntax())
5835 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5836 }
5837 return SourceRange(getBeginLoc(), RangeEnd);
5838}
5839
5841 SourceLocation RangeEnd = getBeginLoc();
5842 if (TypeSourceInfo *TInfo = getTypeSourceInfo())
5843 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5844 return SourceRange(getBeginLoc(), RangeEnd);
5845}
5846
5847void FileScopeAsmDecl::anchor() {}
5848
5850 Expr *Str, SourceLocation AsmLoc,
5851 SourceLocation RParenLoc) {
5852 return new (C, DC) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc);
5853}
5854
5856 GlobalDeclID ID) {
5857 return new (C, ID) FileScopeAsmDecl(nullptr, nullptr, SourceLocation(),
5858 SourceLocation());
5859}
5860
5864
5865void TopLevelStmtDecl::anchor() {}
5866
5867TopLevelStmtDecl *TopLevelStmtDecl::Create(ASTContext &C, Stmt *Statement) {
5868 assert(C.getLangOpts().IncrementalExtensions &&
5869 "Must be used only in incremental mode");
5870
5871 SourceLocation Loc = Statement ? Statement->getBeginLoc() : SourceLocation();
5872 DeclContext *DC = C.getTranslationUnitDecl();
5873
5874 return new (C, DC) TopLevelStmtDecl(DC, Loc, Statement);
5875}
5876
5878 GlobalDeclID ID) {
5879 return new (C, ID)
5880 TopLevelStmtDecl(/*DC=*/nullptr, SourceLocation(), /*S=*/nullptr);
5881}
5882
5884 return SourceRange(getLocation(), Statement->getEndLoc());
5885}
5886
5888 assert(S);
5889 Statement = S;
5890 setLocation(Statement->getBeginLoc());
5891}
5892
5893void EmptyDecl::anchor() {}
5894
5896 return new (C, DC) EmptyDecl(DC, L);
5897}
5898
5900 return new (C, ID) EmptyDecl(nullptr, SourceLocation());
5901}
5902
5903HLSLBufferDecl::HLSLBufferDecl(DeclContext *DC, bool CBuffer,
5904 SourceLocation KwLoc, IdentifierInfo *ID,
5905 SourceLocation IDLoc, SourceLocation LBrace)
5906 : NamedDecl(Decl::Kind::HLSLBuffer, DC, IDLoc, DeclarationName(ID)),
5907 DeclContext(Decl::Kind::HLSLBuffer), LBraceLoc(LBrace), KwLoc(KwLoc),
5908 IsCBuffer(CBuffer), HasValidPackoffset(false), LayoutStruct(nullptr) {}
5909
5911 DeclContext *LexicalParent, bool CBuffer,
5912 SourceLocation KwLoc, IdentifierInfo *ID,
5913 SourceLocation IDLoc,
5914 SourceLocation LBrace) {
5915 // For hlsl like this
5916 // cbuffer A {
5917 // cbuffer B {
5918 // }
5919 // }
5920 // compiler should treat it as
5921 // cbuffer A {
5922 // }
5923 // cbuffer B {
5924 // }
5925 // FIXME: support nested buffers if required for back-compat.
5926 DeclContext *DC = LexicalParent;
5927 HLSLBufferDecl *Result =
5928 new (C, DC) HLSLBufferDecl(DC, CBuffer, KwLoc, ID, IDLoc, LBrace);
5929 return Result;
5930}
5931
5934 ArrayRef<Decl *> DefaultCBufferDecls) {
5935 DeclContext *DC = LexicalParent;
5936 IdentifierInfo *II = &C.Idents.get("$Globals", tok::TokenKind::identifier);
5937 HLSLBufferDecl *Result = new (C, DC) HLSLBufferDecl(
5938 DC, true, SourceLocation(), II, SourceLocation(), SourceLocation());
5939 Result->setImplicit(true);
5940 Result->setDefaultBufferDecls(DefaultCBufferDecls);
5941 return Result;
5942}
5943
5945 GlobalDeclID ID) {
5946 return new (C, ID) HLSLBufferDecl(nullptr, false, SourceLocation(), nullptr,
5948}
5949
5951 assert(LayoutStruct == nullptr && "layout struct has already been set");
5952 LayoutStruct = LS;
5953 addDecl(LS);
5954}
5955
5956void HLSLBufferDecl::setDefaultBufferDecls(ArrayRef<Decl *> Decls) {
5957 assert(!Decls.empty());
5958 assert(DefaultBufferDecls.empty() && "default decls are already set");
5959 assert(isImplicit() &&
5960 "default decls can only be added to the implicit/default constant "
5961 "buffer $Globals");
5962
5963 // allocate array for default decls with ASTContext allocator
5964 Decl **DeclsArray = new (getASTContext()) Decl *[Decls.size()];
5965 llvm::copy(Decls, DeclsArray);
5966 DefaultBufferDecls = ArrayRef<Decl *>(DeclsArray, Decls.size());
5967}
5968
5971 return buffer_decl_iterator(llvm::iterator_range(DefaultBufferDecls.begin(),
5972 DefaultBufferDecls.end()),
5974}
5975
5977 return buffer_decl_iterator(
5978 llvm::iterator_range(DefaultBufferDecls.end(), DefaultBufferDecls.end()),
5980}
5981
5983 return DefaultBufferDecls.empty() && decls_empty();
5984}
5985
5986//===----------------------------------------------------------------------===//
5987// HLSLRootSignatureDecl Implementation
5988//===----------------------------------------------------------------------===//
5989
5990HLSLRootSignatureDecl::HLSLRootSignatureDecl(
5992 llvm::dxbc::RootSignatureVersion Version, unsigned NumElems)
5993 : NamedDecl(Decl::Kind::HLSLRootSignature, DC, Loc, DeclarationName(ID)),
5994 Version(Version), NumElems(NumElems) {}
5995
5996HLSLRootSignatureDecl *HLSLRootSignatureDecl::Create(
5998 llvm::dxbc::RootSignatureVersion Version,
6000 HLSLRootSignatureDecl *RSDecl =
6001 new (C, DC,
6002 additionalSizeToAlloc<llvm::hlsl::rootsig::RootElement>(
6003 RootElements.size()))
6004 HLSLRootSignatureDecl(DC, Loc, ID, Version, RootElements.size());
6005 auto *StoredElems = RSDecl->getElems();
6006 llvm::uninitialized_copy(RootElements, StoredElems);
6007 return RSDecl;
6008}
6009
6012 HLSLRootSignatureDecl *Result = new (C, ID)
6013 HLSLRootSignatureDecl(nullptr, SourceLocation(), nullptr,
6014 /*Version*/ llvm::dxbc::RootSignatureVersion::V1_1,
6015 /*NumElems=*/0);
6016 return Result;
6017}
6018
6019//===----------------------------------------------------------------------===//
6020// ImportDecl Implementation
6021//===----------------------------------------------------------------------===//
6022
6023/// Retrieve the number of module identifiers needed to name the given
6024/// module.
6025static unsigned getNumModuleIdentifiers(Module *Mod) {
6026 unsigned Result = 1;
6027 while (Mod->Parent) {
6028 Mod = Mod->Parent;
6029 ++Result;
6030 }
6031 return Result;
6032}
6033
6034ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
6035 Module *Imported,
6036 ArrayRef<SourceLocation> IdentifierLocs)
6037 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
6038 NextLocalImportAndComplete(nullptr, true) {
6039 assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size());
6040 auto *StoredLocs = getTrailingObjects();
6041 llvm::uninitialized_copy(IdentifierLocs, StoredLocs);
6042}
6043
6044ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
6045 Module *Imported, SourceLocation EndLoc)
6046 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
6047 NextLocalImportAndComplete(nullptr, false) {
6048 *getTrailingObjects() = EndLoc;
6049}
6050
6052 SourceLocation StartLoc, Module *Imported,
6053 ArrayRef<SourceLocation> IdentifierLocs) {
6054 return new (C, DC,
6055 additionalSizeToAlloc<SourceLocation>(IdentifierLocs.size()))
6056 ImportDecl(DC, StartLoc, Imported, IdentifierLocs);
6057}
6058
6060 SourceLocation StartLoc,
6061 Module *Imported,
6062 SourceLocation EndLoc) {
6063 ImportDecl *Import = new (C, DC, additionalSizeToAlloc<SourceLocation>(1))
6064 ImportDecl(DC, StartLoc, Imported, EndLoc);
6065 Import->setImplicit();
6066 return Import;
6067}
6068
6070 unsigned NumLocations) {
6071 return new (C, ID, additionalSizeToAlloc<SourceLocation>(NumLocations))
6072 ImportDecl(EmptyShell());
6073}
6074
6076 if (!isImportComplete())
6077 return {};
6078
6079 return getTrailingObjects(getNumModuleIdentifiers(getImportedModule()));
6080}
6081
6083 if (!isImportComplete())
6084 return SourceRange(getLocation(), *getTrailingObjects());
6085
6086 return SourceRange(getLocation(), getIdentifierLocs().back());
6087}
6088
6089//===----------------------------------------------------------------------===//
6090// ExportDecl Implementation
6091//===----------------------------------------------------------------------===//
6092
6093void ExportDecl::anchor() {}
6094
6096 SourceLocation ExportLoc) {
6097 return new (C, DC) ExportDecl(DC, ExportLoc);
6098}
6099
6101 return new (C, ID) ExportDecl(nullptr, SourceLocation());
6102}
6103
6105 bool IncludeLocallyStreaming) {
6106 if (IncludeLocallyStreaming)
6107 if (FD->hasAttr<ArmLocallyStreamingAttr>())
6108 return true;
6109
6110 assert(!FD->getType().isNull() && "Expected a valid FunctionDecl");
6111 if (const auto *FPT = FD->getType()->getAs<FunctionProtoType>())
6112 if (FPT->getAArch64SMEAttributes() & FunctionType::SME_PStateSMEnabledMask)
6113 return true;
6114
6115 return false;
6116}
6117
6119 const auto *T = FD->getType()->getAs<FunctionProtoType>();
6120 return (T && FunctionType::getArmZAState(T->getAArch64SMEAttributes()) !=
6122 (FD->hasAttr<ArmNewAttr>() && FD->getAttr<ArmNewAttr>()->isNewZA());
6123}
6124
6126 const auto *T = FD->getType()->getAs<FunctionProtoType>();
6127 return (T && FunctionType::getArmZT0State(T->getAArch64SMEAttributes()) !=
6129 (FD->hasAttr<ArmNewAttr>() && FD->getAttr<ArmNewAttr>()->isNewZT0());
6130}
Defines the clang::ASTContext interface.
#define V(N, I)
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
static bool isFirstInExternCContext(T *D)
Definition Decl.cpp:574
static bool isRedeclarableImpl(Redeclarable< T > *)
Definition Decl.cpp:1858
static bool isDeclExternC(const T &D)
Definition Decl.cpp:2210
static bool hasExplicitVisibilityAlready(LVComputationKind computation)
Does this computation kind permit us to consider additional visibility settings from attributes and t...
Definition Decl.cpp:159
static bool RedeclForcesDefC99(const FunctionDecl *Redecl)
Definition Decl.cpp:3899
static bool isExportedFromModuleInterfaceUnit(const NamedDecl *D)
Definition Decl.cpp:1190
static bool isRedeclarable(Decl::Kind K)
Definition Decl.cpp:1862
static bool redeclForcesDefMSVC(const FunctionDecl *Redecl)
Definition Decl.cpp:3887
static bool usesTypeVisibility(const NamedDecl *D)
Is the given declaration a "type" or a "value" for the purposes of visibility computation?
Definition Decl.cpp:180
static std::optional< Visibility > getVisibilityOf(const NamedDecl *D, NamedDecl::ExplicitVisibilityKind kind)
Return the explicit visibility of the given declaration.
Definition Decl.cpp:222
static LanguageLinkage getDeclLanguageLinkage(const T &D)
Definition Decl.cpp:2183
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:166
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:190
static unsigned getNumModuleIdentifiers(Module *Mod)
Retrieve the number of module identifiers needed to name the given module.
Definition Decl.cpp:6025
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 Visibility getVisibilityFromAttr(const T *attr)
Given a visibility attribute, return the explicit visibility associated with it.
Definition Decl.cpp:208
static const Decl * getOutermostFuncOrBlockContext(const Decl *D)
Definition Decl.cpp:302
static LinkageInfo getExternalLinkageFor(const NamedDecl *D)
Definition Decl.cpp:586
static StorageClass getStorageClass(const Decl *D)
Definition Decl.cpp:590
static std::optional< Visibility > getExplicitVisibilityAux(const NamedDecl *ND, NamedDecl::ExplicitVisibilityKind kind, bool IsMostRecent)
Definition Decl.cpp:1232
static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl)
Definition Decl.cpp:1997
static bool isNamed(const NamedDecl *ND, const char(&Str)[Len])
Definition Decl.cpp:3286
static std::optional< Visibility > getExplicitVisibility(const NamedDecl *D, LVComputationKind kind)
Definition Decl.cpp:171
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
TokenType getType() const
Returns the token's type, e.g.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
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,...
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::SanitizerKind enum.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
Definition SemaCUDA.cpp:183
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:44
Defines the clang::Visibility enumeration and various utility functions.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
bool isAbsent() const
Definition APValue.h:484
bool needsCleanup() const
Returns whether the object performed allocations.
Definition APValue.cpp:436
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
SourceManager & getSourceManager()
Definition ASTContext.h:869
const ConstantArrayType * getAsConstantArrayType(QualType T) const
unsigned getIntWidth(QualType T) const
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
void setIsTypeAwareOperatorNewOrDelete(const FunctionDecl *FD, bool IsTypeAware)
void Deallocate(void *Ptr) const
Definition ASTContext.h:888
const LangOptions & getLangOpts() const
Definition ASTContext.h:965
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)
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
bool isDestroyingOperatorDelete(const FunctionDecl *FD) const
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
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 ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:927
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.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
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...
void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying)
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/...
CharUnits getSize() const
getSize - Get the record size in characters.
unsigned getFieldCount() const
getFieldCount - Get the number of fields in the layout.
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
Attr - This represents one attribute.
Definition Attr.h:46
Type source information for an attributed type.
Definition TypeLoc.h:1008
BlockDecl(DeclContext *DC, SourceLocation CaretLoc)
Definition Decl.cpp:5436
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.cpp:5446
void setDoesNotEscape(bool B=true)
Definition Decl.h:4868
void setCapturesCXXThis(bool B=true)
Definition Decl.h:4849
void setCanAvoidCopyToHeap(bool B=true)
Definition Decl.h:4873
void setIsConversionFromLambda(bool val=true)
Definition Decl.h:4863
void setBlockMissingReturnType(bool val=true)
Definition Decl.h:4855
ArrayRef< Capture > captures() const
Definition Decl.h:4843
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5479
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5654
void setIsVariadic(bool value)
Definition Decl.h:4792
bool capturesVariable(const VarDecl *var) const
Definition Decl.cpp:5470
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition Decl.cpp:5457
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition Decl.cpp:5650
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:2032
void setBody(Stmt *B)
Definition Decl.cpp:5704
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5697
bool isNothrow() const
Definition Decl.cpp:5706
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5707
static CapturedDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition Decl.cpp:5691
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:5703
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
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 TypeBase.h:3929
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
Definition TypeBase.h:3501
A POD class for pairing a NamedDecl* with an access specifier.
decl_iterator - Iterates through the declarations stored within this context.
Definition DeclBase.h:2360
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2126
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition DeclBase.h:2259
FunctionDeclBitfields FunctionDeclBits
Definition DeclBase.h:2061
bool isFileContext() const
Definition DeclBase.h:2197
static std::pair< Decl *, Decl * > BuildDeclChain(ArrayRef< Decl * > Decls, bool FieldsAlreadyLoaded)
Build up a chain of declarations.
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
TagDeclBitfields TagDeclBits
Definition DeclBase.h:2057
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
bool isNamespace() const
Definition DeclBase.h:2219
bool isTranslationUnit() const
Definition DeclBase.h:2202
bool isRecord() const
Definition DeclBase.h:2206
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
RecordDeclBitfields RecordDeclBits
Definition DeclBase.h:2059
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
Definition DeclBase.h:2096
DeclContext(Decl::Kind K)
void addDecl(Decl *D)
Add the declaration D into this context.
llvm::iterator_range< decl_iterator > decl_range
Definition DeclBase.h:2399
decl_iterator decls_end() const
Definition DeclBase.h:2405
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2718
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
Definition DeclBase.h:2102
bool decls_empty() const
bool isInlineNamespace() const
bool isFunctionOrMethod() const
Definition DeclBase.h:2178
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
Decl::Kind getDeclKind() const
Definition DeclBase.h:2119
decl_iterator decls_begin() const
DeclContext * getEnclosingNonExpansionStatementContext()
Retrieve the innermost enclosing context that doesn't belong to an expansion statement.
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Decl()=delete
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition DeclBase.h:1078
bool isInStdNamespace() const
Definition DeclBase.cpp:453
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclBase.h:443
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1243
T * getAttr() const
Definition DeclBase.h:581
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:550
void addAttr(Attr *A)
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
bool isInNamedModule() const
Whether this declaration comes from a named module.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
Definition Decl.cpp:99
bool isWeakImported() const
Determine whether this is a weak-imported symbol.
Definition DeclBase.cpp:876
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
Definition DeclBase.h:893
ASTMutationListener * getASTMutationListener() const
Definition DeclBase.cpp:560
bool hasCachedLinkage() const
Definition DeclBase.h:429
Kind
Lists the kind of concrete classes of Decl.
Definition DeclBase.h:89
@ FOK_None
Not a friend object.
Definition DeclBase.h:1234
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition DeclBase.h:1001
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition DeclBase.cpp:273
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:805
Linkage getCachedLinkage() const
Definition DeclBase.h:421
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition DeclBase.h:2823
bool isInvalidDecl() const
Definition DeclBase.h:596
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
Definition DeclBase.cpp:637
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition DeclBase.h:567
SourceLocation getLocation() const
Definition DeclBase.h:447
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:1066
void setLocation(SourceLocation L)
Definition DeclBase.h:448
friend class LinkageComputer
Definition DeclBase.h:337
DeclContext * getDeclContext()
Definition DeclBase.h:456
bool isInAnonymousNamespace() const
Definition DeclBase.cpp:443
void setCachedLinkage(Linkage L) const
Definition DeclBase.h:425
friend class RecordDecl
Definition DeclBase.h:338
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
Definition Decl.cpp:1639
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:935
bool hasAttr() const
Definition DeclBase.h:585
friend class DeclContext
Definition DeclBase.h:260
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:995
@ VisiblePromoted
This declaration has an owning module, and is not visible to the current TU but we promoted it to be ...
Definition DeclBase.h:237
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
Definition DeclBase.h:229
@ Unowned
This declaration is not owned by a module.
Definition DeclBase.h:218
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
Definition DeclBase.h:242
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
Definition DeclBase.h:248
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Definition DeclBase.h:225
Kind getKind() const
Definition DeclBase.h:450
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
Definition DeclBase.cpp:556
The name of a declaration.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
bool isAnyOperatorDelete() const
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
SourceLocation getTypeSpecEndLoc() const
Definition Decl.cpp:2011
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
Definition Decl.h:822
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
Definition Decl.cpp:2067
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2071
SourceLocation getTypeSpecStartLoc() const
Definition Decl.cpp:2005
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:831
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Definition Decl.h:855
DeclaratorDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL)
Definition Decl.h:800
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition Decl.cpp:2017
void setTrailingRequiresClause(const AssociatedConstraint &AC)
Definition Decl.cpp:2036
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition Decl.cpp:2051
Provides information about a dependent function-template specialization declaration.
static DependentFunctionTemplateSpecializationInfo * Create(ASTContext &Context, const UnresolvedSetImpl &Candidates, const TemplateArgumentListInfo *TemplateArgs)
Definition Decl.cpp:4375
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition Decl.cpp:5895
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5899
EnumConstantDecl(const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition Decl.cpp:5709
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5723
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition Decl.h:3492
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition Decl.cpp:5716
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5757
Represents an enum.
Definition Decl.h:4055
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4327
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
Definition Decl.h:4265
unsigned getODRHash()
Definition Decl.cpp:5167
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:5128
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
Definition Decl.cpp:5074
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
Definition Decl.h:4244
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5083
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
Definition Decl.cpp:5113
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
Definition Decl.cpp:5088
SourceRange getSourceRange() const override LLVM_READONLY
Overrides to provide correct range when there's an enum-base specifier with forward declarations.
Definition Decl.cpp:5178
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition Decl.h:4228
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
Definition Decl.cpp:5154
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
Definition Decl.h:4254
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Definition Decl.cpp:5121
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
Definition Decl.cpp:5107
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
Definition Decl.cpp:5139
bool isClosedNonFlag() const
Returns true if this enum is annotated with neither flag_enum nor enum_extensibility(open).
Definition Decl.cpp:5117
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:5189
static ExportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExportLoc)
Definition Decl.cpp:6095
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6100
This represents one expression.
Definition Expr.h:112
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:177
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
Definition Expr.cpp:3700
QualType getType() const
Definition Expr.h:144
static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)
Definition Decl.cpp:5548
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Abstract interface for external sources of AST nodes.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3204
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Definition Decl.cpp:4725
bool isBitField() const
Determines whether this field is a bitfield.
Definition Decl.h:3307
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3384
FieldDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
Definition Decl.h:3264
LazyDeclStmtPtr Init
Definition Decl.h:3254
unsigned getBitWidthValue() const
Computes the bit width of this field, if this is a bit field.
Definition Decl.cpp:4752
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
Definition Decl.cpp:4715
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4826
bool hasConstantIntegerBitWidth() const
Determines whether the bit width of this field is a constant integer.
Definition Decl.cpp:4747
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:4709
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Definition Decl.cpp:4735
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition Decl.h:3440
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:4766
InitAndBitWidthStorage * InitAndBitWidth
Definition Decl.h:3258
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:4700
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
Definition Decl.h:3451
static bool classofKind(Kind K)
Definition Decl.h:3456
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Definition Decl.h:3310
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
Definition Decl.cpp:4761
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
Definition Decl.h:3320
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:4845
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
Definition Decl.cpp:4855
bool isPotentiallyOverlapping() const
Determine if this field is of potentially-overlapping class type, that is, subobject with the [[no_un...
Definition Decl.cpp:4804
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
Definition Decl.cpp:4835
const VariableArrayType * CapturedVLAType
Definition Decl.h:3260
std::string getAsmString() const
Definition Decl.cpp:5861
const Expr * getAsmStringExpr() const
Definition Decl.h:4664
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Definition Decl.cpp:5849
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5855
Stashed information about a defaulted/deleted function body, including the active FP pragma overrides...
Definition Decl.h:2060
void setDeletedMessage(StringLiteral *Message)
Definition Decl.cpp:3162
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, StringLiteral *DeletedMessage=nullptr)
Definition Decl.cpp:3119
Represents a function declaration or definition.
Definition Decl.h:2029
unsigned getMemoryFunctionKind() const
Identify a memory copying or setting function.
Definition Decl.cpp:4553
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
Definition Decl.h:2682
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
Definition Decl.cpp:3704
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition Decl.h:2729
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, const AssociatedConstraint &TrailingRequiresClause={})
Definition Decl.h:2225
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2837
bool hasTrivialBody() const
Returns whether the function has a trivial body that does not require any specific codegen.
Definition Decl.cpp:3190
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
Definition Decl.cpp:3174
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition Decl.cpp:3827
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition Decl.cpp:4185
void setPreviousDeclaration(FunctionDecl *PrevDecl)
Definition Decl.cpp:3713
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition Decl.cpp:4178
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4173
void setIsPureVirtual(bool P=true)
Definition Decl.cpp:3278
bool isImmediateFunction() const
Definition Decl.cpp:3320
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition Decl.cpp:3140
SourceLocation getEllipsisLoc() const
Returns the location of the ellipsis of a variadic function.
Definition Decl.h:2259
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
Definition Decl.cpp:4004
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition Decl.cpp:3531
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5638
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition Decl.cpp:3742
SourceLocation getPointOfInstantiation() const
Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...
Definition Decl.cpp:4514
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
Definition Decl.cpp:3646
bool hasCXXExplicitFunctionObjectParameter() const
Definition Decl.cpp:3845
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2961
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
Definition Decl.h:2949
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition Decl.cpp:3631
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2814
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
Definition Decl.cpp:3686
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:4244
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
Definition Decl.cpp:3871
unsigned getMinRequiredExplicitArguments() const
Returns the minimum number of non-object arguments needed to call this function.
Definition Decl.cpp:3854
bool BodyContainsImmediateEscalatingExpressions() const
Definition Decl.h:2526
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition Decl.cpp:3594
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4293
bool hasWrittenPrototype() const
Whether this function has a written prototype.
Definition Decl.h:2484
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4152
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4303
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:3727
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
Definition Decl.cpp:3981
bool isVariadic() const
Whether this function is variadic.
Definition Decl.cpp:3112
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition Decl.h:2362
bool isConstexprSpecified() const
Definition Decl.h:2515
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
Definition Decl.cpp:4369
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4309
SourceRange getExceptionSpecSourceRange() const
Attempt to compute an informative source range covering the function exception specification,...
Definition Decl.cpp:4036
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:2289
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
Definition Decl.cpp:3355
unsigned getODRHash()
Returns ODRHash of the function.
Definition Decl.cpp:4679
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Determine the kind of template specialization this function represents for the purpose of template in...
Definition Decl.cpp:4421
FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass S, bool UsesFPIntrin, bool isInlineSpecified, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause)
Definition Decl.cpp:3058
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
Definition Decl.cpp:4237
unsigned getNumNonObjectParams() const
Definition Decl.cpp:3849
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition Decl.h:2034
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2045
@ TK_DependentFunctionTemplateSpecialization
Definition Decl.h:2048
UsualDeleteParams getUsualDeleteParams() const
Definition Decl.cpp:3547
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:2928
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
Definition Decl.cpp:4526
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
Definition Decl.cpp:3506
bool FriendConstraintRefersToEnclosingTemplate() const
Definition Decl.h:2747
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4124
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition Decl.cpp:4191
bool isDeletedAsWritten() const
Definition Decl.h:2580
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Definition Decl.cpp:3383
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:4358
bool isInExternCContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C" linkage spec.
Definition Decl.cpp:3602
static constexpr unsigned RequiredTypeAwareNewParameterCount
Count of mandatory parameters for type aware operator new.
Definition Decl.h:2678
bool isImplicitlyInstantiable() const
Determines whether this function is a function template specialization or a member of a class templat...
Definition Decl.cpp:4202
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition Decl.cpp:3598
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:2336
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isDefined() const
Definition Decl.h:2312
LazyDeclStmtPtr Body
The body of the function.
Definition Decl.h:2102
bool isImmediateEscalating() const
Definition Decl.cpp:3291
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
Definition Decl.cpp:3535
bool isUsableAsGlobalAllocationFunctionInConstantEvaluation(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions described in i...
Definition Decl.cpp:3406
DefaultedOrDeletedFunctionInfo * DefaultedOrDeletedInfo
Information about a future defaulted function definition.
Definition Decl.h:2104
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
Definition Decl.cpp:3539
bool isInExternCXXContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C++" linkage spec.
Definition Decl.cpp:3608
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition Decl.cpp:3348
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition Decl.h:2956
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
Definition Decl.cpp:3708
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
Definition Decl.cpp:3543
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
Definition Decl.cpp:3203
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
Definition Decl.cpp:3682
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2421
bool isReferenceableKernel() const
Definition Decl.cpp:5645
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4549
FunctionDecl * getInstantiatedFromDecl() const
Definition Decl.cpp:4197
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4466
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
Definition Decl.cpp:4118
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4110
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4397
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
Definition Decl.cpp:3921
bool isConsteval() const
Definition Decl.h:2518
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
Definition Decl.cpp:3690
bool isAnalyzerNoReturn() const
Determines whether this function is known to be 'noreturn' for analyzer, through an analyzer_noreturn...
Definition Decl.cpp:3642
void setBody(Stmt *B)
Definition Decl.cpp:3271
bool isGlobal() const
Determines whether this is a global function.
Definition Decl.cpp:3612
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
Definition Decl.cpp:3859
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition Decl.cpp:3149
bool isImplicitHDExplicitInstantiation() const
True if both host and device are implicit attributes and this is (or is a member of) an explicit temp...
Definition Decl.cpp:4494
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:3695
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4145
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:4058
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3806
DeclarationNameInfo getNameInfo() const
Definition Decl.h:2247
Redeclarable< FunctionDecl > redeclarable_base
Definition Decl.h:2196
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Definition Decl.cpp:3179
SourceRange getParametersSourceRange() const
Attempt to compute an informative source range covering the function parameters, including the ellips...
Definition Decl.cpp:4020
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition Decl.h:2939
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
Definition Decl.cpp:3668
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:3104
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Definition Decl.h:2725
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Definition Decl.cpp:4319
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5406
param_type_iterator param_type_begin() const
Definition TypeBase.h:5850
unsigned getNumParams() const
Definition TypeBase.h:5684
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5810
param_type_iterator param_type_end() const
Definition TypeBase.h:5854
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
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,...
Wrapper for source info for functions.
Definition TypeLoc.h:1675
SourceRange getExceptionSpecRange() const
Definition TypeLoc.h:1727
TypeLoc getReturnLoc() const
Definition TypeLoc.h:1756
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4602
static ArmStateValue getArmZT0State(unsigned AttrBits)
Definition TypeBase.h:4911
static ArmStateValue getArmZAState(unsigned AttrBits)
Definition TypeBase.h:4907
static std::string ExtractStringFromGCCAsmStmtComponent(const Expr *E)
Definition Stmt.cpp:554
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5238
buffer_decl_iterator buffer_decls_begin() const
Definition Decl.cpp:5970
static HLSLBufferDecl * Create(ASTContext &C, DeclContext *LexicalParent, bool CBuffer, SourceLocation KwLoc, IdentifierInfo *ID, SourceLocation IDLoc, SourceLocation LBrace)
Definition Decl.cpp:5910
void addLayoutStruct(CXXRecordDecl *LS)
Definition Decl.cpp:5950
bool buffer_decls_empty()
Definition Decl.cpp:5982
llvm::concat_iterator< Decl *const, SmallVector< Decl * >::const_iterator, decl_iterator > buffer_decl_iterator
Definition Decl.h:5308
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5944
buffer_decl_iterator buffer_decls_end() const
Definition Decl.cpp:5976
static HLSLBufferDecl * CreateDefaultCBuffer(ASTContext &C, DeclContext *LexicalParent, ArrayRef< Decl * > DefaultCBufferDecls)
Definition Decl.cpp:5933
static HLSLRootSignatureDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, IdentifierInfo *ID, llvm::dxbc::RootSignatureVersion Version, ArrayRef< llvm::hlsl::rootsig::RootElement > RootElements)
Definition Decl.cpp:5996
static HLSLRootSignatureDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6011
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.
ImplicitParamDecl(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, const IdentifierInfo *Id, QualType Type, ImplicitParamKind ParamKind)
Definition Decl.h:1781
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition Decl.cpp:5602
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5619
static ImportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, ArrayRef< SourceLocation > IdentifierLocs)
Create a new module import declaration.
Definition Decl.cpp:6051
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:6082
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition Decl.cpp:6069
friend class ASTContext
Definition Decl.h:5098
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:6075
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition Decl.h:5155
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:6059
static bool classofKind(Kind K)
Definition Decl.h:3553
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5751
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
Definition Decl.cpp:5743
void setMSAsmLabel(StringRef Name)
Definition Decl.cpp:5572
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
Definition Decl.cpp:5555
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5567
@ Microsoft
Use Microsoft C++ ABI rules for bit-field layout and fundamental types alignment.
@ Default
Use default layout rules of the target.
RegisterStaticDestructorsKind
Controls which variables have static destructors registered.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
LinkageInfo getTypeLinkageAndVisibility(const Type *T)
Definition Type.cpp:5143
LinkageInfo computeLVForDecl(const NamedDecl *D, LVComputationKind computation, bool IgnoreVarTypeLinkage=false)
Definition Decl.cpp:1460
LinkageInfo getLVForDecl(const NamedDecl *D, LVComputationKind computation)
getLVForDecl - Get the linkage and visibility for the given declaration.
Definition Decl.cpp:1580
LinkageInfo getDeclLinkageAndVisibility(const NamedDecl *D)
Definition Decl.cpp:1629
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...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the template specialization kind.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
NamedDecl * getInstantiatedFrom() const
Retrieve the member declaration from which this member was instantiated.
Describes a module or submodule.
Definition Module.h:340
Module * Parent
The parent of this module.
Definition Module.h:389
ModuleKind Kind
The kind of this module.
Definition Module.h:385
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
Definition Module.h:363
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition Module.h:354
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
Definition Module.h:381
@ ModulePartitionInterface
This is a C++20 module partition interface.
Definition Module.h:366
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
Definition Module.h:360
@ ModuleHeaderUnit
This is a C++20 header unit.
Definition Module.h:357
@ ModulePartitionImplementation
This is a C++20 module partition implementation.
Definition Module.h:369
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition Module.h:376
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition Module.h:373
This represents a decl that may have a name.
Definition Decl.h:274
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition Decl.h:487
ExplicitVisibilityKind
Kinds of explicit visibility.
Definition Decl.h:452
@ VisibilityForValue
Do an LV computation for, ultimately, a non-type declaration.
Definition Decl.h:461
@ VisibilityForType
Do an LV computation for, ultimately, a type.
Definition Decl.h:456
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
Definition Decl.cpp:1182
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
Definition Decl.h:286
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
Definition Decl.cpp:1227
bool isLinkageValid() const
True if the computed linkage is valid.
Definition Decl.cpp:1085
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:301
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition Decl.cpp:1095
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
std::string getQualifiedNameAsString() const
Definition Decl.cpp:1683
std::optional< Visibility > getExplicitVisibility(ExplicitVisibilityKind kind) const
If visibility was explicitly specified for this declaration, return that visibility.
Definition Decl.cpp:1314
NamedDecl * getMostRecentDecl()
Definition Decl.h:501
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:1849
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:1873
ObjCStringFormatFamily getObjCFStringFormattingFamily() const
Definition Decl.cpp:1169
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Definition Decl.cpp:1207
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:1690
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:1675
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
Definition Decl.cpp:1977
bool hasLinkage() const
Determine whether this declaration has linkage.
Definition Decl.cpp:1945
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
Definition Decl.cpp:1132
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Definition Decl.h:397
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:1717
Represent a C++ namespace.
Definition Decl.h:592
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:763
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Definition ODRHash.cpp:670
void AddRecordDecl(const RecordDecl *Record)
Definition ODRHash.cpp:625
unsigned CalculateHash()
Definition ODRHash.cpp:231
Represents a partial function definition.
Definition Decl.h:4923
static OutlinedFunctionDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition Decl.cpp:5663
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5683
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5671
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:5677
Represents a parameter to a function.
Definition Decl.h:1819
void setDefaultArg(Expr *defarg)
Definition Decl.cpp:3001
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2953
ParmVarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Definition Decl.h:1825
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
Definition Decl.h:1948
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
Definition Decl.cpp:3006
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3026
bool hasUninstantiatedDefaultArg() const
Definition Decl.h:1952
bool isDestroyedInCallee() const
Determines whether this parameter is destroyed in the callee function.
Definition Decl.cpp:2974
bool hasInheritedDefaultArg() const
Definition Decl.h:1964
bool isExplicitObjectParameter() const
Definition Decl.h:1907
QualType getOriginalType() const
Definition Decl.cpp:2945
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:2936
Expr * getDefaultArg()
Definition Decl.cpp:2989
Expr * getUninstantiatedDefaultArg()
Definition Decl.cpp:3031
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
Definition Decl.cpp:3037
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2959
static PragmaCommentDecl * Create(const ASTContext &C, TranslationUnitDecl *DC, SourceLocation CommentLoc, PragmaMSCommentKind CommentKind, StringRef Arg)
Definition Decl.cpp:5502
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition Decl.cpp:5515
Represents a #pragma detect_mismatch line.
Definition Decl.h:201
static PragmaDetectMismatchDecl * Create(const ASTContext &C, TranslationUnitDecl *DC, SourceLocation Loc, StringRef Name, StringRef Value)
Definition Decl.cpp:5525
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition Decl.cpp:5540
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
void print(raw_ostream &OS) const override
Definition Decl.cpp:80
virtual bool isScopeVisible(const DeclContext *DC) const
When printing type to be inserted into code in specific context, this callback can be used to avoid p...
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8489
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 TypeBase.h:1561
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition TypeBase.h:8535
Represents a struct/union/class.
Definition Decl.h:4369
bool hasLoadedFieldsFromExternalStorage() const
Definition Decl.h:4438
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition Decl.cpp:5418
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
Definition Decl.cpp:5246
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:5312
void setAnonymousStructOrUnion(bool Anon)
Definition Decl.h:4425
RecordDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl)
Definition Decl.cpp:5208
const FieldDecl * findFirstNamedDataMember() const
Finds the first data member which has a name.
Definition Decl.cpp:5404
field_iterator noload_field_begin() const
Definition Decl.cpp:5285
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition Decl.h:4515
void setNonTrivialToPrimitiveCopy(bool V)
Definition Decl.h:4459
bool isCapturedRecord() const
Determine whether this record is a record for captured variables in CapturedStmt construct.
Definition Decl.cpp:5252
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition Decl.h:4491
field_range fields() const
Definition Decl.h:4572
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition Decl.h:4483
void setHasFlexibleArrayMember(bool V)
Definition Decl.h:4406
void setParamDestroyedInCallee(bool V)
Definition Decl.h:4523
void setNonTrivialToPrimitiveDestroy(bool V)
Definition Decl.h:4467
void setHasObjectMember(bool val)
Definition Decl.h:4430
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
Definition Decl.cpp:5232
void setHasVolatileMember(bool val)
Definition Decl.h:4434
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition Decl.h:4475
void reorderDecls(const SmallVectorImpl< Decl * > &Decls)
Definition Decl.cpp:5323
void setIsRandomized(bool V)
Definition Decl.h:4529
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5239
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition Decl.cpp:5360
static bool classof(const Decl *D)
Definition Decl.h:4609
bool isOrContainsUnion() const
Returns whether this record is a union, or contains (at any nesting level) a union member.
Definition Decl.cpp:5260
virtual void completeDefinition()
Note that the definition of this type is now complete.
Definition Decl.cpp:5291
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition Decl.h:4553
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
Definition Decl.cpp:5256
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4569
void setHasUninitializedExplicitInitFields(bool V)
Definition Decl.h:4499
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition Decl.h:4451
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4557
friend class DeclContext
Definition Decl.h:4373
void setHasLoadedFieldsFromExternalStorage(bool val) const
Definition Decl.h:4442
field_iterator field_begin() const
Definition Decl.cpp:5275
Declaration of a redeclarable template.
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
Provides common interface for the Decls that can be redeclared.
TagDecl * getNextRedeclaration() const
void setPreviousDecl(FunctionDecl *PrevDecl)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
bool isInvalid() const
SourceLocation getEnd() const
Stmt - This represents one statement.
Definition Stmt.h:85
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:367
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1805
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3761
void setTagKind(TagKind TK)
Definition Decl.h:3965
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition Decl.h:3877
SourceRange getBraceRange() const
Definition Decl.h:3838
TagTypeKind TagKind
Definition Decl.h:3766
bool isBeingDefined() const
Return true if this decl is currently being defined.
Definition Decl.h:3882
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
Definition Decl.cpp:4929
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:3892
StringRef getKindName() const
Definition Decl.h:3957
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3862
redeclarable_base::redecl_iterator redecl_iterator
Definition Decl.h:3829
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition Decl.h:3998
void startDefinition()
Starts the definition of this tag declaration.
Definition Decl.cpp:4906
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:4899
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
Definition Decl.cpp:4901
SourceLocation getOuterLocStart() const
Return SourceLocation representing start of source range taking into account any outer template decla...
Definition Decl.cpp:4889
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4893
void printAnonymousTagDeclLocation(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
Definition Decl.cpp:4963
bool isUnion() const
Definition Decl.h:3972
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
Definition Decl.h:3816
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition Decl.cpp:4943
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition Decl.cpp:5042
void completeDefinition()
Completes the definition of this tag declaration.
Definition Decl.cpp:4917
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:5028
Redeclarable< TagDecl > redeclarable_base
Definition Decl.h:3796
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition Decl.h:3900
redeclarable_base::redecl_range redecl_range
Definition Decl.h:3828
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Definition Decl.h:3907
void printAnonymousTagDecl(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
Definition Decl.cpp:4987
TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl, SourceLocation StartL)
Definition Decl.cpp:4872
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition Decl.h:3865
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
A template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5877
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Definition Decl.cpp:5867
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5883
void setStmt(Stmt *S)
Definition Decl.cpp:5887
The top declaration context.
Definition Decl.h:105
static TranslationUnitDecl * Create(ASTContext &C)
Definition Decl.cpp:5489
ASTContext & getASTContext() const
Definition Decl.h:141
void setAnonymousNamespace(NamespaceDecl *D)
Definition Decl.cpp:5493
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5825
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition Decl.cpp:5817
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5840
friend class ASTContext
Definition Decl.h:3558
TypeDecl(Kind DK, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, SourceLocation StartL=SourceLocation())
Definition Decl.h:3573
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:3591
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
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
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
SourceLocation getEndLoc() const
Get the end source location.
Definition TypeLoc.cpp:227
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
A container of type source information.
Definition TypeBase.h:8460
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8471
The base class of the type hierarchy.
Definition TypeBase.h:1876
bool isVoidType() const
Definition TypeBase.h:9092
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
bool isNothrowT() const
Definition Type.cpp:3301
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition Type.h:41
bool isArrayType() const
Definition TypeBase.h:8825
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9136
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9386
bool isReferenceType() const
Definition TypeBase.h:8750
bool isEnumeralType() const
Definition TypeBase.h:8857
bool isAlignValT() const
Definition Type.cpp:3310
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:789
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2847
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition Type.cpp:2113
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2986
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:5030
bool isSamplerT() const
Definition TypeBase.h:8970
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9319
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition Decl.cpp:5766
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5831
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5812
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3606
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:3656
QualType getUnderlyingType() const
Definition Decl.h:3661
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
Definition Decl.cpp:5775
A set of unresolved declarations.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
ValueDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T)
Definition Decl.h:718
void setType(QualType newType)
Definition Decl.h:724
QualType getType() const
Definition Decl.h:723
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Definition Decl.cpp:5593
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Definition Decl.cpp:5581
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.cpp:5587
Represents a variable declaration or definition.
Definition Decl.h:932
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition Decl.cpp:2773
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2132
Stmt ** getInitAddress()
Retrieve the address of the initializer expression.
Definition Decl.cpp:2403
DefinitionKind isThisDeclarationADefinition() const
Definition Decl.h:1331
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1593
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
Definition Decl.cpp:2898
TLSKind getTLSKind() const
Definition Decl.cpp:2149
@ DAK_Uninstantiated
Definition Decl.h:1009
bool hasInit() const
Definition Decl.cpp:2379
bool hasICEInitializer(const ASTContext &Context) const
Determine whether the initializer of this variable is an integer constant expression.
Definition Decl.cpp:2620
ParmVarDeclBitfields ParmVarDeclBits
Definition Decl.h:1130
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind hasDefinition() const
Definition Decl.h:1337
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition Decl.cpp:2102
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2171
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:2442
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:2238
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
Definition Decl.cpp:2825
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
Definition Decl.cpp:2799
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.h:1602
const APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or nullptr if the value is not yet...
Definition Decl.cpp:2612
void setStorageClass(StorageClass SC)
Definition Decl.cpp:2144
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
Definition Decl.cpp:2425
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition Decl.h:1306
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2138
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
Definition Decl.cpp:2690
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition Decl.h:1247
VarDeclBitfields VarDeclBits
Definition Decl.h:1129
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
Definition Decl.cpp:2840
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
Definition Decl.cpp:2632
void assignAddressSpace(const ASTContext &Ctxt, LangAS AS)
Apply a deduced address space, if one isn't already set.
Definition Decl.cpp:2905
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition Decl.cpp:2222
unsigned AllBits
Definition Decl.h:1128
EvaluatedStmt * getEvaluatedStmt() const
Definition Decl.cpp:2552
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:2467
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition Decl.cpp:2538
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
Definition Decl.cpp:2735
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
Definition Decl.h:1365
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:2870
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition Decl.cpp:2814
bool checkForConstantInitialization(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the initializer of this variable to determine whether it's a constant initializer.
Definition Decl.cpp:2648
bool isInline() const
Whether this variable is (C++1z) inline.
Definition Decl.h:1575
const Expr * getInit() const
Definition Decl.h:1391
bool isNonEscapingByref() const
Indicates the capture is a __block variable that is never captured by an escaping block.
Definition Decl.cpp:2678
bool isInExternCContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C" linkage spec.
Definition Decl.cpp:2230
NonParmVarDeclBitfields NonParmVarDeclBits
Definition Decl.h:1131
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
Definition Decl.h:1238
InitType Init
The initializer for this variable or, for a ParmVarDecl, the C++ default argument.
Definition Decl.h:978
const APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition Decl.cpp:2556
Redeclarable< VarDecl > redeclarable_base
Definition Decl.h:1138
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
Definition Decl.cpp:2410
TLSKind
Kinds of thread-local storage.
Definition Decl.h:950
@ TLS_Static
TLS with a known-constant initializer.
Definition Decl.h:955
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition Decl.h:958
@ TLS_None
Not a TLS variable.
Definition Decl.h:952
void setInit(Expr *I)
Definition Decl.cpp:2458
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
Definition Decl.cpp:2326
@ TentativeDefinition
This declaration is a tentative definition.
Definition Decl.h:1321
@ DeclarationOnly
This declaration is only a declaration.
Definition Decl.h:1318
@ Definition
This declaration is definitely a definition.
Definition Decl.h:1324
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition Decl.cpp:2778
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
Definition Decl.cpp:2226
VarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass SC)
Definition Decl.cpp:2115
void deduceParmAddressSpace(const ASTContext &Ctxt)
Definition Decl.cpp:2926
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition Decl.h:1250
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1174
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
Definition Decl.cpp:2674
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
Definition Decl.h:1500
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
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:2509
bool isInExternCXXContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C++" linkage spec.
Definition Decl.cpp:2234
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:2763
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
Definition Decl.cpp:2682
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Get the template specialization kind of this variable for the purposes of template instantiation.
Definition Decl.cpp:2753
VarDecl * getDefinition()
Definition Decl.h:1353
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:2742
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Definition Decl.h:1381
bool isKnownToBeDefined() const
Definition Decl.cpp:2782
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Definition Decl.cpp:2861
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 TypeBase.h:4065
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
#define CHAR_BIT
Definition limits.h:71
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
bool isa(CodeGen::Address addr)
Definition Address.h:330
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition Specifiers.h:213
@ CPlusPlus
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
@ 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:36
Decl * getPrimaryMergedDecl(Decl *D)
Get the primary declaration for a declaration from an AST file.
Definition Decl.cpp:76
InClassInitStyle
In-class initialization styles for non-static data members.
Definition Specifiers.h:272
@ ICIS_NoInit
No in-class initializer.
Definition Specifiers.h:273
Linkage getFormalLinkage(Linkage L)
Definition Linkage.h:106
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
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:249
@ SC_Auto
Definition Specifiers.h:257
@ SC_PrivateExtern
Definition Specifiers.h:254
@ SC_Extern
Definition Specifiers.h:252
@ SC_Register
Definition Specifiers.h:258
@ SC_Static
Definition Specifiers.h:253
@ SC_None
Definition Specifiers.h:251
@ TSCS_thread_local
C++11 thread_local.
Definition Specifiers.h:242
@ TSCS_unspecified
Definition Specifiers.h:237
@ TSCS__Thread_local
C11 _Thread_local.
Definition Specifiers.h:245
@ TSCS___thread
GNU __thread.
Definition Specifiers.h:239
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...
Definition Linkage.h:48
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
Definition Linkage.h:30
@ UniqueExternal
External linkage within a unique namespace.
Definition Linkage.h:44
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Definition Linkage.h:35
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
Definition Linkage.h:58
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
@ Default
Set to the current date and time.
@ SD_Automatic
Automatic storage duration (most local variables).
Definition Specifiers.h:342
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:906
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
bool hasArmZT0State(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZT0 state.
Definition Decl.cpp:6125
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:6030
@ Struct
The "struct" keyword.
Definition TypeBase.h:6032
@ Enum
The "enum" keyword.
Definition TypeBase.h:6044
bool isTypeAwareAllocation(TypeAwareAllocationMode Mode)
Definition ExprCXX.h:2256
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
Definition Decl.h:4348
bool isLegalForVariable(StorageClass SC)
Checks whether the given storage class is legal for variables.
Definition Specifiers.h:267
MultiVersionKind
Definition Decl.h:2008
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:189
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:207
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:203
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:199
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition Specifiers.h:195
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition Specifiers.h:192
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6019
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:6104
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:1754
@ Other
Other implicit parameter.
Definition Decl.h:1774
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:60
bool hasArmZAState(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZA state.
Definition Decl.cpp:6118
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
bool isNull() const
Definition Decl.h:99
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:885
unsigned CheckedForICEInit
Definition Decl.h:914
unsigned WasEvaluated
Whether this statement was already evaluated.
Definition Decl.h:888
unsigned HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition Decl.h:899
LazyDeclStmtPtr Value
Definition Decl.h:921
unsigned HasICEInit
In C++98, whether the initializer is an ICE.
Definition Decl.h:912
unsigned HasSideEffects
Definition Decl.h:917
APValue Evaluated
Definition Decl.h:922
unsigned CheckedForSideEffects
Definition Decl.h:919
unsigned IsEvaluating
Whether this statement is being evaluated.
Definition Decl.h:892
unsigned HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition Decl.h:907
EvalResult is a struct with detailed info about an evaluated expression.
Definition Expr.h:652
APValue Val
Val - This is the value the expression can be folded to.
Definition Expr.h:654
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
Definition Expr.h:640
bool DiagEmitted
Whether any diagnostic has been emitted.
Definition Expr.h:624
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.
unsigned SuppressUnwrittenScope
Suppress printing parts of scope specifiers that are never written, e.g., for anonymous namespaces.
unsigned MSVCFormatting
Use whitespace and punctuation like MSVC does.
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
unsigned SuppressInlineNamespace
Suppress printing parts of scope specifiers that correspond to inline namespaces.
const PrintingCallbacks * Callbacks
Callbacks to use to allow the behavior of printing to be customized.
@ Plain
E.g., (anonymous enum)/(unnamed struct)/etc.
@ SourceLocation
When printing an anonymous tag name, also print the location of that entity (e.g.,...
unsigned SuppressTagKeywordInAnonNames
Whether type printing should skip printing the tag keyword of anonymous entities.
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
Definition Decl.h:767
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
Definition Decl.h:760
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Sets info about "outer" template parameter lists.
Definition Decl.cpp:2082
The parameters to pass to a usual operator delete.
Definition ExprCXX.h:2347
TypeAwareAllocationMode TypeAwareDelete
Definition ExprCXX.h:2348
AlignedAllocationMode Alignment
Definition ExprCXX.h:2351