[clang] [clang-tools-extra] [Clang][AST][NFC] Introduce `NamespaceBaseDecl` (PR #149123)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 16 08:46:01 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-modules
Author: Yanzuo Liu (zwuis)
<details>
<summary>Changes</summary>
Add `NamespaceBaseDecl` as common base class of `NamespaceDecl` and `NamespaceAliasDecl`. This simplifies `NestedNameSpecifier` a bit.
Co-authored-by: Matheus Izvekov <mizvekov@<!-- -->gmail.com>
---
Patch is 59.79 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/149123.diff
47 Files Affected:
- (modified) clang-tools-extra/clang-tidy/bugprone/MoveForwardingReferenceCheck.cpp (+1-1)
- (modified) clang-tools-extra/clang-tidy/misc/UnusedAliasDeclsCheck.cpp (+2-1)
- (modified) clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp (+2-1)
- (modified) clang-tools-extra/clangd/AST.cpp (+6-4)
- (modified) clang-tools-extra/clangd/CodeComplete.cpp (-1)
- (modified) clang-tools-extra/clangd/DumpAST.cpp (-3)
- (modified) clang-tools-extra/clangd/FindTarget.cpp (-3)
- (modified) clang-tools-extra/clangd/IncludeFixer.cpp (+19-17)
- (modified) clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp (+6-2)
- (modified) clang-tools-extra/include-cleaner/lib/WalkAST.cpp (-1)
- (modified) clang/include/clang/AST/AbstractBasicReader.h (+1-6)
- (modified) clang/include/clang/AST/AbstractBasicWriter.h (+1-5)
- (modified) clang/include/clang/AST/Decl.h (+21-1)
- (modified) clang/include/clang/AST/DeclCXX.h (+11-13)
- (modified) clang/include/clang/AST/NestedNameSpecifier.h (+10-37)
- (modified) clang/include/clang/AST/PropertiesBase.td (+1)
- (modified) clang/include/clang/AST/RecursiveASTVisitor.h (-2)
- (modified) clang/include/clang/ASTMatchers/ASTMatchers.h (+3-3)
- (modified) clang/include/clang/Basic/DeclNodes.td (+3-2)
- (modified) clang/include/clang/Sema/DeclSpec.h (+5-20)
- (modified) clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h (+2-1)
- (modified) clang/lib/AST/ASTContext.cpp (+18-36)
- (modified) clang/lib/AST/ASTImporter.cpp (+1-13)
- (modified) clang/lib/AST/ASTStructuralEquivalence.cpp (-3)
- (modified) clang/lib/AST/DeclCXX.cpp (+12-8)
- (modified) clang/lib/AST/ItaniumMangle.cpp (+1-13)
- (modified) clang/lib/AST/NestedNameSpecifier.cpp (+19-61)
- (modified) clang/lib/AST/ODRHash.cpp (-3)
- (modified) clang/lib/AST/QualTypeNames.cpp (+1-10)
- (modified) clang/lib/AST/TextNodeDumper.cpp (-4)
- (modified) clang/lib/ExtractAPI/DeclarationFragments.cpp (+3-12)
- (modified) clang/lib/Index/IndexTypeSourceInfo.cpp (-4)
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+1-2)
- (modified) clang/lib/Sema/DeclSpec.cpp (+1-14)
- (modified) clang/lib/Sema/SemaCXXScopeSpec.cpp (+1-5)
- (modified) clang/lib/Sema/SemaDeclCXX.cpp (+2-2)
- (modified) clang/lib/Sema/SemaExprCXX.cpp (-1)
- (modified) clang/lib/Sema/SemaLookup.cpp (+6-7)
- (modified) clang/lib/Sema/SemaTemplate.cpp (-1)
- (modified) clang/lib/Sema/TreeTransform.h (+2-12)
- (modified) clang/lib/Serialization/ASTReader.cpp (+1-8)
- (modified) clang/lib/Serialization/ASTReaderDecl.cpp (+1-1)
- (modified) clang/lib/Serialization/ASTWriter.cpp (-5)
- (modified) clang/lib/Tooling/Syntax/BuildTree.cpp (-1)
- (modified) clang/tools/libclang/CIndex.cpp (-11)
- (modified) clang/unittests/Tooling/RecursiveASTVisitorTests/NestedNameSpecifiers.cpp (+2-2)
- (modified) clang/unittests/Tooling/RefactoringTest.cpp (+2-1)
``````````diff
diff --git a/clang-tools-extra/clang-tidy/bugprone/MoveForwardingReferenceCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/MoveForwardingReferenceCheck.cpp
index 33642c407a3a9..bfa2ab51a6d03 100644
--- a/clang-tools-extra/clang-tidy/bugprone/MoveForwardingReferenceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/MoveForwardingReferenceCheck.cpp
@@ -45,7 +45,7 @@ static void replaceMoveWithForward(const UnresolvedLookupExpr *Callee,
// We still conservatively put a "std::" in front of the forward because
// we don't know whether the code also had a "using std::forward;".
Diag << FixItHint::CreateReplacement(CallRange, "std::" + ForwardName);
- } else if (const NamespaceDecl *Namespace = NNS->getAsNamespace()) {
+ } else if (const NamespaceBaseDecl *Namespace = NNS->getAsNamespace()) {
if (Namespace->getName() == "std") {
if (!NNS->getPrefix()) {
// Called as "std::move".
diff --git a/clang-tools-extra/clang-tidy/misc/UnusedAliasDeclsCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedAliasDeclsCheck.cpp
index 2dfaca19a8981..86992cd8a141b 100644
--- a/clang-tools-extra/clang-tidy/misc/UnusedAliasDeclsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UnusedAliasDeclsCheck.cpp
@@ -36,7 +36,8 @@ void UnusedAliasDeclsCheck::check(const MatchFinder::MatchResult &Result) {
if (const auto *NestedName =
Result.Nodes.getNodeAs<NestedNameSpecifier>("nns")) {
- if (const auto *AliasDecl = NestedName->getAsNamespaceAlias()) {
+ if (const auto *AliasDecl = dyn_cast_if_present<NamespaceAliasDecl>(
+ NestedName->getAsNamespace())) {
FoundDecls[AliasDecl] = CharSourceRange();
}
}
diff --git a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
index 6cf38ddf3d914..dd28806e008ed 100644
--- a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
@@ -282,7 +282,8 @@ class RenamerClangTidyVisitor
bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc Loc) {
if (const NestedNameSpecifier *Spec = Loc.getNestedNameSpecifier()) {
- if (const NamespaceDecl *Decl = Spec->getAsNamespace())
+ if (const auto *Decl =
+ dyn_cast_if_present<NamespaceDecl>(Spec->getAsNamespace()))
Check->addUsage(Decl, Loc.getLocalSourceRange(), SM);
}
diff --git a/clang-tools-extra/clangd/AST.cpp b/clang-tools-extra/clangd/AST.cpp
index e274236527817..f2631e5abb6a3 100644
--- a/clang-tools-extra/clangd/AST.cpp
+++ b/clang-tools-extra/clangd/AST.cpp
@@ -666,12 +666,14 @@ std::string getQualification(ASTContext &Context,
return getQualification(
Context, DestContext, ND->getDeclContext(),
[&](NestedNameSpecifier *NNS) {
- if (NNS->getKind() != NestedNameSpecifier::Namespace)
+ const NamespaceDecl *NS =
+ dyn_cast_if_present<NamespaceDecl>(NNS->getAsNamespace());
+ if (!NS)
return false;
- const auto *CanonNSD = NNS->getAsNamespace()->getCanonicalDecl();
+ NS = NS->getCanonicalDecl();
return llvm::any_of(VisibleNamespaceDecls,
- [CanonNSD](const NamespaceDecl *NSD) {
- return NSD->getCanonicalDecl() == CanonNSD;
+ [NS](const NamespaceDecl *NSD) {
+ return NSD->getCanonicalDecl() == NS;
});
});
}
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp
index d5907e3143bf6..184c3c962f063 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -1470,7 +1470,6 @@ bool allowIndex(CodeCompletionContext &CC) {
switch (NameSpec->getKind()) {
case NestedNameSpecifier::Global:
case NestedNameSpecifier::Namespace:
- case NestedNameSpecifier::NamespaceAlias:
return true;
case NestedNameSpecifier::Super:
case NestedNameSpecifier::TypeSpec:
diff --git a/clang-tools-extra/clangd/DumpAST.cpp b/clang-tools-extra/clangd/DumpAST.cpp
index 8f24477ecd3de..c6075e75e9a6b 100644
--- a/clang-tools-extra/clangd/DumpAST.cpp
+++ b/clang-tools-extra/clangd/DumpAST.cpp
@@ -158,7 +158,6 @@ class DumpVisitor : public RecursiveASTVisitor<DumpVisitor> {
NNS_KIND(TypeSpec);
NNS_KIND(Global);
NNS_KIND(Super);
- NNS_KIND(NamespaceAlias);
#undef NNS_KIND
}
llvm_unreachable("Unhandled SpecifierKind enum");
@@ -281,8 +280,6 @@ class DumpVisitor : public RecursiveASTVisitor<DumpVisitor> {
return NNS.getAsIdentifier()->getName().str() + "::";
case NestedNameSpecifier::Namespace:
return NNS.getAsNamespace()->getNameAsString() + "::";
- case NestedNameSpecifier::NamespaceAlias:
- return NNS.getAsNamespaceAlias()->getNameAsString() + "::";
default:
return "";
}
diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp
index 91fd3b0f8567b..b1089577ba819 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -491,9 +491,6 @@ struct TargetFinder {
case NestedNameSpecifier::Namespace:
add(NNS->getAsNamespace(), Flags);
return;
- case NestedNameSpecifier::NamespaceAlias:
- add(NNS->getAsNamespaceAlias(), Flags);
- return;
case NestedNameSpecifier::Identifier:
if (Resolver) {
add(Resolver->resolveNestedNameSpecifierToType(NNS), Flags);
diff --git a/clang-tools-extra/clangd/IncludeFixer.cpp b/clang-tools-extra/clangd/IncludeFixer.cpp
index 4ff021c4c390a..50bc2bd7ccb94 100644
--- a/clang-tools-extra/clangd/IncludeFixer.cpp
+++ b/clang-tools-extra/clangd/IncludeFixer.cpp
@@ -403,25 +403,27 @@ std::optional<CheapUnresolvedName> extractUnresolvedNameCheaply(
if (auto *Nested = SS->getScopeRep()) {
if (Nested->getKind() == NestedNameSpecifier::Global) {
Result.ResolvedScope = "";
- } else if (const auto *NS = Nested->getAsNamespace()) {
- std::string SpecifiedNS = printNamespaceScope(*NS);
- std::optional<std::string> Spelling = getSpelledSpecifier(*SS, SM);
-
- // Check the specifier spelled in the source.
- // If the resolved scope doesn't end with the spelled scope, the
- // resolved scope may come from a sema typo correction. For example,
- // sema assumes that "clangd::" is a typo of "clang::" and uses
- // "clang::" as the specified scope in:
- // namespace clang { clangd::X; }
- // In this case, we use the "typo" specifier as extra scope instead
- // of using the scope assumed by sema.
- if (!Spelling || llvm::StringRef(SpecifiedNS).ends_with(*Spelling)) {
- Result.ResolvedScope = std::move(SpecifiedNS);
+ } else if (const NamespaceBaseDecl *NSB = Nested->getAsNamespace()) {
+ if (const auto *NS = dyn_cast<NamespaceDecl>(NSB)) {
+ std::string SpecifiedNS = printNamespaceScope(*NS);
+ std::optional<std::string> Spelling = getSpelledSpecifier(*SS, SM);
+
+ // Check the specifier spelled in the source.
+ // If the resolved scope doesn't end with the spelled scope, the
+ // resolved scope may come from a sema typo correction. For example,
+ // sema assumes that "clangd::" is a typo of "clang::" and uses
+ // "clang::" as the specified scope in:
+ // namespace clang { clangd::X; }
+ // In this case, we use the "typo" specifier as extra scope instead
+ // of using the scope assumed by sema.
+ if (!Spelling || llvm::StringRef(SpecifiedNS).ends_with(*Spelling)) {
+ Result.ResolvedScope = std::move(SpecifiedNS);
+ } else {
+ Result.UnresolvedScope = std::move(*Spelling);
+ }
} else {
- Result.UnresolvedScope = std::move(*Spelling);
+ Result.ResolvedScope = printNamespaceScope(*cast<NamespaceAliasDecl>(NSB)->getNamespace());
}
- } else if (const auto *ANS = Nested->getAsNamespaceAlias()) {
- Result.ResolvedScope = printNamespaceScope(*ANS->getNamespace());
} else {
// We don't fix symbols in scopes that are not top-level e.g. class
// members, as we don't collect includes for them.
diff --git a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp
index 00c05ebdb5216..67fc451a6a1a1 100644
--- a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp
+++ b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp
@@ -173,7 +173,8 @@ findInsertionPoint(const Tweak::Selection &Inputs,
if (SM.isBeforeInTranslationUnit(Inputs.Cursor, U->getUsingLoc()))
// "Usings" is sorted, so we're done.
break;
- if (const auto *Namespace = U->getQualifier()->getAsNamespace()) {
+ if (const auto *Namespace = dyn_cast_if_present<NamespaceDecl>(
+ U->getQualifier()->getAsNamespace())) {
if (Namespace->getCanonicalDecl() ==
QualifierToRemove.getNestedNameSpecifier()
->getAsNamespace()
@@ -232,7 +233,10 @@ findInsertionPoint(const Tweak::Selection &Inputs,
bool isNamespaceForbidden(const Tweak::Selection &Inputs,
const NestedNameSpecifier &Namespace) {
- std::string NamespaceStr = printNamespaceScope(*Namespace.getAsNamespace());
+ const auto *NS = dyn_cast<NamespaceDecl>(Namespace.getAsNamespace());
+ if (!NS)
+ return true;
+ std::string NamespaceStr = printNamespaceScope(*NS);
for (StringRef Banned : Config::current().Style.FullyQualifiedNamespaces) {
StringRef PrefixMatch = NamespaceStr;
diff --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
index baff90faa6eae..49cc13606f4c2 100644
--- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
+++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp
@@ -140,7 +140,6 @@ class ASTWalker : public RecursiveASTVisitor<ASTWalker> {
return true;
switch (Qual->getKind()) {
case NestedNameSpecifier::Namespace:
- case NestedNameSpecifier::NamespaceAlias:
case NestedNameSpecifier::Global:
return true;
case NestedNameSpecifier::TypeSpec:
diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h
index 514f4cef3a694..0a2db9e205c7c 100644
--- a/clang/include/clang/AST/AbstractBasicReader.h
+++ b/clang/include/clang/AST/AbstractBasicReader.h
@@ -269,12 +269,7 @@ class DataStreamBasicReader : public BasicReaderBase<Impl> {
case NestedNameSpecifier::Namespace:
cur = NestedNameSpecifier::Create(ctx, cur,
- asImpl().readNamespaceDeclRef());
- continue;
-
- case NestedNameSpecifier::NamespaceAlias:
- cur = NestedNameSpecifier::Create(ctx, cur,
- asImpl().readNamespaceAliasDeclRef());
+ asImpl().readNamespaceBaseDeclRef());
continue;
case NestedNameSpecifier::TypeSpec:
diff --git a/clang/include/clang/AST/AbstractBasicWriter.h b/clang/include/clang/AST/AbstractBasicWriter.h
index fedde8a2e46c5..c105bbbe45c92 100644
--- a/clang/include/clang/AST/AbstractBasicWriter.h
+++ b/clang/include/clang/AST/AbstractBasicWriter.h
@@ -251,11 +251,7 @@ class DataStreamBasicWriter : public BasicWriterBase<Impl> {
continue;
case NestedNameSpecifier::Namespace:
- asImpl().writeNamespaceDeclRef(NNS->getAsNamespace());
- continue;
-
- case NestedNameSpecifier::NamespaceAlias:
- asImpl().writeNamespaceAliasDeclRef(NNS->getAsNamespaceAlias());
+ asImpl().writeNamespaceBaseDeclRef(NNS->getAsNamespace());
continue;
case NestedNameSpecifier::TypeSpec:
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index c75e29c861f82..08fe1f881503b 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -565,8 +565,28 @@ class LabelDecl : public NamedDecl {
static bool classofKind(Kind K) { return K == Label; }
};
+/// Represents C++ namespaces and their aliases.
+///
+/// FIXME: Move `NamespaceBaseDecl` and `NamespaceDecl` to "DeclCXX.h" or
+/// explain why not moving.
+class NamespaceBaseDecl : public NamedDecl {
+protected:
+ using NamedDecl::NamedDecl;
+
+public:
+ NamespaceDecl *getNamespace();
+ const NamespaceDecl *getNamespace() const {
+ return const_cast<NamespaceBaseDecl *>(this)->getNamespace();
+ }
+
+ static bool classof(const Decl *D) { return classofKind(D->getKind()); }
+ static bool classofKind(Kind K) {
+ return K >= firstNamespaceBase && K <= lastNamespaceBase;
+ }
+};
+
/// Represent a C++ namespace.
-class NamespaceDecl : public NamedDecl,
+class NamespaceDecl : public NamespaceBaseDecl,
public DeclContext,
public Redeclarable<NamespaceDecl> {
/// The starting location of the source range, pointing
diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h
index 77bc3cad72ed9..33ae3d604020b 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -3186,7 +3186,7 @@ class UsingDirectiveDecl : public NamedDecl {
/// \code
/// namespace Foo = Bar;
/// \endcode
-class NamespaceAliasDecl : public NamedDecl,
+class NamespaceAliasDecl : public NamespaceBaseDecl,
public Redeclarable<NamespaceAliasDecl> {
friend class ASTDeclReader;
@@ -3203,14 +3203,14 @@ class NamespaceAliasDecl : public NamedDecl,
/// The Decl that this alias points to, either a NamespaceDecl or
/// a NamespaceAliasDecl.
- NamedDecl *Namespace;
+ NamespaceBaseDecl *Namespace;
NamespaceAliasDecl(ASTContext &C, DeclContext *DC,
SourceLocation NamespaceLoc, SourceLocation AliasLoc,
IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc,
- SourceLocation IdentLoc, NamedDecl *Namespace)
- : NamedDecl(NamespaceAlias, DC, AliasLoc, Alias), redeclarable_base(C),
- NamespaceLoc(NamespaceLoc), IdentLoc(IdentLoc),
+ SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
+ : NamespaceBaseDecl(NamespaceAlias, DC, AliasLoc, Alias),
+ redeclarable_base(C), NamespaceLoc(NamespaceLoc), IdentLoc(IdentLoc),
QualifierLoc(QualifierLoc), Namespace(Namespace) {}
void anchor() override;
@@ -3222,13 +3222,11 @@ class NamespaceAliasDecl : public NamedDecl,
NamespaceAliasDecl *getMostRecentDeclImpl() override;
public:
- static NamespaceAliasDecl *Create(ASTContext &C, DeclContext *DC,
- SourceLocation NamespaceLoc,
- SourceLocation AliasLoc,
- IdentifierInfo *Alias,
- NestedNameSpecifierLoc QualifierLoc,
- SourceLocation IdentLoc,
- NamedDecl *Namespace);
+ static NamespaceAliasDecl *
+ Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc,
+ SourceLocation AliasLoc, IdentifierInfo *Alias,
+ NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc,
+ NamespaceBaseDecl *Namespace);
static NamespaceAliasDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
@@ -3282,7 +3280,7 @@ class NamespaceAliasDecl : public NamedDecl,
/// Retrieve the namespace that this alias refers to, which
/// may either be a NamespaceDecl or a NamespaceAliasDecl.
- NamedDecl *getAliasedNamespace() const { return Namespace; }
+ NamespaceBaseDecl *getAliasedNamespace() const { return Namespace; }
SourceRange getSourceRange() const override LLVM_READONLY {
return SourceRange(NamespaceLoc, IdentLoc);
diff --git a/clang/include/clang/AST/NestedNameSpecifier.h b/clang/include/clang/AST/NestedNameSpecifier.h
index 952c79753d10a..1614f9d7c94e4 100644
--- a/clang/include/clang/AST/NestedNameSpecifier.h
+++ b/clang/include/clang/AST/NestedNameSpecifier.h
@@ -31,8 +31,7 @@ class ASTContext;
class CXXRecordDecl;
class IdentifierInfo;
class LangOptions;
-class NamespaceAliasDecl;
-class NamespaceDecl;
+class NamespaceBaseDecl;
struct PrintingPolicy;
class Type;
class TypeLoc;
@@ -79,12 +78,9 @@ class NestedNameSpecifier : public llvm::FoldingSetNode {
/// An identifier, stored as an IdentifierInfo*.
Identifier,
- /// A namespace, stored as a NamespaceDecl*.
+ /// A namespace-like entity, stored as a NamespaceBaseDecl*.
Namespace,
- /// A namespace alias, stored as a NamespaceAliasDecl*.
- NamespaceAlias,
-
/// A type, stored as a Type*.
TypeSpec,
@@ -121,15 +117,10 @@ class NestedNameSpecifier : public llvm::FoldingSetNode {
NestedNameSpecifier *Prefix,
const IdentifierInfo *II);
- /// Builds a nested name specifier that names a namespace.
- static NestedNameSpecifier *Create(const ASTContext &Context,
- NestedNameSpecifier *Prefix,
- const NamespaceDecl *NS);
-
- /// Builds a nested name specifier that names a namespace alias.
+ /// Builds a nested name specifier that names a namespace or namespace alias.
static NestedNameSpecifier *Create(const ASTContext &Context,
NestedNameSpecifier *Prefix,
- const NamespaceAliasDecl *Alias);
+ const NamespaceBaseDecl *NS);
/// Builds a nested name specifier that names a type.
static NestedNameSpecifier *
@@ -174,13 +165,9 @@ class NestedNameSpecifier : public llvm::FoldingSetNode {
return nullptr;
}
- /// Retrieve the namespace stored in this nested name
+ /// Retrieve the namespace or namespace alias stored in this nested name
/// specifier.
- NamespaceDecl *getAsNamespace() const;
-
- /// Retrieve the namespace alias stored in this nested name
- /// specifier.
- NamespaceAliasDecl *getAsNamespaceAlias() const;
+ NamespaceBaseDecl *getAsNamespace() const;
/// Retrieve the record declaration stored in this nested name
/// specifier.
@@ -425,29 +412,15 @@ class NestedNameSpecifierLocBuilder {
/// \param Context The AST context in which this nested-name-specifier
/// resides.
///
- /// \param Namespace The namespace.
+ /// \param Namespace The namespace or namespace alias.
///
- /// \param NamespaceLoc The location of the namespace name.
+ /// \param NamespaceLoc The location of the namespace name or the namespace
+ // alias.
///
/// \param ColonColonLoc The location of the trailing '::'.
- void Extend(ASTContext &Context, NamespaceDecl *Namespace,
+ void Extend(ASTContext &Context, NamespaceBaseDecl *Namespace,
SourceLocation NamespaceLoc, SourceLocation ColonColonLoc);
- /// Extend the current nested-name-specifier by another
- /// nested-name-specifier component of the form 'namespace-alias::'.
- ///
- /// \param Context The AST context in which this nested-name-specifier
- /// resides.
- ///
- /// \param Alias The namespace alias.
- ///
- /// \param AliasLoc The location of the namespace alias
- /// name.
- ///
- /// \param ColonColonLoc The location of the trailing '::'.
- void Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
- SourceLocation AliasLoc, SourceLocation ColonColonLoc);
-
/// Turn this (empty) nested-name-specifier into the global
/// nested-name-specifier '::'.
void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc);
diff --git a/clang/include/clang/AST/PropertiesBase.td b/clang/include/clang/AST/PropertiesBase.td
index 1215056ffde1b..0438e4dfbafac 100644
--- a/clang/include/clang/AST/PropertiesBase.td
+++ b/clang/include/clang/AST/PropertiesBase.td
@@ -91,6 +91,7 @@ def DeclRef : RefPropertyType<"Decl"> { let ConstWhenWriting = 1; }
SubclassPropertyType<"FunctionDecl", DeclRef>;
def NamedDeclRef :
SubclassPropertyType<"NamedDecl", DeclRef>;
+ def NamespaceBaseDeclRef : SubclassPropertyType<"NamespaceBaseDecl", DeclRef>;
def N...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/149123
More information about the cfe-commits
mailing list