clang 23.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()) {
1196 return false;
1199 return D->isInNamedModule();
1200 }
1201 llvm_unreachable("unexpected module ownership kind");
1202}
1203
1204/// Get the linkage from a semantic point of view. Entities in
1205/// anonymous namespaces are external (in c++98).
1207 Linkage InternalLinkage = getLinkageInternal();
1208
1209 // C++ [basic.link]p4.8:
1210 // - if the declaration of the name is attached to a named module and is not
1211 // exported
1212 // the name has module linkage;
1213 //
1214 // [basic.namespace.general]/p2
1215 // A namespace is never attached to a named module and never has a name with
1216 // module linkage.
1217 if (isInNamedModule() && InternalLinkage == Linkage::External &&
1220 !isa<NamespaceDecl>(this))
1221 InternalLinkage = Linkage::Module;
1222
1223 return clang::getFormalLinkage(InternalLinkage);
1224}
1225
1227 return LinkageComputer{}.getDeclLinkageAndVisibility(this);
1228}
1229
1230static std::optional<Visibility>
1233 bool IsMostRecent) {
1234 assert(!IsMostRecent || ND == ND->getMostRecentDecl());
1235
1236 if (isa<ConceptDecl>(ND))
1237 return {};
1238
1239 // Check the declaration itself first.
1240 if (std::optional<Visibility> V = getVisibilityOf(ND, kind))
1241 return V;
1242
1243 // If this is a member class of a specialization of a class template
1244 // and the corresponding decl has explicit visibility, use that.
1245 if (const auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
1246 CXXRecordDecl *InstantiatedFrom = RD->getInstantiatedFromMemberClass();
1247 if (InstantiatedFrom)
1248 return getVisibilityOf(InstantiatedFrom, kind);
1249 }
1250
1251 // If there wasn't explicit visibility there, and this is a
1252 // specialization of a class template, check for visibility
1253 // on the pattern.
1254 if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1255 // Walk all the template decl till this point to see if there are
1256 // explicit visibility attributes.
1257 const auto *TD = spec->getSpecializedTemplate()->getTemplatedDecl();
1258 while (TD != nullptr) {
1259 auto Vis = getVisibilityOf(TD, kind);
1260 if (Vis != std::nullopt)
1261 return Vis;
1262 TD = TD->getPreviousDecl();
1263 }
1264 return std::nullopt;
1265 }
1266
1267 // Use the most recent declaration.
1268 if (!IsMostRecent && !isa<NamespaceDecl>(ND)) {
1269 const NamedDecl *MostRecent = ND->getMostRecentDecl();
1270 if (MostRecent != ND)
1271 return getExplicitVisibilityAux(MostRecent, kind, true);
1272 }
1273
1274 if (const auto *Var = dyn_cast<VarDecl>(ND)) {
1275 if (Var->isStaticDataMember()) {
1276 VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember();
1277 if (InstantiatedFrom)
1278 return getVisibilityOf(InstantiatedFrom, kind);
1279 }
1280
1281 if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Var))
1282 return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(),
1283 kind);
1284
1285 return std::nullopt;
1286 }
1287 // Also handle function template specializations.
1288 if (const auto *fn = dyn_cast<FunctionDecl>(ND)) {
1289 // If the function is a specialization of a template with an
1290 // explicit visibility attribute, use that.
1291 if (FunctionTemplateSpecializationInfo *templateInfo
1293 return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl(),
1294 kind);
1295
1296 // If the function is a member of a specialization of a class template
1297 // and the corresponding decl has explicit visibility, use that.
1298 FunctionDecl *InstantiatedFrom = fn->getInstantiatedFromMemberFunction();
1299 if (InstantiatedFrom)
1300 return getVisibilityOf(InstantiatedFrom, kind);
1301
1302 return std::nullopt;
1303 }
1304
1305 // The visibility of a template is stored in the templated decl.
1306 if (const auto *TD = dyn_cast<TemplateDecl>(ND))
1307 return getVisibilityOf(TD->getTemplatedDecl(), kind);
1308
1309 return std::nullopt;
1310}
1311
1312std::optional<Visibility>
1316
1317LinkageInfo LinkageComputer::getLVForClosure(const DeclContext *DC,
1318 Decl *ContextDecl,
1319 LVComputationKind computation) {
1320 // This lambda has its linkage/visibility determined by its owner.
1321 const NamedDecl *Owner;
1322 if (!ContextDecl)
1323 Owner = dyn_cast<NamedDecl>(DC);
1324 else if (isa<ParmVarDecl>(ContextDecl))
1325 Owner =
1326 dyn_cast<NamedDecl>(ContextDecl->getDeclContext()->getRedeclContext());
1327 else if (isa<ImplicitConceptSpecializationDecl>(ContextDecl)) {
1328 // Replace with the concept's owning decl, which is either a namespace or a
1329 // TU, so this needs a dyn_cast.
1330 Owner = dyn_cast<NamedDecl>(ContextDecl->getDeclContext());
1331 } else {
1332 Owner = cast<NamedDecl>(ContextDecl);
1333 }
1334
1335 if (!Owner)
1336 return LinkageInfo::none();
1337
1338 // If the owner has a deduced type, we need to skip querying the linkage and
1339 // visibility of that type, because it might involve this closure type. The
1340 // only effect of this is that we might give a lambda VisibleNoLinkage rather
1341 // than NoLinkage when we don't strictly need to, which is benign.
1342 auto *VD = dyn_cast<VarDecl>(Owner);
1343 LinkageInfo OwnerLV =
1344 VD && VD->getType()->getContainedDeducedType()
1345 ? computeLVForDecl(Owner, computation, /*IgnoreVarTypeLinkage*/true)
1346 : getLVForDecl(Owner, computation);
1347
1348 // A lambda never formally has linkage. But if the owner is externally
1349 // visible, then the lambda is too. We apply the same rules to blocks.
1350 if (!isExternallyVisible(OwnerLV.getLinkage()))
1351 return LinkageInfo::none();
1352 return LinkageInfo(Linkage::VisibleNone, OwnerLV.getVisibility(),
1353 OwnerLV.isVisibilityExplicit());
1354}
1355
1356LinkageInfo LinkageComputer::getLVForLocalDecl(const NamedDecl *D,
1357 LVComputationKind computation) {
1358 if (const auto *Function = dyn_cast<FunctionDecl>(D)) {
1359 if (Function->isInAnonymousNamespace() &&
1361 return LinkageInfo::internal();
1362
1363 // This is a "void f();" which got merged with a file static.
1364 if (Function->getCanonicalDecl()->getStorageClass() == SC_Static)
1365 return LinkageInfo::internal();
1366
1367 LinkageInfo LV;
1368 if (!hasExplicitVisibilityAlready(computation)) {
1369 if (std::optional<Visibility> Vis =
1370 getExplicitVisibility(Function, computation))
1371 LV.mergeVisibility(*Vis, true);
1372 }
1373
1374 // Note that Sema::MergeCompatibleFunctionDecls already takes care of
1375 // merging storage classes and visibility attributes, so we don't have to
1376 // look at previous decls in here.
1377
1378 return LV;
1379 }
1380
1381 if (const auto *Var = dyn_cast<VarDecl>(D)) {
1382 if (Var->hasExternalStorage()) {
1383 if (Var->isInAnonymousNamespace() && !isFirstInExternCContext(Var))
1384 return LinkageInfo::internal();
1385
1386 LinkageInfo LV;
1387 if (Var->getStorageClass() == SC_PrivateExtern)
1389 else if (!hasExplicitVisibilityAlready(computation)) {
1390 if (std::optional<Visibility> Vis =
1391 getExplicitVisibility(Var, computation))
1392 LV.mergeVisibility(*Vis, true);
1393 }
1394
1395 if (const VarDecl *Prev = Var->getPreviousDecl()) {
1396 LinkageInfo PrevLV = getLVForDecl(Prev, computation);
1397 if (PrevLV.getLinkage() != Linkage::Invalid)
1398 LV.setLinkage(PrevLV.getLinkage());
1399 LV.mergeVisibility(PrevLV);
1400 }
1401
1402 return LV;
1403 }
1404
1405 if (!Var->isStaticLocal())
1406 return LinkageInfo::none();
1407 }
1408
1409 ASTContext &Context = D->getASTContext();
1410 if (!Context.getLangOpts().CPlusPlus)
1411 return LinkageInfo::none();
1412
1413 const Decl *OuterD = getOutermostFuncOrBlockContext(D);
1414 if (!OuterD || OuterD->isInvalidDecl())
1415 return LinkageInfo::none();
1416
1417 LinkageInfo LV;
1418 if (const auto *BD = dyn_cast<BlockDecl>(OuterD)) {
1419 if (!BD->getBlockManglingNumber())
1420 return LinkageInfo::none();
1421
1422 LV = getLVForClosure(BD->getDeclContext()->getRedeclContext(),
1423 BD->getBlockManglingContextDecl(), computation);
1424 } else {
1425 const auto *FD = cast<FunctionDecl>(OuterD);
1426 if (!FD->isInlined() &&
1427 !isTemplateInstantiation(FD->getTemplateSpecializationKind()))
1428 return LinkageInfo::none();
1429
1430 // If a function is hidden by -fvisibility-inlines-hidden option and
1431 // is not explicitly attributed as a hidden function,
1432 // we should not make static local variables in the function hidden.
1433 LV = getLVForDecl(FD, computation);
1435 !LV.isVisibilityExplicit() &&
1436 !Context.getLangOpts().VisibilityInlinesHiddenStaticLocalVar) {
1437 assert(cast<VarDecl>(D)->isStaticLocal());
1438 // If this was an implicitly hidden inline method, check again for
1439 // explicit visibility on the parent class, and use that for static locals
1440 // if present.
1441 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
1442 LV = getLVForDecl(MD->getParent(), computation);
1443 if (!LV.isVisibilityExplicit()) {
1444 Visibility globalVisibility =
1445 computation.isValueVisibility()
1446 ? Context.getLangOpts().getValueVisibilityMode()
1447 : Context.getLangOpts().getTypeVisibilityMode();
1448 return LinkageInfo(Linkage::VisibleNone, globalVisibility,
1449 /*visibilityExplicit=*/false);
1450 }
1451 }
1452 }
1454 return LinkageInfo::none();
1455 return LinkageInfo(Linkage::VisibleNone, LV.getVisibility(),
1457}
1458
1460 LVComputationKind computation,
1461 bool IgnoreVarTypeLinkage) {
1462 // Internal_linkage attribute overrides other considerations.
1463 if (D->hasAttr<InternalLinkageAttr>())
1464 return LinkageInfo::internal();
1465
1466 // Objective-C: treat all Objective-C declarations as having external
1467 // linkage.
1468 switch (D->getKind()) {
1469 default:
1470 break;
1471
1472 // Per C++ [basic.link]p2, only the names of objects, references,
1473 // functions, types, templates, namespaces, and values ever have linkage.
1474 //
1475 // Note that the name of a typedef, namespace alias, using declaration,
1476 // and so on are not the name of the corresponding type, namespace, or
1477 // declaration, so they do *not* have linkage.
1478 case Decl::ImplicitParam:
1479 case Decl::Label:
1480 case Decl::NamespaceAlias:
1481 case Decl::ParmVar:
1482 case Decl::Using:
1483 case Decl::UsingEnum:
1484 case Decl::UsingShadow:
1485 case Decl::UsingDirective:
1486 return LinkageInfo::none();
1487
1488 case Decl::EnumConstant:
1489 // C++ [basic.link]p4: an enumerator has the linkage of its enumeration.
1490 if (D->getASTContext().getLangOpts().CPlusPlus)
1491 return getLVForDecl(cast<EnumDecl>(D->getDeclContext()), computation);
1493
1494 case Decl::Typedef:
1495 case Decl::TypeAlias:
1496 // A typedef declaration has linkage if it gives a type a name for
1497 // linkage purposes.
1498 if (!cast<TypedefNameDecl>(D)
1499 ->getAnonDeclWithTypedefName(/*AnyRedecl*/true))
1500 return LinkageInfo::none();
1501 break;
1502
1503 case Decl::TemplateTemplateParm: // count these as external
1504 case Decl::NonTypeTemplateParm:
1505 case Decl::ObjCAtDefsField:
1506 case Decl::ObjCCategory:
1507 case Decl::ObjCCategoryImpl:
1508 case Decl::ObjCCompatibleAlias:
1509 case Decl::ObjCImplementation:
1510 case Decl::ObjCMethod:
1511 case Decl::ObjCProperty:
1512 case Decl::ObjCPropertyImpl:
1513 case Decl::ObjCProtocol:
1514 return getExternalLinkageFor(D);
1515
1516 case Decl::CXXRecord: {
1517 const auto *Record = cast<CXXRecordDecl>(D);
1518 if (Record->isLambda()) {
1519 if (Record->hasKnownLambdaInternalLinkage() ||
1520 !Record->getLambdaManglingNumber()) {
1521 // This lambda has no mangling number, so it's internal.
1522 return LinkageInfo::internal();
1523 }
1524
1525 return getLVForClosure(
1526 Record->getDeclContext()->getRedeclContext(),
1527 Record->getLambdaContextDecl(), computation);
1528 }
1529
1530 break;
1531 }
1532
1533 case Decl::TemplateParamObject: {
1534 // The template parameter object can be referenced from anywhere its type
1535 // and value can be referenced.
1536 auto *TPO = cast<TemplateParamObjectDecl>(D);
1537 LinkageInfo LV = getLVForType(*TPO->getType(), computation);
1538 LV.merge(getLVForValue(TPO->getValue(), computation));
1539 return LV;
1540 }
1541 }
1542
1543 // Handle linkage for namespace-scope names.
1545 return getLVForNamespaceScopeDecl(D, computation, IgnoreVarTypeLinkage);
1546
1547 // C++ [basic.link]p5:
1548 // In addition, a member function, static data member, a named
1549 // class or enumeration of class scope, or an unnamed class or
1550 // enumeration defined in a class-scope typedef declaration such
1551 // that the class or enumeration has the typedef name for linkage
1552 // purposes (7.1.3), has external linkage if the name of the class
1553 // has external linkage.
1554 if (D->getDeclContext()->isRecord())
1555 return getLVForClassMember(D, computation, IgnoreVarTypeLinkage);
1556
1557 // C++ [basic.link]p6:
1558 // The name of a function declared in block scope and the name of
1559 // an object declared by a block scope extern declaration have
1560 // linkage. If there is a visible declaration of an entity with
1561 // linkage having the same name and type, ignoring entities
1562 // declared outside the innermost enclosing namespace scope, the
1563 // block scope declaration declares that same entity and receives
1564 // the linkage of the previous declaration. If there is more than
1565 // one such matching entity, the program is ill-formed. Otherwise,
1566 // if no matching entity is found, the block scope entity receives
1567 // external linkage.
1569 return getLVForLocalDecl(D, computation);
1570
1571 // C++ [basic.link]p6:
1572 // Names not covered by these rules have no linkage.
1573 return LinkageInfo::none();
1574}
1575
1576/// getLVForDecl - Get the linkage and visibility for the given declaration.
1578 LVComputationKind computation) {
1579 // Internal_linkage attribute overrides other considerations.
1580 if (D->hasAttr<InternalLinkageAttr>())
1581 return LinkageInfo::internal();
1582
1583 if (computation.IgnoreAllVisibility && D->hasCachedLinkage())
1584 return LinkageInfo(D->getCachedLinkage(), DefaultVisibility, false);
1585
1586 if (std::optional<LinkageInfo> LI = lookup(D, computation))
1587 return *LI;
1588
1589 LinkageInfo LV = computeLVForDecl(D, computation);
1590 if (D->hasCachedLinkage())
1591 assert(D->getCachedLinkage() == LV.getLinkage());
1592
1594 cache(D, computation, LV);
1595
1596#ifndef NDEBUG
1597 // In C (because of gnu inline) and in c++ with microsoft extensions an
1598 // static can follow an extern, so we can have two decls with different
1599 // linkages.
1600 const LangOptions &Opts = D->getASTContext().getLangOpts();
1601 if (!Opts.CPlusPlus || Opts.MicrosoftExt)
1602 return LV;
1603
1604 // We have just computed the linkage for this decl. By induction we know
1605 // that all other computed linkages match, check that the one we just
1606 // computed also does.
1607 // We can't assume the redecl chain is well formed at this point,
1608 // so keep track of already visited declarations.
1609 for (llvm::SmallPtrSet<const Decl *, 4> AlreadyVisited{D}; /**/; /**/) {
1610 D = cast<NamedDecl>(const_cast<NamedDecl *>(D)->getNextRedeclarationImpl());
1611 if (!AlreadyVisited.insert(D).second)
1612 break;
1613 if (D->isInvalidDecl())
1614 continue;
1615 if (auto OldLinkage = D->getCachedLinkage();
1616 OldLinkage != Linkage::Invalid) {
1617 assert(LV.getLinkage() == OldLinkage);
1618 break;
1619 }
1620 }
1621#endif
1622
1623 return LV;
1624}
1625
1635
1637 if (isa<NamespaceDecl>(this))
1638 // Namespaces never have module linkage. It is the entities within them
1639 // that [may] do.
1640 return nullptr;
1641
1642 Module *M = getOwningModule();
1643 if (!M)
1644 return nullptr;
1645
1646 switch (M->Kind) {
1648 // Module map modules have no special linkage semantics.
1649 return nullptr;
1650
1655 return M;
1656
1660 // The global module shouldn't change the linkage.
1661 return nullptr;
1662
1664 // The private module fragment is part of its containing module for linkage
1665 // purposes.
1666 return M->Parent;
1667 }
1668
1669 llvm_unreachable("unknown module kind");
1670}
1671
1672void NamedDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
1673 Name.print(OS, Policy);
1674}
1675
1676void NamedDecl::printName(raw_ostream &OS) const {
1677 printName(OS, getASTContext().getPrintingPolicy());
1678}
1679
1681 std::string QualName;
1682 llvm::raw_string_ostream OS(QualName);
1683 printQualifiedName(OS, getASTContext().getPrintingPolicy());
1684 return QualName;
1685}
1686
1687void NamedDecl::printQualifiedName(raw_ostream &OS) const {
1688 printQualifiedName(OS, getASTContext().getPrintingPolicy());
1689}
1690
1692 const PrintingPolicy &P) const {
1693 if (getDeclContext()->isFunctionOrMethod()) {
1694 // We do not print '(anonymous)' for function parameters without name.
1695 printName(OS, P);
1696 return;
1697 }
1699 if (getDeclName()) {
1700 printName(OS, P);
1701 } else {
1702 // Give the printName override a chance to pick a different name before we
1703 // fall back to "(anonymous)".
1704 SmallString<64> NameBuffer;
1705 llvm::raw_svector_ostream NameOS(NameBuffer);
1706 printName(NameOS, P);
1707 if (NameBuffer.empty())
1708 OS << "(anonymous)";
1709 else
1710 OS << NameBuffer;
1711 }
1712}
1713
1714void NamedDecl::printNestedNameSpecifier(raw_ostream &OS) const {
1715 printNestedNameSpecifier(OS, getASTContext().getPrintingPolicy());
1716}
1717
1719 const PrintingPolicy &P) const {
1720 const DeclContext *Ctx = getDeclContext();
1721
1722 // For ObjC methods and properties, look through categories and use the
1723 // interface as context.
1724 if (auto *MD = dyn_cast<ObjCMethodDecl>(this)) {
1725 if (auto *ID = MD->getClassInterface())
1726 Ctx = ID;
1727 } else if (auto *PD = dyn_cast<ObjCPropertyDecl>(this)) {
1728 if (auto *MD = PD->getGetterMethodDecl())
1729 if (auto *ID = MD->getClassInterface())
1730 Ctx = ID;
1731 } else if (auto *ID = dyn_cast<ObjCIvarDecl>(this)) {
1732 if (auto *CI = ID->getContainingInterface())
1733 Ctx = CI;
1734 }
1735
1736 if (Ctx->isFunctionOrMethod())
1737 return;
1738
1739 using ContextsTy = SmallVector<const DeclContext *, 8>;
1740 ContextsTy Contexts;
1741
1742 // Collect named contexts.
1743 DeclarationName NameInScope = getDeclName();
1744 for (; Ctx; Ctx = Ctx->getParent()) {
1745 if (P.Callbacks && P.Callbacks->isScopeVisible(Ctx))
1746 continue;
1747
1748 // Suppress anonymous namespace if requested.
1750 cast<NamespaceDecl>(Ctx)->isAnonymousNamespace())
1751 continue;
1752
1753 // Suppress inline namespace if it doesn't make the result ambiguous.
1754 if (Ctx->isInlineNamespace() && NameInScope) {
1756 llvm::to_underlying(
1759 llvm::to_underlying(
1761 cast<NamespaceDecl>(Ctx)->isRedundantInlineQualifierFor(
1762 NameInScope))) {
1763 continue;
1764 }
1765 }
1766
1767 // Suppress transparent contexts like export or HLSLBufferDecl context
1768 if (Ctx->isTransparentContext())
1769 continue;
1770
1771 // Skip non-named contexts such as linkage specifications and ExportDecls.
1772 const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx);
1773 if (!ND)
1774 continue;
1775
1776 Contexts.push_back(Ctx);
1777 NameInScope = ND->getDeclName();
1778 }
1779
1780 for (const DeclContext *DC : llvm::reverse(Contexts)) {
1781 if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1782 OS << Spec->getName();
1783 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1784 printTemplateArgumentList(
1785 OS, TemplateArgs.asArray(), P,
1786 Spec->getSpecializedTemplate()->getTemplateParameters());
1787 } else if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) {
1788 if (ND->isAnonymousNamespace()) {
1789 OS << (P.MSVCFormatting ? "`anonymous namespace\'"
1790 : "(anonymous namespace)");
1791 }
1792 else
1793 OS << *ND;
1794 } else if (const auto *RD = llvm::dyn_cast<RecordDecl>(DC)) {
1796 // As part of a scope we want to print anonymous names as:
1797 // ..::(anonymous struct)::..
1798 //
1799 // I.e., suppress tag locations, suppress leading keyword, *don't*
1800 // suppress tag in name
1801 Copy.SuppressTagKeyword = true;
1802 Copy.SuppressTagKeywordInAnonNames = false;
1803 Copy.AnonymousTagNameStyle =
1804 llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
1805 RD->printName(OS, Copy);
1806 } else if (const auto *FD = dyn_cast<FunctionDecl>(DC)) {
1807 const FunctionProtoType *FT = nullptr;
1808 if (FD->hasWrittenPrototype())
1809 FT = dyn_cast<FunctionProtoType>(FD->getType()->castAs<FunctionType>());
1810
1811 OS << *FD << '(';
1812 if (FT) {
1813 unsigned NumParams = FD->getNumParams();
1814 for (unsigned i = 0; i < NumParams; ++i) {
1815 if (i)
1816 OS << ", ";
1817 OS << FD->getParamDecl(i)->getType().stream(P);
1818 }
1819
1820 if (FT->isVariadic()) {
1821 if (NumParams > 0)
1822 OS << ", ";
1823 OS << "...";
1824 }
1825 }
1826 OS << ')';
1827 } else if (const auto *ED = dyn_cast<EnumDecl>(DC)) {
1828 // C++ [dcl.enum]p10: Each enum-name and each unscoped
1829 // enumerator is declared in the scope that immediately contains
1830 // the enum-specifier. Each scoped enumerator is declared in the
1831 // scope of the enumeration.
1832 // For the case of unscoped enumerator, do not include in the qualified
1833 // name any information about its enum enclosing scope, as its visibility
1834 // is global.
1835 if (ED->isScoped())
1836 OS << *ED;
1837 else
1838 continue;
1839 } else {
1840 OS << *cast<NamedDecl>(DC);
1841 }
1842 OS << "::";
1843 }
1844}
1845
1847 const PrintingPolicy &Policy,
1848 bool Qualified) const {
1849 if (Qualified)
1850 printQualifiedName(OS, Policy);
1851 else
1852 printName(OS, Policy);
1853}
1854
1855template<typename T> static bool isRedeclarableImpl(Redeclarable<T> *) {
1856 return true;
1857}
1858static bool isRedeclarableImpl(...) { return false; }
1860 switch (K) {
1861#define DECL(Type, Base) \
1862 case Decl::Type: \
1863 return isRedeclarableImpl((Type##Decl *)nullptr);
1864#define ABSTRACT_DECL(DECL)
1865#include "clang/AST/DeclNodes.inc"
1866 }
1867 llvm_unreachable("unknown decl kind");
1868}
1869
1871 bool IsKnownNewer) const {
1872 assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
1873
1874 // Never replace one imported declaration with another; we need both results
1875 // when re-exporting.
1876 if (OldD->isFromASTFile() && isFromASTFile())
1877 return false;
1878
1879 // A kind mismatch implies that the declaration is not replaced.
1880 if (OldD->getKind() != getKind())
1881 return false;
1882
1883 // For method declarations, we never replace. (Why?)
1884 if (isa<ObjCMethodDecl>(this))
1885 return false;
1886
1887 // For parameters, pick the newer one. This is either an error or (in
1888 // Objective-C) permitted as an extension.
1889 if (isa<ParmVarDecl>(this))
1890 return true;
1891
1892 // Inline namespaces can give us two declarations with the same
1893 // name and kind in the same scope but different contexts; we should
1894 // keep both declarations in this case.
1895 if (!this->getDeclContext()->getRedeclContext()->Equals(
1896 OldD->getDeclContext()->getRedeclContext()))
1897 return false;
1898
1899 // Using declarations can be replaced if they import the same name from the
1900 // same context.
1901 if (const auto *UD = dyn_cast<UsingDecl>(this))
1902 return UD->getQualifier().getCanonical() ==
1903
1904 cast<UsingDecl>(OldD)->getQualifier().getCanonical();
1905 if (const auto *UUVD = dyn_cast<UnresolvedUsingValueDecl>(this))
1906 return UUVD->getQualifier().getCanonical() ==
1907 cast<UnresolvedUsingValueDecl>(OldD)->getQualifier().getCanonical();
1908
1909 if (isRedeclarable(getKind())) {
1910 if (getCanonicalDecl() != OldD->getCanonicalDecl())
1911 return false;
1912
1913 if (IsKnownNewer)
1914 return true;
1915
1916 // Check whether this is actually newer than OldD. We want to keep the
1917 // newer declaration. This loop will usually only iterate once, because
1918 // OldD is usually the previous declaration.
1919 for (const auto *D : redecls()) {
1920 if (D == OldD)
1921 break;
1922
1923 // If we reach the canonical declaration, then OldD is not actually older
1924 // than this one.
1925 //
1926 // FIXME: In this case, we should not add this decl to the lookup table.
1927 if (D->isCanonicalDecl())
1928 return false;
1929 }
1930
1931 // It's a newer declaration of the same kind of declaration in the same
1932 // scope: we want this decl instead of the existing one.
1933 return true;
1934 }
1935
1936 // In all other cases, we need to keep both declarations in case they have
1937 // different visibility. Any attempt to use the name will result in an
1938 // ambiguity if more than one is visible.
1939 return false;
1940}
1941
1943 switch (getFormalLinkage()) {
1944 case Linkage::Invalid:
1945 llvm_unreachable("Linkage hasn't been computed!");
1946 case Linkage::None:
1947 return false;
1948 case Linkage::Internal:
1949 return true;
1952 llvm_unreachable("Non-formal linkage is not allowed here!");
1953 case Linkage::Module:
1954 case Linkage::External:
1955 return true;
1956 }
1957 llvm_unreachable("Unhandled Linkage enum");
1958}
1959
1960NamedDecl *NamedDecl::getUnderlyingDeclImpl() {
1961 NamedDecl *ND = this;
1962 if (auto *UD = dyn_cast<UsingShadowDecl>(ND))
1963 ND = UD->getTargetDecl();
1964
1965 if (auto *AD = dyn_cast<ObjCCompatibleAliasDecl>(ND))
1966 return AD->getClassInterface();
1967
1968 if (auto *AD = dyn_cast<NamespaceAliasDecl>(ND))
1969 return AD->getNamespace();
1970
1971 return ND;
1972}
1973
1975 if (!isCXXClassMember())
1976 return false;
1977
1978 const NamedDecl *D = this;
1979 if (isa<UsingShadowDecl>(D))
1980 D = cast<UsingShadowDecl>(D)->getTargetDecl();
1981
1983 return true;
1984 if (const auto *MD = dyn_cast_if_present<CXXMethodDecl>(D->getAsFunction()))
1985 return MD->isInstance();
1986 return false;
1987}
1988
1989//===----------------------------------------------------------------------===//
1990// DeclaratorDecl Implementation
1991//===----------------------------------------------------------------------===//
1992
1993template <typename DeclT>
1995 if (decl->getNumTemplateParameterLists() > 0)
1996 return decl->getTemplateParameterList(0)->getTemplateLoc();
1997 return decl->getInnerLocStart();
1998}
1999
2002 if (TSI) return TSI->getTypeLoc().getBeginLoc();
2003 return SourceLocation();
2004}
2005
2008 if (TSI) return TSI->getTypeLoc().getEndLoc();
2009 return SourceLocation();
2010}
2011
2013 if (QualifierLoc) {
2014 // Make sure the extended decl info is allocated.
2015 if (!hasExtInfo()) {
2016 // Save (non-extended) type source info pointer.
2017 auto *savedTInfo = cast<TypeSourceInfo *>(DeclInfo);
2018 // Allocate external info struct.
2019 DeclInfo = new (getASTContext()) ExtInfo;
2020 // Restore savedTInfo into (extended) decl info.
2021 getExtInfo()->TInfo = savedTInfo;
2022 }
2023 // Set qualifier info.
2024 getExtInfo()->QualifierLoc = QualifierLoc;
2025 } else if (hasExtInfo()) {
2026 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
2027 getExtInfo()->QualifierLoc = QualifierLoc;
2028 }
2029}
2030
2032 assert(AC);
2033 // Make sure the extended decl info is allocated.
2034 if (!hasExtInfo()) {
2035 // Save (non-extended) type source info pointer.
2036 auto *savedTInfo = cast<TypeSourceInfo *>(DeclInfo);
2037 // Allocate external info struct.
2038 DeclInfo = new (getASTContext()) ExtInfo;
2039 // Restore savedTInfo into (extended) decl info.
2040 getExtInfo()->TInfo = savedTInfo;
2041 }
2042 // Set requires clause info.
2043 getExtInfo()->TrailingRequiresClause = AC;
2044}
2045
2048 assert(!TPLists.empty());
2049 // Make sure the extended decl info is allocated.
2050 if (!hasExtInfo()) {
2051 // Save (non-extended) type source info pointer.
2052 auto *savedTInfo = cast<TypeSourceInfo *>(DeclInfo);
2053 // Allocate external info struct.
2054 DeclInfo = new (getASTContext()) ExtInfo;
2055 // Restore savedTInfo into (extended) decl info.
2056 getExtInfo()->TInfo = savedTInfo;
2057 }
2058 // Set the template parameter lists info.
2059 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
2060}
2061
2065
2066// Helper function: returns true if QT is or contains a type
2067// having a postfix component.
2068static bool typeIsPostfix(QualType QT) {
2069 while (true) {
2070 const Type* T = QT.getTypePtr();
2071 switch (T->getTypeClass()) {
2072 default:
2073 return false;
2074 case Type::Pointer:
2075 QT = cast<PointerType>(T)->getPointeeType();
2076 break;
2077 case Type::BlockPointer:
2078 QT = cast<BlockPointerType>(T)->getPointeeType();
2079 break;
2080 case Type::MemberPointer:
2081 QT = cast<MemberPointerType>(T)->getPointeeType();
2082 break;
2083 case Type::LValueReference:
2084 case Type::RValueReference:
2085 QT = cast<ReferenceType>(T)->getPointeeType();
2086 break;
2087 case Type::PackExpansion:
2088 QT = cast<PackExpansionType>(T)->getPattern();
2089 break;
2090 case Type::Paren:
2091 case Type::ConstantArray:
2092 case Type::DependentSizedArray:
2093 case Type::IncompleteArray:
2094 case Type::VariableArray:
2095 case Type::FunctionProto:
2096 case Type::FunctionNoProto:
2097 return true;
2098 }
2099 }
2100}
2101
2103 SourceLocation RangeEnd = getLocation();
2104 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
2105 // If the declaration has no name or the type extends past the name take the
2106 // end location of the type.
2107 if (!getDeclName() || typeIsPostfix(TInfo->getType()))
2108 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
2109 }
2110 return SourceRange(getOuterLocStart(), RangeEnd);
2111}
2112
2115 // Free previous template parameters (if any).
2116 if (NumTemplParamLists > 0) {
2117 Context.Deallocate(TemplParamLists);
2118 TemplParamLists = nullptr;
2120 }
2121 // Set info on matched template parameter lists (if any).
2122 if (!TPLists.empty()) {
2123 TemplParamLists = new (Context) TemplateParameterList *[TPLists.size()];
2124 NumTemplParamLists = TPLists.size();
2125 llvm::copy(TPLists, TemplParamLists);
2126 }
2127}
2128
2129//===----------------------------------------------------------------------===//
2130// VarDecl Implementation
2131//===----------------------------------------------------------------------===//
2132
2134 switch (SC) {
2135 case SC_None: break;
2136 case SC_Auto: return "auto";
2137 case SC_Extern: return "extern";
2138 case SC_PrivateExtern: return "__private_extern__";
2139 case SC_Register: return "register";
2140 case SC_Static: return "static";
2141 }
2142
2143 llvm_unreachable("Invalid storage class");
2144}
2145
2147 SourceLocation StartLoc, SourceLocation IdLoc,
2148 const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
2149 StorageClass SC)
2150 : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc),
2152 static_assert(sizeof(VarDeclBitfields) <= sizeof(unsigned),
2153 "VarDeclBitfields too large!");
2154 static_assert(sizeof(ParmVarDeclBitfields) <= sizeof(unsigned),
2155 "ParmVarDeclBitfields too large!");
2156 static_assert(sizeof(NonParmVarDeclBitfields) <= sizeof(unsigned),
2157 "NonParmVarDeclBitfields too large!");
2158 AllBits = 0;
2159 VarDeclBits.SClass = SC;
2160 // Everything else is implicitly initialized to false.
2161}
2162
2164 SourceLocation IdL, const IdentifierInfo *Id,
2165 QualType T, TypeSourceInfo *TInfo, StorageClass S) {
2166 return new (C, DC) VarDecl(Var, C, DC, StartL, IdL, Id, T, TInfo, S);
2167}
2168
2170 return new (C, ID)
2171 VarDecl(Var, C, nullptr, SourceLocation(), SourceLocation(), nullptr,
2172 QualType(), nullptr, SC_None);
2173}
2174
2176 assert(isLegalForVariable(SC));
2177 VarDeclBits.SClass = SC;
2178}
2179
2181 switch (VarDeclBits.TSCSpec) {
2182 case TSCS_unspecified:
2183 if (!hasAttr<ThreadAttr>() &&
2184 !(getASTContext().getLangOpts().OpenMPUseTLS &&
2185 getASTContext().getTargetInfo().isTLSSupported() &&
2187 return TLS_None;
2188 return ((getASTContext().getLangOpts().isCompatibleWithMSVC(
2191 ? TLS_Dynamic
2192 : TLS_Static;
2193 case TSCS___thread: // Fall through.
2194 case TSCS__Thread_local:
2195 return TLS_Static;
2196 case TSCS_thread_local:
2197 return TLS_Dynamic;
2198 }
2199 llvm_unreachable("Unknown thread storage class specifier!");
2200}
2201
2203 if (const Expr *Init = getInit()) {
2204 SourceLocation InitEnd = Init->getEndLoc();
2205 // If Init is implicit, ignore its source range and fallback on
2206 // DeclaratorDecl::getSourceRange() to handle postfix elements.
2207 if (InitEnd.isValid() && InitEnd != getLocation())
2208 return SourceRange(getOuterLocStart(), InitEnd);
2209 }
2211}
2212
2213template<typename T>
2215 // C++ [dcl.link]p1: All function types, function names with external linkage,
2216 // and variable names with external linkage have a language linkage.
2217 if (!D.hasExternalFormalLinkage())
2218 return NoLanguageLinkage;
2219
2220 // Language linkage is a C++ concept, but saying that everything else in C has
2221 // C language linkage fits the implementation nicely.
2222 if (!D.getASTContext().getLangOpts().CPlusPlus)
2223 return CLanguageLinkage;
2224
2225 // C++ [dcl.link]p4: A C language linkage is ignored in determining the
2226 // language linkage of the names of class members and the function type of
2227 // class member functions.
2228 const DeclContext *DC = D.getDeclContext();
2229 if (DC->isRecord())
2230 return CXXLanguageLinkage;
2231
2232 // If the first decl is in an extern "C" context, any other redeclaration
2233 // will have C language linkage. If the first one is not in an extern "C"
2234 // context, we would have reported an error for any other decl being in one.
2236 return CLanguageLinkage;
2237 return CXXLanguageLinkage;
2238}
2239
2240template<typename T>
2241static bool isDeclExternC(const T &D) {
2242 // Since the context is ignored for class members, they can only have C++
2243 // language linkage or no language linkage.
2244 const DeclContext *DC = D.getDeclContext();
2245 if (DC->isRecord()) {
2246 assert(D.getASTContext().getLangOpts().CPlusPlus);
2247 return false;
2248 }
2249
2250 return D.getLanguageLinkage() == CLanguageLinkage;
2251}
2252
2256
2258 return isDeclExternC(*this);
2259}
2260
2264
2268
2270
2274 return DeclarationOnly;
2275
2276 // C++ [basic.def]p2:
2277 // A declaration is a definition unless [...] it contains the 'extern'
2278 // specifier or a linkage-specification and neither an initializer [...],
2279 // it declares a non-inline static data member in a class declaration [...],
2280 // it declares a static data member outside a class definition and the variable
2281 // was defined within the class with the constexpr specifier [...],
2282 // C++1y [temp.expl.spec]p15:
2283 // An explicit specialization of a static data member or an explicit
2284 // specialization of a static data member template is a definition if the
2285 // declaration includes an initializer; otherwise, it is a declaration.
2286 //
2287 // FIXME: How do you declare (but not define) a partial specialization of
2288 // a static data member template outside the containing class?
2289 if (isStaticDataMember()) {
2290 if (isOutOfLine() &&
2291 !(getCanonicalDecl()->isInline() &&
2293 (hasInit() ||
2294 // If the first declaration is out-of-line, this may be an
2295 // instantiation of an out-of-line partial specialization of a variable
2296 // template for which we have not yet instantiated the initializer.
2302 return Definition;
2303 if (!isOutOfLine() && isInline())
2304 return Definition;
2305 return DeclarationOnly;
2306 }
2307 // C99 6.7p5:
2308 // A definition of an identifier is a declaration for that identifier that
2309 // [...] causes storage to be reserved for that object.
2310 // Note: that applies for all non-file-scope objects.
2311 // C99 6.9.2p1:
2312 // If the declaration of an identifier for an object has file scope and an
2313 // initializer, the declaration is an external definition for the identifier
2314 if (hasInit())
2315 return Definition;
2316
2317 if (hasDefiningAttr())
2318 return Definition;
2319
2320 if (const auto *SAA = getAttr<SelectAnyAttr>())
2321 if (!SAA->isInherited())
2322 return Definition;
2323
2324 // A variable template specialization (other than a static data member
2325 // template or an explicit specialization) is a declaration until we
2326 // instantiate its initializer.
2327 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(this)) {
2328 if (VTSD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization &&
2330 !VTSD->IsCompleteDefinition)
2331 return DeclarationOnly;
2332 }
2333
2334 if (hasExternalStorage())
2335 return DeclarationOnly;
2336
2337 // [dcl.link] p7:
2338 // A declaration directly contained in a linkage-specification is treated
2339 // as if it contains the extern specifier for the purpose of determining
2340 // the linkage of the declared name and whether it is a definition.
2341 if (isSingleLineLanguageLinkage(*this))
2342 return DeclarationOnly;
2343
2344 // C99 6.9.2p2:
2345 // A declaration of an object that has file scope without an initializer,
2346 // and without a storage class specifier or the scs 'static', constitutes
2347 // a tentative definition.
2348 // No such thing in C++.
2349 if (!C.getLangOpts().CPlusPlus && isFileVarDecl())
2350 return TentativeDefinition;
2351
2352 // What's left is (in C, block-scope) declarations without initializers or
2353 // external storage. These are definitions.
2354 return Definition;
2355}
2356
2360 return nullptr;
2361
2362 VarDecl *LastTentative = nullptr;
2363
2364 // Loop through the declaration chain, starting with the most recent.
2366 Decl = Decl->getPreviousDecl()) {
2367 Kind = Decl->isThisDeclarationADefinition();
2368 if (Kind == Definition)
2369 return nullptr;
2370 // Record the first (most recent) TentativeDefinition that is encountered.
2371 if (Kind == TentativeDefinition && !LastTentative)
2372 LastTentative = Decl;
2373 }
2374
2375 return LastTentative;
2376}
2377
2380 for (auto *I : First->redecls()) {
2381 if (I->isThisDeclarationADefinition(C) == Definition)
2382 return I;
2383 }
2384 return nullptr;
2385}
2386
2389
2390 const VarDecl *First = getFirstDecl();
2391 for (auto *I : First->redecls()) {
2392 Kind = std::max(Kind, I->isThisDeclarationADefinition(C));
2393 if (Kind == Definition)
2394 break;
2395 }
2396
2397 return Kind;
2398}
2399
2400const Expr *VarDecl::getAnyInitializer(const VarDecl *&D) const {
2401 for (auto *I : redecls()) {
2402 if (auto Expr = I->getInit()) {
2403 D = I;
2404 return Expr;
2405 }
2406 }
2407 return nullptr;
2408}
2409
2410bool VarDecl::hasInit() const {
2411 if (auto *P = dyn_cast<ParmVarDecl>(this))
2412 if (P->hasUnparsedDefaultArg() || P->hasUninstantiatedDefaultArg())
2413 return false;
2414
2415 if (auto *Eval = getEvaluatedStmt())
2416 return Eval->Value.isValid();
2417
2418 return !Init.isNull();
2419}
2420
2422 if (!hasInit())
2423 return nullptr;
2424
2425 if (auto *S = dyn_cast<Stmt *>(Init))
2426 return cast<Expr>(S);
2427
2428 auto *Eval = getEvaluatedStmt();
2429
2430 return cast<Expr>(Eval->Value.get(
2431 Eval->Value.isOffset() ? getASTContext().getExternalSource() : nullptr));
2432}
2433
2435 if (auto *ES = Init.dyn_cast<EvaluatedStmt *>())
2436 return ES->Value.getAddressOfPointer(getASTContext().getExternalSource());
2437
2438 return Init.getAddrOfPtr1();
2439}
2440
2442 VarDecl *Def = nullptr;
2443 for (auto *I : redecls()) {
2444 if (I->hasInit())
2445 return I;
2446
2447 if (I->isThisDeclarationADefinition()) {
2448 if (isStaticDataMember())
2449 return I;
2450 Def = I;
2451 }
2452 }
2453 return Def;
2454}
2455
2457 if (!hasInit())
2458 return false;
2459
2461 if (!ES->CheckedForSideEffects) {
2462 const Expr *E = getInit();
2463 ES->HasSideEffects =
2465 // We can get a value-dependent initializer during error recovery.
2466 (E->isValueDependent() || getType()->isDependentType() ||
2467 !evaluateValue());
2468 ES->CheckedForSideEffects = true;
2469 }
2470 return ES->HasSideEffects;
2471}
2472
2474 if (Decl::isOutOfLine())
2475 return true;
2476
2477 if (!isStaticDataMember())
2478 return false;
2479
2480 // If this static data member was instantiated from a static data member of
2481 // a class template, check whether that static data member was defined
2482 // out-of-line.
2484 return VD->isOutOfLine();
2485
2486 return false;
2487}
2488
2490 if (auto *Eval = dyn_cast_if_present<EvaluatedStmt *>(Init)) {
2491 Eval->~EvaluatedStmt();
2492 getASTContext().Deallocate(Eval);
2493 }
2494
2495 Init = I;
2496}
2497
2499 const LangOptions &Lang = C.getLangOpts();
2500
2501 // OpenCL permits const integral variables to be used in constant
2502 // expressions, like in C++98.
2503 if (!Lang.CPlusPlus && !Lang.OpenCL && !Lang.C23)
2504 return false;
2505
2506 // Function parameters are never usable in constant expressions.
2507 if (isa<ParmVarDecl>(this))
2508 return false;
2509
2510 // The values of weak variables are never usable in constant expressions.
2511 if (isWeak())
2512 return false;
2513
2514 // In C++11, any variable of reference type can be used in a constant
2515 // expression if it is initialized by a constant expression.
2516 if (Lang.CPlusPlus11 && getType()->isReferenceType())
2517 return true;
2518
2519 // Only const objects can be used in constant expressions in C++. C++98 does
2520 // not require the variable to be non-volatile, but we consider this to be a
2521 // defect.
2522 if (!getType().isConstant(C) || getType().isVolatileQualified())
2523 return false;
2524
2525 // In C++, but not in C, const, non-volatile variables of integral or
2526 // enumeration types can be used in constant expressions.
2527 if (getType()->isIntegralOrEnumerationType() && !Lang.C23)
2528 return true;
2529
2530 // C23 6.6p7: An identifier that is:
2531 // ...
2532 // - declared with storage-class specifier constexpr and has an object type,
2533 // is a named constant, ... such a named constant is a constant expression
2534 // with the type and value of the declared object.
2535 // Additionally, in C++11, non-volatile constexpr variables can be used in
2536 // constant expressions.
2537 return (Lang.CPlusPlus11 || Lang.C23) && isConstexpr();
2538}
2539
2541 // C++2a [expr.const]p3:
2542 // A variable is usable in constant expressions after its initializing
2543 // declaration is encountered...
2544 const VarDecl *DefVD = nullptr;
2545 const Expr *Init = getAnyInitializer(DefVD);
2546 if (!Init || Init->isValueDependent() || getType()->isDependentType())
2547 return false;
2548 // ... if it is a constexpr variable, or it is of reference type or of
2549 // const-qualified integral or enumeration type, ...
2550 if (!DefVD->mightBeUsableInConstantExpressions(Context))
2551 return false;
2552 // ... and its initializer is a constant initializer.
2553 if ((Context.getLangOpts().CPlusPlus || getLangOpts().C23) &&
2554 !DefVD->hasConstantInitialization())
2555 return false;
2556 // C++98 [expr.const]p1:
2557 // An integral constant-expression can involve only [...] const variables
2558 // or static data members of integral or enumeration types initialized with
2559 // [integer] constant expressions (dcl.init)
2560 if ((Context.getLangOpts().CPlusPlus || Context.getLangOpts().OpenCL) &&
2561 !Context.getLangOpts().CPlusPlus11 && !DefVD->hasICEInitializer(Context))
2562 return false;
2563 return true;
2564}
2565
2566/// Convert the initializer for this declaration to the elaborated EvaluatedStmt
2567/// form, which contains extra information on the evaluated value of the
2568/// initializer.
2570 auto *Eval = dyn_cast_if_present<EvaluatedStmt *>(Init);
2571 if (!Eval) {
2572 // Note: EvaluatedStmt contains an APValue, which usually holds
2573 // resources not allocated from the ASTContext. We need to do some
2574 // work to avoid leaking those, but we do so in VarDecl::evaluateValue
2575 // where we can detect whether there's anything to clean up or not.
2576 Eval = new (getASTContext()) EvaluatedStmt;
2577 Eval->Value = cast<Stmt *>(Init);
2578 Init = Eval;
2579 }
2580 return Eval;
2581}
2582
2584 return dyn_cast_if_present<EvaluatedStmt *>(Init);
2585}
2586
2589 return evaluateValueImpl(Notes, hasConstantInitialization());
2590}
2591
2592APValue *VarDecl::evaluateValueImpl(SmallVectorImpl<PartialDiagnosticAt> &Notes,
2593 bool IsConstantInitialization) const {
2595
2596 const auto *Init = getInit();
2597 assert(!Init->isValueDependent());
2598
2599 // We only produce notes indicating why an initializer is non-constant the
2600 // first time it is evaluated. FIXME: The notes won't always be emitted the
2601 // first time we try evaluation, so might not be produced at all.
2602 if (Eval->WasEvaluated)
2603 return Eval->Evaluated.isAbsent() ? nullptr : &Eval->Evaluated;
2604
2605 if (Eval->IsEvaluating) {
2606 // FIXME: Produce a diagnostic for self-initialization.
2607 return nullptr;
2608 }
2609
2610 Eval->IsEvaluating = true;
2611
2612 ASTContext &Ctx = getASTContext();
2613 bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, Ctx, this, Notes,
2614 IsConstantInitialization);
2615
2616 // In C++, or in C23 if we're initialising a 'constexpr' variable, this isn't
2617 // a constant initializer if we produced notes. In that case, we can't keep
2618 // the result, because it may only be correct under the assumption that the
2619 // initializer is a constant context.
2620 if (IsConstantInitialization &&
2621 (Ctx.getLangOpts().CPlusPlus ||
2622 (isConstexpr() && Ctx.getLangOpts().C23)) &&
2623 !Notes.empty())
2624 Result = false;
2625
2626 // Ensure the computed APValue is cleaned up later if evaluation succeeded,
2627 // or that it's empty (so that there's nothing to clean up) if evaluation
2628 // failed.
2629 if (!Result)
2630 Eval->Evaluated = APValue();
2631 else if (Eval->Evaluated.needsCleanup())
2632 Ctx.addDestruction(&Eval->Evaluated);
2633
2634 Eval->IsEvaluating = false;
2635 Eval->WasEvaluated = true;
2636
2637 return Result ? &Eval->Evaluated : nullptr;
2638}
2639
2641 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2642 if (Eval->WasEvaluated)
2643 return &Eval->Evaluated;
2644
2645 return nullptr;
2646}
2647
2648bool VarDecl::hasICEInitializer(const ASTContext &Context) const {
2649 const Expr *Init = getInit();
2650 assert(Init && "no initializer");
2651
2653 if (!Eval->CheckedForICEInit) {
2654 Eval->CheckedForICEInit = true;
2655 Eval->HasICEInit = Init->isIntegerConstantExpr(Context);
2656 }
2657 return Eval->HasICEInit;
2658}
2659
2661 // In C, all globals and constexpr variables should have constant
2662 // initialization. For constexpr variables in C check that initializer is a
2663 // constant initializer because they can be used in constant expressions.
2665 !isConstexpr())
2666 return true;
2667
2668 // In C++, it depends on whether the evaluation at the point of definition
2669 // was evaluatable as a constant initializer.
2670 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2671 return Eval->HasConstantInitialization;
2672
2673 return false;
2674}
2675
2679 // If we ask for the value before we know whether we have a constant
2680 // initializer, we can compute the wrong value (for example, due to
2681 // std::is_constant_evaluated()).
2682 assert(!Eval->WasEvaluated &&
2683 "already evaluated var value before checking for constant init");
2684 assert((getASTContext().getLangOpts().CPlusPlus ||
2686 "only meaningful in C++/C23");
2687
2688 assert(!getInit()->isValueDependent());
2689
2690 // Evaluate the initializer to check whether it's a constant expression.
2692 evaluateValueImpl(Notes, true) && Notes.empty();
2693
2694 // If evaluation as a constant initializer failed, allow re-evaluation as a
2695 // non-constant initializer if we later find we want the value.
2696 if (!Eval->HasConstantInitialization)
2697 Eval->WasEvaluated = false;
2698
2699 return Eval->HasConstantInitialization;
2700}
2701
2702template<typename DeclT>
2703static DeclT *getDefinitionOrSelf(DeclT *D) {
2704 assert(D);
2705 if (auto *Def = D->getDefinition())
2706 return Def;
2707 return D;
2708}
2709
2711 return hasAttr<BlocksAttr>() && NonParmVarDeclBits.EscapingByref;
2712}
2713
2715 return hasAttr<BlocksAttr>() && !NonParmVarDeclBits.EscapingByref;
2716}
2717
2719 QualType T = getType();
2720 return T->isDependentType() || T->isUndeducedType() ||
2721 llvm::any_of(specific_attrs<AlignedAttr>(), [](const AlignedAttr *AA) {
2722 return AA->isAlignmentDependent();
2723 });
2724}
2725
2727 const VarDecl *VD = this;
2728
2729 // If this is an instantiated member, walk back to the template from which
2730 // it was instantiated.
2732 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
2734 while (auto *NewVD = VD->getInstantiatedFromStaticDataMember())
2735 VD = NewVD;
2736 }
2737 }
2738
2739 // If it's an instantiated variable template specialization, find the
2740 // template or partial specialization from which it was instantiated.
2741 if (auto *VDTemplSpec = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
2742 if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) {
2743 auto From = VDTemplSpec->getInstantiatedFrom();
2744 if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) {
2745 while (!VTD->isMemberSpecialization()) {
2746 auto *NewVTD = VTD->getInstantiatedFromMemberTemplate();
2747 if (!NewVTD)
2748 break;
2749 VTD = NewVTD;
2750 }
2751 return getDefinitionOrSelf(VTD->getTemplatedDecl());
2752 }
2753 if (auto *VTPSD =
2754 From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
2755 while (!VTPSD->isMemberSpecialization()) {
2756 auto *NewVTPSD = VTPSD->getInstantiatedFromMember();
2757 if (!NewVTPSD)
2758 break;
2759 VTPSD = NewVTPSD;
2760 }
2761 return getDefinitionOrSelf<VarDecl>(VTPSD);
2762 }
2763 }
2764 }
2765
2766 // If this is the pattern of a variable template, find where it was
2767 // instantiated from. FIXME: Is this necessary?
2769 while (!VarTemplate->isMemberSpecialization()) {
2770 auto *NewVT = VarTemplate->getInstantiatedFromMemberTemplate();
2771 if (!NewVT)
2772 break;
2773 VarTemplate = NewVT;
2774 }
2775
2776 return getDefinitionOrSelf(VarTemplate->getTemplatedDecl());
2777 }
2778
2779 if (VD == this)
2780 return nullptr;
2781 return getDefinitionOrSelf(const_cast<VarDecl*>(VD));
2782}
2783
2786 return cast<VarDecl>(MSI->getInstantiatedFrom());
2787
2788 return nullptr;
2789}
2790
2792 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2793 return Spec->getSpecializationKind();
2794
2796 return MSI->getTemplateSpecializationKind();
2797
2798 return TSK_Undeclared;
2799}
2800
2804 return MSI->getTemplateSpecializationKind();
2805
2806 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2807 return Spec->getSpecializationKind();
2808
2809 return TSK_Undeclared;
2810}
2811
2813 if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this))
2814 return Spec->getPointOfInstantiation();
2815
2817 return MSI->getPointOfInstantiation();
2818
2819 return SourceLocation();
2820}
2821
2823 return dyn_cast_if_present<VarTemplateDecl *>(
2824 getASTContext().getTemplateOrSpecializationInfo(this));
2825}
2826
2830
2832 const auto &LangOpts = getASTContext().getLangOpts();
2833 // In CUDA mode without relocatable device code, variables of form 'extern
2834 // __shared__ Foo foo[]' are pointers to the base of the GPU core's shared
2835 // memory pool. These are never undefined variables, even if they appear
2836 // inside of an anon namespace or static function.
2837 //
2838 // With CUDA relocatable device code enabled, these variables don't get
2839 // special handling; they're treated like regular extern variables.
2840 if (LangOpts.CUDA && !LangOpts.GPURelocatableDeviceCode &&
2843 return true;
2844
2845 return hasDefinition();
2846}
2847
2848bool VarDecl::isNoDestroy(const ASTContext &Ctx) const {
2849 if (!hasGlobalStorage())
2850 return false;
2852 return true;
2854 return false;
2855
2857 RSDKind K = Ctx.getLangOpts().getRegisterStaticDestructors();
2858 return K == RSDKind::None ||
2859 (K == RSDKind::ThreadLocal && getTLSKind() == TLS_None);
2860}
2861
2864 if (EvaluatedStmt *Eval = getEvaluatedStmt())
2865 if (Eval->HasConstantDestruction)
2866 return QualType::DK_none;
2867
2868 if (isNoDestroy(Ctx))
2869 return QualType::DK_none;
2870
2871 return getType().isDestructedType();
2872}
2873
2875 assert(hasInit() && "Expect initializer to check for flexible array init");
2876 auto *D = getType()->getAsRecordDecl();
2877 if (!D || !D->hasFlexibleArrayMember())
2878 return false;
2879 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens());
2880 if (!List)
2881 return false;
2882 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1);
2883 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType());
2884 if (!InitTy)
2885 return false;
2886 return !InitTy->isZeroSize();
2887}
2888
2890 assert(hasInit() && "Expect initializer to check for flexible array init");
2891 auto *RD = getType()->getAsRecordDecl();
2892 if (!RD || !RD->hasFlexibleArrayMember())
2893 return CharUnits::Zero();
2894 auto *List = dyn_cast<InitListExpr>(getInit()->IgnoreParens());
2895 if (!List || List->getNumInits() == 0)
2896 return CharUnits::Zero();
2897 const Expr *FlexibleInit = List->getInit(List->getNumInits() - 1);
2898 auto InitTy = Ctx.getAsConstantArrayType(FlexibleInit->getType());
2899 if (!InitTy)
2900 return CharUnits::Zero();
2901 CharUnits FlexibleArraySize = Ctx.getTypeSizeInChars(InitTy);
2902 const ASTRecordLayout &RL = Ctx.getASTRecordLayout(RD);
2903 CharUnits FlexibleArrayOffset =
2905 if (FlexibleArrayOffset + FlexibleArraySize < RL.getSize())
2906 return CharUnits::Zero();
2907 return FlexibleArrayOffset + FlexibleArraySize - RL.getSize();
2908}
2909
2911 if (isStaticDataMember())
2912 // FIXME: Remove ?
2913 // return getASTContext().getInstantiatedFromStaticDataMember(this);
2914 return dyn_cast_if_present<MemberSpecializationInfo *>(
2915 getASTContext().getTemplateOrSpecializationInfo(this));
2916 return nullptr;
2917}
2918
2920 SourceLocation PointOfInstantiation) {
2921 assert((isa<VarTemplateSpecializationDecl>(this) ||
2923 "not a variable or static data member template specialization");
2924
2926 dyn_cast<VarTemplateSpecializationDecl>(this)) {
2927 Spec->setSpecializationKind(TSK);
2928 if (TSK != TSK_ExplicitSpecialization &&
2929 PointOfInstantiation.isValid() &&
2930 Spec->getPointOfInstantiation().isInvalid()) {
2931 Spec->setPointOfInstantiation(PointOfInstantiation);
2933 L->InstantiationRequested(this);
2934 }
2936 MSI->setTemplateSpecializationKind(TSK);
2937 if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() &&
2938 MSI->getPointOfInstantiation().isInvalid()) {
2939 MSI->setPointOfInstantiation(PointOfInstantiation);
2941 L->InstantiationRequested(this);
2942 }
2943 }
2944}
2945
2946void
2949 assert(getASTContext().getTemplateOrSpecializationInfo(this).isNull() &&
2950 "Previous template or instantiation?");
2952}
2953
2954//===----------------------------------------------------------------------===//
2955// ParmVarDecl Implementation
2956//===----------------------------------------------------------------------===//
2957
2959 SourceLocation StartLoc, SourceLocation IdLoc,
2960 const IdentifierInfo *Id, QualType T,
2961 TypeSourceInfo *TInfo, StorageClass S,
2962 Expr *DefArg) {
2963 return new (C, DC) ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo,
2964 S, DefArg);
2965}
2966
2969 QualType T = TSI ? TSI->getType() : getType();
2970 if (const auto *DT = dyn_cast<DecayedType>(T))
2971 return DT->getOriginalType();
2972 return T;
2973}
2974
2976 return new (C, ID)
2977 ParmVarDecl(ParmVar, C, nullptr, SourceLocation(), SourceLocation(),
2978 nullptr, QualType(), nullptr, SC_None, nullptr);
2979}
2980
2982 if (!hasInheritedDefaultArg()) {
2983 SourceRange ArgRange = getDefaultArgRange();
2984 if (ArgRange.isValid())
2985 return SourceRange(getOuterLocStart(), ArgRange.getEnd());
2986 }
2987
2988 // DeclaratorDecl considers the range of postfix types as overlapping with the
2989 // declaration name, but this is not the case with parameters in ObjC methods.
2992
2994}
2995
2997 // ns_consumed only affects code generation in ARC
2999 return getASTContext().getLangOpts().ObjCAutoRefCount;
3000
3001 // FIXME: isParamDestroyedInCallee() should probably imply
3002 // isDestructedType()
3003 const auto *RT = getType()->getAsCanonical<RecordType>();
3004 if (RT && RT->getDecl()->getDefinitionOrSelf()->isParamDestroyedInCallee() &&
3005 getType().isDestructedType())
3006 return true;
3007
3008 return false;
3009}
3010
3012 assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!");
3013 assert(!hasUninstantiatedDefaultArg() &&
3014 "Default argument is not yet instantiated!");
3015
3016 Expr *Arg = getInit();
3017 if (auto *E = dyn_cast_if_present<FullExpr>(Arg))
3018 return E->getSubExpr();
3019
3020 return Arg;
3021}
3022
3024 ParmVarDeclBits.DefaultArgKind = DAK_Normal;
3025 Init = defarg;
3026}
3027
3029 switch (ParmVarDeclBits.DefaultArgKind) {
3030 case DAK_None:
3031 case DAK_Unparsed:
3032 // Nothing we can do here.
3033 return SourceRange();
3034
3035 case DAK_Uninstantiated:
3037
3038 case DAK_Normal:
3039 if (const Expr *E = getInit())
3040 return E->getSourceRange();
3041
3042 // Missing an actual expression, may be invalid.
3043 return SourceRange();
3044 }
3045 llvm_unreachable("Invalid default argument kind.");
3046}
3047
3049 ParmVarDeclBits.DefaultArgKind = DAK_Uninstantiated;
3050 Init = arg;
3051}
3052
3054 assert(hasUninstantiatedDefaultArg() &&
3055 "Wrong kind of initialization expression!");
3056 return cast_if_present<Expr>(cast<Stmt *>(Init));
3057}
3058
3060 // FIXME: We should just return false for DAK_None here once callers are
3061 // prepared for the case that we encountered an invalid default argument and
3062 // were unable to even build an invalid expression.
3064 !Init.isNull();
3065}
3066
3067void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) {
3068 getASTContext().setParameterIndex(this, parameterIndex);
3069 ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel;
3070}
3071
3072unsigned ParmVarDecl::getParameterIndexLarge() const {
3073 return getASTContext().getParameterIndex(this);
3074}
3075
3076//===----------------------------------------------------------------------===//
3077// FunctionDecl Implementation
3078//===----------------------------------------------------------------------===//
3079
3081 SourceLocation StartLoc,
3082 const DeclarationNameInfo &NameInfo, QualType T,
3083 TypeSourceInfo *TInfo, StorageClass S,
3085 ConstexprSpecKind ConstexprKind,
3086 const AssociatedConstraint &TrailingRequiresClause)
3087 : DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo,
3088 StartLoc),
3089 DeclContext(DK), redeclarable_base(C), Body(), ODRHash(0),
3090 EndRangeLoc(NameInfo.getEndLoc()), DNLoc(NameInfo.getInfo()) {
3091 assert(T.isNull() || T->isFunctionType());
3092 FunctionDeclBits.SClass = S;
3094 FunctionDeclBits.IsInlineSpecified = isInlineSpecified;
3095 FunctionDeclBits.IsVirtualAsWritten = false;
3096 FunctionDeclBits.IsPureVirtual = false;
3097 FunctionDeclBits.HasInheritedPrototype = false;
3098 FunctionDeclBits.HasWrittenPrototype = true;
3099 FunctionDeclBits.IsDeleted = false;
3100 FunctionDeclBits.IsTrivial = false;
3101 FunctionDeclBits.IsTrivialForCall = false;
3102 FunctionDeclBits.IsDefaulted = false;
3103 FunctionDeclBits.IsExplicitlyDefaulted = false;
3104 FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
3105 FunctionDeclBits.IsIneligibleOrNotSelected = false;
3106 FunctionDeclBits.HasImplicitReturnZero = false;
3107 FunctionDeclBits.IsLateTemplateParsed = false;
3108 FunctionDeclBits.IsInstantiatedFromMemberTemplate = false;
3109 FunctionDeclBits.ConstexprKind = static_cast<uint64_t>(ConstexprKind);
3110 FunctionDeclBits.BodyContainsImmediateEscalatingExpression = false;
3111 FunctionDeclBits.InstantiationIsPending = false;
3112 FunctionDeclBits.UsesSEHTry = false;
3113 FunctionDeclBits.UsesFPIntrin = UsesFPIntrin;
3114 FunctionDeclBits.HasSkippedBody = false;
3115 FunctionDeclBits.WillHaveBody = false;
3116 FunctionDeclBits.IsMultiVersion = false;
3117 FunctionDeclBits.DeductionCandidateKind =
3118 static_cast<unsigned char>(DeductionCandidate::Normal);
3119 FunctionDeclBits.HasODRHash = false;
3120 FunctionDeclBits.FriendConstraintRefersToEnclosingTemplate = false;
3121
3122 if (TrailingRequiresClause)
3123 setTrailingRequiresClause(TrailingRequiresClause);
3124}
3125
3127 raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
3130 if (TemplateArgs)
3131 printTemplateArgumentList(OS, TemplateArgs->asArray(), Policy);
3132}
3133
3135 if (const auto *FT = getType()->getAs<FunctionProtoType>())
3136 return FT->isVariadic();
3137 return false;
3138}
3139
3142 ASTContext &Context, ArrayRef<DeclAccessPair> Lookups,
3143 StringLiteral *DeletedMessage) {
3144 static constexpr size_t Alignment =
3145 std::max({alignof(DefaultedOrDeletedFunctionInfo),
3146 alignof(DeclAccessPair), alignof(StringLiteral *)});
3147 size_t Size = totalSizeToAlloc<DeclAccessPair, StringLiteral *>(
3148 Lookups.size(), DeletedMessage != nullptr);
3149
3151 new (Context.Allocate(Size, Alignment)) DefaultedOrDeletedFunctionInfo;
3152 Info->NumLookups = Lookups.size();
3153 Info->HasDeletedMessage = DeletedMessage != nullptr;
3154
3155 llvm::uninitialized_copy(Lookups, Info->getTrailingObjects<DeclAccessPair>());
3156 if (DeletedMessage)
3157 *Info->getTrailingObjects<StringLiteral *>() = DeletedMessage;
3158 return Info;
3159}
3160
3163 assert(!FunctionDeclBits.HasDefaultedOrDeletedInfo && "already have this");
3164 assert(!Body && "can't replace function body with defaulted function info");
3165
3166 FunctionDeclBits.HasDefaultedOrDeletedInfo = true;
3168}
3169
3171 FunctionDeclBits.IsDeleted = D;
3172
3173 if (Message) {
3174 assert(isDeletedAsWritten() && "Function must be deleted");
3175 if (FunctionDeclBits.HasDefaultedOrDeletedInfo)
3176 DefaultedOrDeletedInfo->setDeletedMessage(Message);
3177 else
3179 getASTContext(), /*Lookups=*/{}, Message));
3180 }
3181}
3182
3184 StringLiteral *Message) {
3185 // We should never get here with the DefaultedOrDeletedInfo populated, but
3186 // no space allocated for the deleted message, since that would require
3187 // recreating this, but setDefaultedOrDeletedInfo() disallows overwriting
3188 // an already existing DefaultedOrDeletedFunctionInfo.
3189 assert(HasDeletedMessage &&
3190 "No space to store a delete message in this DefaultedOrDeletedInfo");
3191 *getTrailingObjects<StringLiteral *>() = Message;
3192}
3193
3196 return FunctionDeclBits.HasDefaultedOrDeletedInfo ? DefaultedOrDeletedInfo
3197 : nullptr;
3198}
3199
3201 for (const auto *I : redecls()) {
3202 if (I->doesThisDeclarationHaveABody()) {
3203 Definition = I;
3204 return true;
3205 }
3206 }
3207
3208 return false;
3209}
3210
3212 const Stmt *S = getBody();
3213 if (!S) {
3214 // Since we don't have a body for this function, we don't know if it's
3215 // trivial or not.
3216 return false;
3217 }
3218
3219 if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty())
3220 return true;
3221 return false;
3222}
3223
3225 if (!getFriendObjectKind())
3226 return false;
3227
3228 // Check for a friend function instantiated from a friend function
3229 // definition in a templated class.
3230 if (const FunctionDecl *InstantiatedFrom =
3232 return InstantiatedFrom->getFriendObjectKind() &&
3233 InstantiatedFrom->isThisDeclarationADefinition();
3234
3235 // Check for a friend function template instantiated from a friend
3236 // function template definition in a templated class.
3238 if (const FunctionTemplateDecl *InstantiatedFrom =
3239 Template->getInstantiatedFromMemberTemplate())
3240 return InstantiatedFrom->getFriendObjectKind() &&
3241 InstantiatedFrom->isThisDeclarationADefinition();
3242 }
3243
3244 return false;
3245}
3246
3248 bool CheckForPendingFriendDefinition) const {
3249 for (const FunctionDecl *FD : redecls()) {
3250 if (FD->isThisDeclarationADefinition()) {
3251 Definition = FD;
3252 return true;
3253 }
3254
3255 // If this is a friend function defined in a class template, it does not
3256 // have a body until it is used, nevertheless it is a definition, see
3257 // [temp.inst]p2:
3258 //
3259 // ... for the purpose of determining whether an instantiated redeclaration
3260 // is valid according to [basic.def.odr] and [class.mem], a declaration that
3261 // corresponds to a definition in the template is considered to be a
3262 // definition.
3263 //
3264 // The following code must produce redefinition error:
3265 //
3266 // template<typename T> struct C20 { friend void func_20() {} };
3267 // C20<int> c20i;
3268 // void func_20() {}
3269 //
3270 if (CheckForPendingFriendDefinition &&
3271 FD->isThisDeclarationInstantiatedFromAFriendDefinition()) {
3272 Definition = FD;
3273 return true;
3274 }
3275 }
3276
3277 return false;
3278}
3279
3281 if (!hasBody(Definition))
3282 return nullptr;
3283
3284 assert(!Definition->FunctionDeclBits.HasDefaultedOrDeletedInfo &&
3285 "definition should not have a body");
3286 if (Definition->Body)
3287 return Definition->Body.get(getASTContext().getExternalSource());
3288
3289 return nullptr;
3290}
3291
3293 FunctionDeclBits.HasDefaultedOrDeletedInfo = false;
3294 Body = LazyDeclStmtPtr(B);
3295 if (B)
3296 EndRangeLoc = B->getEndLoc();
3297}
3298
3300 FunctionDeclBits.IsPureVirtual = P;
3301 if (P)
3302 if (auto *Parent = dyn_cast<CXXRecordDecl>(getDeclContext()))
3303 Parent->markedVirtualFunctionPure();
3304}
3305
3306template<std::size_t Len>
3307static bool isNamed(const NamedDecl *ND, const char (&Str)[Len]) {
3308 const IdentifierInfo *II = ND->getIdentifier();
3309 return II && II->isStr(Str);
3310}
3311
3313 // C++23 [expr.const]/p17
3314 // An immediate-escalating function is
3315 // - the call operator of a lambda that is not declared with the consteval
3316 // specifier,
3317 if (isLambdaCallOperator(this) && !isConsteval())
3318 return true;
3319 // - a defaulted special member function that is not declared with the
3320 // consteval specifier,
3321 if (isDefaulted() && !isConsteval())
3322 return true;
3323
3324 if (auto *CD = dyn_cast<CXXConstructorDecl>(this);
3325 CD && CD->isInheritingConstructor())
3326 return CD->getInheritedConstructor().getConstructor();
3327
3328 // Destructors are not immediate escalating.
3329 if (isa<CXXDestructorDecl>(this))
3330 return false;
3331
3332 // - a function that results from the instantiation of a templated entity
3333 // defined with the constexpr specifier.
3335 if (TK != TK_NonTemplate && TK != TK_DependentNonTemplate &&
3337 return true;
3338 return false;
3339}
3340
3342 // C++23 [expr.const]/p18
3343 // An immediate function is a function or constructor that is
3344 // - declared with the consteval specifier
3345 if (isConsteval())
3346 return true;
3347 // - an immediate-escalating function F whose function body contains an
3348 // immediate-escalating expression
3350 return true;
3351
3352 if (auto *CD = dyn_cast<CXXConstructorDecl>(this);
3353 CD && CD->isInheritingConstructor())
3354 return CD->getInheritedConstructor()
3355 .getConstructor()
3356 ->isImmediateFunction();
3357
3359 P && P->isImmediateFunction())
3360 return true;
3361
3362 if (const auto *MD = dyn_cast<CXXMethodDecl>(this);
3363 MD && MD->isLambdaStaticInvoker())
3364 return MD->getParent()->getLambdaCallOperator()->isImmediateFunction();
3365
3366 return false;
3367}
3368
3370 return isNamed(this, "main") && !getLangOpts().Freestanding &&
3371 !getLangOpts().HLSL &&
3373 isExternC());
3374}
3375
3377 const TranslationUnitDecl *TUnit =
3378 dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext());
3379 if (!TUnit)
3380 return false;
3381
3382 // Even though we aren't really targeting MSVCRT if we are freestanding,
3383 // semantic analysis for these functions remains the same.
3384
3385 // MSVCRT entry points only exist on MSVCRT targets.
3386 if (!TUnit->getASTContext().getTargetInfo().getTriple().isOSMSVCRT() &&
3387 !TUnit->getASTContext().getTargetInfo().getTriple().isUEFI())
3388 return false;
3389
3390 // Nameless functions like constructors cannot be entry points.
3391 if (!getIdentifier())
3392 return false;
3393
3394 return llvm::StringSwitch<bool>(getName())
3395 .Cases({"main", // an ANSI console app
3396 "wmain", // a Unicode console App
3397 "WinMain", // an ANSI GUI app
3398 "wWinMain", // a Unicode GUI app
3399 "DllMain"}, // a DLL
3400 true)
3401 .Default(false);
3402}
3403
3405 if (!getDeclName().isAnyOperatorNewOrDelete())
3406 return false;
3407
3409 return false;
3410
3412 return false;
3413
3414 const auto *proto = getType()->castAs<FunctionProtoType>();
3415 if (proto->getNumParams() != 2 || proto->isVariadic())
3416 return false;
3417
3418 const ASTContext &Context =
3420 ->getASTContext();
3421
3422 // The result type and first argument type are constant across all
3423 // these operators. The second argument must be exactly void*.
3424 return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy);
3425}
3426
3428 UnsignedOrNone *AlignmentParam, bool *IsNothrow) const {
3429 if (!getDeclName().isAnyOperatorNewOrDelete())
3430 return false;
3431
3433 return false;
3434
3435 // This can only fail for an invalid 'operator new' declaration.
3437 return false;
3438
3439 if (isVariadic())
3440 return false;
3441
3443 bool IsDelete = getDeclName().isAnyOperatorDelete();
3444 unsigned RequiredParameterCount =
3447 if (AlignmentParam)
3448 *AlignmentParam =
3449 /* type identity */ 1U + /* address */ IsDelete + /* size */ 1U;
3450 if (RequiredParameterCount == getNumParams())
3451 return true;
3452 if (getNumParams() > RequiredParameterCount + 1)
3453 return false;
3454 if (!getParamDecl(RequiredParameterCount)->getType()->isNothrowT())
3455 return false;
3456
3457 if (IsNothrow)
3458 *IsNothrow = true;
3459 return true;
3460 }
3461
3462 const auto *FPT = getType()->castAs<FunctionProtoType>();
3463 if (FPT->getNumParams() == 0 || FPT->getNumParams() > 4)
3464 return false;
3465
3466 // If this is a single-parameter function, it must be a replaceable global
3467 // allocation or deallocation function.
3468 if (FPT->getNumParams() == 1)
3469 return true;
3470
3471 unsigned Params = 1;
3472 QualType Ty = FPT->getParamType(Params);
3473 const ASTContext &Ctx = getASTContext();
3474
3475 auto Consume = [&] {
3476 ++Params;
3477 Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType();
3478 };
3479
3480 // In C++14, the next parameter can be a 'std::size_t' for sized delete.
3481 bool IsSizedDelete = false;
3482 if (Ctx.getLangOpts().SizedDeallocation &&
3483 getDeclName().isAnyOperatorDelete() &&
3484 Ctx.hasSameType(Ty, Ctx.getSizeType())) {
3485 IsSizedDelete = true;
3486 Consume();
3487 }
3488
3489 // In C++17, the next parameter can be a 'std::align_val_t' for aligned
3490 // new/delete.
3491 if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT()) {
3492 Consume();
3493 if (AlignmentParam)
3494 *AlignmentParam = Params;
3495 }
3496
3497 // If this is not a sized delete, the next parameter can be a
3498 // 'const std::nothrow_t&'.
3499 if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) {
3500 Ty = Ty->getPointeeType();
3502 return false;
3503 if (Ty->isNothrowT()) {
3504 if (IsNothrow)
3505 *IsNothrow = true;
3506 Consume();
3507 }
3508 }
3509
3510 // Finally, recognize the not yet standard versions of new that take a
3511 // hot/cold allocation hint (__hot_cold_t). These are currently supported by
3512 // tcmalloc (see
3513 // https://github.com/google/tcmalloc/blob/220043886d4e2efff7a5702d5172cb8065253664/tcmalloc/malloc_extension.h#L53).
3514 if (!IsSizedDelete && !Ty.isNull() && Ty->isEnumeralType()) {
3515 QualType T = Ty;
3516 while (const auto *TD = T->getAs<TypedefType>())
3517 T = TD->getDecl()->getUnderlyingType();
3518 const IdentifierInfo *II =
3519 T->castAsCanonical<EnumType>()->getDecl()->getIdentifier();
3520 if (II && II->isStr("__hot_cold_t"))
3521 Consume();
3522 }
3523
3524 return Params == FPT->getNumParams();
3525}
3526
3528 if (!getBuiltinID())
3529 return false;
3530
3531 const FunctionDecl *Definition;
3532 if (!hasBody(Definition))
3533 return false;
3534
3535 if (!Definition->isInlineSpecified() ||
3536 !Definition->hasAttr<AlwaysInlineAttr>())
3537 return false;
3538
3539 ASTContext &Context = getASTContext();
3540 switch (Context.GetGVALinkageForFunction(Definition)) {
3541 case GVA_Internal:
3542 case GVA_DiscardableODR:
3543 case GVA_StrongODR:
3544 return false;
3546 case GVA_StrongExternal:
3547 return true;
3548 }
3549 llvm_unreachable("Unknown GVALinkage");
3550}
3551
3555
3556void FunctionDecl::setIsDestroyingOperatorDelete(bool IsDestroyingDelete) {
3557 getASTContext().setIsDestroyingOperatorDelete(this, IsDestroyingDelete);
3558}
3559
3563
3567
3569 UsualDeleteParams Params;
3570
3571 // This function should only be called for operator delete declarations.
3572 assert(getDeclName().isAnyOperatorDelete());
3573 if (!getDeclName().isAnyOperatorDelete())
3574 return Params;
3575
3577 auto AI = FPT->param_type_begin(), AE = FPT->param_type_end();
3578
3581 assert(AI != AE);
3582 ++AI;
3583 }
3584
3585 // The first argument after the type-identity parameter (if any) is
3586 // always a void* (or C* for a destroying operator delete for class
3587 // type C).
3588 ++AI;
3589
3590 // The next parameter may be a std::destroying_delete_t.
3592 assert(!isTypeAwareAllocation(Params.TypeAwareDelete));
3593 Params.DestroyingDelete = true;
3594 assert(AI != AE);
3595 ++AI;
3596 }
3597
3598 // Figure out what other parameters we should be implicitly passing.
3599 if (AI != AE && (*AI)->isIntegerType()) {
3600 Params.Size = true;
3601 ++AI;
3602 } else
3603 assert(!isTypeAwareAllocation(Params.TypeAwareDelete));
3604
3605 if (AI != AE && (*AI)->isAlignValT()) {
3607 ++AI;
3608 } else
3609 assert(!isTypeAwareAllocation(Params.TypeAwareDelete));
3610
3611 assert(AI == AE && "unexpected usual deallocation function parameter");
3612 return Params;
3613}
3614
3618
3620 return isDeclExternC(*this);
3621}
3622
3624 if (DeviceKernelAttr::isOpenCLSpelling(getAttr<DeviceKernelAttr>()))
3625 return true;
3627}
3628
3632
3634 if (const auto *Method = dyn_cast<CXXMethodDecl>(this))
3635 return Method->isStatic();
3636
3638 return false;
3639
3640 for (const DeclContext *DC = getDeclContext();
3641 DC->isNamespace();
3642 DC = DC->getParent()) {
3643 if (const auto *Namespace = cast<NamespaceDecl>(DC)) {
3644 if (!Namespace->getDeclName())
3645 return false;
3646 }
3647 }
3648
3649 return true;
3650}
3651
3655 return true;
3656
3657 if (auto *FnTy = getType()->getAs<FunctionType>())
3658 return FnTy->getNoReturnAttr();
3659
3660 return false;
3661}
3662
3666
3668 // C++20 [temp.friend]p9:
3669 // A non-template friend declaration with a requires-clause [or]
3670 // a friend function template with a constraint that depends on a template
3671 // parameter from an enclosing template [...] does not declare the same
3672 // function or function template as a declaration in any other scope.
3673
3674 // If this isn't a friend then it's not a member-like constrained friend.
3675 if (!getFriendObjectKind()) {
3676 return false;
3677 }
3678
3680 // If these friends don't have constraints, they aren't constrained, and
3681 // thus don't fall under temp.friend p9. Else the simple presence of a
3682 // constraint makes them unique.
3684 }
3685
3687}
3688
3702
3706
3710
3715
3717 if (!isMultiVersion())
3718 return false;
3719 if (hasAttr<TargetAttr>())
3720 return getAttr<TargetAttr>()->isDefaultVersion();
3721 return hasAttr<TargetVersionAttr>() &&
3722 getAttr<TargetVersionAttr>()->isDefaultVersion();
3723}
3724
3728
3732
3733void
3736
3738 FunctionTemplateDecl *PrevFunTmpl
3739 = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : nullptr;
3740 assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch");
3741 FunTmpl->setPreviousDecl(PrevFunTmpl);
3742 }
3743
3744 if (PrevDecl && PrevDecl->isInlined())
3745 setImplicitlyInline(true);
3746}
3747
3749
3750/// Returns a value indicating whether this function corresponds to a builtin
3751/// function.
3752///
3753/// The function corresponds to a built-in function if it is declared at
3754/// translation scope or within an extern "C" block and its name matches with
3755/// the name of a builtin. The returned value will be 0 for functions that do
3756/// not correspond to a builtin, a value of type \c Builtin::ID if in the
3757/// target-independent range \c [1,Builtin::First), or a target-specific builtin
3758/// value.
3759///
3760/// \param ConsiderWrapperFunctions If true, we should consider wrapper
3761/// functions as their wrapped builtins. This shouldn't be done in general, but
3762/// it's useful in Sema to diagnose calls to wrappers based on their semantics.
3763unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const {
3764 unsigned BuiltinID = 0;
3765
3766 if (const auto *ABAA = getAttr<ArmBuiltinAliasAttr>()) {
3767 BuiltinID = ABAA->getBuiltinName()->getBuiltinID();
3768 } else if (const auto *BAA = getAttr<BuiltinAliasAttr>()) {
3769 BuiltinID = BAA->getBuiltinName()->getBuiltinID();
3770 } else if (const auto *A = getAttr<BuiltinAttr>()) {
3771 BuiltinID = A->getID();
3772 }
3773
3774 if (!BuiltinID)
3775 return 0;
3776
3777 // If the function is marked "overloadable", it has a different mangled name
3778 // and is not the C library function.
3779 if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>() &&
3781 return 0;
3782
3784 BuiltinID == Builtin::BI__builtin_counted_by_ref)
3785 return 0;
3786
3787 const ASTContext &Context = getASTContext();
3788 if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3789 return BuiltinID;
3790
3791 // This function has the name of a known C library
3792 // function. Determine whether it actually refers to the C library
3793 // function or whether it just has the same name.
3794
3795 // If this is a static function, it's not a builtin.
3796 if (!ConsiderWrapperFunctions && getStorageClass() == SC_Static)
3797 return 0;
3798
3799 // OpenCL v1.2 s6.9.f - The library functions defined in
3800 // the C99 standard headers are not available.
3801 if (Context.getLangOpts().OpenCL &&
3802 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3803 return 0;
3804
3805 // CUDA does not have device-side standard library. printf and malloc are the
3806 // only special cases that are supported by device-side runtime.
3807 if (Context.getLangOpts().CUDA && hasAttr<CUDADeviceAttr>() &&
3809 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3810 return 0;
3811
3812 // As AMDGCN implementation of OpenMP does not have a device-side standard
3813 // library, none of the predefined library functions except printf and malloc
3814 // should be treated as a builtin i.e. 0 should be returned for them.
3815 if (Context.getTargetInfo().getTriple().isAMDGCN() &&
3816 Context.getLangOpts().OpenMPIsTargetDevice &&
3817 Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
3818 !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc))
3819 return 0;
3820
3821 return BuiltinID;
3822}
3823
3824/// getNumParams - Return the number of parameters this function must have
3825/// based on its FunctionType. This is the length of the ParamInfo array
3826/// after it has been created.
3828 const auto *FPT = getType()->getAs<FunctionProtoType>();
3829 return FPT ? FPT->getNumParams() : 0;
3830}
3831
3832void FunctionDecl::setParams(ASTContext &C,
3833 ArrayRef<ParmVarDecl *> NewParamInfo) {
3834 assert(!ParamInfo && "Already has param info!");
3835 assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!");
3836
3837 // Zero params -> null pointer.
3838 if (!NewParamInfo.empty()) {
3839 ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
3840 llvm::copy(NewParamInfo, ParamInfo);
3841 }
3842}
3843
3844/// getMinRequiredArguments - Returns the minimum number of arguments
3845/// needed to call this function. This may be fewer than the number of
3846/// function parameters, if some of the parameters have default
3847/// arguments (in C++) or are parameter packs (C++11).
3850 return getNumParams();
3851
3852 // Note that it is possible for a parameter with no default argument to
3853 // follow a parameter with a default argument.
3854 unsigned NumRequiredArgs = 0;
3855 unsigned MinParamsSoFar = 0;
3856 for (auto *Param : parameters()) {
3857 if (!Param->isParameterPack()) {
3858 ++MinParamsSoFar;
3859 if (!Param->hasDefaultArg())
3860 NumRequiredArgs = MinParamsSoFar;
3861 }
3862 }
3863 return NumRequiredArgs;
3864}
3865
3869
3871 return getNumParams() -
3872 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3873}
3874
3876 return getMinRequiredArguments() -
3877 static_cast<unsigned>(hasCXXExplicitFunctionObjectParameter());
3878}
3879
3881 return getNumParams() == 1 ||
3882 (getNumParams() > 1 &&
3883 llvm::all_of(llvm::drop_begin(parameters()),
3884 [](ParmVarDecl *P) { return P->hasDefaultArg(); }));
3885}
3886
3887/// The combination of the extern and inline keywords under MSVC forces
3888/// the function to be required.
3889///
3890/// Note: This function assumes that we will only get called when isInlined()
3891/// would return true for this FunctionDecl.
3893 assert(isInlined() && "expected to get called on an inlined function!");
3894
3895 const ASTContext &Context = getASTContext();
3896 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() &&
3898 return false;
3899
3900 for (const FunctionDecl *FD = getMostRecentDecl(); FD;
3901 FD = FD->getPreviousDecl())
3902 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3903 return true;
3904
3905 return false;
3906}
3907
3908static bool redeclForcesDefMSVC(const FunctionDecl *Redecl) {
3909 if (Redecl->getStorageClass() != SC_Extern)
3910 return false;
3911
3912 for (const FunctionDecl *FD = Redecl->getPreviousDecl(); FD;
3913 FD = FD->getPreviousDecl())
3914 if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern)
3915 return false;
3916
3917 return true;
3918}
3919
3920static bool RedeclForcesDefC99(const FunctionDecl *Redecl) {
3921 // Only consider file-scope declarations in this test.
3922 if (!Redecl->getLexicalDeclContext()->isTranslationUnit())
3923 return false;
3924
3925 // Only consider explicit declarations; the presence of a builtin for a
3926 // libcall shouldn't affect whether a definition is externally visible.
3927 if (Redecl->isImplicit())
3928 return false;
3929
3930 if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern)
3931 return true; // Not an inline definition
3932
3933 return false;
3934}
3935
3936/// For a function declaration in C or C++, determine whether this
3937/// declaration causes the definition to be externally visible.
3938///
3939/// For instance, this determines if adding the current declaration to the set
3940/// of redeclarations of the given functions causes
3941/// isInlineDefinitionExternallyVisible to change from false to true.
3943 assert(!doesThisDeclarationHaveABody() &&
3944 "Must have a declaration without a body.");
3945
3946 const ASTContext &Context = getASTContext();
3947
3948 if (Context.getLangOpts().MSVCCompat) {
3949 const FunctionDecl *Definition;
3950 if (hasBody(Definition) && Definition->isInlined() &&
3951 redeclForcesDefMSVC(this))
3952 return true;
3953 }
3954
3955 if (Context.getLangOpts().CPlusPlus)
3956 return false;
3957
3958 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
3959 // With GNU inlining, a declaration with 'inline' but not 'extern', forces
3960 // an externally visible definition.
3961 //
3962 // FIXME: What happens if gnu_inline gets added on after the first
3963 // declaration?
3965 return false;
3966
3967 const FunctionDecl *Prev = this;
3968 bool FoundBody = false;
3969 while ((Prev = Prev->getPreviousDecl())) {
3970 FoundBody |= Prev->doesThisDeclarationHaveABody();
3971
3972 if (Prev->doesThisDeclarationHaveABody()) {
3973 // If it's not the case that both 'inline' and 'extern' are
3974 // specified on the definition, then it is always externally visible.
3975 if (!Prev->isInlineSpecified() ||
3976 Prev->getStorageClass() != SC_Extern)
3977 return false;
3978 } else if (Prev->isInlineSpecified() &&
3979 Prev->getStorageClass() != SC_Extern) {
3980 return false;
3981 }
3982 }
3983 return FoundBody;
3984 }
3985
3986 // C99 6.7.4p6:
3987 // [...] If all of the file scope declarations for a function in a
3988 // translation unit include the inline function specifier without extern,
3989 // then the definition in that translation unit is an inline definition.
3991 return false;
3992 const FunctionDecl *Prev = this;
3993 bool FoundBody = false;
3994 while ((Prev = Prev->getPreviousDecl())) {
3995 FoundBody |= Prev->doesThisDeclarationHaveABody();
3996 if (RedeclForcesDefC99(Prev))
3997 return false;
3998 }
3999 return FoundBody;
4000}
4001
4003 const TypeSourceInfo *TSI = getTypeSourceInfo();
4004
4005 if (!TSI)
4006 return FunctionTypeLoc();
4007
4008 TypeLoc TL = TSI->getTypeLoc();
4009 FunctionTypeLoc FTL;
4010
4011 while (!(FTL = TL.getAs<FunctionTypeLoc>())) {
4012 if (const auto PTL = TL.getAs<ParenTypeLoc>())
4013 TL = PTL.getInnerLoc();
4014 else if (const auto ATL = TL.getAs<AttributedTypeLoc>())
4015 TL = ATL.getEquivalentTypeLoc();
4016 else if (const auto MQTL = TL.getAs<MacroQualifiedTypeLoc>())
4017 TL = MQTL.getInnerLoc();
4018 else
4019 break;
4020 }
4021
4022 return FTL;
4023}
4024
4027 if (!FTL)
4028 return SourceRange();
4029
4030 // Skip self-referential return types.
4032 SourceRange RTRange = FTL.getReturnLoc().getSourceRange();
4033 SourceLocation Boundary = getNameInfo().getBeginLoc();
4034 if (RTRange.isInvalid() || Boundary.isInvalid() ||
4035 !SM.isBeforeInTranslationUnit(RTRange.getEnd(), Boundary))
4036 return SourceRange();
4037
4038 return RTRange;
4039}
4040
4042 unsigned NP = getNumParams();
4043 SourceLocation EllipsisLoc = getEllipsisLoc();
4044
4045 if (NP == 0 && EllipsisLoc.isInvalid())
4046 return SourceRange();
4047
4048 SourceLocation Begin =
4049 NP > 0 ? ParamInfo[0]->getSourceRange().getBegin() : EllipsisLoc;
4050 SourceLocation End = EllipsisLoc.isValid()
4051 ? EllipsisLoc
4052 : ParamInfo[NP - 1]->getSourceRange().getEnd();
4053
4054 return SourceRange(Begin, End);
4055}
4056
4061
4062/// For an inline function definition in C, or for a gnu_inline function
4063/// in C++, determine whether the definition will be externally visible.
4064///
4065/// Inline function definitions are always available for inlining optimizations.
4066/// However, depending on the language dialect, declaration specifiers, and
4067/// attributes, the definition of an inline function may or may not be
4068/// "externally" visible to other translation units in the program.
4069///
4070/// In C99, inline definitions are not externally visible by default. However,
4071/// if even one of the global-scope declarations is marked "extern inline", the
4072/// inline definition becomes externally visible (C99 6.7.4p6).
4073///
4074/// In GNU89 mode, or if the gnu_inline attribute is attached to the function
4075/// definition, we use the GNU semantics for inline, which are nearly the
4076/// opposite of C99 semantics. In particular, "inline" by itself will create
4077/// an externally visible symbol, but "extern inline" will not create an
4078/// externally visible symbol.
4081 hasAttr<AliasAttr>()) &&
4082 "Must be a function definition");
4083 assert(isInlined() && "Function must be inline");
4084 ASTContext &Context = getASTContext();
4085
4086 if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) {
4087 // Note: If you change the logic here, please change
4088 // doesDeclarationForceExternallyVisibleDefinition as well.
4089 //
4090 // If it's not the case that both 'inline' and 'extern' are
4091 // specified on the definition, then this inline definition is
4092 // externally visible.
4093 if (Context.getLangOpts().CPlusPlus)
4094 return false;
4096 return true;
4097
4098 // If any declaration is 'inline' but not 'extern', then this definition
4099 // is externally visible.
4100 for (auto *Redecl : redecls()) {
4101 if (Redecl->isInlineSpecified() &&
4102 Redecl->getStorageClass() != SC_Extern)
4103 return true;
4104 }
4105
4106 return false;
4107 }
4108
4109 // The rest of this function is C-only.
4110 assert(!Context.getLangOpts().CPlusPlus &&
4111 "should not use C inline rules in C++");
4112
4113 // C99 6.7.4p6:
4114 // [...] If all of the file scope declarations for a function in a
4115 // translation unit include the inline function specifier without extern,
4116 // then the definition in that translation unit is an inline definition.
4117 for (auto *Redecl : redecls()) {
4118 if (RedeclForcesDefC99(Redecl))
4119 return true;
4120 }
4121
4122 // C99 6.7.4p6:
4123 // An inline definition does not provide an external definition for the
4124 // function, and does not forbid an external definition in another
4125 // translation unit.
4126 return false;
4127}
4128
4129/// getOverloadedOperator - Which C++ overloaded operator this
4130/// function represents, if any.
4136
4137/// getLiteralIdentifier - The literal suffix identifier this function
4138/// represents, if any.
4142 return nullptr;
4143}
4144
4146 if (TemplateOrSpecialization.isNull())
4147 return TK_NonTemplate;
4148 if (const auto *ND = dyn_cast<NamedDecl *>(TemplateOrSpecialization)) {
4149 if (isa<FunctionDecl>(ND))
4151 assert(isa<FunctionTemplateDecl>(ND) &&
4152 "No other valid types in NamedDecl");
4153 return TK_FunctionTemplate;
4154 }
4155 if (isa<MemberSpecializationInfo *>(TemplateOrSpecialization))
4157 if (isa<FunctionTemplateSpecializationInfo *>(TemplateOrSpecialization))
4160 TemplateOrSpecialization))
4162
4163 llvm_unreachable("Did we miss a TemplateOrSpecialization type?");
4164}
4165
4168 return cast<FunctionDecl>(Info->getInstantiatedFrom());
4169
4170 return nullptr;
4171}
4172
4174 if (auto *MSI = dyn_cast_if_present<MemberSpecializationInfo *>(
4175 TemplateOrSpecialization))
4176 return MSI;
4177 if (auto *FTSI = dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4178 TemplateOrSpecialization))
4179 return FTSI->getMemberSpecializationInfo();
4180 return nullptr;
4181}
4182
4183void
4184FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C,
4185 FunctionDecl *FD,
4187 assert(TemplateOrSpecialization.isNull() &&
4188 "Member function is already a specialization");
4190 = new (C) MemberSpecializationInfo(FD, TSK);
4191 TemplateOrSpecialization = Info;
4192}
4193
4195 return dyn_cast_if_present<FunctionTemplateDecl>(
4196 dyn_cast_if_present<NamedDecl *>(TemplateOrSpecialization));
4197}
4198
4201 assert(TemplateOrSpecialization.isNull() &&
4202 "Member function is already a specialization");
4203 TemplateOrSpecialization = Template;
4204}
4205
4207 return isa<FunctionTemplateSpecializationInfo *>(TemplateOrSpecialization) ||
4209 TemplateOrSpecialization);
4210}
4211
4213 assert(TemplateOrSpecialization.isNull() &&
4214 "Function is already a specialization");
4215 TemplateOrSpecialization = FD;
4216}
4217
4219 return dyn_cast_if_present<FunctionDecl>(
4220 TemplateOrSpecialization.dyn_cast<NamedDecl *>());
4221}
4222
4224 // If the function is invalid, it can't be implicitly instantiated.
4225 if (isInvalidDecl())
4226 return false;
4227
4229 case TSK_Undeclared:
4232 return false;
4233
4235 return true;
4236
4238 // Handled below.
4239 break;
4240 }
4241
4242 // Find the actual template from which we will instantiate.
4243 const FunctionDecl *PatternDecl = getTemplateInstantiationPattern();
4244 bool HasPattern = false;
4245 if (PatternDecl)
4246 HasPattern = PatternDecl->hasBody(PatternDecl);
4247
4248 // C++0x [temp.explicit]p9:
4249 // Except for inline functions, other explicit instantiation declarations
4250 // have the effect of suppressing the implicit instantiation of the entity
4251 // to which they refer.
4252 if (!HasPattern || !PatternDecl)
4253 return true;
4254
4255 return PatternDecl->isInlined();
4256}
4257
4259 // FIXME: Remove this, it's not clear what it means. (Which template
4260 // specialization kind?)
4262}
4263
4266 // If this is a generic lambda call operator specialization, its
4267 // instantiation pattern is always its primary template's pattern
4268 // even if its primary template was instantiated from another
4269 // member template (which happens with nested generic lambdas).
4270 // Since a lambda's call operator's body is transformed eagerly,
4271 // we don't have to go hunting for a prototype definition template
4272 // (i.e. instantiated-from-member-template) to use as an instantiation
4273 // pattern.
4274
4276 dyn_cast<CXXMethodDecl>(this))) {
4277 assert(getPrimaryTemplate() && "not a generic lambda call operator?");
4278 return getDefinitionOrSelf(getPrimaryTemplate()->getTemplatedDecl());
4279 }
4280
4281 // Check for a declaration of this function that was instantiated from a
4282 // friend definition.
4283 const FunctionDecl *FD = nullptr;
4284 if (!isDefined(FD, /*CheckForPendingFriendDefinition=*/true))
4285 FD = this;
4286
4288 if (ForDefinition &&
4290 return nullptr;
4292 }
4293
4294 if (ForDefinition &&
4296 return nullptr;
4297
4298 if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
4299 // If we hit a point where the user provided a specialization of this
4300 // template, we're done looking.
4301 while (!ForDefinition || !Primary->isMemberSpecialization()) {
4302 auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate();
4303 if (!NewPrimary)
4304 break;
4305 Primary = NewPrimary;
4306 }
4307
4308 return getDefinitionOrSelf(Primary->getTemplatedDecl());
4309 }
4310
4311 return nullptr;
4312}
4313
4316 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4317 TemplateOrSpecialization)) {
4318 return Info->getTemplate();
4319 }
4320 return nullptr;
4321}
4322
4325 return dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4326 TemplateOrSpecialization);
4327}
4328
4332 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4333 TemplateOrSpecialization)) {
4334 return Info->TemplateArguments;
4335 }
4336 return nullptr;
4337}
4338
4342 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4343 TemplateOrSpecialization)) {
4344 return Info->TemplateArgumentsAsWritten;
4345 }
4347 dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
4348 TemplateOrSpecialization)) {
4349 return Info->TemplateArgumentsAsWritten;
4350 }
4351 return nullptr;
4352}
4353
4354void FunctionDecl::setFunctionTemplateSpecialization(
4356 TemplateArgumentList *TemplateArgs, void *InsertPos,
4358 const TemplateArgumentListInfo *TemplateArgsAsWritten,
4359 SourceLocation PointOfInstantiation) {
4360 assert((TemplateOrSpecialization.isNull() ||
4361 isa<MemberSpecializationInfo *>(TemplateOrSpecialization)) &&
4362 "Member function is already a specialization");
4363 assert(TSK != TSK_Undeclared &&
4364 "Must specify the type of function template specialization");
4365 assert((TemplateOrSpecialization.isNull() ||
4368 "Member specialization must be an explicit specialization");
4371 C, this, Template, TSK, TemplateArgs, TemplateArgsAsWritten,
4372 PointOfInstantiation,
4373 dyn_cast_if_present<MemberSpecializationInfo *>(
4374 TemplateOrSpecialization));
4375 TemplateOrSpecialization = Info;
4376 Template->addSpecialization(Info, InsertPos);
4377}
4378
4380 ASTContext &Context, const UnresolvedSetImpl &Templates,
4381 const TemplateArgumentListInfo *TemplateArgs) {
4382 assert(TemplateOrSpecialization.isNull());
4385 TemplateArgs);
4386 TemplateOrSpecialization = Info;
4387}
4388
4391 return dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
4392 TemplateOrSpecialization);
4393}
4394
4397 ASTContext &Context, const UnresolvedSetImpl &Candidates,
4398 const TemplateArgumentListInfo *TArgs) {
4399 const auto *TArgsWritten =
4400 TArgs ? ASTTemplateArgumentListInfo::Create(Context, *TArgs) : nullptr;
4401 return new (Context.Allocate(
4402 totalSizeToAlloc<FunctionTemplateDecl *>(Candidates.size())))
4403 DependentFunctionTemplateSpecializationInfo(Candidates, TArgsWritten);
4404}
4405
4406DependentFunctionTemplateSpecializationInfo::
4407 DependentFunctionTemplateSpecializationInfo(
4408 const UnresolvedSetImpl &Candidates,
4409 const ASTTemplateArgumentListInfo *TemplateArgsWritten)
4410 : NumCandidates(Candidates.size()),
4411 TemplateArgumentsAsWritten(TemplateArgsWritten) {
4412 std::transform(Candidates.begin(), Candidates.end(), getTrailingObjects(),
4413 [](NamedDecl *ND) {
4415 });
4416}
4417
4419 // For a function template specialization, query the specialization
4420 // information object.
4422 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4423 TemplateOrSpecialization))
4424 return FTSInfo->getTemplateSpecializationKind();
4425
4426 if (MemberSpecializationInfo *MSInfo =
4427 dyn_cast_if_present<MemberSpecializationInfo *>(
4428 TemplateOrSpecialization))
4429 return MSInfo->getTemplateSpecializationKind();
4430
4431 // A dependent function template specialization is an explicit specialization,
4432 // except when it's a friend declaration.
4434 TemplateOrSpecialization) &&
4437
4438 return TSK_Undeclared;
4439}
4440
4443 // This is the same as getTemplateSpecializationKind(), except that for a
4444 // function that is both a function template specialization and a member
4445 // specialization, we prefer the member specialization information. Eg:
4446 //
4447 // template<typename T> struct A {
4448 // template<typename U> void f() {}
4449 // template<> void f<int>() {}
4450 // };
4451 //
4452 // Within the templated CXXRecordDecl, A<T>::f<int> is a dependent function
4453 // template specialization; both getTemplateSpecializationKind() and
4454 // getTemplateSpecializationKindForInstantiation() will return
4455 // TSK_ExplicitSpecialization.
4456 //
4457 // For A<int>::f<int>():
4458 // * getTemplateSpecializationKind() will return TSK_ExplicitSpecialization
4459 // * getTemplateSpecializationKindForInstantiation() will return
4460 // TSK_ImplicitInstantiation
4461 //
4462 // This reflects the facts that A<int>::f<int> is an explicit specialization
4463 // of A<int>::f, and that A<int>::f<int> should be implicitly instantiated
4464 // from A::f<int> if a definition is needed.
4466 dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
4467 TemplateOrSpecialization)) {
4468 if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo())
4469 return MSInfo->getTemplateSpecializationKind();
4470 return FTSInfo->getTemplateSpecializationKind();
4471 }
4472
4473 if (MemberSpecializationInfo *MSInfo =
4474 dyn_cast_if_present<MemberSpecializationInfo *>(
4475 TemplateOrSpecialization))
4476 return MSInfo->getTemplateSpecializationKind();
4477
4479 TemplateOrSpecialization) &&
4482
4483 return TSK_Undeclared;
4484}
4485
4486void
4488 SourceLocation PointOfInstantiation) {
4490 dyn_cast<FunctionTemplateSpecializationInfo *>(
4491 TemplateOrSpecialization)) {
4492 FTSInfo->setTemplateSpecializationKind(TSK);
4493 if (TSK != TSK_ExplicitSpecialization &&
4494 PointOfInstantiation.isValid() &&
4495 FTSInfo->getPointOfInstantiation().isInvalid()) {
4496 FTSInfo->setPointOfInstantiation(PointOfInstantiation);
4498 L->InstantiationRequested(this);
4499 }
4500 } else if (MemberSpecializationInfo *MSInfo =
4501 dyn_cast<MemberSpecializationInfo *>(
4502 TemplateOrSpecialization)) {
4503 MSInfo->setTemplateSpecializationKind(TSK);
4504 if (TSK != TSK_ExplicitSpecialization &&
4505 PointOfInstantiation.isValid() &&
4506 MSInfo->getPointOfInstantiation().isInvalid()) {
4507 MSInfo->setPointOfInstantiation(PointOfInstantiation);
4509 L->InstantiationRequested(this);
4510 }
4511 } else
4512 llvm_unreachable("Function cannot have a template specialization kind");
4513}
4514
4517 = TemplateOrSpecialization.dyn_cast<
4519 return FTSInfo->getPointOfInstantiation();
4520 if (MemberSpecializationInfo *MSInfo =
4521 TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
4522 return MSInfo->getPointOfInstantiation();
4523
4524 return SourceLocation();
4525}
4526
4528 if (Decl::isOutOfLine())
4529 return true;
4530
4531 // If this function was instantiated from a member function of a
4532 // class template, check whether that member function was defined out-of-line.
4534 const FunctionDecl *Definition;
4535 if (FD->hasBody(Definition))
4536 return Definition->isOutOfLine();
4537 }
4538
4539 // If this function was instantiated from a function template,
4540 // check whether that function template was defined out-of-line.
4541 if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) {
4542 const FunctionDecl *Definition;
4543 if (FunTmpl->getTemplatedDecl()->hasBody(Definition))
4544 return Definition->isOutOfLine();
4545 }
4546
4547 return false;
4548}
4549
4551 return SourceRange(getOuterLocStart(), EndRangeLoc);
4552}
4553
4555 IdentifierInfo *FnInfo = getIdentifier();
4556
4557 if (!FnInfo)
4558 return 0;
4559
4560 // Builtin handling.
4561 switch (getBuiltinID()) {
4562 case Builtin::BI__builtin_memset:
4563 case Builtin::BI__builtin___memset_chk:
4564 case Builtin::BImemset:
4565 return Builtin::BImemset;
4566
4567 case Builtin::BI__builtin_memcpy:
4568 case Builtin::BI__builtin___memcpy_chk:
4569 case Builtin::BImemcpy:
4570 return Builtin::BImemcpy;
4571
4572 case Builtin::BI__builtin_mempcpy:
4573 case Builtin::BI__builtin___mempcpy_chk:
4574 case Builtin::BImempcpy:
4575 return Builtin::BImempcpy;
4576
4577 case Builtin::BI__builtin_trivially_relocate:
4578 case Builtin::BI__builtin_memmove:
4579 case Builtin::BI__builtin___memmove_chk:
4580 case Builtin::BImemmove:
4581 return Builtin::BImemmove;
4582
4583 case Builtin::BIstrlcpy:
4584 case Builtin::BI__builtin___strlcpy_chk:
4585 return Builtin::BIstrlcpy;
4586
4587 case Builtin::BIstrlcat:
4588 case Builtin::BI__builtin___strlcat_chk:
4589 return Builtin::BIstrlcat;
4590
4591 case Builtin::BI__builtin_memcmp:
4592 case Builtin::BImemcmp:
4593 return Builtin::BImemcmp;
4594
4595 case Builtin::BI__builtin_bcmp:
4596 case Builtin::BIbcmp:
4597 return Builtin::BIbcmp;
4598
4599 case Builtin::BI__builtin_strncpy:
4600 case Builtin::BI__builtin___strncpy_chk:
4601 case Builtin::BIstrncpy:
4602 return Builtin::BIstrncpy;
4603
4604 case Builtin::BI__builtin_strncmp:
4605 case Builtin::BIstrncmp:
4606 return Builtin::BIstrncmp;
4607
4608 case Builtin::BI__builtin_strncasecmp:
4609 case Builtin::BIstrncasecmp:
4610 return Builtin::BIstrncasecmp;
4611
4612 case Builtin::BI__builtin_strncat:
4613 case Builtin::BI__builtin___strncat_chk:
4614 case Builtin::BIstrncat:
4615 return Builtin::BIstrncat;
4616
4617 case Builtin::BI__builtin_strndup:
4618 case Builtin::BIstrndup:
4619 return Builtin::BIstrndup;
4620
4621 case Builtin::BI__builtin_strlen:
4622 case Builtin::BIstrlen:
4623 return Builtin::BIstrlen;
4624
4625 case Builtin::BI__builtin_bzero:
4626 case Builtin::BIbzero:
4627 return Builtin::BIbzero;
4628
4629 case Builtin::BI__builtin_bcopy:
4630 case Builtin::BIbcopy:
4631 return Builtin::BIbcopy;
4632
4633 case Builtin::BIfree:
4634 return Builtin::BIfree;
4635
4636 default:
4637 if (isExternC()) {
4638 if (FnInfo->isStr("memset"))
4639 return Builtin::BImemset;
4640 if (FnInfo->isStr("memcpy"))
4641 return Builtin::BImemcpy;
4642 if (FnInfo->isStr("mempcpy"))
4643 return Builtin::BImempcpy;
4644 if (FnInfo->isStr("memmove"))
4645 return Builtin::BImemmove;
4646 if (FnInfo->isStr("memcmp"))
4647 return Builtin::BImemcmp;
4648 if (FnInfo->isStr("bcmp"))
4649 return Builtin::BIbcmp;
4650 if (FnInfo->isStr("strncpy"))
4651 return Builtin::BIstrncpy;
4652 if (FnInfo->isStr("strncmp"))
4653 return Builtin::BIstrncmp;
4654 if (FnInfo->isStr("strncasecmp"))
4655 return Builtin::BIstrncasecmp;
4656 if (FnInfo->isStr("strncat"))
4657 return Builtin::BIstrncat;
4658 if (FnInfo->isStr("strndup"))
4659 return Builtin::BIstrndup;
4660 if (FnInfo->isStr("strlen"))
4661 return Builtin::BIstrlen;
4662 if (FnInfo->isStr("bzero"))
4663 return Builtin::BIbzero;
4664 if (FnInfo->isStr("bcopy"))
4665 return Builtin::BIbcopy;
4666 } else if (isInStdNamespace()) {
4667 if (FnInfo->isStr("free"))
4668 return Builtin::BIfree;
4669 }
4670 break;
4671 }
4672 return 0;
4673}
4674
4676 assert(hasODRHash());
4677 return ODRHash;
4678}
4679
4681 if (hasODRHash())
4682 return ODRHash;
4683
4684 if (auto *FT = getInstantiatedFromMemberFunction()) {
4685 setHasODRHash(true);
4686 ODRHash = FT->getODRHash();
4687 return ODRHash;
4688 }
4689
4690 class ODRHash Hash;
4691 Hash.AddFunctionDecl(this);
4692 setHasODRHash(true);
4693 ODRHash = Hash.CalculateHash();
4694 return ODRHash;
4695}
4696
4697//===----------------------------------------------------------------------===//
4698// FieldDecl Implementation
4699//===----------------------------------------------------------------------===//
4700
4702 SourceLocation StartLoc, SourceLocation IdLoc,
4703 const IdentifierInfo *Id, QualType T,
4704 TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
4705 InClassInitStyle InitStyle) {
4706 return new (C, DC) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo,
4707 BW, Mutable, InitStyle);
4708}
4709
4711 return new (C, ID) FieldDecl(Field, nullptr, SourceLocation(),
4712 SourceLocation(), nullptr, QualType(), nullptr,
4713 nullptr, false, ICIS_NoInit);
4714}
4715
4717 if (!isImplicit() || getDeclName())
4718 return false;
4719
4720 if (const auto *Record = getType()->getAsCanonical<RecordType>())
4721 return Record->getDecl()->isAnonymousStructOrUnion();
4722
4723 return false;
4724}
4725
4727 if (!hasInClassInitializer())
4728 return nullptr;
4729
4730 LazyDeclStmtPtr InitPtr = BitField ? InitAndBitWidth->Init : Init;
4731 return cast_if_present<Expr>(
4732 InitPtr.isOffset() ? InitPtr.get(getASTContext().getExternalSource())
4733 : InitPtr.get(nullptr));
4734}
4735
4737 setLazyInClassInitializer(LazyDeclStmtPtr(NewInit));
4738}
4739
4740void FieldDecl::setLazyInClassInitializer(LazyDeclStmtPtr NewInit) {
4742 if (BitField)
4743 InitAndBitWidth->Init = NewInit;
4744 else
4745 Init = NewInit;
4746}
4747
4749 const auto *CE = dyn_cast_if_present<ConstantExpr>(getBitWidth());
4750 return CE && CE->getAPValueResult().isInt();
4751}
4752
4754 assert(isBitField() && "not a bitfield");
4757 ->getAPValueResult()
4758 .getInt()
4759 .getZExtValue();
4760}
4761
4764 getBitWidthValue() == 0;
4765}
4766
4767bool FieldDecl::isZeroSize(const ASTContext &Ctx) const {
4769 return true;
4770
4771 // C++2a [intro.object]p7:
4772 // An object has nonzero size if it
4773 // -- is not a potentially-overlapping subobject, or
4775 return false;
4776
4777 // -- is not of class type, or
4778 const auto *RT = getType()->getAsCanonical<RecordType>();
4779 if (!RT)
4780 return false;
4781 const RecordDecl *RD = RT->getDecl()->getDefinition();
4782 if (!RD) {
4783 assert(isInvalidDecl() && "valid field has incomplete type");
4784 return false;
4785 }
4786
4787 // -- [has] virtual member functions or virtual base classes, or
4788 // -- has subobjects of nonzero size or bit-fields of nonzero length
4789 const auto *CXXRD = cast<CXXRecordDecl>(RD);
4790 if (!CXXRD->isEmpty())
4791 return false;
4792
4793 // Otherwise, [...] the circumstances under which the object has zero size
4794 // are implementation-defined.
4795 if (!Ctx.getTargetInfo().getCXXABI().isMicrosoft())
4796 return true;
4797
4798 // MS ABI: has nonzero size if it is a class type with class type fields,
4799 // whether or not they have nonzero size
4800 return !llvm::any_of(CXXRD->fields(), [](const FieldDecl *Field) {
4801 return Field->getType()->isRecordType();
4802 });
4803}
4804
4808
4809void FieldDecl::setCachedFieldIndex() const {
4810 assert(this == getCanonicalDecl() &&
4811 "should be called on the canonical decl");
4812
4813 unsigned Index = 0;
4814 const RecordDecl *RD = getParent()->getDefinition();
4815 assert(RD && "requested index for field of struct with no definition");
4816
4817 for (auto *Field : RD->fields()) {
4818 Field->getCanonicalDecl()->CachedFieldIndex = Index + 1;
4819 assert(Field->getCanonicalDecl()->CachedFieldIndex == Index + 1 &&
4820 "overflow in field numbering");
4821 ++Index;
4822 }
4823
4824 assert(CachedFieldIndex && "failed to find field in parent");
4825}
4826
4828 const Expr *FinalExpr = getInClassInitializer();
4829 if (!FinalExpr)
4830 FinalExpr = getBitWidth();
4831 if (FinalExpr)
4832 return SourceRange(getInnerLocStart(), FinalExpr->getEndLoc());
4834}
4835
4837 assert((getParent()->isLambda() || getParent()->isCapturedRecord()) &&
4838 "capturing type in non-lambda or captured record.");
4839 assert(StorageKind == ISK_NoInit && !BitField &&
4840 "bit-field or field with default member initializer cannot capture "
4841 "VLA type");
4842 StorageKind = ISK_CapturedVLAType;
4843 CapturedVLAType = VLAType;
4844}
4845
4846void FieldDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
4847 // Print unnamed members using name of their type.
4849 this->getType().print(OS, Policy);
4850 return;
4851 }
4852 // Otherwise, do the normal printing.
4853 DeclaratorDecl::printName(OS, Policy);
4854}
4855
4857 const auto *CAT = getType()->getAs<CountAttributedType>();
4858 if (!CAT)
4859 return nullptr;
4860
4861 const auto *CountDRE = cast<DeclRefExpr>(CAT->getCountExpr());
4862 const auto *CountDecl = CountDRE->getDecl();
4863 if (const auto *IFD = dyn_cast<IndirectFieldDecl>(CountDecl))
4864 CountDecl = IFD->getAnonField();
4865
4866 return dyn_cast<FieldDecl>(CountDecl);
4867}
4868
4869//===----------------------------------------------------------------------===//
4870// TagDecl Implementation
4871//===----------------------------------------------------------------------===//
4872
4874 SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl,
4875 SourceLocation StartL)
4876 : TypeDecl(DK, DC, L, Id, StartL), DeclContext(DK), redeclarable_base(C),
4877 TypedefNameDeclOrQualifier((TypedefNameDecl *)nullptr) {
4878 assert((DK != Enum || TK == TagTypeKind::Enum) &&
4879 "EnumDecl not matched with TagTypeKind::Enum");
4880 setPreviousDecl(PrevDecl);
4881 setTagKind(TK);
4882 setCompleteDefinition(false);
4883 setBeingDefined(false);
4885 setFreeStanding(false);
4887 TagDeclBits.IsThisDeclarationADemotedDefinition = false;
4888}
4889
4893
4895 SourceLocation RBraceLoc = BraceRange.getEnd();
4896 SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
4897 return SourceRange(getOuterLocStart(), E);
4898}
4899
4901
4903 TypedefNameDeclOrQualifier = TDD;
4904 assert(isLinkageValid());
4905}
4906
4908 setBeingDefined(true);
4909
4910 if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
4911 struct CXXRecordDecl::DefinitionData *Data =
4912 new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
4913 for (auto *I : redecls())
4914 cast<CXXRecordDecl>(I)->DefinitionData = Data;
4915 }
4916}
4917
4919 assert((!isa<CXXRecordDecl>(this) ||
4921 "definition completed but not started");
4922
4924 setBeingDefined(false);
4925
4927 L->CompletedTagDefinition(this);
4928}
4929
4932 return const_cast<TagDecl *>(this);
4933
4934 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(this))
4935 return CXXRD->getDefinition();
4936
4937 for (TagDecl *R :
4939 if (R->isCompleteDefinition() || R->isBeingDefined())
4940 return R;
4941 return nullptr;
4942}
4943
4945 if (QualifierLoc) {
4946 // Make sure the extended qualifier info is allocated.
4947 if (!hasExtInfo())
4948 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
4949 // Set qualifier info.
4950 getExtInfo()->QualifierLoc = QualifierLoc;
4951 } else {
4952 // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
4953 if (hasExtInfo()) {
4954 if (getExtInfo()->NumTemplParamLists == 0) {
4955 getASTContext().Deallocate(getExtInfo());
4956 TypedefNameDeclOrQualifier = (TypedefNameDecl *)nullptr;
4957 }
4958 else
4959 getExtInfo()->QualifierLoc = QualifierLoc;
4960 }
4961 }
4962}
4963
4965 llvm::raw_ostream &OS, const PrintingPolicy &Policy) const {
4966 PresumedLoc PLoc =
4968 if (!PLoc.isValid())
4969 return;
4970
4971 OS << " at ";
4972 StringRef File = PLoc.getFilename();
4973 llvm::SmallString<1024> WrittenFile(File);
4974 if (auto *Callbacks = Policy.Callbacks)
4975 WrittenFile = Callbacks->remapPath(File);
4976 // Fix inconsistent path separator created by
4977 // clang::DirectoryLookup::LookupFile when the file path is relative
4978 // path.
4979 llvm::sys::path::Style Style =
4980 llvm::sys::path::is_absolute(WrittenFile)
4981 ? llvm::sys::path::Style::native
4982 : (Policy.MSVCFormatting ? llvm::sys::path::Style::windows_backslash
4983 : llvm::sys::path::Style::posix);
4984 llvm::sys::path::native(WrittenFile, Style);
4985 OS << WrittenFile << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
4986}
4987
4988void TagDecl::printAnonymousTagDecl(llvm::raw_ostream &OS,
4989 const PrintingPolicy &Policy) const {
4991 assert(Typedef->getIdentifier() && "Typedef without identifier?");
4992 OS << Typedef->getIdentifier()->getName();
4993 return;
4994 }
4995
4996 bool SuppressTagKeywordInName = Policy.SuppressTagKeywordInAnonNames;
4997
4998 // Emit leading keyword. Since we printed a leading keyword make sure we
4999 // don't print the tag as part of the name too.
5000 if (!Policy.SuppressTagKeyword) {
5001 OS << getKindName() << ' ';
5002 SuppressTagKeywordInName = true;
5003 }
5004
5005 // Make an unambiguous representation for anonymous types, e.g.
5006 // (anonymous enum at /usr/include/string.h:120:9)
5007 OS << (Policy.MSVCFormatting ? '`' : '(');
5008
5009 if (isa<CXXRecordDecl>(this) && cast<CXXRecordDecl>(this)->isLambda()) {
5010 OS << "lambda";
5011 SuppressTagKeywordInName = true;
5012 } else if ((isa<RecordDecl>(this) &&
5013 cast<RecordDecl>(this)->isAnonymousStructOrUnion())) {
5014 OS << "anonymous";
5015 } else {
5016 OS << "unnamed";
5017 }
5018
5019 if (!SuppressTagKeywordInName)
5020 OS << ' ' << getKindName();
5021
5022 if (Policy.AnonymousTagNameStyle ==
5025
5026 OS << (Policy.MSVCFormatting ? '\'' : ')');
5027}
5028
5029void TagDecl::printName(raw_ostream &OS, const PrintingPolicy &Policy) const {
5031 // If the name is supposed to have an identifier but does not have one, then
5032 // the tag is anonymous and we should print it differently.
5033 if (Name.isIdentifier() && !Name.getAsIdentifierInfo()) {
5034 printAnonymousTagDecl(OS, Policy);
5035
5036 return;
5037 }
5038
5039 // Otherwise, do the normal printing.
5040 Name.print(OS, Policy);
5041}
5042
5045 assert(!TPLists.empty());
5046 // Make sure the extended decl info is allocated.
5047 if (!hasExtInfo())
5048 // Allocate external info struct.
5049 TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
5050 // Set the template parameter lists info.
5051 getExtInfo()->setTemplateParameterListsInfo(Context, TPLists);
5052}
5053
5054//===----------------------------------------------------------------------===//
5055// EnumDecl Implementation
5056//===----------------------------------------------------------------------===//
5057
5058EnumDecl::EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
5059 SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl,
5060 bool Scoped, bool ScopedUsingClassTag, bool Fixed)
5061 : TagDecl(Enum, TagTypeKind::Enum, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
5062 assert(Scoped || !ScopedUsingClassTag);
5063 IntegerType = nullptr;
5064 setNumPositiveBits(0);
5065 setNumNegativeBits(0);
5066 setScoped(Scoped);
5067 setScopedUsingClassTag(ScopedUsingClassTag);
5068 setFixed(Fixed);
5069 setHasODRHash(false);
5070 ODRHash = 0;
5071}
5072
5073void EnumDecl::anchor() {}
5074
5076 SourceLocation StartLoc, SourceLocation IdLoc,
5077 IdentifierInfo *Id,
5078 EnumDecl *PrevDecl, bool IsScoped,
5079 bool IsScopedUsingClassTag, bool IsFixed) {
5080 return new (C, DC) EnumDecl(C, DC, StartLoc, IdLoc, Id, PrevDecl, IsScoped,
5081 IsScopedUsingClassTag, IsFixed);
5082}
5083
5085 return new (C, ID) EnumDecl(C, nullptr, SourceLocation(), SourceLocation(),
5086 nullptr, nullptr, false, false, false);
5087}
5088
5090 if (const TypeSourceInfo *TI = getIntegerTypeSourceInfo())
5091 return TI->getTypeLoc().getSourceRange();
5092 return SourceRange();
5093}
5094
5096 QualType NewPromotionType,
5097 unsigned NumPositiveBits,
5098 unsigned NumNegativeBits) {
5099 assert(!isCompleteDefinition() && "Cannot redefine enums!");
5100 if (!IntegerType)
5101 IntegerType = NewType.getTypePtr();
5102 PromotionType = NewPromotionType;
5103 setNumPositiveBits(NumPositiveBits);
5104 setNumNegativeBits(NumNegativeBits);
5106}
5107
5109 if (const auto *A = getAttr<EnumExtensibilityAttr>())
5110 return A->getExtensibility() == EnumExtensibilityAttr::Closed;
5111 return true;
5112}
5113
5115 return isClosed() && hasAttr<FlagEnumAttr>();
5116}
5117
5119 return isClosed() && !hasAttr<FlagEnumAttr>();
5120}
5121
5124 return MSI->getTemplateSpecializationKind();
5125
5126 return TSK_Undeclared;
5127}
5128
5130 SourceLocation PointOfInstantiation) {
5132 assert(MSI && "Not an instantiated member enumeration?");
5134 if (TSK != TSK_ExplicitSpecialization &&
5135 PointOfInstantiation.isValid() &&
5137 MSI->setPointOfInstantiation(PointOfInstantiation);
5138}
5139
5142 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
5143 EnumDecl *ED = getInstantiatedFromMemberEnum();
5144 while (auto *NewED = ED->getInstantiatedFromMemberEnum())
5145 ED = NewED;
5146 return ::getDefinitionOrSelf(ED);
5147 }
5148 }
5149
5151 "couldn't find pattern for enum instantiation");
5152 return nullptr;
5153}
5154
5156 if (SpecializationInfo)
5157 return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom());
5158
5159 return nullptr;
5160}
5161
5162void EnumDecl::setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED,
5164 assert(!SpecializationInfo && "Member enum is already a specialization");
5165 SpecializationInfo = new (C) MemberSpecializationInfo(ED, TSK);
5166}
5167
5169 if (hasODRHash())
5170 return ODRHash;
5171
5172 class ODRHash Hash;
5173 Hash.AddEnumDecl(this);
5174 setHasODRHash(true);
5175 ODRHash = Hash.CalculateHash();
5176 return ODRHash;
5177}
5178
5180 auto Res = TagDecl::getSourceRange();
5181 // Set end-point to enum-base, e.g. enum foo : ^bar
5182 if (auto *TSI = getIntegerTypeSourceInfo()) {
5183 // TagDecl doesn't know about the enum base.
5184 if (!getBraceRange().getEnd().isValid())
5185 Res.setEnd(TSI->getTypeLoc().getEndLoc());
5186 }
5187 return Res;
5188}
5189
5190void EnumDecl::getValueRange(llvm::APInt &Max, llvm::APInt &Min) const {
5191 unsigned Bitwidth = getASTContext().getIntWidth(getIntegerType());
5192 unsigned NumNegativeBits = getNumNegativeBits();
5193 unsigned NumPositiveBits = getNumPositiveBits();
5194
5195 if (NumNegativeBits) {
5196 unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
5197 Max = llvm::APInt(Bitwidth, 1) << (NumBits - 1);
5198 Min = -Max;
5199 } else {
5200 Max = llvm::APInt(Bitwidth, 1) << NumPositiveBits;
5201 Min = llvm::APInt::getZero(Bitwidth);
5202 }
5203}
5204
5205//===----------------------------------------------------------------------===//
5206// RecordDecl Implementation
5207//===----------------------------------------------------------------------===//
5208
5210 DeclContext *DC, SourceLocation StartLoc,
5211 SourceLocation IdLoc, IdentifierInfo *Id,
5212 RecordDecl *PrevDecl)
5213 : TagDecl(DK, TK, C, DC, IdLoc, Id, PrevDecl, StartLoc) {
5214 assert(classof(static_cast<Decl *>(this)) && "Invalid Kind!");
5217 setHasObjectMember(false);
5218 setHasVolatileMember(false);
5229 setIsRandomized(false);
5230 setODRHash(0);
5231}
5232
5234 SourceLocation StartLoc, SourceLocation IdLoc,
5235 IdentifierInfo *Id, RecordDecl* PrevDecl) {
5236 return new (C, DC)
5237 RecordDecl(Record, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl);
5238}
5239
5241 GlobalDeclID ID) {
5242 return new (C, ID)
5244 SourceLocation(), nullptr, nullptr);
5245}
5246
5248 if (auto RD = dyn_cast<CXXRecordDecl>(this))
5249 return RD->isLambda();
5250 return false;
5251}
5252
5256
5258 addAttr(CapturedRecordAttr::CreateImplicit(getASTContext()));
5259}
5260
5262 if (isUnion())
5263 return true;
5264
5265 if (const RecordDecl *Def = getDefinition()) {
5266 for (const FieldDecl *FD : Def->fields()) {
5267 const RecordType *RT = FD->getType()->getAsCanonical<RecordType>();
5268 if (RT && RT->getDecl()->isOrContainsUnion())
5269 return true;
5270 }
5271 }
5272
5273 return false;
5274}
5275
5278 LoadFieldsFromExternalStorage();
5279 // This is necessary for correctness for C++ with modules.
5280 // FIXME: Come up with a test case that breaks without definition.
5281 if (RecordDecl *D = getDefinition(); D && D != this)
5282 return D->field_begin();
5284}
5285
5289
5290/// completeDefinition - Notes that the definition of this type is now
5291/// complete.
5293 assert(!isCompleteDefinition() && "Cannot redefine record!");
5295
5296 ASTContext &Ctx = getASTContext();
5297
5298 // Layouts are dumped when computed, so if we are dumping for all complete
5299 // types, we need to force usage to get types that wouldn't be used elsewhere.
5300 //
5301 // If the type is dependent, then we can't compute its layout because there
5302 // is no way for us to know the size or alignment of a dependent type. Also
5303 // ignore declarations marked as invalid since 'getASTRecordLayout()' asserts
5304 // on that.
5305 if (Ctx.getLangOpts().DumpRecordLayoutsComplete && !isDependentType() &&
5306 !isInvalidDecl())
5307 (void)Ctx.getASTRecordLayout(this);
5308}
5309
5310/// isMsStruct - Get whether or not this record uses ms_struct layout.
5311/// This which can be turned on with an attribute, pragma, or the
5312/// -mms-bitfields command-line option.
5315 return false;
5317 return true;
5318 auto LayoutCompatibility = C.getLangOpts().getLayoutCompatibility();
5319 if (LayoutCompatibility == LangOptions::LayoutCompatibilityKind::Default)
5320 return C.defaultsToMsStruct();
5321 return LayoutCompatibility == LangOptions::LayoutCompatibilityKind::Microsoft;
5322}
5323
5325 std::tie(FirstDecl, LastDecl) = DeclContext::BuildDeclChain(Decls, false);
5326 LastDecl->NextInContextAndBits.setPointer(nullptr);
5327 setIsRandomized(true);
5328}
5329
5330void RecordDecl::LoadFieldsFromExternalStorage() const {
5332 assert(hasExternalLexicalStorage() && Source && "No external storage?");
5333
5334 // Notify that we have a RecordDecl doing some initialization.
5335 ExternalASTSource::Deserializing TheFields(Source);
5336
5339 Source->FindExternalLexicalDecls(this, [](Decl::Kind K) {
5341 }, Decls);
5342
5343#ifndef NDEBUG
5344 // Check that all decls we got were FieldDecls.
5345 for (unsigned i=0, e=Decls.size(); i != e; ++i)
5346 assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i]));
5347#endif
5348
5349 if (Decls.empty())
5350 return;
5351
5352 auto [ExternalFirst, ExternalLast] =
5353 BuildDeclChain(Decls,
5354 /*FieldsAlreadyLoaded=*/false);
5355 ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
5356 FirstDecl = ExternalFirst;
5357 if (!LastDecl)
5358 LastDecl = ExternalLast;
5359}
5360
5361bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
5362 ASTContext &Context = getASTContext();
5363 const SanitizerMask EnabledAsanMask = Context.getLangOpts().Sanitize.Mask &
5364 (SanitizerKind::Address | SanitizerKind::KernelAddress);
5365 if (!EnabledAsanMask || !Context.getLangOpts().SanitizeAddressFieldPadding)
5366 return false;
5367 const auto &NoSanitizeList = Context.getNoSanitizeList();
5368 const auto *CXXRD = dyn_cast<CXXRecordDecl>(this);
5369 // We may be able to relax some of these requirements.
5370 int ReasonToReject = -1;
5371 if (!CXXRD || CXXRD->isExternCContext())
5372 ReasonToReject = 0; // is not C++.
5373 else if (CXXRD->hasAttr<PackedAttr>())
5374 ReasonToReject = 1; // is packed.
5375 else if (CXXRD->isUnion())
5376 ReasonToReject = 2; // is a union.
5377 else if (CXXRD->isTriviallyCopyable())
5378 ReasonToReject = 3; // is trivially copyable.
5379 else if (CXXRD->hasTrivialDestructor())
5380 ReasonToReject = 4; // has trivial destructor.
5381 else if (CXXRD->isStandardLayout())
5382 ReasonToReject = 5; // is standard layout.
5383 else if (NoSanitizeList.containsLocation(EnabledAsanMask, getLocation(),
5384 "field-padding"))
5385 ReasonToReject = 6; // is in an excluded file.
5387 EnabledAsanMask, getQualifiedNameAsString(), "field-padding"))
5388 ReasonToReject = 7; // The type is excluded.
5389
5390 if (EmitRemark) {
5391 if (ReasonToReject >= 0)
5392 Context.getDiagnostics().Report(
5393 getLocation(),
5394 diag::remark_sanitize_address_insert_extra_padding_rejected)
5395 << getQualifiedNameAsString() << ReasonToReject;
5396 else
5397 Context.getDiagnostics().Report(
5398 getLocation(),
5399 diag::remark_sanitize_address_insert_extra_padding_accepted)
5401 }
5402 return ReasonToReject < 0;
5403}
5404
5406 for (const auto *I : fields()) {
5407 if (I->getIdentifier())
5408 return I;
5409
5410 if (const auto *RD = I->getType()->getAsRecordDecl())
5411 if (const FieldDecl *NamedDataMember = RD->findFirstNamedDataMember())
5412 return NamedDataMember;
5413 }
5414
5415 // We didn't find a named data member.
5416 return nullptr;
5417}
5418
5420 if (hasODRHash())
5421 return RecordDeclBits.ODRHash;
5422
5423 // Only calculate hash on first call of getODRHash per record.
5424 ODRHash Hash;
5425 Hash.AddRecordDecl(this);
5426 // For RecordDecl the ODRHash is stored in the remaining
5427 // bits of RecordDeclBits, adjust the hash to accommodate.
5428 static_assert(sizeof(Hash.CalculateHash()) * CHAR_BIT == 32);
5429 setODRHash(Hash.CalculateHash() >> (32 - NumOdrHashBits));
5430 return RecordDeclBits.ODRHash;
5431}
5432
5433//===----------------------------------------------------------------------===//
5434// BlockDecl Implementation
5435//===----------------------------------------------------------------------===//
5436
5438 : Decl(Block, DC, CaretLoc), DeclContext(Block) {
5439 setIsVariadic(false);
5440 setCapturesCXXThis(false);
5443 setDoesNotEscape(false);
5444 setCanAvoidCopyToHeap(false);
5445}
5446
5448 assert(!ParamInfo && "Already has param info!");
5449
5450 // Zero params -> null pointer.
5451 if (!NewParamInfo.empty()) {
5452 NumParams = NewParamInfo.size();
5453 ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
5454 llvm::copy(NewParamInfo, ParamInfo);
5455 }
5456}
5457
5459 bool CapturesCXXThis) {
5460 this->setCapturesCXXThis(CapturesCXXThis);
5461 this->NumCaptures = Captures.size();
5462
5463 if (Captures.empty()) {
5464 this->Captures = nullptr;
5465 return;
5466 }
5467
5468 this->Captures = Captures.copy(Context).data();
5469}
5470
5471bool BlockDecl::capturesVariable(const VarDecl *variable) const {
5472 for (const auto &I : captures())
5473 // Only auto vars can be captured, so no redeclaration worries.
5474 if (I.getVariable() == variable)
5475 return true;
5476
5477 return false;
5478}
5479
5481 return SourceRange(getLocation(), Body ? Body->getEndLoc() : getLocation());
5482}
5483
5484//===----------------------------------------------------------------------===//
5485// Other Decl Allocation/Deallocation Method Implementations
5486//===----------------------------------------------------------------------===//
5487
5488void TranslationUnitDecl::anchor() {}
5489
5491 return new (C, (DeclContext *)nullptr) TranslationUnitDecl(C);
5492}
5493
5495 AnonymousNamespace = D;
5496
5497 if (ASTMutationListener *Listener = Ctx.getASTMutationListener())
5498 Listener->AddedAnonymousNamespace(this, D);
5499}
5500
5501void PragmaCommentDecl::anchor() {}
5502
5503PragmaCommentDecl *PragmaCommentDecl::Create(const ASTContext &C,
5505 SourceLocation CommentLoc,
5506 PragmaMSCommentKind CommentKind,
5507 StringRef Arg) {
5508 PragmaCommentDecl *PCD =
5509 new (C, DC, additionalSizeToAlloc<char>(Arg.size() + 1))
5510 PragmaCommentDecl(DC, CommentLoc, CommentKind);
5511 llvm::copy(Arg, PCD->getTrailingObjects());
5512 PCD->getTrailingObjects()[Arg.size()] = '\0';
5513 return PCD;
5514}
5515
5517 GlobalDeclID ID,
5518 unsigned ArgSize) {
5519 return new (C, ID, additionalSizeToAlloc<char>(ArgSize + 1))
5520 PragmaCommentDecl(nullptr, SourceLocation(), PCK_Unknown);
5521}
5522
5523void PragmaDetectMismatchDecl::anchor() {}
5524
5527 SourceLocation Loc, StringRef Name,
5528 StringRef Value) {
5529 size_t ValueStart = Name.size() + 1;
5530 PragmaDetectMismatchDecl *PDMD =
5531 new (C, DC, additionalSizeToAlloc<char>(ValueStart + Value.size() + 1))
5532 PragmaDetectMismatchDecl(DC, Loc, ValueStart);
5533 llvm::copy(Name, PDMD->getTrailingObjects());
5534 PDMD->getTrailingObjects()[Name.size()] = '\0';
5535 llvm::copy(Value, PDMD->getTrailingObjects() + ValueStart);
5536 PDMD->getTrailingObjects()[ValueStart + Value.size()] = '\0';
5537 return PDMD;
5538}
5539
5542 unsigned NameValueSize) {
5543 return new (C, ID, additionalSizeToAlloc<char>(NameValueSize + 1))
5544 PragmaDetectMismatchDecl(nullptr, SourceLocation(), 0);
5545}
5546
5547void ExternCContextDecl::anchor() {}
5548
5549ExternCContextDecl *ExternCContextDecl::Create(const ASTContext &C,
5550 TranslationUnitDecl *DC) {
5551 return new (C, DC) ExternCContextDecl(DC);
5552}
5553
5554void LabelDecl::anchor() {}
5555
5557 SourceLocation IdentL, IdentifierInfo *II) {
5558 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, IdentL);
5559}
5560
5562 SourceLocation IdentL, IdentifierInfo *II,
5563 SourceLocation GnuLabelL) {
5564 assert(GnuLabelL != IdentL && "Use this only for GNU local labels");
5565 return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, GnuLabelL);
5566}
5567
5569 return new (C, ID) LabelDecl(nullptr, SourceLocation(), nullptr, nullptr,
5570 SourceLocation());
5571}
5572
5573void LabelDecl::setMSAsmLabel(StringRef Name) {
5574char *Buffer = new (getASTContext(), 1) char[Name.size() + 1];
5575llvm::copy(Name, Buffer);
5576Buffer[Name.size()] = '\0';
5577MSAsmName = Buffer;
5578}
5579
5580void ValueDecl::anchor() {}
5581
5582bool ValueDecl::isWeak() const {
5583 auto *MostRecent = getMostRecentDecl();
5584 return MostRecent->hasAttr<WeakAttr>() ||
5585 MostRecent->hasAttr<WeakRefAttr>() || isWeakImported();
5586}
5587
5589 if (auto *Var = llvm::dyn_cast<VarDecl>(this))
5590 return Var->isInitCapture();
5591 return false;
5592}
5593
5595 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(this))
5596 return NTTP->isParameterPack();
5597
5598 return isa_and_nonnull<PackExpansionType>(getType().getTypePtrOrNull());
5599}
5600
5601void ImplicitParamDecl::anchor() {}
5602
5604 SourceLocation IdLoc,
5606 ImplicitParamKind ParamKind) {
5607 return new (C, DC) ImplicitParamDecl(C, DC, IdLoc, Id, Type, ParamKind);
5608}
5609
5611 ImplicitParamKind ParamKind) {
5612 return new (C, nullptr) ImplicitParamDecl(C, Type, ParamKind);
5613}
5614
5619
5622 const DeclarationNameInfo &NameInfo, QualType T,
5623 TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin,
5625 ConstexprSpecKind ConstexprKind,
5626 const AssociatedConstraint &TrailingRequiresClause) {
5627 FunctionDecl *New = new (C, DC) FunctionDecl(
5628 Function, C, DC, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
5629 isInlineSpecified, ConstexprKind, TrailingRequiresClause);
5630 New->setHasWrittenPrototype(hasWrittenPrototype);
5631 return New;
5632}
5633
5635 return new (C, ID) FunctionDecl(
5637 nullptr, SC_None, false, false, ConstexprSpecKind::Unspecified,
5638 /*TrailingRequiresClause=*/{});
5639}
5640
5642 return hasAttr<CUDAGlobalAttr>() ||
5643 DeviceKernelAttr::isOpenCLSpelling(getAttr<DeviceKernelAttr>());
5644}
5645
5647 return new (C, DC) BlockDecl(DC, L);
5648}
5649
5653
5654OutlinedFunctionDecl::OutlinedFunctionDecl(DeclContext *DC, unsigned NumParams)
5655 : Decl(OutlinedFunction, DC, SourceLocation()),
5656 DeclContext(OutlinedFunction), NumParams(NumParams),
5657 BodyAndNothrow(nullptr, false) {}
5658
5660 DeclContext *DC,
5661 unsigned NumParams) {
5662 return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5663 OutlinedFunctionDecl(DC, NumParams);
5664}
5665
5668 unsigned NumParams) {
5669 return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5670 OutlinedFunctionDecl(nullptr, NumParams);
5671}
5672
5674 return BodyAndNothrow.getPointer();
5675}
5676void OutlinedFunctionDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); }
5677
5678bool OutlinedFunctionDecl::isNothrow() const { return BodyAndNothrow.getInt(); }
5680 BodyAndNothrow.setInt(Nothrow);
5681}
5682
5683CapturedDecl::CapturedDecl(DeclContext *DC, unsigned NumParams)
5684 : Decl(Captured, DC, SourceLocation()), DeclContext(Captured),
5685 NumParams(NumParams), ContextParam(0), BodyAndNothrow(nullptr, false) {}
5686
5688 unsigned NumParams) {
5689 return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5690 CapturedDecl(DC, NumParams);
5691}
5692
5694 unsigned NumParams) {
5695 return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
5696 CapturedDecl(nullptr, NumParams);
5697}
5698
5699Stmt *CapturedDecl::getBody() const { return BodyAndNothrow.getPointer(); }
5700void CapturedDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); }
5701
5702bool CapturedDecl::isNothrow() const { return BodyAndNothrow.getInt(); }
5703void CapturedDecl::setNothrow(bool Nothrow) { BodyAndNothrow.setInt(Nothrow); }
5704
5707 QualType T, Expr *E, const llvm::APSInt &V)
5708 : ValueDecl(EnumConstant, DC, L, Id, T), Init((Stmt *)E) {
5709 setInitVal(C, V);
5710}
5711
5714 IdentifierInfo *Id, QualType T,
5715 Expr *E, const llvm::APSInt &V) {
5716 return new (C, CD) EnumConstantDecl(C, CD, L, Id, T, E, V);
5717}
5718
5720 GlobalDeclID ID) {
5721 return new (C, ID) EnumConstantDecl(C, nullptr, SourceLocation(), nullptr,
5722 QualType(), nullptr, llvm::APSInt());
5723}
5724
5725void IndirectFieldDecl::anchor() {}
5726
5727IndirectFieldDecl::IndirectFieldDecl(ASTContext &C, DeclContext *DC,
5729 QualType T,
5731 : ValueDecl(IndirectField, DC, L, N, T), Chaining(CH.data()),
5732 ChainingSize(CH.size()) {
5733 // In C++, indirect field declarations conflict with tag declarations in the
5734 // same scope, so add them to IDNS_Tag so that tag redeclaration finds them.
5735 if (C.getLangOpts().CPlusPlus)
5737}
5738
5741 const IdentifierInfo *Id,
5742 QualType T,
5744 return new (C, DC) IndirectFieldDecl(C, DC, L, Id, T, CH);
5745}
5746
5748 GlobalDeclID ID) {
5749 return new (C, ID) IndirectFieldDecl(C, nullptr, SourceLocation(),
5750 DeclarationName(), QualType(), {});
5751}
5752
5755 if (Init)
5756 End = Init->getEndLoc();
5757 return SourceRange(getLocation(), End);
5758}
5759
5760void TypeDecl::anchor() {}
5761
5763 SourceLocation StartLoc, SourceLocation IdLoc,
5764 const IdentifierInfo *Id,
5765 TypeSourceInfo *TInfo) {
5766 return new (C, DC) TypedefDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5767}
5768
5769void TypedefNameDecl::anchor() {}
5770
5772 if (auto *TT = getTypeSourceInfo()->getType()->getAs<TagType>()) {
5773 auto *OwningTypedef = TT->getDecl()->getTypedefNameForAnonDecl();
5774 auto *ThisTypedef = this;
5775 if (AnyRedecl && OwningTypedef) {
5776 OwningTypedef = OwningTypedef->getCanonicalDecl();
5777 ThisTypedef = ThisTypedef->getCanonicalDecl();
5778 }
5779 if (OwningTypedef == ThisTypedef)
5780 return TT->getDecl()->getDefinitionOrSelf();
5781 }
5782
5783 return nullptr;
5784}
5785
5786bool TypedefNameDecl::isTransparentTagSlow() const {
5787 auto determineIsTransparent = [&]() {
5788 if (auto *TT = getUnderlyingType()->getAs<TagType>()) {
5789 if (auto *TD = TT->getDecl()) {
5790 if (TD->getName() != getName())
5791 return false;
5792 SourceLocation TTLoc = getLocation();
5793 SourceLocation TDLoc = TD->getLocation();
5794 if (!TTLoc.isMacroID() || !TDLoc.isMacroID())
5795 return false;
5797 return SM.getSpellingLoc(TTLoc) == SM.getSpellingLoc(TDLoc);
5798 }
5799 }
5800 return false;
5801 };
5802
5803 bool isTransparent = determineIsTransparent();
5804 MaybeModedTInfo.setInt((isTransparent << 1) | 1);
5805 return isTransparent;
5806}
5807
5809 return new (C, ID) TypedefDecl(C, nullptr, SourceLocation(), SourceLocation(),
5810 nullptr, nullptr);
5811}
5812
5814 SourceLocation StartLoc,
5815 SourceLocation IdLoc,
5816 const IdentifierInfo *Id,
5817 TypeSourceInfo *TInfo) {
5818 return new (C, DC) TypeAliasDecl(C, DC, StartLoc, IdLoc, Id, TInfo);
5819}
5820
5822 GlobalDeclID ID) {
5823 return new (C, ID) TypeAliasDecl(C, nullptr, SourceLocation(),
5824 SourceLocation(), nullptr, nullptr);
5825}
5826
5828 SourceLocation RangeEnd = getLocation();
5829 if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
5830 if (typeIsPostfix(TInfo->getType()))
5831 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5832 }
5833 return SourceRange(getBeginLoc(), RangeEnd);
5834}
5835
5837 SourceLocation RangeEnd = getBeginLoc();
5838 if (TypeSourceInfo *TInfo = getTypeSourceInfo())
5839 RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
5840 return SourceRange(getBeginLoc(), RangeEnd);
5841}
5842
5843void FileScopeAsmDecl::anchor() {}
5844
5846 Expr *Str, SourceLocation AsmLoc,
5847 SourceLocation RParenLoc) {
5848 return new (C, DC) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc);
5849}
5850
5852 GlobalDeclID ID) {
5853 return new (C, ID) FileScopeAsmDecl(nullptr, nullptr, SourceLocation(),
5854 SourceLocation());
5855}
5856
5860
5861void TopLevelStmtDecl::anchor() {}
5862
5863TopLevelStmtDecl *TopLevelStmtDecl::Create(ASTContext &C, Stmt *Statement) {
5864 assert(C.getLangOpts().IncrementalExtensions &&
5865 "Must be used only in incremental mode");
5866
5867 SourceLocation Loc = Statement ? Statement->getBeginLoc() : SourceLocation();
5868 DeclContext *DC = C.getTranslationUnitDecl();
5869
5870 return new (C, DC) TopLevelStmtDecl(DC, Loc, Statement);
5871}
5872
5874 GlobalDeclID ID) {
5875 return new (C, ID)
5876 TopLevelStmtDecl(/*DC=*/nullptr, SourceLocation(), /*S=*/nullptr);
5877}
5878
5880 return SourceRange(getLocation(), Statement->getEndLoc());
5881}
5882
5884 assert(S);
5885 Statement = S;
5886 setLocation(Statement->getBeginLoc());
5887}
5888
5889void EmptyDecl::anchor() {}
5890
5892 return new (C, DC) EmptyDecl(DC, L);
5893}
5894
5896 return new (C, ID) EmptyDecl(nullptr, SourceLocation());
5897}
5898
5899HLSLBufferDecl::HLSLBufferDecl(DeclContext *DC, bool CBuffer,
5900 SourceLocation KwLoc, IdentifierInfo *ID,
5901 SourceLocation IDLoc, SourceLocation LBrace)
5902 : NamedDecl(Decl::Kind::HLSLBuffer, DC, IDLoc, DeclarationName(ID)),
5903 DeclContext(Decl::Kind::HLSLBuffer), LBraceLoc(LBrace), KwLoc(KwLoc),
5904 IsCBuffer(CBuffer), HasValidPackoffset(false), LayoutStruct(nullptr) {}
5905
5907 DeclContext *LexicalParent, bool CBuffer,
5908 SourceLocation KwLoc, IdentifierInfo *ID,
5909 SourceLocation IDLoc,
5910 SourceLocation LBrace) {
5911 // For hlsl like this
5912 // cbuffer A {
5913 // cbuffer B {
5914 // }
5915 // }
5916 // compiler should treat it as
5917 // cbuffer A {
5918 // }
5919 // cbuffer B {
5920 // }
5921 // FIXME: support nested buffers if required for back-compat.
5922 DeclContext *DC = LexicalParent;
5923 HLSLBufferDecl *Result =
5924 new (C, DC) HLSLBufferDecl(DC, CBuffer, KwLoc, ID, IDLoc, LBrace);
5925 return Result;
5926}
5927
5930 ArrayRef<Decl *> DefaultCBufferDecls) {
5931 DeclContext *DC = LexicalParent;
5932 IdentifierInfo *II = &C.Idents.get("$Globals", tok::TokenKind::identifier);
5933 HLSLBufferDecl *Result = new (C, DC) HLSLBufferDecl(
5934 DC, true, SourceLocation(), II, SourceLocation(), SourceLocation());
5935 Result->setImplicit(true);
5936 Result->setDefaultBufferDecls(DefaultCBufferDecls);
5937 return Result;
5938}
5939
5941 GlobalDeclID ID) {
5942 return new (C, ID) HLSLBufferDecl(nullptr, false, SourceLocation(), nullptr,
5944}
5945
5947 assert(LayoutStruct == nullptr && "layout struct has already been set");
5948 LayoutStruct = LS;
5949 addDecl(LS);
5950}
5951
5952void HLSLBufferDecl::setDefaultBufferDecls(ArrayRef<Decl *> Decls) {
5953 assert(!Decls.empty());
5954 assert(DefaultBufferDecls.empty() && "default decls are already set");
5955 assert(isImplicit() &&
5956 "default decls can only be added to the implicit/default constant "
5957 "buffer $Globals");
5958
5959 // allocate array for default decls with ASTContext allocator
5960 Decl **DeclsArray = new (getASTContext()) Decl *[Decls.size()];
5961 llvm::copy(Decls, DeclsArray);
5962 DefaultBufferDecls = ArrayRef<Decl *>(DeclsArray, Decls.size());
5963}
5964
5967 return buffer_decl_iterator(llvm::iterator_range(DefaultBufferDecls.begin(),
5968 DefaultBufferDecls.end()),
5970}
5971
5973 return buffer_decl_iterator(
5974 llvm::iterator_range(DefaultBufferDecls.end(), DefaultBufferDecls.end()),
5976}
5977
5979 return DefaultBufferDecls.empty() && decls_empty();
5980}
5981
5982//===----------------------------------------------------------------------===//
5983// HLSLRootSignatureDecl Implementation
5984//===----------------------------------------------------------------------===//
5985
5986HLSLRootSignatureDecl::HLSLRootSignatureDecl(
5988 llvm::dxbc::RootSignatureVersion Version, unsigned NumElems)
5989 : NamedDecl(Decl::Kind::HLSLRootSignature, DC, Loc, DeclarationName(ID)),
5990 Version(Version), NumElems(NumElems) {}
5991
5992HLSLRootSignatureDecl *HLSLRootSignatureDecl::Create(
5994 llvm::dxbc::RootSignatureVersion Version,
5996 HLSLRootSignatureDecl *RSDecl =
5997 new (C, DC,
5998 additionalSizeToAlloc<llvm::hlsl::rootsig::RootElement>(
5999 RootElements.size()))
6000 HLSLRootSignatureDecl(DC, Loc, ID, Version, RootElements.size());
6001 auto *StoredElems = RSDecl->getElems();
6002 llvm::uninitialized_copy(RootElements, StoredElems);
6003 return RSDecl;
6004}
6005
6008 HLSLRootSignatureDecl *Result = new (C, ID)
6009 HLSLRootSignatureDecl(nullptr, SourceLocation(), nullptr,
6010 /*Version*/ llvm::dxbc::RootSignatureVersion::V1_1,
6011 /*NumElems=*/0);
6012 return Result;
6013}
6014
6015//===----------------------------------------------------------------------===//
6016// ImportDecl Implementation
6017//===----------------------------------------------------------------------===//
6018
6019/// Retrieve the number of module identifiers needed to name the given
6020/// module.
6021static unsigned getNumModuleIdentifiers(Module *Mod) {
6022 unsigned Result = 1;
6023 while (Mod->Parent) {
6024 Mod = Mod->Parent;
6025 ++Result;
6026 }
6027 return Result;
6028}
6029
6030ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
6031 Module *Imported,
6032 ArrayRef<SourceLocation> IdentifierLocs)
6033 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
6034 NextLocalImportAndComplete(nullptr, true) {
6035 assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size());
6036 auto *StoredLocs = getTrailingObjects();
6037 llvm::uninitialized_copy(IdentifierLocs, StoredLocs);
6038}
6039
6040ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
6041 Module *Imported, SourceLocation EndLoc)
6042 : Decl(Import, DC, StartLoc), ImportedModule(Imported),
6043 NextLocalImportAndComplete(nullptr, false) {
6044 *getTrailingObjects() = EndLoc;
6045}
6046
6048 SourceLocation StartLoc, Module *Imported,
6049 ArrayRef<SourceLocation> IdentifierLocs) {
6050 return new (C, DC,
6051 additionalSizeToAlloc<SourceLocation>(IdentifierLocs.size()))
6052 ImportDecl(DC, StartLoc, Imported, IdentifierLocs);
6053}
6054
6056 SourceLocation StartLoc,
6057 Module *Imported,
6058 SourceLocation EndLoc) {
6059 ImportDecl *Import = new (C, DC, additionalSizeToAlloc<SourceLocation>(1))
6060 ImportDecl(DC, StartLoc, Imported, EndLoc);
6061 Import->setImplicit();
6062 return Import;
6063}
6064
6066 unsigned NumLocations) {
6067 return new (C, ID, additionalSizeToAlloc<SourceLocation>(NumLocations))
6068 ImportDecl(EmptyShell());
6069}
6070
6072 if (!isImportComplete())
6073 return {};
6074
6075 return getTrailingObjects(getNumModuleIdentifiers(getImportedModule()));
6076}
6077
6079 if (!isImportComplete())
6080 return SourceRange(getLocation(), *getTrailingObjects());
6081
6082 return SourceRange(getLocation(), getIdentifierLocs().back());
6083}
6084
6085//===----------------------------------------------------------------------===//
6086// ExportDecl Implementation
6087//===----------------------------------------------------------------------===//
6088
6089void ExportDecl::anchor() {}
6090
6092 SourceLocation ExportLoc) {
6093 return new (C, DC) ExportDecl(DC, ExportLoc);
6094}
6095
6097 return new (C, ID) ExportDecl(nullptr, SourceLocation());
6098}
6099
6101 bool IncludeLocallyStreaming) {
6102 if (IncludeLocallyStreaming)
6103 if (FD->hasAttr<ArmLocallyStreamingAttr>())
6104 return true;
6105
6106 assert(!FD->getType().isNull() && "Expected a valid FunctionDecl");
6107 if (const auto *FPT = FD->getType()->getAs<FunctionProtoType>())
6108 if (FPT->getAArch64SMEAttributes() & FunctionType::SME_PStateSMEnabledMask)
6109 return true;
6110
6111 return false;
6112}
6113
6115 const auto *T = FD->getType()->getAs<FunctionProtoType>();
6116 return (T && FunctionType::getArmZAState(T->getAArch64SMEAttributes()) !=
6118 (FD->hasAttr<ArmNewAttr>() && FD->getAttr<ArmNewAttr>()->isNewZA());
6119}
6120
6122 const auto *T = FD->getType()->getAs<FunctionProtoType>();
6123 return (T && FunctionType::getArmZT0State(T->getAArch64SMEAttributes()) !=
6125 (FD->hasAttr<ArmNewAttr>() && FD->getAttr<ArmNewAttr>()->isNewZT0());
6126}
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:1855
static bool isDeclExternC(const T &D)
Definition Decl.cpp:2241
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:3920
static bool isExportedFromModuleInterfaceUnit(const NamedDecl *D)
Definition Decl.cpp:1190
static bool isRedeclarable(Decl::Kind K)
Definition Decl.cpp:1859
static bool redeclForcesDefMSVC(const FunctionDecl *Redecl)
Definition Decl.cpp:3908
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:2214
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:6021
static bool isSingleLineLanguageLinkage(const Decl &D)
Definition Decl.cpp:579
static bool useInlineVisibilityHidden(const NamedDecl *D)
Definition Decl.cpp:546
static bool shouldConsiderTemplateVisibility(const FunctionDecl *fn, const FunctionTemplateSpecializationInfo *specInfo)
Definition Decl.cpp:373
static bool hasDirectVisibilityAttribute(const NamedDecl *D, LVComputationKind computation)
Does the given declaration have a direct visibility attribute that would match the given rules?
Definition Decl.cpp:419
static DeclT * getDefinitionOrSelf(DeclT *D)
Definition Decl.cpp:2703
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 bool typeIsPostfix(QualType QT)
Definition Decl.cpp:2068
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:1231
static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl)
Definition Decl.cpp:1994
static bool isNamed(const NamedDecl *ND, const char(&Str)[Len])
Definition Decl.cpp:3307
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.
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,...
#define SM(sm)
*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:187
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:481
bool needsCleanup() const
Returns whether the object performed allocations.
Definition APValue.cpp:444
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
SourceManager & getSourceManager()
Definition ASTContext.h:858
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:877
const LangOptions & getLangOpts() const
Definition ASTContext.h:951
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)
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:916
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.
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.
Type source information for an attributed type.
Definition TypeLoc.h:1008
BlockDecl(DeclContext *DC, SourceLocation CaretLoc)
Definition Decl.cpp:5437
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.cpp:5447
void setDoesNotEscape(bool B=true)
Definition Decl.h:4826
void setCapturesCXXThis(bool B=true)
Definition Decl.h:4807
void setCanAvoidCopyToHeap(bool B=true)
Definition Decl.h:4831
void setIsConversionFromLambda(bool val=true)
Definition Decl.h:4821
void setBlockMissingReturnType(bool val=true)
Definition Decl.h:4813
ArrayRef< Capture > captures() const
Definition Decl.h:4801
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5480
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5650
void setIsVariadic(bool value)
Definition Decl.h:4750
bool capturesVariable(const VarDecl *var) const
Definition Decl.cpp:5471
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition Decl.cpp:5458
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition Decl.cpp:5646
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:2030
void setBody(Stmt *B)
Definition Decl.cpp:5700
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5693
bool isNothrow() const
Definition Decl.cpp:5702
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5703
static CapturedDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition Decl.cpp:5687
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:5699
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:3838
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
Definition TypeBase.h:3444
A POD class for pairing a NamedDecl* with an access specifier.
decl_iterator - Iterates through the declarations stored within this context.
Definition DeclBase.h:2330
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition DeclBase.h:2238
FunctionDeclBitfields FunctionDeclBits
Definition DeclBase.h:2044
bool isFileContext() const
Definition DeclBase.h:2180
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:2040
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:2198
bool isTranslationUnit() const
Definition DeclBase.h:2185
bool isRecord() const
Definition DeclBase.h:2189
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
RecordDeclBitfields RecordDeclBits
Definition DeclBase.h:2042
Decl * FirstDecl
FirstDecl - The first declaration stored within this declaration context.
Definition DeclBase.h:2079
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:2369
decl_iterator decls_end() const
Definition DeclBase.h:2375
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Definition DeclBase.h:2688
Decl * LastDecl
LastDecl - The last declaration stored within this declaration context.
Definition DeclBase.h:2085
bool decls_empty() const
bool isInlineNamespace() const
bool isFunctionOrMethod() const
Definition DeclBase.h:2161
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:2102
decl_iterator decls_begin() const
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:1061
bool isInStdNamespace() const
Definition DeclBase.cpp:449
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclBase.h:435
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1226
T * getAttr() const
Definition DeclBase.h:573
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
void addAttr(Attr *A)
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:593
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:870
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
Definition DeclBase.h:876
ASTMutationListener * getASTMutationListener() const
Definition DeclBase.cpp:556
bool hasCachedLinkage() const
Definition DeclBase.h:421
Kind
Lists the kind of concrete classes of Decl.
Definition DeclBase.h:89
@ FOK_None
Not a friend object.
Definition DeclBase.h:1217
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition DeclBase.h:984
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:842
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:793
Linkage getCachedLinkage() const
Definition DeclBase.h:413
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition DeclBase.h:2793
bool isInvalidDecl() const
Definition DeclBase.h:588
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
Definition DeclBase.cpp:633
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
Definition DeclBase.h:559
SourceLocation getLocation() const
Definition DeclBase.h:439
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:1049
void setLocation(SourceLocation L)
Definition DeclBase.h:440
friend class LinkageComputer
Definition DeclBase.h:329
DeclContext * getDeclContext()
Definition DeclBase.h:448
bool isInAnonymousNamespace() const
Definition DeclBase.cpp:439
void setCachedLinkage(Linkage L) const
Definition DeclBase.h:417
friend class RecordDecl
Definition DeclBase.h:330
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
Definition Decl.cpp:1636
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:918
bool hasAttr() const
Definition DeclBase.h:577
friend class DeclContext
Definition DeclBase.h:252
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
@ 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:234
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
Definition DeclBase.h:240
@ 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:442
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
Definition DeclBase.cpp:552
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:2006
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:2062
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2102
SourceLocation getTypeSpecStartLoc() const
Definition Decl.cpp:2000
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:2012
void setTrailingRequiresClause(const AssociatedConstraint &AC)
Definition Decl.cpp:2031
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition Decl.cpp:2046
Provides information about a dependent function-template specialization declaration.
static DependentFunctionTemplateSpecializationInfo * Create(ASTContext &Context, const UnresolvedSetImpl &Candidates, const TemplateArgumentListInfo *TemplateArgs)
Definition Decl.cpp:4396
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition Decl.cpp:5891
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5895
EnumConstantDecl(const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition Decl.cpp:5705
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5719
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition Decl.h:3448
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
Definition Decl.cpp:5712
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5753
Represents an enum.
Definition Decl.h:4013
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4285
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
Definition Decl.h:4223
unsigned getODRHash()
Definition Decl.cpp:5168
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:5129
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
Definition Decl.cpp:5075
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
Definition Decl.h:4202
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5084
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
Definition Decl.cpp:5114
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
Definition Decl.cpp:5089
SourceRange getSourceRange() const override LLVM_READONLY
Overrides to provide correct range when there's an enum-base specifier with forward declarations.
Definition Decl.cpp:5179
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition Decl.h:4186
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
Definition Decl.cpp:5155
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
Definition Decl.h:4212
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Definition Decl.cpp:5122
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
Definition Decl.cpp:5108
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
Definition Decl.cpp:5140
bool isClosedNonFlag() const
Returns true if this enum is annotated with neither flag_enum nor enum_extensibility(open).
Definition Decl.cpp:5118
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:5190
static ExportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExportLoc)
Definition Decl.cpp:6091
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6096
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:3670
QualType getType() const
Definition Expr.h:144
static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)
Definition Decl.cpp:5549
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Abstract interface for external sources of AST nodes.
Represents a member of a struct/union/class.
Definition Decl.h:3160
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Definition Decl.cpp:4726
bool isBitField() const
Determines whether this field is a bitfield.
Definition Decl.h:3263
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3340
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:3220
LazyDeclStmtPtr Init
Definition Decl.h:3210
unsigned getBitWidthValue() const
Computes the bit width of this field, if this is a bit field.
Definition Decl.cpp:4753
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
Definition Decl.cpp:4716
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4827
bool hasConstantIntegerBitWidth() const
Determines whether the bit width of this field is a constant integer.
Definition Decl.cpp:4748
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:4710
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Definition Decl.cpp:4736
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition Decl.h:3396
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:4767
InitAndBitWidthStorage * InitAndBitWidth
Definition Decl.h:3214
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:4701
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
Definition Decl.h:3407
static bool classofKind(Kind K)
Definition Decl.h:3412
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Definition Decl.h:3266
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
Definition Decl.cpp:4762
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
Definition Decl.h:3276
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:4846
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
Definition Decl.cpp:4856
bool isPotentiallyOverlapping() const
Determine if this field is of potentially-overlapping class type, that is, subobject with the [[no_un...
Definition Decl.cpp:4805
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
Definition Decl.cpp:4836
const VariableArrayType * CapturedVLAType
Definition Decl.h:3216
std::string getAsmString() const
Definition Decl.cpp:5857
const Expr * getAsmStringExpr() const
Definition Decl.h:4622
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Definition Decl.cpp:5845
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5851
Stashed information about a defaulted/deleted function body.
Definition Decl.h:2028
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Definition Decl.cpp:3141
void setDeletedMessage(StringLiteral *Message)
Definition Decl.cpp:3183
Represents a function declaration or definition.
Definition Decl.h:2000
unsigned getMemoryFunctionKind() const
Identify a memory copying or setting function.
Definition Decl.cpp:4554
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
Definition Decl.h:2642
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
Definition Decl.cpp:3725
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition Decl.h:2689
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:2189
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2797
bool hasTrivialBody() const
Returns whether the function has a trivial body that does not require any specific codegen.
Definition Decl.cpp:3211
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
Definition Decl.cpp:3195
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition Decl.cpp:3848
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition Decl.cpp:4206
void setPreviousDeclaration(FunctionDecl *PrevDecl)
Definition Decl.cpp:3734
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition Decl.cpp:4199
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4194
void setIsPureVirtual(bool P=true)
Definition Decl.cpp:3299
bool isImmediateFunction() const
Definition Decl.cpp:3341
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition Decl.cpp:3161
SourceLocation getEllipsisLoc() const
Returns the location of the ellipsis of a variadic function.
Definition Decl.h:2223
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
Definition Decl.cpp:4025
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition Decl.cpp:3552
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5634
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
Definition Decl.cpp:3763
SourceLocation getPointOfInstantiation() const
Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...
Definition Decl.cpp:4515
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
Definition Decl.cpp:3667
bool hasCXXExplicitFunctionObjectParameter() const
Definition Decl.cpp:3866
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2921
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
Definition Decl.h:2909
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition Decl.cpp:3652
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2774
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
Definition Decl.cpp:3707
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:4265
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
Definition Decl.cpp:3892
unsigned getMinRequiredExplicitArguments() const
Returns the minimum number of non-object arguments needed to call this function.
Definition Decl.cpp:3875
bool BodyContainsImmediateEscalatingExpressions() const
Definition Decl.h:2490
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition Decl.cpp:3615
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4314
bool hasWrittenPrototype() const
Whether this function has a written prototype.
Definition Decl.h:2448
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4173
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4324
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:3748
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
Definition Decl.cpp:4002
bool isVariadic() const
Whether this function is variadic.
Definition Decl.cpp:3134
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition Decl.h:2326
bool isConstexprSpecified() const
Definition Decl.h:2479
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
Definition Decl.cpp:4390
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4330
SourceRange getExceptionSpecSourceRange() const
Attempt to compute an informative source range covering the function exception specification,...
Definition Decl.cpp:4057
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:2253
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
Definition Decl.cpp:3376
unsigned getODRHash()
Returns ODRHash of the function.
Definition Decl.cpp:4680
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Determine the kind of template specialization this function represents for the purpose of template in...
Definition Decl.cpp:4442
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:3080
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
Definition Decl.cpp:4258
unsigned getNumNonObjectParams() const
Definition Decl.cpp:3870
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition Decl.h:2005
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2016
@ TK_DependentFunctionTemplateSpecialization
Definition Decl.h:2019
UsualDeleteParams getUsualDeleteParams() const
Definition Decl.cpp:3568
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:2888
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
Definition Decl.cpp:4527
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
Definition Decl.cpp:3527
bool FriendConstraintRefersToEnclosingTemplate() const
Definition Decl.h:2707
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4145
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition Decl.cpp:4212
bool isDeletedAsWritten() const
Definition Decl.h:2544
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Definition Decl.cpp:3404
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:4379
bool isInExternCContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C" linkage spec.
Definition Decl.cpp:3623
static constexpr unsigned RequiredTypeAwareNewParameterCount
Count of mandatory parameters for type aware operator new.
Definition Decl.h:2638
bool isImplicitlyInstantiable() const
Determines whether this function is a function template specialization or a member of a class templat...
Definition Decl.cpp:4223
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition Decl.cpp:3619
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:2300
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:2276
LazyDeclStmtPtr Body
The body of the function.
Definition Decl.h:2066
bool isImmediateEscalating() const
Definition Decl.cpp:3312
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
Definition Decl.cpp:3556
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:3427
DefaultedOrDeletedFunctionInfo * DefaultedOrDeletedInfo
Information about a future defaulted function definition.
Definition Decl.h:2068
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
Definition Decl.cpp:3560
bool isInExternCXXContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C++" linkage spec.
Definition Decl.cpp:3629
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition Decl.cpp:3369
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition Decl.h:2916
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
Definition Decl.cpp:3729
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
Definition Decl.cpp:3564
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
Definition Decl.cpp:3224
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
Definition Decl.cpp:3703
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
bool isReferenceableKernel() const
Definition Decl.cpp:5641
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4550
FunctionDecl * getInstantiatedFromDecl() const
Definition Decl.cpp:4218
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4487
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
Definition Decl.cpp:4139
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4131
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4418
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
Definition Decl.cpp:3942
bool isConsteval() const
Definition Decl.h:2482
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
Definition Decl.cpp:3711
bool isAnalyzerNoReturn() const
Determines whether this function is known to be 'noreturn' for analyzer, through an analyzer_noreturn...
Definition Decl.cpp:3663
void setBody(Stmt *B)
Definition Decl.cpp:3292
bool isGlobal() const
Determines whether this is a global function.
Definition Decl.cpp:3633
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
Definition Decl.cpp:3880
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition Decl.cpp:3170
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:3716
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4166
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:4079
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3827
DeclarationNameInfo getNameInfo() const
Definition Decl.h:2211
Redeclarable< FunctionDecl > redeclarable_base
Definition Decl.h:2160
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Definition Decl.cpp:3200
SourceRange getParametersSourceRange() const
Attempt to compute an informative source range covering the function parameters, including the ellips...
Definition Decl.cpp:4041
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:2899
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
Definition Decl.cpp:3689
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:3126
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Definition Decl.h:2685
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Definition Decl.cpp:4340
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5315
param_type_iterator param_type_begin() const
Definition TypeBase.h:5759
unsigned getNumParams() const
Definition TypeBase.h:5593
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5719
param_type_iterator param_type_end() const
Definition TypeBase.h:5763
Declaration of a template function.
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:1644
SourceRange getExceptionSpecRange() const
Definition TypeLoc.h:1696
TypeLoc getReturnLoc() const
Definition TypeLoc.h:1725
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4511
static ArmStateValue getArmZT0State(unsigned AttrBits)
Definition TypeBase.h:4820
static ArmStateValue getArmZAState(unsigned AttrBits)
Definition TypeBase.h:4816
static std::string ExtractStringFromGCCAsmStmtComponent(const Expr *E)
Definition Stmt.cpp:554
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5196
buffer_decl_iterator buffer_decls_begin() const
Definition Decl.cpp:5966
static HLSLBufferDecl * Create(ASTContext &C, DeclContext *LexicalParent, bool CBuffer, SourceLocation KwLoc, IdentifierInfo *ID, SourceLocation IDLoc, SourceLocation LBrace)
Definition Decl.cpp:5906
void addLayoutStruct(CXXRecordDecl *LS)
Definition Decl.cpp:5946
bool buffer_decls_empty()
Definition Decl.cpp:5978
llvm::concat_iterator< Decl *const, SmallVector< Decl * >::const_iterator, decl_iterator > buffer_decl_iterator
Definition Decl.h:5266
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5940
buffer_decl_iterator buffer_decls_end() const
Definition Decl.cpp:5972
static HLSLBufferDecl * CreateDefaultCBuffer(ASTContext &C, DeclContext *LexicalParent, ArrayRef< Decl * > DefaultCBufferDecls)
Definition Decl.cpp:5929
static HLSLRootSignatureDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, IdentifierInfo *ID, llvm::dxbc::RootSignatureVersion Version, ArrayRef< llvm::hlsl::rootsig::RootElement > RootElements)
Definition Decl.cpp:5992
static HLSLRootSignatureDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6007
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:1762
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition Decl.cpp:5603
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5615
static ImportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, ArrayRef< SourceLocation > IdentifierLocs)
Create a new module import declaration.
Definition Decl.cpp:6047
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:6078
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition Decl.cpp:6065
friend class ASTContext
Definition Decl.h:5056
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:6071
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition Decl.h:5113
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:6055
static bool classofKind(Kind K)
Definition Decl.h:3509
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5747
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
Definition Decl.cpp:5739
void setMSAsmLabel(StringRef Name)
Definition Decl.cpp:5573
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
Definition Decl.cpp:5556
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5568
@ 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:5084
LinkageInfo computeLVForDecl(const NamedDecl *D, LVComputationKind computation, bool IgnoreVarTypeLinkage=false)
Definition Decl.cpp:1459
LinkageInfo getLVForDecl(const NamedDecl *D, LVComputationKind computation)
getLVForDecl - Get the linkage and visibility for the given declaration.
Definition Decl.cpp:1577
LinkageInfo getDeclLinkageAndVisibility(const NamedDecl *D)
Definition Decl.cpp:1626
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:144
Module * Parent
The parent of this module.
Definition Module.h:193
ModuleKind Kind
The kind of this module.
Definition Module.h:189
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
Definition Module.h:167
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition Module.h:158
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
Definition Module.h:185
@ ModulePartitionInterface
This is a C++20 module partition interface.
Definition Module.h:170
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
Definition Module.h:164
@ ModuleHeaderUnit
This is a C++20 header unit.
Definition Module.h:161
@ ModulePartitionImplementation
This is a C++20 module partition implementation.
Definition Module.h:173
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
Definition Module.h:180
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
Definition Module.h:177
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:1226
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:1680
std::optional< Visibility > getExplicitVisibility(ExplicitVisibilityKind kind) const
If visibility was explicitly specified for this declaration, return that visibility.
Definition Decl.cpp:1313
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:1846
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:1870
ObjCStringFormatFamily getObjCFStringFormattingFamily() const
Definition Decl.cpp:1169
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Definition Decl.cpp:1206
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:1687
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:1672
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
Definition Decl.cpp:1974
bool hasLinkage() const
Determine whether this declaration has linkage.
Definition Decl.cpp:1942
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:1714
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:4881
static OutlinedFunctionDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition Decl.cpp:5659
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5679
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5667
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:5673
Represents a parameter to a function.
Definition Decl.h:1790
void setDefaultArg(Expr *defarg)
Definition Decl.cpp:3023
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2975
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:1796
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
Definition Decl.h:1919
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
Definition Decl.cpp:3028
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3048
bool hasUninstantiatedDefaultArg() const
Definition Decl.h:1923
bool isDestroyedInCallee() const
Determines whether this parameter is destroyed in the callee function.
Definition Decl.cpp:2996
bool hasInheritedDefaultArg() const
Definition Decl.h:1935
bool isExplicitObjectParameter() const
Definition Decl.h:1878
QualType getOriginalType() const
Definition Decl.cpp:2967
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:2958
Expr * getDefaultArg()
Definition Decl.cpp:3011
Expr * getUninstantiatedDefaultArg()
Definition Decl.cpp:3053
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
Definition Decl.cpp:3059
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2981
static PragmaCommentDecl * Create(const ASTContext &C, TranslationUnitDecl *DC, SourceLocation CommentLoc, PragmaMSCommentKind CommentKind, StringRef Arg)
Definition Decl.cpp:5503
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition Decl.cpp:5516
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:5526
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition Decl.cpp:5541
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:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8388
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:1551
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition TypeBase.h:8434
Represents a struct/union/class.
Definition Decl.h:4327
bool hasLoadedFieldsFromExternalStorage() const
Definition Decl.h:4396
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition Decl.cpp:5419
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
Definition Decl.cpp:5247
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:5313
void setAnonymousStructOrUnion(bool Anon)
Definition Decl.h:4383
RecordDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl)
Definition Decl.cpp:5209
const FieldDecl * findFirstNamedDataMember() const
Finds the first data member which has a name.
Definition Decl.cpp:5405
field_iterator noload_field_begin() const
Definition Decl.cpp:5286
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition Decl.h:4473
void setNonTrivialToPrimitiveCopy(bool V)
Definition Decl.h:4417
bool isCapturedRecord() const
Determine whether this record is a record for captured variables in CapturedStmt construct.
Definition Decl.cpp:5253
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition Decl.h:4449
field_range fields() const
Definition Decl.h:4530
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition Decl.h:4441
void setHasFlexibleArrayMember(bool V)
Definition Decl.h:4364
void setParamDestroyedInCallee(bool V)
Definition Decl.h:4481
void setNonTrivialToPrimitiveDestroy(bool V)
Definition Decl.h:4425
void setHasObjectMember(bool val)
Definition Decl.h:4388
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
Definition Decl.cpp:5233
void setHasVolatileMember(bool val)
Definition Decl.h:4392
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition Decl.h:4433
void reorderDecls(const SmallVectorImpl< Decl * > &Decls)
Definition Decl.cpp:5324
void setIsRandomized(bool V)
Definition Decl.h:4487
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5240
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition Decl.cpp:5361
static bool classof(const Decl *D)
Definition Decl.h:4567
bool isOrContainsUnion() const
Returns whether this record is a union, or contains (at any nesting level) a union member.
Definition Decl.cpp:5261
virtual void completeDefinition()
Note that the definition of this type is now complete.
Definition Decl.cpp:5292
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Definition Decl.h:4511
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
Definition Decl.cpp:5257
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4527
void setHasUninitializedExplicitInitFields(bool V)
Definition Decl.h:4457
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition Decl.h:4409
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4515
friend class DeclContext
Definition Decl.h:4331
void setHasLoadedFieldsFromExternalStorage(bool val) const
Definition Decl.h:4400
field_iterator field_begin() const
Definition Decl.cpp:5276
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.
A trivial tuple used to represent a source range.
bool isInvalid() const
SourceLocation getEnd() const
Stmt - This represents one statement.
Definition Stmt.h:86
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:1802
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
void setTagKind(TagKind TK)
Definition Decl.h:3921
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition Decl.h:3833
SourceRange getBraceRange() const
Definition Decl.h:3794
TagTypeKind TagKind
Definition Decl.h:3722
bool isBeingDefined() const
Return true if this decl is currently being defined.
Definition Decl.h:3838
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:4930
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:3848
StringRef getKindName() const
Definition Decl.h:3913
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3818
redeclarable_base::redecl_iterator redecl_iterator
Definition Decl.h:3785
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition Decl.h:3954
void startDefinition()
Starts the definition of this tag declaration.
Definition Decl.cpp:4907
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:4900
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
Definition Decl.cpp:4902
SourceLocation getOuterLocStart() const
Return SourceLocation representing start of source range taking into account any outer template decla...
Definition Decl.cpp:4890
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4894
void printAnonymousTagDeclLocation(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
Definition Decl.cpp:4964
bool isUnion() const
Definition Decl.h:3928
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
Definition Decl.h:3772
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Definition Decl.cpp:4944
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Definition Decl.cpp:5043
void completeDefinition()
Completes the definition of this tag declaration.
Definition Decl.cpp:4918
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:5029
Redeclarable< TagDecl > redeclarable_base
Definition Decl.h:3752
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition Decl.h:3856
redeclarable_base::redecl_range redecl_range
Definition Decl.h:3784
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Definition Decl.h:3863
void printAnonymousTagDecl(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
Definition Decl.cpp:4988
TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl, SourceLocation StartL)
Definition Decl.cpp:4873
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition Decl.h:3821
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:5873
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Definition Decl.cpp:5863
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5879
void setStmt(Stmt *S)
Definition Decl.cpp:5883
The top declaration context.
Definition Decl.h:105
static TranslationUnitDecl * Create(ASTContext &C)
Definition Decl.cpp:5490
ASTContext & getASTContext() const
Definition Decl.h:141
void setAnonymousNamespace(NamespaceDecl *D)
Definition Decl.cpp:5494
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5821
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition Decl.cpp:5813
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5836
friend class ASTContext
Definition Decl.h:3514
TypeDecl(Kind DK, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, SourceLocation StartL=SourceLocation())
Definition Decl.h:3529
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:3547
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:8359
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:8370
The base class of the type hierarchy.
Definition TypeBase.h:1839
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:3242
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition Type.h:41
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9035
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9285
bool isReferenceType() const
Definition TypeBase.h:8649
bool isEnumeralType() const
Definition TypeBase.h:8756
bool isAlignValT() const
Definition Type.cpp:3251
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:753
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition Type.cpp:2073
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2929
Linkage getLinkage() const
Determine the linkage of this type.
Definition Type.cpp:4971
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9218
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition Decl.cpp:5762
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:5827
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5808
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:3612
QualType getUnderlyingType() const
Definition Decl.h:3617
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
Definition Decl.cpp:5771
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
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:5594
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Definition Decl.cpp:5582
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.cpp:5588
Represents a variable declaration or definition.
Definition Decl.h:926
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition Decl.cpp:2822
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2163
Stmt ** getInitAddress()
Retrieve the address of the initializer expression.
Definition Decl.cpp:2434
DefinitionKind isThisDeclarationADefinition() const
Definition Decl.h:1308
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1569
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
Definition Decl.cpp:2947
TLSKind getTLSKind() const
Definition Decl.cpp:2180
@ DAK_Uninstantiated
Definition Decl.h:1003
bool hasInit() const
Definition Decl.cpp:2410
bool hasICEInitializer(const ASTContext &Context) const
Determine whether the initializer of this variable is an integer constant expression.
Definition Decl.cpp:2648
ParmVarDeclBitfields ParmVarDeclBits
Definition Decl.h:1124
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind hasDefinition() const
Definition Decl.h:1314
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition Decl.cpp:2133
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2202
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:2473
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:2269
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
Definition Decl.cpp:2874
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
Definition Decl.cpp:2848
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.h:1578
void setStorageClass(StorageClass SC)
Definition Decl.cpp:2175
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
Definition Decl.cpp:2456
APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition Decl.cpp:2587
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition Decl.h:1283
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:2169
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
Definition Decl.cpp:2726
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition Decl.h:1226
VarDeclBitfields VarDeclBits
Definition Decl.h:1123
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
Definition Decl.cpp:2889
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
Definition Decl.cpp:2660
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
Definition Decl.cpp:2253
unsigned AllBits
Definition Decl.h:1122
EvaluatedStmt * getEvaluatedStmt() const
Definition Decl.cpp:2583
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:2498
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition Decl.cpp:2569
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
Definition Decl.cpp:2784
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
Definition Decl.h:1342
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:2919
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition Decl.cpp:2863
bool checkForConstantInitialization(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the initializer of this variable to determine whether it's a constant initializer.
Definition Decl.cpp:2676
bool isInline() const
Whether this variable is (C++1z) inline.
Definition Decl.h:1551
const Expr * getInit() const
Definition Decl.h:1368
bool isNonEscapingByref() const
Indicates the capture is a __block variable that is never captured by an escaping block.
Definition Decl.cpp:2714
bool isInExternCContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C" linkage spec.
Definition Decl.cpp:2261
NonParmVarDeclBitfields NonParmVarDeclBits
Definition Decl.h:1125
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
Definition Decl.h:1217
InitType Init
The initializer for this variable or, for a ParmVarDecl, the C++ default argument.
Definition Decl.h:972
Redeclarable< VarDecl > redeclarable_base
Definition Decl.h:1132
APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or NULL if the value is not yet kn...
Definition Decl.cpp:2640
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
Definition Decl.cpp:2441
TLSKind
Kinds of thread-local storage.
Definition Decl.h:944
@ TLS_Static
TLS with a known-constant initializer.
Definition Decl.h:949
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition Decl.h:952
@ TLS_None
Not a TLS variable.
Definition Decl.h:946
void setInit(Expr *I)
Definition Decl.cpp:2489
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
Definition Decl.cpp:2357
@ TentativeDefinition
This declaration is a tentative definition.
Definition Decl.h:1298
@ DeclarationOnly
This declaration is only a declaration.
Definition Decl.h:1295
@ Definition
This declaration is definitely a definition.
Definition Decl.h:1301
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition Decl.cpp:2827
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
Definition Decl.cpp:2257
VarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass SC)
Definition Decl.cpp:2146
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition Decl.h:1229
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1168
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
Definition Decl.cpp:2710
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
Definition Decl.h:1476
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:2540
bool isInExternCXXContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C++" linkage spec.
Definition Decl.cpp:2265
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:2812
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
Definition Decl.cpp:2718
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Get the template specialization kind of this variable for the purposes of template instantiation.
Definition Decl.cpp:2802
VarDecl * getDefinition()
Definition Decl.h:1330
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:2791
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Definition Decl.h:1358
bool isKnownToBeDefined() const
Definition Decl.cpp:2831
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Definition Decl.cpp:2910
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:3974
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:212
@ 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:35
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:271
@ ICIS_NoInit
No in-class initializer.
Definition Specifiers.h:272
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:248
@ SC_Auto
Definition Specifiers.h:256
@ SC_PrivateExtern
Definition Specifiers.h:253
@ SC_Extern
Definition Specifiers.h:251
@ SC_Register
Definition Specifiers.h:257
@ SC_Static
Definition Specifiers.h:252
@ SC_None
Definition Specifiers.h:250
@ TSCS_thread_local
C++11 thread_local.
Definition Specifiers.h:241
@ TSCS_unspecified
Definition Specifiers.h:236
@ TSCS__Thread_local
C11 _Thread_local.
Definition Specifiers.h:244
@ TSCS___thread
GNU __thread.
Definition Specifiers.h:238
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ VisibleNone
No linkage according to the standard, but is visible from other translation units because of types de...
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
@ SD_Automatic
Automatic storage duration (most local variables).
Definition Specifiers.h:341
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:905
@ 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:6121
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:5939
@ Struct
The "struct" keyword.
Definition TypeBase.h:5941
@ Enum
The "enum" keyword.
Definition TypeBase.h:5953
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:585
bool isTypeAwareAllocation(TypeAwareAllocationMode Mode)
Definition ExprCXX.h:2254
@ CanPassInRegs
The argument of this type can be passed directly in registers.
Definition Decl.h:4306
bool isLegalForVariable(StorageClass SC)
Checks whether the given storage class is legal for variables.
Definition Specifiers.h:266
MultiVersionKind
Definition Decl.h:1979
bool isReservedAtGlobalScope(ReservedIdentifierStatus Status)
Determine whether an identifier is reserved for use as a name at global scope.
bool isExternalFormalLinkage(Linkage L)
Definition Linkage.h:117
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:206
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:202
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:198
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition Specifiers.h:194
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition Specifiers.h:191
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5928
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:6100
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:1726
@ Other
Other implicit parameter.
Definition Decl.h:1746
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:6114
#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:887
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition Decl.h:905
bool WasEvaluated
Whether this statement was already evaluated.
Definition Decl.h:889
bool CheckedForSideEffects
Definition Decl.h:913
bool CheckedForICEInit
Definition Decl.h:910
LazyDeclStmtPtr Value
Definition Decl.h:915
APValue Evaluated
Definition Decl.h:916
bool IsEvaluating
Whether this statement is being evaluated.
Definition Decl.h:892
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition Decl.h:898
bool HasICEInit
In C++98, whether the initializer is an ICE.
Definition Decl.h:909
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:2113
The parameters to pass to a usual operator delete.
Definition ExprCXX.h:2345
TypeAwareAllocationMode TypeAwareDelete
Definition ExprCXX.h:2346
AlignedAllocationMode Alignment
Definition ExprCXX.h:2349