diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index ac8e253ac06ea..3b074d849e8a9 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -257,8 +257,8 @@ static bool isPublic(const clang::AccessSpecifier AS, const clang::Linkage Link) { if (AS == clang::AccessSpecifier::AS_private) return false; - else if ((Link == clang::Linkage::ModuleLinkage) || - (Link == clang::Linkage::ExternalLinkage)) + else if ((Link == clang::Linkage::Module) || + (Link == clang::Linkage::External)) return true; return false; // otherwise, linkage is some form of internal linkage } diff --git a/clang-tools-extra/clangd/Quality.cpp b/clang-tools-extra/clangd/Quality.cpp index 8840f805f0e87..7371d95fbf275 100644 --- a/clang-tools-extra/clangd/Quality.cpp +++ b/clang-tools-extra/clangd/Quality.cpp @@ -274,7 +274,8 @@ computeScope(const NamedDecl *D) { return SymbolRelevanceSignals::ClassScope; // ExternalLinkage threshold could be tweaked, e.g. module-visible as global. // Avoid caching linkage if it may change after enclosing code completion. - if (hasUnstableLinkage(D) || D->getLinkageInternal() < ExternalLinkage) + if (hasUnstableLinkage(D) || llvm::to_underlying(D->getLinkageInternal()) < + llvm::to_underlying(Linkage::External)) return SymbolRelevanceSignals::FileScope; return SymbolRelevanceSignals::GlobalScope; } diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 7649e37e1f966..49e479abf4562 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -617,7 +617,8 @@ std::optional scopeModifier(const NamedDecl *D) { if (DC->isTranslationUnit() && D->isTemplateParameter()) return std::nullopt; // ExternalLinkage threshold could be tweaked, e.g. module-visible as global. - if (D->getLinkageInternal() < ExternalLinkage) + if (llvm::to_underlying(D->getLinkageInternal()) < + llvm::to_underlying(Linkage::External)) return HighlightingModifier::FileScope; return HighlightingModifier::GlobalScope; } diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index df1d6e8a3b5af..f784fa73af5ba 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -49,7 +49,7 @@ class ExternalSourceSymbolAttr; class FunctionDecl; class FunctionType; class IdentifierInfo; -enum Linkage : unsigned char; +enum class Linkage : unsigned char; class LinkageSpecDecl; class Module; class NamedDecl; @@ -335,7 +335,6 @@ class alignas(8) Decl { unsigned IdentifierNamespace : 14; /// If 0, we have not computed the linkage of this declaration. - /// Otherwise, it is the linkage + 1. mutable unsigned CacheValidAndLinkage : 3; /// Allocate memory for a deserialized declaration. @@ -386,7 +385,7 @@ class alignas(8) Decl { Implicit(false), Used(false), Referenced(false), TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0), IdentifierNamespace(getIdentifierNamespaceForKind(DK)), - CacheValidAndLinkage(0) { + CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) { if (StatisticsEnabled) add(DK); } @@ -395,7 +394,7 @@ class alignas(8) Decl { Used(false), Referenced(false), TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0), IdentifierNamespace(getIdentifierNamespaceForKind(DK)), - CacheValidAndLinkage(0) { + CacheValidAndLinkage(llvm::to_underlying(Linkage::Invalid)) { if (StatisticsEnabled) add(DK); } @@ -405,11 +404,11 @@ class alignas(8) Decl { void updateOutOfDate(IdentifierInfo &II) const; Linkage getCachedLinkage() const { - return Linkage(CacheValidAndLinkage - 1); + return static_cast(CacheValidAndLinkage); } void setCachedLinkage(Linkage L) const { - CacheValidAndLinkage = L + 1; + CacheValidAndLinkage = llvm::to_underlying(L); } bool hasCachedLinkage() const { diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index bbcd1a9db61d7..f64cd5e0ef649 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -2043,7 +2043,7 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase { TypeBits.Dependence = static_cast(Dependence); TypeBits.CacheValid = false; TypeBits.CachedLocalOrUnnamed = false; - TypeBits.CachedLinkage = NoLinkage; + TypeBits.CachedLinkage = llvm::to_underlying(Linkage::Invalid); TypeBits.FromAST = false; } diff --git a/clang/include/clang/Basic/Linkage.h b/clang/include/clang/Basic/Linkage.h index 0b7b61954a075..9cf36e522947f 100644 --- a/clang/include/clang/Basic/Linkage.h +++ b/clang/include/clang/Basic/Linkage.h @@ -14,21 +14,25 @@ #ifndef LLVM_CLANG_BASIC_LINKAGE_H #define LLVM_CLANG_BASIC_LINKAGE_H +#include "llvm/Support/ErrorHandling.h" #include namespace clang { /// Describes the different kinds of linkage /// (C++ [basic.link], C99 6.2.2) that an entity may have. -enum Linkage : unsigned char { +enum class Linkage : unsigned char { + // Linkage hasn't been computed. + Invalid = 0, + /// No linkage, which means that the entity is unique and /// can only be referred to from within its scope. - NoLinkage = 0, + None, /// Internal linkage, which indicates that the entity can /// be referred to from within the translation unit (but not other /// translation units). - InternalLinkage, + Internal, /// External linkage within a unique namespace. /// @@ -37,21 +41,21 @@ enum Linkage : unsigned char { /// their names are unique to this translation unit, which is /// equivalent to having internal linkage from the code-generation /// point of view. - UniqueExternalLinkage, + UniqueExternal, /// No linkage according to the standard, but is visible from other /// translation units because of types defined in a inline function. - VisibleNoLinkage, + VisibleNone, /// Module linkage, which indicates that the entity can be referred /// to from other translation units within the same module, and indirectly /// from arbitrary other translation units through inline functions and /// templates in the module interface. - ModuleLinkage, + Module, /// External linkage, which indicates that the entity can /// be referred to from other translation units. - ExternalLinkage + External }; /// Describes the different kinds of language linkage @@ -84,22 +88,33 @@ inline bool isUniqueGVALinkage(GVALinkage L) { } inline bool isExternallyVisible(Linkage L) { - return L >= VisibleNoLinkage; + switch (L) { + case Linkage::Invalid: + llvm_unreachable("Linkage hasn't been computed!"); + case Linkage::None: + case Linkage::Internal: + case Linkage::UniqueExternal: + return false; + case Linkage::VisibleNone: + case Linkage::Module: + case Linkage::External: + return true; + } } inline Linkage getFormalLinkage(Linkage L) { switch (L) { - case UniqueExternalLinkage: - return ExternalLinkage; - case VisibleNoLinkage: - return NoLinkage; + case Linkage::UniqueExternal: + return Linkage::External; + case Linkage::VisibleNone: + return Linkage::None; default: return L; } } inline bool isExternalFormalLinkage(Linkage L) { - return getFormalLinkage(L) == ExternalLinkage; + return getFormalLinkage(L) == Linkage::External; } /// Compute the minimum linkage given two linkages. @@ -111,13 +126,13 @@ inline bool isExternalFormalLinkage(Linkage L) { /// special cases for when VisibleNoLinkage would lose the visible bit and /// become NoLinkage. inline Linkage minLinkage(Linkage L1, Linkage L2) { - if (L2 == VisibleNoLinkage) + if (L2 == Linkage::VisibleNone) std::swap(L1, L2); - if (L1 == VisibleNoLinkage) { - if (L2 == InternalLinkage) - return NoLinkage; - if (L2 == UniqueExternalLinkage) - return NoLinkage; + if (L1 == Linkage::VisibleNone) { + if (L2 == Linkage::Internal) + return Linkage::None; + if (L2 == Linkage::UniqueExternal) + return Linkage::None; } return L1 < L2 ? L1 : L2; } diff --git a/clang/include/clang/Basic/Visibility.h b/clang/include/clang/Basic/Visibility.h index 57d9754ae4a98..1e196300be421 100644 --- a/clang/include/clang/Basic/Visibility.h +++ b/clang/include/clang/Basic/Visibility.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_BASIC_VISIBILITY_H #include "clang/Basic/Linkage.h" +#include "llvm/ADT/STLForwardCompat.h" #include #include @@ -56,10 +57,11 @@ class LinkageInfo { void setVisibility(Visibility V, bool E) { visibility_ = V; explicit_ = E; } public: - LinkageInfo() : linkage_(ExternalLinkage), visibility_(DefaultVisibility), - explicit_(false) {} + LinkageInfo() + : linkage_(llvm::to_underlying(Linkage::External)), + visibility_(DefaultVisibility), explicit_(false) {} LinkageInfo(Linkage L, Visibility V, bool E) - : linkage_(L), visibility_(V), explicit_(E) { + : linkage_(llvm::to_underlying(L)), visibility_(V), explicit_(E) { assert(getLinkage() == L && getVisibility() == V && isVisibilityExplicit() == E && "Enum truncated!"); } @@ -68,23 +70,23 @@ class LinkageInfo { return LinkageInfo(); } static LinkageInfo internal() { - return LinkageInfo(InternalLinkage, DefaultVisibility, false); + return LinkageInfo(Linkage::Internal, DefaultVisibility, false); } static LinkageInfo uniqueExternal() { - return LinkageInfo(UniqueExternalLinkage, DefaultVisibility, false); + return LinkageInfo(Linkage::UniqueExternal, DefaultVisibility, false); } static LinkageInfo none() { - return LinkageInfo(NoLinkage, DefaultVisibility, false); + return LinkageInfo(Linkage::None, DefaultVisibility, false); } static LinkageInfo visible_none() { - return LinkageInfo(VisibleNoLinkage, DefaultVisibility, false); + return LinkageInfo(Linkage::VisibleNone, DefaultVisibility, false); } - Linkage getLinkage() const { return (Linkage)linkage_; } + Linkage getLinkage() const { return static_cast(linkage_); } Visibility getVisibility() const { return (Visibility)visibility_; } bool isVisibilityExplicit() const { return explicit_; } - void setLinkage(Linkage L) { linkage_ = L; } + void setLinkage(Linkage L) { linkage_ = llvm::to_underlying(L); } void mergeLinkage(Linkage L) { setLinkage(minLinkage(getLinkage(), L)); @@ -96,10 +98,10 @@ class LinkageInfo { void mergeExternalVisibility(Linkage L) { Linkage ThisL = getLinkage(); if (!isExternallyVisible(L)) { - if (ThisL == VisibleNoLinkage) - ThisL = NoLinkage; - else if (ThisL == ExternalLinkage) - ThisL = UniqueExternalLinkage; + if (ThisL == Linkage::VisibleNone) + ThisL = Linkage::None; + else if (ThisL == Linkage::External) + ThisL = Linkage::UniqueExternal; } setLinkage(ThisL); } diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp index d08c2936b56dd..4eae308ef5b34 100644 --- a/clang/lib/AST/APValue.cpp +++ b/clang/lib/AST/APValue.cpp @@ -1115,7 +1115,7 @@ LinkageInfo LinkageComputer::getLVForValue(const APValue &V, auto MergeLV = [&](LinkageInfo MergeLV) { LV.merge(MergeLV); - return LV.getLinkage() == InternalLinkage; + return LV.getLinkage() == Linkage::Internal; }; auto Merge = [&](const APValue &V) { return MergeLV(getLVForValue(V, computation)); diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 6efc177d61c03..e8062b680fbc3 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1204,12 +1204,11 @@ Linkage NamedDecl::getFormalLinkage() const { // [basic.namespace.general]/p2 // A namespace is never attached to a named module and never has a name with // module linkage. - if (isInModulePurview(this) && - InternalLinkage == ExternalLinkage && + if (isInModulePurview(this) && InternalLinkage == Linkage::External && !isExportedFromModuleInterfaceUnit( cast(this->getCanonicalDecl())) && !isa(this)) - InternalLinkage = ModuleLinkage; + InternalLinkage = Linkage::Module; return clang::getFormalLinkage(InternalLinkage); } @@ -1337,7 +1336,7 @@ LinkageInfo LinkageComputer::getLVForClosure(const DeclContext *DC, // visible, then the lambda is too. We apply the same rules to blocks. if (!isExternallyVisible(OwnerLV.getLinkage())) return LinkageInfo::none(); - return LinkageInfo(VisibleNoLinkage, OwnerLV.getVisibility(), + return LinkageInfo(Linkage::VisibleNone, OwnerLV.getVisibility(), OwnerLV.isVisibilityExplicit()); } @@ -1382,7 +1381,7 @@ LinkageInfo LinkageComputer::getLVForLocalDecl(const NamedDecl *D, if (const VarDecl *Prev = Var->getPreviousDecl()) { LinkageInfo PrevLV = getLVForDecl(Prev, computation); - if (PrevLV.getLinkage()) + if (PrevLV.getLinkage() != Linkage::Invalid) LV.setLinkage(PrevLV.getLinkage()); LV.mergeVisibility(PrevLV); } @@ -1433,14 +1432,14 @@ LinkageInfo LinkageComputer::getLVForLocalDecl(const NamedDecl *D, computation.isValueVisibility() ? Context.getLangOpts().getValueVisibilityMode() : Context.getLangOpts().getTypeVisibilityMode(); - return LinkageInfo(VisibleNoLinkage, globalVisibility, + return LinkageInfo(Linkage::VisibleNone, globalVisibility, /*visibilityExplicit=*/false); } } } if (!isExternallyVisible(LV.getLinkage())) return LinkageInfo::none(); - return LinkageInfo(VisibleNoLinkage, LV.getVisibility(), + return LinkageInfo(Linkage::VisibleNone, LV.getVisibility(), LV.isVisibilityExplicit()); } @@ -1921,7 +1920,20 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD, bool IsKnownNewer) const { } bool NamedDecl::hasLinkage() const { - return getFormalLinkage() != NoLinkage; + switch (getFormalLinkage()) { + case Linkage::Invalid: + llvm_unreachable("Linkage hasn't been computed!"); + case Linkage::None: + return false; + case Linkage::Internal: + return true; + case Linkage::UniqueExternal: + case Linkage::VisibleNone: + llvm_unreachable("Non-formal linkage is not allowed here!"); + case Linkage::Module: + case Linkage::External: + return true; + } } NamedDecl *NamedDecl::getUnderlyingDeclImpl() { diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 261a56c4b666a..8530675ca2a1c 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -708,7 +708,7 @@ ItaniumMangleContextImpl::getEffectiveDeclContext(const Decl *D) { } bool ItaniumMangleContextImpl::isInternalLinkageDecl(const NamedDecl *ND) { - if (ND && ND->getFormalLinkage() == InternalLinkage && + if (ND && ND->getFormalLinkage() == Linkage::Internal && !ND->isExternallyVisible() && getEffectiveDeclContext(ND)->isFileContext() && !ND->isInAnonymousNamespace()) @@ -790,7 +790,7 @@ bool ItaniumMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) { if (DC->isFunctionOrMethod() && D->hasLinkage()) while (!DC->isFileContext()) DC = getEffectiveParentContext(DC); - if (DC->isTranslationUnit() && D->getFormalLinkage() != InternalLinkage && + if (DC->isTranslationUnit() && D->getFormalLinkage() != Linkage::Internal && !CXXNameMangler::shouldHaveAbiTags(*this, VD) && !isa(VD) && !VD->getOwningModuleForLinkage()) diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index f6d8cdee8443d..b7cfcbc9dfa46 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -539,9 +539,8 @@ bool MicrosoftMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) { while (!DC->isNamespace() && !DC->isTranslationUnit()) DC = getEffectiveParentContext(DC); - if (DC->isTranslationUnit() && D->getFormalLinkage() == InternalLinkage && - !isa(D) && - D->getIdentifier() != nullptr) + if (DC->isTranslationUnit() && D->getFormalLinkage() == Linkage::Internal && + !isa(D) && D->getIdentifier() != nullptr) return false; } diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 98a4f12c4f574..d1cbfbd150ba5 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -4175,7 +4175,7 @@ template class TypePropertyCache { // Compute the cached properties and then set the cache. CachedProperties Result = computeCachedProperties(T); T->TypeBits.CacheValid = true; - T->TypeBits.CachedLinkage = Result.getLinkage(); + T->TypeBits.CachedLinkage = llvm::to_underlying(Result.getLinkage()); T->TypeBits.CachedLocalOrUnnamed = Result.hasLocalOrUnnamedType(); } }; @@ -4207,20 +4207,20 @@ static CachedProperties computeCachedProperties(const Type *T) { // Treat instantiation-dependent types as external. if (!T->isInstantiationDependentType()) T->dump(); assert(T->isInstantiationDependentType()); - return CachedProperties(ExternalLinkage, false); + return CachedProperties(Linkage::External, false); case Type::Auto: case Type::DeducedTemplateSpecialization: // Give non-deduced 'auto' types external linkage. We should only see them // here in error recovery. - return CachedProperties(ExternalLinkage, false); + return CachedProperties(Linkage::External, false); case Type::BitInt: case Type::Builtin: // C++ [basic.link]p8: // A type is said to have linkage if and only if: // - it is a fundamental type (3.9.1); or - return CachedProperties(ExternalLinkage, false); + return CachedProperties(Linkage::External, false); case Type::Record: case Type::Enum: { diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index cc81a68b15c43..35f651b39f674 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3997,7 +3997,7 @@ TargetMVPriority(const TargetInfo &TI, llvm::GlobalValue::LinkageTypes getMultiversionLinkage(CodeGenModule &CGM, GlobalDecl GD) { const FunctionDecl *FD = cast(GD.getDecl()); - if (FD->getFormalLinkage() == InternalLinkage) + if (FD->getFormalLinkage() == Linkage::Internal) return llvm::GlobalValue::InternalLinkage; return llvm::GlobalValue::WeakODRLinkage; } @@ -5051,7 +5051,7 @@ void CodeGenModule::MaybeHandleStaticInExternC(const SomeDecl *D, return; // Must have internal linkage and an ordinary name. - if (!D->getIdentifier() || D->getFormalLinkage() != InternalLinkage) + if (!D->getIdentifier() || D->getFormalLinkage() != Linkage::Internal) return; // Must be in an extern "C" context. Entities declared directly within diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index c7295b3144ed1..55d2696750ae7 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -3706,14 +3706,17 @@ static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, return llvm::GlobalValue::InternalLinkage; switch (Ty->getLinkage()) { - case NoLinkage: - case InternalLinkage: - case UniqueExternalLinkage: + case Linkage::Invalid: + llvm_unreachable("Linkage hasn't been computed!"); + + case Linkage::None: + case Linkage::Internal: + case Linkage::UniqueExternal: return llvm::GlobalValue::InternalLinkage; - case VisibleNoLinkage: - case ModuleLinkage: - case ExternalLinkage: + case Linkage::VisibleNone: + case Linkage::Module: + case Linkage::External: // RTTI is not enabled, which means that this type info struct is going // to be used for exception handling. Give it linkonce_odr linkage. if (!CGM.getLangOpts().RTTI) diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index b6f941052abee..4e55d6be376a5 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -3644,14 +3644,17 @@ uint32_t MSRTTIClass::initialize(const MSRTTIClass *Parent, static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) { switch (Ty->getLinkage()) { - case NoLinkage: - case InternalLinkage: - case UniqueExternalLinkage: + case Linkage::Invalid: + llvm_unreachable("Linkage hasn't been computed!"); + + case Linkage::None: + case Linkage::Internal: + case Linkage::UniqueExternal: return llvm::GlobalValue::InternalLinkage; - case VisibleNoLinkage: - case ModuleLinkage: - case ExternalLinkage: + case Linkage::VisibleNone: + case Linkage::Module: + case Linkage::External: return llvm::GlobalValue::LinkOnceODRLinkage; } llvm_unreachable("Invalid linkage!"); diff --git a/clang/lib/Index/IndexSymbol.cpp b/clang/lib/Index/IndexSymbol.cpp index cfdffeed834e6..10384660d2cb6 100644 --- a/clang/lib/Index/IndexSymbol.cpp +++ b/clang/lib/Index/IndexSymbol.cpp @@ -66,15 +66,17 @@ bool index::isFunctionLocalSymbol(const Decl *D) { if (const NamedDecl *ND = dyn_cast(D)) { switch (ND->getFormalLinkage()) { - case NoLinkage: - case InternalLinkage: - return true; - case VisibleNoLinkage: - case UniqueExternalLinkage: - llvm_unreachable("Not a sema linkage"); - case ModuleLinkage: - case ExternalLinkage: - return false; + case Linkage::Invalid: + llvm_unreachable("Linkage hasn't been computed!"); + case Linkage::None: + case Linkage::Internal: + return true; + case Linkage::VisibleNone: + case Linkage::UniqueExternal: + llvm_unreachable("Not a sema linkage"); + case Linkage::Module: + case Linkage::External: + return false; } } diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 1842a783dc29a..12915a32d02ea 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -7336,7 +7336,7 @@ void Sema::checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, if (Context.getTargetInfo().getTriple().isOSAIX() && FDecl && Arg && FDecl->hasLinkage() && - FDecl->getFormalLinkage() != InternalLinkage && + FDecl->getFormalLinkage() != Linkage::Internal && CallType == VariadicDoesNotApply) checkAIXMemberAlignment((Arg->getExprLoc()), Arg); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a8bad12b670fc..b4affa7277f6b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1730,9 +1730,9 @@ bool Sema::CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old) { auto Lk = Old->getFormalLinkage(); int S = 0; - if (Lk == Linkage::InternalLinkage) + if (Lk == Linkage::Internal) S = 1; - else if (Lk == Linkage::ModuleLinkage) + else if (Lk == Linkage::Module) S = 2; Diag(New->getLocation(), diag::err_redeclaration_non_exported) << New << S; Diag(Old->getLocation(), diag::note_previous_declaration); @@ -4843,11 +4843,9 @@ void Sema::notePreviousDefinition(const NamedDecl *Old, SourceLocation New) { /// of the same variable. Either diagnose or fix the problem. bool Sema::checkVarDeclRedefinition(VarDecl *Old, VarDecl *New) { if (!hasVisibleDefinition(Old) && - (New->getFormalLinkage() == InternalLinkage || - New->isInline() || + (New->getFormalLinkage() == Linkage::Internal || New->isInline() || isa(New) || - New->getDescribedVarTemplate() || - New->getNumTemplateParameterLists() || + New->getDescribedVarTemplate() || New->getNumTemplateParameterLists() || New->getDeclContext()->isDependentContext())) { // The previous definition is hidden, and multiple definitions are // permitted (in separate TUs). Demote this to a declaration. @@ -13413,9 +13411,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { // units. if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() && !VDecl->isInvalidDecl() && VDecl->isThisDeclarationADefinition() && - VDecl->getFormalLinkage() == Linkage::ExternalLinkage && - !VDecl->isInline() && !VDecl->isTemplated() && - !isa(VDecl)) { + VDecl->getFormalLinkage() == Linkage::External && !VDecl->isInline() && + !VDecl->isTemplated() && !isa(VDecl)) { Diag(VDecl->getLocation(), diag::err_extern_def_in_header_unit); VDecl->setInvalidDecl(); } @@ -15394,9 +15391,8 @@ Sema::CheckForFunctionRedefinition(FunctionDecl *FD, // If we don't have a visible definition of the function, and it's inline or // a template, skip the new definition. if (SkipBody && !hasVisibleDefinition(Definition) && - (Definition->getFormalLinkage() == InternalLinkage || - Definition->isInlined() || - Definition->getDescribedFunctionTemplate() || + (Definition->getFormalLinkage() == Linkage::Internal || + Definition->isInlined() || Definition->getDescribedFunctionTemplate() || Definition->getNumTemplateParameterLists())) { SkipBody->ShouldSkip = true; SkipBody->Previous = const_cast(Definition); @@ -15652,8 +15648,8 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D, if (getLangOpts().CPlusPlusModules && currentModuleIsHeaderUnit() && !FD->isInvalidDecl() && !FD->isInlined() && BodyKind != FnBodyKind::Delete && BodyKind != FnBodyKind::Default && - FD->getFormalLinkage() == Linkage::ExternalLinkage && - !FD->isTemplated() && !FD->isTemplateInstantiation()) { + FD->getFormalLinkage() == Linkage::External && !FD->isTemplated() && + !FD->isTemplateInstantiation()) { assert(FD->isThisDeclarationADefinition()); Diag(FD->getLocation(), diag::err_extern_def_in_header_unit); FD->setInvalidDecl(); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 2a3cd7a00806d..4a4cb02b0e4a6 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -173,7 +173,7 @@ static void diagnoseUseOfInternalDeclInInlineFunction(Sema &S, return; // Check if the decl has internal linkage. - if (D->getFormalLinkage() != InternalLinkage) + if (D->getFormalLinkage() != Linkage::Internal) return; // Downgrade from ExtWarn to Extension if diff --git a/clang/lib/Sema/SemaModule.cpp b/clang/lib/Sema/SemaModule.cpp index 5582afb119047..8a296837e2a19 100644 --- a/clang/lib/Sema/SemaModule.cpp +++ b/clang/lib/Sema/SemaModule.cpp @@ -844,7 +844,7 @@ static bool checkExportedDecl(Sema &S, Decl *D, SourceLocation BlockStart) { // Don't diagnose anonymous union objects; we'll diagnose their members // instead. HasName = (bool)ND->getDeclName(); - if (HasName && ND->getFormalLinkage() == InternalLinkage) { + if (HasName && ND->getFormalLinkage() == Linkage::Internal) { S.Diag(ND->getLocation(), diag::err_export_internal) << ND; if (BlockStart.isValid()) S.Diag(BlockStart, diag::note_export); @@ -858,9 +858,9 @@ static bool checkExportedDecl(Sema &S, Decl *D, SourceLocation BlockStart) { if (auto *USD = dyn_cast(D)) { NamedDecl *Target = USD->getUnderlyingDecl(); Linkage Lk = Target->getFormalLinkage(); - if (Lk == InternalLinkage || Lk == ModuleLinkage) { + if (Lk == Linkage::Internal || Lk == Linkage::Module) { S.Diag(USD->getLocation(), diag::err_export_using_internal) - << (Lk == InternalLinkage ? 0 : 1) << Target; + << (Lk == Linkage::Internal ? 0 : 1) << Target; S.Diag(Target->getLocation(), diag::note_using_decl_target); if (BlockStart.isValid()) S.Diag(BlockStart, diag::note_export); diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index d3d2dfed2ce0c..f97e244120612 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -6795,7 +6795,7 @@ void Sema::AddOverloadCandidate( if (auto *SpecInfo = Function->getTemplateSpecializationInfo()) ND = SpecInfo->getTemplate(); - if (ND->getFormalLinkage() == Linkage::InternalLinkage) { + if (ND->getFormalLinkage() == Linkage::Internal) { Candidate.Viable = false; Candidate.FailureKind = ovl_fail_module_mismatched; return; diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 9044400fbb1f3..4d6b2376ba786 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -6874,7 +6874,7 @@ static bool CheckTemplateArgumentAddressOfObjectOrFunction( } // Address / reference template args must have external linkage in C++98. - if (Entity->getFormalLinkage() == InternalLinkage) { + if (Entity->getFormalLinkage() == Linkage::Internal) { S.Diag(Arg->getBeginLoc(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_arg_object_internal @@ -9896,7 +9896,7 @@ static bool CheckExplicitInstantiation(Sema &S, NamedDecl *D, // An explicit instantiation declaration shall not name a specialization of // a template with internal linkage. if (TSK == TSK_ExplicitInstantiationDeclaration && - D->getFormalLinkage() == InternalLinkage) { + D->getFormalLinkage() == Linkage::Internal) { S.Diag(InstLoc, diag::err_explicit_instantiation_internal_linkage) << D; return true; } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 319a45108c6ab..00f57f88781e6 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -1606,11 +1606,11 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::VisitVarDeclImpl(VarDecl *VD) { VD->setType(Reader.GetType(DeferredTypeID)); DeferredTypeID = 0; - auto VarLinkage = Linkage(Record.readInt()); + auto VarLinkage = static_cast(Record.readInt()); VD->setCachedLinkage(VarLinkage); // Reconstruct the one piece of the IdentifierNamespace that we need. - if (VD->getStorageClass() == SC_Extern && VarLinkage != NoLinkage && + if (VD->getStorageClass() == SC_Extern && VarLinkage != Linkage::None && VD->getLexicalDeclContext()->isFunctionOrMethod()) VD->setLocalExternDecl(); diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 78c5e1750dbca..ef28e69abc4e1 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -683,7 +683,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { Record.push_back(D->isMultiVersion()); Record.push_back(D->isLateTemplateParsed()); Record.push_back(D->FriendConstraintRefersToEnclosingTemplate()); - Record.push_back(D->getLinkageInternal()); + Record.push_back(llvm::to_underlying(D->getLinkageInternal())); Record.AddSourceLocation(D->getEndLoc()); Record.AddSourceLocation(D->getDefaultLoc()); @@ -1067,7 +1067,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) { HasDeducedType = D->getType()->getContainedDeducedType(); Record.push_back(HasDeducedType); } - Record.push_back(D->getLinkageInternal()); + Record.push_back(llvm::to_underlying(D->getLinkageInternal())); if (D->hasAttr()) { BlockVarCopyInit Init = Writer.Context->getBlockVarCopyInit(D); @@ -2214,7 +2214,7 @@ void ASTWriter::WriteDeclAbbrevs() { Abv->Add(BitCodeAbbrevOp(0)); // TSCSpec Abv->Add(BitCodeAbbrevOp(0)); // InitStyle Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong - Abv->Add(BitCodeAbbrevOp(0)); // Linkage + Abv->Add(BitCodeAbbrevOp(1)); // Linkage::None Abv->Add(BitCodeAbbrevOp(0)); // ModulesCodegen Abv->Add(BitCodeAbbrevOp(0)); // VarKind (local enum) // ParmVarDecl diff --git a/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp b/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp index 2d4f398f76f6d..769727eedec72 100644 --- a/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp +++ b/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp @@ -98,12 +98,14 @@ void MapExtDefNamesConsumer::addIfInMain(const DeclaratorDecl *DD, } switch (DD->getLinkageInternal()) { - case ExternalLinkage: - case VisibleNoLinkage: - case UniqueExternalLinkage: + case Linkage::External: + case Linkage::VisibleNone: + case Linkage::UniqueExternal: if (SM.isInMainFile(defStart)) Index[*LookupName] = CurrentFileName; break; + case Linkage::Invalid: + llvm_unreachable("Linkage has not been computed!"); default: break; } diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 169ce4f9b7c6a..df630f66f0b94 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -8246,15 +8246,17 @@ CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { const Decl *D = cxcursor::getCursorDecl(cursor); if (const NamedDecl *ND = dyn_cast_or_null(D)) switch (ND->getLinkageInternal()) { - case NoLinkage: - case VisibleNoLinkage: + case Linkage::Invalid: + return CXLinkage_Invalid; + case Linkage::None: + case Linkage::VisibleNone: return CXLinkage_NoLinkage; - case InternalLinkage: + case Linkage::Internal: return CXLinkage_Internal; - case UniqueExternalLinkage: + case Linkage::UniqueExternal: return CXLinkage_UniqueExternal; - case ModuleLinkage: - case ExternalLinkage: + case Linkage::Module: + case Linkage::External: return CXLinkage_External; }; diff --git a/clang/tools/libclang/CXIndexDataConsumer.cpp b/clang/tools/libclang/CXIndexDataConsumer.cpp index cb9c81328b397..5ca484fbc8cd8 100644 --- a/clang/tools/libclang/CXIndexDataConsumer.cpp +++ b/clang/tools/libclang/CXIndexDataConsumer.cpp @@ -431,14 +431,16 @@ bool CXIndexDataConsumer::isFunctionLocalDecl(const Decl *D) { if (const NamedDecl *ND = dyn_cast(D)) { switch (ND->getFormalLinkage()) { - case NoLinkage: - case InternalLinkage: + case Linkage::Invalid: + llvm_unreachable("Linkage hasn't been computed!"); + case Linkage::None: + case Linkage::Internal: return true; - case VisibleNoLinkage: - case UniqueExternalLinkage: + case Linkage::VisibleNone: + case Linkage::UniqueExternal: llvm_unreachable("Not a sema linkage"); - case ModuleLinkage: - case ExternalLinkage: + case Linkage::Module: + case Linkage::External: return false; } } diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp index 474d3dadb5a52..cef0f8711416b 100644 --- a/clang/unittests/AST/DeclTest.cpp +++ b/clang/unittests/AST/DeclTest.cpp @@ -247,16 +247,16 @@ TEST(Decl, ModuleAndInternalLinkage) { const auto *f = selectFirst( "f", match(functionDecl(hasName("f")).bind("f"), Ctx)); - EXPECT_EQ(a->getFormalLinkage(), InternalLinkage); - EXPECT_EQ(f->getFormalLinkage(), InternalLinkage); + EXPECT_EQ(a->getFormalLinkage(), Linkage::Internal); + EXPECT_EQ(f->getFormalLinkage(), Linkage::Internal); const auto *b = selectFirst("b", match(varDecl(hasName("b")).bind("b"), Ctx)); const auto *g = selectFirst( "g", match(functionDecl(hasName("g")).bind("g"), Ctx)); - EXPECT_EQ(b->getFormalLinkage(), ModuleLinkage); - EXPECT_EQ(g->getFormalLinkage(), ModuleLinkage); + EXPECT_EQ(b->getFormalLinkage(), Linkage::Module); + EXPECT_EQ(g->getFormalLinkage(), Linkage::Module); } TEST(Decl, GetNonTransparentDeclContext) {