1*0b57cec5SDimitry Andric //===- Decl.cpp - Declaration AST Node Implementation ---------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file implements the Decl subclasses. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #include "clang/AST/Decl.h" 14*0b57cec5SDimitry Andric #include "Linkage.h" 15*0b57cec5SDimitry Andric #include "clang/AST/ASTContext.h" 16*0b57cec5SDimitry Andric #include "clang/AST/ASTDiagnostic.h" 17*0b57cec5SDimitry Andric #include "clang/AST/ASTLambda.h" 18*0b57cec5SDimitry Andric #include "clang/AST/ASTMutationListener.h" 19*0b57cec5SDimitry Andric #include "clang/AST/CanonicalType.h" 20*0b57cec5SDimitry Andric #include "clang/AST/DeclBase.h" 21*0b57cec5SDimitry Andric #include "clang/AST/DeclCXX.h" 22*0b57cec5SDimitry Andric #include "clang/AST/DeclObjC.h" 23*0b57cec5SDimitry Andric #include "clang/AST/DeclOpenMP.h" 24*0b57cec5SDimitry Andric #include "clang/AST/DeclTemplate.h" 25*0b57cec5SDimitry Andric #include "clang/AST/DeclarationName.h" 26*0b57cec5SDimitry Andric #include "clang/AST/Expr.h" 27*0b57cec5SDimitry Andric #include "clang/AST/ExprCXX.h" 28*0b57cec5SDimitry Andric #include "clang/AST/ExternalASTSource.h" 29*0b57cec5SDimitry Andric #include "clang/AST/ODRHash.h" 30*0b57cec5SDimitry Andric #include "clang/AST/PrettyDeclStackTrace.h" 31*0b57cec5SDimitry Andric #include "clang/AST/PrettyPrinter.h" 32*0b57cec5SDimitry Andric #include "clang/AST/Redeclarable.h" 33*0b57cec5SDimitry Andric #include "clang/AST/Stmt.h" 34*0b57cec5SDimitry Andric #include "clang/AST/TemplateBase.h" 35*0b57cec5SDimitry Andric #include "clang/AST/Type.h" 36*0b57cec5SDimitry Andric #include "clang/AST/TypeLoc.h" 37*0b57cec5SDimitry Andric #include "clang/Basic/Builtins.h" 38*0b57cec5SDimitry Andric #include "clang/Basic/IdentifierTable.h" 39*0b57cec5SDimitry Andric #include "clang/Basic/LLVM.h" 40*0b57cec5SDimitry Andric #include "clang/Basic/LangOptions.h" 41*0b57cec5SDimitry Andric #include "clang/Basic/Linkage.h" 42*0b57cec5SDimitry Andric #include "clang/Basic/Module.h" 43*0b57cec5SDimitry Andric #include "clang/Basic/PartialDiagnostic.h" 44*0b57cec5SDimitry Andric #include "clang/Basic/SanitizerBlacklist.h" 45*0b57cec5SDimitry Andric #include "clang/Basic/Sanitizers.h" 46*0b57cec5SDimitry Andric #include "clang/Basic/SourceLocation.h" 47*0b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h" 48*0b57cec5SDimitry Andric #include "clang/Basic/Specifiers.h" 49*0b57cec5SDimitry Andric #include "clang/Basic/TargetCXXABI.h" 50*0b57cec5SDimitry Andric #include "clang/Basic/TargetInfo.h" 51*0b57cec5SDimitry Andric #include "clang/Basic/Visibility.h" 52*0b57cec5SDimitry Andric #include "llvm/ADT/APSInt.h" 53*0b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 54*0b57cec5SDimitry Andric #include "llvm/ADT/None.h" 55*0b57cec5SDimitry Andric #include "llvm/ADT/Optional.h" 56*0b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 57*0b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 58*0b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h" 59*0b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 60*0b57cec5SDimitry Andric #include "llvm/ADT/Triple.h" 61*0b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 62*0b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 63*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 64*0b57cec5SDimitry Andric #include <algorithm> 65*0b57cec5SDimitry Andric #include <cassert> 66*0b57cec5SDimitry Andric #include <cstddef> 67*0b57cec5SDimitry Andric #include <cstring> 68*0b57cec5SDimitry Andric #include <memory> 69*0b57cec5SDimitry Andric #include <string> 70*0b57cec5SDimitry Andric #include <tuple> 71*0b57cec5SDimitry Andric #include <type_traits> 72*0b57cec5SDimitry Andric 73*0b57cec5SDimitry Andric using namespace clang; 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric Decl *clang::getPrimaryMergedDecl(Decl *D) { 76*0b57cec5SDimitry Andric return D->getASTContext().getPrimaryMergedDecl(D); 77*0b57cec5SDimitry Andric } 78*0b57cec5SDimitry Andric 79*0b57cec5SDimitry Andric void PrettyDeclStackTraceEntry::print(raw_ostream &OS) const { 80*0b57cec5SDimitry Andric SourceLocation Loc = this->Loc; 81*0b57cec5SDimitry Andric if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation(); 82*0b57cec5SDimitry Andric if (Loc.isValid()) { 83*0b57cec5SDimitry Andric Loc.print(OS, Context.getSourceManager()); 84*0b57cec5SDimitry Andric OS << ": "; 85*0b57cec5SDimitry Andric } 86*0b57cec5SDimitry Andric OS << Message; 87*0b57cec5SDimitry Andric 88*0b57cec5SDimitry Andric if (auto *ND = dyn_cast_or_null<NamedDecl>(TheDecl)) { 89*0b57cec5SDimitry Andric OS << " '"; 90*0b57cec5SDimitry Andric ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), true); 91*0b57cec5SDimitry Andric OS << "'"; 92*0b57cec5SDimitry Andric } 93*0b57cec5SDimitry Andric 94*0b57cec5SDimitry Andric OS << '\n'; 95*0b57cec5SDimitry Andric } 96*0b57cec5SDimitry Andric 97*0b57cec5SDimitry Andric // Defined here so that it can be inlined into its direct callers. 98*0b57cec5SDimitry Andric bool Decl::isOutOfLine() const { 99*0b57cec5SDimitry Andric return !getLexicalDeclContext()->Equals(getDeclContext()); 100*0b57cec5SDimitry Andric } 101*0b57cec5SDimitry Andric 102*0b57cec5SDimitry Andric TranslationUnitDecl::TranslationUnitDecl(ASTContext &ctx) 103*0b57cec5SDimitry Andric : Decl(TranslationUnit, nullptr, SourceLocation()), 104*0b57cec5SDimitry Andric DeclContext(TranslationUnit), Ctx(ctx) {} 105*0b57cec5SDimitry Andric 106*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 107*0b57cec5SDimitry Andric // NamedDecl Implementation 108*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 109*0b57cec5SDimitry Andric 110*0b57cec5SDimitry Andric // Visibility rules aren't rigorously externally specified, but here 111*0b57cec5SDimitry Andric // are the basic principles behind what we implement: 112*0b57cec5SDimitry Andric // 113*0b57cec5SDimitry Andric // 1. An explicit visibility attribute is generally a direct expression 114*0b57cec5SDimitry Andric // of the user's intent and should be honored. Only the innermost 115*0b57cec5SDimitry Andric // visibility attribute applies. If no visibility attribute applies, 116*0b57cec5SDimitry Andric // global visibility settings are considered. 117*0b57cec5SDimitry Andric // 118*0b57cec5SDimitry Andric // 2. There is one caveat to the above: on or in a template pattern, 119*0b57cec5SDimitry Andric // an explicit visibility attribute is just a default rule, and 120*0b57cec5SDimitry Andric // visibility can be decreased by the visibility of template 121*0b57cec5SDimitry Andric // arguments. But this, too, has an exception: an attribute on an 122*0b57cec5SDimitry Andric // explicit specialization or instantiation causes all the visibility 123*0b57cec5SDimitry Andric // restrictions of the template arguments to be ignored. 124*0b57cec5SDimitry Andric // 125*0b57cec5SDimitry Andric // 3. A variable that does not otherwise have explicit visibility can 126*0b57cec5SDimitry Andric // be restricted by the visibility of its type. 127*0b57cec5SDimitry Andric // 128*0b57cec5SDimitry Andric // 4. A visibility restriction is explicit if it comes from an 129*0b57cec5SDimitry Andric // attribute (or something like it), not a global visibility setting. 130*0b57cec5SDimitry Andric // When emitting a reference to an external symbol, visibility 131*0b57cec5SDimitry Andric // restrictions are ignored unless they are explicit. 132*0b57cec5SDimitry Andric // 133*0b57cec5SDimitry Andric // 5. When computing the visibility of a non-type, including a 134*0b57cec5SDimitry Andric // non-type member of a class, only non-type visibility restrictions 135*0b57cec5SDimitry Andric // are considered: the 'visibility' attribute, global value-visibility 136*0b57cec5SDimitry Andric // settings, and a few special cases like __private_extern. 137*0b57cec5SDimitry Andric // 138*0b57cec5SDimitry Andric // 6. When computing the visibility of a type, including a type member 139*0b57cec5SDimitry Andric // of a class, only type visibility restrictions are considered: 140*0b57cec5SDimitry Andric // the 'type_visibility' attribute and global type-visibility settings. 141*0b57cec5SDimitry Andric // However, a 'visibility' attribute counts as a 'type_visibility' 142*0b57cec5SDimitry Andric // attribute on any declaration that only has the former. 143*0b57cec5SDimitry Andric // 144*0b57cec5SDimitry Andric // The visibility of a "secondary" entity, like a template argument, 145*0b57cec5SDimitry Andric // is computed using the kind of that entity, not the kind of the 146*0b57cec5SDimitry Andric // primary entity for which we are computing visibility. For example, 147*0b57cec5SDimitry Andric // the visibility of a specialization of either of these templates: 148*0b57cec5SDimitry Andric // template <class T, bool (&compare)(T, X)> bool has_match(list<T>, X); 149*0b57cec5SDimitry Andric // template <class T, bool (&compare)(T, X)> class matcher; 150*0b57cec5SDimitry Andric // is restricted according to the type visibility of the argument 'T', 151*0b57cec5SDimitry Andric // the type visibility of 'bool(&)(T,X)', and the value visibility of 152*0b57cec5SDimitry Andric // the argument function 'compare'. That 'has_match' is a value 153*0b57cec5SDimitry Andric // and 'matcher' is a type only matters when looking for attributes 154*0b57cec5SDimitry Andric // and settings from the immediate context. 155*0b57cec5SDimitry Andric 156*0b57cec5SDimitry Andric /// Does this computation kind permit us to consider additional 157*0b57cec5SDimitry Andric /// visibility settings from attributes and the like? 158*0b57cec5SDimitry Andric static bool hasExplicitVisibilityAlready(LVComputationKind computation) { 159*0b57cec5SDimitry Andric return computation.IgnoreExplicitVisibility; 160*0b57cec5SDimitry Andric } 161*0b57cec5SDimitry Andric 162*0b57cec5SDimitry Andric /// Given an LVComputationKind, return one of the same type/value sort 163*0b57cec5SDimitry Andric /// that records that it already has explicit visibility. 164*0b57cec5SDimitry Andric static LVComputationKind 165*0b57cec5SDimitry Andric withExplicitVisibilityAlready(LVComputationKind Kind) { 166*0b57cec5SDimitry Andric Kind.IgnoreExplicitVisibility = true; 167*0b57cec5SDimitry Andric return Kind; 168*0b57cec5SDimitry Andric } 169*0b57cec5SDimitry Andric 170*0b57cec5SDimitry Andric static Optional<Visibility> getExplicitVisibility(const NamedDecl *D, 171*0b57cec5SDimitry Andric LVComputationKind kind) { 172*0b57cec5SDimitry Andric assert(!kind.IgnoreExplicitVisibility && 173*0b57cec5SDimitry Andric "asking for explicit visibility when we shouldn't be"); 174*0b57cec5SDimitry Andric return D->getExplicitVisibility(kind.getExplicitVisibilityKind()); 175*0b57cec5SDimitry Andric } 176*0b57cec5SDimitry Andric 177*0b57cec5SDimitry Andric /// Is the given declaration a "type" or a "value" for the purposes of 178*0b57cec5SDimitry Andric /// visibility computation? 179*0b57cec5SDimitry Andric static bool usesTypeVisibility(const NamedDecl *D) { 180*0b57cec5SDimitry Andric return isa<TypeDecl>(D) || 181*0b57cec5SDimitry Andric isa<ClassTemplateDecl>(D) || 182*0b57cec5SDimitry Andric isa<ObjCInterfaceDecl>(D); 183*0b57cec5SDimitry Andric } 184*0b57cec5SDimitry Andric 185*0b57cec5SDimitry Andric /// Does the given declaration have member specialization information, 186*0b57cec5SDimitry Andric /// and if so, is it an explicit specialization? 187*0b57cec5SDimitry Andric template <class T> static typename 188*0b57cec5SDimitry Andric std::enable_if<!std::is_base_of<RedeclarableTemplateDecl, T>::value, bool>::type 189*0b57cec5SDimitry Andric isExplicitMemberSpecialization(const T *D) { 190*0b57cec5SDimitry Andric if (const MemberSpecializationInfo *member = 191*0b57cec5SDimitry Andric D->getMemberSpecializationInfo()) { 192*0b57cec5SDimitry Andric return member->isExplicitSpecialization(); 193*0b57cec5SDimitry Andric } 194*0b57cec5SDimitry Andric return false; 195*0b57cec5SDimitry Andric } 196*0b57cec5SDimitry Andric 197*0b57cec5SDimitry Andric /// For templates, this question is easier: a member template can't be 198*0b57cec5SDimitry Andric /// explicitly instantiated, so there's a single bit indicating whether 199*0b57cec5SDimitry Andric /// or not this is an explicit member specialization. 200*0b57cec5SDimitry Andric static bool isExplicitMemberSpecialization(const RedeclarableTemplateDecl *D) { 201*0b57cec5SDimitry Andric return D->isMemberSpecialization(); 202*0b57cec5SDimitry Andric } 203*0b57cec5SDimitry Andric 204*0b57cec5SDimitry Andric /// Given a visibility attribute, return the explicit visibility 205*0b57cec5SDimitry Andric /// associated with it. 206*0b57cec5SDimitry Andric template <class T> 207*0b57cec5SDimitry Andric static Visibility getVisibilityFromAttr(const T *attr) { 208*0b57cec5SDimitry Andric switch (attr->getVisibility()) { 209*0b57cec5SDimitry Andric case T::Default: 210*0b57cec5SDimitry Andric return DefaultVisibility; 211*0b57cec5SDimitry Andric case T::Hidden: 212*0b57cec5SDimitry Andric return HiddenVisibility; 213*0b57cec5SDimitry Andric case T::Protected: 214*0b57cec5SDimitry Andric return ProtectedVisibility; 215*0b57cec5SDimitry Andric } 216*0b57cec5SDimitry Andric llvm_unreachable("bad visibility kind"); 217*0b57cec5SDimitry Andric } 218*0b57cec5SDimitry Andric 219*0b57cec5SDimitry Andric /// Return the explicit visibility of the given declaration. 220*0b57cec5SDimitry Andric static Optional<Visibility> getVisibilityOf(const NamedDecl *D, 221*0b57cec5SDimitry Andric NamedDecl::ExplicitVisibilityKind kind) { 222*0b57cec5SDimitry Andric // If we're ultimately computing the visibility of a type, look for 223*0b57cec5SDimitry Andric // a 'type_visibility' attribute before looking for 'visibility'. 224*0b57cec5SDimitry Andric if (kind == NamedDecl::VisibilityForType) { 225*0b57cec5SDimitry Andric if (const auto *A = D->getAttr<TypeVisibilityAttr>()) { 226*0b57cec5SDimitry Andric return getVisibilityFromAttr(A); 227*0b57cec5SDimitry Andric } 228*0b57cec5SDimitry Andric } 229*0b57cec5SDimitry Andric 230*0b57cec5SDimitry Andric // If this declaration has an explicit visibility attribute, use it. 231*0b57cec5SDimitry Andric if (const auto *A = D->getAttr<VisibilityAttr>()) { 232*0b57cec5SDimitry Andric return getVisibilityFromAttr(A); 233*0b57cec5SDimitry Andric } 234*0b57cec5SDimitry Andric 235*0b57cec5SDimitry Andric return None; 236*0b57cec5SDimitry Andric } 237*0b57cec5SDimitry Andric 238*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::getLVForType(const Type &T, 239*0b57cec5SDimitry Andric LVComputationKind computation) { 240*0b57cec5SDimitry Andric if (computation.IgnoreAllVisibility) 241*0b57cec5SDimitry Andric return LinkageInfo(T.getLinkage(), DefaultVisibility, true); 242*0b57cec5SDimitry Andric return getTypeLinkageAndVisibility(&T); 243*0b57cec5SDimitry Andric } 244*0b57cec5SDimitry Andric 245*0b57cec5SDimitry Andric /// Get the most restrictive linkage for the types in the given 246*0b57cec5SDimitry Andric /// template parameter list. For visibility purposes, template 247*0b57cec5SDimitry Andric /// parameters are part of the signature of a template. 248*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::getLVForTemplateParameterList( 249*0b57cec5SDimitry Andric const TemplateParameterList *Params, LVComputationKind computation) { 250*0b57cec5SDimitry Andric LinkageInfo LV; 251*0b57cec5SDimitry Andric for (const NamedDecl *P : *Params) { 252*0b57cec5SDimitry Andric // Template type parameters are the most common and never 253*0b57cec5SDimitry Andric // contribute to visibility, pack or not. 254*0b57cec5SDimitry Andric if (isa<TemplateTypeParmDecl>(P)) 255*0b57cec5SDimitry Andric continue; 256*0b57cec5SDimitry Andric 257*0b57cec5SDimitry Andric // Non-type template parameters can be restricted by the value type, e.g. 258*0b57cec5SDimitry Andric // template <enum X> class A { ... }; 259*0b57cec5SDimitry Andric // We have to be careful here, though, because we can be dealing with 260*0b57cec5SDimitry Andric // dependent types. 261*0b57cec5SDimitry Andric if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) { 262*0b57cec5SDimitry Andric // Handle the non-pack case first. 263*0b57cec5SDimitry Andric if (!NTTP->isExpandedParameterPack()) { 264*0b57cec5SDimitry Andric if (!NTTP->getType()->isDependentType()) { 265*0b57cec5SDimitry Andric LV.merge(getLVForType(*NTTP->getType(), computation)); 266*0b57cec5SDimitry Andric } 267*0b57cec5SDimitry Andric continue; 268*0b57cec5SDimitry Andric } 269*0b57cec5SDimitry Andric 270*0b57cec5SDimitry Andric // Look at all the types in an expanded pack. 271*0b57cec5SDimitry Andric for (unsigned i = 0, n = NTTP->getNumExpansionTypes(); i != n; ++i) { 272*0b57cec5SDimitry Andric QualType type = NTTP->getExpansionType(i); 273*0b57cec5SDimitry Andric if (!type->isDependentType()) 274*0b57cec5SDimitry Andric LV.merge(getTypeLinkageAndVisibility(type)); 275*0b57cec5SDimitry Andric } 276*0b57cec5SDimitry Andric continue; 277*0b57cec5SDimitry Andric } 278*0b57cec5SDimitry Andric 279*0b57cec5SDimitry Andric // Template template parameters can be restricted by their 280*0b57cec5SDimitry Andric // template parameters, recursively. 281*0b57cec5SDimitry Andric const auto *TTP = cast<TemplateTemplateParmDecl>(P); 282*0b57cec5SDimitry Andric 283*0b57cec5SDimitry Andric // Handle the non-pack case first. 284*0b57cec5SDimitry Andric if (!TTP->isExpandedParameterPack()) { 285*0b57cec5SDimitry Andric LV.merge(getLVForTemplateParameterList(TTP->getTemplateParameters(), 286*0b57cec5SDimitry Andric computation)); 287*0b57cec5SDimitry Andric continue; 288*0b57cec5SDimitry Andric } 289*0b57cec5SDimitry Andric 290*0b57cec5SDimitry Andric // Look at all expansions in an expanded pack. 291*0b57cec5SDimitry Andric for (unsigned i = 0, n = TTP->getNumExpansionTemplateParameters(); 292*0b57cec5SDimitry Andric i != n; ++i) { 293*0b57cec5SDimitry Andric LV.merge(getLVForTemplateParameterList( 294*0b57cec5SDimitry Andric TTP->getExpansionTemplateParameters(i), computation)); 295*0b57cec5SDimitry Andric } 296*0b57cec5SDimitry Andric } 297*0b57cec5SDimitry Andric 298*0b57cec5SDimitry Andric return LV; 299*0b57cec5SDimitry Andric } 300*0b57cec5SDimitry Andric 301*0b57cec5SDimitry Andric static const Decl *getOutermostFuncOrBlockContext(const Decl *D) { 302*0b57cec5SDimitry Andric const Decl *Ret = nullptr; 303*0b57cec5SDimitry Andric const DeclContext *DC = D->getDeclContext(); 304*0b57cec5SDimitry Andric while (DC->getDeclKind() != Decl::TranslationUnit) { 305*0b57cec5SDimitry Andric if (isa<FunctionDecl>(DC) || isa<BlockDecl>(DC)) 306*0b57cec5SDimitry Andric Ret = cast<Decl>(DC); 307*0b57cec5SDimitry Andric DC = DC->getParent(); 308*0b57cec5SDimitry Andric } 309*0b57cec5SDimitry Andric return Ret; 310*0b57cec5SDimitry Andric } 311*0b57cec5SDimitry Andric 312*0b57cec5SDimitry Andric /// Get the most restrictive linkage for the types and 313*0b57cec5SDimitry Andric /// declarations in the given template argument list. 314*0b57cec5SDimitry Andric /// 315*0b57cec5SDimitry Andric /// Note that we don't take an LVComputationKind because we always 316*0b57cec5SDimitry Andric /// want to honor the visibility of template arguments in the same way. 317*0b57cec5SDimitry Andric LinkageInfo 318*0b57cec5SDimitry Andric LinkageComputer::getLVForTemplateArgumentList(ArrayRef<TemplateArgument> Args, 319*0b57cec5SDimitry Andric LVComputationKind computation) { 320*0b57cec5SDimitry Andric LinkageInfo LV; 321*0b57cec5SDimitry Andric 322*0b57cec5SDimitry Andric for (const TemplateArgument &Arg : Args) { 323*0b57cec5SDimitry Andric switch (Arg.getKind()) { 324*0b57cec5SDimitry Andric case TemplateArgument::Null: 325*0b57cec5SDimitry Andric case TemplateArgument::Integral: 326*0b57cec5SDimitry Andric case TemplateArgument::Expression: 327*0b57cec5SDimitry Andric continue; 328*0b57cec5SDimitry Andric 329*0b57cec5SDimitry Andric case TemplateArgument::Type: 330*0b57cec5SDimitry Andric LV.merge(getLVForType(*Arg.getAsType(), computation)); 331*0b57cec5SDimitry Andric continue; 332*0b57cec5SDimitry Andric 333*0b57cec5SDimitry Andric case TemplateArgument::Declaration: { 334*0b57cec5SDimitry Andric const NamedDecl *ND = Arg.getAsDecl(); 335*0b57cec5SDimitry Andric assert(!usesTypeVisibility(ND)); 336*0b57cec5SDimitry Andric LV.merge(getLVForDecl(ND, computation)); 337*0b57cec5SDimitry Andric continue; 338*0b57cec5SDimitry Andric } 339*0b57cec5SDimitry Andric 340*0b57cec5SDimitry Andric case TemplateArgument::NullPtr: 341*0b57cec5SDimitry Andric LV.merge(getTypeLinkageAndVisibility(Arg.getNullPtrType())); 342*0b57cec5SDimitry Andric continue; 343*0b57cec5SDimitry Andric 344*0b57cec5SDimitry Andric case TemplateArgument::Template: 345*0b57cec5SDimitry Andric case TemplateArgument::TemplateExpansion: 346*0b57cec5SDimitry Andric if (TemplateDecl *Template = 347*0b57cec5SDimitry Andric Arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) 348*0b57cec5SDimitry Andric LV.merge(getLVForDecl(Template, computation)); 349*0b57cec5SDimitry Andric continue; 350*0b57cec5SDimitry Andric 351*0b57cec5SDimitry Andric case TemplateArgument::Pack: 352*0b57cec5SDimitry Andric LV.merge(getLVForTemplateArgumentList(Arg.getPackAsArray(), computation)); 353*0b57cec5SDimitry Andric continue; 354*0b57cec5SDimitry Andric } 355*0b57cec5SDimitry Andric llvm_unreachable("bad template argument kind"); 356*0b57cec5SDimitry Andric } 357*0b57cec5SDimitry Andric 358*0b57cec5SDimitry Andric return LV; 359*0b57cec5SDimitry Andric } 360*0b57cec5SDimitry Andric 361*0b57cec5SDimitry Andric LinkageInfo 362*0b57cec5SDimitry Andric LinkageComputer::getLVForTemplateArgumentList(const TemplateArgumentList &TArgs, 363*0b57cec5SDimitry Andric LVComputationKind computation) { 364*0b57cec5SDimitry Andric return getLVForTemplateArgumentList(TArgs.asArray(), computation); 365*0b57cec5SDimitry Andric } 366*0b57cec5SDimitry Andric 367*0b57cec5SDimitry Andric static bool shouldConsiderTemplateVisibility(const FunctionDecl *fn, 368*0b57cec5SDimitry Andric const FunctionTemplateSpecializationInfo *specInfo) { 369*0b57cec5SDimitry Andric // Include visibility from the template parameters and arguments 370*0b57cec5SDimitry Andric // only if this is not an explicit instantiation or specialization 371*0b57cec5SDimitry Andric // with direct explicit visibility. (Implicit instantiations won't 372*0b57cec5SDimitry Andric // have a direct attribute.) 373*0b57cec5SDimitry Andric if (!specInfo->isExplicitInstantiationOrSpecialization()) 374*0b57cec5SDimitry Andric return true; 375*0b57cec5SDimitry Andric 376*0b57cec5SDimitry Andric return !fn->hasAttr<VisibilityAttr>(); 377*0b57cec5SDimitry Andric } 378*0b57cec5SDimitry Andric 379*0b57cec5SDimitry Andric /// Merge in template-related linkage and visibility for the given 380*0b57cec5SDimitry Andric /// function template specialization. 381*0b57cec5SDimitry Andric /// 382*0b57cec5SDimitry Andric /// We don't need a computation kind here because we can assume 383*0b57cec5SDimitry Andric /// LVForValue. 384*0b57cec5SDimitry Andric /// 385*0b57cec5SDimitry Andric /// \param[out] LV the computation to use for the parent 386*0b57cec5SDimitry Andric void LinkageComputer::mergeTemplateLV( 387*0b57cec5SDimitry Andric LinkageInfo &LV, const FunctionDecl *fn, 388*0b57cec5SDimitry Andric const FunctionTemplateSpecializationInfo *specInfo, 389*0b57cec5SDimitry Andric LVComputationKind computation) { 390*0b57cec5SDimitry Andric bool considerVisibility = 391*0b57cec5SDimitry Andric shouldConsiderTemplateVisibility(fn, specInfo); 392*0b57cec5SDimitry Andric 393*0b57cec5SDimitry Andric // Merge information from the template parameters. 394*0b57cec5SDimitry Andric FunctionTemplateDecl *temp = specInfo->getTemplate(); 395*0b57cec5SDimitry Andric LinkageInfo tempLV = 396*0b57cec5SDimitry Andric getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 397*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(tempLV, considerVisibility); 398*0b57cec5SDimitry Andric 399*0b57cec5SDimitry Andric // Merge information from the template arguments. 400*0b57cec5SDimitry Andric const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments; 401*0b57cec5SDimitry Andric LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation); 402*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(argsLV, considerVisibility); 403*0b57cec5SDimitry Andric } 404*0b57cec5SDimitry Andric 405*0b57cec5SDimitry Andric /// Does the given declaration have a direct visibility attribute 406*0b57cec5SDimitry Andric /// that would match the given rules? 407*0b57cec5SDimitry Andric static bool hasDirectVisibilityAttribute(const NamedDecl *D, 408*0b57cec5SDimitry Andric LVComputationKind computation) { 409*0b57cec5SDimitry Andric if (computation.IgnoreAllVisibility) 410*0b57cec5SDimitry Andric return false; 411*0b57cec5SDimitry Andric 412*0b57cec5SDimitry Andric return (computation.isTypeVisibility() && D->hasAttr<TypeVisibilityAttr>()) || 413*0b57cec5SDimitry Andric D->hasAttr<VisibilityAttr>(); 414*0b57cec5SDimitry Andric } 415*0b57cec5SDimitry Andric 416*0b57cec5SDimitry Andric /// Should we consider visibility associated with the template 417*0b57cec5SDimitry Andric /// arguments and parameters of the given class template specialization? 418*0b57cec5SDimitry Andric static bool shouldConsiderTemplateVisibility( 419*0b57cec5SDimitry Andric const ClassTemplateSpecializationDecl *spec, 420*0b57cec5SDimitry Andric LVComputationKind computation) { 421*0b57cec5SDimitry Andric // Include visibility from the template parameters and arguments 422*0b57cec5SDimitry Andric // only if this is not an explicit instantiation or specialization 423*0b57cec5SDimitry Andric // with direct explicit visibility (and note that implicit 424*0b57cec5SDimitry Andric // instantiations won't have a direct attribute). 425*0b57cec5SDimitry Andric // 426*0b57cec5SDimitry Andric // Furthermore, we want to ignore template parameters and arguments 427*0b57cec5SDimitry Andric // for an explicit specialization when computing the visibility of a 428*0b57cec5SDimitry Andric // member thereof with explicit visibility. 429*0b57cec5SDimitry Andric // 430*0b57cec5SDimitry Andric // This is a bit complex; let's unpack it. 431*0b57cec5SDimitry Andric // 432*0b57cec5SDimitry Andric // An explicit class specialization is an independent, top-level 433*0b57cec5SDimitry Andric // declaration. As such, if it or any of its members has an 434*0b57cec5SDimitry Andric // explicit visibility attribute, that must directly express the 435*0b57cec5SDimitry Andric // user's intent, and we should honor it. The same logic applies to 436*0b57cec5SDimitry Andric // an explicit instantiation of a member of such a thing. 437*0b57cec5SDimitry Andric 438*0b57cec5SDimitry Andric // Fast path: if this is not an explicit instantiation or 439*0b57cec5SDimitry Andric // specialization, we always want to consider template-related 440*0b57cec5SDimitry Andric // visibility restrictions. 441*0b57cec5SDimitry Andric if (!spec->isExplicitInstantiationOrSpecialization()) 442*0b57cec5SDimitry Andric return true; 443*0b57cec5SDimitry Andric 444*0b57cec5SDimitry Andric // This is the 'member thereof' check. 445*0b57cec5SDimitry Andric if (spec->isExplicitSpecialization() && 446*0b57cec5SDimitry Andric hasExplicitVisibilityAlready(computation)) 447*0b57cec5SDimitry Andric return false; 448*0b57cec5SDimitry Andric 449*0b57cec5SDimitry Andric return !hasDirectVisibilityAttribute(spec, computation); 450*0b57cec5SDimitry Andric } 451*0b57cec5SDimitry Andric 452*0b57cec5SDimitry Andric /// Merge in template-related linkage and visibility for the given 453*0b57cec5SDimitry Andric /// class template specialization. 454*0b57cec5SDimitry Andric void LinkageComputer::mergeTemplateLV( 455*0b57cec5SDimitry Andric LinkageInfo &LV, const ClassTemplateSpecializationDecl *spec, 456*0b57cec5SDimitry Andric LVComputationKind computation) { 457*0b57cec5SDimitry Andric bool considerVisibility = shouldConsiderTemplateVisibility(spec, computation); 458*0b57cec5SDimitry Andric 459*0b57cec5SDimitry Andric // Merge information from the template parameters, but ignore 460*0b57cec5SDimitry Andric // visibility if we're only considering template arguments. 461*0b57cec5SDimitry Andric 462*0b57cec5SDimitry Andric ClassTemplateDecl *temp = spec->getSpecializedTemplate(); 463*0b57cec5SDimitry Andric LinkageInfo tempLV = 464*0b57cec5SDimitry Andric getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 465*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(tempLV, 466*0b57cec5SDimitry Andric considerVisibility && !hasExplicitVisibilityAlready(computation)); 467*0b57cec5SDimitry Andric 468*0b57cec5SDimitry Andric // Merge information from the template arguments. We ignore 469*0b57cec5SDimitry Andric // template-argument visibility if we've got an explicit 470*0b57cec5SDimitry Andric // instantiation with a visibility attribute. 471*0b57cec5SDimitry Andric const TemplateArgumentList &templateArgs = spec->getTemplateArgs(); 472*0b57cec5SDimitry Andric LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation); 473*0b57cec5SDimitry Andric if (considerVisibility) 474*0b57cec5SDimitry Andric LV.mergeVisibility(argsLV); 475*0b57cec5SDimitry Andric LV.mergeExternalVisibility(argsLV); 476*0b57cec5SDimitry Andric } 477*0b57cec5SDimitry Andric 478*0b57cec5SDimitry Andric /// Should we consider visibility associated with the template 479*0b57cec5SDimitry Andric /// arguments and parameters of the given variable template 480*0b57cec5SDimitry Andric /// specialization? As usual, follow class template specialization 481*0b57cec5SDimitry Andric /// logic up to initialization. 482*0b57cec5SDimitry Andric static bool shouldConsiderTemplateVisibility( 483*0b57cec5SDimitry Andric const VarTemplateSpecializationDecl *spec, 484*0b57cec5SDimitry Andric LVComputationKind computation) { 485*0b57cec5SDimitry Andric // Include visibility from the template parameters and arguments 486*0b57cec5SDimitry Andric // only if this is not an explicit instantiation or specialization 487*0b57cec5SDimitry Andric // with direct explicit visibility (and note that implicit 488*0b57cec5SDimitry Andric // instantiations won't have a direct attribute). 489*0b57cec5SDimitry Andric if (!spec->isExplicitInstantiationOrSpecialization()) 490*0b57cec5SDimitry Andric return true; 491*0b57cec5SDimitry Andric 492*0b57cec5SDimitry Andric // An explicit variable specialization is an independent, top-level 493*0b57cec5SDimitry Andric // declaration. As such, if it has an explicit visibility attribute, 494*0b57cec5SDimitry Andric // that must directly express the user's intent, and we should honor 495*0b57cec5SDimitry Andric // it. 496*0b57cec5SDimitry Andric if (spec->isExplicitSpecialization() && 497*0b57cec5SDimitry Andric hasExplicitVisibilityAlready(computation)) 498*0b57cec5SDimitry Andric return false; 499*0b57cec5SDimitry Andric 500*0b57cec5SDimitry Andric return !hasDirectVisibilityAttribute(spec, computation); 501*0b57cec5SDimitry Andric } 502*0b57cec5SDimitry Andric 503*0b57cec5SDimitry Andric /// Merge in template-related linkage and visibility for the given 504*0b57cec5SDimitry Andric /// variable template specialization. As usual, follow class template 505*0b57cec5SDimitry Andric /// specialization logic up to initialization. 506*0b57cec5SDimitry Andric void LinkageComputer::mergeTemplateLV(LinkageInfo &LV, 507*0b57cec5SDimitry Andric const VarTemplateSpecializationDecl *spec, 508*0b57cec5SDimitry Andric LVComputationKind computation) { 509*0b57cec5SDimitry Andric bool considerVisibility = shouldConsiderTemplateVisibility(spec, computation); 510*0b57cec5SDimitry Andric 511*0b57cec5SDimitry Andric // Merge information from the template parameters, but ignore 512*0b57cec5SDimitry Andric // visibility if we're only considering template arguments. 513*0b57cec5SDimitry Andric 514*0b57cec5SDimitry Andric VarTemplateDecl *temp = spec->getSpecializedTemplate(); 515*0b57cec5SDimitry Andric LinkageInfo tempLV = 516*0b57cec5SDimitry Andric getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 517*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(tempLV, 518*0b57cec5SDimitry Andric considerVisibility && !hasExplicitVisibilityAlready(computation)); 519*0b57cec5SDimitry Andric 520*0b57cec5SDimitry Andric // Merge information from the template arguments. We ignore 521*0b57cec5SDimitry Andric // template-argument visibility if we've got an explicit 522*0b57cec5SDimitry Andric // instantiation with a visibility attribute. 523*0b57cec5SDimitry Andric const TemplateArgumentList &templateArgs = spec->getTemplateArgs(); 524*0b57cec5SDimitry Andric LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation); 525*0b57cec5SDimitry Andric if (considerVisibility) 526*0b57cec5SDimitry Andric LV.mergeVisibility(argsLV); 527*0b57cec5SDimitry Andric LV.mergeExternalVisibility(argsLV); 528*0b57cec5SDimitry Andric } 529*0b57cec5SDimitry Andric 530*0b57cec5SDimitry Andric static bool useInlineVisibilityHidden(const NamedDecl *D) { 531*0b57cec5SDimitry Andric // FIXME: we should warn if -fvisibility-inlines-hidden is used with c. 532*0b57cec5SDimitry Andric const LangOptions &Opts = D->getASTContext().getLangOpts(); 533*0b57cec5SDimitry Andric if (!Opts.CPlusPlus || !Opts.InlineVisibilityHidden) 534*0b57cec5SDimitry Andric return false; 535*0b57cec5SDimitry Andric 536*0b57cec5SDimitry Andric const auto *FD = dyn_cast<FunctionDecl>(D); 537*0b57cec5SDimitry Andric if (!FD) 538*0b57cec5SDimitry Andric return false; 539*0b57cec5SDimitry Andric 540*0b57cec5SDimitry Andric TemplateSpecializationKind TSK = TSK_Undeclared; 541*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *spec 542*0b57cec5SDimitry Andric = FD->getTemplateSpecializationInfo()) { 543*0b57cec5SDimitry Andric TSK = spec->getTemplateSpecializationKind(); 544*0b57cec5SDimitry Andric } else if (MemberSpecializationInfo *MSI = 545*0b57cec5SDimitry Andric FD->getMemberSpecializationInfo()) { 546*0b57cec5SDimitry Andric TSK = MSI->getTemplateSpecializationKind(); 547*0b57cec5SDimitry Andric } 548*0b57cec5SDimitry Andric 549*0b57cec5SDimitry Andric const FunctionDecl *Def = nullptr; 550*0b57cec5SDimitry Andric // InlineVisibilityHidden only applies to definitions, and 551*0b57cec5SDimitry Andric // isInlined() only gives meaningful answers on definitions 552*0b57cec5SDimitry Andric // anyway. 553*0b57cec5SDimitry Andric return TSK != TSK_ExplicitInstantiationDeclaration && 554*0b57cec5SDimitry Andric TSK != TSK_ExplicitInstantiationDefinition && 555*0b57cec5SDimitry Andric FD->hasBody(Def) && Def->isInlined() && !Def->hasAttr<GNUInlineAttr>(); 556*0b57cec5SDimitry Andric } 557*0b57cec5SDimitry Andric 558*0b57cec5SDimitry Andric template <typename T> static bool isFirstInExternCContext(T *D) { 559*0b57cec5SDimitry Andric const T *First = D->getFirstDecl(); 560*0b57cec5SDimitry Andric return First->isInExternCContext(); 561*0b57cec5SDimitry Andric } 562*0b57cec5SDimitry Andric 563*0b57cec5SDimitry Andric static bool isSingleLineLanguageLinkage(const Decl &D) { 564*0b57cec5SDimitry Andric if (const auto *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext())) 565*0b57cec5SDimitry Andric if (!SD->hasBraces()) 566*0b57cec5SDimitry Andric return true; 567*0b57cec5SDimitry Andric return false; 568*0b57cec5SDimitry Andric } 569*0b57cec5SDimitry Andric 570*0b57cec5SDimitry Andric /// Determine whether D is declared in the purview of a named module. 571*0b57cec5SDimitry Andric static bool isInModulePurview(const NamedDecl *D) { 572*0b57cec5SDimitry Andric if (auto *M = D->getOwningModule()) 573*0b57cec5SDimitry Andric return M->isModulePurview(); 574*0b57cec5SDimitry Andric return false; 575*0b57cec5SDimitry Andric } 576*0b57cec5SDimitry Andric 577*0b57cec5SDimitry Andric static bool isExportedFromModuleInterfaceUnit(const NamedDecl *D) { 578*0b57cec5SDimitry Andric // FIXME: Handle isModulePrivate. 579*0b57cec5SDimitry Andric switch (D->getModuleOwnershipKind()) { 580*0b57cec5SDimitry Andric case Decl::ModuleOwnershipKind::Unowned: 581*0b57cec5SDimitry Andric case Decl::ModuleOwnershipKind::ModulePrivate: 582*0b57cec5SDimitry Andric return false; 583*0b57cec5SDimitry Andric case Decl::ModuleOwnershipKind::Visible: 584*0b57cec5SDimitry Andric case Decl::ModuleOwnershipKind::VisibleWhenImported: 585*0b57cec5SDimitry Andric return isInModulePurview(D); 586*0b57cec5SDimitry Andric } 587*0b57cec5SDimitry Andric llvm_unreachable("unexpected module ownership kind"); 588*0b57cec5SDimitry Andric } 589*0b57cec5SDimitry Andric 590*0b57cec5SDimitry Andric static LinkageInfo getInternalLinkageFor(const NamedDecl *D) { 591*0b57cec5SDimitry Andric // Internal linkage declarations within a module interface unit are modeled 592*0b57cec5SDimitry Andric // as "module-internal linkage", which means that they have internal linkage 593*0b57cec5SDimitry Andric // formally but can be indirectly accessed from outside the module via inline 594*0b57cec5SDimitry Andric // functions and templates defined within the module. 595*0b57cec5SDimitry Andric if (isInModulePurview(D)) 596*0b57cec5SDimitry Andric return LinkageInfo(ModuleInternalLinkage, DefaultVisibility, false); 597*0b57cec5SDimitry Andric 598*0b57cec5SDimitry Andric return LinkageInfo::internal(); 599*0b57cec5SDimitry Andric } 600*0b57cec5SDimitry Andric 601*0b57cec5SDimitry Andric static LinkageInfo getExternalLinkageFor(const NamedDecl *D) { 602*0b57cec5SDimitry Andric // C++ Modules TS [basic.link]/6.8: 603*0b57cec5SDimitry Andric // - A name declared at namespace scope that does not have internal linkage 604*0b57cec5SDimitry Andric // by the previous rules and that is introduced by a non-exported 605*0b57cec5SDimitry Andric // declaration has module linkage. 606*0b57cec5SDimitry Andric if (isInModulePurview(D) && !isExportedFromModuleInterfaceUnit( 607*0b57cec5SDimitry Andric cast<NamedDecl>(D->getCanonicalDecl()))) 608*0b57cec5SDimitry Andric return LinkageInfo(ModuleLinkage, DefaultVisibility, false); 609*0b57cec5SDimitry Andric 610*0b57cec5SDimitry Andric return LinkageInfo::external(); 611*0b57cec5SDimitry Andric } 612*0b57cec5SDimitry Andric 613*0b57cec5SDimitry Andric static StorageClass getStorageClass(const Decl *D) { 614*0b57cec5SDimitry Andric if (auto *TD = dyn_cast<TemplateDecl>(D)) 615*0b57cec5SDimitry Andric D = TD->getTemplatedDecl(); 616*0b57cec5SDimitry Andric if (D) { 617*0b57cec5SDimitry Andric if (auto *VD = dyn_cast<VarDecl>(D)) 618*0b57cec5SDimitry Andric return VD->getStorageClass(); 619*0b57cec5SDimitry Andric if (auto *FD = dyn_cast<FunctionDecl>(D)) 620*0b57cec5SDimitry Andric return FD->getStorageClass(); 621*0b57cec5SDimitry Andric } 622*0b57cec5SDimitry Andric return SC_None; 623*0b57cec5SDimitry Andric } 624*0b57cec5SDimitry Andric 625*0b57cec5SDimitry Andric LinkageInfo 626*0b57cec5SDimitry Andric LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D, 627*0b57cec5SDimitry Andric LVComputationKind computation, 628*0b57cec5SDimitry Andric bool IgnoreVarTypeLinkage) { 629*0b57cec5SDimitry Andric assert(D->getDeclContext()->getRedeclContext()->isFileContext() && 630*0b57cec5SDimitry Andric "Not a name having namespace scope"); 631*0b57cec5SDimitry Andric ASTContext &Context = D->getASTContext(); 632*0b57cec5SDimitry Andric 633*0b57cec5SDimitry Andric // C++ [basic.link]p3: 634*0b57cec5SDimitry Andric // A name having namespace scope (3.3.6) has internal linkage if it 635*0b57cec5SDimitry Andric // is the name of 636*0b57cec5SDimitry Andric 637*0b57cec5SDimitry Andric if (getStorageClass(D->getCanonicalDecl()) == SC_Static) { 638*0b57cec5SDimitry Andric // - a variable, variable template, function, or function template 639*0b57cec5SDimitry Andric // that is explicitly declared static; or 640*0b57cec5SDimitry Andric // (This bullet corresponds to C99 6.2.2p3.) 641*0b57cec5SDimitry Andric return getInternalLinkageFor(D); 642*0b57cec5SDimitry Andric } 643*0b57cec5SDimitry Andric 644*0b57cec5SDimitry Andric if (const auto *Var = dyn_cast<VarDecl>(D)) { 645*0b57cec5SDimitry Andric // - a non-template variable of non-volatile const-qualified type, unless 646*0b57cec5SDimitry Andric // - it is explicitly declared extern, or 647*0b57cec5SDimitry Andric // - it is inline or exported, or 648*0b57cec5SDimitry Andric // - it was previously declared and the prior declaration did not have 649*0b57cec5SDimitry Andric // internal linkage 650*0b57cec5SDimitry Andric // (There is no equivalent in C99.) 651*0b57cec5SDimitry Andric if (Context.getLangOpts().CPlusPlus && 652*0b57cec5SDimitry Andric Var->getType().isConstQualified() && 653*0b57cec5SDimitry Andric !Var->getType().isVolatileQualified() && 654*0b57cec5SDimitry Andric !Var->isInline() && 655*0b57cec5SDimitry Andric !isExportedFromModuleInterfaceUnit(Var) && 656*0b57cec5SDimitry Andric !isa<VarTemplateSpecializationDecl>(Var) && 657*0b57cec5SDimitry Andric !Var->getDescribedVarTemplate()) { 658*0b57cec5SDimitry Andric const VarDecl *PrevVar = Var->getPreviousDecl(); 659*0b57cec5SDimitry Andric if (PrevVar) 660*0b57cec5SDimitry Andric return getLVForDecl(PrevVar, computation); 661*0b57cec5SDimitry Andric 662*0b57cec5SDimitry Andric if (Var->getStorageClass() != SC_Extern && 663*0b57cec5SDimitry Andric Var->getStorageClass() != SC_PrivateExtern && 664*0b57cec5SDimitry Andric !isSingleLineLanguageLinkage(*Var)) 665*0b57cec5SDimitry Andric return getInternalLinkageFor(Var); 666*0b57cec5SDimitry Andric } 667*0b57cec5SDimitry Andric 668*0b57cec5SDimitry Andric for (const VarDecl *PrevVar = Var->getPreviousDecl(); PrevVar; 669*0b57cec5SDimitry Andric PrevVar = PrevVar->getPreviousDecl()) { 670*0b57cec5SDimitry Andric if (PrevVar->getStorageClass() == SC_PrivateExtern && 671*0b57cec5SDimitry Andric Var->getStorageClass() == SC_None) 672*0b57cec5SDimitry Andric return getDeclLinkageAndVisibility(PrevVar); 673*0b57cec5SDimitry Andric // Explicitly declared static. 674*0b57cec5SDimitry Andric if (PrevVar->getStorageClass() == SC_Static) 675*0b57cec5SDimitry Andric return getInternalLinkageFor(Var); 676*0b57cec5SDimitry Andric } 677*0b57cec5SDimitry Andric } else if (const auto *IFD = dyn_cast<IndirectFieldDecl>(D)) { 678*0b57cec5SDimitry Andric // - a data member of an anonymous union. 679*0b57cec5SDimitry Andric const VarDecl *VD = IFD->getVarDecl(); 680*0b57cec5SDimitry Andric assert(VD && "Expected a VarDecl in this IndirectFieldDecl!"); 681*0b57cec5SDimitry Andric return getLVForNamespaceScopeDecl(VD, computation, IgnoreVarTypeLinkage); 682*0b57cec5SDimitry Andric } 683*0b57cec5SDimitry Andric assert(!isa<FieldDecl>(D) && "Didn't expect a FieldDecl!"); 684*0b57cec5SDimitry Andric 685*0b57cec5SDimitry Andric // FIXME: This gives internal linkage to names that should have no linkage 686*0b57cec5SDimitry Andric // (those not covered by [basic.link]p6). 687*0b57cec5SDimitry Andric if (D->isInAnonymousNamespace()) { 688*0b57cec5SDimitry Andric const auto *Var = dyn_cast<VarDecl>(D); 689*0b57cec5SDimitry Andric const auto *Func = dyn_cast<FunctionDecl>(D); 690*0b57cec5SDimitry Andric // FIXME: The check for extern "C" here is not justified by the standard 691*0b57cec5SDimitry Andric // wording, but we retain it from the pre-DR1113 model to avoid breaking 692*0b57cec5SDimitry Andric // code. 693*0b57cec5SDimitry Andric // 694*0b57cec5SDimitry Andric // C++11 [basic.link]p4: 695*0b57cec5SDimitry Andric // An unnamed namespace or a namespace declared directly or indirectly 696*0b57cec5SDimitry Andric // within an unnamed namespace has internal linkage. 697*0b57cec5SDimitry Andric if ((!Var || !isFirstInExternCContext(Var)) && 698*0b57cec5SDimitry Andric (!Func || !isFirstInExternCContext(Func))) 699*0b57cec5SDimitry Andric return getInternalLinkageFor(D); 700*0b57cec5SDimitry Andric } 701*0b57cec5SDimitry Andric 702*0b57cec5SDimitry Andric // Set up the defaults. 703*0b57cec5SDimitry Andric 704*0b57cec5SDimitry Andric // C99 6.2.2p5: 705*0b57cec5SDimitry Andric // If the declaration of an identifier for an object has file 706*0b57cec5SDimitry Andric // scope and no storage-class specifier, its linkage is 707*0b57cec5SDimitry Andric // external. 708*0b57cec5SDimitry Andric LinkageInfo LV = getExternalLinkageFor(D); 709*0b57cec5SDimitry Andric 710*0b57cec5SDimitry Andric if (!hasExplicitVisibilityAlready(computation)) { 711*0b57cec5SDimitry Andric if (Optional<Visibility> Vis = getExplicitVisibility(D, computation)) { 712*0b57cec5SDimitry Andric LV.mergeVisibility(*Vis, true); 713*0b57cec5SDimitry Andric } else { 714*0b57cec5SDimitry Andric // If we're declared in a namespace with a visibility attribute, 715*0b57cec5SDimitry Andric // use that namespace's visibility, and it still counts as explicit. 716*0b57cec5SDimitry Andric for (const DeclContext *DC = D->getDeclContext(); 717*0b57cec5SDimitry Andric !isa<TranslationUnitDecl>(DC); 718*0b57cec5SDimitry Andric DC = DC->getParent()) { 719*0b57cec5SDimitry Andric const auto *ND = dyn_cast<NamespaceDecl>(DC); 720*0b57cec5SDimitry Andric if (!ND) continue; 721*0b57cec5SDimitry Andric if (Optional<Visibility> Vis = getExplicitVisibility(ND, computation)) { 722*0b57cec5SDimitry Andric LV.mergeVisibility(*Vis, true); 723*0b57cec5SDimitry Andric break; 724*0b57cec5SDimitry Andric } 725*0b57cec5SDimitry Andric } 726*0b57cec5SDimitry Andric } 727*0b57cec5SDimitry Andric 728*0b57cec5SDimitry Andric // Add in global settings if the above didn't give us direct visibility. 729*0b57cec5SDimitry Andric if (!LV.isVisibilityExplicit()) { 730*0b57cec5SDimitry Andric // Use global type/value visibility as appropriate. 731*0b57cec5SDimitry Andric Visibility globalVisibility = 732*0b57cec5SDimitry Andric computation.isValueVisibility() 733*0b57cec5SDimitry Andric ? Context.getLangOpts().getValueVisibilityMode() 734*0b57cec5SDimitry Andric : Context.getLangOpts().getTypeVisibilityMode(); 735*0b57cec5SDimitry Andric LV.mergeVisibility(globalVisibility, /*explicit*/ false); 736*0b57cec5SDimitry Andric 737*0b57cec5SDimitry Andric // If we're paying attention to global visibility, apply 738*0b57cec5SDimitry Andric // -finline-visibility-hidden if this is an inline method. 739*0b57cec5SDimitry Andric if (useInlineVisibilityHidden(D)) 740*0b57cec5SDimitry Andric LV.mergeVisibility(HiddenVisibility, /*visibilityExplicit=*/false); 741*0b57cec5SDimitry Andric } 742*0b57cec5SDimitry Andric } 743*0b57cec5SDimitry Andric 744*0b57cec5SDimitry Andric // C++ [basic.link]p4: 745*0b57cec5SDimitry Andric 746*0b57cec5SDimitry Andric // A name having namespace scope that has not been given internal linkage 747*0b57cec5SDimitry Andric // above and that is the name of 748*0b57cec5SDimitry Andric // [...bullets...] 749*0b57cec5SDimitry Andric // has its linkage determined as follows: 750*0b57cec5SDimitry Andric // - if the enclosing namespace has internal linkage, the name has 751*0b57cec5SDimitry Andric // internal linkage; [handled above] 752*0b57cec5SDimitry Andric // - otherwise, if the declaration of the name is attached to a named 753*0b57cec5SDimitry Andric // module and is not exported, the name has module linkage; 754*0b57cec5SDimitry Andric // - otherwise, the name has external linkage. 755*0b57cec5SDimitry Andric // LV is currently set up to handle the last two bullets. 756*0b57cec5SDimitry Andric // 757*0b57cec5SDimitry Andric // The bullets are: 758*0b57cec5SDimitry Andric 759*0b57cec5SDimitry Andric // - a variable; or 760*0b57cec5SDimitry Andric if (const auto *Var = dyn_cast<VarDecl>(D)) { 761*0b57cec5SDimitry Andric // GCC applies the following optimization to variables and static 762*0b57cec5SDimitry Andric // data members, but not to functions: 763*0b57cec5SDimitry Andric // 764*0b57cec5SDimitry Andric // Modify the variable's LV by the LV of its type unless this is 765*0b57cec5SDimitry Andric // C or extern "C". This follows from [basic.link]p9: 766*0b57cec5SDimitry Andric // A type without linkage shall not be used as the type of a 767*0b57cec5SDimitry Andric // variable or function with external linkage unless 768*0b57cec5SDimitry Andric // - the entity has C language linkage, or 769*0b57cec5SDimitry Andric // - the entity is declared within an unnamed namespace, or 770*0b57cec5SDimitry Andric // - the entity is not used or is defined in the same 771*0b57cec5SDimitry Andric // translation unit. 772*0b57cec5SDimitry Andric // and [basic.link]p10: 773*0b57cec5SDimitry Andric // ...the types specified by all declarations referring to a 774*0b57cec5SDimitry Andric // given variable or function shall be identical... 775*0b57cec5SDimitry Andric // C does not have an equivalent rule. 776*0b57cec5SDimitry Andric // 777*0b57cec5SDimitry Andric // Ignore this if we've got an explicit attribute; the user 778*0b57cec5SDimitry Andric // probably knows what they're doing. 779*0b57cec5SDimitry Andric // 780*0b57cec5SDimitry Andric // Note that we don't want to make the variable non-external 781*0b57cec5SDimitry Andric // because of this, but unique-external linkage suits us. 782*0b57cec5SDimitry Andric if (Context.getLangOpts().CPlusPlus && !isFirstInExternCContext(Var) && 783*0b57cec5SDimitry Andric !IgnoreVarTypeLinkage) { 784*0b57cec5SDimitry Andric LinkageInfo TypeLV = getLVForType(*Var->getType(), computation); 785*0b57cec5SDimitry Andric if (!isExternallyVisible(TypeLV.getLinkage())) 786*0b57cec5SDimitry Andric return LinkageInfo::uniqueExternal(); 787*0b57cec5SDimitry Andric if (!LV.isVisibilityExplicit()) 788*0b57cec5SDimitry Andric LV.mergeVisibility(TypeLV); 789*0b57cec5SDimitry Andric } 790*0b57cec5SDimitry Andric 791*0b57cec5SDimitry Andric if (Var->getStorageClass() == SC_PrivateExtern) 792*0b57cec5SDimitry Andric LV.mergeVisibility(HiddenVisibility, true); 793*0b57cec5SDimitry Andric 794*0b57cec5SDimitry Andric // Note that Sema::MergeVarDecl already takes care of implementing 795*0b57cec5SDimitry Andric // C99 6.2.2p4 and propagating the visibility attribute, so we don't have 796*0b57cec5SDimitry Andric // to do it here. 797*0b57cec5SDimitry Andric 798*0b57cec5SDimitry Andric // As per function and class template specializations (below), 799*0b57cec5SDimitry Andric // consider LV for the template and template arguments. We're at file 800*0b57cec5SDimitry Andric // scope, so we do not need to worry about nested specializations. 801*0b57cec5SDimitry Andric if (const auto *spec = dyn_cast<VarTemplateSpecializationDecl>(Var)) { 802*0b57cec5SDimitry Andric mergeTemplateLV(LV, spec, computation); 803*0b57cec5SDimitry Andric } 804*0b57cec5SDimitry Andric 805*0b57cec5SDimitry Andric // - a function; or 806*0b57cec5SDimitry Andric } else if (const auto *Function = dyn_cast<FunctionDecl>(D)) { 807*0b57cec5SDimitry Andric // In theory, we can modify the function's LV by the LV of its 808*0b57cec5SDimitry Andric // type unless it has C linkage (see comment above about variables 809*0b57cec5SDimitry Andric // for justification). In practice, GCC doesn't do this, so it's 810*0b57cec5SDimitry Andric // just too painful to make work. 811*0b57cec5SDimitry Andric 812*0b57cec5SDimitry Andric if (Function->getStorageClass() == SC_PrivateExtern) 813*0b57cec5SDimitry Andric LV.mergeVisibility(HiddenVisibility, true); 814*0b57cec5SDimitry Andric 815*0b57cec5SDimitry Andric // Note that Sema::MergeCompatibleFunctionDecls already takes care of 816*0b57cec5SDimitry Andric // merging storage classes and visibility attributes, so we don't have to 817*0b57cec5SDimitry Andric // look at previous decls in here. 818*0b57cec5SDimitry Andric 819*0b57cec5SDimitry Andric // In C++, then if the type of the function uses a type with 820*0b57cec5SDimitry Andric // unique-external linkage, it's not legally usable from outside 821*0b57cec5SDimitry Andric // this translation unit. However, we should use the C linkage 822*0b57cec5SDimitry Andric // rules instead for extern "C" declarations. 823*0b57cec5SDimitry Andric if (Context.getLangOpts().CPlusPlus && !isFirstInExternCContext(Function)) { 824*0b57cec5SDimitry Andric // Only look at the type-as-written. Otherwise, deducing the return type 825*0b57cec5SDimitry Andric // of a function could change its linkage. 826*0b57cec5SDimitry Andric QualType TypeAsWritten = Function->getType(); 827*0b57cec5SDimitry Andric if (TypeSourceInfo *TSI = Function->getTypeSourceInfo()) 828*0b57cec5SDimitry Andric TypeAsWritten = TSI->getType(); 829*0b57cec5SDimitry Andric if (!isExternallyVisible(TypeAsWritten->getLinkage())) 830*0b57cec5SDimitry Andric return LinkageInfo::uniqueExternal(); 831*0b57cec5SDimitry Andric } 832*0b57cec5SDimitry Andric 833*0b57cec5SDimitry Andric // Consider LV from the template and the template arguments. 834*0b57cec5SDimitry Andric // We're at file scope, so we do not need to worry about nested 835*0b57cec5SDimitry Andric // specializations. 836*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *specInfo 837*0b57cec5SDimitry Andric = Function->getTemplateSpecializationInfo()) { 838*0b57cec5SDimitry Andric mergeTemplateLV(LV, Function, specInfo, computation); 839*0b57cec5SDimitry Andric } 840*0b57cec5SDimitry Andric 841*0b57cec5SDimitry Andric // - a named class (Clause 9), or an unnamed class defined in a 842*0b57cec5SDimitry Andric // typedef declaration in which the class has the typedef name 843*0b57cec5SDimitry Andric // for linkage purposes (7.1.3); or 844*0b57cec5SDimitry Andric // - a named enumeration (7.2), or an unnamed enumeration 845*0b57cec5SDimitry Andric // defined in a typedef declaration in which the enumeration 846*0b57cec5SDimitry Andric // has the typedef name for linkage purposes (7.1.3); or 847*0b57cec5SDimitry Andric } else if (const auto *Tag = dyn_cast<TagDecl>(D)) { 848*0b57cec5SDimitry Andric // Unnamed tags have no linkage. 849*0b57cec5SDimitry Andric if (!Tag->hasNameForLinkage()) 850*0b57cec5SDimitry Andric return LinkageInfo::none(); 851*0b57cec5SDimitry Andric 852*0b57cec5SDimitry Andric // If this is a class template specialization, consider the 853*0b57cec5SDimitry Andric // linkage of the template and template arguments. We're at file 854*0b57cec5SDimitry Andric // scope, so we do not need to worry about nested specializations. 855*0b57cec5SDimitry Andric if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(Tag)) { 856*0b57cec5SDimitry Andric mergeTemplateLV(LV, spec, computation); 857*0b57cec5SDimitry Andric } 858*0b57cec5SDimitry Andric 859*0b57cec5SDimitry Andric // FIXME: This is not part of the C++ standard any more. 860*0b57cec5SDimitry Andric // - an enumerator belonging to an enumeration with external linkage; or 861*0b57cec5SDimitry Andric } else if (isa<EnumConstantDecl>(D)) { 862*0b57cec5SDimitry Andric LinkageInfo EnumLV = getLVForDecl(cast<NamedDecl>(D->getDeclContext()), 863*0b57cec5SDimitry Andric computation); 864*0b57cec5SDimitry Andric if (!isExternalFormalLinkage(EnumLV.getLinkage())) 865*0b57cec5SDimitry Andric return LinkageInfo::none(); 866*0b57cec5SDimitry Andric LV.merge(EnumLV); 867*0b57cec5SDimitry Andric 868*0b57cec5SDimitry Andric // - a template 869*0b57cec5SDimitry Andric } else if (const auto *temp = dyn_cast<TemplateDecl>(D)) { 870*0b57cec5SDimitry Andric bool considerVisibility = !hasExplicitVisibilityAlready(computation); 871*0b57cec5SDimitry Andric LinkageInfo tempLV = 872*0b57cec5SDimitry Andric getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 873*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(tempLV, considerVisibility); 874*0b57cec5SDimitry Andric 875*0b57cec5SDimitry Andric // An unnamed namespace or a namespace declared directly or indirectly 876*0b57cec5SDimitry Andric // within an unnamed namespace has internal linkage. All other namespaces 877*0b57cec5SDimitry Andric // have external linkage. 878*0b57cec5SDimitry Andric // 879*0b57cec5SDimitry Andric // We handled names in anonymous namespaces above. 880*0b57cec5SDimitry Andric } else if (isa<NamespaceDecl>(D)) { 881*0b57cec5SDimitry Andric return LV; 882*0b57cec5SDimitry Andric 883*0b57cec5SDimitry Andric // By extension, we assign external linkage to Objective-C 884*0b57cec5SDimitry Andric // interfaces. 885*0b57cec5SDimitry Andric } else if (isa<ObjCInterfaceDecl>(D)) { 886*0b57cec5SDimitry Andric // fallout 887*0b57cec5SDimitry Andric 888*0b57cec5SDimitry Andric } else if (auto *TD = dyn_cast<TypedefNameDecl>(D)) { 889*0b57cec5SDimitry Andric // A typedef declaration has linkage if it gives a type a name for 890*0b57cec5SDimitry Andric // linkage purposes. 891*0b57cec5SDimitry Andric if (!TD->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) 892*0b57cec5SDimitry Andric return LinkageInfo::none(); 893*0b57cec5SDimitry Andric 894*0b57cec5SDimitry Andric // Everything not covered here has no linkage. 895*0b57cec5SDimitry Andric } else { 896*0b57cec5SDimitry Andric return LinkageInfo::none(); 897*0b57cec5SDimitry Andric } 898*0b57cec5SDimitry Andric 899*0b57cec5SDimitry Andric // If we ended up with non-externally-visible linkage, visibility should 900*0b57cec5SDimitry Andric // always be default. 901*0b57cec5SDimitry Andric if (!isExternallyVisible(LV.getLinkage())) 902*0b57cec5SDimitry Andric return LinkageInfo(LV.getLinkage(), DefaultVisibility, false); 903*0b57cec5SDimitry Andric 904*0b57cec5SDimitry Andric return LV; 905*0b57cec5SDimitry Andric } 906*0b57cec5SDimitry Andric 907*0b57cec5SDimitry Andric LinkageInfo 908*0b57cec5SDimitry Andric LinkageComputer::getLVForClassMember(const NamedDecl *D, 909*0b57cec5SDimitry Andric LVComputationKind computation, 910*0b57cec5SDimitry Andric bool IgnoreVarTypeLinkage) { 911*0b57cec5SDimitry Andric // Only certain class members have linkage. Note that fields don't 912*0b57cec5SDimitry Andric // really have linkage, but it's convenient to say they do for the 913*0b57cec5SDimitry Andric // purposes of calculating linkage of pointer-to-data-member 914*0b57cec5SDimitry Andric // template arguments. 915*0b57cec5SDimitry Andric // 916*0b57cec5SDimitry Andric // Templates also don't officially have linkage, but since we ignore 917*0b57cec5SDimitry Andric // the C++ standard and look at template arguments when determining 918*0b57cec5SDimitry Andric // linkage and visibility of a template specialization, we might hit 919*0b57cec5SDimitry Andric // a template template argument that way. If we do, we need to 920*0b57cec5SDimitry Andric // consider its linkage. 921*0b57cec5SDimitry Andric if (!(isa<CXXMethodDecl>(D) || 922*0b57cec5SDimitry Andric isa<VarDecl>(D) || 923*0b57cec5SDimitry Andric isa<FieldDecl>(D) || 924*0b57cec5SDimitry Andric isa<IndirectFieldDecl>(D) || 925*0b57cec5SDimitry Andric isa<TagDecl>(D) || 926*0b57cec5SDimitry Andric isa<TemplateDecl>(D))) 927*0b57cec5SDimitry Andric return LinkageInfo::none(); 928*0b57cec5SDimitry Andric 929*0b57cec5SDimitry Andric LinkageInfo LV; 930*0b57cec5SDimitry Andric 931*0b57cec5SDimitry Andric // If we have an explicit visibility attribute, merge that in. 932*0b57cec5SDimitry Andric if (!hasExplicitVisibilityAlready(computation)) { 933*0b57cec5SDimitry Andric if (Optional<Visibility> Vis = getExplicitVisibility(D, computation)) 934*0b57cec5SDimitry Andric LV.mergeVisibility(*Vis, true); 935*0b57cec5SDimitry Andric // If we're paying attention to global visibility, apply 936*0b57cec5SDimitry Andric // -finline-visibility-hidden if this is an inline method. 937*0b57cec5SDimitry Andric // 938*0b57cec5SDimitry Andric // Note that we do this before merging information about 939*0b57cec5SDimitry Andric // the class visibility. 940*0b57cec5SDimitry Andric if (!LV.isVisibilityExplicit() && useInlineVisibilityHidden(D)) 941*0b57cec5SDimitry Andric LV.mergeVisibility(HiddenVisibility, /*visibilityExplicit=*/false); 942*0b57cec5SDimitry Andric } 943*0b57cec5SDimitry Andric 944*0b57cec5SDimitry Andric // If this class member has an explicit visibility attribute, the only 945*0b57cec5SDimitry Andric // thing that can change its visibility is the template arguments, so 946*0b57cec5SDimitry Andric // only look for them when processing the class. 947*0b57cec5SDimitry Andric LVComputationKind classComputation = computation; 948*0b57cec5SDimitry Andric if (LV.isVisibilityExplicit()) 949*0b57cec5SDimitry Andric classComputation = withExplicitVisibilityAlready(computation); 950*0b57cec5SDimitry Andric 951*0b57cec5SDimitry Andric LinkageInfo classLV = 952*0b57cec5SDimitry Andric getLVForDecl(cast<RecordDecl>(D->getDeclContext()), classComputation); 953*0b57cec5SDimitry Andric // The member has the same linkage as the class. If that's not externally 954*0b57cec5SDimitry Andric // visible, we don't need to compute anything about the linkage. 955*0b57cec5SDimitry Andric // FIXME: If we're only computing linkage, can we bail out here? 956*0b57cec5SDimitry Andric if (!isExternallyVisible(classLV.getLinkage())) 957*0b57cec5SDimitry Andric return classLV; 958*0b57cec5SDimitry Andric 959*0b57cec5SDimitry Andric 960*0b57cec5SDimitry Andric // Otherwise, don't merge in classLV yet, because in certain cases 961*0b57cec5SDimitry Andric // we need to completely ignore the visibility from it. 962*0b57cec5SDimitry Andric 963*0b57cec5SDimitry Andric // Specifically, if this decl exists and has an explicit attribute. 964*0b57cec5SDimitry Andric const NamedDecl *explicitSpecSuppressor = nullptr; 965*0b57cec5SDimitry Andric 966*0b57cec5SDimitry Andric if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) { 967*0b57cec5SDimitry Andric // Only look at the type-as-written. Otherwise, deducing the return type 968*0b57cec5SDimitry Andric // of a function could change its linkage. 969*0b57cec5SDimitry Andric QualType TypeAsWritten = MD->getType(); 970*0b57cec5SDimitry Andric if (TypeSourceInfo *TSI = MD->getTypeSourceInfo()) 971*0b57cec5SDimitry Andric TypeAsWritten = TSI->getType(); 972*0b57cec5SDimitry Andric if (!isExternallyVisible(TypeAsWritten->getLinkage())) 973*0b57cec5SDimitry Andric return LinkageInfo::uniqueExternal(); 974*0b57cec5SDimitry Andric 975*0b57cec5SDimitry Andric // If this is a method template specialization, use the linkage for 976*0b57cec5SDimitry Andric // the template parameters and arguments. 977*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *spec 978*0b57cec5SDimitry Andric = MD->getTemplateSpecializationInfo()) { 979*0b57cec5SDimitry Andric mergeTemplateLV(LV, MD, spec, computation); 980*0b57cec5SDimitry Andric if (spec->isExplicitSpecialization()) { 981*0b57cec5SDimitry Andric explicitSpecSuppressor = MD; 982*0b57cec5SDimitry Andric } else if (isExplicitMemberSpecialization(spec->getTemplate())) { 983*0b57cec5SDimitry Andric explicitSpecSuppressor = spec->getTemplate()->getTemplatedDecl(); 984*0b57cec5SDimitry Andric } 985*0b57cec5SDimitry Andric } else if (isExplicitMemberSpecialization(MD)) { 986*0b57cec5SDimitry Andric explicitSpecSuppressor = MD; 987*0b57cec5SDimitry Andric } 988*0b57cec5SDimitry Andric 989*0b57cec5SDimitry Andric } else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) { 990*0b57cec5SDimitry Andric if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(RD)) { 991*0b57cec5SDimitry Andric mergeTemplateLV(LV, spec, computation); 992*0b57cec5SDimitry Andric if (spec->isExplicitSpecialization()) { 993*0b57cec5SDimitry Andric explicitSpecSuppressor = spec; 994*0b57cec5SDimitry Andric } else { 995*0b57cec5SDimitry Andric const ClassTemplateDecl *temp = spec->getSpecializedTemplate(); 996*0b57cec5SDimitry Andric if (isExplicitMemberSpecialization(temp)) { 997*0b57cec5SDimitry Andric explicitSpecSuppressor = temp->getTemplatedDecl(); 998*0b57cec5SDimitry Andric } 999*0b57cec5SDimitry Andric } 1000*0b57cec5SDimitry Andric } else if (isExplicitMemberSpecialization(RD)) { 1001*0b57cec5SDimitry Andric explicitSpecSuppressor = RD; 1002*0b57cec5SDimitry Andric } 1003*0b57cec5SDimitry Andric 1004*0b57cec5SDimitry Andric // Static data members. 1005*0b57cec5SDimitry Andric } else if (const auto *VD = dyn_cast<VarDecl>(D)) { 1006*0b57cec5SDimitry Andric if (const auto *spec = dyn_cast<VarTemplateSpecializationDecl>(VD)) 1007*0b57cec5SDimitry Andric mergeTemplateLV(LV, spec, computation); 1008*0b57cec5SDimitry Andric 1009*0b57cec5SDimitry Andric // Modify the variable's linkage by its type, but ignore the 1010*0b57cec5SDimitry Andric // type's visibility unless it's a definition. 1011*0b57cec5SDimitry Andric if (!IgnoreVarTypeLinkage) { 1012*0b57cec5SDimitry Andric LinkageInfo typeLV = getLVForType(*VD->getType(), computation); 1013*0b57cec5SDimitry Andric // FIXME: If the type's linkage is not externally visible, we can 1014*0b57cec5SDimitry Andric // give this static data member UniqueExternalLinkage. 1015*0b57cec5SDimitry Andric if (!LV.isVisibilityExplicit() && !classLV.isVisibilityExplicit()) 1016*0b57cec5SDimitry Andric LV.mergeVisibility(typeLV); 1017*0b57cec5SDimitry Andric LV.mergeExternalVisibility(typeLV); 1018*0b57cec5SDimitry Andric } 1019*0b57cec5SDimitry Andric 1020*0b57cec5SDimitry Andric if (isExplicitMemberSpecialization(VD)) { 1021*0b57cec5SDimitry Andric explicitSpecSuppressor = VD; 1022*0b57cec5SDimitry Andric } 1023*0b57cec5SDimitry Andric 1024*0b57cec5SDimitry Andric // Template members. 1025*0b57cec5SDimitry Andric } else if (const auto *temp = dyn_cast<TemplateDecl>(D)) { 1026*0b57cec5SDimitry Andric bool considerVisibility = 1027*0b57cec5SDimitry Andric (!LV.isVisibilityExplicit() && 1028*0b57cec5SDimitry Andric !classLV.isVisibilityExplicit() && 1029*0b57cec5SDimitry Andric !hasExplicitVisibilityAlready(computation)); 1030*0b57cec5SDimitry Andric LinkageInfo tempLV = 1031*0b57cec5SDimitry Andric getLVForTemplateParameterList(temp->getTemplateParameters(), computation); 1032*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(tempLV, considerVisibility); 1033*0b57cec5SDimitry Andric 1034*0b57cec5SDimitry Andric if (const auto *redeclTemp = dyn_cast<RedeclarableTemplateDecl>(temp)) { 1035*0b57cec5SDimitry Andric if (isExplicitMemberSpecialization(redeclTemp)) { 1036*0b57cec5SDimitry Andric explicitSpecSuppressor = temp->getTemplatedDecl(); 1037*0b57cec5SDimitry Andric } 1038*0b57cec5SDimitry Andric } 1039*0b57cec5SDimitry Andric } 1040*0b57cec5SDimitry Andric 1041*0b57cec5SDimitry Andric // We should never be looking for an attribute directly on a template. 1042*0b57cec5SDimitry Andric assert(!explicitSpecSuppressor || !isa<TemplateDecl>(explicitSpecSuppressor)); 1043*0b57cec5SDimitry Andric 1044*0b57cec5SDimitry Andric // If this member is an explicit member specialization, and it has 1045*0b57cec5SDimitry Andric // an explicit attribute, ignore visibility from the parent. 1046*0b57cec5SDimitry Andric bool considerClassVisibility = true; 1047*0b57cec5SDimitry Andric if (explicitSpecSuppressor && 1048*0b57cec5SDimitry Andric // optimization: hasDVA() is true only with explicit visibility. 1049*0b57cec5SDimitry Andric LV.isVisibilityExplicit() && 1050*0b57cec5SDimitry Andric classLV.getVisibility() != DefaultVisibility && 1051*0b57cec5SDimitry Andric hasDirectVisibilityAttribute(explicitSpecSuppressor, computation)) { 1052*0b57cec5SDimitry Andric considerClassVisibility = false; 1053*0b57cec5SDimitry Andric } 1054*0b57cec5SDimitry Andric 1055*0b57cec5SDimitry Andric // Finally, merge in information from the class. 1056*0b57cec5SDimitry Andric LV.mergeMaybeWithVisibility(classLV, considerClassVisibility); 1057*0b57cec5SDimitry Andric return LV; 1058*0b57cec5SDimitry Andric } 1059*0b57cec5SDimitry Andric 1060*0b57cec5SDimitry Andric void NamedDecl::anchor() {} 1061*0b57cec5SDimitry Andric 1062*0b57cec5SDimitry Andric bool NamedDecl::isLinkageValid() const { 1063*0b57cec5SDimitry Andric if (!hasCachedLinkage()) 1064*0b57cec5SDimitry Andric return true; 1065*0b57cec5SDimitry Andric 1066*0b57cec5SDimitry Andric Linkage L = LinkageComputer{} 1067*0b57cec5SDimitry Andric .computeLVForDecl(this, LVComputationKind::forLinkageOnly()) 1068*0b57cec5SDimitry Andric .getLinkage(); 1069*0b57cec5SDimitry Andric return L == getCachedLinkage(); 1070*0b57cec5SDimitry Andric } 1071*0b57cec5SDimitry Andric 1072*0b57cec5SDimitry Andric ObjCStringFormatFamily NamedDecl::getObjCFStringFormattingFamily() const { 1073*0b57cec5SDimitry Andric StringRef name = getName(); 1074*0b57cec5SDimitry Andric if (name.empty()) return SFF_None; 1075*0b57cec5SDimitry Andric 1076*0b57cec5SDimitry Andric if (name.front() == 'C') 1077*0b57cec5SDimitry Andric if (name == "CFStringCreateWithFormat" || 1078*0b57cec5SDimitry Andric name == "CFStringCreateWithFormatAndArguments" || 1079*0b57cec5SDimitry Andric name == "CFStringAppendFormat" || 1080*0b57cec5SDimitry Andric name == "CFStringAppendFormatAndArguments") 1081*0b57cec5SDimitry Andric return SFF_CFString; 1082*0b57cec5SDimitry Andric return SFF_None; 1083*0b57cec5SDimitry Andric } 1084*0b57cec5SDimitry Andric 1085*0b57cec5SDimitry Andric Linkage NamedDecl::getLinkageInternal() const { 1086*0b57cec5SDimitry Andric // We don't care about visibility here, so ask for the cheapest 1087*0b57cec5SDimitry Andric // possible visibility analysis. 1088*0b57cec5SDimitry Andric return LinkageComputer{} 1089*0b57cec5SDimitry Andric .getLVForDecl(this, LVComputationKind::forLinkageOnly()) 1090*0b57cec5SDimitry Andric .getLinkage(); 1091*0b57cec5SDimitry Andric } 1092*0b57cec5SDimitry Andric 1093*0b57cec5SDimitry Andric LinkageInfo NamedDecl::getLinkageAndVisibility() const { 1094*0b57cec5SDimitry Andric return LinkageComputer{}.getDeclLinkageAndVisibility(this); 1095*0b57cec5SDimitry Andric } 1096*0b57cec5SDimitry Andric 1097*0b57cec5SDimitry Andric static Optional<Visibility> 1098*0b57cec5SDimitry Andric getExplicitVisibilityAux(const NamedDecl *ND, 1099*0b57cec5SDimitry Andric NamedDecl::ExplicitVisibilityKind kind, 1100*0b57cec5SDimitry Andric bool IsMostRecent) { 1101*0b57cec5SDimitry Andric assert(!IsMostRecent || ND == ND->getMostRecentDecl()); 1102*0b57cec5SDimitry Andric 1103*0b57cec5SDimitry Andric // Check the declaration itself first. 1104*0b57cec5SDimitry Andric if (Optional<Visibility> V = getVisibilityOf(ND, kind)) 1105*0b57cec5SDimitry Andric return V; 1106*0b57cec5SDimitry Andric 1107*0b57cec5SDimitry Andric // If this is a member class of a specialization of a class template 1108*0b57cec5SDimitry Andric // and the corresponding decl has explicit visibility, use that. 1109*0b57cec5SDimitry Andric if (const auto *RD = dyn_cast<CXXRecordDecl>(ND)) { 1110*0b57cec5SDimitry Andric CXXRecordDecl *InstantiatedFrom = RD->getInstantiatedFromMemberClass(); 1111*0b57cec5SDimitry Andric if (InstantiatedFrom) 1112*0b57cec5SDimitry Andric return getVisibilityOf(InstantiatedFrom, kind); 1113*0b57cec5SDimitry Andric } 1114*0b57cec5SDimitry Andric 1115*0b57cec5SDimitry Andric // If there wasn't explicit visibility there, and this is a 1116*0b57cec5SDimitry Andric // specialization of a class template, check for visibility 1117*0b57cec5SDimitry Andric // on the pattern. 1118*0b57cec5SDimitry Andric if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(ND)) { 1119*0b57cec5SDimitry Andric // Walk all the template decl till this point to see if there are 1120*0b57cec5SDimitry Andric // explicit visibility attributes. 1121*0b57cec5SDimitry Andric const auto *TD = spec->getSpecializedTemplate()->getTemplatedDecl(); 1122*0b57cec5SDimitry Andric while (TD != nullptr) { 1123*0b57cec5SDimitry Andric auto Vis = getVisibilityOf(TD, kind); 1124*0b57cec5SDimitry Andric if (Vis != None) 1125*0b57cec5SDimitry Andric return Vis; 1126*0b57cec5SDimitry Andric TD = TD->getPreviousDecl(); 1127*0b57cec5SDimitry Andric } 1128*0b57cec5SDimitry Andric return None; 1129*0b57cec5SDimitry Andric } 1130*0b57cec5SDimitry Andric 1131*0b57cec5SDimitry Andric // Use the most recent declaration. 1132*0b57cec5SDimitry Andric if (!IsMostRecent && !isa<NamespaceDecl>(ND)) { 1133*0b57cec5SDimitry Andric const NamedDecl *MostRecent = ND->getMostRecentDecl(); 1134*0b57cec5SDimitry Andric if (MostRecent != ND) 1135*0b57cec5SDimitry Andric return getExplicitVisibilityAux(MostRecent, kind, true); 1136*0b57cec5SDimitry Andric } 1137*0b57cec5SDimitry Andric 1138*0b57cec5SDimitry Andric if (const auto *Var = dyn_cast<VarDecl>(ND)) { 1139*0b57cec5SDimitry Andric if (Var->isStaticDataMember()) { 1140*0b57cec5SDimitry Andric VarDecl *InstantiatedFrom = Var->getInstantiatedFromStaticDataMember(); 1141*0b57cec5SDimitry Andric if (InstantiatedFrom) 1142*0b57cec5SDimitry Andric return getVisibilityOf(InstantiatedFrom, kind); 1143*0b57cec5SDimitry Andric } 1144*0b57cec5SDimitry Andric 1145*0b57cec5SDimitry Andric if (const auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Var)) 1146*0b57cec5SDimitry Andric return getVisibilityOf(VTSD->getSpecializedTemplate()->getTemplatedDecl(), 1147*0b57cec5SDimitry Andric kind); 1148*0b57cec5SDimitry Andric 1149*0b57cec5SDimitry Andric return None; 1150*0b57cec5SDimitry Andric } 1151*0b57cec5SDimitry Andric // Also handle function template specializations. 1152*0b57cec5SDimitry Andric if (const auto *fn = dyn_cast<FunctionDecl>(ND)) { 1153*0b57cec5SDimitry Andric // If the function is a specialization of a template with an 1154*0b57cec5SDimitry Andric // explicit visibility attribute, use that. 1155*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *templateInfo 1156*0b57cec5SDimitry Andric = fn->getTemplateSpecializationInfo()) 1157*0b57cec5SDimitry Andric return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl(), 1158*0b57cec5SDimitry Andric kind); 1159*0b57cec5SDimitry Andric 1160*0b57cec5SDimitry Andric // If the function is a member of a specialization of a class template 1161*0b57cec5SDimitry Andric // and the corresponding decl has explicit visibility, use that. 1162*0b57cec5SDimitry Andric FunctionDecl *InstantiatedFrom = fn->getInstantiatedFromMemberFunction(); 1163*0b57cec5SDimitry Andric if (InstantiatedFrom) 1164*0b57cec5SDimitry Andric return getVisibilityOf(InstantiatedFrom, kind); 1165*0b57cec5SDimitry Andric 1166*0b57cec5SDimitry Andric return None; 1167*0b57cec5SDimitry Andric } 1168*0b57cec5SDimitry Andric 1169*0b57cec5SDimitry Andric // The visibility of a template is stored in the templated decl. 1170*0b57cec5SDimitry Andric if (const auto *TD = dyn_cast<TemplateDecl>(ND)) 1171*0b57cec5SDimitry Andric return getVisibilityOf(TD->getTemplatedDecl(), kind); 1172*0b57cec5SDimitry Andric 1173*0b57cec5SDimitry Andric return None; 1174*0b57cec5SDimitry Andric } 1175*0b57cec5SDimitry Andric 1176*0b57cec5SDimitry Andric Optional<Visibility> 1177*0b57cec5SDimitry Andric NamedDecl::getExplicitVisibility(ExplicitVisibilityKind kind) const { 1178*0b57cec5SDimitry Andric return getExplicitVisibilityAux(this, kind, false); 1179*0b57cec5SDimitry Andric } 1180*0b57cec5SDimitry Andric 1181*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::getLVForClosure(const DeclContext *DC, 1182*0b57cec5SDimitry Andric Decl *ContextDecl, 1183*0b57cec5SDimitry Andric LVComputationKind computation) { 1184*0b57cec5SDimitry Andric // This lambda has its linkage/visibility determined by its owner. 1185*0b57cec5SDimitry Andric const NamedDecl *Owner; 1186*0b57cec5SDimitry Andric if (!ContextDecl) 1187*0b57cec5SDimitry Andric Owner = dyn_cast<NamedDecl>(DC); 1188*0b57cec5SDimitry Andric else if (isa<ParmVarDecl>(ContextDecl)) 1189*0b57cec5SDimitry Andric Owner = 1190*0b57cec5SDimitry Andric dyn_cast<NamedDecl>(ContextDecl->getDeclContext()->getRedeclContext()); 1191*0b57cec5SDimitry Andric else 1192*0b57cec5SDimitry Andric Owner = cast<NamedDecl>(ContextDecl); 1193*0b57cec5SDimitry Andric 1194*0b57cec5SDimitry Andric if (!Owner) 1195*0b57cec5SDimitry Andric return LinkageInfo::none(); 1196*0b57cec5SDimitry Andric 1197*0b57cec5SDimitry Andric // If the owner has a deduced type, we need to skip querying the linkage and 1198*0b57cec5SDimitry Andric // visibility of that type, because it might involve this closure type. The 1199*0b57cec5SDimitry Andric // only effect of this is that we might give a lambda VisibleNoLinkage rather 1200*0b57cec5SDimitry Andric // than NoLinkage when we don't strictly need to, which is benign. 1201*0b57cec5SDimitry Andric auto *VD = dyn_cast<VarDecl>(Owner); 1202*0b57cec5SDimitry Andric LinkageInfo OwnerLV = 1203*0b57cec5SDimitry Andric VD && VD->getType()->getContainedDeducedType() 1204*0b57cec5SDimitry Andric ? computeLVForDecl(Owner, computation, /*IgnoreVarTypeLinkage*/true) 1205*0b57cec5SDimitry Andric : getLVForDecl(Owner, computation); 1206*0b57cec5SDimitry Andric 1207*0b57cec5SDimitry Andric // A lambda never formally has linkage. But if the owner is externally 1208*0b57cec5SDimitry Andric // visible, then the lambda is too. We apply the same rules to blocks. 1209*0b57cec5SDimitry Andric if (!isExternallyVisible(OwnerLV.getLinkage())) 1210*0b57cec5SDimitry Andric return LinkageInfo::none(); 1211*0b57cec5SDimitry Andric return LinkageInfo(VisibleNoLinkage, OwnerLV.getVisibility(), 1212*0b57cec5SDimitry Andric OwnerLV.isVisibilityExplicit()); 1213*0b57cec5SDimitry Andric } 1214*0b57cec5SDimitry Andric 1215*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::getLVForLocalDecl(const NamedDecl *D, 1216*0b57cec5SDimitry Andric LVComputationKind computation) { 1217*0b57cec5SDimitry Andric if (const auto *Function = dyn_cast<FunctionDecl>(D)) { 1218*0b57cec5SDimitry Andric if (Function->isInAnonymousNamespace() && 1219*0b57cec5SDimitry Andric !isFirstInExternCContext(Function)) 1220*0b57cec5SDimitry Andric return getInternalLinkageFor(Function); 1221*0b57cec5SDimitry Andric 1222*0b57cec5SDimitry Andric // This is a "void f();" which got merged with a file static. 1223*0b57cec5SDimitry Andric if (Function->getCanonicalDecl()->getStorageClass() == SC_Static) 1224*0b57cec5SDimitry Andric return getInternalLinkageFor(Function); 1225*0b57cec5SDimitry Andric 1226*0b57cec5SDimitry Andric LinkageInfo LV; 1227*0b57cec5SDimitry Andric if (!hasExplicitVisibilityAlready(computation)) { 1228*0b57cec5SDimitry Andric if (Optional<Visibility> Vis = 1229*0b57cec5SDimitry Andric getExplicitVisibility(Function, computation)) 1230*0b57cec5SDimitry Andric LV.mergeVisibility(*Vis, true); 1231*0b57cec5SDimitry Andric } 1232*0b57cec5SDimitry Andric 1233*0b57cec5SDimitry Andric // Note that Sema::MergeCompatibleFunctionDecls already takes care of 1234*0b57cec5SDimitry Andric // merging storage classes and visibility attributes, so we don't have to 1235*0b57cec5SDimitry Andric // look at previous decls in here. 1236*0b57cec5SDimitry Andric 1237*0b57cec5SDimitry Andric return LV; 1238*0b57cec5SDimitry Andric } 1239*0b57cec5SDimitry Andric 1240*0b57cec5SDimitry Andric if (const auto *Var = dyn_cast<VarDecl>(D)) { 1241*0b57cec5SDimitry Andric if (Var->hasExternalStorage()) { 1242*0b57cec5SDimitry Andric if (Var->isInAnonymousNamespace() && !isFirstInExternCContext(Var)) 1243*0b57cec5SDimitry Andric return getInternalLinkageFor(Var); 1244*0b57cec5SDimitry Andric 1245*0b57cec5SDimitry Andric LinkageInfo LV; 1246*0b57cec5SDimitry Andric if (Var->getStorageClass() == SC_PrivateExtern) 1247*0b57cec5SDimitry Andric LV.mergeVisibility(HiddenVisibility, true); 1248*0b57cec5SDimitry Andric else if (!hasExplicitVisibilityAlready(computation)) { 1249*0b57cec5SDimitry Andric if (Optional<Visibility> Vis = getExplicitVisibility(Var, computation)) 1250*0b57cec5SDimitry Andric LV.mergeVisibility(*Vis, true); 1251*0b57cec5SDimitry Andric } 1252*0b57cec5SDimitry Andric 1253*0b57cec5SDimitry Andric if (const VarDecl *Prev = Var->getPreviousDecl()) { 1254*0b57cec5SDimitry Andric LinkageInfo PrevLV = getLVForDecl(Prev, computation); 1255*0b57cec5SDimitry Andric if (PrevLV.getLinkage()) 1256*0b57cec5SDimitry Andric LV.setLinkage(PrevLV.getLinkage()); 1257*0b57cec5SDimitry Andric LV.mergeVisibility(PrevLV); 1258*0b57cec5SDimitry Andric } 1259*0b57cec5SDimitry Andric 1260*0b57cec5SDimitry Andric return LV; 1261*0b57cec5SDimitry Andric } 1262*0b57cec5SDimitry Andric 1263*0b57cec5SDimitry Andric if (!Var->isStaticLocal()) 1264*0b57cec5SDimitry Andric return LinkageInfo::none(); 1265*0b57cec5SDimitry Andric } 1266*0b57cec5SDimitry Andric 1267*0b57cec5SDimitry Andric ASTContext &Context = D->getASTContext(); 1268*0b57cec5SDimitry Andric if (!Context.getLangOpts().CPlusPlus) 1269*0b57cec5SDimitry Andric return LinkageInfo::none(); 1270*0b57cec5SDimitry Andric 1271*0b57cec5SDimitry Andric const Decl *OuterD = getOutermostFuncOrBlockContext(D); 1272*0b57cec5SDimitry Andric if (!OuterD || OuterD->isInvalidDecl()) 1273*0b57cec5SDimitry Andric return LinkageInfo::none(); 1274*0b57cec5SDimitry Andric 1275*0b57cec5SDimitry Andric LinkageInfo LV; 1276*0b57cec5SDimitry Andric if (const auto *BD = dyn_cast<BlockDecl>(OuterD)) { 1277*0b57cec5SDimitry Andric if (!BD->getBlockManglingNumber()) 1278*0b57cec5SDimitry Andric return LinkageInfo::none(); 1279*0b57cec5SDimitry Andric 1280*0b57cec5SDimitry Andric LV = getLVForClosure(BD->getDeclContext()->getRedeclContext(), 1281*0b57cec5SDimitry Andric BD->getBlockManglingContextDecl(), computation); 1282*0b57cec5SDimitry Andric } else { 1283*0b57cec5SDimitry Andric const auto *FD = cast<FunctionDecl>(OuterD); 1284*0b57cec5SDimitry Andric if (!FD->isInlined() && 1285*0b57cec5SDimitry Andric !isTemplateInstantiation(FD->getTemplateSpecializationKind())) 1286*0b57cec5SDimitry Andric return LinkageInfo::none(); 1287*0b57cec5SDimitry Andric 1288*0b57cec5SDimitry Andric // If a function is hidden by -fvisibility-inlines-hidden option and 1289*0b57cec5SDimitry Andric // is not explicitly attributed as a hidden function, 1290*0b57cec5SDimitry Andric // we should not make static local variables in the function hidden. 1291*0b57cec5SDimitry Andric LV = getLVForDecl(FD, computation); 1292*0b57cec5SDimitry Andric if (isa<VarDecl>(D) && useInlineVisibilityHidden(FD) && 1293*0b57cec5SDimitry Andric !LV.isVisibilityExplicit()) { 1294*0b57cec5SDimitry Andric assert(cast<VarDecl>(D)->isStaticLocal()); 1295*0b57cec5SDimitry Andric // If this was an implicitly hidden inline method, check again for 1296*0b57cec5SDimitry Andric // explicit visibility on the parent class, and use that for static locals 1297*0b57cec5SDimitry Andric // if present. 1298*0b57cec5SDimitry Andric if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) 1299*0b57cec5SDimitry Andric LV = getLVForDecl(MD->getParent(), computation); 1300*0b57cec5SDimitry Andric if (!LV.isVisibilityExplicit()) { 1301*0b57cec5SDimitry Andric Visibility globalVisibility = 1302*0b57cec5SDimitry Andric computation.isValueVisibility() 1303*0b57cec5SDimitry Andric ? Context.getLangOpts().getValueVisibilityMode() 1304*0b57cec5SDimitry Andric : Context.getLangOpts().getTypeVisibilityMode(); 1305*0b57cec5SDimitry Andric return LinkageInfo(VisibleNoLinkage, globalVisibility, 1306*0b57cec5SDimitry Andric /*visibilityExplicit=*/false); 1307*0b57cec5SDimitry Andric } 1308*0b57cec5SDimitry Andric } 1309*0b57cec5SDimitry Andric } 1310*0b57cec5SDimitry Andric if (!isExternallyVisible(LV.getLinkage())) 1311*0b57cec5SDimitry Andric return LinkageInfo::none(); 1312*0b57cec5SDimitry Andric return LinkageInfo(VisibleNoLinkage, LV.getVisibility(), 1313*0b57cec5SDimitry Andric LV.isVisibilityExplicit()); 1314*0b57cec5SDimitry Andric } 1315*0b57cec5SDimitry Andric 1316*0b57cec5SDimitry Andric static inline const CXXRecordDecl* 1317*0b57cec5SDimitry Andric getOutermostEnclosingLambda(const CXXRecordDecl *Record) { 1318*0b57cec5SDimitry Andric const CXXRecordDecl *Ret = Record; 1319*0b57cec5SDimitry Andric while (Record && Record->isLambda()) { 1320*0b57cec5SDimitry Andric Ret = Record; 1321*0b57cec5SDimitry Andric if (!Record->getParent()) break; 1322*0b57cec5SDimitry Andric // Get the Containing Class of this Lambda Class 1323*0b57cec5SDimitry Andric Record = dyn_cast_or_null<CXXRecordDecl>( 1324*0b57cec5SDimitry Andric Record->getParent()->getParent()); 1325*0b57cec5SDimitry Andric } 1326*0b57cec5SDimitry Andric return Ret; 1327*0b57cec5SDimitry Andric } 1328*0b57cec5SDimitry Andric 1329*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::computeLVForDecl(const NamedDecl *D, 1330*0b57cec5SDimitry Andric LVComputationKind computation, 1331*0b57cec5SDimitry Andric bool IgnoreVarTypeLinkage) { 1332*0b57cec5SDimitry Andric // Internal_linkage attribute overrides other considerations. 1333*0b57cec5SDimitry Andric if (D->hasAttr<InternalLinkageAttr>()) 1334*0b57cec5SDimitry Andric return getInternalLinkageFor(D); 1335*0b57cec5SDimitry Andric 1336*0b57cec5SDimitry Andric // Objective-C: treat all Objective-C declarations as having external 1337*0b57cec5SDimitry Andric // linkage. 1338*0b57cec5SDimitry Andric switch (D->getKind()) { 1339*0b57cec5SDimitry Andric default: 1340*0b57cec5SDimitry Andric break; 1341*0b57cec5SDimitry Andric 1342*0b57cec5SDimitry Andric // Per C++ [basic.link]p2, only the names of objects, references, 1343*0b57cec5SDimitry Andric // functions, types, templates, namespaces, and values ever have linkage. 1344*0b57cec5SDimitry Andric // 1345*0b57cec5SDimitry Andric // Note that the name of a typedef, namespace alias, using declaration, 1346*0b57cec5SDimitry Andric // and so on are not the name of the corresponding type, namespace, or 1347*0b57cec5SDimitry Andric // declaration, so they do *not* have linkage. 1348*0b57cec5SDimitry Andric case Decl::ImplicitParam: 1349*0b57cec5SDimitry Andric case Decl::Label: 1350*0b57cec5SDimitry Andric case Decl::NamespaceAlias: 1351*0b57cec5SDimitry Andric case Decl::ParmVar: 1352*0b57cec5SDimitry Andric case Decl::Using: 1353*0b57cec5SDimitry Andric case Decl::UsingShadow: 1354*0b57cec5SDimitry Andric case Decl::UsingDirective: 1355*0b57cec5SDimitry Andric return LinkageInfo::none(); 1356*0b57cec5SDimitry Andric 1357*0b57cec5SDimitry Andric case Decl::EnumConstant: 1358*0b57cec5SDimitry Andric // C++ [basic.link]p4: an enumerator has the linkage of its enumeration. 1359*0b57cec5SDimitry Andric if (D->getASTContext().getLangOpts().CPlusPlus) 1360*0b57cec5SDimitry Andric return getLVForDecl(cast<EnumDecl>(D->getDeclContext()), computation); 1361*0b57cec5SDimitry Andric return LinkageInfo::visible_none(); 1362*0b57cec5SDimitry Andric 1363*0b57cec5SDimitry Andric case Decl::Typedef: 1364*0b57cec5SDimitry Andric case Decl::TypeAlias: 1365*0b57cec5SDimitry Andric // A typedef declaration has linkage if it gives a type a name for 1366*0b57cec5SDimitry Andric // linkage purposes. 1367*0b57cec5SDimitry Andric if (!cast<TypedefNameDecl>(D) 1368*0b57cec5SDimitry Andric ->getAnonDeclWithTypedefName(/*AnyRedecl*/true)) 1369*0b57cec5SDimitry Andric return LinkageInfo::none(); 1370*0b57cec5SDimitry Andric break; 1371*0b57cec5SDimitry Andric 1372*0b57cec5SDimitry Andric case Decl::TemplateTemplateParm: // count these as external 1373*0b57cec5SDimitry Andric case Decl::NonTypeTemplateParm: 1374*0b57cec5SDimitry Andric case Decl::ObjCAtDefsField: 1375*0b57cec5SDimitry Andric case Decl::ObjCCategory: 1376*0b57cec5SDimitry Andric case Decl::ObjCCategoryImpl: 1377*0b57cec5SDimitry Andric case Decl::ObjCCompatibleAlias: 1378*0b57cec5SDimitry Andric case Decl::ObjCImplementation: 1379*0b57cec5SDimitry Andric case Decl::ObjCMethod: 1380*0b57cec5SDimitry Andric case Decl::ObjCProperty: 1381*0b57cec5SDimitry Andric case Decl::ObjCPropertyImpl: 1382*0b57cec5SDimitry Andric case Decl::ObjCProtocol: 1383*0b57cec5SDimitry Andric return getExternalLinkageFor(D); 1384*0b57cec5SDimitry Andric 1385*0b57cec5SDimitry Andric case Decl::CXXRecord: { 1386*0b57cec5SDimitry Andric const auto *Record = cast<CXXRecordDecl>(D); 1387*0b57cec5SDimitry Andric if (Record->isLambda()) { 1388*0b57cec5SDimitry Andric if (!Record->getLambdaManglingNumber()) { 1389*0b57cec5SDimitry Andric // This lambda has no mangling number, so it's internal. 1390*0b57cec5SDimitry Andric return getInternalLinkageFor(D); 1391*0b57cec5SDimitry Andric } 1392*0b57cec5SDimitry Andric 1393*0b57cec5SDimitry Andric // This lambda has its linkage/visibility determined: 1394*0b57cec5SDimitry Andric // - either by the outermost lambda if that lambda has no mangling 1395*0b57cec5SDimitry Andric // number. 1396*0b57cec5SDimitry Andric // - or by the parent of the outer most lambda 1397*0b57cec5SDimitry Andric // This prevents infinite recursion in settings such as nested lambdas 1398*0b57cec5SDimitry Andric // used in NSDMI's, for e.g. 1399*0b57cec5SDimitry Andric // struct L { 1400*0b57cec5SDimitry Andric // int t{}; 1401*0b57cec5SDimitry Andric // int t2 = ([](int a) { return [](int b) { return b; };})(t)(t); 1402*0b57cec5SDimitry Andric // }; 1403*0b57cec5SDimitry Andric const CXXRecordDecl *OuterMostLambda = 1404*0b57cec5SDimitry Andric getOutermostEnclosingLambda(Record); 1405*0b57cec5SDimitry Andric if (!OuterMostLambda->getLambdaManglingNumber()) 1406*0b57cec5SDimitry Andric return getInternalLinkageFor(D); 1407*0b57cec5SDimitry Andric 1408*0b57cec5SDimitry Andric return getLVForClosure( 1409*0b57cec5SDimitry Andric OuterMostLambda->getDeclContext()->getRedeclContext(), 1410*0b57cec5SDimitry Andric OuterMostLambda->getLambdaContextDecl(), computation); 1411*0b57cec5SDimitry Andric } 1412*0b57cec5SDimitry Andric 1413*0b57cec5SDimitry Andric break; 1414*0b57cec5SDimitry Andric } 1415*0b57cec5SDimitry Andric } 1416*0b57cec5SDimitry Andric 1417*0b57cec5SDimitry Andric // Handle linkage for namespace-scope names. 1418*0b57cec5SDimitry Andric if (D->getDeclContext()->getRedeclContext()->isFileContext()) 1419*0b57cec5SDimitry Andric return getLVForNamespaceScopeDecl(D, computation, IgnoreVarTypeLinkage); 1420*0b57cec5SDimitry Andric 1421*0b57cec5SDimitry Andric // C++ [basic.link]p5: 1422*0b57cec5SDimitry Andric // In addition, a member function, static data member, a named 1423*0b57cec5SDimitry Andric // class or enumeration of class scope, or an unnamed class or 1424*0b57cec5SDimitry Andric // enumeration defined in a class-scope typedef declaration such 1425*0b57cec5SDimitry Andric // that the class or enumeration has the typedef name for linkage 1426*0b57cec5SDimitry Andric // purposes (7.1.3), has external linkage if the name of the class 1427*0b57cec5SDimitry Andric // has external linkage. 1428*0b57cec5SDimitry Andric if (D->getDeclContext()->isRecord()) 1429*0b57cec5SDimitry Andric return getLVForClassMember(D, computation, IgnoreVarTypeLinkage); 1430*0b57cec5SDimitry Andric 1431*0b57cec5SDimitry Andric // C++ [basic.link]p6: 1432*0b57cec5SDimitry Andric // The name of a function declared in block scope and the name of 1433*0b57cec5SDimitry Andric // an object declared by a block scope extern declaration have 1434*0b57cec5SDimitry Andric // linkage. If there is a visible declaration of an entity with 1435*0b57cec5SDimitry Andric // linkage having the same name and type, ignoring entities 1436*0b57cec5SDimitry Andric // declared outside the innermost enclosing namespace scope, the 1437*0b57cec5SDimitry Andric // block scope declaration declares that same entity and receives 1438*0b57cec5SDimitry Andric // the linkage of the previous declaration. If there is more than 1439*0b57cec5SDimitry Andric // one such matching entity, the program is ill-formed. Otherwise, 1440*0b57cec5SDimitry Andric // if no matching entity is found, the block scope entity receives 1441*0b57cec5SDimitry Andric // external linkage. 1442*0b57cec5SDimitry Andric if (D->getDeclContext()->isFunctionOrMethod()) 1443*0b57cec5SDimitry Andric return getLVForLocalDecl(D, computation); 1444*0b57cec5SDimitry Andric 1445*0b57cec5SDimitry Andric // C++ [basic.link]p6: 1446*0b57cec5SDimitry Andric // Names not covered by these rules have no linkage. 1447*0b57cec5SDimitry Andric return LinkageInfo::none(); 1448*0b57cec5SDimitry Andric } 1449*0b57cec5SDimitry Andric 1450*0b57cec5SDimitry Andric /// getLVForDecl - Get the linkage and visibility for the given declaration. 1451*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::getLVForDecl(const NamedDecl *D, 1452*0b57cec5SDimitry Andric LVComputationKind computation) { 1453*0b57cec5SDimitry Andric // Internal_linkage attribute overrides other considerations. 1454*0b57cec5SDimitry Andric if (D->hasAttr<InternalLinkageAttr>()) 1455*0b57cec5SDimitry Andric return getInternalLinkageFor(D); 1456*0b57cec5SDimitry Andric 1457*0b57cec5SDimitry Andric if (computation.IgnoreAllVisibility && D->hasCachedLinkage()) 1458*0b57cec5SDimitry Andric return LinkageInfo(D->getCachedLinkage(), DefaultVisibility, false); 1459*0b57cec5SDimitry Andric 1460*0b57cec5SDimitry Andric if (llvm::Optional<LinkageInfo> LI = lookup(D, computation)) 1461*0b57cec5SDimitry Andric return *LI; 1462*0b57cec5SDimitry Andric 1463*0b57cec5SDimitry Andric LinkageInfo LV = computeLVForDecl(D, computation); 1464*0b57cec5SDimitry Andric if (D->hasCachedLinkage()) 1465*0b57cec5SDimitry Andric assert(D->getCachedLinkage() == LV.getLinkage()); 1466*0b57cec5SDimitry Andric 1467*0b57cec5SDimitry Andric D->setCachedLinkage(LV.getLinkage()); 1468*0b57cec5SDimitry Andric cache(D, computation, LV); 1469*0b57cec5SDimitry Andric 1470*0b57cec5SDimitry Andric #ifndef NDEBUG 1471*0b57cec5SDimitry Andric // In C (because of gnu inline) and in c++ with microsoft extensions an 1472*0b57cec5SDimitry Andric // static can follow an extern, so we can have two decls with different 1473*0b57cec5SDimitry Andric // linkages. 1474*0b57cec5SDimitry Andric const LangOptions &Opts = D->getASTContext().getLangOpts(); 1475*0b57cec5SDimitry Andric if (!Opts.CPlusPlus || Opts.MicrosoftExt) 1476*0b57cec5SDimitry Andric return LV; 1477*0b57cec5SDimitry Andric 1478*0b57cec5SDimitry Andric // We have just computed the linkage for this decl. By induction we know 1479*0b57cec5SDimitry Andric // that all other computed linkages match, check that the one we just 1480*0b57cec5SDimitry Andric // computed also does. 1481*0b57cec5SDimitry Andric NamedDecl *Old = nullptr; 1482*0b57cec5SDimitry Andric for (auto I : D->redecls()) { 1483*0b57cec5SDimitry Andric auto *T = cast<NamedDecl>(I); 1484*0b57cec5SDimitry Andric if (T == D) 1485*0b57cec5SDimitry Andric continue; 1486*0b57cec5SDimitry Andric if (!T->isInvalidDecl() && T->hasCachedLinkage()) { 1487*0b57cec5SDimitry Andric Old = T; 1488*0b57cec5SDimitry Andric break; 1489*0b57cec5SDimitry Andric } 1490*0b57cec5SDimitry Andric } 1491*0b57cec5SDimitry Andric assert(!Old || Old->getCachedLinkage() == D->getCachedLinkage()); 1492*0b57cec5SDimitry Andric #endif 1493*0b57cec5SDimitry Andric 1494*0b57cec5SDimitry Andric return LV; 1495*0b57cec5SDimitry Andric } 1496*0b57cec5SDimitry Andric 1497*0b57cec5SDimitry Andric LinkageInfo LinkageComputer::getDeclLinkageAndVisibility(const NamedDecl *D) { 1498*0b57cec5SDimitry Andric return getLVForDecl(D, 1499*0b57cec5SDimitry Andric LVComputationKind(usesTypeVisibility(D) 1500*0b57cec5SDimitry Andric ? NamedDecl::VisibilityForType 1501*0b57cec5SDimitry Andric : NamedDecl::VisibilityForValue)); 1502*0b57cec5SDimitry Andric } 1503*0b57cec5SDimitry Andric 1504*0b57cec5SDimitry Andric Module *Decl::getOwningModuleForLinkage(bool IgnoreLinkage) const { 1505*0b57cec5SDimitry Andric Module *M = getOwningModule(); 1506*0b57cec5SDimitry Andric if (!M) 1507*0b57cec5SDimitry Andric return nullptr; 1508*0b57cec5SDimitry Andric 1509*0b57cec5SDimitry Andric switch (M->Kind) { 1510*0b57cec5SDimitry Andric case Module::ModuleMapModule: 1511*0b57cec5SDimitry Andric // Module map modules have no special linkage semantics. 1512*0b57cec5SDimitry Andric return nullptr; 1513*0b57cec5SDimitry Andric 1514*0b57cec5SDimitry Andric case Module::ModuleInterfaceUnit: 1515*0b57cec5SDimitry Andric return M; 1516*0b57cec5SDimitry Andric 1517*0b57cec5SDimitry Andric case Module::GlobalModuleFragment: { 1518*0b57cec5SDimitry Andric // External linkage declarations in the global module have no owning module 1519*0b57cec5SDimitry Andric // for linkage purposes. But internal linkage declarations in the global 1520*0b57cec5SDimitry Andric // module fragment of a particular module are owned by that module for 1521*0b57cec5SDimitry Andric // linkage purposes. 1522*0b57cec5SDimitry Andric if (IgnoreLinkage) 1523*0b57cec5SDimitry Andric return nullptr; 1524*0b57cec5SDimitry Andric bool InternalLinkage; 1525*0b57cec5SDimitry Andric if (auto *ND = dyn_cast<NamedDecl>(this)) 1526*0b57cec5SDimitry Andric InternalLinkage = !ND->hasExternalFormalLinkage(); 1527*0b57cec5SDimitry Andric else { 1528*0b57cec5SDimitry Andric auto *NSD = dyn_cast<NamespaceDecl>(this); 1529*0b57cec5SDimitry Andric InternalLinkage = (NSD && NSD->isAnonymousNamespace()) || 1530*0b57cec5SDimitry Andric isInAnonymousNamespace(); 1531*0b57cec5SDimitry Andric } 1532*0b57cec5SDimitry Andric return InternalLinkage ? M->Parent : nullptr; 1533*0b57cec5SDimitry Andric } 1534*0b57cec5SDimitry Andric 1535*0b57cec5SDimitry Andric case Module::PrivateModuleFragment: 1536*0b57cec5SDimitry Andric // The private module fragment is part of its containing module for linkage 1537*0b57cec5SDimitry Andric // purposes. 1538*0b57cec5SDimitry Andric return M->Parent; 1539*0b57cec5SDimitry Andric } 1540*0b57cec5SDimitry Andric 1541*0b57cec5SDimitry Andric llvm_unreachable("unknown module kind"); 1542*0b57cec5SDimitry Andric } 1543*0b57cec5SDimitry Andric 1544*0b57cec5SDimitry Andric void NamedDecl::printName(raw_ostream &os) const { 1545*0b57cec5SDimitry Andric os << Name; 1546*0b57cec5SDimitry Andric } 1547*0b57cec5SDimitry Andric 1548*0b57cec5SDimitry Andric std::string NamedDecl::getQualifiedNameAsString() const { 1549*0b57cec5SDimitry Andric std::string QualName; 1550*0b57cec5SDimitry Andric llvm::raw_string_ostream OS(QualName); 1551*0b57cec5SDimitry Andric printQualifiedName(OS, getASTContext().getPrintingPolicy()); 1552*0b57cec5SDimitry Andric return OS.str(); 1553*0b57cec5SDimitry Andric } 1554*0b57cec5SDimitry Andric 1555*0b57cec5SDimitry Andric void NamedDecl::printQualifiedName(raw_ostream &OS) const { 1556*0b57cec5SDimitry Andric printQualifiedName(OS, getASTContext().getPrintingPolicy()); 1557*0b57cec5SDimitry Andric } 1558*0b57cec5SDimitry Andric 1559*0b57cec5SDimitry Andric void NamedDecl::printQualifiedName(raw_ostream &OS, 1560*0b57cec5SDimitry Andric const PrintingPolicy &P) const { 1561*0b57cec5SDimitry Andric const DeclContext *Ctx = getDeclContext(); 1562*0b57cec5SDimitry Andric 1563*0b57cec5SDimitry Andric // For ObjC methods and properties, look through categories and use the 1564*0b57cec5SDimitry Andric // interface as context. 1565*0b57cec5SDimitry Andric if (auto *MD = dyn_cast<ObjCMethodDecl>(this)) 1566*0b57cec5SDimitry Andric if (auto *ID = MD->getClassInterface()) 1567*0b57cec5SDimitry Andric Ctx = ID; 1568*0b57cec5SDimitry Andric if (auto *PD = dyn_cast<ObjCPropertyDecl>(this)) { 1569*0b57cec5SDimitry Andric if (auto *MD = PD->getGetterMethodDecl()) 1570*0b57cec5SDimitry Andric if (auto *ID = MD->getClassInterface()) 1571*0b57cec5SDimitry Andric Ctx = ID; 1572*0b57cec5SDimitry Andric } 1573*0b57cec5SDimitry Andric 1574*0b57cec5SDimitry Andric if (Ctx->isFunctionOrMethod()) { 1575*0b57cec5SDimitry Andric printName(OS); 1576*0b57cec5SDimitry Andric return; 1577*0b57cec5SDimitry Andric } 1578*0b57cec5SDimitry Andric 1579*0b57cec5SDimitry Andric using ContextsTy = SmallVector<const DeclContext *, 8>; 1580*0b57cec5SDimitry Andric ContextsTy Contexts; 1581*0b57cec5SDimitry Andric 1582*0b57cec5SDimitry Andric // Collect named contexts. 1583*0b57cec5SDimitry Andric while (Ctx) { 1584*0b57cec5SDimitry Andric if (isa<NamedDecl>(Ctx)) 1585*0b57cec5SDimitry Andric Contexts.push_back(Ctx); 1586*0b57cec5SDimitry Andric Ctx = Ctx->getParent(); 1587*0b57cec5SDimitry Andric } 1588*0b57cec5SDimitry Andric 1589*0b57cec5SDimitry Andric for (const DeclContext *DC : llvm::reverse(Contexts)) { 1590*0b57cec5SDimitry Andric if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) { 1591*0b57cec5SDimitry Andric OS << Spec->getName(); 1592*0b57cec5SDimitry Andric const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 1593*0b57cec5SDimitry Andric printTemplateArgumentList(OS, TemplateArgs.asArray(), P); 1594*0b57cec5SDimitry Andric } else if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) { 1595*0b57cec5SDimitry Andric if (P.SuppressUnwrittenScope && 1596*0b57cec5SDimitry Andric (ND->isAnonymousNamespace() || ND->isInline())) 1597*0b57cec5SDimitry Andric continue; 1598*0b57cec5SDimitry Andric if (ND->isAnonymousNamespace()) { 1599*0b57cec5SDimitry Andric OS << (P.MSVCFormatting ? "`anonymous namespace\'" 1600*0b57cec5SDimitry Andric : "(anonymous namespace)"); 1601*0b57cec5SDimitry Andric } 1602*0b57cec5SDimitry Andric else 1603*0b57cec5SDimitry Andric OS << *ND; 1604*0b57cec5SDimitry Andric } else if (const auto *RD = dyn_cast<RecordDecl>(DC)) { 1605*0b57cec5SDimitry Andric if (!RD->getIdentifier()) 1606*0b57cec5SDimitry Andric OS << "(anonymous " << RD->getKindName() << ')'; 1607*0b57cec5SDimitry Andric else 1608*0b57cec5SDimitry Andric OS << *RD; 1609*0b57cec5SDimitry Andric } else if (const auto *FD = dyn_cast<FunctionDecl>(DC)) { 1610*0b57cec5SDimitry Andric const FunctionProtoType *FT = nullptr; 1611*0b57cec5SDimitry Andric if (FD->hasWrittenPrototype()) 1612*0b57cec5SDimitry Andric FT = dyn_cast<FunctionProtoType>(FD->getType()->castAs<FunctionType>()); 1613*0b57cec5SDimitry Andric 1614*0b57cec5SDimitry Andric OS << *FD << '('; 1615*0b57cec5SDimitry Andric if (FT) { 1616*0b57cec5SDimitry Andric unsigned NumParams = FD->getNumParams(); 1617*0b57cec5SDimitry Andric for (unsigned i = 0; i < NumParams; ++i) { 1618*0b57cec5SDimitry Andric if (i) 1619*0b57cec5SDimitry Andric OS << ", "; 1620*0b57cec5SDimitry Andric OS << FD->getParamDecl(i)->getType().stream(P); 1621*0b57cec5SDimitry Andric } 1622*0b57cec5SDimitry Andric 1623*0b57cec5SDimitry Andric if (FT->isVariadic()) { 1624*0b57cec5SDimitry Andric if (NumParams > 0) 1625*0b57cec5SDimitry Andric OS << ", "; 1626*0b57cec5SDimitry Andric OS << "..."; 1627*0b57cec5SDimitry Andric } 1628*0b57cec5SDimitry Andric } 1629*0b57cec5SDimitry Andric OS << ')'; 1630*0b57cec5SDimitry Andric } else if (const auto *ED = dyn_cast<EnumDecl>(DC)) { 1631*0b57cec5SDimitry Andric // C++ [dcl.enum]p10: Each enum-name and each unscoped 1632*0b57cec5SDimitry Andric // enumerator is declared in the scope that immediately contains 1633*0b57cec5SDimitry Andric // the enum-specifier. Each scoped enumerator is declared in the 1634*0b57cec5SDimitry Andric // scope of the enumeration. 1635*0b57cec5SDimitry Andric // For the case of unscoped enumerator, do not include in the qualified 1636*0b57cec5SDimitry Andric // name any information about its enum enclosing scope, as its visibility 1637*0b57cec5SDimitry Andric // is global. 1638*0b57cec5SDimitry Andric if (ED->isScoped()) 1639*0b57cec5SDimitry Andric OS << *ED; 1640*0b57cec5SDimitry Andric else 1641*0b57cec5SDimitry Andric continue; 1642*0b57cec5SDimitry Andric } else { 1643*0b57cec5SDimitry Andric OS << *cast<NamedDecl>(DC); 1644*0b57cec5SDimitry Andric } 1645*0b57cec5SDimitry Andric OS << "::"; 1646*0b57cec5SDimitry Andric } 1647*0b57cec5SDimitry Andric 1648*0b57cec5SDimitry Andric if (getDeclName() || isa<DecompositionDecl>(this)) 1649*0b57cec5SDimitry Andric OS << *this; 1650*0b57cec5SDimitry Andric else 1651*0b57cec5SDimitry Andric OS << "(anonymous)"; 1652*0b57cec5SDimitry Andric } 1653*0b57cec5SDimitry Andric 1654*0b57cec5SDimitry Andric void NamedDecl::getNameForDiagnostic(raw_ostream &OS, 1655*0b57cec5SDimitry Andric const PrintingPolicy &Policy, 1656*0b57cec5SDimitry Andric bool Qualified) const { 1657*0b57cec5SDimitry Andric if (Qualified) 1658*0b57cec5SDimitry Andric printQualifiedName(OS, Policy); 1659*0b57cec5SDimitry Andric else 1660*0b57cec5SDimitry Andric printName(OS); 1661*0b57cec5SDimitry Andric } 1662*0b57cec5SDimitry Andric 1663*0b57cec5SDimitry Andric template<typename T> static bool isRedeclarableImpl(Redeclarable<T> *) { 1664*0b57cec5SDimitry Andric return true; 1665*0b57cec5SDimitry Andric } 1666*0b57cec5SDimitry Andric static bool isRedeclarableImpl(...) { return false; } 1667*0b57cec5SDimitry Andric static bool isRedeclarable(Decl::Kind K) { 1668*0b57cec5SDimitry Andric switch (K) { 1669*0b57cec5SDimitry Andric #define DECL(Type, Base) \ 1670*0b57cec5SDimitry Andric case Decl::Type: \ 1671*0b57cec5SDimitry Andric return isRedeclarableImpl((Type##Decl *)nullptr); 1672*0b57cec5SDimitry Andric #define ABSTRACT_DECL(DECL) 1673*0b57cec5SDimitry Andric #include "clang/AST/DeclNodes.inc" 1674*0b57cec5SDimitry Andric } 1675*0b57cec5SDimitry Andric llvm_unreachable("unknown decl kind"); 1676*0b57cec5SDimitry Andric } 1677*0b57cec5SDimitry Andric 1678*0b57cec5SDimitry Andric bool NamedDecl::declarationReplaces(NamedDecl *OldD, bool IsKnownNewer) const { 1679*0b57cec5SDimitry Andric assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 1680*0b57cec5SDimitry Andric 1681*0b57cec5SDimitry Andric // Never replace one imported declaration with another; we need both results 1682*0b57cec5SDimitry Andric // when re-exporting. 1683*0b57cec5SDimitry Andric if (OldD->isFromASTFile() && isFromASTFile()) 1684*0b57cec5SDimitry Andric return false; 1685*0b57cec5SDimitry Andric 1686*0b57cec5SDimitry Andric // A kind mismatch implies that the declaration is not replaced. 1687*0b57cec5SDimitry Andric if (OldD->getKind() != getKind()) 1688*0b57cec5SDimitry Andric return false; 1689*0b57cec5SDimitry Andric 1690*0b57cec5SDimitry Andric // For method declarations, we never replace. (Why?) 1691*0b57cec5SDimitry Andric if (isa<ObjCMethodDecl>(this)) 1692*0b57cec5SDimitry Andric return false; 1693*0b57cec5SDimitry Andric 1694*0b57cec5SDimitry Andric // For parameters, pick the newer one. This is either an error or (in 1695*0b57cec5SDimitry Andric // Objective-C) permitted as an extension. 1696*0b57cec5SDimitry Andric if (isa<ParmVarDecl>(this)) 1697*0b57cec5SDimitry Andric return true; 1698*0b57cec5SDimitry Andric 1699*0b57cec5SDimitry Andric // Inline namespaces can give us two declarations with the same 1700*0b57cec5SDimitry Andric // name and kind in the same scope but different contexts; we should 1701*0b57cec5SDimitry Andric // keep both declarations in this case. 1702*0b57cec5SDimitry Andric if (!this->getDeclContext()->getRedeclContext()->Equals( 1703*0b57cec5SDimitry Andric OldD->getDeclContext()->getRedeclContext())) 1704*0b57cec5SDimitry Andric return false; 1705*0b57cec5SDimitry Andric 1706*0b57cec5SDimitry Andric // Using declarations can be replaced if they import the same name from the 1707*0b57cec5SDimitry Andric // same context. 1708*0b57cec5SDimitry Andric if (auto *UD = dyn_cast<UsingDecl>(this)) { 1709*0b57cec5SDimitry Andric ASTContext &Context = getASTContext(); 1710*0b57cec5SDimitry Andric return Context.getCanonicalNestedNameSpecifier(UD->getQualifier()) == 1711*0b57cec5SDimitry Andric Context.getCanonicalNestedNameSpecifier( 1712*0b57cec5SDimitry Andric cast<UsingDecl>(OldD)->getQualifier()); 1713*0b57cec5SDimitry Andric } 1714*0b57cec5SDimitry Andric if (auto *UUVD = dyn_cast<UnresolvedUsingValueDecl>(this)) { 1715*0b57cec5SDimitry Andric ASTContext &Context = getASTContext(); 1716*0b57cec5SDimitry Andric return Context.getCanonicalNestedNameSpecifier(UUVD->getQualifier()) == 1717*0b57cec5SDimitry Andric Context.getCanonicalNestedNameSpecifier( 1718*0b57cec5SDimitry Andric cast<UnresolvedUsingValueDecl>(OldD)->getQualifier()); 1719*0b57cec5SDimitry Andric } 1720*0b57cec5SDimitry Andric 1721*0b57cec5SDimitry Andric if (isRedeclarable(getKind())) { 1722*0b57cec5SDimitry Andric if (getCanonicalDecl() != OldD->getCanonicalDecl()) 1723*0b57cec5SDimitry Andric return false; 1724*0b57cec5SDimitry Andric 1725*0b57cec5SDimitry Andric if (IsKnownNewer) 1726*0b57cec5SDimitry Andric return true; 1727*0b57cec5SDimitry Andric 1728*0b57cec5SDimitry Andric // Check whether this is actually newer than OldD. We want to keep the 1729*0b57cec5SDimitry Andric // newer declaration. This loop will usually only iterate once, because 1730*0b57cec5SDimitry Andric // OldD is usually the previous declaration. 1731*0b57cec5SDimitry Andric for (auto D : redecls()) { 1732*0b57cec5SDimitry Andric if (D == OldD) 1733*0b57cec5SDimitry Andric break; 1734*0b57cec5SDimitry Andric 1735*0b57cec5SDimitry Andric // If we reach the canonical declaration, then OldD is not actually older 1736*0b57cec5SDimitry Andric // than this one. 1737*0b57cec5SDimitry Andric // 1738*0b57cec5SDimitry Andric // FIXME: In this case, we should not add this decl to the lookup table. 1739*0b57cec5SDimitry Andric if (D->isCanonicalDecl()) 1740*0b57cec5SDimitry Andric return false; 1741*0b57cec5SDimitry Andric } 1742*0b57cec5SDimitry Andric 1743*0b57cec5SDimitry Andric // It's a newer declaration of the same kind of declaration in the same 1744*0b57cec5SDimitry Andric // scope: we want this decl instead of the existing one. 1745*0b57cec5SDimitry Andric return true; 1746*0b57cec5SDimitry Andric } 1747*0b57cec5SDimitry Andric 1748*0b57cec5SDimitry Andric // In all other cases, we need to keep both declarations in case they have 1749*0b57cec5SDimitry Andric // different visibility. Any attempt to use the name will result in an 1750*0b57cec5SDimitry Andric // ambiguity if more than one is visible. 1751*0b57cec5SDimitry Andric return false; 1752*0b57cec5SDimitry Andric } 1753*0b57cec5SDimitry Andric 1754*0b57cec5SDimitry Andric bool NamedDecl::hasLinkage() const { 1755*0b57cec5SDimitry Andric return getFormalLinkage() != NoLinkage; 1756*0b57cec5SDimitry Andric } 1757*0b57cec5SDimitry Andric 1758*0b57cec5SDimitry Andric NamedDecl *NamedDecl::getUnderlyingDeclImpl() { 1759*0b57cec5SDimitry Andric NamedDecl *ND = this; 1760*0b57cec5SDimitry Andric while (auto *UD = dyn_cast<UsingShadowDecl>(ND)) 1761*0b57cec5SDimitry Andric ND = UD->getTargetDecl(); 1762*0b57cec5SDimitry Andric 1763*0b57cec5SDimitry Andric if (auto *AD = dyn_cast<ObjCCompatibleAliasDecl>(ND)) 1764*0b57cec5SDimitry Andric return AD->getClassInterface(); 1765*0b57cec5SDimitry Andric 1766*0b57cec5SDimitry Andric if (auto *AD = dyn_cast<NamespaceAliasDecl>(ND)) 1767*0b57cec5SDimitry Andric return AD->getNamespace(); 1768*0b57cec5SDimitry Andric 1769*0b57cec5SDimitry Andric return ND; 1770*0b57cec5SDimitry Andric } 1771*0b57cec5SDimitry Andric 1772*0b57cec5SDimitry Andric bool NamedDecl::isCXXInstanceMember() const { 1773*0b57cec5SDimitry Andric if (!isCXXClassMember()) 1774*0b57cec5SDimitry Andric return false; 1775*0b57cec5SDimitry Andric 1776*0b57cec5SDimitry Andric const NamedDecl *D = this; 1777*0b57cec5SDimitry Andric if (isa<UsingShadowDecl>(D)) 1778*0b57cec5SDimitry Andric D = cast<UsingShadowDecl>(D)->getTargetDecl(); 1779*0b57cec5SDimitry Andric 1780*0b57cec5SDimitry Andric if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D) || isa<MSPropertyDecl>(D)) 1781*0b57cec5SDimitry Andric return true; 1782*0b57cec5SDimitry Andric if (const auto *MD = dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction())) 1783*0b57cec5SDimitry Andric return MD->isInstance(); 1784*0b57cec5SDimitry Andric return false; 1785*0b57cec5SDimitry Andric } 1786*0b57cec5SDimitry Andric 1787*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1788*0b57cec5SDimitry Andric // DeclaratorDecl Implementation 1789*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1790*0b57cec5SDimitry Andric 1791*0b57cec5SDimitry Andric template <typename DeclT> 1792*0b57cec5SDimitry Andric static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl) { 1793*0b57cec5SDimitry Andric if (decl->getNumTemplateParameterLists() > 0) 1794*0b57cec5SDimitry Andric return decl->getTemplateParameterList(0)->getTemplateLoc(); 1795*0b57cec5SDimitry Andric else 1796*0b57cec5SDimitry Andric return decl->getInnerLocStart(); 1797*0b57cec5SDimitry Andric } 1798*0b57cec5SDimitry Andric 1799*0b57cec5SDimitry Andric SourceLocation DeclaratorDecl::getTypeSpecStartLoc() const { 1800*0b57cec5SDimitry Andric TypeSourceInfo *TSI = getTypeSourceInfo(); 1801*0b57cec5SDimitry Andric if (TSI) return TSI->getTypeLoc().getBeginLoc(); 1802*0b57cec5SDimitry Andric return SourceLocation(); 1803*0b57cec5SDimitry Andric } 1804*0b57cec5SDimitry Andric 1805*0b57cec5SDimitry Andric void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) { 1806*0b57cec5SDimitry Andric if (QualifierLoc) { 1807*0b57cec5SDimitry Andric // Make sure the extended decl info is allocated. 1808*0b57cec5SDimitry Andric if (!hasExtInfo()) { 1809*0b57cec5SDimitry Andric // Save (non-extended) type source info pointer. 1810*0b57cec5SDimitry Andric auto *savedTInfo = DeclInfo.get<TypeSourceInfo*>(); 1811*0b57cec5SDimitry Andric // Allocate external info struct. 1812*0b57cec5SDimitry Andric DeclInfo = new (getASTContext()) ExtInfo; 1813*0b57cec5SDimitry Andric // Restore savedTInfo into (extended) decl info. 1814*0b57cec5SDimitry Andric getExtInfo()->TInfo = savedTInfo; 1815*0b57cec5SDimitry Andric } 1816*0b57cec5SDimitry Andric // Set qualifier info. 1817*0b57cec5SDimitry Andric getExtInfo()->QualifierLoc = QualifierLoc; 1818*0b57cec5SDimitry Andric } else { 1819*0b57cec5SDimitry Andric // Here Qualifier == 0, i.e., we are removing the qualifier (if any). 1820*0b57cec5SDimitry Andric if (hasExtInfo()) { 1821*0b57cec5SDimitry Andric if (getExtInfo()->NumTemplParamLists == 0) { 1822*0b57cec5SDimitry Andric // Save type source info pointer. 1823*0b57cec5SDimitry Andric TypeSourceInfo *savedTInfo = getExtInfo()->TInfo; 1824*0b57cec5SDimitry Andric // Deallocate the extended decl info. 1825*0b57cec5SDimitry Andric getASTContext().Deallocate(getExtInfo()); 1826*0b57cec5SDimitry Andric // Restore savedTInfo into (non-extended) decl info. 1827*0b57cec5SDimitry Andric DeclInfo = savedTInfo; 1828*0b57cec5SDimitry Andric } 1829*0b57cec5SDimitry Andric else 1830*0b57cec5SDimitry Andric getExtInfo()->QualifierLoc = QualifierLoc; 1831*0b57cec5SDimitry Andric } 1832*0b57cec5SDimitry Andric } 1833*0b57cec5SDimitry Andric } 1834*0b57cec5SDimitry Andric 1835*0b57cec5SDimitry Andric void DeclaratorDecl::setTemplateParameterListsInfo( 1836*0b57cec5SDimitry Andric ASTContext &Context, ArrayRef<TemplateParameterList *> TPLists) { 1837*0b57cec5SDimitry Andric assert(!TPLists.empty()); 1838*0b57cec5SDimitry Andric // Make sure the extended decl info is allocated. 1839*0b57cec5SDimitry Andric if (!hasExtInfo()) { 1840*0b57cec5SDimitry Andric // Save (non-extended) type source info pointer. 1841*0b57cec5SDimitry Andric auto *savedTInfo = DeclInfo.get<TypeSourceInfo*>(); 1842*0b57cec5SDimitry Andric // Allocate external info struct. 1843*0b57cec5SDimitry Andric DeclInfo = new (getASTContext()) ExtInfo; 1844*0b57cec5SDimitry Andric // Restore savedTInfo into (extended) decl info. 1845*0b57cec5SDimitry Andric getExtInfo()->TInfo = savedTInfo; 1846*0b57cec5SDimitry Andric } 1847*0b57cec5SDimitry Andric // Set the template parameter lists info. 1848*0b57cec5SDimitry Andric getExtInfo()->setTemplateParameterListsInfo(Context, TPLists); 1849*0b57cec5SDimitry Andric } 1850*0b57cec5SDimitry Andric 1851*0b57cec5SDimitry Andric SourceLocation DeclaratorDecl::getOuterLocStart() const { 1852*0b57cec5SDimitry Andric return getTemplateOrInnerLocStart(this); 1853*0b57cec5SDimitry Andric } 1854*0b57cec5SDimitry Andric 1855*0b57cec5SDimitry Andric // Helper function: returns true if QT is or contains a type 1856*0b57cec5SDimitry Andric // having a postfix component. 1857*0b57cec5SDimitry Andric static bool typeIsPostfix(QualType QT) { 1858*0b57cec5SDimitry Andric while (true) { 1859*0b57cec5SDimitry Andric const Type* T = QT.getTypePtr(); 1860*0b57cec5SDimitry Andric switch (T->getTypeClass()) { 1861*0b57cec5SDimitry Andric default: 1862*0b57cec5SDimitry Andric return false; 1863*0b57cec5SDimitry Andric case Type::Pointer: 1864*0b57cec5SDimitry Andric QT = cast<PointerType>(T)->getPointeeType(); 1865*0b57cec5SDimitry Andric break; 1866*0b57cec5SDimitry Andric case Type::BlockPointer: 1867*0b57cec5SDimitry Andric QT = cast<BlockPointerType>(T)->getPointeeType(); 1868*0b57cec5SDimitry Andric break; 1869*0b57cec5SDimitry Andric case Type::MemberPointer: 1870*0b57cec5SDimitry Andric QT = cast<MemberPointerType>(T)->getPointeeType(); 1871*0b57cec5SDimitry Andric break; 1872*0b57cec5SDimitry Andric case Type::LValueReference: 1873*0b57cec5SDimitry Andric case Type::RValueReference: 1874*0b57cec5SDimitry Andric QT = cast<ReferenceType>(T)->getPointeeType(); 1875*0b57cec5SDimitry Andric break; 1876*0b57cec5SDimitry Andric case Type::PackExpansion: 1877*0b57cec5SDimitry Andric QT = cast<PackExpansionType>(T)->getPattern(); 1878*0b57cec5SDimitry Andric break; 1879*0b57cec5SDimitry Andric case Type::Paren: 1880*0b57cec5SDimitry Andric case Type::ConstantArray: 1881*0b57cec5SDimitry Andric case Type::DependentSizedArray: 1882*0b57cec5SDimitry Andric case Type::IncompleteArray: 1883*0b57cec5SDimitry Andric case Type::VariableArray: 1884*0b57cec5SDimitry Andric case Type::FunctionProto: 1885*0b57cec5SDimitry Andric case Type::FunctionNoProto: 1886*0b57cec5SDimitry Andric return true; 1887*0b57cec5SDimitry Andric } 1888*0b57cec5SDimitry Andric } 1889*0b57cec5SDimitry Andric } 1890*0b57cec5SDimitry Andric 1891*0b57cec5SDimitry Andric SourceRange DeclaratorDecl::getSourceRange() const { 1892*0b57cec5SDimitry Andric SourceLocation RangeEnd = getLocation(); 1893*0b57cec5SDimitry Andric if (TypeSourceInfo *TInfo = getTypeSourceInfo()) { 1894*0b57cec5SDimitry Andric // If the declaration has no name or the type extends past the name take the 1895*0b57cec5SDimitry Andric // end location of the type. 1896*0b57cec5SDimitry Andric if (!getDeclName() || typeIsPostfix(TInfo->getType())) 1897*0b57cec5SDimitry Andric RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); 1898*0b57cec5SDimitry Andric } 1899*0b57cec5SDimitry Andric return SourceRange(getOuterLocStart(), RangeEnd); 1900*0b57cec5SDimitry Andric } 1901*0b57cec5SDimitry Andric 1902*0b57cec5SDimitry Andric void QualifierInfo::setTemplateParameterListsInfo( 1903*0b57cec5SDimitry Andric ASTContext &Context, ArrayRef<TemplateParameterList *> TPLists) { 1904*0b57cec5SDimitry Andric // Free previous template parameters (if any). 1905*0b57cec5SDimitry Andric if (NumTemplParamLists > 0) { 1906*0b57cec5SDimitry Andric Context.Deallocate(TemplParamLists); 1907*0b57cec5SDimitry Andric TemplParamLists = nullptr; 1908*0b57cec5SDimitry Andric NumTemplParamLists = 0; 1909*0b57cec5SDimitry Andric } 1910*0b57cec5SDimitry Andric // Set info on matched template parameter lists (if any). 1911*0b57cec5SDimitry Andric if (!TPLists.empty()) { 1912*0b57cec5SDimitry Andric TemplParamLists = new (Context) TemplateParameterList *[TPLists.size()]; 1913*0b57cec5SDimitry Andric NumTemplParamLists = TPLists.size(); 1914*0b57cec5SDimitry Andric std::copy(TPLists.begin(), TPLists.end(), TemplParamLists); 1915*0b57cec5SDimitry Andric } 1916*0b57cec5SDimitry Andric } 1917*0b57cec5SDimitry Andric 1918*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1919*0b57cec5SDimitry Andric // VarDecl Implementation 1920*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1921*0b57cec5SDimitry Andric 1922*0b57cec5SDimitry Andric const char *VarDecl::getStorageClassSpecifierString(StorageClass SC) { 1923*0b57cec5SDimitry Andric switch (SC) { 1924*0b57cec5SDimitry Andric case SC_None: break; 1925*0b57cec5SDimitry Andric case SC_Auto: return "auto"; 1926*0b57cec5SDimitry Andric case SC_Extern: return "extern"; 1927*0b57cec5SDimitry Andric case SC_PrivateExtern: return "__private_extern__"; 1928*0b57cec5SDimitry Andric case SC_Register: return "register"; 1929*0b57cec5SDimitry Andric case SC_Static: return "static"; 1930*0b57cec5SDimitry Andric } 1931*0b57cec5SDimitry Andric 1932*0b57cec5SDimitry Andric llvm_unreachable("Invalid storage class"); 1933*0b57cec5SDimitry Andric } 1934*0b57cec5SDimitry Andric 1935*0b57cec5SDimitry Andric VarDecl::VarDecl(Kind DK, ASTContext &C, DeclContext *DC, 1936*0b57cec5SDimitry Andric SourceLocation StartLoc, SourceLocation IdLoc, 1937*0b57cec5SDimitry Andric IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, 1938*0b57cec5SDimitry Andric StorageClass SC) 1939*0b57cec5SDimitry Andric : DeclaratorDecl(DK, DC, IdLoc, Id, T, TInfo, StartLoc), 1940*0b57cec5SDimitry Andric redeclarable_base(C) { 1941*0b57cec5SDimitry Andric static_assert(sizeof(VarDeclBitfields) <= sizeof(unsigned), 1942*0b57cec5SDimitry Andric "VarDeclBitfields too large!"); 1943*0b57cec5SDimitry Andric static_assert(sizeof(ParmVarDeclBitfields) <= sizeof(unsigned), 1944*0b57cec5SDimitry Andric "ParmVarDeclBitfields too large!"); 1945*0b57cec5SDimitry Andric static_assert(sizeof(NonParmVarDeclBitfields) <= sizeof(unsigned), 1946*0b57cec5SDimitry Andric "NonParmVarDeclBitfields too large!"); 1947*0b57cec5SDimitry Andric AllBits = 0; 1948*0b57cec5SDimitry Andric VarDeclBits.SClass = SC; 1949*0b57cec5SDimitry Andric // Everything else is implicitly initialized to false. 1950*0b57cec5SDimitry Andric } 1951*0b57cec5SDimitry Andric 1952*0b57cec5SDimitry Andric VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, 1953*0b57cec5SDimitry Andric SourceLocation StartL, SourceLocation IdL, 1954*0b57cec5SDimitry Andric IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, 1955*0b57cec5SDimitry Andric StorageClass S) { 1956*0b57cec5SDimitry Andric return new (C, DC) VarDecl(Var, C, DC, StartL, IdL, Id, T, TInfo, S); 1957*0b57cec5SDimitry Andric } 1958*0b57cec5SDimitry Andric 1959*0b57cec5SDimitry Andric VarDecl *VarDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1960*0b57cec5SDimitry Andric return new (C, ID) 1961*0b57cec5SDimitry Andric VarDecl(Var, C, nullptr, SourceLocation(), SourceLocation(), nullptr, 1962*0b57cec5SDimitry Andric QualType(), nullptr, SC_None); 1963*0b57cec5SDimitry Andric } 1964*0b57cec5SDimitry Andric 1965*0b57cec5SDimitry Andric void VarDecl::setStorageClass(StorageClass SC) { 1966*0b57cec5SDimitry Andric assert(isLegalForVariable(SC)); 1967*0b57cec5SDimitry Andric VarDeclBits.SClass = SC; 1968*0b57cec5SDimitry Andric } 1969*0b57cec5SDimitry Andric 1970*0b57cec5SDimitry Andric VarDecl::TLSKind VarDecl::getTLSKind() const { 1971*0b57cec5SDimitry Andric switch (VarDeclBits.TSCSpec) { 1972*0b57cec5SDimitry Andric case TSCS_unspecified: 1973*0b57cec5SDimitry Andric if (!hasAttr<ThreadAttr>() && 1974*0b57cec5SDimitry Andric !(getASTContext().getLangOpts().OpenMPUseTLS && 1975*0b57cec5SDimitry Andric getASTContext().getTargetInfo().isTLSSupported() && 1976*0b57cec5SDimitry Andric hasAttr<OMPThreadPrivateDeclAttr>())) 1977*0b57cec5SDimitry Andric return TLS_None; 1978*0b57cec5SDimitry Andric return ((getASTContext().getLangOpts().isCompatibleWithMSVC( 1979*0b57cec5SDimitry Andric LangOptions::MSVC2015)) || 1980*0b57cec5SDimitry Andric hasAttr<OMPThreadPrivateDeclAttr>()) 1981*0b57cec5SDimitry Andric ? TLS_Dynamic 1982*0b57cec5SDimitry Andric : TLS_Static; 1983*0b57cec5SDimitry Andric case TSCS___thread: // Fall through. 1984*0b57cec5SDimitry Andric case TSCS__Thread_local: 1985*0b57cec5SDimitry Andric return TLS_Static; 1986*0b57cec5SDimitry Andric case TSCS_thread_local: 1987*0b57cec5SDimitry Andric return TLS_Dynamic; 1988*0b57cec5SDimitry Andric } 1989*0b57cec5SDimitry Andric llvm_unreachable("Unknown thread storage class specifier!"); 1990*0b57cec5SDimitry Andric } 1991*0b57cec5SDimitry Andric 1992*0b57cec5SDimitry Andric SourceRange VarDecl::getSourceRange() const { 1993*0b57cec5SDimitry Andric if (const Expr *Init = getInit()) { 1994*0b57cec5SDimitry Andric SourceLocation InitEnd = Init->getEndLoc(); 1995*0b57cec5SDimitry Andric // If Init is implicit, ignore its source range and fallback on 1996*0b57cec5SDimitry Andric // DeclaratorDecl::getSourceRange() to handle postfix elements. 1997*0b57cec5SDimitry Andric if (InitEnd.isValid() && InitEnd != getLocation()) 1998*0b57cec5SDimitry Andric return SourceRange(getOuterLocStart(), InitEnd); 1999*0b57cec5SDimitry Andric } 2000*0b57cec5SDimitry Andric return DeclaratorDecl::getSourceRange(); 2001*0b57cec5SDimitry Andric } 2002*0b57cec5SDimitry Andric 2003*0b57cec5SDimitry Andric template<typename T> 2004*0b57cec5SDimitry Andric static LanguageLinkage getDeclLanguageLinkage(const T &D) { 2005*0b57cec5SDimitry Andric // C++ [dcl.link]p1: All function types, function names with external linkage, 2006*0b57cec5SDimitry Andric // and variable names with external linkage have a language linkage. 2007*0b57cec5SDimitry Andric if (!D.hasExternalFormalLinkage()) 2008*0b57cec5SDimitry Andric return NoLanguageLinkage; 2009*0b57cec5SDimitry Andric 2010*0b57cec5SDimitry Andric // Language linkage is a C++ concept, but saying that everything else in C has 2011*0b57cec5SDimitry Andric // C language linkage fits the implementation nicely. 2012*0b57cec5SDimitry Andric ASTContext &Context = D.getASTContext(); 2013*0b57cec5SDimitry Andric if (!Context.getLangOpts().CPlusPlus) 2014*0b57cec5SDimitry Andric return CLanguageLinkage; 2015*0b57cec5SDimitry Andric 2016*0b57cec5SDimitry Andric // C++ [dcl.link]p4: A C language linkage is ignored in determining the 2017*0b57cec5SDimitry Andric // language linkage of the names of class members and the function type of 2018*0b57cec5SDimitry Andric // class member functions. 2019*0b57cec5SDimitry Andric const DeclContext *DC = D.getDeclContext(); 2020*0b57cec5SDimitry Andric if (DC->isRecord()) 2021*0b57cec5SDimitry Andric return CXXLanguageLinkage; 2022*0b57cec5SDimitry Andric 2023*0b57cec5SDimitry Andric // If the first decl is in an extern "C" context, any other redeclaration 2024*0b57cec5SDimitry Andric // will have C language linkage. If the first one is not in an extern "C" 2025*0b57cec5SDimitry Andric // context, we would have reported an error for any other decl being in one. 2026*0b57cec5SDimitry Andric if (isFirstInExternCContext(&D)) 2027*0b57cec5SDimitry Andric return CLanguageLinkage; 2028*0b57cec5SDimitry Andric return CXXLanguageLinkage; 2029*0b57cec5SDimitry Andric } 2030*0b57cec5SDimitry Andric 2031*0b57cec5SDimitry Andric template<typename T> 2032*0b57cec5SDimitry Andric static bool isDeclExternC(const T &D) { 2033*0b57cec5SDimitry Andric // Since the context is ignored for class members, they can only have C++ 2034*0b57cec5SDimitry Andric // language linkage or no language linkage. 2035*0b57cec5SDimitry Andric const DeclContext *DC = D.getDeclContext(); 2036*0b57cec5SDimitry Andric if (DC->isRecord()) { 2037*0b57cec5SDimitry Andric assert(D.getASTContext().getLangOpts().CPlusPlus); 2038*0b57cec5SDimitry Andric return false; 2039*0b57cec5SDimitry Andric } 2040*0b57cec5SDimitry Andric 2041*0b57cec5SDimitry Andric return D.getLanguageLinkage() == CLanguageLinkage; 2042*0b57cec5SDimitry Andric } 2043*0b57cec5SDimitry Andric 2044*0b57cec5SDimitry Andric LanguageLinkage VarDecl::getLanguageLinkage() const { 2045*0b57cec5SDimitry Andric return getDeclLanguageLinkage(*this); 2046*0b57cec5SDimitry Andric } 2047*0b57cec5SDimitry Andric 2048*0b57cec5SDimitry Andric bool VarDecl::isExternC() const { 2049*0b57cec5SDimitry Andric return isDeclExternC(*this); 2050*0b57cec5SDimitry Andric } 2051*0b57cec5SDimitry Andric 2052*0b57cec5SDimitry Andric bool VarDecl::isInExternCContext() const { 2053*0b57cec5SDimitry Andric return getLexicalDeclContext()->isExternCContext(); 2054*0b57cec5SDimitry Andric } 2055*0b57cec5SDimitry Andric 2056*0b57cec5SDimitry Andric bool VarDecl::isInExternCXXContext() const { 2057*0b57cec5SDimitry Andric return getLexicalDeclContext()->isExternCXXContext(); 2058*0b57cec5SDimitry Andric } 2059*0b57cec5SDimitry Andric 2060*0b57cec5SDimitry Andric VarDecl *VarDecl::getCanonicalDecl() { return getFirstDecl(); } 2061*0b57cec5SDimitry Andric 2062*0b57cec5SDimitry Andric VarDecl::DefinitionKind 2063*0b57cec5SDimitry Andric VarDecl::isThisDeclarationADefinition(ASTContext &C) const { 2064*0b57cec5SDimitry Andric if (isThisDeclarationADemotedDefinition()) 2065*0b57cec5SDimitry Andric return DeclarationOnly; 2066*0b57cec5SDimitry Andric 2067*0b57cec5SDimitry Andric // C++ [basic.def]p2: 2068*0b57cec5SDimitry Andric // A declaration is a definition unless [...] it contains the 'extern' 2069*0b57cec5SDimitry Andric // specifier or a linkage-specification and neither an initializer [...], 2070*0b57cec5SDimitry Andric // it declares a non-inline static data member in a class declaration [...], 2071*0b57cec5SDimitry Andric // it declares a static data member outside a class definition and the variable 2072*0b57cec5SDimitry Andric // was defined within the class with the constexpr specifier [...], 2073*0b57cec5SDimitry Andric // C++1y [temp.expl.spec]p15: 2074*0b57cec5SDimitry Andric // An explicit specialization of a static data member or an explicit 2075*0b57cec5SDimitry Andric // specialization of a static data member template is a definition if the 2076*0b57cec5SDimitry Andric // declaration includes an initializer; otherwise, it is a declaration. 2077*0b57cec5SDimitry Andric // 2078*0b57cec5SDimitry Andric // FIXME: How do you declare (but not define) a partial specialization of 2079*0b57cec5SDimitry Andric // a static data member template outside the containing class? 2080*0b57cec5SDimitry Andric if (isStaticDataMember()) { 2081*0b57cec5SDimitry Andric if (isOutOfLine() && 2082*0b57cec5SDimitry Andric !(getCanonicalDecl()->isInline() && 2083*0b57cec5SDimitry Andric getCanonicalDecl()->isConstexpr()) && 2084*0b57cec5SDimitry Andric (hasInit() || 2085*0b57cec5SDimitry Andric // If the first declaration is out-of-line, this may be an 2086*0b57cec5SDimitry Andric // instantiation of an out-of-line partial specialization of a variable 2087*0b57cec5SDimitry Andric // template for which we have not yet instantiated the initializer. 2088*0b57cec5SDimitry Andric (getFirstDecl()->isOutOfLine() 2089*0b57cec5SDimitry Andric ? getTemplateSpecializationKind() == TSK_Undeclared 2090*0b57cec5SDimitry Andric : getTemplateSpecializationKind() != 2091*0b57cec5SDimitry Andric TSK_ExplicitSpecialization) || 2092*0b57cec5SDimitry Andric isa<VarTemplatePartialSpecializationDecl>(this))) 2093*0b57cec5SDimitry Andric return Definition; 2094*0b57cec5SDimitry Andric else if (!isOutOfLine() && isInline()) 2095*0b57cec5SDimitry Andric return Definition; 2096*0b57cec5SDimitry Andric else 2097*0b57cec5SDimitry Andric return DeclarationOnly; 2098*0b57cec5SDimitry Andric } 2099*0b57cec5SDimitry Andric // C99 6.7p5: 2100*0b57cec5SDimitry Andric // A definition of an identifier is a declaration for that identifier that 2101*0b57cec5SDimitry Andric // [...] causes storage to be reserved for that object. 2102*0b57cec5SDimitry Andric // Note: that applies for all non-file-scope objects. 2103*0b57cec5SDimitry Andric // C99 6.9.2p1: 2104*0b57cec5SDimitry Andric // If the declaration of an identifier for an object has file scope and an 2105*0b57cec5SDimitry Andric // initializer, the declaration is an external definition for the identifier 2106*0b57cec5SDimitry Andric if (hasInit()) 2107*0b57cec5SDimitry Andric return Definition; 2108*0b57cec5SDimitry Andric 2109*0b57cec5SDimitry Andric if (hasDefiningAttr()) 2110*0b57cec5SDimitry Andric return Definition; 2111*0b57cec5SDimitry Andric 2112*0b57cec5SDimitry Andric if (const auto *SAA = getAttr<SelectAnyAttr>()) 2113*0b57cec5SDimitry Andric if (!SAA->isInherited()) 2114*0b57cec5SDimitry Andric return Definition; 2115*0b57cec5SDimitry Andric 2116*0b57cec5SDimitry Andric // A variable template specialization (other than a static data member 2117*0b57cec5SDimitry Andric // template or an explicit specialization) is a declaration until we 2118*0b57cec5SDimitry Andric // instantiate its initializer. 2119*0b57cec5SDimitry Andric if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(this)) { 2120*0b57cec5SDimitry Andric if (VTSD->getTemplateSpecializationKind() != TSK_ExplicitSpecialization && 2121*0b57cec5SDimitry Andric !isa<VarTemplatePartialSpecializationDecl>(VTSD) && 2122*0b57cec5SDimitry Andric !VTSD->IsCompleteDefinition) 2123*0b57cec5SDimitry Andric return DeclarationOnly; 2124*0b57cec5SDimitry Andric } 2125*0b57cec5SDimitry Andric 2126*0b57cec5SDimitry Andric if (hasExternalStorage()) 2127*0b57cec5SDimitry Andric return DeclarationOnly; 2128*0b57cec5SDimitry Andric 2129*0b57cec5SDimitry Andric // [dcl.link] p7: 2130*0b57cec5SDimitry Andric // A declaration directly contained in a linkage-specification is treated 2131*0b57cec5SDimitry Andric // as if it contains the extern specifier for the purpose of determining 2132*0b57cec5SDimitry Andric // the linkage of the declared name and whether it is a definition. 2133*0b57cec5SDimitry Andric if (isSingleLineLanguageLinkage(*this)) 2134*0b57cec5SDimitry Andric return DeclarationOnly; 2135*0b57cec5SDimitry Andric 2136*0b57cec5SDimitry Andric // C99 6.9.2p2: 2137*0b57cec5SDimitry Andric // A declaration of an object that has file scope without an initializer, 2138*0b57cec5SDimitry Andric // and without a storage class specifier or the scs 'static', constitutes 2139*0b57cec5SDimitry Andric // a tentative definition. 2140*0b57cec5SDimitry Andric // No such thing in C++. 2141*0b57cec5SDimitry Andric if (!C.getLangOpts().CPlusPlus && isFileVarDecl()) 2142*0b57cec5SDimitry Andric return TentativeDefinition; 2143*0b57cec5SDimitry Andric 2144*0b57cec5SDimitry Andric // What's left is (in C, block-scope) declarations without initializers or 2145*0b57cec5SDimitry Andric // external storage. These are definitions. 2146*0b57cec5SDimitry Andric return Definition; 2147*0b57cec5SDimitry Andric } 2148*0b57cec5SDimitry Andric 2149*0b57cec5SDimitry Andric VarDecl *VarDecl::getActingDefinition() { 2150*0b57cec5SDimitry Andric DefinitionKind Kind = isThisDeclarationADefinition(); 2151*0b57cec5SDimitry Andric if (Kind != TentativeDefinition) 2152*0b57cec5SDimitry Andric return nullptr; 2153*0b57cec5SDimitry Andric 2154*0b57cec5SDimitry Andric VarDecl *LastTentative = nullptr; 2155*0b57cec5SDimitry Andric VarDecl *First = getFirstDecl(); 2156*0b57cec5SDimitry Andric for (auto I : First->redecls()) { 2157*0b57cec5SDimitry Andric Kind = I->isThisDeclarationADefinition(); 2158*0b57cec5SDimitry Andric if (Kind == Definition) 2159*0b57cec5SDimitry Andric return nullptr; 2160*0b57cec5SDimitry Andric else if (Kind == TentativeDefinition) 2161*0b57cec5SDimitry Andric LastTentative = I; 2162*0b57cec5SDimitry Andric } 2163*0b57cec5SDimitry Andric return LastTentative; 2164*0b57cec5SDimitry Andric } 2165*0b57cec5SDimitry Andric 2166*0b57cec5SDimitry Andric VarDecl *VarDecl::getDefinition(ASTContext &C) { 2167*0b57cec5SDimitry Andric VarDecl *First = getFirstDecl(); 2168*0b57cec5SDimitry Andric for (auto I : First->redecls()) { 2169*0b57cec5SDimitry Andric if (I->isThisDeclarationADefinition(C) == Definition) 2170*0b57cec5SDimitry Andric return I; 2171*0b57cec5SDimitry Andric } 2172*0b57cec5SDimitry Andric return nullptr; 2173*0b57cec5SDimitry Andric } 2174*0b57cec5SDimitry Andric 2175*0b57cec5SDimitry Andric VarDecl::DefinitionKind VarDecl::hasDefinition(ASTContext &C) const { 2176*0b57cec5SDimitry Andric DefinitionKind Kind = DeclarationOnly; 2177*0b57cec5SDimitry Andric 2178*0b57cec5SDimitry Andric const VarDecl *First = getFirstDecl(); 2179*0b57cec5SDimitry Andric for (auto I : First->redecls()) { 2180*0b57cec5SDimitry Andric Kind = std::max(Kind, I->isThisDeclarationADefinition(C)); 2181*0b57cec5SDimitry Andric if (Kind == Definition) 2182*0b57cec5SDimitry Andric break; 2183*0b57cec5SDimitry Andric } 2184*0b57cec5SDimitry Andric 2185*0b57cec5SDimitry Andric return Kind; 2186*0b57cec5SDimitry Andric } 2187*0b57cec5SDimitry Andric 2188*0b57cec5SDimitry Andric const Expr *VarDecl::getAnyInitializer(const VarDecl *&D) const { 2189*0b57cec5SDimitry Andric for (auto I : redecls()) { 2190*0b57cec5SDimitry Andric if (auto Expr = I->getInit()) { 2191*0b57cec5SDimitry Andric D = I; 2192*0b57cec5SDimitry Andric return Expr; 2193*0b57cec5SDimitry Andric } 2194*0b57cec5SDimitry Andric } 2195*0b57cec5SDimitry Andric return nullptr; 2196*0b57cec5SDimitry Andric } 2197*0b57cec5SDimitry Andric 2198*0b57cec5SDimitry Andric bool VarDecl::hasInit() const { 2199*0b57cec5SDimitry Andric if (auto *P = dyn_cast<ParmVarDecl>(this)) 2200*0b57cec5SDimitry Andric if (P->hasUnparsedDefaultArg() || P->hasUninstantiatedDefaultArg()) 2201*0b57cec5SDimitry Andric return false; 2202*0b57cec5SDimitry Andric 2203*0b57cec5SDimitry Andric return !Init.isNull(); 2204*0b57cec5SDimitry Andric } 2205*0b57cec5SDimitry Andric 2206*0b57cec5SDimitry Andric Expr *VarDecl::getInit() { 2207*0b57cec5SDimitry Andric if (!hasInit()) 2208*0b57cec5SDimitry Andric return nullptr; 2209*0b57cec5SDimitry Andric 2210*0b57cec5SDimitry Andric if (auto *S = Init.dyn_cast<Stmt *>()) 2211*0b57cec5SDimitry Andric return cast<Expr>(S); 2212*0b57cec5SDimitry Andric 2213*0b57cec5SDimitry Andric return cast_or_null<Expr>(Init.get<EvaluatedStmt *>()->Value); 2214*0b57cec5SDimitry Andric } 2215*0b57cec5SDimitry Andric 2216*0b57cec5SDimitry Andric Stmt **VarDecl::getInitAddress() { 2217*0b57cec5SDimitry Andric if (auto *ES = Init.dyn_cast<EvaluatedStmt *>()) 2218*0b57cec5SDimitry Andric return &ES->Value; 2219*0b57cec5SDimitry Andric 2220*0b57cec5SDimitry Andric return Init.getAddrOfPtr1(); 2221*0b57cec5SDimitry Andric } 2222*0b57cec5SDimitry Andric 2223*0b57cec5SDimitry Andric bool VarDecl::isOutOfLine() const { 2224*0b57cec5SDimitry Andric if (Decl::isOutOfLine()) 2225*0b57cec5SDimitry Andric return true; 2226*0b57cec5SDimitry Andric 2227*0b57cec5SDimitry Andric if (!isStaticDataMember()) 2228*0b57cec5SDimitry Andric return false; 2229*0b57cec5SDimitry Andric 2230*0b57cec5SDimitry Andric // If this static data member was instantiated from a static data member of 2231*0b57cec5SDimitry Andric // a class template, check whether that static data member was defined 2232*0b57cec5SDimitry Andric // out-of-line. 2233*0b57cec5SDimitry Andric if (VarDecl *VD = getInstantiatedFromStaticDataMember()) 2234*0b57cec5SDimitry Andric return VD->isOutOfLine(); 2235*0b57cec5SDimitry Andric 2236*0b57cec5SDimitry Andric return false; 2237*0b57cec5SDimitry Andric } 2238*0b57cec5SDimitry Andric 2239*0b57cec5SDimitry Andric void VarDecl::setInit(Expr *I) { 2240*0b57cec5SDimitry Andric if (auto *Eval = Init.dyn_cast<EvaluatedStmt *>()) { 2241*0b57cec5SDimitry Andric Eval->~EvaluatedStmt(); 2242*0b57cec5SDimitry Andric getASTContext().Deallocate(Eval); 2243*0b57cec5SDimitry Andric } 2244*0b57cec5SDimitry Andric 2245*0b57cec5SDimitry Andric Init = I; 2246*0b57cec5SDimitry Andric } 2247*0b57cec5SDimitry Andric 2248*0b57cec5SDimitry Andric bool VarDecl::mightBeUsableInConstantExpressions(ASTContext &C) const { 2249*0b57cec5SDimitry Andric const LangOptions &Lang = C.getLangOpts(); 2250*0b57cec5SDimitry Andric 2251*0b57cec5SDimitry Andric if (!Lang.CPlusPlus) 2252*0b57cec5SDimitry Andric return false; 2253*0b57cec5SDimitry Andric 2254*0b57cec5SDimitry Andric // Function parameters are never usable in constant expressions. 2255*0b57cec5SDimitry Andric if (isa<ParmVarDecl>(this)) 2256*0b57cec5SDimitry Andric return false; 2257*0b57cec5SDimitry Andric 2258*0b57cec5SDimitry Andric // In C++11, any variable of reference type can be used in a constant 2259*0b57cec5SDimitry Andric // expression if it is initialized by a constant expression. 2260*0b57cec5SDimitry Andric if (Lang.CPlusPlus11 && getType()->isReferenceType()) 2261*0b57cec5SDimitry Andric return true; 2262*0b57cec5SDimitry Andric 2263*0b57cec5SDimitry Andric // Only const objects can be used in constant expressions in C++. C++98 does 2264*0b57cec5SDimitry Andric // not require the variable to be non-volatile, but we consider this to be a 2265*0b57cec5SDimitry Andric // defect. 2266*0b57cec5SDimitry Andric if (!getType().isConstQualified() || getType().isVolatileQualified()) 2267*0b57cec5SDimitry Andric return false; 2268*0b57cec5SDimitry Andric 2269*0b57cec5SDimitry Andric // In C++, const, non-volatile variables of integral or enumeration types 2270*0b57cec5SDimitry Andric // can be used in constant expressions. 2271*0b57cec5SDimitry Andric if (getType()->isIntegralOrEnumerationType()) 2272*0b57cec5SDimitry Andric return true; 2273*0b57cec5SDimitry Andric 2274*0b57cec5SDimitry Andric // Additionally, in C++11, non-volatile constexpr variables can be used in 2275*0b57cec5SDimitry Andric // constant expressions. 2276*0b57cec5SDimitry Andric return Lang.CPlusPlus11 && isConstexpr(); 2277*0b57cec5SDimitry Andric } 2278*0b57cec5SDimitry Andric 2279*0b57cec5SDimitry Andric bool VarDecl::isUsableInConstantExpressions(ASTContext &Context) const { 2280*0b57cec5SDimitry Andric // C++2a [expr.const]p3: 2281*0b57cec5SDimitry Andric // A variable is usable in constant expressions after its initializing 2282*0b57cec5SDimitry Andric // declaration is encountered... 2283*0b57cec5SDimitry Andric const VarDecl *DefVD = nullptr; 2284*0b57cec5SDimitry Andric const Expr *Init = getAnyInitializer(DefVD); 2285*0b57cec5SDimitry Andric if (!Init || Init->isValueDependent() || getType()->isDependentType()) 2286*0b57cec5SDimitry Andric return false; 2287*0b57cec5SDimitry Andric // ... if it is a constexpr variable, or it is of reference type or of 2288*0b57cec5SDimitry Andric // const-qualified integral or enumeration type, ... 2289*0b57cec5SDimitry Andric if (!DefVD->mightBeUsableInConstantExpressions(Context)) 2290*0b57cec5SDimitry Andric return false; 2291*0b57cec5SDimitry Andric // ... and its initializer is a constant initializer. 2292*0b57cec5SDimitry Andric return DefVD->checkInitIsICE(); 2293*0b57cec5SDimitry Andric } 2294*0b57cec5SDimitry Andric 2295*0b57cec5SDimitry Andric /// Convert the initializer for this declaration to the elaborated EvaluatedStmt 2296*0b57cec5SDimitry Andric /// form, which contains extra information on the evaluated value of the 2297*0b57cec5SDimitry Andric /// initializer. 2298*0b57cec5SDimitry Andric EvaluatedStmt *VarDecl::ensureEvaluatedStmt() const { 2299*0b57cec5SDimitry Andric auto *Eval = Init.dyn_cast<EvaluatedStmt *>(); 2300*0b57cec5SDimitry Andric if (!Eval) { 2301*0b57cec5SDimitry Andric // Note: EvaluatedStmt contains an APValue, which usually holds 2302*0b57cec5SDimitry Andric // resources not allocated from the ASTContext. We need to do some 2303*0b57cec5SDimitry Andric // work to avoid leaking those, but we do so in VarDecl::evaluateValue 2304*0b57cec5SDimitry Andric // where we can detect whether there's anything to clean up or not. 2305*0b57cec5SDimitry Andric Eval = new (getASTContext()) EvaluatedStmt; 2306*0b57cec5SDimitry Andric Eval->Value = Init.get<Stmt *>(); 2307*0b57cec5SDimitry Andric Init = Eval; 2308*0b57cec5SDimitry Andric } 2309*0b57cec5SDimitry Andric return Eval; 2310*0b57cec5SDimitry Andric } 2311*0b57cec5SDimitry Andric 2312*0b57cec5SDimitry Andric APValue *VarDecl::evaluateValue() const { 2313*0b57cec5SDimitry Andric SmallVector<PartialDiagnosticAt, 8> Notes; 2314*0b57cec5SDimitry Andric return evaluateValue(Notes); 2315*0b57cec5SDimitry Andric } 2316*0b57cec5SDimitry Andric 2317*0b57cec5SDimitry Andric APValue *VarDecl::evaluateValue( 2318*0b57cec5SDimitry Andric SmallVectorImpl<PartialDiagnosticAt> &Notes) const { 2319*0b57cec5SDimitry Andric EvaluatedStmt *Eval = ensureEvaluatedStmt(); 2320*0b57cec5SDimitry Andric 2321*0b57cec5SDimitry Andric // We only produce notes indicating why an initializer is non-constant the 2322*0b57cec5SDimitry Andric // first time it is evaluated. FIXME: The notes won't always be emitted the 2323*0b57cec5SDimitry Andric // first time we try evaluation, so might not be produced at all. 2324*0b57cec5SDimitry Andric if (Eval->WasEvaluated) 2325*0b57cec5SDimitry Andric return Eval->Evaluated.isAbsent() ? nullptr : &Eval->Evaluated; 2326*0b57cec5SDimitry Andric 2327*0b57cec5SDimitry Andric const auto *Init = cast<Expr>(Eval->Value); 2328*0b57cec5SDimitry Andric assert(!Init->isValueDependent()); 2329*0b57cec5SDimitry Andric 2330*0b57cec5SDimitry Andric if (Eval->IsEvaluating) { 2331*0b57cec5SDimitry Andric // FIXME: Produce a diagnostic for self-initialization. 2332*0b57cec5SDimitry Andric Eval->CheckedICE = true; 2333*0b57cec5SDimitry Andric Eval->IsICE = false; 2334*0b57cec5SDimitry Andric return nullptr; 2335*0b57cec5SDimitry Andric } 2336*0b57cec5SDimitry Andric 2337*0b57cec5SDimitry Andric Eval->IsEvaluating = true; 2338*0b57cec5SDimitry Andric 2339*0b57cec5SDimitry Andric bool Result = Init->EvaluateAsInitializer(Eval->Evaluated, getASTContext(), 2340*0b57cec5SDimitry Andric this, Notes); 2341*0b57cec5SDimitry Andric 2342*0b57cec5SDimitry Andric // Ensure the computed APValue is cleaned up later if evaluation succeeded, 2343*0b57cec5SDimitry Andric // or that it's empty (so that there's nothing to clean up) if evaluation 2344*0b57cec5SDimitry Andric // failed. 2345*0b57cec5SDimitry Andric if (!Result) 2346*0b57cec5SDimitry Andric Eval->Evaluated = APValue(); 2347*0b57cec5SDimitry Andric else if (Eval->Evaluated.needsCleanup()) 2348*0b57cec5SDimitry Andric getASTContext().addDestruction(&Eval->Evaluated); 2349*0b57cec5SDimitry Andric 2350*0b57cec5SDimitry Andric Eval->IsEvaluating = false; 2351*0b57cec5SDimitry Andric Eval->WasEvaluated = true; 2352*0b57cec5SDimitry Andric 2353*0b57cec5SDimitry Andric // In C++11, we have determined whether the initializer was a constant 2354*0b57cec5SDimitry Andric // expression as a side-effect. 2355*0b57cec5SDimitry Andric if (getASTContext().getLangOpts().CPlusPlus11 && !Eval->CheckedICE) { 2356*0b57cec5SDimitry Andric Eval->CheckedICE = true; 2357*0b57cec5SDimitry Andric Eval->IsICE = Result && Notes.empty(); 2358*0b57cec5SDimitry Andric } 2359*0b57cec5SDimitry Andric 2360*0b57cec5SDimitry Andric return Result ? &Eval->Evaluated : nullptr; 2361*0b57cec5SDimitry Andric } 2362*0b57cec5SDimitry Andric 2363*0b57cec5SDimitry Andric APValue *VarDecl::getEvaluatedValue() const { 2364*0b57cec5SDimitry Andric if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) 2365*0b57cec5SDimitry Andric if (Eval->WasEvaluated) 2366*0b57cec5SDimitry Andric return &Eval->Evaluated; 2367*0b57cec5SDimitry Andric 2368*0b57cec5SDimitry Andric return nullptr; 2369*0b57cec5SDimitry Andric } 2370*0b57cec5SDimitry Andric 2371*0b57cec5SDimitry Andric bool VarDecl::isInitKnownICE() const { 2372*0b57cec5SDimitry Andric if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) 2373*0b57cec5SDimitry Andric return Eval->CheckedICE; 2374*0b57cec5SDimitry Andric 2375*0b57cec5SDimitry Andric return false; 2376*0b57cec5SDimitry Andric } 2377*0b57cec5SDimitry Andric 2378*0b57cec5SDimitry Andric bool VarDecl::isInitICE() const { 2379*0b57cec5SDimitry Andric assert(isInitKnownICE() && 2380*0b57cec5SDimitry Andric "Check whether we already know that the initializer is an ICE"); 2381*0b57cec5SDimitry Andric return Init.get<EvaluatedStmt *>()->IsICE; 2382*0b57cec5SDimitry Andric } 2383*0b57cec5SDimitry Andric 2384*0b57cec5SDimitry Andric bool VarDecl::checkInitIsICE() const { 2385*0b57cec5SDimitry Andric // Initializers of weak variables are never ICEs. 2386*0b57cec5SDimitry Andric if (isWeak()) 2387*0b57cec5SDimitry Andric return false; 2388*0b57cec5SDimitry Andric 2389*0b57cec5SDimitry Andric EvaluatedStmt *Eval = ensureEvaluatedStmt(); 2390*0b57cec5SDimitry Andric if (Eval->CheckedICE) 2391*0b57cec5SDimitry Andric // We have already checked whether this subexpression is an 2392*0b57cec5SDimitry Andric // integral constant expression. 2393*0b57cec5SDimitry Andric return Eval->IsICE; 2394*0b57cec5SDimitry Andric 2395*0b57cec5SDimitry Andric const auto *Init = cast<Expr>(Eval->Value); 2396*0b57cec5SDimitry Andric assert(!Init->isValueDependent()); 2397*0b57cec5SDimitry Andric 2398*0b57cec5SDimitry Andric // In C++11, evaluate the initializer to check whether it's a constant 2399*0b57cec5SDimitry Andric // expression. 2400*0b57cec5SDimitry Andric if (getASTContext().getLangOpts().CPlusPlus11) { 2401*0b57cec5SDimitry Andric SmallVector<PartialDiagnosticAt, 8> Notes; 2402*0b57cec5SDimitry Andric evaluateValue(Notes); 2403*0b57cec5SDimitry Andric return Eval->IsICE; 2404*0b57cec5SDimitry Andric } 2405*0b57cec5SDimitry Andric 2406*0b57cec5SDimitry Andric // It's an ICE whether or not the definition we found is 2407*0b57cec5SDimitry Andric // out-of-line. See DR 721 and the discussion in Clang PR 2408*0b57cec5SDimitry Andric // 6206 for details. 2409*0b57cec5SDimitry Andric 2410*0b57cec5SDimitry Andric if (Eval->CheckingICE) 2411*0b57cec5SDimitry Andric return false; 2412*0b57cec5SDimitry Andric Eval->CheckingICE = true; 2413*0b57cec5SDimitry Andric 2414*0b57cec5SDimitry Andric Eval->IsICE = Init->isIntegerConstantExpr(getASTContext()); 2415*0b57cec5SDimitry Andric Eval->CheckingICE = false; 2416*0b57cec5SDimitry Andric Eval->CheckedICE = true; 2417*0b57cec5SDimitry Andric return Eval->IsICE; 2418*0b57cec5SDimitry Andric } 2419*0b57cec5SDimitry Andric 2420*0b57cec5SDimitry Andric bool VarDecl::isParameterPack() const { 2421*0b57cec5SDimitry Andric return isa<PackExpansionType>(getType()); 2422*0b57cec5SDimitry Andric } 2423*0b57cec5SDimitry Andric 2424*0b57cec5SDimitry Andric template<typename DeclT> 2425*0b57cec5SDimitry Andric static DeclT *getDefinitionOrSelf(DeclT *D) { 2426*0b57cec5SDimitry Andric assert(D); 2427*0b57cec5SDimitry Andric if (auto *Def = D->getDefinition()) 2428*0b57cec5SDimitry Andric return Def; 2429*0b57cec5SDimitry Andric return D; 2430*0b57cec5SDimitry Andric } 2431*0b57cec5SDimitry Andric 2432*0b57cec5SDimitry Andric bool VarDecl::isEscapingByref() const { 2433*0b57cec5SDimitry Andric return hasAttr<BlocksAttr>() && NonParmVarDeclBits.EscapingByref; 2434*0b57cec5SDimitry Andric } 2435*0b57cec5SDimitry Andric 2436*0b57cec5SDimitry Andric bool VarDecl::isNonEscapingByref() const { 2437*0b57cec5SDimitry Andric return hasAttr<BlocksAttr>() && !NonParmVarDeclBits.EscapingByref; 2438*0b57cec5SDimitry Andric } 2439*0b57cec5SDimitry Andric 2440*0b57cec5SDimitry Andric VarDecl *VarDecl::getTemplateInstantiationPattern() const { 2441*0b57cec5SDimitry Andric const VarDecl *VD = this; 2442*0b57cec5SDimitry Andric 2443*0b57cec5SDimitry Andric // If this is an instantiated member, walk back to the template from which 2444*0b57cec5SDimitry Andric // it was instantiated. 2445*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo()) { 2446*0b57cec5SDimitry Andric if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) { 2447*0b57cec5SDimitry Andric VD = VD->getInstantiatedFromStaticDataMember(); 2448*0b57cec5SDimitry Andric while (auto *NewVD = VD->getInstantiatedFromStaticDataMember()) 2449*0b57cec5SDimitry Andric VD = NewVD; 2450*0b57cec5SDimitry Andric } 2451*0b57cec5SDimitry Andric } 2452*0b57cec5SDimitry Andric 2453*0b57cec5SDimitry Andric // If it's an instantiated variable template specialization, find the 2454*0b57cec5SDimitry Andric // template or partial specialization from which it was instantiated. 2455*0b57cec5SDimitry Andric if (auto *VDTemplSpec = dyn_cast<VarTemplateSpecializationDecl>(VD)) { 2456*0b57cec5SDimitry Andric if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) { 2457*0b57cec5SDimitry Andric auto From = VDTemplSpec->getInstantiatedFrom(); 2458*0b57cec5SDimitry Andric if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) { 2459*0b57cec5SDimitry Andric while (!VTD->isMemberSpecialization()) { 2460*0b57cec5SDimitry Andric auto *NewVTD = VTD->getInstantiatedFromMemberTemplate(); 2461*0b57cec5SDimitry Andric if (!NewVTD) 2462*0b57cec5SDimitry Andric break; 2463*0b57cec5SDimitry Andric VTD = NewVTD; 2464*0b57cec5SDimitry Andric } 2465*0b57cec5SDimitry Andric return getDefinitionOrSelf(VTD->getTemplatedDecl()); 2466*0b57cec5SDimitry Andric } 2467*0b57cec5SDimitry Andric if (auto *VTPSD = 2468*0b57cec5SDimitry Andric From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) { 2469*0b57cec5SDimitry Andric while (!VTPSD->isMemberSpecialization()) { 2470*0b57cec5SDimitry Andric auto *NewVTPSD = VTPSD->getInstantiatedFromMember(); 2471*0b57cec5SDimitry Andric if (!NewVTPSD) 2472*0b57cec5SDimitry Andric break; 2473*0b57cec5SDimitry Andric VTPSD = NewVTPSD; 2474*0b57cec5SDimitry Andric } 2475*0b57cec5SDimitry Andric return getDefinitionOrSelf<VarDecl>(VTPSD); 2476*0b57cec5SDimitry Andric } 2477*0b57cec5SDimitry Andric } 2478*0b57cec5SDimitry Andric } 2479*0b57cec5SDimitry Andric 2480*0b57cec5SDimitry Andric // If this is the pattern of a variable template, find where it was 2481*0b57cec5SDimitry Andric // instantiated from. FIXME: Is this necessary? 2482*0b57cec5SDimitry Andric if (VarTemplateDecl *VarTemplate = VD->getDescribedVarTemplate()) { 2483*0b57cec5SDimitry Andric while (!VarTemplate->isMemberSpecialization()) { 2484*0b57cec5SDimitry Andric auto *NewVT = VarTemplate->getInstantiatedFromMemberTemplate(); 2485*0b57cec5SDimitry Andric if (!NewVT) 2486*0b57cec5SDimitry Andric break; 2487*0b57cec5SDimitry Andric VarTemplate = NewVT; 2488*0b57cec5SDimitry Andric } 2489*0b57cec5SDimitry Andric 2490*0b57cec5SDimitry Andric return getDefinitionOrSelf(VarTemplate->getTemplatedDecl()); 2491*0b57cec5SDimitry Andric } 2492*0b57cec5SDimitry Andric 2493*0b57cec5SDimitry Andric if (VD == this) 2494*0b57cec5SDimitry Andric return nullptr; 2495*0b57cec5SDimitry Andric return getDefinitionOrSelf(const_cast<VarDecl*>(VD)); 2496*0b57cec5SDimitry Andric } 2497*0b57cec5SDimitry Andric 2498*0b57cec5SDimitry Andric VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const { 2499*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 2500*0b57cec5SDimitry Andric return cast<VarDecl>(MSI->getInstantiatedFrom()); 2501*0b57cec5SDimitry Andric 2502*0b57cec5SDimitry Andric return nullptr; 2503*0b57cec5SDimitry Andric } 2504*0b57cec5SDimitry Andric 2505*0b57cec5SDimitry Andric TemplateSpecializationKind VarDecl::getTemplateSpecializationKind() const { 2506*0b57cec5SDimitry Andric if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this)) 2507*0b57cec5SDimitry Andric return Spec->getSpecializationKind(); 2508*0b57cec5SDimitry Andric 2509*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 2510*0b57cec5SDimitry Andric return MSI->getTemplateSpecializationKind(); 2511*0b57cec5SDimitry Andric 2512*0b57cec5SDimitry Andric return TSK_Undeclared; 2513*0b57cec5SDimitry Andric } 2514*0b57cec5SDimitry Andric 2515*0b57cec5SDimitry Andric TemplateSpecializationKind 2516*0b57cec5SDimitry Andric VarDecl::getTemplateSpecializationKindForInstantiation() const { 2517*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 2518*0b57cec5SDimitry Andric return MSI->getTemplateSpecializationKind(); 2519*0b57cec5SDimitry Andric 2520*0b57cec5SDimitry Andric if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this)) 2521*0b57cec5SDimitry Andric return Spec->getSpecializationKind(); 2522*0b57cec5SDimitry Andric 2523*0b57cec5SDimitry Andric return TSK_Undeclared; 2524*0b57cec5SDimitry Andric } 2525*0b57cec5SDimitry Andric 2526*0b57cec5SDimitry Andric SourceLocation VarDecl::getPointOfInstantiation() const { 2527*0b57cec5SDimitry Andric if (const auto *Spec = dyn_cast<VarTemplateSpecializationDecl>(this)) 2528*0b57cec5SDimitry Andric return Spec->getPointOfInstantiation(); 2529*0b57cec5SDimitry Andric 2530*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 2531*0b57cec5SDimitry Andric return MSI->getPointOfInstantiation(); 2532*0b57cec5SDimitry Andric 2533*0b57cec5SDimitry Andric return SourceLocation(); 2534*0b57cec5SDimitry Andric } 2535*0b57cec5SDimitry Andric 2536*0b57cec5SDimitry Andric VarTemplateDecl *VarDecl::getDescribedVarTemplate() const { 2537*0b57cec5SDimitry Andric return getASTContext().getTemplateOrSpecializationInfo(this) 2538*0b57cec5SDimitry Andric .dyn_cast<VarTemplateDecl *>(); 2539*0b57cec5SDimitry Andric } 2540*0b57cec5SDimitry Andric 2541*0b57cec5SDimitry Andric void VarDecl::setDescribedVarTemplate(VarTemplateDecl *Template) { 2542*0b57cec5SDimitry Andric getASTContext().setTemplateOrSpecializationInfo(this, Template); 2543*0b57cec5SDimitry Andric } 2544*0b57cec5SDimitry Andric 2545*0b57cec5SDimitry Andric bool VarDecl::isKnownToBeDefined() const { 2546*0b57cec5SDimitry Andric const auto &LangOpts = getASTContext().getLangOpts(); 2547*0b57cec5SDimitry Andric // In CUDA mode without relocatable device code, variables of form 'extern 2548*0b57cec5SDimitry Andric // __shared__ Foo foo[]' are pointers to the base of the GPU core's shared 2549*0b57cec5SDimitry Andric // memory pool. These are never undefined variables, even if they appear 2550*0b57cec5SDimitry Andric // inside of an anon namespace or static function. 2551*0b57cec5SDimitry Andric // 2552*0b57cec5SDimitry Andric // With CUDA relocatable device code enabled, these variables don't get 2553*0b57cec5SDimitry Andric // special handling; they're treated like regular extern variables. 2554*0b57cec5SDimitry Andric if (LangOpts.CUDA && !LangOpts.GPURelocatableDeviceCode && 2555*0b57cec5SDimitry Andric hasExternalStorage() && hasAttr<CUDASharedAttr>() && 2556*0b57cec5SDimitry Andric isa<IncompleteArrayType>(getType())) 2557*0b57cec5SDimitry Andric return true; 2558*0b57cec5SDimitry Andric 2559*0b57cec5SDimitry Andric return hasDefinition(); 2560*0b57cec5SDimitry Andric } 2561*0b57cec5SDimitry Andric 2562*0b57cec5SDimitry Andric bool VarDecl::isNoDestroy(const ASTContext &Ctx) const { 2563*0b57cec5SDimitry Andric return hasGlobalStorage() && (hasAttr<NoDestroyAttr>() || 2564*0b57cec5SDimitry Andric (!Ctx.getLangOpts().RegisterStaticDestructors && 2565*0b57cec5SDimitry Andric !hasAttr<AlwaysDestroyAttr>())); 2566*0b57cec5SDimitry Andric } 2567*0b57cec5SDimitry Andric 2568*0b57cec5SDimitry Andric MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() const { 2569*0b57cec5SDimitry Andric if (isStaticDataMember()) 2570*0b57cec5SDimitry Andric // FIXME: Remove ? 2571*0b57cec5SDimitry Andric // return getASTContext().getInstantiatedFromStaticDataMember(this); 2572*0b57cec5SDimitry Andric return getASTContext().getTemplateOrSpecializationInfo(this) 2573*0b57cec5SDimitry Andric .dyn_cast<MemberSpecializationInfo *>(); 2574*0b57cec5SDimitry Andric return nullptr; 2575*0b57cec5SDimitry Andric } 2576*0b57cec5SDimitry Andric 2577*0b57cec5SDimitry Andric void VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK, 2578*0b57cec5SDimitry Andric SourceLocation PointOfInstantiation) { 2579*0b57cec5SDimitry Andric assert((isa<VarTemplateSpecializationDecl>(this) || 2580*0b57cec5SDimitry Andric getMemberSpecializationInfo()) && 2581*0b57cec5SDimitry Andric "not a variable or static data member template specialization"); 2582*0b57cec5SDimitry Andric 2583*0b57cec5SDimitry Andric if (VarTemplateSpecializationDecl *Spec = 2584*0b57cec5SDimitry Andric dyn_cast<VarTemplateSpecializationDecl>(this)) { 2585*0b57cec5SDimitry Andric Spec->setSpecializationKind(TSK); 2586*0b57cec5SDimitry Andric if (TSK != TSK_ExplicitSpecialization && 2587*0b57cec5SDimitry Andric PointOfInstantiation.isValid() && 2588*0b57cec5SDimitry Andric Spec->getPointOfInstantiation().isInvalid()) { 2589*0b57cec5SDimitry Andric Spec->setPointOfInstantiation(PointOfInstantiation); 2590*0b57cec5SDimitry Andric if (ASTMutationListener *L = getASTContext().getASTMutationListener()) 2591*0b57cec5SDimitry Andric L->InstantiationRequested(this); 2592*0b57cec5SDimitry Andric } 2593*0b57cec5SDimitry Andric } else if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) { 2594*0b57cec5SDimitry Andric MSI->setTemplateSpecializationKind(TSK); 2595*0b57cec5SDimitry Andric if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() && 2596*0b57cec5SDimitry Andric MSI->getPointOfInstantiation().isInvalid()) { 2597*0b57cec5SDimitry Andric MSI->setPointOfInstantiation(PointOfInstantiation); 2598*0b57cec5SDimitry Andric if (ASTMutationListener *L = getASTContext().getASTMutationListener()) 2599*0b57cec5SDimitry Andric L->InstantiationRequested(this); 2600*0b57cec5SDimitry Andric } 2601*0b57cec5SDimitry Andric } 2602*0b57cec5SDimitry Andric } 2603*0b57cec5SDimitry Andric 2604*0b57cec5SDimitry Andric void 2605*0b57cec5SDimitry Andric VarDecl::setInstantiationOfStaticDataMember(VarDecl *VD, 2606*0b57cec5SDimitry Andric TemplateSpecializationKind TSK) { 2607*0b57cec5SDimitry Andric assert(getASTContext().getTemplateOrSpecializationInfo(this).isNull() && 2608*0b57cec5SDimitry Andric "Previous template or instantiation?"); 2609*0b57cec5SDimitry Andric getASTContext().setInstantiatedFromStaticDataMember(this, VD, TSK); 2610*0b57cec5SDimitry Andric } 2611*0b57cec5SDimitry Andric 2612*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 2613*0b57cec5SDimitry Andric // ParmVarDecl Implementation 2614*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 2615*0b57cec5SDimitry Andric 2616*0b57cec5SDimitry Andric ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 2617*0b57cec5SDimitry Andric SourceLocation StartLoc, 2618*0b57cec5SDimitry Andric SourceLocation IdLoc, IdentifierInfo *Id, 2619*0b57cec5SDimitry Andric QualType T, TypeSourceInfo *TInfo, 2620*0b57cec5SDimitry Andric StorageClass S, Expr *DefArg) { 2621*0b57cec5SDimitry Andric return new (C, DC) ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo, 2622*0b57cec5SDimitry Andric S, DefArg); 2623*0b57cec5SDimitry Andric } 2624*0b57cec5SDimitry Andric 2625*0b57cec5SDimitry Andric QualType ParmVarDecl::getOriginalType() const { 2626*0b57cec5SDimitry Andric TypeSourceInfo *TSI = getTypeSourceInfo(); 2627*0b57cec5SDimitry Andric QualType T = TSI ? TSI->getType() : getType(); 2628*0b57cec5SDimitry Andric if (const auto *DT = dyn_cast<DecayedType>(T)) 2629*0b57cec5SDimitry Andric return DT->getOriginalType(); 2630*0b57cec5SDimitry Andric return T; 2631*0b57cec5SDimitry Andric } 2632*0b57cec5SDimitry Andric 2633*0b57cec5SDimitry Andric ParmVarDecl *ParmVarDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2634*0b57cec5SDimitry Andric return new (C, ID) 2635*0b57cec5SDimitry Andric ParmVarDecl(ParmVar, C, nullptr, SourceLocation(), SourceLocation(), 2636*0b57cec5SDimitry Andric nullptr, QualType(), nullptr, SC_None, nullptr); 2637*0b57cec5SDimitry Andric } 2638*0b57cec5SDimitry Andric 2639*0b57cec5SDimitry Andric SourceRange ParmVarDecl::getSourceRange() const { 2640*0b57cec5SDimitry Andric if (!hasInheritedDefaultArg()) { 2641*0b57cec5SDimitry Andric SourceRange ArgRange = getDefaultArgRange(); 2642*0b57cec5SDimitry Andric if (ArgRange.isValid()) 2643*0b57cec5SDimitry Andric return SourceRange(getOuterLocStart(), ArgRange.getEnd()); 2644*0b57cec5SDimitry Andric } 2645*0b57cec5SDimitry Andric 2646*0b57cec5SDimitry Andric // DeclaratorDecl considers the range of postfix types as overlapping with the 2647*0b57cec5SDimitry Andric // declaration name, but this is not the case with parameters in ObjC methods. 2648*0b57cec5SDimitry Andric if (isa<ObjCMethodDecl>(getDeclContext())) 2649*0b57cec5SDimitry Andric return SourceRange(DeclaratorDecl::getBeginLoc(), getLocation()); 2650*0b57cec5SDimitry Andric 2651*0b57cec5SDimitry Andric return DeclaratorDecl::getSourceRange(); 2652*0b57cec5SDimitry Andric } 2653*0b57cec5SDimitry Andric 2654*0b57cec5SDimitry Andric Expr *ParmVarDecl::getDefaultArg() { 2655*0b57cec5SDimitry Andric assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!"); 2656*0b57cec5SDimitry Andric assert(!hasUninstantiatedDefaultArg() && 2657*0b57cec5SDimitry Andric "Default argument is not yet instantiated!"); 2658*0b57cec5SDimitry Andric 2659*0b57cec5SDimitry Andric Expr *Arg = getInit(); 2660*0b57cec5SDimitry Andric if (auto *E = dyn_cast_or_null<FullExpr>(Arg)) 2661*0b57cec5SDimitry Andric return E->getSubExpr(); 2662*0b57cec5SDimitry Andric 2663*0b57cec5SDimitry Andric return Arg; 2664*0b57cec5SDimitry Andric } 2665*0b57cec5SDimitry Andric 2666*0b57cec5SDimitry Andric void ParmVarDecl::setDefaultArg(Expr *defarg) { 2667*0b57cec5SDimitry Andric ParmVarDeclBits.DefaultArgKind = DAK_Normal; 2668*0b57cec5SDimitry Andric Init = defarg; 2669*0b57cec5SDimitry Andric } 2670*0b57cec5SDimitry Andric 2671*0b57cec5SDimitry Andric SourceRange ParmVarDecl::getDefaultArgRange() const { 2672*0b57cec5SDimitry Andric switch (ParmVarDeclBits.DefaultArgKind) { 2673*0b57cec5SDimitry Andric case DAK_None: 2674*0b57cec5SDimitry Andric case DAK_Unparsed: 2675*0b57cec5SDimitry Andric // Nothing we can do here. 2676*0b57cec5SDimitry Andric return SourceRange(); 2677*0b57cec5SDimitry Andric 2678*0b57cec5SDimitry Andric case DAK_Uninstantiated: 2679*0b57cec5SDimitry Andric return getUninstantiatedDefaultArg()->getSourceRange(); 2680*0b57cec5SDimitry Andric 2681*0b57cec5SDimitry Andric case DAK_Normal: 2682*0b57cec5SDimitry Andric if (const Expr *E = getInit()) 2683*0b57cec5SDimitry Andric return E->getSourceRange(); 2684*0b57cec5SDimitry Andric 2685*0b57cec5SDimitry Andric // Missing an actual expression, may be invalid. 2686*0b57cec5SDimitry Andric return SourceRange(); 2687*0b57cec5SDimitry Andric } 2688*0b57cec5SDimitry Andric llvm_unreachable("Invalid default argument kind."); 2689*0b57cec5SDimitry Andric } 2690*0b57cec5SDimitry Andric 2691*0b57cec5SDimitry Andric void ParmVarDecl::setUninstantiatedDefaultArg(Expr *arg) { 2692*0b57cec5SDimitry Andric ParmVarDeclBits.DefaultArgKind = DAK_Uninstantiated; 2693*0b57cec5SDimitry Andric Init = arg; 2694*0b57cec5SDimitry Andric } 2695*0b57cec5SDimitry Andric 2696*0b57cec5SDimitry Andric Expr *ParmVarDecl::getUninstantiatedDefaultArg() { 2697*0b57cec5SDimitry Andric assert(hasUninstantiatedDefaultArg() && 2698*0b57cec5SDimitry Andric "Wrong kind of initialization expression!"); 2699*0b57cec5SDimitry Andric return cast_or_null<Expr>(Init.get<Stmt *>()); 2700*0b57cec5SDimitry Andric } 2701*0b57cec5SDimitry Andric 2702*0b57cec5SDimitry Andric bool ParmVarDecl::hasDefaultArg() const { 2703*0b57cec5SDimitry Andric // FIXME: We should just return false for DAK_None here once callers are 2704*0b57cec5SDimitry Andric // prepared for the case that we encountered an invalid default argument and 2705*0b57cec5SDimitry Andric // were unable to even build an invalid expression. 2706*0b57cec5SDimitry Andric return hasUnparsedDefaultArg() || hasUninstantiatedDefaultArg() || 2707*0b57cec5SDimitry Andric !Init.isNull(); 2708*0b57cec5SDimitry Andric } 2709*0b57cec5SDimitry Andric 2710*0b57cec5SDimitry Andric void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) { 2711*0b57cec5SDimitry Andric getASTContext().setParameterIndex(this, parameterIndex); 2712*0b57cec5SDimitry Andric ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel; 2713*0b57cec5SDimitry Andric } 2714*0b57cec5SDimitry Andric 2715*0b57cec5SDimitry Andric unsigned ParmVarDecl::getParameterIndexLarge() const { 2716*0b57cec5SDimitry Andric return getASTContext().getParameterIndex(this); 2717*0b57cec5SDimitry Andric } 2718*0b57cec5SDimitry Andric 2719*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 2720*0b57cec5SDimitry Andric // FunctionDecl Implementation 2721*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 2722*0b57cec5SDimitry Andric 2723*0b57cec5SDimitry Andric FunctionDecl::FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC, 2724*0b57cec5SDimitry Andric SourceLocation StartLoc, 2725*0b57cec5SDimitry Andric const DeclarationNameInfo &NameInfo, QualType T, 2726*0b57cec5SDimitry Andric TypeSourceInfo *TInfo, StorageClass S, 2727*0b57cec5SDimitry Andric bool isInlineSpecified, 2728*0b57cec5SDimitry Andric ConstexprSpecKind ConstexprKind) 2729*0b57cec5SDimitry Andric : DeclaratorDecl(DK, DC, NameInfo.getLoc(), NameInfo.getName(), T, TInfo, 2730*0b57cec5SDimitry Andric StartLoc), 2731*0b57cec5SDimitry Andric DeclContext(DK), redeclarable_base(C), ODRHash(0), 2732*0b57cec5SDimitry Andric EndRangeLoc(NameInfo.getEndLoc()), DNLoc(NameInfo.getInfo()) { 2733*0b57cec5SDimitry Andric assert(T.isNull() || T->isFunctionType()); 2734*0b57cec5SDimitry Andric FunctionDeclBits.SClass = S; 2735*0b57cec5SDimitry Andric FunctionDeclBits.IsInline = isInlineSpecified; 2736*0b57cec5SDimitry Andric FunctionDeclBits.IsInlineSpecified = isInlineSpecified; 2737*0b57cec5SDimitry Andric FunctionDeclBits.IsVirtualAsWritten = false; 2738*0b57cec5SDimitry Andric FunctionDeclBits.IsPure = false; 2739*0b57cec5SDimitry Andric FunctionDeclBits.HasInheritedPrototype = false; 2740*0b57cec5SDimitry Andric FunctionDeclBits.HasWrittenPrototype = true; 2741*0b57cec5SDimitry Andric FunctionDeclBits.IsDeleted = false; 2742*0b57cec5SDimitry Andric FunctionDeclBits.IsTrivial = false; 2743*0b57cec5SDimitry Andric FunctionDeclBits.IsTrivialForCall = false; 2744*0b57cec5SDimitry Andric FunctionDeclBits.IsDefaulted = false; 2745*0b57cec5SDimitry Andric FunctionDeclBits.IsExplicitlyDefaulted = false; 2746*0b57cec5SDimitry Andric FunctionDeclBits.HasImplicitReturnZero = false; 2747*0b57cec5SDimitry Andric FunctionDeclBits.IsLateTemplateParsed = false; 2748*0b57cec5SDimitry Andric FunctionDeclBits.ConstexprKind = ConstexprKind; 2749*0b57cec5SDimitry Andric FunctionDeclBits.InstantiationIsPending = false; 2750*0b57cec5SDimitry Andric FunctionDeclBits.UsesSEHTry = false; 2751*0b57cec5SDimitry Andric FunctionDeclBits.HasSkippedBody = false; 2752*0b57cec5SDimitry Andric FunctionDeclBits.WillHaveBody = false; 2753*0b57cec5SDimitry Andric FunctionDeclBits.IsMultiVersion = false; 2754*0b57cec5SDimitry Andric FunctionDeclBits.IsCopyDeductionCandidate = false; 2755*0b57cec5SDimitry Andric FunctionDeclBits.HasODRHash = false; 2756*0b57cec5SDimitry Andric } 2757*0b57cec5SDimitry Andric 2758*0b57cec5SDimitry Andric void FunctionDecl::getNameForDiagnostic( 2759*0b57cec5SDimitry Andric raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const { 2760*0b57cec5SDimitry Andric NamedDecl::getNameForDiagnostic(OS, Policy, Qualified); 2761*0b57cec5SDimitry Andric const TemplateArgumentList *TemplateArgs = getTemplateSpecializationArgs(); 2762*0b57cec5SDimitry Andric if (TemplateArgs) 2763*0b57cec5SDimitry Andric printTemplateArgumentList(OS, TemplateArgs->asArray(), Policy); 2764*0b57cec5SDimitry Andric } 2765*0b57cec5SDimitry Andric 2766*0b57cec5SDimitry Andric bool FunctionDecl::isVariadic() const { 2767*0b57cec5SDimitry Andric if (const auto *FT = getType()->getAs<FunctionProtoType>()) 2768*0b57cec5SDimitry Andric return FT->isVariadic(); 2769*0b57cec5SDimitry Andric return false; 2770*0b57cec5SDimitry Andric } 2771*0b57cec5SDimitry Andric 2772*0b57cec5SDimitry Andric bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const { 2773*0b57cec5SDimitry Andric for (auto I : redecls()) { 2774*0b57cec5SDimitry Andric if (I->doesThisDeclarationHaveABody()) { 2775*0b57cec5SDimitry Andric Definition = I; 2776*0b57cec5SDimitry Andric return true; 2777*0b57cec5SDimitry Andric } 2778*0b57cec5SDimitry Andric } 2779*0b57cec5SDimitry Andric 2780*0b57cec5SDimitry Andric return false; 2781*0b57cec5SDimitry Andric } 2782*0b57cec5SDimitry Andric 2783*0b57cec5SDimitry Andric bool FunctionDecl::hasTrivialBody() const 2784*0b57cec5SDimitry Andric { 2785*0b57cec5SDimitry Andric Stmt *S = getBody(); 2786*0b57cec5SDimitry Andric if (!S) { 2787*0b57cec5SDimitry Andric // Since we don't have a body for this function, we don't know if it's 2788*0b57cec5SDimitry Andric // trivial or not. 2789*0b57cec5SDimitry Andric return false; 2790*0b57cec5SDimitry Andric } 2791*0b57cec5SDimitry Andric 2792*0b57cec5SDimitry Andric if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty()) 2793*0b57cec5SDimitry Andric return true; 2794*0b57cec5SDimitry Andric return false; 2795*0b57cec5SDimitry Andric } 2796*0b57cec5SDimitry Andric 2797*0b57cec5SDimitry Andric bool FunctionDecl::isDefined(const FunctionDecl *&Definition) const { 2798*0b57cec5SDimitry Andric for (auto I : redecls()) { 2799*0b57cec5SDimitry Andric if (I->isThisDeclarationADefinition()) { 2800*0b57cec5SDimitry Andric Definition = I; 2801*0b57cec5SDimitry Andric return true; 2802*0b57cec5SDimitry Andric } 2803*0b57cec5SDimitry Andric } 2804*0b57cec5SDimitry Andric 2805*0b57cec5SDimitry Andric return false; 2806*0b57cec5SDimitry Andric } 2807*0b57cec5SDimitry Andric 2808*0b57cec5SDimitry Andric Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const { 2809*0b57cec5SDimitry Andric if (!hasBody(Definition)) 2810*0b57cec5SDimitry Andric return nullptr; 2811*0b57cec5SDimitry Andric 2812*0b57cec5SDimitry Andric if (Definition->Body) 2813*0b57cec5SDimitry Andric return Definition->Body.get(getASTContext().getExternalSource()); 2814*0b57cec5SDimitry Andric 2815*0b57cec5SDimitry Andric return nullptr; 2816*0b57cec5SDimitry Andric } 2817*0b57cec5SDimitry Andric 2818*0b57cec5SDimitry Andric void FunctionDecl::setBody(Stmt *B) { 2819*0b57cec5SDimitry Andric Body = B; 2820*0b57cec5SDimitry Andric if (B) 2821*0b57cec5SDimitry Andric EndRangeLoc = B->getEndLoc(); 2822*0b57cec5SDimitry Andric } 2823*0b57cec5SDimitry Andric 2824*0b57cec5SDimitry Andric void FunctionDecl::setPure(bool P) { 2825*0b57cec5SDimitry Andric FunctionDeclBits.IsPure = P; 2826*0b57cec5SDimitry Andric if (P) 2827*0b57cec5SDimitry Andric if (auto *Parent = dyn_cast<CXXRecordDecl>(getDeclContext())) 2828*0b57cec5SDimitry Andric Parent->markedVirtualFunctionPure(); 2829*0b57cec5SDimitry Andric } 2830*0b57cec5SDimitry Andric 2831*0b57cec5SDimitry Andric template<std::size_t Len> 2832*0b57cec5SDimitry Andric static bool isNamed(const NamedDecl *ND, const char (&Str)[Len]) { 2833*0b57cec5SDimitry Andric IdentifierInfo *II = ND->getIdentifier(); 2834*0b57cec5SDimitry Andric return II && II->isStr(Str); 2835*0b57cec5SDimitry Andric } 2836*0b57cec5SDimitry Andric 2837*0b57cec5SDimitry Andric bool FunctionDecl::isMain() const { 2838*0b57cec5SDimitry Andric const TranslationUnitDecl *tunit = 2839*0b57cec5SDimitry Andric dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()); 2840*0b57cec5SDimitry Andric return tunit && 2841*0b57cec5SDimitry Andric !tunit->getASTContext().getLangOpts().Freestanding && 2842*0b57cec5SDimitry Andric isNamed(this, "main"); 2843*0b57cec5SDimitry Andric } 2844*0b57cec5SDimitry Andric 2845*0b57cec5SDimitry Andric bool FunctionDecl::isMSVCRTEntryPoint() const { 2846*0b57cec5SDimitry Andric const TranslationUnitDecl *TUnit = 2847*0b57cec5SDimitry Andric dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()); 2848*0b57cec5SDimitry Andric if (!TUnit) 2849*0b57cec5SDimitry Andric return false; 2850*0b57cec5SDimitry Andric 2851*0b57cec5SDimitry Andric // Even though we aren't really targeting MSVCRT if we are freestanding, 2852*0b57cec5SDimitry Andric // semantic analysis for these functions remains the same. 2853*0b57cec5SDimitry Andric 2854*0b57cec5SDimitry Andric // MSVCRT entry points only exist on MSVCRT targets. 2855*0b57cec5SDimitry Andric if (!TUnit->getASTContext().getTargetInfo().getTriple().isOSMSVCRT()) 2856*0b57cec5SDimitry Andric return false; 2857*0b57cec5SDimitry Andric 2858*0b57cec5SDimitry Andric // Nameless functions like constructors cannot be entry points. 2859*0b57cec5SDimitry Andric if (!getIdentifier()) 2860*0b57cec5SDimitry Andric return false; 2861*0b57cec5SDimitry Andric 2862*0b57cec5SDimitry Andric return llvm::StringSwitch<bool>(getName()) 2863*0b57cec5SDimitry Andric .Cases("main", // an ANSI console app 2864*0b57cec5SDimitry Andric "wmain", // a Unicode console App 2865*0b57cec5SDimitry Andric "WinMain", // an ANSI GUI app 2866*0b57cec5SDimitry Andric "wWinMain", // a Unicode GUI app 2867*0b57cec5SDimitry Andric "DllMain", // a DLL 2868*0b57cec5SDimitry Andric true) 2869*0b57cec5SDimitry Andric .Default(false); 2870*0b57cec5SDimitry Andric } 2871*0b57cec5SDimitry Andric 2872*0b57cec5SDimitry Andric bool FunctionDecl::isReservedGlobalPlacementOperator() const { 2873*0b57cec5SDimitry Andric assert(getDeclName().getNameKind() == DeclarationName::CXXOperatorName); 2874*0b57cec5SDimitry Andric assert(getDeclName().getCXXOverloadedOperator() == OO_New || 2875*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() == OO_Delete || 2876*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() == OO_Array_New || 2877*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() == OO_Array_Delete); 2878*0b57cec5SDimitry Andric 2879*0b57cec5SDimitry Andric if (!getDeclContext()->getRedeclContext()->isTranslationUnit()) 2880*0b57cec5SDimitry Andric return false; 2881*0b57cec5SDimitry Andric 2882*0b57cec5SDimitry Andric const auto *proto = getType()->castAs<FunctionProtoType>(); 2883*0b57cec5SDimitry Andric if (proto->getNumParams() != 2 || proto->isVariadic()) 2884*0b57cec5SDimitry Andric return false; 2885*0b57cec5SDimitry Andric 2886*0b57cec5SDimitry Andric ASTContext &Context = 2887*0b57cec5SDimitry Andric cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext()) 2888*0b57cec5SDimitry Andric ->getASTContext(); 2889*0b57cec5SDimitry Andric 2890*0b57cec5SDimitry Andric // The result type and first argument type are constant across all 2891*0b57cec5SDimitry Andric // these operators. The second argument must be exactly void*. 2892*0b57cec5SDimitry Andric return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy); 2893*0b57cec5SDimitry Andric } 2894*0b57cec5SDimitry Andric 2895*0b57cec5SDimitry Andric bool FunctionDecl::isReplaceableGlobalAllocationFunction(bool *IsAligned) const { 2896*0b57cec5SDimitry Andric if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName) 2897*0b57cec5SDimitry Andric return false; 2898*0b57cec5SDimitry Andric if (getDeclName().getCXXOverloadedOperator() != OO_New && 2899*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() != OO_Delete && 2900*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() != OO_Array_New && 2901*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() != OO_Array_Delete) 2902*0b57cec5SDimitry Andric return false; 2903*0b57cec5SDimitry Andric 2904*0b57cec5SDimitry Andric if (isa<CXXRecordDecl>(getDeclContext())) 2905*0b57cec5SDimitry Andric return false; 2906*0b57cec5SDimitry Andric 2907*0b57cec5SDimitry Andric // This can only fail for an invalid 'operator new' declaration. 2908*0b57cec5SDimitry Andric if (!getDeclContext()->getRedeclContext()->isTranslationUnit()) 2909*0b57cec5SDimitry Andric return false; 2910*0b57cec5SDimitry Andric 2911*0b57cec5SDimitry Andric const auto *FPT = getType()->castAs<FunctionProtoType>(); 2912*0b57cec5SDimitry Andric if (FPT->getNumParams() == 0 || FPT->getNumParams() > 3 || FPT->isVariadic()) 2913*0b57cec5SDimitry Andric return false; 2914*0b57cec5SDimitry Andric 2915*0b57cec5SDimitry Andric // If this is a single-parameter function, it must be a replaceable global 2916*0b57cec5SDimitry Andric // allocation or deallocation function. 2917*0b57cec5SDimitry Andric if (FPT->getNumParams() == 1) 2918*0b57cec5SDimitry Andric return true; 2919*0b57cec5SDimitry Andric 2920*0b57cec5SDimitry Andric unsigned Params = 1; 2921*0b57cec5SDimitry Andric QualType Ty = FPT->getParamType(Params); 2922*0b57cec5SDimitry Andric ASTContext &Ctx = getASTContext(); 2923*0b57cec5SDimitry Andric 2924*0b57cec5SDimitry Andric auto Consume = [&] { 2925*0b57cec5SDimitry Andric ++Params; 2926*0b57cec5SDimitry Andric Ty = Params < FPT->getNumParams() ? FPT->getParamType(Params) : QualType(); 2927*0b57cec5SDimitry Andric }; 2928*0b57cec5SDimitry Andric 2929*0b57cec5SDimitry Andric // In C++14, the next parameter can be a 'std::size_t' for sized delete. 2930*0b57cec5SDimitry Andric bool IsSizedDelete = false; 2931*0b57cec5SDimitry Andric if (Ctx.getLangOpts().SizedDeallocation && 2932*0b57cec5SDimitry Andric (getDeclName().getCXXOverloadedOperator() == OO_Delete || 2933*0b57cec5SDimitry Andric getDeclName().getCXXOverloadedOperator() == OO_Array_Delete) && 2934*0b57cec5SDimitry Andric Ctx.hasSameType(Ty, Ctx.getSizeType())) { 2935*0b57cec5SDimitry Andric IsSizedDelete = true; 2936*0b57cec5SDimitry Andric Consume(); 2937*0b57cec5SDimitry Andric } 2938*0b57cec5SDimitry Andric 2939*0b57cec5SDimitry Andric // In C++17, the next parameter can be a 'std::align_val_t' for aligned 2940*0b57cec5SDimitry Andric // new/delete. 2941*0b57cec5SDimitry Andric if (Ctx.getLangOpts().AlignedAllocation && !Ty.isNull() && Ty->isAlignValT()) { 2942*0b57cec5SDimitry Andric if (IsAligned) 2943*0b57cec5SDimitry Andric *IsAligned = true; 2944*0b57cec5SDimitry Andric Consume(); 2945*0b57cec5SDimitry Andric } 2946*0b57cec5SDimitry Andric 2947*0b57cec5SDimitry Andric // Finally, if this is not a sized delete, the final parameter can 2948*0b57cec5SDimitry Andric // be a 'const std::nothrow_t&'. 2949*0b57cec5SDimitry Andric if (!IsSizedDelete && !Ty.isNull() && Ty->isReferenceType()) { 2950*0b57cec5SDimitry Andric Ty = Ty->getPointeeType(); 2951*0b57cec5SDimitry Andric if (Ty.getCVRQualifiers() != Qualifiers::Const) 2952*0b57cec5SDimitry Andric return false; 2953*0b57cec5SDimitry Andric const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl(); 2954*0b57cec5SDimitry Andric if (RD && isNamed(RD, "nothrow_t") && RD->isInStdNamespace()) 2955*0b57cec5SDimitry Andric Consume(); 2956*0b57cec5SDimitry Andric } 2957*0b57cec5SDimitry Andric 2958*0b57cec5SDimitry Andric return Params == FPT->getNumParams(); 2959*0b57cec5SDimitry Andric } 2960*0b57cec5SDimitry Andric 2961*0b57cec5SDimitry Andric bool FunctionDecl::isDestroyingOperatorDelete() const { 2962*0b57cec5SDimitry Andric // C++ P0722: 2963*0b57cec5SDimitry Andric // Within a class C, a single object deallocation function with signature 2964*0b57cec5SDimitry Andric // (T, std::destroying_delete_t, <more params>) 2965*0b57cec5SDimitry Andric // is a destroying operator delete. 2966*0b57cec5SDimitry Andric if (!isa<CXXMethodDecl>(this) || getOverloadedOperator() != OO_Delete || 2967*0b57cec5SDimitry Andric getNumParams() < 2) 2968*0b57cec5SDimitry Andric return false; 2969*0b57cec5SDimitry Andric 2970*0b57cec5SDimitry Andric auto *RD = getParamDecl(1)->getType()->getAsCXXRecordDecl(); 2971*0b57cec5SDimitry Andric return RD && RD->isInStdNamespace() && RD->getIdentifier() && 2972*0b57cec5SDimitry Andric RD->getIdentifier()->isStr("destroying_delete_t"); 2973*0b57cec5SDimitry Andric } 2974*0b57cec5SDimitry Andric 2975*0b57cec5SDimitry Andric LanguageLinkage FunctionDecl::getLanguageLinkage() const { 2976*0b57cec5SDimitry Andric return getDeclLanguageLinkage(*this); 2977*0b57cec5SDimitry Andric } 2978*0b57cec5SDimitry Andric 2979*0b57cec5SDimitry Andric bool FunctionDecl::isExternC() const { 2980*0b57cec5SDimitry Andric return isDeclExternC(*this); 2981*0b57cec5SDimitry Andric } 2982*0b57cec5SDimitry Andric 2983*0b57cec5SDimitry Andric bool FunctionDecl::isInExternCContext() const { 2984*0b57cec5SDimitry Andric if (hasAttr<OpenCLKernelAttr>()) 2985*0b57cec5SDimitry Andric return true; 2986*0b57cec5SDimitry Andric return getLexicalDeclContext()->isExternCContext(); 2987*0b57cec5SDimitry Andric } 2988*0b57cec5SDimitry Andric 2989*0b57cec5SDimitry Andric bool FunctionDecl::isInExternCXXContext() const { 2990*0b57cec5SDimitry Andric return getLexicalDeclContext()->isExternCXXContext(); 2991*0b57cec5SDimitry Andric } 2992*0b57cec5SDimitry Andric 2993*0b57cec5SDimitry Andric bool FunctionDecl::isGlobal() const { 2994*0b57cec5SDimitry Andric if (const auto *Method = dyn_cast<CXXMethodDecl>(this)) 2995*0b57cec5SDimitry Andric return Method->isStatic(); 2996*0b57cec5SDimitry Andric 2997*0b57cec5SDimitry Andric if (getCanonicalDecl()->getStorageClass() == SC_Static) 2998*0b57cec5SDimitry Andric return false; 2999*0b57cec5SDimitry Andric 3000*0b57cec5SDimitry Andric for (const DeclContext *DC = getDeclContext(); 3001*0b57cec5SDimitry Andric DC->isNamespace(); 3002*0b57cec5SDimitry Andric DC = DC->getParent()) { 3003*0b57cec5SDimitry Andric if (const auto *Namespace = cast<NamespaceDecl>(DC)) { 3004*0b57cec5SDimitry Andric if (!Namespace->getDeclName()) 3005*0b57cec5SDimitry Andric return false; 3006*0b57cec5SDimitry Andric break; 3007*0b57cec5SDimitry Andric } 3008*0b57cec5SDimitry Andric } 3009*0b57cec5SDimitry Andric 3010*0b57cec5SDimitry Andric return true; 3011*0b57cec5SDimitry Andric } 3012*0b57cec5SDimitry Andric 3013*0b57cec5SDimitry Andric bool FunctionDecl::isNoReturn() const { 3014*0b57cec5SDimitry Andric if (hasAttr<NoReturnAttr>() || hasAttr<CXX11NoReturnAttr>() || 3015*0b57cec5SDimitry Andric hasAttr<C11NoReturnAttr>()) 3016*0b57cec5SDimitry Andric return true; 3017*0b57cec5SDimitry Andric 3018*0b57cec5SDimitry Andric if (auto *FnTy = getType()->getAs<FunctionType>()) 3019*0b57cec5SDimitry Andric return FnTy->getNoReturnAttr(); 3020*0b57cec5SDimitry Andric 3021*0b57cec5SDimitry Andric return false; 3022*0b57cec5SDimitry Andric } 3023*0b57cec5SDimitry Andric 3024*0b57cec5SDimitry Andric 3025*0b57cec5SDimitry Andric MultiVersionKind FunctionDecl::getMultiVersionKind() const { 3026*0b57cec5SDimitry Andric if (hasAttr<TargetAttr>()) 3027*0b57cec5SDimitry Andric return MultiVersionKind::Target; 3028*0b57cec5SDimitry Andric if (hasAttr<CPUDispatchAttr>()) 3029*0b57cec5SDimitry Andric return MultiVersionKind::CPUDispatch; 3030*0b57cec5SDimitry Andric if (hasAttr<CPUSpecificAttr>()) 3031*0b57cec5SDimitry Andric return MultiVersionKind::CPUSpecific; 3032*0b57cec5SDimitry Andric return MultiVersionKind::None; 3033*0b57cec5SDimitry Andric } 3034*0b57cec5SDimitry Andric 3035*0b57cec5SDimitry Andric bool FunctionDecl::isCPUDispatchMultiVersion() const { 3036*0b57cec5SDimitry Andric return isMultiVersion() && hasAttr<CPUDispatchAttr>(); 3037*0b57cec5SDimitry Andric } 3038*0b57cec5SDimitry Andric 3039*0b57cec5SDimitry Andric bool FunctionDecl::isCPUSpecificMultiVersion() const { 3040*0b57cec5SDimitry Andric return isMultiVersion() && hasAttr<CPUSpecificAttr>(); 3041*0b57cec5SDimitry Andric } 3042*0b57cec5SDimitry Andric 3043*0b57cec5SDimitry Andric bool FunctionDecl::isTargetMultiVersion() const { 3044*0b57cec5SDimitry Andric return isMultiVersion() && hasAttr<TargetAttr>(); 3045*0b57cec5SDimitry Andric } 3046*0b57cec5SDimitry Andric 3047*0b57cec5SDimitry Andric void 3048*0b57cec5SDimitry Andric FunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) { 3049*0b57cec5SDimitry Andric redeclarable_base::setPreviousDecl(PrevDecl); 3050*0b57cec5SDimitry Andric 3051*0b57cec5SDimitry Andric if (FunctionTemplateDecl *FunTmpl = getDescribedFunctionTemplate()) { 3052*0b57cec5SDimitry Andric FunctionTemplateDecl *PrevFunTmpl 3053*0b57cec5SDimitry Andric = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : nullptr; 3054*0b57cec5SDimitry Andric assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch"); 3055*0b57cec5SDimitry Andric FunTmpl->setPreviousDecl(PrevFunTmpl); 3056*0b57cec5SDimitry Andric } 3057*0b57cec5SDimitry Andric 3058*0b57cec5SDimitry Andric if (PrevDecl && PrevDecl->isInlined()) 3059*0b57cec5SDimitry Andric setImplicitlyInline(true); 3060*0b57cec5SDimitry Andric } 3061*0b57cec5SDimitry Andric 3062*0b57cec5SDimitry Andric FunctionDecl *FunctionDecl::getCanonicalDecl() { return getFirstDecl(); } 3063*0b57cec5SDimitry Andric 3064*0b57cec5SDimitry Andric /// Returns a value indicating whether this function corresponds to a builtin 3065*0b57cec5SDimitry Andric /// function. 3066*0b57cec5SDimitry Andric /// 3067*0b57cec5SDimitry Andric /// The function corresponds to a built-in function if it is declared at 3068*0b57cec5SDimitry Andric /// translation scope or within an extern "C" block and its name matches with 3069*0b57cec5SDimitry Andric /// the name of a builtin. The returned value will be 0 for functions that do 3070*0b57cec5SDimitry Andric /// not correspond to a builtin, a value of type \c Builtin::ID if in the 3071*0b57cec5SDimitry Andric /// target-independent range \c [1,Builtin::First), or a target-specific builtin 3072*0b57cec5SDimitry Andric /// value. 3073*0b57cec5SDimitry Andric /// 3074*0b57cec5SDimitry Andric /// \param ConsiderWrapperFunctions If true, we should consider wrapper 3075*0b57cec5SDimitry Andric /// functions as their wrapped builtins. This shouldn't be done in general, but 3076*0b57cec5SDimitry Andric /// it's useful in Sema to diagnose calls to wrappers based on their semantics. 3077*0b57cec5SDimitry Andric unsigned FunctionDecl::getBuiltinID(bool ConsiderWrapperFunctions) const { 3078*0b57cec5SDimitry Andric if (!getIdentifier()) 3079*0b57cec5SDimitry Andric return 0; 3080*0b57cec5SDimitry Andric 3081*0b57cec5SDimitry Andric unsigned BuiltinID = getIdentifier()->getBuiltinID(); 3082*0b57cec5SDimitry Andric if (!BuiltinID) 3083*0b57cec5SDimitry Andric return 0; 3084*0b57cec5SDimitry Andric 3085*0b57cec5SDimitry Andric ASTContext &Context = getASTContext(); 3086*0b57cec5SDimitry Andric if (Context.getLangOpts().CPlusPlus) { 3087*0b57cec5SDimitry Andric const auto *LinkageDecl = 3088*0b57cec5SDimitry Andric dyn_cast<LinkageSpecDecl>(getFirstDecl()->getDeclContext()); 3089*0b57cec5SDimitry Andric // In C++, the first declaration of a builtin is always inside an implicit 3090*0b57cec5SDimitry Andric // extern "C". 3091*0b57cec5SDimitry Andric // FIXME: A recognised library function may not be directly in an extern "C" 3092*0b57cec5SDimitry Andric // declaration, for instance "extern "C" { namespace std { decl } }". 3093*0b57cec5SDimitry Andric if (!LinkageDecl) { 3094*0b57cec5SDimitry Andric if (BuiltinID == Builtin::BI__GetExceptionInfo && 3095*0b57cec5SDimitry Andric Context.getTargetInfo().getCXXABI().isMicrosoft()) 3096*0b57cec5SDimitry Andric return Builtin::BI__GetExceptionInfo; 3097*0b57cec5SDimitry Andric return 0; 3098*0b57cec5SDimitry Andric } 3099*0b57cec5SDimitry Andric if (LinkageDecl->getLanguage() != LinkageSpecDecl::lang_c) 3100*0b57cec5SDimitry Andric return 0; 3101*0b57cec5SDimitry Andric } 3102*0b57cec5SDimitry Andric 3103*0b57cec5SDimitry Andric // If the function is marked "overloadable", it has a different mangled name 3104*0b57cec5SDimitry Andric // and is not the C library function. 3105*0b57cec5SDimitry Andric if (!ConsiderWrapperFunctions && hasAttr<OverloadableAttr>()) 3106*0b57cec5SDimitry Andric return 0; 3107*0b57cec5SDimitry Andric 3108*0b57cec5SDimitry Andric if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 3109*0b57cec5SDimitry Andric return BuiltinID; 3110*0b57cec5SDimitry Andric 3111*0b57cec5SDimitry Andric // This function has the name of a known C library 3112*0b57cec5SDimitry Andric // function. Determine whether it actually refers to the C library 3113*0b57cec5SDimitry Andric // function or whether it just has the same name. 3114*0b57cec5SDimitry Andric 3115*0b57cec5SDimitry Andric // If this is a static function, it's not a builtin. 3116*0b57cec5SDimitry Andric if (!ConsiderWrapperFunctions && getStorageClass() == SC_Static) 3117*0b57cec5SDimitry Andric return 0; 3118*0b57cec5SDimitry Andric 3119*0b57cec5SDimitry Andric // OpenCL v1.2 s6.9.f - The library functions defined in 3120*0b57cec5SDimitry Andric // the C99 standard headers are not available. 3121*0b57cec5SDimitry Andric if (Context.getLangOpts().OpenCL && 3122*0b57cec5SDimitry Andric Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 3123*0b57cec5SDimitry Andric return 0; 3124*0b57cec5SDimitry Andric 3125*0b57cec5SDimitry Andric // CUDA does not have device-side standard library. printf and malloc are the 3126*0b57cec5SDimitry Andric // only special cases that are supported by device-side runtime. 3127*0b57cec5SDimitry Andric if (Context.getLangOpts().CUDA && hasAttr<CUDADeviceAttr>() && 3128*0b57cec5SDimitry Andric !hasAttr<CUDAHostAttr>() && 3129*0b57cec5SDimitry Andric !(BuiltinID == Builtin::BIprintf || BuiltinID == Builtin::BImalloc)) 3130*0b57cec5SDimitry Andric return 0; 3131*0b57cec5SDimitry Andric 3132*0b57cec5SDimitry Andric return BuiltinID; 3133*0b57cec5SDimitry Andric } 3134*0b57cec5SDimitry Andric 3135*0b57cec5SDimitry Andric /// getNumParams - Return the number of parameters this function must have 3136*0b57cec5SDimitry Andric /// based on its FunctionType. This is the length of the ParamInfo array 3137*0b57cec5SDimitry Andric /// after it has been created. 3138*0b57cec5SDimitry Andric unsigned FunctionDecl::getNumParams() const { 3139*0b57cec5SDimitry Andric const auto *FPT = getType()->getAs<FunctionProtoType>(); 3140*0b57cec5SDimitry Andric return FPT ? FPT->getNumParams() : 0; 3141*0b57cec5SDimitry Andric } 3142*0b57cec5SDimitry Andric 3143*0b57cec5SDimitry Andric void FunctionDecl::setParams(ASTContext &C, 3144*0b57cec5SDimitry Andric ArrayRef<ParmVarDecl *> NewParamInfo) { 3145*0b57cec5SDimitry Andric assert(!ParamInfo && "Already has param info!"); 3146*0b57cec5SDimitry Andric assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!"); 3147*0b57cec5SDimitry Andric 3148*0b57cec5SDimitry Andric // Zero params -> null pointer. 3149*0b57cec5SDimitry Andric if (!NewParamInfo.empty()) { 3150*0b57cec5SDimitry Andric ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()]; 3151*0b57cec5SDimitry Andric std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo); 3152*0b57cec5SDimitry Andric } 3153*0b57cec5SDimitry Andric } 3154*0b57cec5SDimitry Andric 3155*0b57cec5SDimitry Andric /// getMinRequiredArguments - Returns the minimum number of arguments 3156*0b57cec5SDimitry Andric /// needed to call this function. This may be fewer than the number of 3157*0b57cec5SDimitry Andric /// function parameters, if some of the parameters have default 3158*0b57cec5SDimitry Andric /// arguments (in C++) or are parameter packs (C++11). 3159*0b57cec5SDimitry Andric unsigned FunctionDecl::getMinRequiredArguments() const { 3160*0b57cec5SDimitry Andric if (!getASTContext().getLangOpts().CPlusPlus) 3161*0b57cec5SDimitry Andric return getNumParams(); 3162*0b57cec5SDimitry Andric 3163*0b57cec5SDimitry Andric unsigned NumRequiredArgs = 0; 3164*0b57cec5SDimitry Andric for (auto *Param : parameters()) 3165*0b57cec5SDimitry Andric if (!Param->isParameterPack() && !Param->hasDefaultArg()) 3166*0b57cec5SDimitry Andric ++NumRequiredArgs; 3167*0b57cec5SDimitry Andric return NumRequiredArgs; 3168*0b57cec5SDimitry Andric } 3169*0b57cec5SDimitry Andric 3170*0b57cec5SDimitry Andric /// The combination of the extern and inline keywords under MSVC forces 3171*0b57cec5SDimitry Andric /// the function to be required. 3172*0b57cec5SDimitry Andric /// 3173*0b57cec5SDimitry Andric /// Note: This function assumes that we will only get called when isInlined() 3174*0b57cec5SDimitry Andric /// would return true for this FunctionDecl. 3175*0b57cec5SDimitry Andric bool FunctionDecl::isMSExternInline() const { 3176*0b57cec5SDimitry Andric assert(isInlined() && "expected to get called on an inlined function!"); 3177*0b57cec5SDimitry Andric 3178*0b57cec5SDimitry Andric const ASTContext &Context = getASTContext(); 3179*0b57cec5SDimitry Andric if (!Context.getTargetInfo().getCXXABI().isMicrosoft() && 3180*0b57cec5SDimitry Andric !hasAttr<DLLExportAttr>()) 3181*0b57cec5SDimitry Andric return false; 3182*0b57cec5SDimitry Andric 3183*0b57cec5SDimitry Andric for (const FunctionDecl *FD = getMostRecentDecl(); FD; 3184*0b57cec5SDimitry Andric FD = FD->getPreviousDecl()) 3185*0b57cec5SDimitry Andric if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern) 3186*0b57cec5SDimitry Andric return true; 3187*0b57cec5SDimitry Andric 3188*0b57cec5SDimitry Andric return false; 3189*0b57cec5SDimitry Andric } 3190*0b57cec5SDimitry Andric 3191*0b57cec5SDimitry Andric static bool redeclForcesDefMSVC(const FunctionDecl *Redecl) { 3192*0b57cec5SDimitry Andric if (Redecl->getStorageClass() != SC_Extern) 3193*0b57cec5SDimitry Andric return false; 3194*0b57cec5SDimitry Andric 3195*0b57cec5SDimitry Andric for (const FunctionDecl *FD = Redecl->getPreviousDecl(); FD; 3196*0b57cec5SDimitry Andric FD = FD->getPreviousDecl()) 3197*0b57cec5SDimitry Andric if (!FD->isImplicit() && FD->getStorageClass() == SC_Extern) 3198*0b57cec5SDimitry Andric return false; 3199*0b57cec5SDimitry Andric 3200*0b57cec5SDimitry Andric return true; 3201*0b57cec5SDimitry Andric } 3202*0b57cec5SDimitry Andric 3203*0b57cec5SDimitry Andric static bool RedeclForcesDefC99(const FunctionDecl *Redecl) { 3204*0b57cec5SDimitry Andric // Only consider file-scope declarations in this test. 3205*0b57cec5SDimitry Andric if (!Redecl->getLexicalDeclContext()->isTranslationUnit()) 3206*0b57cec5SDimitry Andric return false; 3207*0b57cec5SDimitry Andric 3208*0b57cec5SDimitry Andric // Only consider explicit declarations; the presence of a builtin for a 3209*0b57cec5SDimitry Andric // libcall shouldn't affect whether a definition is externally visible. 3210*0b57cec5SDimitry Andric if (Redecl->isImplicit()) 3211*0b57cec5SDimitry Andric return false; 3212*0b57cec5SDimitry Andric 3213*0b57cec5SDimitry Andric if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern) 3214*0b57cec5SDimitry Andric return true; // Not an inline definition 3215*0b57cec5SDimitry Andric 3216*0b57cec5SDimitry Andric return false; 3217*0b57cec5SDimitry Andric } 3218*0b57cec5SDimitry Andric 3219*0b57cec5SDimitry Andric /// For a function declaration in C or C++, determine whether this 3220*0b57cec5SDimitry Andric /// declaration causes the definition to be externally visible. 3221*0b57cec5SDimitry Andric /// 3222*0b57cec5SDimitry Andric /// For instance, this determines if adding the current declaration to the set 3223*0b57cec5SDimitry Andric /// of redeclarations of the given functions causes 3224*0b57cec5SDimitry Andric /// isInlineDefinitionExternallyVisible to change from false to true. 3225*0b57cec5SDimitry Andric bool FunctionDecl::doesDeclarationForceExternallyVisibleDefinition() const { 3226*0b57cec5SDimitry Andric assert(!doesThisDeclarationHaveABody() && 3227*0b57cec5SDimitry Andric "Must have a declaration without a body."); 3228*0b57cec5SDimitry Andric 3229*0b57cec5SDimitry Andric ASTContext &Context = getASTContext(); 3230*0b57cec5SDimitry Andric 3231*0b57cec5SDimitry Andric if (Context.getLangOpts().MSVCCompat) { 3232*0b57cec5SDimitry Andric const FunctionDecl *Definition; 3233*0b57cec5SDimitry Andric if (hasBody(Definition) && Definition->isInlined() && 3234*0b57cec5SDimitry Andric redeclForcesDefMSVC(this)) 3235*0b57cec5SDimitry Andric return true; 3236*0b57cec5SDimitry Andric } 3237*0b57cec5SDimitry Andric 3238*0b57cec5SDimitry Andric if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) { 3239*0b57cec5SDimitry Andric // With GNU inlining, a declaration with 'inline' but not 'extern', forces 3240*0b57cec5SDimitry Andric // an externally visible definition. 3241*0b57cec5SDimitry Andric // 3242*0b57cec5SDimitry Andric // FIXME: What happens if gnu_inline gets added on after the first 3243*0b57cec5SDimitry Andric // declaration? 3244*0b57cec5SDimitry Andric if (!isInlineSpecified() || getStorageClass() == SC_Extern) 3245*0b57cec5SDimitry Andric return false; 3246*0b57cec5SDimitry Andric 3247*0b57cec5SDimitry Andric const FunctionDecl *Prev = this; 3248*0b57cec5SDimitry Andric bool FoundBody = false; 3249*0b57cec5SDimitry Andric while ((Prev = Prev->getPreviousDecl())) { 3250*0b57cec5SDimitry Andric FoundBody |= Prev->Body.isValid(); 3251*0b57cec5SDimitry Andric 3252*0b57cec5SDimitry Andric if (Prev->Body) { 3253*0b57cec5SDimitry Andric // If it's not the case that both 'inline' and 'extern' are 3254*0b57cec5SDimitry Andric // specified on the definition, then it is always externally visible. 3255*0b57cec5SDimitry Andric if (!Prev->isInlineSpecified() || 3256*0b57cec5SDimitry Andric Prev->getStorageClass() != SC_Extern) 3257*0b57cec5SDimitry Andric return false; 3258*0b57cec5SDimitry Andric } else if (Prev->isInlineSpecified() && 3259*0b57cec5SDimitry Andric Prev->getStorageClass() != SC_Extern) { 3260*0b57cec5SDimitry Andric return false; 3261*0b57cec5SDimitry Andric } 3262*0b57cec5SDimitry Andric } 3263*0b57cec5SDimitry Andric return FoundBody; 3264*0b57cec5SDimitry Andric } 3265*0b57cec5SDimitry Andric 3266*0b57cec5SDimitry Andric if (Context.getLangOpts().CPlusPlus) 3267*0b57cec5SDimitry Andric return false; 3268*0b57cec5SDimitry Andric 3269*0b57cec5SDimitry Andric // C99 6.7.4p6: 3270*0b57cec5SDimitry Andric // [...] If all of the file scope declarations for a function in a 3271*0b57cec5SDimitry Andric // translation unit include the inline function specifier without extern, 3272*0b57cec5SDimitry Andric // then the definition in that translation unit is an inline definition. 3273*0b57cec5SDimitry Andric if (isInlineSpecified() && getStorageClass() != SC_Extern) 3274*0b57cec5SDimitry Andric return false; 3275*0b57cec5SDimitry Andric const FunctionDecl *Prev = this; 3276*0b57cec5SDimitry Andric bool FoundBody = false; 3277*0b57cec5SDimitry Andric while ((Prev = Prev->getPreviousDecl())) { 3278*0b57cec5SDimitry Andric FoundBody |= Prev->Body.isValid(); 3279*0b57cec5SDimitry Andric if (RedeclForcesDefC99(Prev)) 3280*0b57cec5SDimitry Andric return false; 3281*0b57cec5SDimitry Andric } 3282*0b57cec5SDimitry Andric return FoundBody; 3283*0b57cec5SDimitry Andric } 3284*0b57cec5SDimitry Andric 3285*0b57cec5SDimitry Andric SourceRange FunctionDecl::getReturnTypeSourceRange() const { 3286*0b57cec5SDimitry Andric const TypeSourceInfo *TSI = getTypeSourceInfo(); 3287*0b57cec5SDimitry Andric if (!TSI) 3288*0b57cec5SDimitry Andric return SourceRange(); 3289*0b57cec5SDimitry Andric FunctionTypeLoc FTL = 3290*0b57cec5SDimitry Andric TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>(); 3291*0b57cec5SDimitry Andric if (!FTL) 3292*0b57cec5SDimitry Andric return SourceRange(); 3293*0b57cec5SDimitry Andric 3294*0b57cec5SDimitry Andric // Skip self-referential return types. 3295*0b57cec5SDimitry Andric const SourceManager &SM = getASTContext().getSourceManager(); 3296*0b57cec5SDimitry Andric SourceRange RTRange = FTL.getReturnLoc().getSourceRange(); 3297*0b57cec5SDimitry Andric SourceLocation Boundary = getNameInfo().getBeginLoc(); 3298*0b57cec5SDimitry Andric if (RTRange.isInvalid() || Boundary.isInvalid() || 3299*0b57cec5SDimitry Andric !SM.isBeforeInTranslationUnit(RTRange.getEnd(), Boundary)) 3300*0b57cec5SDimitry Andric return SourceRange(); 3301*0b57cec5SDimitry Andric 3302*0b57cec5SDimitry Andric return RTRange; 3303*0b57cec5SDimitry Andric } 3304*0b57cec5SDimitry Andric 3305*0b57cec5SDimitry Andric SourceRange FunctionDecl::getExceptionSpecSourceRange() const { 3306*0b57cec5SDimitry Andric const TypeSourceInfo *TSI = getTypeSourceInfo(); 3307*0b57cec5SDimitry Andric if (!TSI) 3308*0b57cec5SDimitry Andric return SourceRange(); 3309*0b57cec5SDimitry Andric FunctionTypeLoc FTL = 3310*0b57cec5SDimitry Andric TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>(); 3311*0b57cec5SDimitry Andric if (!FTL) 3312*0b57cec5SDimitry Andric return SourceRange(); 3313*0b57cec5SDimitry Andric 3314*0b57cec5SDimitry Andric return FTL.getExceptionSpecRange(); 3315*0b57cec5SDimitry Andric } 3316*0b57cec5SDimitry Andric 3317*0b57cec5SDimitry Andric /// For an inline function definition in C, or for a gnu_inline function 3318*0b57cec5SDimitry Andric /// in C++, determine whether the definition will be externally visible. 3319*0b57cec5SDimitry Andric /// 3320*0b57cec5SDimitry Andric /// Inline function definitions are always available for inlining optimizations. 3321*0b57cec5SDimitry Andric /// However, depending on the language dialect, declaration specifiers, and 3322*0b57cec5SDimitry Andric /// attributes, the definition of an inline function may or may not be 3323*0b57cec5SDimitry Andric /// "externally" visible to other translation units in the program. 3324*0b57cec5SDimitry Andric /// 3325*0b57cec5SDimitry Andric /// In C99, inline definitions are not externally visible by default. However, 3326*0b57cec5SDimitry Andric /// if even one of the global-scope declarations is marked "extern inline", the 3327*0b57cec5SDimitry Andric /// inline definition becomes externally visible (C99 6.7.4p6). 3328*0b57cec5SDimitry Andric /// 3329*0b57cec5SDimitry Andric /// In GNU89 mode, or if the gnu_inline attribute is attached to the function 3330*0b57cec5SDimitry Andric /// definition, we use the GNU semantics for inline, which are nearly the 3331*0b57cec5SDimitry Andric /// opposite of C99 semantics. In particular, "inline" by itself will create 3332*0b57cec5SDimitry Andric /// an externally visible symbol, but "extern inline" will not create an 3333*0b57cec5SDimitry Andric /// externally visible symbol. 3334*0b57cec5SDimitry Andric bool FunctionDecl::isInlineDefinitionExternallyVisible() const { 3335*0b57cec5SDimitry Andric assert((doesThisDeclarationHaveABody() || willHaveBody() || 3336*0b57cec5SDimitry Andric hasAttr<AliasAttr>()) && 3337*0b57cec5SDimitry Andric "Must be a function definition"); 3338*0b57cec5SDimitry Andric assert(isInlined() && "Function must be inline"); 3339*0b57cec5SDimitry Andric ASTContext &Context = getASTContext(); 3340*0b57cec5SDimitry Andric 3341*0b57cec5SDimitry Andric if (Context.getLangOpts().GNUInline || hasAttr<GNUInlineAttr>()) { 3342*0b57cec5SDimitry Andric // Note: If you change the logic here, please change 3343*0b57cec5SDimitry Andric // doesDeclarationForceExternallyVisibleDefinition as well. 3344*0b57cec5SDimitry Andric // 3345*0b57cec5SDimitry Andric // If it's not the case that both 'inline' and 'extern' are 3346*0b57cec5SDimitry Andric // specified on the definition, then this inline definition is 3347*0b57cec5SDimitry Andric // externally visible. 3348*0b57cec5SDimitry Andric if (!(isInlineSpecified() && getStorageClass() == SC_Extern)) 3349*0b57cec5SDimitry Andric return true; 3350*0b57cec5SDimitry Andric 3351*0b57cec5SDimitry Andric // If any declaration is 'inline' but not 'extern', then this definition 3352*0b57cec5SDimitry Andric // is externally visible. 3353*0b57cec5SDimitry Andric for (auto Redecl : redecls()) { 3354*0b57cec5SDimitry Andric if (Redecl->isInlineSpecified() && 3355*0b57cec5SDimitry Andric Redecl->getStorageClass() != SC_Extern) 3356*0b57cec5SDimitry Andric return true; 3357*0b57cec5SDimitry Andric } 3358*0b57cec5SDimitry Andric 3359*0b57cec5SDimitry Andric return false; 3360*0b57cec5SDimitry Andric } 3361*0b57cec5SDimitry Andric 3362*0b57cec5SDimitry Andric // The rest of this function is C-only. 3363*0b57cec5SDimitry Andric assert(!Context.getLangOpts().CPlusPlus && 3364*0b57cec5SDimitry Andric "should not use C inline rules in C++"); 3365*0b57cec5SDimitry Andric 3366*0b57cec5SDimitry Andric // C99 6.7.4p6: 3367*0b57cec5SDimitry Andric // [...] If all of the file scope declarations for a function in a 3368*0b57cec5SDimitry Andric // translation unit include the inline function specifier without extern, 3369*0b57cec5SDimitry Andric // then the definition in that translation unit is an inline definition. 3370*0b57cec5SDimitry Andric for (auto Redecl : redecls()) { 3371*0b57cec5SDimitry Andric if (RedeclForcesDefC99(Redecl)) 3372*0b57cec5SDimitry Andric return true; 3373*0b57cec5SDimitry Andric } 3374*0b57cec5SDimitry Andric 3375*0b57cec5SDimitry Andric // C99 6.7.4p6: 3376*0b57cec5SDimitry Andric // An inline definition does not provide an external definition for the 3377*0b57cec5SDimitry Andric // function, and does not forbid an external definition in another 3378*0b57cec5SDimitry Andric // translation unit. 3379*0b57cec5SDimitry Andric return false; 3380*0b57cec5SDimitry Andric } 3381*0b57cec5SDimitry Andric 3382*0b57cec5SDimitry Andric /// getOverloadedOperator - Which C++ overloaded operator this 3383*0b57cec5SDimitry Andric /// function represents, if any. 3384*0b57cec5SDimitry Andric OverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 3385*0b57cec5SDimitry Andric if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 3386*0b57cec5SDimitry Andric return getDeclName().getCXXOverloadedOperator(); 3387*0b57cec5SDimitry Andric else 3388*0b57cec5SDimitry Andric return OO_None; 3389*0b57cec5SDimitry Andric } 3390*0b57cec5SDimitry Andric 3391*0b57cec5SDimitry Andric /// getLiteralIdentifier - The literal suffix identifier this function 3392*0b57cec5SDimitry Andric /// represents, if any. 3393*0b57cec5SDimitry Andric const IdentifierInfo *FunctionDecl::getLiteralIdentifier() const { 3394*0b57cec5SDimitry Andric if (getDeclName().getNameKind() == DeclarationName::CXXLiteralOperatorName) 3395*0b57cec5SDimitry Andric return getDeclName().getCXXLiteralIdentifier(); 3396*0b57cec5SDimitry Andric else 3397*0b57cec5SDimitry Andric return nullptr; 3398*0b57cec5SDimitry Andric } 3399*0b57cec5SDimitry Andric 3400*0b57cec5SDimitry Andric FunctionDecl::TemplatedKind FunctionDecl::getTemplatedKind() const { 3401*0b57cec5SDimitry Andric if (TemplateOrSpecialization.isNull()) 3402*0b57cec5SDimitry Andric return TK_NonTemplate; 3403*0b57cec5SDimitry Andric if (TemplateOrSpecialization.is<FunctionTemplateDecl *>()) 3404*0b57cec5SDimitry Andric return TK_FunctionTemplate; 3405*0b57cec5SDimitry Andric if (TemplateOrSpecialization.is<MemberSpecializationInfo *>()) 3406*0b57cec5SDimitry Andric return TK_MemberSpecialization; 3407*0b57cec5SDimitry Andric if (TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>()) 3408*0b57cec5SDimitry Andric return TK_FunctionTemplateSpecialization; 3409*0b57cec5SDimitry Andric if (TemplateOrSpecialization.is 3410*0b57cec5SDimitry Andric <DependentFunctionTemplateSpecializationInfo*>()) 3411*0b57cec5SDimitry Andric return TK_DependentFunctionTemplateSpecialization; 3412*0b57cec5SDimitry Andric 3413*0b57cec5SDimitry Andric llvm_unreachable("Did we miss a TemplateOrSpecialization type?"); 3414*0b57cec5SDimitry Andric } 3415*0b57cec5SDimitry Andric 3416*0b57cec5SDimitry Andric FunctionDecl *FunctionDecl::getInstantiatedFromMemberFunction() const { 3417*0b57cec5SDimitry Andric if (MemberSpecializationInfo *Info = getMemberSpecializationInfo()) 3418*0b57cec5SDimitry Andric return cast<FunctionDecl>(Info->getInstantiatedFrom()); 3419*0b57cec5SDimitry Andric 3420*0b57cec5SDimitry Andric return nullptr; 3421*0b57cec5SDimitry Andric } 3422*0b57cec5SDimitry Andric 3423*0b57cec5SDimitry Andric MemberSpecializationInfo *FunctionDecl::getMemberSpecializationInfo() const { 3424*0b57cec5SDimitry Andric if (auto *MSI = 3425*0b57cec5SDimitry Andric TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>()) 3426*0b57cec5SDimitry Andric return MSI; 3427*0b57cec5SDimitry Andric if (auto *FTSI = TemplateOrSpecialization 3428*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo *>()) 3429*0b57cec5SDimitry Andric return FTSI->getMemberSpecializationInfo(); 3430*0b57cec5SDimitry Andric return nullptr; 3431*0b57cec5SDimitry Andric } 3432*0b57cec5SDimitry Andric 3433*0b57cec5SDimitry Andric void 3434*0b57cec5SDimitry Andric FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C, 3435*0b57cec5SDimitry Andric FunctionDecl *FD, 3436*0b57cec5SDimitry Andric TemplateSpecializationKind TSK) { 3437*0b57cec5SDimitry Andric assert(TemplateOrSpecialization.isNull() && 3438*0b57cec5SDimitry Andric "Member function is already a specialization"); 3439*0b57cec5SDimitry Andric MemberSpecializationInfo *Info 3440*0b57cec5SDimitry Andric = new (C) MemberSpecializationInfo(FD, TSK); 3441*0b57cec5SDimitry Andric TemplateOrSpecialization = Info; 3442*0b57cec5SDimitry Andric } 3443*0b57cec5SDimitry Andric 3444*0b57cec5SDimitry Andric FunctionTemplateDecl *FunctionDecl::getDescribedFunctionTemplate() const { 3445*0b57cec5SDimitry Andric return TemplateOrSpecialization.dyn_cast<FunctionTemplateDecl *>(); 3446*0b57cec5SDimitry Andric } 3447*0b57cec5SDimitry Andric 3448*0b57cec5SDimitry Andric void FunctionDecl::setDescribedFunctionTemplate(FunctionTemplateDecl *Template) { 3449*0b57cec5SDimitry Andric assert(TemplateOrSpecialization.isNull() && 3450*0b57cec5SDimitry Andric "Member function is already a specialization"); 3451*0b57cec5SDimitry Andric TemplateOrSpecialization = Template; 3452*0b57cec5SDimitry Andric } 3453*0b57cec5SDimitry Andric 3454*0b57cec5SDimitry Andric bool FunctionDecl::isImplicitlyInstantiable() const { 3455*0b57cec5SDimitry Andric // If the function is invalid, it can't be implicitly instantiated. 3456*0b57cec5SDimitry Andric if (isInvalidDecl()) 3457*0b57cec5SDimitry Andric return false; 3458*0b57cec5SDimitry Andric 3459*0b57cec5SDimitry Andric switch (getTemplateSpecializationKindForInstantiation()) { 3460*0b57cec5SDimitry Andric case TSK_Undeclared: 3461*0b57cec5SDimitry Andric case TSK_ExplicitInstantiationDefinition: 3462*0b57cec5SDimitry Andric case TSK_ExplicitSpecialization: 3463*0b57cec5SDimitry Andric return false; 3464*0b57cec5SDimitry Andric 3465*0b57cec5SDimitry Andric case TSK_ImplicitInstantiation: 3466*0b57cec5SDimitry Andric return true; 3467*0b57cec5SDimitry Andric 3468*0b57cec5SDimitry Andric case TSK_ExplicitInstantiationDeclaration: 3469*0b57cec5SDimitry Andric // Handled below. 3470*0b57cec5SDimitry Andric break; 3471*0b57cec5SDimitry Andric } 3472*0b57cec5SDimitry Andric 3473*0b57cec5SDimitry Andric // Find the actual template from which we will instantiate. 3474*0b57cec5SDimitry Andric const FunctionDecl *PatternDecl = getTemplateInstantiationPattern(); 3475*0b57cec5SDimitry Andric bool HasPattern = false; 3476*0b57cec5SDimitry Andric if (PatternDecl) 3477*0b57cec5SDimitry Andric HasPattern = PatternDecl->hasBody(PatternDecl); 3478*0b57cec5SDimitry Andric 3479*0b57cec5SDimitry Andric // C++0x [temp.explicit]p9: 3480*0b57cec5SDimitry Andric // Except for inline functions, other explicit instantiation declarations 3481*0b57cec5SDimitry Andric // have the effect of suppressing the implicit instantiation of the entity 3482*0b57cec5SDimitry Andric // to which they refer. 3483*0b57cec5SDimitry Andric if (!HasPattern || !PatternDecl) 3484*0b57cec5SDimitry Andric return true; 3485*0b57cec5SDimitry Andric 3486*0b57cec5SDimitry Andric return PatternDecl->isInlined(); 3487*0b57cec5SDimitry Andric } 3488*0b57cec5SDimitry Andric 3489*0b57cec5SDimitry Andric bool FunctionDecl::isTemplateInstantiation() const { 3490*0b57cec5SDimitry Andric // FIXME: Remove this, it's not clear what it means. (Which template 3491*0b57cec5SDimitry Andric // specialization kind?) 3492*0b57cec5SDimitry Andric return clang::isTemplateInstantiation(getTemplateSpecializationKind()); 3493*0b57cec5SDimitry Andric } 3494*0b57cec5SDimitry Andric 3495*0b57cec5SDimitry Andric FunctionDecl *FunctionDecl::getTemplateInstantiationPattern() const { 3496*0b57cec5SDimitry Andric // If this is a generic lambda call operator specialization, its 3497*0b57cec5SDimitry Andric // instantiation pattern is always its primary template's pattern 3498*0b57cec5SDimitry Andric // even if its primary template was instantiated from another 3499*0b57cec5SDimitry Andric // member template (which happens with nested generic lambdas). 3500*0b57cec5SDimitry Andric // Since a lambda's call operator's body is transformed eagerly, 3501*0b57cec5SDimitry Andric // we don't have to go hunting for a prototype definition template 3502*0b57cec5SDimitry Andric // (i.e. instantiated-from-member-template) to use as an instantiation 3503*0b57cec5SDimitry Andric // pattern. 3504*0b57cec5SDimitry Andric 3505*0b57cec5SDimitry Andric if (isGenericLambdaCallOperatorSpecialization( 3506*0b57cec5SDimitry Andric dyn_cast<CXXMethodDecl>(this))) { 3507*0b57cec5SDimitry Andric assert(getPrimaryTemplate() && "not a generic lambda call operator?"); 3508*0b57cec5SDimitry Andric return getDefinitionOrSelf(getPrimaryTemplate()->getTemplatedDecl()); 3509*0b57cec5SDimitry Andric } 3510*0b57cec5SDimitry Andric 3511*0b57cec5SDimitry Andric if (MemberSpecializationInfo *Info = getMemberSpecializationInfo()) { 3512*0b57cec5SDimitry Andric if (!clang::isTemplateInstantiation(Info->getTemplateSpecializationKind())) 3513*0b57cec5SDimitry Andric return nullptr; 3514*0b57cec5SDimitry Andric return getDefinitionOrSelf(cast<FunctionDecl>(Info->getInstantiatedFrom())); 3515*0b57cec5SDimitry Andric } 3516*0b57cec5SDimitry Andric 3517*0b57cec5SDimitry Andric if (!clang::isTemplateInstantiation(getTemplateSpecializationKind())) 3518*0b57cec5SDimitry Andric return nullptr; 3519*0b57cec5SDimitry Andric 3520*0b57cec5SDimitry Andric if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) { 3521*0b57cec5SDimitry Andric // If we hit a point where the user provided a specialization of this 3522*0b57cec5SDimitry Andric // template, we're done looking. 3523*0b57cec5SDimitry Andric while (!Primary->isMemberSpecialization()) { 3524*0b57cec5SDimitry Andric auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate(); 3525*0b57cec5SDimitry Andric if (!NewPrimary) 3526*0b57cec5SDimitry Andric break; 3527*0b57cec5SDimitry Andric Primary = NewPrimary; 3528*0b57cec5SDimitry Andric } 3529*0b57cec5SDimitry Andric 3530*0b57cec5SDimitry Andric return getDefinitionOrSelf(Primary->getTemplatedDecl()); 3531*0b57cec5SDimitry Andric } 3532*0b57cec5SDimitry Andric 3533*0b57cec5SDimitry Andric return nullptr; 3534*0b57cec5SDimitry Andric } 3535*0b57cec5SDimitry Andric 3536*0b57cec5SDimitry Andric FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const { 3537*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *Info 3538*0b57cec5SDimitry Andric = TemplateOrSpecialization 3539*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 3540*0b57cec5SDimitry Andric return Info->getTemplate(); 3541*0b57cec5SDimitry Andric } 3542*0b57cec5SDimitry Andric return nullptr; 3543*0b57cec5SDimitry Andric } 3544*0b57cec5SDimitry Andric 3545*0b57cec5SDimitry Andric FunctionTemplateSpecializationInfo * 3546*0b57cec5SDimitry Andric FunctionDecl::getTemplateSpecializationInfo() const { 3547*0b57cec5SDimitry Andric return TemplateOrSpecialization 3548*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo *>(); 3549*0b57cec5SDimitry Andric } 3550*0b57cec5SDimitry Andric 3551*0b57cec5SDimitry Andric const TemplateArgumentList * 3552*0b57cec5SDimitry Andric FunctionDecl::getTemplateSpecializationArgs() const { 3553*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *Info 3554*0b57cec5SDimitry Andric = TemplateOrSpecialization 3555*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 3556*0b57cec5SDimitry Andric return Info->TemplateArguments; 3557*0b57cec5SDimitry Andric } 3558*0b57cec5SDimitry Andric return nullptr; 3559*0b57cec5SDimitry Andric } 3560*0b57cec5SDimitry Andric 3561*0b57cec5SDimitry Andric const ASTTemplateArgumentListInfo * 3562*0b57cec5SDimitry Andric FunctionDecl::getTemplateSpecializationArgsAsWritten() const { 3563*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *Info 3564*0b57cec5SDimitry Andric = TemplateOrSpecialization 3565*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 3566*0b57cec5SDimitry Andric return Info->TemplateArgumentsAsWritten; 3567*0b57cec5SDimitry Andric } 3568*0b57cec5SDimitry Andric return nullptr; 3569*0b57cec5SDimitry Andric } 3570*0b57cec5SDimitry Andric 3571*0b57cec5SDimitry Andric void 3572*0b57cec5SDimitry Andric FunctionDecl::setFunctionTemplateSpecialization(ASTContext &C, 3573*0b57cec5SDimitry Andric FunctionTemplateDecl *Template, 3574*0b57cec5SDimitry Andric const TemplateArgumentList *TemplateArgs, 3575*0b57cec5SDimitry Andric void *InsertPos, 3576*0b57cec5SDimitry Andric TemplateSpecializationKind TSK, 3577*0b57cec5SDimitry Andric const TemplateArgumentListInfo *TemplateArgsAsWritten, 3578*0b57cec5SDimitry Andric SourceLocation PointOfInstantiation) { 3579*0b57cec5SDimitry Andric assert((TemplateOrSpecialization.isNull() || 3580*0b57cec5SDimitry Andric TemplateOrSpecialization.is<MemberSpecializationInfo *>()) && 3581*0b57cec5SDimitry Andric "Member function is already a specialization"); 3582*0b57cec5SDimitry Andric assert(TSK != TSK_Undeclared && 3583*0b57cec5SDimitry Andric "Must specify the type of function template specialization"); 3584*0b57cec5SDimitry Andric assert((TemplateOrSpecialization.isNull() || 3585*0b57cec5SDimitry Andric TSK == TSK_ExplicitSpecialization) && 3586*0b57cec5SDimitry Andric "Member specialization must be an explicit specialization"); 3587*0b57cec5SDimitry Andric FunctionTemplateSpecializationInfo *Info = 3588*0b57cec5SDimitry Andric FunctionTemplateSpecializationInfo::Create( 3589*0b57cec5SDimitry Andric C, this, Template, TSK, TemplateArgs, TemplateArgsAsWritten, 3590*0b57cec5SDimitry Andric PointOfInstantiation, 3591*0b57cec5SDimitry Andric TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>()); 3592*0b57cec5SDimitry Andric TemplateOrSpecialization = Info; 3593*0b57cec5SDimitry Andric Template->addSpecialization(Info, InsertPos); 3594*0b57cec5SDimitry Andric } 3595*0b57cec5SDimitry Andric 3596*0b57cec5SDimitry Andric void 3597*0b57cec5SDimitry Andric FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context, 3598*0b57cec5SDimitry Andric const UnresolvedSetImpl &Templates, 3599*0b57cec5SDimitry Andric const TemplateArgumentListInfo &TemplateArgs) { 3600*0b57cec5SDimitry Andric assert(TemplateOrSpecialization.isNull()); 3601*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo *Info = 3602*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo::Create(Context, Templates, 3603*0b57cec5SDimitry Andric TemplateArgs); 3604*0b57cec5SDimitry Andric TemplateOrSpecialization = Info; 3605*0b57cec5SDimitry Andric } 3606*0b57cec5SDimitry Andric 3607*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo * 3608*0b57cec5SDimitry Andric FunctionDecl::getDependentSpecializationInfo() const { 3609*0b57cec5SDimitry Andric return TemplateOrSpecialization 3610*0b57cec5SDimitry Andric .dyn_cast<DependentFunctionTemplateSpecializationInfo *>(); 3611*0b57cec5SDimitry Andric } 3612*0b57cec5SDimitry Andric 3613*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo * 3614*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo::Create( 3615*0b57cec5SDimitry Andric ASTContext &Context, const UnresolvedSetImpl &Ts, 3616*0b57cec5SDimitry Andric const TemplateArgumentListInfo &TArgs) { 3617*0b57cec5SDimitry Andric void *Buffer = Context.Allocate( 3618*0b57cec5SDimitry Andric totalSizeToAlloc<TemplateArgumentLoc, FunctionTemplateDecl *>( 3619*0b57cec5SDimitry Andric TArgs.size(), Ts.size())); 3620*0b57cec5SDimitry Andric return new (Buffer) DependentFunctionTemplateSpecializationInfo(Ts, TArgs); 3621*0b57cec5SDimitry Andric } 3622*0b57cec5SDimitry Andric 3623*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo:: 3624*0b57cec5SDimitry Andric DependentFunctionTemplateSpecializationInfo(const UnresolvedSetImpl &Ts, 3625*0b57cec5SDimitry Andric const TemplateArgumentListInfo &TArgs) 3626*0b57cec5SDimitry Andric : AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) { 3627*0b57cec5SDimitry Andric NumTemplates = Ts.size(); 3628*0b57cec5SDimitry Andric NumArgs = TArgs.size(); 3629*0b57cec5SDimitry Andric 3630*0b57cec5SDimitry Andric FunctionTemplateDecl **TsArray = getTrailingObjects<FunctionTemplateDecl *>(); 3631*0b57cec5SDimitry Andric for (unsigned I = 0, E = Ts.size(); I != E; ++I) 3632*0b57cec5SDimitry Andric TsArray[I] = cast<FunctionTemplateDecl>(Ts[I]->getUnderlyingDecl()); 3633*0b57cec5SDimitry Andric 3634*0b57cec5SDimitry Andric TemplateArgumentLoc *ArgsArray = getTrailingObjects<TemplateArgumentLoc>(); 3635*0b57cec5SDimitry Andric for (unsigned I = 0, E = TArgs.size(); I != E; ++I) 3636*0b57cec5SDimitry Andric new (&ArgsArray[I]) TemplateArgumentLoc(TArgs[I]); 3637*0b57cec5SDimitry Andric } 3638*0b57cec5SDimitry Andric 3639*0b57cec5SDimitry Andric TemplateSpecializationKind FunctionDecl::getTemplateSpecializationKind() const { 3640*0b57cec5SDimitry Andric // For a function template specialization, query the specialization 3641*0b57cec5SDimitry Andric // information object. 3642*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *FTSInfo = 3643*0b57cec5SDimitry Andric TemplateOrSpecialization 3644*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo *>()) 3645*0b57cec5SDimitry Andric return FTSInfo->getTemplateSpecializationKind(); 3646*0b57cec5SDimitry Andric 3647*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSInfo = 3648*0b57cec5SDimitry Andric TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>()) 3649*0b57cec5SDimitry Andric return MSInfo->getTemplateSpecializationKind(); 3650*0b57cec5SDimitry Andric 3651*0b57cec5SDimitry Andric return TSK_Undeclared; 3652*0b57cec5SDimitry Andric } 3653*0b57cec5SDimitry Andric 3654*0b57cec5SDimitry Andric TemplateSpecializationKind 3655*0b57cec5SDimitry Andric FunctionDecl::getTemplateSpecializationKindForInstantiation() const { 3656*0b57cec5SDimitry Andric // This is the same as getTemplateSpecializationKind(), except that for a 3657*0b57cec5SDimitry Andric // function that is both a function template specialization and a member 3658*0b57cec5SDimitry Andric // specialization, we prefer the member specialization information. Eg: 3659*0b57cec5SDimitry Andric // 3660*0b57cec5SDimitry Andric // template<typename T> struct A { 3661*0b57cec5SDimitry Andric // template<typename U> void f() {} 3662*0b57cec5SDimitry Andric // template<> void f<int>() {} 3663*0b57cec5SDimitry Andric // }; 3664*0b57cec5SDimitry Andric // 3665*0b57cec5SDimitry Andric // For A<int>::f<int>(): 3666*0b57cec5SDimitry Andric // * getTemplateSpecializationKind() will return TSK_ExplicitSpecialization 3667*0b57cec5SDimitry Andric // * getTemplateSpecializationKindForInstantiation() will return 3668*0b57cec5SDimitry Andric // TSK_ImplicitInstantiation 3669*0b57cec5SDimitry Andric // 3670*0b57cec5SDimitry Andric // This reflects the facts that A<int>::f<int> is an explicit specialization 3671*0b57cec5SDimitry Andric // of A<int>::f, and that A<int>::f<int> should be implicitly instantiated 3672*0b57cec5SDimitry Andric // from A::f<int> if a definition is needed. 3673*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *FTSInfo = 3674*0b57cec5SDimitry Andric TemplateOrSpecialization 3675*0b57cec5SDimitry Andric .dyn_cast<FunctionTemplateSpecializationInfo *>()) { 3676*0b57cec5SDimitry Andric if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo()) 3677*0b57cec5SDimitry Andric return MSInfo->getTemplateSpecializationKind(); 3678*0b57cec5SDimitry Andric return FTSInfo->getTemplateSpecializationKind(); 3679*0b57cec5SDimitry Andric } 3680*0b57cec5SDimitry Andric 3681*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSInfo = 3682*0b57cec5SDimitry Andric TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>()) 3683*0b57cec5SDimitry Andric return MSInfo->getTemplateSpecializationKind(); 3684*0b57cec5SDimitry Andric 3685*0b57cec5SDimitry Andric return TSK_Undeclared; 3686*0b57cec5SDimitry Andric } 3687*0b57cec5SDimitry Andric 3688*0b57cec5SDimitry Andric void 3689*0b57cec5SDimitry Andric FunctionDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK, 3690*0b57cec5SDimitry Andric SourceLocation PointOfInstantiation) { 3691*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *FTSInfo 3692*0b57cec5SDimitry Andric = TemplateOrSpecialization.dyn_cast< 3693*0b57cec5SDimitry Andric FunctionTemplateSpecializationInfo*>()) { 3694*0b57cec5SDimitry Andric FTSInfo->setTemplateSpecializationKind(TSK); 3695*0b57cec5SDimitry Andric if (TSK != TSK_ExplicitSpecialization && 3696*0b57cec5SDimitry Andric PointOfInstantiation.isValid() && 3697*0b57cec5SDimitry Andric FTSInfo->getPointOfInstantiation().isInvalid()) { 3698*0b57cec5SDimitry Andric FTSInfo->setPointOfInstantiation(PointOfInstantiation); 3699*0b57cec5SDimitry Andric if (ASTMutationListener *L = getASTContext().getASTMutationListener()) 3700*0b57cec5SDimitry Andric L->InstantiationRequested(this); 3701*0b57cec5SDimitry Andric } 3702*0b57cec5SDimitry Andric } else if (MemberSpecializationInfo *MSInfo 3703*0b57cec5SDimitry Andric = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) { 3704*0b57cec5SDimitry Andric MSInfo->setTemplateSpecializationKind(TSK); 3705*0b57cec5SDimitry Andric if (TSK != TSK_ExplicitSpecialization && 3706*0b57cec5SDimitry Andric PointOfInstantiation.isValid() && 3707*0b57cec5SDimitry Andric MSInfo->getPointOfInstantiation().isInvalid()) { 3708*0b57cec5SDimitry Andric MSInfo->setPointOfInstantiation(PointOfInstantiation); 3709*0b57cec5SDimitry Andric if (ASTMutationListener *L = getASTContext().getASTMutationListener()) 3710*0b57cec5SDimitry Andric L->InstantiationRequested(this); 3711*0b57cec5SDimitry Andric } 3712*0b57cec5SDimitry Andric } else 3713*0b57cec5SDimitry Andric llvm_unreachable("Function cannot have a template specialization kind"); 3714*0b57cec5SDimitry Andric } 3715*0b57cec5SDimitry Andric 3716*0b57cec5SDimitry Andric SourceLocation FunctionDecl::getPointOfInstantiation() const { 3717*0b57cec5SDimitry Andric if (FunctionTemplateSpecializationInfo *FTSInfo 3718*0b57cec5SDimitry Andric = TemplateOrSpecialization.dyn_cast< 3719*0b57cec5SDimitry Andric FunctionTemplateSpecializationInfo*>()) 3720*0b57cec5SDimitry Andric return FTSInfo->getPointOfInstantiation(); 3721*0b57cec5SDimitry Andric else if (MemberSpecializationInfo *MSInfo 3722*0b57cec5SDimitry Andric = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) 3723*0b57cec5SDimitry Andric return MSInfo->getPointOfInstantiation(); 3724*0b57cec5SDimitry Andric 3725*0b57cec5SDimitry Andric return SourceLocation(); 3726*0b57cec5SDimitry Andric } 3727*0b57cec5SDimitry Andric 3728*0b57cec5SDimitry Andric bool FunctionDecl::isOutOfLine() const { 3729*0b57cec5SDimitry Andric if (Decl::isOutOfLine()) 3730*0b57cec5SDimitry Andric return true; 3731*0b57cec5SDimitry Andric 3732*0b57cec5SDimitry Andric // If this function was instantiated from a member function of a 3733*0b57cec5SDimitry Andric // class template, check whether that member function was defined out-of-line. 3734*0b57cec5SDimitry Andric if (FunctionDecl *FD = getInstantiatedFromMemberFunction()) { 3735*0b57cec5SDimitry Andric const FunctionDecl *Definition; 3736*0b57cec5SDimitry Andric if (FD->hasBody(Definition)) 3737*0b57cec5SDimitry Andric return Definition->isOutOfLine(); 3738*0b57cec5SDimitry Andric } 3739*0b57cec5SDimitry Andric 3740*0b57cec5SDimitry Andric // If this function was instantiated from a function template, 3741*0b57cec5SDimitry Andric // check whether that function template was defined out-of-line. 3742*0b57cec5SDimitry Andric if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) { 3743*0b57cec5SDimitry Andric const FunctionDecl *Definition; 3744*0b57cec5SDimitry Andric if (FunTmpl->getTemplatedDecl()->hasBody(Definition)) 3745*0b57cec5SDimitry Andric return Definition->isOutOfLine(); 3746*0b57cec5SDimitry Andric } 3747*0b57cec5SDimitry Andric 3748*0b57cec5SDimitry Andric return false; 3749*0b57cec5SDimitry Andric } 3750*0b57cec5SDimitry Andric 3751*0b57cec5SDimitry Andric SourceRange FunctionDecl::getSourceRange() const { 3752*0b57cec5SDimitry Andric return SourceRange(getOuterLocStart(), EndRangeLoc); 3753*0b57cec5SDimitry Andric } 3754*0b57cec5SDimitry Andric 3755*0b57cec5SDimitry Andric unsigned FunctionDecl::getMemoryFunctionKind() const { 3756*0b57cec5SDimitry Andric IdentifierInfo *FnInfo = getIdentifier(); 3757*0b57cec5SDimitry Andric 3758*0b57cec5SDimitry Andric if (!FnInfo) 3759*0b57cec5SDimitry Andric return 0; 3760*0b57cec5SDimitry Andric 3761*0b57cec5SDimitry Andric // Builtin handling. 3762*0b57cec5SDimitry Andric switch (getBuiltinID()) { 3763*0b57cec5SDimitry Andric case Builtin::BI__builtin_memset: 3764*0b57cec5SDimitry Andric case Builtin::BI__builtin___memset_chk: 3765*0b57cec5SDimitry Andric case Builtin::BImemset: 3766*0b57cec5SDimitry Andric return Builtin::BImemset; 3767*0b57cec5SDimitry Andric 3768*0b57cec5SDimitry Andric case Builtin::BI__builtin_memcpy: 3769*0b57cec5SDimitry Andric case Builtin::BI__builtin___memcpy_chk: 3770*0b57cec5SDimitry Andric case Builtin::BImemcpy: 3771*0b57cec5SDimitry Andric return Builtin::BImemcpy; 3772*0b57cec5SDimitry Andric 3773*0b57cec5SDimitry Andric case Builtin::BI__builtin_memmove: 3774*0b57cec5SDimitry Andric case Builtin::BI__builtin___memmove_chk: 3775*0b57cec5SDimitry Andric case Builtin::BImemmove: 3776*0b57cec5SDimitry Andric return Builtin::BImemmove; 3777*0b57cec5SDimitry Andric 3778*0b57cec5SDimitry Andric case Builtin::BIstrlcpy: 3779*0b57cec5SDimitry Andric case Builtin::BI__builtin___strlcpy_chk: 3780*0b57cec5SDimitry Andric return Builtin::BIstrlcpy; 3781*0b57cec5SDimitry Andric 3782*0b57cec5SDimitry Andric case Builtin::BIstrlcat: 3783*0b57cec5SDimitry Andric case Builtin::BI__builtin___strlcat_chk: 3784*0b57cec5SDimitry Andric return Builtin::BIstrlcat; 3785*0b57cec5SDimitry Andric 3786*0b57cec5SDimitry Andric case Builtin::BI__builtin_memcmp: 3787*0b57cec5SDimitry Andric case Builtin::BImemcmp: 3788*0b57cec5SDimitry Andric return Builtin::BImemcmp; 3789*0b57cec5SDimitry Andric 3790*0b57cec5SDimitry Andric case Builtin::BI__builtin_bcmp: 3791*0b57cec5SDimitry Andric case Builtin::BIbcmp: 3792*0b57cec5SDimitry Andric return Builtin::BIbcmp; 3793*0b57cec5SDimitry Andric 3794*0b57cec5SDimitry Andric case Builtin::BI__builtin_strncpy: 3795*0b57cec5SDimitry Andric case Builtin::BI__builtin___strncpy_chk: 3796*0b57cec5SDimitry Andric case Builtin::BIstrncpy: 3797*0b57cec5SDimitry Andric return Builtin::BIstrncpy; 3798*0b57cec5SDimitry Andric 3799*0b57cec5SDimitry Andric case Builtin::BI__builtin_strncmp: 3800*0b57cec5SDimitry Andric case Builtin::BIstrncmp: 3801*0b57cec5SDimitry Andric return Builtin::BIstrncmp; 3802*0b57cec5SDimitry Andric 3803*0b57cec5SDimitry Andric case Builtin::BI__builtin_strncasecmp: 3804*0b57cec5SDimitry Andric case Builtin::BIstrncasecmp: 3805*0b57cec5SDimitry Andric return Builtin::BIstrncasecmp; 3806*0b57cec5SDimitry Andric 3807*0b57cec5SDimitry Andric case Builtin::BI__builtin_strncat: 3808*0b57cec5SDimitry Andric case Builtin::BI__builtin___strncat_chk: 3809*0b57cec5SDimitry Andric case Builtin::BIstrncat: 3810*0b57cec5SDimitry Andric return Builtin::BIstrncat; 3811*0b57cec5SDimitry Andric 3812*0b57cec5SDimitry Andric case Builtin::BI__builtin_strndup: 3813*0b57cec5SDimitry Andric case Builtin::BIstrndup: 3814*0b57cec5SDimitry Andric return Builtin::BIstrndup; 3815*0b57cec5SDimitry Andric 3816*0b57cec5SDimitry Andric case Builtin::BI__builtin_strlen: 3817*0b57cec5SDimitry Andric case Builtin::BIstrlen: 3818*0b57cec5SDimitry Andric return Builtin::BIstrlen; 3819*0b57cec5SDimitry Andric 3820*0b57cec5SDimitry Andric case Builtin::BI__builtin_bzero: 3821*0b57cec5SDimitry Andric case Builtin::BIbzero: 3822*0b57cec5SDimitry Andric return Builtin::BIbzero; 3823*0b57cec5SDimitry Andric 3824*0b57cec5SDimitry Andric default: 3825*0b57cec5SDimitry Andric if (isExternC()) { 3826*0b57cec5SDimitry Andric if (FnInfo->isStr("memset")) 3827*0b57cec5SDimitry Andric return Builtin::BImemset; 3828*0b57cec5SDimitry Andric else if (FnInfo->isStr("memcpy")) 3829*0b57cec5SDimitry Andric return Builtin::BImemcpy; 3830*0b57cec5SDimitry Andric else if (FnInfo->isStr("memmove")) 3831*0b57cec5SDimitry Andric return Builtin::BImemmove; 3832*0b57cec5SDimitry Andric else if (FnInfo->isStr("memcmp")) 3833*0b57cec5SDimitry Andric return Builtin::BImemcmp; 3834*0b57cec5SDimitry Andric else if (FnInfo->isStr("bcmp")) 3835*0b57cec5SDimitry Andric return Builtin::BIbcmp; 3836*0b57cec5SDimitry Andric else if (FnInfo->isStr("strncpy")) 3837*0b57cec5SDimitry Andric return Builtin::BIstrncpy; 3838*0b57cec5SDimitry Andric else if (FnInfo->isStr("strncmp")) 3839*0b57cec5SDimitry Andric return Builtin::BIstrncmp; 3840*0b57cec5SDimitry Andric else if (FnInfo->isStr("strncasecmp")) 3841*0b57cec5SDimitry Andric return Builtin::BIstrncasecmp; 3842*0b57cec5SDimitry Andric else if (FnInfo->isStr("strncat")) 3843*0b57cec5SDimitry Andric return Builtin::BIstrncat; 3844*0b57cec5SDimitry Andric else if (FnInfo->isStr("strndup")) 3845*0b57cec5SDimitry Andric return Builtin::BIstrndup; 3846*0b57cec5SDimitry Andric else if (FnInfo->isStr("strlen")) 3847*0b57cec5SDimitry Andric return Builtin::BIstrlen; 3848*0b57cec5SDimitry Andric else if (FnInfo->isStr("bzero")) 3849*0b57cec5SDimitry Andric return Builtin::BIbzero; 3850*0b57cec5SDimitry Andric } 3851*0b57cec5SDimitry Andric break; 3852*0b57cec5SDimitry Andric } 3853*0b57cec5SDimitry Andric return 0; 3854*0b57cec5SDimitry Andric } 3855*0b57cec5SDimitry Andric 3856*0b57cec5SDimitry Andric unsigned FunctionDecl::getODRHash() const { 3857*0b57cec5SDimitry Andric assert(hasODRHash()); 3858*0b57cec5SDimitry Andric return ODRHash; 3859*0b57cec5SDimitry Andric } 3860*0b57cec5SDimitry Andric 3861*0b57cec5SDimitry Andric unsigned FunctionDecl::getODRHash() { 3862*0b57cec5SDimitry Andric if (hasODRHash()) 3863*0b57cec5SDimitry Andric return ODRHash; 3864*0b57cec5SDimitry Andric 3865*0b57cec5SDimitry Andric if (auto *FT = getInstantiatedFromMemberFunction()) { 3866*0b57cec5SDimitry Andric setHasODRHash(true); 3867*0b57cec5SDimitry Andric ODRHash = FT->getODRHash(); 3868*0b57cec5SDimitry Andric return ODRHash; 3869*0b57cec5SDimitry Andric } 3870*0b57cec5SDimitry Andric 3871*0b57cec5SDimitry Andric class ODRHash Hash; 3872*0b57cec5SDimitry Andric Hash.AddFunctionDecl(this); 3873*0b57cec5SDimitry Andric setHasODRHash(true); 3874*0b57cec5SDimitry Andric ODRHash = Hash.CalculateHash(); 3875*0b57cec5SDimitry Andric return ODRHash; 3876*0b57cec5SDimitry Andric } 3877*0b57cec5SDimitry Andric 3878*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3879*0b57cec5SDimitry Andric // FieldDecl Implementation 3880*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3881*0b57cec5SDimitry Andric 3882*0b57cec5SDimitry Andric FieldDecl *FieldDecl::Create(const ASTContext &C, DeclContext *DC, 3883*0b57cec5SDimitry Andric SourceLocation StartLoc, SourceLocation IdLoc, 3884*0b57cec5SDimitry Andric IdentifierInfo *Id, QualType T, 3885*0b57cec5SDimitry Andric TypeSourceInfo *TInfo, Expr *BW, bool Mutable, 3886*0b57cec5SDimitry Andric InClassInitStyle InitStyle) { 3887*0b57cec5SDimitry Andric return new (C, DC) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo, 3888*0b57cec5SDimitry Andric BW, Mutable, InitStyle); 3889*0b57cec5SDimitry Andric } 3890*0b57cec5SDimitry Andric 3891*0b57cec5SDimitry Andric FieldDecl *FieldDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 3892*0b57cec5SDimitry Andric return new (C, ID) FieldDecl(Field, nullptr, SourceLocation(), 3893*0b57cec5SDimitry Andric SourceLocation(), nullptr, QualType(), nullptr, 3894*0b57cec5SDimitry Andric nullptr, false, ICIS_NoInit); 3895*0b57cec5SDimitry Andric } 3896*0b57cec5SDimitry Andric 3897*0b57cec5SDimitry Andric bool FieldDecl::isAnonymousStructOrUnion() const { 3898*0b57cec5SDimitry Andric if (!isImplicit() || getDeclName()) 3899*0b57cec5SDimitry Andric return false; 3900*0b57cec5SDimitry Andric 3901*0b57cec5SDimitry Andric if (const auto *Record = getType()->getAs<RecordType>()) 3902*0b57cec5SDimitry Andric return Record->getDecl()->isAnonymousStructOrUnion(); 3903*0b57cec5SDimitry Andric 3904*0b57cec5SDimitry Andric return false; 3905*0b57cec5SDimitry Andric } 3906*0b57cec5SDimitry Andric 3907*0b57cec5SDimitry Andric unsigned FieldDecl::getBitWidthValue(const ASTContext &Ctx) const { 3908*0b57cec5SDimitry Andric assert(isBitField() && "not a bitfield"); 3909*0b57cec5SDimitry Andric return getBitWidth()->EvaluateKnownConstInt(Ctx).getZExtValue(); 3910*0b57cec5SDimitry Andric } 3911*0b57cec5SDimitry Andric 3912*0b57cec5SDimitry Andric bool FieldDecl::isZeroLengthBitField(const ASTContext &Ctx) const { 3913*0b57cec5SDimitry Andric return isUnnamedBitfield() && !getBitWidth()->isValueDependent() && 3914*0b57cec5SDimitry Andric getBitWidthValue(Ctx) == 0; 3915*0b57cec5SDimitry Andric } 3916*0b57cec5SDimitry Andric 3917*0b57cec5SDimitry Andric bool FieldDecl::isZeroSize(const ASTContext &Ctx) const { 3918*0b57cec5SDimitry Andric if (isZeroLengthBitField(Ctx)) 3919*0b57cec5SDimitry Andric return true; 3920*0b57cec5SDimitry Andric 3921*0b57cec5SDimitry Andric // C++2a [intro.object]p7: 3922*0b57cec5SDimitry Andric // An object has nonzero size if it 3923*0b57cec5SDimitry Andric // -- is not a potentially-overlapping subobject, or 3924*0b57cec5SDimitry Andric if (!hasAttr<NoUniqueAddressAttr>()) 3925*0b57cec5SDimitry Andric return false; 3926*0b57cec5SDimitry Andric 3927*0b57cec5SDimitry Andric // -- is not of class type, or 3928*0b57cec5SDimitry Andric const auto *RT = getType()->getAs<RecordType>(); 3929*0b57cec5SDimitry Andric if (!RT) 3930*0b57cec5SDimitry Andric return false; 3931*0b57cec5SDimitry Andric const RecordDecl *RD = RT->getDecl()->getDefinition(); 3932*0b57cec5SDimitry Andric if (!RD) { 3933*0b57cec5SDimitry Andric assert(isInvalidDecl() && "valid field has incomplete type"); 3934*0b57cec5SDimitry Andric return false; 3935*0b57cec5SDimitry Andric } 3936*0b57cec5SDimitry Andric 3937*0b57cec5SDimitry Andric // -- [has] virtual member functions or virtual base classes, or 3938*0b57cec5SDimitry Andric // -- has subobjects of nonzero size or bit-fields of nonzero length 3939*0b57cec5SDimitry Andric const auto *CXXRD = cast<CXXRecordDecl>(RD); 3940*0b57cec5SDimitry Andric if (!CXXRD->isEmpty()) 3941*0b57cec5SDimitry Andric return false; 3942*0b57cec5SDimitry Andric 3943*0b57cec5SDimitry Andric // Otherwise, [...] the circumstances under which the object has zero size 3944*0b57cec5SDimitry Andric // are implementation-defined. 3945*0b57cec5SDimitry Andric // FIXME: This might be Itanium ABI specific; we don't yet know what the MS 3946*0b57cec5SDimitry Andric // ABI will do. 3947*0b57cec5SDimitry Andric return true; 3948*0b57cec5SDimitry Andric } 3949*0b57cec5SDimitry Andric 3950*0b57cec5SDimitry Andric unsigned FieldDecl::getFieldIndex() const { 3951*0b57cec5SDimitry Andric const FieldDecl *Canonical = getCanonicalDecl(); 3952*0b57cec5SDimitry Andric if (Canonical != this) 3953*0b57cec5SDimitry Andric return Canonical->getFieldIndex(); 3954*0b57cec5SDimitry Andric 3955*0b57cec5SDimitry Andric if (CachedFieldIndex) return CachedFieldIndex - 1; 3956*0b57cec5SDimitry Andric 3957*0b57cec5SDimitry Andric unsigned Index = 0; 3958*0b57cec5SDimitry Andric const RecordDecl *RD = getParent()->getDefinition(); 3959*0b57cec5SDimitry Andric assert(RD && "requested index for field of struct with no definition"); 3960*0b57cec5SDimitry Andric 3961*0b57cec5SDimitry Andric for (auto *Field : RD->fields()) { 3962*0b57cec5SDimitry Andric Field->getCanonicalDecl()->CachedFieldIndex = Index + 1; 3963*0b57cec5SDimitry Andric ++Index; 3964*0b57cec5SDimitry Andric } 3965*0b57cec5SDimitry Andric 3966*0b57cec5SDimitry Andric assert(CachedFieldIndex && "failed to find field in parent"); 3967*0b57cec5SDimitry Andric return CachedFieldIndex - 1; 3968*0b57cec5SDimitry Andric } 3969*0b57cec5SDimitry Andric 3970*0b57cec5SDimitry Andric SourceRange FieldDecl::getSourceRange() const { 3971*0b57cec5SDimitry Andric const Expr *FinalExpr = getInClassInitializer(); 3972*0b57cec5SDimitry Andric if (!FinalExpr) 3973*0b57cec5SDimitry Andric FinalExpr = getBitWidth(); 3974*0b57cec5SDimitry Andric if (FinalExpr) 3975*0b57cec5SDimitry Andric return SourceRange(getInnerLocStart(), FinalExpr->getEndLoc()); 3976*0b57cec5SDimitry Andric return DeclaratorDecl::getSourceRange(); 3977*0b57cec5SDimitry Andric } 3978*0b57cec5SDimitry Andric 3979*0b57cec5SDimitry Andric void FieldDecl::setCapturedVLAType(const VariableArrayType *VLAType) { 3980*0b57cec5SDimitry Andric assert((getParent()->isLambda() || getParent()->isCapturedRecord()) && 3981*0b57cec5SDimitry Andric "capturing type in non-lambda or captured record."); 3982*0b57cec5SDimitry Andric assert(InitStorage.getInt() == ISK_NoInit && 3983*0b57cec5SDimitry Andric InitStorage.getPointer() == nullptr && 3984*0b57cec5SDimitry Andric "bit width, initializer or captured type already set"); 3985*0b57cec5SDimitry Andric InitStorage.setPointerAndInt(const_cast<VariableArrayType *>(VLAType), 3986*0b57cec5SDimitry Andric ISK_CapturedVLAType); 3987*0b57cec5SDimitry Andric } 3988*0b57cec5SDimitry Andric 3989*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3990*0b57cec5SDimitry Andric // TagDecl Implementation 3991*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3992*0b57cec5SDimitry Andric 3993*0b57cec5SDimitry Andric TagDecl::TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, 3994*0b57cec5SDimitry Andric SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl, 3995*0b57cec5SDimitry Andric SourceLocation StartL) 3996*0b57cec5SDimitry Andric : TypeDecl(DK, DC, L, Id, StartL), DeclContext(DK), redeclarable_base(C), 3997*0b57cec5SDimitry Andric TypedefNameDeclOrQualifier((TypedefNameDecl *)nullptr) { 3998*0b57cec5SDimitry Andric assert((DK != Enum || TK == TTK_Enum) && 3999*0b57cec5SDimitry Andric "EnumDecl not matched with TTK_Enum"); 4000*0b57cec5SDimitry Andric setPreviousDecl(PrevDecl); 4001*0b57cec5SDimitry Andric setTagKind(TK); 4002*0b57cec5SDimitry Andric setCompleteDefinition(false); 4003*0b57cec5SDimitry Andric setBeingDefined(false); 4004*0b57cec5SDimitry Andric setEmbeddedInDeclarator(false); 4005*0b57cec5SDimitry Andric setFreeStanding(false); 4006*0b57cec5SDimitry Andric setCompleteDefinitionRequired(false); 4007*0b57cec5SDimitry Andric } 4008*0b57cec5SDimitry Andric 4009*0b57cec5SDimitry Andric SourceLocation TagDecl::getOuterLocStart() const { 4010*0b57cec5SDimitry Andric return getTemplateOrInnerLocStart(this); 4011*0b57cec5SDimitry Andric } 4012*0b57cec5SDimitry Andric 4013*0b57cec5SDimitry Andric SourceRange TagDecl::getSourceRange() const { 4014*0b57cec5SDimitry Andric SourceLocation RBraceLoc = BraceRange.getEnd(); 4015*0b57cec5SDimitry Andric SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation(); 4016*0b57cec5SDimitry Andric return SourceRange(getOuterLocStart(), E); 4017*0b57cec5SDimitry Andric } 4018*0b57cec5SDimitry Andric 4019*0b57cec5SDimitry Andric TagDecl *TagDecl::getCanonicalDecl() { return getFirstDecl(); } 4020*0b57cec5SDimitry Andric 4021*0b57cec5SDimitry Andric void TagDecl::setTypedefNameForAnonDecl(TypedefNameDecl *TDD) { 4022*0b57cec5SDimitry Andric TypedefNameDeclOrQualifier = TDD; 4023*0b57cec5SDimitry Andric if (const Type *T = getTypeForDecl()) { 4024*0b57cec5SDimitry Andric (void)T; 4025*0b57cec5SDimitry Andric assert(T->isLinkageValid()); 4026*0b57cec5SDimitry Andric } 4027*0b57cec5SDimitry Andric assert(isLinkageValid()); 4028*0b57cec5SDimitry Andric } 4029*0b57cec5SDimitry Andric 4030*0b57cec5SDimitry Andric void TagDecl::startDefinition() { 4031*0b57cec5SDimitry Andric setBeingDefined(true); 4032*0b57cec5SDimitry Andric 4033*0b57cec5SDimitry Andric if (auto *D = dyn_cast<CXXRecordDecl>(this)) { 4034*0b57cec5SDimitry Andric struct CXXRecordDecl::DefinitionData *Data = 4035*0b57cec5SDimitry Andric new (getASTContext()) struct CXXRecordDecl::DefinitionData(D); 4036*0b57cec5SDimitry Andric for (auto I : redecls()) 4037*0b57cec5SDimitry Andric cast<CXXRecordDecl>(I)->DefinitionData = Data; 4038*0b57cec5SDimitry Andric } 4039*0b57cec5SDimitry Andric } 4040*0b57cec5SDimitry Andric 4041*0b57cec5SDimitry Andric void TagDecl::completeDefinition() { 4042*0b57cec5SDimitry Andric assert((!isa<CXXRecordDecl>(this) || 4043*0b57cec5SDimitry Andric cast<CXXRecordDecl>(this)->hasDefinition()) && 4044*0b57cec5SDimitry Andric "definition completed but not started"); 4045*0b57cec5SDimitry Andric 4046*0b57cec5SDimitry Andric setCompleteDefinition(true); 4047*0b57cec5SDimitry Andric setBeingDefined(false); 4048*0b57cec5SDimitry Andric 4049*0b57cec5SDimitry Andric if (ASTMutationListener *L = getASTMutationListener()) 4050*0b57cec5SDimitry Andric L->CompletedTagDefinition(this); 4051*0b57cec5SDimitry Andric } 4052*0b57cec5SDimitry Andric 4053*0b57cec5SDimitry Andric TagDecl *TagDecl::getDefinition() const { 4054*0b57cec5SDimitry Andric if (isCompleteDefinition()) 4055*0b57cec5SDimitry Andric return const_cast<TagDecl *>(this); 4056*0b57cec5SDimitry Andric 4057*0b57cec5SDimitry Andric // If it's possible for us to have an out-of-date definition, check now. 4058*0b57cec5SDimitry Andric if (mayHaveOutOfDateDef()) { 4059*0b57cec5SDimitry Andric if (IdentifierInfo *II = getIdentifier()) { 4060*0b57cec5SDimitry Andric if (II->isOutOfDate()) { 4061*0b57cec5SDimitry Andric updateOutOfDate(*II); 4062*0b57cec5SDimitry Andric } 4063*0b57cec5SDimitry Andric } 4064*0b57cec5SDimitry Andric } 4065*0b57cec5SDimitry Andric 4066*0b57cec5SDimitry Andric if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(this)) 4067*0b57cec5SDimitry Andric return CXXRD->getDefinition(); 4068*0b57cec5SDimitry Andric 4069*0b57cec5SDimitry Andric for (auto R : redecls()) 4070*0b57cec5SDimitry Andric if (R->isCompleteDefinition()) 4071*0b57cec5SDimitry Andric return R; 4072*0b57cec5SDimitry Andric 4073*0b57cec5SDimitry Andric return nullptr; 4074*0b57cec5SDimitry Andric } 4075*0b57cec5SDimitry Andric 4076*0b57cec5SDimitry Andric void TagDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) { 4077*0b57cec5SDimitry Andric if (QualifierLoc) { 4078*0b57cec5SDimitry Andric // Make sure the extended qualifier info is allocated. 4079*0b57cec5SDimitry Andric if (!hasExtInfo()) 4080*0b57cec5SDimitry Andric TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo; 4081*0b57cec5SDimitry Andric // Set qualifier info. 4082*0b57cec5SDimitry Andric getExtInfo()->QualifierLoc = QualifierLoc; 4083*0b57cec5SDimitry Andric } else { 4084*0b57cec5SDimitry Andric // Here Qualifier == 0, i.e., we are removing the qualifier (if any). 4085*0b57cec5SDimitry Andric if (hasExtInfo()) { 4086*0b57cec5SDimitry Andric if (getExtInfo()->NumTemplParamLists == 0) { 4087*0b57cec5SDimitry Andric getASTContext().Deallocate(getExtInfo()); 4088*0b57cec5SDimitry Andric TypedefNameDeclOrQualifier = (TypedefNameDecl *)nullptr; 4089*0b57cec5SDimitry Andric } 4090*0b57cec5SDimitry Andric else 4091*0b57cec5SDimitry Andric getExtInfo()->QualifierLoc = QualifierLoc; 4092*0b57cec5SDimitry Andric } 4093*0b57cec5SDimitry Andric } 4094*0b57cec5SDimitry Andric } 4095*0b57cec5SDimitry Andric 4096*0b57cec5SDimitry Andric void TagDecl::setTemplateParameterListsInfo( 4097*0b57cec5SDimitry Andric ASTContext &Context, ArrayRef<TemplateParameterList *> TPLists) { 4098*0b57cec5SDimitry Andric assert(!TPLists.empty()); 4099*0b57cec5SDimitry Andric // Make sure the extended decl info is allocated. 4100*0b57cec5SDimitry Andric if (!hasExtInfo()) 4101*0b57cec5SDimitry Andric // Allocate external info struct. 4102*0b57cec5SDimitry Andric TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo; 4103*0b57cec5SDimitry Andric // Set the template parameter lists info. 4104*0b57cec5SDimitry Andric getExtInfo()->setTemplateParameterListsInfo(Context, TPLists); 4105*0b57cec5SDimitry Andric } 4106*0b57cec5SDimitry Andric 4107*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4108*0b57cec5SDimitry Andric // EnumDecl Implementation 4109*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4110*0b57cec5SDimitry Andric 4111*0b57cec5SDimitry Andric EnumDecl::EnumDecl(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, 4112*0b57cec5SDimitry Andric SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, 4113*0b57cec5SDimitry Andric bool Scoped, bool ScopedUsingClassTag, bool Fixed) 4114*0b57cec5SDimitry Andric : TagDecl(Enum, TTK_Enum, C, DC, IdLoc, Id, PrevDecl, StartLoc) { 4115*0b57cec5SDimitry Andric assert(Scoped || !ScopedUsingClassTag); 4116*0b57cec5SDimitry Andric IntegerType = nullptr; 4117*0b57cec5SDimitry Andric setNumPositiveBits(0); 4118*0b57cec5SDimitry Andric setNumNegativeBits(0); 4119*0b57cec5SDimitry Andric setScoped(Scoped); 4120*0b57cec5SDimitry Andric setScopedUsingClassTag(ScopedUsingClassTag); 4121*0b57cec5SDimitry Andric setFixed(Fixed); 4122*0b57cec5SDimitry Andric setHasODRHash(false); 4123*0b57cec5SDimitry Andric ODRHash = 0; 4124*0b57cec5SDimitry Andric } 4125*0b57cec5SDimitry Andric 4126*0b57cec5SDimitry Andric void EnumDecl::anchor() {} 4127*0b57cec5SDimitry Andric 4128*0b57cec5SDimitry Andric EnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, 4129*0b57cec5SDimitry Andric SourceLocation StartLoc, SourceLocation IdLoc, 4130*0b57cec5SDimitry Andric IdentifierInfo *Id, 4131*0b57cec5SDimitry Andric EnumDecl *PrevDecl, bool IsScoped, 4132*0b57cec5SDimitry Andric bool IsScopedUsingClassTag, bool IsFixed) { 4133*0b57cec5SDimitry Andric auto *Enum = new (C, DC) EnumDecl(C, DC, StartLoc, IdLoc, Id, PrevDecl, 4134*0b57cec5SDimitry Andric IsScoped, IsScopedUsingClassTag, IsFixed); 4135*0b57cec5SDimitry Andric Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules); 4136*0b57cec5SDimitry Andric C.getTypeDeclType(Enum, PrevDecl); 4137*0b57cec5SDimitry Andric return Enum; 4138*0b57cec5SDimitry Andric } 4139*0b57cec5SDimitry Andric 4140*0b57cec5SDimitry Andric EnumDecl *EnumDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4141*0b57cec5SDimitry Andric EnumDecl *Enum = 4142*0b57cec5SDimitry Andric new (C, ID) EnumDecl(C, nullptr, SourceLocation(), SourceLocation(), 4143*0b57cec5SDimitry Andric nullptr, nullptr, false, false, false); 4144*0b57cec5SDimitry Andric Enum->setMayHaveOutOfDateDef(C.getLangOpts().Modules); 4145*0b57cec5SDimitry Andric return Enum; 4146*0b57cec5SDimitry Andric } 4147*0b57cec5SDimitry Andric 4148*0b57cec5SDimitry Andric SourceRange EnumDecl::getIntegerTypeRange() const { 4149*0b57cec5SDimitry Andric if (const TypeSourceInfo *TI = getIntegerTypeSourceInfo()) 4150*0b57cec5SDimitry Andric return TI->getTypeLoc().getSourceRange(); 4151*0b57cec5SDimitry Andric return SourceRange(); 4152*0b57cec5SDimitry Andric } 4153*0b57cec5SDimitry Andric 4154*0b57cec5SDimitry Andric void EnumDecl::completeDefinition(QualType NewType, 4155*0b57cec5SDimitry Andric QualType NewPromotionType, 4156*0b57cec5SDimitry Andric unsigned NumPositiveBits, 4157*0b57cec5SDimitry Andric unsigned NumNegativeBits) { 4158*0b57cec5SDimitry Andric assert(!isCompleteDefinition() && "Cannot redefine enums!"); 4159*0b57cec5SDimitry Andric if (!IntegerType) 4160*0b57cec5SDimitry Andric IntegerType = NewType.getTypePtr(); 4161*0b57cec5SDimitry Andric PromotionType = NewPromotionType; 4162*0b57cec5SDimitry Andric setNumPositiveBits(NumPositiveBits); 4163*0b57cec5SDimitry Andric setNumNegativeBits(NumNegativeBits); 4164*0b57cec5SDimitry Andric TagDecl::completeDefinition(); 4165*0b57cec5SDimitry Andric } 4166*0b57cec5SDimitry Andric 4167*0b57cec5SDimitry Andric bool EnumDecl::isClosed() const { 4168*0b57cec5SDimitry Andric if (const auto *A = getAttr<EnumExtensibilityAttr>()) 4169*0b57cec5SDimitry Andric return A->getExtensibility() == EnumExtensibilityAttr::Closed; 4170*0b57cec5SDimitry Andric return true; 4171*0b57cec5SDimitry Andric } 4172*0b57cec5SDimitry Andric 4173*0b57cec5SDimitry Andric bool EnumDecl::isClosedFlag() const { 4174*0b57cec5SDimitry Andric return isClosed() && hasAttr<FlagEnumAttr>(); 4175*0b57cec5SDimitry Andric } 4176*0b57cec5SDimitry Andric 4177*0b57cec5SDimitry Andric bool EnumDecl::isClosedNonFlag() const { 4178*0b57cec5SDimitry Andric return isClosed() && !hasAttr<FlagEnumAttr>(); 4179*0b57cec5SDimitry Andric } 4180*0b57cec5SDimitry Andric 4181*0b57cec5SDimitry Andric TemplateSpecializationKind EnumDecl::getTemplateSpecializationKind() const { 4182*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) 4183*0b57cec5SDimitry Andric return MSI->getTemplateSpecializationKind(); 4184*0b57cec5SDimitry Andric 4185*0b57cec5SDimitry Andric return TSK_Undeclared; 4186*0b57cec5SDimitry Andric } 4187*0b57cec5SDimitry Andric 4188*0b57cec5SDimitry Andric void EnumDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK, 4189*0b57cec5SDimitry Andric SourceLocation PointOfInstantiation) { 4190*0b57cec5SDimitry Andric MemberSpecializationInfo *MSI = getMemberSpecializationInfo(); 4191*0b57cec5SDimitry Andric assert(MSI && "Not an instantiated member enumeration?"); 4192*0b57cec5SDimitry Andric MSI->setTemplateSpecializationKind(TSK); 4193*0b57cec5SDimitry Andric if (TSK != TSK_ExplicitSpecialization && 4194*0b57cec5SDimitry Andric PointOfInstantiation.isValid() && 4195*0b57cec5SDimitry Andric MSI->getPointOfInstantiation().isInvalid()) 4196*0b57cec5SDimitry Andric MSI->setPointOfInstantiation(PointOfInstantiation); 4197*0b57cec5SDimitry Andric } 4198*0b57cec5SDimitry Andric 4199*0b57cec5SDimitry Andric EnumDecl *EnumDecl::getTemplateInstantiationPattern() const { 4200*0b57cec5SDimitry Andric if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { 4201*0b57cec5SDimitry Andric if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) { 4202*0b57cec5SDimitry Andric EnumDecl *ED = getInstantiatedFromMemberEnum(); 4203*0b57cec5SDimitry Andric while (auto *NewED = ED->getInstantiatedFromMemberEnum()) 4204*0b57cec5SDimitry Andric ED = NewED; 4205*0b57cec5SDimitry Andric return getDefinitionOrSelf(ED); 4206*0b57cec5SDimitry Andric } 4207*0b57cec5SDimitry Andric } 4208*0b57cec5SDimitry Andric 4209*0b57cec5SDimitry Andric assert(!isTemplateInstantiation(getTemplateSpecializationKind()) && 4210*0b57cec5SDimitry Andric "couldn't find pattern for enum instantiation"); 4211*0b57cec5SDimitry Andric return nullptr; 4212*0b57cec5SDimitry Andric } 4213*0b57cec5SDimitry Andric 4214*0b57cec5SDimitry Andric EnumDecl *EnumDecl::getInstantiatedFromMemberEnum() const { 4215*0b57cec5SDimitry Andric if (SpecializationInfo) 4216*0b57cec5SDimitry Andric return cast<EnumDecl>(SpecializationInfo->getInstantiatedFrom()); 4217*0b57cec5SDimitry Andric 4218*0b57cec5SDimitry Andric return nullptr; 4219*0b57cec5SDimitry Andric } 4220*0b57cec5SDimitry Andric 4221*0b57cec5SDimitry Andric void EnumDecl::setInstantiationOfMemberEnum(ASTContext &C, EnumDecl *ED, 4222*0b57cec5SDimitry Andric TemplateSpecializationKind TSK) { 4223*0b57cec5SDimitry Andric assert(!SpecializationInfo && "Member enum is already a specialization"); 4224*0b57cec5SDimitry Andric SpecializationInfo = new (C) MemberSpecializationInfo(ED, TSK); 4225*0b57cec5SDimitry Andric } 4226*0b57cec5SDimitry Andric 4227*0b57cec5SDimitry Andric unsigned EnumDecl::getODRHash() { 4228*0b57cec5SDimitry Andric if (hasODRHash()) 4229*0b57cec5SDimitry Andric return ODRHash; 4230*0b57cec5SDimitry Andric 4231*0b57cec5SDimitry Andric class ODRHash Hash; 4232*0b57cec5SDimitry Andric Hash.AddEnumDecl(this); 4233*0b57cec5SDimitry Andric setHasODRHash(true); 4234*0b57cec5SDimitry Andric ODRHash = Hash.CalculateHash(); 4235*0b57cec5SDimitry Andric return ODRHash; 4236*0b57cec5SDimitry Andric } 4237*0b57cec5SDimitry Andric 4238*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4239*0b57cec5SDimitry Andric // RecordDecl Implementation 4240*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4241*0b57cec5SDimitry Andric 4242*0b57cec5SDimitry Andric RecordDecl::RecordDecl(Kind DK, TagKind TK, const ASTContext &C, 4243*0b57cec5SDimitry Andric DeclContext *DC, SourceLocation StartLoc, 4244*0b57cec5SDimitry Andric SourceLocation IdLoc, IdentifierInfo *Id, 4245*0b57cec5SDimitry Andric RecordDecl *PrevDecl) 4246*0b57cec5SDimitry Andric : TagDecl(DK, TK, C, DC, IdLoc, Id, PrevDecl, StartLoc) { 4247*0b57cec5SDimitry Andric assert(classof(static_cast<Decl *>(this)) && "Invalid Kind!"); 4248*0b57cec5SDimitry Andric setHasFlexibleArrayMember(false); 4249*0b57cec5SDimitry Andric setAnonymousStructOrUnion(false); 4250*0b57cec5SDimitry Andric setHasObjectMember(false); 4251*0b57cec5SDimitry Andric setHasVolatileMember(false); 4252*0b57cec5SDimitry Andric setHasLoadedFieldsFromExternalStorage(false); 4253*0b57cec5SDimitry Andric setNonTrivialToPrimitiveDefaultInitialize(false); 4254*0b57cec5SDimitry Andric setNonTrivialToPrimitiveCopy(false); 4255*0b57cec5SDimitry Andric setNonTrivialToPrimitiveDestroy(false); 4256*0b57cec5SDimitry Andric setHasNonTrivialToPrimitiveDefaultInitializeCUnion(false); 4257*0b57cec5SDimitry Andric setHasNonTrivialToPrimitiveDestructCUnion(false); 4258*0b57cec5SDimitry Andric setHasNonTrivialToPrimitiveCopyCUnion(false); 4259*0b57cec5SDimitry Andric setParamDestroyedInCallee(false); 4260*0b57cec5SDimitry Andric setArgPassingRestrictions(APK_CanPassInRegs); 4261*0b57cec5SDimitry Andric } 4262*0b57cec5SDimitry Andric 4263*0b57cec5SDimitry Andric RecordDecl *RecordDecl::Create(const ASTContext &C, TagKind TK, DeclContext *DC, 4264*0b57cec5SDimitry Andric SourceLocation StartLoc, SourceLocation IdLoc, 4265*0b57cec5SDimitry Andric IdentifierInfo *Id, RecordDecl* PrevDecl) { 4266*0b57cec5SDimitry Andric RecordDecl *R = new (C, DC) RecordDecl(Record, TK, C, DC, 4267*0b57cec5SDimitry Andric StartLoc, IdLoc, Id, PrevDecl); 4268*0b57cec5SDimitry Andric R->setMayHaveOutOfDateDef(C.getLangOpts().Modules); 4269*0b57cec5SDimitry Andric 4270*0b57cec5SDimitry Andric C.getTypeDeclType(R, PrevDecl); 4271*0b57cec5SDimitry Andric return R; 4272*0b57cec5SDimitry Andric } 4273*0b57cec5SDimitry Andric 4274*0b57cec5SDimitry Andric RecordDecl *RecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 4275*0b57cec5SDimitry Andric RecordDecl *R = 4276*0b57cec5SDimitry Andric new (C, ID) RecordDecl(Record, TTK_Struct, C, nullptr, SourceLocation(), 4277*0b57cec5SDimitry Andric SourceLocation(), nullptr, nullptr); 4278*0b57cec5SDimitry Andric R->setMayHaveOutOfDateDef(C.getLangOpts().Modules); 4279*0b57cec5SDimitry Andric return R; 4280*0b57cec5SDimitry Andric } 4281*0b57cec5SDimitry Andric 4282*0b57cec5SDimitry Andric bool RecordDecl::isInjectedClassName() const { 4283*0b57cec5SDimitry Andric return isImplicit() && getDeclName() && getDeclContext()->isRecord() && 4284*0b57cec5SDimitry Andric cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName(); 4285*0b57cec5SDimitry Andric } 4286*0b57cec5SDimitry Andric 4287*0b57cec5SDimitry Andric bool RecordDecl::isLambda() const { 4288*0b57cec5SDimitry Andric if (auto RD = dyn_cast<CXXRecordDecl>(this)) 4289*0b57cec5SDimitry Andric return RD->isLambda(); 4290*0b57cec5SDimitry Andric return false; 4291*0b57cec5SDimitry Andric } 4292*0b57cec5SDimitry Andric 4293*0b57cec5SDimitry Andric bool RecordDecl::isCapturedRecord() const { 4294*0b57cec5SDimitry Andric return hasAttr<CapturedRecordAttr>(); 4295*0b57cec5SDimitry Andric } 4296*0b57cec5SDimitry Andric 4297*0b57cec5SDimitry Andric void RecordDecl::setCapturedRecord() { 4298*0b57cec5SDimitry Andric addAttr(CapturedRecordAttr::CreateImplicit(getASTContext())); 4299*0b57cec5SDimitry Andric } 4300*0b57cec5SDimitry Andric 4301*0b57cec5SDimitry Andric RecordDecl::field_iterator RecordDecl::field_begin() const { 4302*0b57cec5SDimitry Andric if (hasExternalLexicalStorage() && !hasLoadedFieldsFromExternalStorage()) 4303*0b57cec5SDimitry Andric LoadFieldsFromExternalStorage(); 4304*0b57cec5SDimitry Andric 4305*0b57cec5SDimitry Andric return field_iterator(decl_iterator(FirstDecl)); 4306*0b57cec5SDimitry Andric } 4307*0b57cec5SDimitry Andric 4308*0b57cec5SDimitry Andric /// completeDefinition - Notes that the definition of this type is now 4309*0b57cec5SDimitry Andric /// complete. 4310*0b57cec5SDimitry Andric void RecordDecl::completeDefinition() { 4311*0b57cec5SDimitry Andric assert(!isCompleteDefinition() && "Cannot redefine record!"); 4312*0b57cec5SDimitry Andric TagDecl::completeDefinition(); 4313*0b57cec5SDimitry Andric } 4314*0b57cec5SDimitry Andric 4315*0b57cec5SDimitry Andric /// isMsStruct - Get whether or not this record uses ms_struct layout. 4316*0b57cec5SDimitry Andric /// This which can be turned on with an attribute, pragma, or the 4317*0b57cec5SDimitry Andric /// -mms-bitfields command-line option. 4318*0b57cec5SDimitry Andric bool RecordDecl::isMsStruct(const ASTContext &C) const { 4319*0b57cec5SDimitry Andric return hasAttr<MSStructAttr>() || C.getLangOpts().MSBitfields == 1; 4320*0b57cec5SDimitry Andric } 4321*0b57cec5SDimitry Andric 4322*0b57cec5SDimitry Andric void RecordDecl::LoadFieldsFromExternalStorage() const { 4323*0b57cec5SDimitry Andric ExternalASTSource *Source = getASTContext().getExternalSource(); 4324*0b57cec5SDimitry Andric assert(hasExternalLexicalStorage() && Source && "No external storage?"); 4325*0b57cec5SDimitry Andric 4326*0b57cec5SDimitry Andric // Notify that we have a RecordDecl doing some initialization. 4327*0b57cec5SDimitry Andric ExternalASTSource::Deserializing TheFields(Source); 4328*0b57cec5SDimitry Andric 4329*0b57cec5SDimitry Andric SmallVector<Decl*, 64> Decls; 4330*0b57cec5SDimitry Andric setHasLoadedFieldsFromExternalStorage(true); 4331*0b57cec5SDimitry Andric Source->FindExternalLexicalDecls(this, [](Decl::Kind K) { 4332*0b57cec5SDimitry Andric return FieldDecl::classofKind(K) || IndirectFieldDecl::classofKind(K); 4333*0b57cec5SDimitry Andric }, Decls); 4334*0b57cec5SDimitry Andric 4335*0b57cec5SDimitry Andric #ifndef NDEBUG 4336*0b57cec5SDimitry Andric // Check that all decls we got were FieldDecls. 4337*0b57cec5SDimitry Andric for (unsigned i=0, e=Decls.size(); i != e; ++i) 4338*0b57cec5SDimitry Andric assert(isa<FieldDecl>(Decls[i]) || isa<IndirectFieldDecl>(Decls[i])); 4339*0b57cec5SDimitry Andric #endif 4340*0b57cec5SDimitry Andric 4341*0b57cec5SDimitry Andric if (Decls.empty()) 4342*0b57cec5SDimitry Andric return; 4343*0b57cec5SDimitry Andric 4344*0b57cec5SDimitry Andric std::tie(FirstDecl, LastDecl) = BuildDeclChain(Decls, 4345*0b57cec5SDimitry Andric /*FieldsAlreadyLoaded=*/false); 4346*0b57cec5SDimitry Andric } 4347*0b57cec5SDimitry Andric 4348*0b57cec5SDimitry Andric bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const { 4349*0b57cec5SDimitry Andric ASTContext &Context = getASTContext(); 4350*0b57cec5SDimitry Andric const SanitizerMask EnabledAsanMask = Context.getLangOpts().Sanitize.Mask & 4351*0b57cec5SDimitry Andric (SanitizerKind::Address | SanitizerKind::KernelAddress); 4352*0b57cec5SDimitry Andric if (!EnabledAsanMask || !Context.getLangOpts().SanitizeAddressFieldPadding) 4353*0b57cec5SDimitry Andric return false; 4354*0b57cec5SDimitry Andric const auto &Blacklist = Context.getSanitizerBlacklist(); 4355*0b57cec5SDimitry Andric const auto *CXXRD = dyn_cast<CXXRecordDecl>(this); 4356*0b57cec5SDimitry Andric // We may be able to relax some of these requirements. 4357*0b57cec5SDimitry Andric int ReasonToReject = -1; 4358*0b57cec5SDimitry Andric if (!CXXRD || CXXRD->isExternCContext()) 4359*0b57cec5SDimitry Andric ReasonToReject = 0; // is not C++. 4360*0b57cec5SDimitry Andric else if (CXXRD->hasAttr<PackedAttr>()) 4361*0b57cec5SDimitry Andric ReasonToReject = 1; // is packed. 4362*0b57cec5SDimitry Andric else if (CXXRD->isUnion()) 4363*0b57cec5SDimitry Andric ReasonToReject = 2; // is a union. 4364*0b57cec5SDimitry Andric else if (CXXRD->isTriviallyCopyable()) 4365*0b57cec5SDimitry Andric ReasonToReject = 3; // is trivially copyable. 4366*0b57cec5SDimitry Andric else if (CXXRD->hasTrivialDestructor()) 4367*0b57cec5SDimitry Andric ReasonToReject = 4; // has trivial destructor. 4368*0b57cec5SDimitry Andric else if (CXXRD->isStandardLayout()) 4369*0b57cec5SDimitry Andric ReasonToReject = 5; // is standard layout. 4370*0b57cec5SDimitry Andric else if (Blacklist.isBlacklistedLocation(EnabledAsanMask, getLocation(), 4371*0b57cec5SDimitry Andric "field-padding")) 4372*0b57cec5SDimitry Andric ReasonToReject = 6; // is in a blacklisted file. 4373*0b57cec5SDimitry Andric else if (Blacklist.isBlacklistedType(EnabledAsanMask, 4374*0b57cec5SDimitry Andric getQualifiedNameAsString(), 4375*0b57cec5SDimitry Andric "field-padding")) 4376*0b57cec5SDimitry Andric ReasonToReject = 7; // is blacklisted. 4377*0b57cec5SDimitry Andric 4378*0b57cec5SDimitry Andric if (EmitRemark) { 4379*0b57cec5SDimitry Andric if (ReasonToReject >= 0) 4380*0b57cec5SDimitry Andric Context.getDiagnostics().Report( 4381*0b57cec5SDimitry Andric getLocation(), 4382*0b57cec5SDimitry Andric diag::remark_sanitize_address_insert_extra_padding_rejected) 4383*0b57cec5SDimitry Andric << getQualifiedNameAsString() << ReasonToReject; 4384*0b57cec5SDimitry Andric else 4385*0b57cec5SDimitry Andric Context.getDiagnostics().Report( 4386*0b57cec5SDimitry Andric getLocation(), 4387*0b57cec5SDimitry Andric diag::remark_sanitize_address_insert_extra_padding_accepted) 4388*0b57cec5SDimitry Andric << getQualifiedNameAsString(); 4389*0b57cec5SDimitry Andric } 4390*0b57cec5SDimitry Andric return ReasonToReject < 0; 4391*0b57cec5SDimitry Andric } 4392*0b57cec5SDimitry Andric 4393*0b57cec5SDimitry Andric const FieldDecl *RecordDecl::findFirstNamedDataMember() const { 4394*0b57cec5SDimitry Andric for (const auto *I : fields()) { 4395*0b57cec5SDimitry Andric if (I->getIdentifier()) 4396*0b57cec5SDimitry Andric return I; 4397*0b57cec5SDimitry Andric 4398*0b57cec5SDimitry Andric if (const auto *RT = I->getType()->getAs<RecordType>()) 4399*0b57cec5SDimitry Andric if (const FieldDecl *NamedDataMember = 4400*0b57cec5SDimitry Andric RT->getDecl()->findFirstNamedDataMember()) 4401*0b57cec5SDimitry Andric return NamedDataMember; 4402*0b57cec5SDimitry Andric } 4403*0b57cec5SDimitry Andric 4404*0b57cec5SDimitry Andric // We didn't find a named data member. 4405*0b57cec5SDimitry Andric return nullptr; 4406*0b57cec5SDimitry Andric } 4407*0b57cec5SDimitry Andric 4408*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4409*0b57cec5SDimitry Andric // BlockDecl Implementation 4410*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4411*0b57cec5SDimitry Andric 4412*0b57cec5SDimitry Andric BlockDecl::BlockDecl(DeclContext *DC, SourceLocation CaretLoc) 4413*0b57cec5SDimitry Andric : Decl(Block, DC, CaretLoc), DeclContext(Block) { 4414*0b57cec5SDimitry Andric setIsVariadic(false); 4415*0b57cec5SDimitry Andric setCapturesCXXThis(false); 4416*0b57cec5SDimitry Andric setBlockMissingReturnType(true); 4417*0b57cec5SDimitry Andric setIsConversionFromLambda(false); 4418*0b57cec5SDimitry Andric setDoesNotEscape(false); 4419*0b57cec5SDimitry Andric setCanAvoidCopyToHeap(false); 4420*0b57cec5SDimitry Andric } 4421*0b57cec5SDimitry Andric 4422*0b57cec5SDimitry Andric void BlockDecl::setParams(ArrayRef<ParmVarDecl *> NewParamInfo) { 4423*0b57cec5SDimitry Andric assert(!ParamInfo && "Already has param info!"); 4424*0b57cec5SDimitry Andric 4425*0b57cec5SDimitry Andric // Zero params -> null pointer. 4426*0b57cec5SDimitry Andric if (!NewParamInfo.empty()) { 4427*0b57cec5SDimitry Andric NumParams = NewParamInfo.size(); 4428*0b57cec5SDimitry Andric ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()]; 4429*0b57cec5SDimitry Andric std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo); 4430*0b57cec5SDimitry Andric } 4431*0b57cec5SDimitry Andric } 4432*0b57cec5SDimitry Andric 4433*0b57cec5SDimitry Andric void BlockDecl::setCaptures(ASTContext &Context, ArrayRef<Capture> Captures, 4434*0b57cec5SDimitry Andric bool CapturesCXXThis) { 4435*0b57cec5SDimitry Andric this->setCapturesCXXThis(CapturesCXXThis); 4436*0b57cec5SDimitry Andric this->NumCaptures = Captures.size(); 4437*0b57cec5SDimitry Andric 4438*0b57cec5SDimitry Andric if (Captures.empty()) { 4439*0b57cec5SDimitry Andric this->Captures = nullptr; 4440*0b57cec5SDimitry Andric return; 4441*0b57cec5SDimitry Andric } 4442*0b57cec5SDimitry Andric 4443*0b57cec5SDimitry Andric this->Captures = Captures.copy(Context).data(); 4444*0b57cec5SDimitry Andric } 4445*0b57cec5SDimitry Andric 4446*0b57cec5SDimitry Andric bool BlockDecl::capturesVariable(const VarDecl *variable) const { 4447*0b57cec5SDimitry Andric for (const auto &I : captures()) 4448*0b57cec5SDimitry Andric // Only auto vars can be captured, so no redeclaration worries. 4449*0b57cec5SDimitry Andric if (I.getVariable() == variable) 4450*0b57cec5SDimitry Andric return true; 4451*0b57cec5SDimitry Andric 4452*0b57cec5SDimitry Andric return false; 4453*0b57cec5SDimitry Andric } 4454*0b57cec5SDimitry Andric 4455*0b57cec5SDimitry Andric SourceRange BlockDecl::getSourceRange() const { 4456*0b57cec5SDimitry Andric return SourceRange(getLocation(), Body ? Body->getEndLoc() : getLocation()); 4457*0b57cec5SDimitry Andric } 4458*0b57cec5SDimitry Andric 4459*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4460*0b57cec5SDimitry Andric // Other Decl Allocation/Deallocation Method Implementations 4461*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4462*0b57cec5SDimitry Andric 4463*0b57cec5SDimitry Andric void TranslationUnitDecl::anchor() {} 4464*0b57cec5SDimitry Andric 4465*0b57cec5SDimitry Andric TranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 4466*0b57cec5SDimitry Andric return new (C, (DeclContext *)nullptr) TranslationUnitDecl(C); 4467*0b57cec5SDimitry Andric } 4468*0b57cec5SDimitry Andric 4469*0b57cec5SDimitry Andric void PragmaCommentDecl::anchor() {} 4470*0b57cec5SDimitry Andric 4471*0b57cec5SDimitry Andric PragmaCommentDecl *PragmaCommentDecl::Create(const ASTContext &C, 4472*0b57cec5SDimitry Andric TranslationUnitDecl *DC, 4473*0b57cec5SDimitry Andric SourceLocation CommentLoc, 4474*0b57cec5SDimitry Andric PragmaMSCommentKind CommentKind, 4475*0b57cec5SDimitry Andric StringRef Arg) { 4476*0b57cec5SDimitry Andric PragmaCommentDecl *PCD = 4477*0b57cec5SDimitry Andric new (C, DC, additionalSizeToAlloc<char>(Arg.size() + 1)) 4478*0b57cec5SDimitry Andric PragmaCommentDecl(DC, CommentLoc, CommentKind); 4479*0b57cec5SDimitry Andric memcpy(PCD->getTrailingObjects<char>(), Arg.data(), Arg.size()); 4480*0b57cec5SDimitry Andric PCD->getTrailingObjects<char>()[Arg.size()] = '\0'; 4481*0b57cec5SDimitry Andric return PCD; 4482*0b57cec5SDimitry Andric } 4483*0b57cec5SDimitry Andric 4484*0b57cec5SDimitry Andric PragmaCommentDecl *PragmaCommentDecl::CreateDeserialized(ASTContext &C, 4485*0b57cec5SDimitry Andric unsigned ID, 4486*0b57cec5SDimitry Andric unsigned ArgSize) { 4487*0b57cec5SDimitry Andric return new (C, ID, additionalSizeToAlloc<char>(ArgSize + 1)) 4488*0b57cec5SDimitry Andric PragmaCommentDecl(nullptr, SourceLocation(), PCK_Unknown); 4489*0b57cec5SDimitry Andric } 4490*0b57cec5SDimitry Andric 4491*0b57cec5SDimitry Andric void PragmaDetectMismatchDecl::anchor() {} 4492*0b57cec5SDimitry Andric 4493*0b57cec5SDimitry Andric PragmaDetectMismatchDecl * 4494*0b57cec5SDimitry Andric PragmaDetectMismatchDecl::Create(const ASTContext &C, TranslationUnitDecl *DC, 4495*0b57cec5SDimitry Andric SourceLocation Loc, StringRef Name, 4496*0b57cec5SDimitry Andric StringRef Value) { 4497*0b57cec5SDimitry Andric size_t ValueStart = Name.size() + 1; 4498*0b57cec5SDimitry Andric PragmaDetectMismatchDecl *PDMD = 4499*0b57cec5SDimitry Andric new (C, DC, additionalSizeToAlloc<char>(ValueStart + Value.size() + 1)) 4500*0b57cec5SDimitry Andric PragmaDetectMismatchDecl(DC, Loc, ValueStart); 4501*0b57cec5SDimitry Andric memcpy(PDMD->getTrailingObjects<char>(), Name.data(), Name.size()); 4502*0b57cec5SDimitry Andric PDMD->getTrailingObjects<char>()[Name.size()] = '\0'; 4503*0b57cec5SDimitry Andric memcpy(PDMD->getTrailingObjects<char>() + ValueStart, Value.data(), 4504*0b57cec5SDimitry Andric Value.size()); 4505*0b57cec5SDimitry Andric PDMD->getTrailingObjects<char>()[ValueStart + Value.size()] = '\0'; 4506*0b57cec5SDimitry Andric return PDMD; 4507*0b57cec5SDimitry Andric } 4508*0b57cec5SDimitry Andric 4509*0b57cec5SDimitry Andric PragmaDetectMismatchDecl * 4510*0b57cec5SDimitry Andric PragmaDetectMismatchDecl::CreateDeserialized(ASTContext &C, unsigned ID, 4511*0b57cec5SDimitry Andric unsigned NameValueSize) { 4512*0b57cec5SDimitry Andric return new (C, ID, additionalSizeToAlloc<char>(NameValueSize + 1)) 4513*0b57cec5SDimitry Andric PragmaDetectMismatchDecl(nullptr, SourceLocation(), 0); 4514*0b57cec5SDimitry Andric } 4515*0b57cec5SDimitry Andric 4516*0b57cec5SDimitry Andric void ExternCContextDecl::anchor() {} 4517*0b57cec5SDimitry Andric 4518*0b57cec5SDimitry Andric ExternCContextDecl *ExternCContextDecl::Create(const ASTContext &C, 4519*0b57cec5SDimitry Andric TranslationUnitDecl *DC) { 4520*0b57cec5SDimitry Andric return new (C, DC) ExternCContextDecl(DC); 4521*0b57cec5SDimitry Andric } 4522*0b57cec5SDimitry Andric 4523*0b57cec5SDimitry Andric void LabelDecl::anchor() {} 4524*0b57cec5SDimitry Andric 4525*0b57cec5SDimitry Andric LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC, 4526*0b57cec5SDimitry Andric SourceLocation IdentL, IdentifierInfo *II) { 4527*0b57cec5SDimitry Andric return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, IdentL); 4528*0b57cec5SDimitry Andric } 4529*0b57cec5SDimitry Andric 4530*0b57cec5SDimitry Andric LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC, 4531*0b57cec5SDimitry Andric SourceLocation IdentL, IdentifierInfo *II, 4532*0b57cec5SDimitry Andric SourceLocation GnuLabelL) { 4533*0b57cec5SDimitry Andric assert(GnuLabelL != IdentL && "Use this only for GNU local labels"); 4534*0b57cec5SDimitry Andric return new (C, DC) LabelDecl(DC, IdentL, II, nullptr, GnuLabelL); 4535*0b57cec5SDimitry Andric } 4536*0b57cec5SDimitry Andric 4537*0b57cec5SDimitry Andric LabelDecl *LabelDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4538*0b57cec5SDimitry Andric return new (C, ID) LabelDecl(nullptr, SourceLocation(), nullptr, nullptr, 4539*0b57cec5SDimitry Andric SourceLocation()); 4540*0b57cec5SDimitry Andric } 4541*0b57cec5SDimitry Andric 4542*0b57cec5SDimitry Andric void LabelDecl::setMSAsmLabel(StringRef Name) { 4543*0b57cec5SDimitry Andric char *Buffer = new (getASTContext(), 1) char[Name.size() + 1]; 4544*0b57cec5SDimitry Andric memcpy(Buffer, Name.data(), Name.size()); 4545*0b57cec5SDimitry Andric Buffer[Name.size()] = '\0'; 4546*0b57cec5SDimitry Andric MSAsmName = Buffer; 4547*0b57cec5SDimitry Andric } 4548*0b57cec5SDimitry Andric 4549*0b57cec5SDimitry Andric void ValueDecl::anchor() {} 4550*0b57cec5SDimitry Andric 4551*0b57cec5SDimitry Andric bool ValueDecl::isWeak() const { 4552*0b57cec5SDimitry Andric for (const auto *I : attrs()) 4553*0b57cec5SDimitry Andric if (isa<WeakAttr>(I) || isa<WeakRefAttr>(I)) 4554*0b57cec5SDimitry Andric return true; 4555*0b57cec5SDimitry Andric 4556*0b57cec5SDimitry Andric return isWeakImported(); 4557*0b57cec5SDimitry Andric } 4558*0b57cec5SDimitry Andric 4559*0b57cec5SDimitry Andric void ImplicitParamDecl::anchor() {} 4560*0b57cec5SDimitry Andric 4561*0b57cec5SDimitry Andric ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 4562*0b57cec5SDimitry Andric SourceLocation IdLoc, 4563*0b57cec5SDimitry Andric IdentifierInfo *Id, QualType Type, 4564*0b57cec5SDimitry Andric ImplicitParamKind ParamKind) { 4565*0b57cec5SDimitry Andric return new (C, DC) ImplicitParamDecl(C, DC, IdLoc, Id, Type, ParamKind); 4566*0b57cec5SDimitry Andric } 4567*0b57cec5SDimitry Andric 4568*0b57cec5SDimitry Andric ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, QualType Type, 4569*0b57cec5SDimitry Andric ImplicitParamKind ParamKind) { 4570*0b57cec5SDimitry Andric return new (C, nullptr) ImplicitParamDecl(C, Type, ParamKind); 4571*0b57cec5SDimitry Andric } 4572*0b57cec5SDimitry Andric 4573*0b57cec5SDimitry Andric ImplicitParamDecl *ImplicitParamDecl::CreateDeserialized(ASTContext &C, 4574*0b57cec5SDimitry Andric unsigned ID) { 4575*0b57cec5SDimitry Andric return new (C, ID) ImplicitParamDecl(C, QualType(), ImplicitParamKind::Other); 4576*0b57cec5SDimitry Andric } 4577*0b57cec5SDimitry Andric 4578*0b57cec5SDimitry Andric FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 4579*0b57cec5SDimitry Andric SourceLocation StartLoc, 4580*0b57cec5SDimitry Andric const DeclarationNameInfo &NameInfo, 4581*0b57cec5SDimitry Andric QualType T, TypeSourceInfo *TInfo, 4582*0b57cec5SDimitry Andric StorageClass SC, bool isInlineSpecified, 4583*0b57cec5SDimitry Andric bool hasWrittenPrototype, 4584*0b57cec5SDimitry Andric ConstexprSpecKind ConstexprKind) { 4585*0b57cec5SDimitry Andric FunctionDecl *New = 4586*0b57cec5SDimitry Andric new (C, DC) FunctionDecl(Function, C, DC, StartLoc, NameInfo, T, TInfo, 4587*0b57cec5SDimitry Andric SC, isInlineSpecified, ConstexprKind); 4588*0b57cec5SDimitry Andric New->setHasWrittenPrototype(hasWrittenPrototype); 4589*0b57cec5SDimitry Andric return New; 4590*0b57cec5SDimitry Andric } 4591*0b57cec5SDimitry Andric 4592*0b57cec5SDimitry Andric FunctionDecl *FunctionDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4593*0b57cec5SDimitry Andric return new (C, ID) FunctionDecl(Function, C, nullptr, SourceLocation(), 4594*0b57cec5SDimitry Andric DeclarationNameInfo(), QualType(), nullptr, 4595*0b57cec5SDimitry Andric SC_None, false, CSK_unspecified); 4596*0b57cec5SDimitry Andric } 4597*0b57cec5SDimitry Andric 4598*0b57cec5SDimitry Andric BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 4599*0b57cec5SDimitry Andric return new (C, DC) BlockDecl(DC, L); 4600*0b57cec5SDimitry Andric } 4601*0b57cec5SDimitry Andric 4602*0b57cec5SDimitry Andric BlockDecl *BlockDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4603*0b57cec5SDimitry Andric return new (C, ID) BlockDecl(nullptr, SourceLocation()); 4604*0b57cec5SDimitry Andric } 4605*0b57cec5SDimitry Andric 4606*0b57cec5SDimitry Andric CapturedDecl::CapturedDecl(DeclContext *DC, unsigned NumParams) 4607*0b57cec5SDimitry Andric : Decl(Captured, DC, SourceLocation()), DeclContext(Captured), 4608*0b57cec5SDimitry Andric NumParams(NumParams), ContextParam(0), BodyAndNothrow(nullptr, false) {} 4609*0b57cec5SDimitry Andric 4610*0b57cec5SDimitry Andric CapturedDecl *CapturedDecl::Create(ASTContext &C, DeclContext *DC, 4611*0b57cec5SDimitry Andric unsigned NumParams) { 4612*0b57cec5SDimitry Andric return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams)) 4613*0b57cec5SDimitry Andric CapturedDecl(DC, NumParams); 4614*0b57cec5SDimitry Andric } 4615*0b57cec5SDimitry Andric 4616*0b57cec5SDimitry Andric CapturedDecl *CapturedDecl::CreateDeserialized(ASTContext &C, unsigned ID, 4617*0b57cec5SDimitry Andric unsigned NumParams) { 4618*0b57cec5SDimitry Andric return new (C, ID, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams)) 4619*0b57cec5SDimitry Andric CapturedDecl(nullptr, NumParams); 4620*0b57cec5SDimitry Andric } 4621*0b57cec5SDimitry Andric 4622*0b57cec5SDimitry Andric Stmt *CapturedDecl::getBody() const { return BodyAndNothrow.getPointer(); } 4623*0b57cec5SDimitry Andric void CapturedDecl::setBody(Stmt *B) { BodyAndNothrow.setPointer(B); } 4624*0b57cec5SDimitry Andric 4625*0b57cec5SDimitry Andric bool CapturedDecl::isNothrow() const { return BodyAndNothrow.getInt(); } 4626*0b57cec5SDimitry Andric void CapturedDecl::setNothrow(bool Nothrow) { BodyAndNothrow.setInt(Nothrow); } 4627*0b57cec5SDimitry Andric 4628*0b57cec5SDimitry Andric EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 4629*0b57cec5SDimitry Andric SourceLocation L, 4630*0b57cec5SDimitry Andric IdentifierInfo *Id, QualType T, 4631*0b57cec5SDimitry Andric Expr *E, const llvm::APSInt &V) { 4632*0b57cec5SDimitry Andric return new (C, CD) EnumConstantDecl(CD, L, Id, T, E, V); 4633*0b57cec5SDimitry Andric } 4634*0b57cec5SDimitry Andric 4635*0b57cec5SDimitry Andric EnumConstantDecl * 4636*0b57cec5SDimitry Andric EnumConstantDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4637*0b57cec5SDimitry Andric return new (C, ID) EnumConstantDecl(nullptr, SourceLocation(), nullptr, 4638*0b57cec5SDimitry Andric QualType(), nullptr, llvm::APSInt()); 4639*0b57cec5SDimitry Andric } 4640*0b57cec5SDimitry Andric 4641*0b57cec5SDimitry Andric void IndirectFieldDecl::anchor() {} 4642*0b57cec5SDimitry Andric 4643*0b57cec5SDimitry Andric IndirectFieldDecl::IndirectFieldDecl(ASTContext &C, DeclContext *DC, 4644*0b57cec5SDimitry Andric SourceLocation L, DeclarationName N, 4645*0b57cec5SDimitry Andric QualType T, 4646*0b57cec5SDimitry Andric MutableArrayRef<NamedDecl *> CH) 4647*0b57cec5SDimitry Andric : ValueDecl(IndirectField, DC, L, N, T), Chaining(CH.data()), 4648*0b57cec5SDimitry Andric ChainingSize(CH.size()) { 4649*0b57cec5SDimitry Andric // In C++, indirect field declarations conflict with tag declarations in the 4650*0b57cec5SDimitry Andric // same scope, so add them to IDNS_Tag so that tag redeclaration finds them. 4651*0b57cec5SDimitry Andric if (C.getLangOpts().CPlusPlus) 4652*0b57cec5SDimitry Andric IdentifierNamespace |= IDNS_Tag; 4653*0b57cec5SDimitry Andric } 4654*0b57cec5SDimitry Andric 4655*0b57cec5SDimitry Andric IndirectFieldDecl * 4656*0b57cec5SDimitry Andric IndirectFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 4657*0b57cec5SDimitry Andric IdentifierInfo *Id, QualType T, 4658*0b57cec5SDimitry Andric llvm::MutableArrayRef<NamedDecl *> CH) { 4659*0b57cec5SDimitry Andric return new (C, DC) IndirectFieldDecl(C, DC, L, Id, T, CH); 4660*0b57cec5SDimitry Andric } 4661*0b57cec5SDimitry Andric 4662*0b57cec5SDimitry Andric IndirectFieldDecl *IndirectFieldDecl::CreateDeserialized(ASTContext &C, 4663*0b57cec5SDimitry Andric unsigned ID) { 4664*0b57cec5SDimitry Andric return new (C, ID) IndirectFieldDecl(C, nullptr, SourceLocation(), 4665*0b57cec5SDimitry Andric DeclarationName(), QualType(), None); 4666*0b57cec5SDimitry Andric } 4667*0b57cec5SDimitry Andric 4668*0b57cec5SDimitry Andric SourceRange EnumConstantDecl::getSourceRange() const { 4669*0b57cec5SDimitry Andric SourceLocation End = getLocation(); 4670*0b57cec5SDimitry Andric if (Init) 4671*0b57cec5SDimitry Andric End = Init->getEndLoc(); 4672*0b57cec5SDimitry Andric return SourceRange(getLocation(), End); 4673*0b57cec5SDimitry Andric } 4674*0b57cec5SDimitry Andric 4675*0b57cec5SDimitry Andric void TypeDecl::anchor() {} 4676*0b57cec5SDimitry Andric 4677*0b57cec5SDimitry Andric TypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 4678*0b57cec5SDimitry Andric SourceLocation StartLoc, SourceLocation IdLoc, 4679*0b57cec5SDimitry Andric IdentifierInfo *Id, TypeSourceInfo *TInfo) { 4680*0b57cec5SDimitry Andric return new (C, DC) TypedefDecl(C, DC, StartLoc, IdLoc, Id, TInfo); 4681*0b57cec5SDimitry Andric } 4682*0b57cec5SDimitry Andric 4683*0b57cec5SDimitry Andric void TypedefNameDecl::anchor() {} 4684*0b57cec5SDimitry Andric 4685*0b57cec5SDimitry Andric TagDecl *TypedefNameDecl::getAnonDeclWithTypedefName(bool AnyRedecl) const { 4686*0b57cec5SDimitry Andric if (auto *TT = getTypeSourceInfo()->getType()->getAs<TagType>()) { 4687*0b57cec5SDimitry Andric auto *OwningTypedef = TT->getDecl()->getTypedefNameForAnonDecl(); 4688*0b57cec5SDimitry Andric auto *ThisTypedef = this; 4689*0b57cec5SDimitry Andric if (AnyRedecl && OwningTypedef) { 4690*0b57cec5SDimitry Andric OwningTypedef = OwningTypedef->getCanonicalDecl(); 4691*0b57cec5SDimitry Andric ThisTypedef = ThisTypedef->getCanonicalDecl(); 4692*0b57cec5SDimitry Andric } 4693*0b57cec5SDimitry Andric if (OwningTypedef == ThisTypedef) 4694*0b57cec5SDimitry Andric return TT->getDecl(); 4695*0b57cec5SDimitry Andric } 4696*0b57cec5SDimitry Andric 4697*0b57cec5SDimitry Andric return nullptr; 4698*0b57cec5SDimitry Andric } 4699*0b57cec5SDimitry Andric 4700*0b57cec5SDimitry Andric bool TypedefNameDecl::isTransparentTagSlow() const { 4701*0b57cec5SDimitry Andric auto determineIsTransparent = [&]() { 4702*0b57cec5SDimitry Andric if (auto *TT = getUnderlyingType()->getAs<TagType>()) { 4703*0b57cec5SDimitry Andric if (auto *TD = TT->getDecl()) { 4704*0b57cec5SDimitry Andric if (TD->getName() != getName()) 4705*0b57cec5SDimitry Andric return false; 4706*0b57cec5SDimitry Andric SourceLocation TTLoc = getLocation(); 4707*0b57cec5SDimitry Andric SourceLocation TDLoc = TD->getLocation(); 4708*0b57cec5SDimitry Andric if (!TTLoc.isMacroID() || !TDLoc.isMacroID()) 4709*0b57cec5SDimitry Andric return false; 4710*0b57cec5SDimitry Andric SourceManager &SM = getASTContext().getSourceManager(); 4711*0b57cec5SDimitry Andric return SM.getSpellingLoc(TTLoc) == SM.getSpellingLoc(TDLoc); 4712*0b57cec5SDimitry Andric } 4713*0b57cec5SDimitry Andric } 4714*0b57cec5SDimitry Andric return false; 4715*0b57cec5SDimitry Andric }; 4716*0b57cec5SDimitry Andric 4717*0b57cec5SDimitry Andric bool isTransparent = determineIsTransparent(); 4718*0b57cec5SDimitry Andric MaybeModedTInfo.setInt((isTransparent << 1) | 1); 4719*0b57cec5SDimitry Andric return isTransparent; 4720*0b57cec5SDimitry Andric } 4721*0b57cec5SDimitry Andric 4722*0b57cec5SDimitry Andric TypedefDecl *TypedefDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4723*0b57cec5SDimitry Andric return new (C, ID) TypedefDecl(C, nullptr, SourceLocation(), SourceLocation(), 4724*0b57cec5SDimitry Andric nullptr, nullptr); 4725*0b57cec5SDimitry Andric } 4726*0b57cec5SDimitry Andric 4727*0b57cec5SDimitry Andric TypeAliasDecl *TypeAliasDecl::Create(ASTContext &C, DeclContext *DC, 4728*0b57cec5SDimitry Andric SourceLocation StartLoc, 4729*0b57cec5SDimitry Andric SourceLocation IdLoc, IdentifierInfo *Id, 4730*0b57cec5SDimitry Andric TypeSourceInfo *TInfo) { 4731*0b57cec5SDimitry Andric return new (C, DC) TypeAliasDecl(C, DC, StartLoc, IdLoc, Id, TInfo); 4732*0b57cec5SDimitry Andric } 4733*0b57cec5SDimitry Andric 4734*0b57cec5SDimitry Andric TypeAliasDecl *TypeAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4735*0b57cec5SDimitry Andric return new (C, ID) TypeAliasDecl(C, nullptr, SourceLocation(), 4736*0b57cec5SDimitry Andric SourceLocation(), nullptr, nullptr); 4737*0b57cec5SDimitry Andric } 4738*0b57cec5SDimitry Andric 4739*0b57cec5SDimitry Andric SourceRange TypedefDecl::getSourceRange() const { 4740*0b57cec5SDimitry Andric SourceLocation RangeEnd = getLocation(); 4741*0b57cec5SDimitry Andric if (TypeSourceInfo *TInfo = getTypeSourceInfo()) { 4742*0b57cec5SDimitry Andric if (typeIsPostfix(TInfo->getType())) 4743*0b57cec5SDimitry Andric RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); 4744*0b57cec5SDimitry Andric } 4745*0b57cec5SDimitry Andric return SourceRange(getBeginLoc(), RangeEnd); 4746*0b57cec5SDimitry Andric } 4747*0b57cec5SDimitry Andric 4748*0b57cec5SDimitry Andric SourceRange TypeAliasDecl::getSourceRange() const { 4749*0b57cec5SDimitry Andric SourceLocation RangeEnd = getBeginLoc(); 4750*0b57cec5SDimitry Andric if (TypeSourceInfo *TInfo = getTypeSourceInfo()) 4751*0b57cec5SDimitry Andric RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd(); 4752*0b57cec5SDimitry Andric return SourceRange(getBeginLoc(), RangeEnd); 4753*0b57cec5SDimitry Andric } 4754*0b57cec5SDimitry Andric 4755*0b57cec5SDimitry Andric void FileScopeAsmDecl::anchor() {} 4756*0b57cec5SDimitry Andric 4757*0b57cec5SDimitry Andric FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, 4758*0b57cec5SDimitry Andric StringLiteral *Str, 4759*0b57cec5SDimitry Andric SourceLocation AsmLoc, 4760*0b57cec5SDimitry Andric SourceLocation RParenLoc) { 4761*0b57cec5SDimitry Andric return new (C, DC) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc); 4762*0b57cec5SDimitry Andric } 4763*0b57cec5SDimitry Andric 4764*0b57cec5SDimitry Andric FileScopeAsmDecl *FileScopeAsmDecl::CreateDeserialized(ASTContext &C, 4765*0b57cec5SDimitry Andric unsigned ID) { 4766*0b57cec5SDimitry Andric return new (C, ID) FileScopeAsmDecl(nullptr, nullptr, SourceLocation(), 4767*0b57cec5SDimitry Andric SourceLocation()); 4768*0b57cec5SDimitry Andric } 4769*0b57cec5SDimitry Andric 4770*0b57cec5SDimitry Andric void EmptyDecl::anchor() {} 4771*0b57cec5SDimitry Andric 4772*0b57cec5SDimitry Andric EmptyDecl *EmptyDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 4773*0b57cec5SDimitry Andric return new (C, DC) EmptyDecl(DC, L); 4774*0b57cec5SDimitry Andric } 4775*0b57cec5SDimitry Andric 4776*0b57cec5SDimitry Andric EmptyDecl *EmptyDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4777*0b57cec5SDimitry Andric return new (C, ID) EmptyDecl(nullptr, SourceLocation()); 4778*0b57cec5SDimitry Andric } 4779*0b57cec5SDimitry Andric 4780*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4781*0b57cec5SDimitry Andric // ImportDecl Implementation 4782*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4783*0b57cec5SDimitry Andric 4784*0b57cec5SDimitry Andric /// Retrieve the number of module identifiers needed to name the given 4785*0b57cec5SDimitry Andric /// module. 4786*0b57cec5SDimitry Andric static unsigned getNumModuleIdentifiers(Module *Mod) { 4787*0b57cec5SDimitry Andric unsigned Result = 1; 4788*0b57cec5SDimitry Andric while (Mod->Parent) { 4789*0b57cec5SDimitry Andric Mod = Mod->Parent; 4790*0b57cec5SDimitry Andric ++Result; 4791*0b57cec5SDimitry Andric } 4792*0b57cec5SDimitry Andric return Result; 4793*0b57cec5SDimitry Andric } 4794*0b57cec5SDimitry Andric 4795*0b57cec5SDimitry Andric ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc, 4796*0b57cec5SDimitry Andric Module *Imported, 4797*0b57cec5SDimitry Andric ArrayRef<SourceLocation> IdentifierLocs) 4798*0b57cec5SDimitry Andric : Decl(Import, DC, StartLoc), ImportedAndComplete(Imported, true) { 4799*0b57cec5SDimitry Andric assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size()); 4800*0b57cec5SDimitry Andric auto *StoredLocs = getTrailingObjects<SourceLocation>(); 4801*0b57cec5SDimitry Andric std::uninitialized_copy(IdentifierLocs.begin(), IdentifierLocs.end(), 4802*0b57cec5SDimitry Andric StoredLocs); 4803*0b57cec5SDimitry Andric } 4804*0b57cec5SDimitry Andric 4805*0b57cec5SDimitry Andric ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc, 4806*0b57cec5SDimitry Andric Module *Imported, SourceLocation EndLoc) 4807*0b57cec5SDimitry Andric : Decl(Import, DC, StartLoc), ImportedAndComplete(Imported, false) { 4808*0b57cec5SDimitry Andric *getTrailingObjects<SourceLocation>() = EndLoc; 4809*0b57cec5SDimitry Andric } 4810*0b57cec5SDimitry Andric 4811*0b57cec5SDimitry Andric ImportDecl *ImportDecl::Create(ASTContext &C, DeclContext *DC, 4812*0b57cec5SDimitry Andric SourceLocation StartLoc, Module *Imported, 4813*0b57cec5SDimitry Andric ArrayRef<SourceLocation> IdentifierLocs) { 4814*0b57cec5SDimitry Andric return new (C, DC, 4815*0b57cec5SDimitry Andric additionalSizeToAlloc<SourceLocation>(IdentifierLocs.size())) 4816*0b57cec5SDimitry Andric ImportDecl(DC, StartLoc, Imported, IdentifierLocs); 4817*0b57cec5SDimitry Andric } 4818*0b57cec5SDimitry Andric 4819*0b57cec5SDimitry Andric ImportDecl *ImportDecl::CreateImplicit(ASTContext &C, DeclContext *DC, 4820*0b57cec5SDimitry Andric SourceLocation StartLoc, 4821*0b57cec5SDimitry Andric Module *Imported, 4822*0b57cec5SDimitry Andric SourceLocation EndLoc) { 4823*0b57cec5SDimitry Andric ImportDecl *Import = new (C, DC, additionalSizeToAlloc<SourceLocation>(1)) 4824*0b57cec5SDimitry Andric ImportDecl(DC, StartLoc, Imported, EndLoc); 4825*0b57cec5SDimitry Andric Import->setImplicit(); 4826*0b57cec5SDimitry Andric return Import; 4827*0b57cec5SDimitry Andric } 4828*0b57cec5SDimitry Andric 4829*0b57cec5SDimitry Andric ImportDecl *ImportDecl::CreateDeserialized(ASTContext &C, unsigned ID, 4830*0b57cec5SDimitry Andric unsigned NumLocations) { 4831*0b57cec5SDimitry Andric return new (C, ID, additionalSizeToAlloc<SourceLocation>(NumLocations)) 4832*0b57cec5SDimitry Andric ImportDecl(EmptyShell()); 4833*0b57cec5SDimitry Andric } 4834*0b57cec5SDimitry Andric 4835*0b57cec5SDimitry Andric ArrayRef<SourceLocation> ImportDecl::getIdentifierLocs() const { 4836*0b57cec5SDimitry Andric if (!ImportedAndComplete.getInt()) 4837*0b57cec5SDimitry Andric return None; 4838*0b57cec5SDimitry Andric 4839*0b57cec5SDimitry Andric const auto *StoredLocs = getTrailingObjects<SourceLocation>(); 4840*0b57cec5SDimitry Andric return llvm::makeArrayRef(StoredLocs, 4841*0b57cec5SDimitry Andric getNumModuleIdentifiers(getImportedModule())); 4842*0b57cec5SDimitry Andric } 4843*0b57cec5SDimitry Andric 4844*0b57cec5SDimitry Andric SourceRange ImportDecl::getSourceRange() const { 4845*0b57cec5SDimitry Andric if (!ImportedAndComplete.getInt()) 4846*0b57cec5SDimitry Andric return SourceRange(getLocation(), *getTrailingObjects<SourceLocation>()); 4847*0b57cec5SDimitry Andric 4848*0b57cec5SDimitry Andric return SourceRange(getLocation(), getIdentifierLocs().back()); 4849*0b57cec5SDimitry Andric } 4850*0b57cec5SDimitry Andric 4851*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4852*0b57cec5SDimitry Andric // ExportDecl Implementation 4853*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4854*0b57cec5SDimitry Andric 4855*0b57cec5SDimitry Andric void ExportDecl::anchor() {} 4856*0b57cec5SDimitry Andric 4857*0b57cec5SDimitry Andric ExportDecl *ExportDecl::Create(ASTContext &C, DeclContext *DC, 4858*0b57cec5SDimitry Andric SourceLocation ExportLoc) { 4859*0b57cec5SDimitry Andric return new (C, DC) ExportDecl(DC, ExportLoc); 4860*0b57cec5SDimitry Andric } 4861*0b57cec5SDimitry Andric 4862*0b57cec5SDimitry Andric ExportDecl *ExportDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 4863*0b57cec5SDimitry Andric return new (C, ID) ExportDecl(nullptr, SourceLocation()); 4864*0b57cec5SDimitry Andric } 4865