[llvm-branch-commits] [clang] [PATCH 2/4] [clang] Improve nested name specifier AST representation (PR #148012)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jul 10 10:53:44 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-mips
Author: Matheus Izvekov (mizvekov)
<details>
<summary>Changes</summary>
Other changes
Second patch in the series starting at https://github.com/llvm/llvm-project/pull/147835
---
Patch is 800.27 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/148012.diff
173 Files Affected:
- (modified) clang/include/clang/ASTMatchers/ASTMatchers.h (+66-91)
- (modified) clang/include/clang/ASTMatchers/ASTMatchersInternal.h (+7-13)
- (modified) clang/include/clang/Analysis/FlowSensitive/ASTOps.h (+8-2)
- (modified) clang/include/clang/Basic/DeclNodes.td (+74-75)
- (modified) clang/include/clang/Basic/TypeNodes.td (+1-2)
- (modified) clang/include/clang/ExtractAPI/DeclarationFragments.h (+2-3)
- (modified) clang/include/clang/Sema/CodeCompleteConsumer.h (+4-3)
- (modified) clang/include/clang/Sema/DeclSpec.h (+9-39)
- (modified) clang/include/clang/Sema/HeuristicResolver.h (+1-2)
- (modified) clang/include/clang/Sema/ParsedTemplate.h (+16-10)
- (modified) clang/include/clang/Sema/Sema.h (+17-21)
- (modified) clang/include/clang/Sema/SemaInternal.h (+4-4)
- (modified) clang/include/clang/Sema/TypoCorrection.h (+15-14)
- (modified) clang/include/clang/Serialization/ASTRecordReader.h (+1-1)
- (modified) clang/include/clang/Serialization/ASTRecordWriter.h (+2-3)
- (modified) clang/include/clang/Serialization/TypeBitCodes.def (-1)
- (modified) clang/include/clang/Tooling/Refactoring/Lookup.h (+1-2)
- (modified) clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h (+9-6)
- (modified) clang/lib/ASTMatchers/ASTMatchFinder.cpp (+63-52)
- (modified) clang/lib/ASTMatchers/ASTMatchersInternal.cpp (+2-3)
- (modified) clang/lib/ASTMatchers/Dynamic/Registry.cpp (+1-4)
- (modified) clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp (+4-2)
- (modified) clang/lib/Analysis/ThreadSafety.cpp (+3-1)
- (modified) clang/lib/Analysis/ThreadSafetyCommon.cpp (+2-2)
- (modified) clang/lib/Analysis/UnsafeBufferUsage.cpp (+8-4)
- (modified) clang/lib/CodeGen/ABIInfo.cpp (+1-1)
- (modified) clang/lib/CodeGen/ABIInfoImpl.cpp (+18-18)
- (modified) clang/lib/CodeGen/CGBlocks.cpp (+2-1)
- (modified) clang/lib/CodeGen/CGCUDANV.cpp (+2-1)
- (modified) clang/lib/CodeGen/CGCXX.cpp (+10-9)
- (modified) clang/lib/CodeGen/CGCXXABI.cpp (+2-2)
- (modified) clang/lib/CodeGen/CGCall.cpp (+16-11)
- (modified) clang/lib/CodeGen/CGClass.cpp (+56-39)
- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+65-62)
- (modified) clang/lib/CodeGen/CGDecl.cpp (+9-4)
- (modified) clang/lib/CodeGen/CGExpr.cpp (+29-16)
- (modified) clang/lib/CodeGen/CGExprAgg.cpp (+17-8)
- (modified) clang/lib/CodeGen/CGExprCXX.cpp (+20-17)
- (modified) clang/lib/CodeGen/CGExprConstant.cpp (+21-8)
- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+7-4)
- (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+1-2)
- (modified) clang/lib/CodeGen/CGNonTrivialStruct.cpp (+6-3)
- (modified) clang/lib/CodeGen/CGObjC.cpp (+3-1)
- (modified) clang/lib/CodeGen/CGObjCMac.cpp (+6-5)
- (modified) clang/lib/CodeGen/CGObjCRuntime.cpp (+3-1)
- (modified) clang/lib/CodeGen/CGOpenMPRuntime.cpp (+21-14)
- (modified) clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp (+2-2)
- (modified) clang/lib/CodeGen/CGPointerAuth.cpp (+1-1)
- (modified) clang/lib/CodeGen/CGStmt.cpp (+2-2)
- (modified) clang/lib/CodeGen/CGStmtOpenMP.cpp (+6-3)
- (modified) clang/lib/CodeGen/CGVTables.cpp (+4-4)
- (modified) clang/lib/CodeGen/CodeGenFunction.cpp (+3-5)
- (modified) clang/lib/CodeGen/CodeGenFunction.h (+3-3)
- (modified) clang/lib/CodeGen/CodeGenModule.cpp (+17-11)
- (modified) clang/lib/CodeGen/CodeGenTBAA.cpp (+7-6)
- (modified) clang/lib/CodeGen/CodeGenTypes.cpp (+20-13)
- (modified) clang/lib/CodeGen/HLSLBufferLayoutBuilder.cpp (+2-1)
- (modified) clang/lib/CodeGen/ItaniumCXXABI.cpp (+40-28)
- (modified) clang/lib/CodeGen/MicrosoftCXXABI.cpp (+13-12)
- (modified) clang/lib/CodeGen/SwiftCallingConv.cpp (+5-4)
- (modified) clang/lib/CodeGen/Targets/AArch64.cpp (+5-4)
- (modified) clang/lib/CodeGen/Targets/AMDGPU.cpp (+3-3)
- (modified) clang/lib/CodeGen/Targets/ARC.cpp (+3-2)
- (modified) clang/lib/CodeGen/Targets/ARM.cpp (+5-4)
- (modified) clang/lib/CodeGen/Targets/BPF.cpp (+3-2)
- (modified) clang/lib/CodeGen/Targets/CSKY.cpp (+1-1)
- (modified) clang/lib/CodeGen/Targets/Hexagon.cpp (+3-2)
- (modified) clang/lib/CodeGen/Targets/Lanai.cpp (+3-2)
- (modified) clang/lib/CodeGen/Targets/LoongArch.cpp (+6-4)
- (modified) clang/lib/CodeGen/Targets/Mips.cpp (+4-4)
- (modified) clang/lib/CodeGen/Targets/NVPTX.cpp (+3-3)
- (modified) clang/lib/CodeGen/Targets/PNaCl.cpp (+2-2)
- (modified) clang/lib/CodeGen/Targets/PPC.cpp (+5-3)
- (modified) clang/lib/CodeGen/Targets/RISCV.cpp (+6-4)
- (modified) clang/lib/CodeGen/Targets/SPIR.cpp (+3-3)
- (modified) clang/lib/CodeGen/Targets/Sparc.cpp (+1-1)
- (modified) clang/lib/CodeGen/Targets/SystemZ.cpp (+4-4)
- (modified) clang/lib/CodeGen/Targets/WebAssembly.cpp (+2-1)
- (modified) clang/lib/CodeGen/Targets/X86.cpp (+35-24)
- (modified) clang/lib/CodeGen/Targets/XCore.cpp (+2-2)
- (modified) clang/lib/ExtractAPI/DeclarationFragments.cpp (+57-60)
- (modified) clang/lib/ExtractAPI/TypedefUnderlyingTypeResolver.cpp (+1-1)
- (modified) clang/lib/Frontend/ASTConsumers.cpp (+5-2)
- (modified) clang/lib/Frontend/ASTUnit.cpp (+1-1)
- (modified) clang/lib/Index/IndexTypeSourceInfo.cpp (+20-32)
- (modified) clang/lib/Index/USRGeneration.cpp (+9-9)
- (modified) clang/lib/InstallAPI/Visitor.cpp (+4-4)
- (modified) clang/lib/Interpreter/InterpreterValuePrinter.cpp (+1-1)
- (modified) clang/lib/Interpreter/Value.cpp (+3-3)
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+1-2)
- (modified) clang/lib/Parse/ParseExprCXX.cpp (+8-5)
- (modified) clang/lib/Parse/ParseTemplate.cpp (+17-12)
- (modified) clang/lib/Parse/ParseTentative.cpp (+1-1)
- (modified) clang/lib/Parse/Parser.cpp (+5-4)
- (modified) clang/lib/Sema/AnalysisBasedWarnings.cpp (+4-7)
- (modified) clang/lib/Sema/DeclSpec.cpp (+5-31)
- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp (+4-19)
- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h (+1-1)
- (modified) clang/lib/Sema/HeuristicResolver.cpp (+23-27)
- (modified) clang/lib/Sema/Sema.cpp (+12-9)
- (modified) clang/lib/Sema/SemaAccess.cpp (+21-22)
- (modified) clang/lib/Sema/SemaAvailability.cpp (+2-2)
- (modified) clang/lib/Sema/SemaBPF.cpp (+3-3)
- (modified) clang/lib/Sema/SemaCUDA.cpp (+5-2)
- (modified) clang/lib/Sema/SemaCXXScopeSpec.cpp (+184-147)
- (modified) clang/lib/Sema/SemaCast.cpp (+25-26)
- (modified) clang/lib/Sema/SemaChecking.cpp (+62-35)
- (modified) clang/lib/Sema/SemaCodeComplete.cpp (+102-79)
- (modified) clang/lib/Sema/SemaCoroutine.cpp (+16-19)
- (modified) clang/lib/Sema/SemaDecl.cpp (+337-254)
- (modified) clang/lib/Sema/SemaDeclAttr.cpp (+15-8)
- (modified) clang/lib/Sema/SemaDeclCXX.cpp (+246-238)
- (modified) clang/lib/Sema/SemaDeclObjC.cpp (+20-12)
- (modified) clang/lib/Sema/SemaExceptionSpec.cpp (+3-2)
- (modified) clang/lib/Sema/SemaExpr.cpp (+70-55)
- (modified) clang/lib/Sema/SemaExprCXX.cpp (+85-77)
- (modified) clang/lib/Sema/SemaExprMember.cpp (+4-3)
- (modified) clang/lib/Sema/SemaExprObjC.cpp (+8-7)
- (modified) clang/lib/Sema/SemaFunctionEffects.cpp (+6-2)
- (modified) clang/lib/Sema/SemaHLSL.cpp (+11-9)
- (modified) clang/lib/Sema/SemaInit.cpp (+78-67)
- (modified) clang/lib/Sema/SemaLambda.cpp (+4-4)
- (modified) clang/lib/Sema/SemaLookup.cpp (+152-88)
- (modified) clang/lib/Sema/SemaObjC.cpp (+3-2)
- (modified) clang/lib/Sema/SemaObjCProperty.cpp (+3-1)
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+8-5)
- (modified) clang/lib/Sema/SemaOverload.cpp (+96-85)
- (modified) clang/lib/Sema/SemaPPC.cpp (+4-2)
- (modified) clang/lib/Sema/SemaSYCL.cpp (+1-1)
- (modified) clang/lib/Sema/SemaStmt.cpp (+23-17)
- (modified) clang/lib/Sema/SemaStmtAsm.cpp (+6-4)
- (modified) clang/lib/Sema/SemaSwift.cpp (+3-2)
- (modified) clang/lib/Sema/SemaTemplate.cpp (+258-286)
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+71-91)
- (modified) clang/lib/Sema/SemaTemplateDeductionGuide.cpp (+32-26)
- (modified) clang/lib/Sema/SemaTemplateInstantiate.cpp (+75-109)
- (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+37-47)
- (modified) clang/lib/Sema/SemaTemplateVariadic.cpp (+21-18)
- (modified) clang/lib/Sema/SemaType.cpp (+110-74)
- (modified) clang/lib/Sema/SemaTypeTraits.cpp (+16-19)
- (modified) clang/lib/Sema/UsedDeclVisitor.h (+4-3)
- (modified) clang/lib/Serialization/ASTReader.cpp (+58-68)
- (modified) clang/lib/Serialization/ASTReaderDecl.cpp (+8-20)
- (modified) clang/lib/Serialization/ASTWriter.cpp (+58-55)
- (modified) clang/lib/Serialization/ASTWriterDecl.cpp (+3-4)
- (modified) clang/lib/Serialization/TemplateArgumentHasher.cpp (+2-6)
- (modified) clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp (+1-1)
- (modified) clang/lib/StaticAnalyzer/Checkers/CastSizeChecker.cpp (+1-1)
- (modified) clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp (+1-1)
- (modified) clang/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp (+2-1)
- (modified) clang/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp (+2-5)
- (modified) clang/lib/StaticAnalyzer/Checkers/NonNullParamChecker.cpp (+3-1)
- (modified) clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp (+1-4)
- (modified) clang/lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp (+5-6)
- (modified) clang/lib/StaticAnalyzer/Checkers/PaddingChecker.cpp (+7-9)
- (modified) clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp (+2-2)
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp (+10-23)
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp (+2-6)
- (modified) clang/lib/StaticAnalyzer/Core/CallEvent.cpp (+7-4)
- (modified) clang/lib/StaticAnalyzer/Core/MemRegion.cpp (+2-2)
- (modified) clang/lib/StaticAnalyzer/Core/RegionStore.cpp (+3-2)
- (modified) clang/lib/StaticAnalyzer/Core/SValBuilder.cpp (+2-2)
- (modified) clang/lib/Tooling/ASTDiff/ASTDiff.cpp (+7-6)
- (modified) clang/lib/Tooling/Refactoring/Lookup.cpp (+2-12)
- (modified) clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp (+92-75)
- (modified) clang/lib/Tooling/Syntax/BuildTree.cpp (+85-87)
- (modified) clang/lib/Tooling/Transformer/RangeSelector.cpp (+2-6)
- (modified) clang/tools/libclang/CIndex.cpp (+64-115)
- (modified) clang/tools/libclang/CIndexCodeCompletion.cpp (+2-2)
- (modified) clang/tools/libclang/CXCursor.cpp (+1-7)
- (modified) clang/tools/libclang/CXIndexDataConsumer.cpp (+17-8)
- (modified) clang/tools/libclang/CXType.cpp (+16-20)
- (modified) clang/tools/libclang/CursorVisitor.h (+2-2)
``````````diff
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index bae004896c11f..599155c5c9950 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -221,6 +221,19 @@ extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
typeAliasDecl;
+/// \brief Matches shadow declarations introduced into a scope by a
+/// (resolved) using declaration.
+///
+/// Given
+/// \code
+/// namespace n { int f; }
+/// namespace declToImport { using n::f; }
+/// \endcode
+/// usingShadowDecl()
+/// matches \code f \endcode
+extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingShadowDecl>
+ usingShadowDecl;
+
/// Matches type alias template declarations.
///
/// typeAliasTemplateDecl() matches
@@ -3718,7 +3731,7 @@ extern const internal::VariadicOperatorMatcherFunc<1, 1> unless;
/// Matcher<MemberExpr>, Matcher<QualType>, Matcher<RecordType>,
/// Matcher<TagType>, Matcher<TemplateSpecializationType>,
/// Matcher<TemplateTypeParmType>, Matcher<TypedefType>,
-/// Matcher<UnresolvedUsingType>
+/// Matcher<UnresolvedUsingType>, Matcher<UsingType>
inline internal::PolymorphicMatcher<
internal::HasDeclarationMatcher,
void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
@@ -4353,7 +4366,13 @@ AST_POLYMORPHIC_MATCHER_P(throughUsingDecl,
AST_POLYMORPHIC_SUPPORTED_TYPES(DeclRefExpr,
UsingType),
internal::Matcher<UsingShadowDecl>, Inner) {
- const NamedDecl *FoundDecl = Node.getFoundDecl();
+ const NamedDecl *FoundDecl;
+ if constexpr (std::is_same_v<NodeType, UsingType>) {
+ FoundDecl = Node.getDecl();
+ } else {
+ static_assert(std::is_same_v<NodeType, DeclRefExpr>);
+ FoundDecl = Node.getFoundDecl();
+ }
if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
return Inner.matches(*UsingDecl, Finder, Builder);
return false;
@@ -6982,37 +7001,6 @@ AST_POLYMORPHIC_MATCHER_P2(
InnerMatcher.matches(Args[Index], Finder, Builder);
}
-/// Matches C or C++ elaborated `TypeLoc`s.
-///
-/// Given
-/// \code
-/// struct s {};
-/// struct s ss;
-/// \endcode
-/// elaboratedTypeLoc()
-/// matches the `TypeLoc` of the variable declaration of `ss`.
-extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ElaboratedTypeLoc>
- elaboratedTypeLoc;
-
-/// Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
-/// `InnerMatcher`.
-///
-/// Given
-/// \code
-/// template <typename T>
-/// class C {};
-/// class C<int> c;
-///
-/// class D {};
-/// class D d;
-/// \endcode
-/// elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
-/// matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
-AST_MATCHER_P(ElaboratedTypeLoc, hasNamedTypeLoc, internal::Matcher<TypeLoc>,
- InnerMatcher) {
- return InnerMatcher.matches(Node.getNamedTypeLoc(), Finder, Builder);
-}
-
/// Matches type \c bool.
///
/// Given
@@ -7279,7 +7267,7 @@ extern const AstTypeMatcher<DecltypeType> decltypeType;
AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType,
AST_POLYMORPHIC_SUPPORTED_TYPES(AutoType));
-/// Matches \c DecltypeType or \c UsingType nodes to find the underlying type.
+/// Matches \c QualType nodes to find the underlying type.
///
/// Given
/// \code
@@ -7289,10 +7277,13 @@ AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType,
/// decltypeType(hasUnderlyingType(isInteger()))
/// matches the type of "a"
///
-/// Usable as: Matcher<DecltypeType>, Matcher<UsingType>
-AST_TYPE_TRAVERSE_MATCHER(hasUnderlyingType, getUnderlyingType,
- AST_POLYMORPHIC_SUPPORTED_TYPES(DecltypeType,
- UsingType));
+/// Usable as: Matcher<QualType>
+AST_MATCHER_P(Type, hasUnderlyingType, internal::Matcher<QualType>, Inner) {
+ QualType QT = Node.getLocallyUnqualifiedSingleStepDesugaredType();
+ if (QT == QualType(&Node, 0))
+ return false;
+ return Inner.matches(QT, Finder, Builder);
+}
/// Matches \c FunctionType nodes.
///
@@ -7571,27 +7562,7 @@ extern const AstTypeMatcher<RecordType> recordType;
/// and \c c.
extern const AstTypeMatcher<TagType> tagType;
-/// Matches types specified with an elaborated type keyword or with a
-/// qualified name.
-///
-/// Given
-/// \code
-/// namespace N {
-/// namespace M {
-/// class D {};
-/// }
-/// }
-/// class C {};
-///
-/// class C c;
-/// N::M::D d;
-/// \endcode
-///
-/// \c elaboratedType() matches the type of the variable declarations of both
-/// \c c and \c d.
-extern const AstTypeMatcher<ElaboratedType> elaboratedType;
-
-/// Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
+/// Matches Types whose qualifier, a NestedNameSpecifier,
/// matches \c InnerMatcher if the qualifier exists.
///
/// Given
@@ -7606,34 +7577,14 @@ extern const AstTypeMatcher<ElaboratedType> elaboratedType;
///
/// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
/// matches the type of the variable declaration of \c d.
-AST_MATCHER_P(ElaboratedType, hasQualifier,
- internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
- if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
- return InnerMatcher.matches(*Qualifier, Finder, Builder);
+AST_MATCHER_P(Type, hasQualifier, internal::Matcher<NestedNameSpecifier>,
+ InnerMatcher) {
+ if (NestedNameSpecifier Qualifier = Node.getPrefix())
+ return InnerMatcher.matches(Qualifier, Finder, Builder);
return false;
}
-/// Matches ElaboratedTypes whose named type matches \c InnerMatcher.
-///
-/// Given
-/// \code
-/// namespace N {
-/// namespace M {
-/// class D {};
-/// }
-/// }
-/// N::M::D d;
-/// \endcode
-///
-/// \c elaboratedType(namesType(recordType(
-/// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
-/// declaration of \c d.
-AST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
- InnerMatcher) {
- return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
-}
-
/// Matches types specified through a using declaration.
///
/// Given
@@ -7802,7 +7753,7 @@ AST_MATCHER_FUNCTION_P_OVERLOAD(
/// matches "A::"
AST_MATCHER_P(NestedNameSpecifier, specifiesType,
internal::Matcher<QualType>, InnerMatcher) {
- if (!Node.getAsType())
+ if (Node.getKind() != NestedNameSpecifier::Kind::Type)
return false;
return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
}
@@ -7820,8 +7771,12 @@ AST_MATCHER_P(NestedNameSpecifier, specifiesType,
/// matches "A::"
AST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
internal::Matcher<TypeLoc>, InnerMatcher) {
- return Node && Node.getNestedNameSpecifier()->getAsType() &&
- InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
+ if (!Node)
+ return false;
+ TypeLoc TL = Node.getAsTypeLoc();
+ if (!TL)
+ return false;
+ return InnerMatcher.matches(TL, Finder, Builder);
}
/// Matches on the prefix of a \c NestedNameSpecifier.
@@ -7836,10 +7791,21 @@ AST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
AST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
internal::Matcher<NestedNameSpecifier>, InnerMatcher,
0) {
- const NestedNameSpecifier *NextNode = Node.getPrefix();
+ NestedNameSpecifier NextNode = std::nullopt;
+ switch (Node.getKind()) {
+ case NestedNameSpecifier::Kind::Namespace:
+ NextNode = Node.getAsNamespaceAndPrefix().Prefix;
+ break;
+ case NestedNameSpecifier::Kind::Type:
+ NextNode = Node.getAsType()->getPrefix();
+ break;
+ default:
+ break;
+ }
+
if (!NextNode)
return false;
- return InnerMatcher.matches(*NextNode, Finder, Builder);
+ return InnerMatcher.matches(NextNode, Finder, Builder);
}
/// Matches on the prefix of a \c NestedNameSpecifierLoc.
@@ -7854,7 +7820,12 @@ AST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
AST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
1) {
- NestedNameSpecifierLoc NextNode = Node.getPrefix();
+ NestedNameSpecifierLoc NextNode;
+ if (TypeLoc TL = Node.getAsTypeLoc())
+ NextNode = TL.getPrefix();
+ else
+ NextNode = Node.getAsNamespaceAndPrefix().Prefix;
+
if (!NextNode)
return false;
return InnerMatcher.matches(NextNode, Finder, Builder);
@@ -7872,9 +7843,13 @@ AST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
/// matches "ns::"
AST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
internal::Matcher<NamespaceDecl>, InnerMatcher) {
- if (!Node.getAsNamespace())
+ if (Node.getKind() != NestedNameSpecifier::Kind::Namespace)
+ return false;
+ const auto *Namespace =
+ dyn_cast<NamespaceDecl>(Node.getAsNamespaceAndPrefix().Namespace);
+ if (!Namespace)
return false;
- return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
+ return InnerMatcher.matches(*Namespace, Finder, Builder);
}
/// Matches attributes.
diff --git a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
index 667a044abcef1..399af3d888551 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -1013,10 +1013,7 @@ class HasDeclarationMatcher : public MatcherInterface<T> {
// First, for any types that have a declaration, extract the declaration and
// match on it.
if (const auto *S = dyn_cast<TagType>(&Node)) {
- return matchesDecl(S->getDecl(), Finder, Builder);
- }
- if (const auto *S = dyn_cast<InjectedClassNameType>(&Node)) {
- return matchesDecl(S->getDecl(), Finder, Builder);
+ return matchesDecl(S->getOriginalDecl(), Finder, Builder);
}
if (const auto *S = dyn_cast<TemplateTypeParmType>(&Node)) {
return matchesDecl(S->getDecl(), Finder, Builder);
@@ -1027,6 +1024,9 @@ class HasDeclarationMatcher : public MatcherInterface<T> {
if (const auto *S = dyn_cast<UnresolvedUsingType>(&Node)) {
return matchesDecl(S->getDecl(), Finder, Builder);
}
+ if (const auto *S = dyn_cast<UsingType>(&Node)) {
+ return matchesDecl(S->getDecl(), Finder, Builder);
+ }
if (const auto *S = dyn_cast<ObjCObjectType>(&Node)) {
return matchesDecl(S->getInterface(), Finder, Builder);
}
@@ -1062,12 +1062,6 @@ class HasDeclarationMatcher : public MatcherInterface<T> {
Builder);
}
- // FIXME: We desugar elaborated types. This makes the assumption that users
- // do never want to match on whether a type is elaborated - there are
- // arguments for both sides; for now, continue desugaring.
- if (const auto *S = dyn_cast<ElaboratedType>(&Node)) {
- return matchesSpecialized(S->desugar(), Finder, Builder);
- }
// Similarly types found via using declarations.
// These are *usually* meaningless sugar, and this matches the historical
// behavior prior to the introduction of UsingType.
@@ -1207,8 +1201,8 @@ using AdaptativeDefaultToTypes =
/// All types that are supported by HasDeclarationMatcher above.
using HasDeclarationSupportedTypes =
TypeList<CallExpr, CXXConstructExpr, CXXNewExpr, DeclRefExpr, EnumType,
- ElaboratedType, InjectedClassNameType, LabelStmt, AddrLabelExpr,
- MemberExpr, QualType, RecordType, TagType,
+ InjectedClassNameType, LabelStmt, AddrLabelExpr, MemberExpr,
+ QualType, RecordType, TagType, UsingType,
TemplateSpecializationType, TemplateTypeParmType, TypedefType,
UnresolvedUsingType, ObjCIvarRefExpr, ObjCInterfaceDecl>;
@@ -1785,7 +1779,7 @@ class LocMatcher : public MatcherInterface<TLoc> {
private:
static DynTypedNode extract(const NestedNameSpecifierLoc &Loc) {
- return DynTypedNode::create(*Loc.getNestedNameSpecifier());
+ return DynTypedNode::create(Loc.getNestedNameSpecifier());
}
};
diff --git a/clang/include/clang/Analysis/FlowSensitive/ASTOps.h b/clang/include/clang/Analysis/FlowSensitive/ASTOps.h
index 8c7ee86d15c06..a404b06cd62ca 100644
--- a/clang/include/clang/Analysis/FlowSensitive/ASTOps.h
+++ b/clang/include/clang/Analysis/FlowSensitive/ASTOps.h
@@ -112,8 +112,14 @@ class AnalysisASTVisitor : public DynamicRecursiveASTVisitor {
// fields that are only used in these.
// Note: The operand of the `noexcept` operator is an unevaluated operand, but
// nevertheless it appears in the Clang CFG, so we don't exclude it here.
- bool TraverseDecltypeTypeLoc(DecltypeTypeLoc) override { return true; }
- bool TraverseTypeOfExprTypeLoc(TypeOfExprTypeLoc) override { return true; }
+ bool TraverseDecltypeTypeLoc(DecltypeTypeLoc,
+ bool TraverseQualifier) override {
+ return true;
+ }
+ bool TraverseTypeOfExprTypeLoc(TypeOfExprTypeLoc,
+ bool TraverseQualifier) override {
+ return true;
+ }
bool TraverseCXXTypeidExpr(CXXTypeidExpr *TIE) override {
if (TIE->isPotentiallyEvaluated())
return DynamicRecursiveASTVisitor::TraverseCXXTypeidExpr(TIE);
diff --git a/clang/include/clang/Basic/DeclNodes.td b/clang/include/clang/Basic/DeclNodes.td
index f1ebaf1db3fc0..b4c02949426a1 100644
--- a/clang/include/clang/Basic/DeclNodes.td
+++ b/clang/include/clang/Basic/DeclNodes.td
@@ -15,81 +15,80 @@ def PragmaComment : DeclNode<Decl>;
def PragmaDetectMismatch : DeclNode<Decl>;
def ExternCContext : DeclNode<Decl>, DeclContext;
def Named : DeclNode<Decl, "named declarations", 1>;
- def Namespace : DeclNode<Named, "namespaces">, DeclContext;
- def UsingDirective : DeclNode<Named>;
- def NamespaceAlias : DeclNode<Named>;
- def Label : DeclNode<Named, "labels">;
- def Type : DeclNode<Named, "types", 1>;
- def TypedefName : DeclNode<Type, "typedefs", 1>;
- def Typedef : DeclNode<TypedefName>;
- def TypeAlias : DeclNode<TypedefName>;
- def ObjCTypeParam : DeclNode<TypedefName>;
- def UnresolvedUsingTypename : DeclNode<Type>;
- def Tag : DeclNode<Type, "tag types", 1>, DeclContext;
- def Enum : DeclNode<Tag, "enums">;
- def Record : DeclNode<Tag, "structs, unions, classes">;
- def CXXRecord : DeclNode<Record, "classes">;
- def ClassTemplateSpecialization : DeclNode<CXXRecord>;
- def ClassTemplatePartialSpecialization
- : DeclNode<ClassTemplateSpecialization>;
- def TemplateTypeParm : DeclNode<Type>;
- def Value : DeclNode<Named, "value declarations", 1>;
- def EnumConstant : DeclNode<Value, "enumerators">;
- def UnresolvedUsingValue : DeclNode<Value>;
- def IndirectField : DeclNode<Value>;
- def Binding : DeclNode<Value>;
- def OMPDeclareReduction : DeclNode<Value>, DeclContext;
- def OMPDeclareMapper : DeclNode<Value>, DeclContext;
- def MSGuid : DeclNode<Value>;
- def UnnamedGlobalConstant : DeclNode<Value>;
- def TemplateParamObject : DeclNode<Value>;
- def Declarator : DeclNode<Value, "declarators", 1>;
- def Field : DeclNode<Declarator, "non-static data members">;
- def ObjCIvar : DeclNode<Field>;
- def ObjCAtDefsField : DeclNode<Field>;
- def MSProperty : DeclNode<Declarator>;
- def Function : DeclNode<Declarator, "functions">, DeclContext;
- def CXXDeductionGuide : DeclNode<Function>;
- def CXXMethod : DeclNode<Function>;
- def CXXConstructor : DeclNode<CXXMethod>;
- def CXXDestructor : DeclNode<CXXMethod>;
- def CXXConversion : DeclNode<CXXMethod>;
- def Var : DeclNode<Declarator, "variables">;
- def VarTemplateSpecialization : DeclNode<Var>;
- def VarTemplatePartialSpecialization
- : DeclNode<VarTemplateSpecialization>;
- def ImplicitParam : DeclNode<Var>;
- def ParmVar : DeclNode<Var, "parameters">;
- def Decomposition : DeclNode<Var>;
- def OMPCapturedExpr : DeclNode<Var>;
- def NonTypeTemplateParm : DeclNode<Declarator>;
- def Template : DeclNode<Named, "templates", 1>;
- def RedeclarableTemplate : DeclNode<Template, "redeclarable templates", 1>;
- def FunctionTemplate : DeclNode<RedeclarableTemplate>;
- def ClassTemplate : DeclNode<RedeclarableTemplate>;
- def VarTemplate : DeclNode<RedeclarableTemplate>;
- def TypeAliasTemplate : DeclNode<RedeclarableTemplate>;
- def TemplateTemplateParm : DeclNode<Template>;
- def BuiltinTemplate : DeclNode<Template>;
- def Concept : DeclNode<Template>;
- def BaseUsing : DeclNode<Named, "", 1>;
- def Using : DeclNode<BaseUsing>;
- def UsingEnum : DeclNode<BaseUsing>;
- def UsingPack : DeclNode<Named>;
- def UsingShadow : DeclNode<Named>;
- def ConstructorUsingShadow : DeclNode<UsingShadow>;
- def UnresolvedUsingIfExists : DeclNode<Named>;
- def ObjCMethod : DeclNode<Named, "Objective-C methods">, DeclContext;
- def ObjCContainer : DeclNode<Named, "Objective-C containers", 1>, DeclContext;
- def ObjCCategory : DeclNode<ObjCContainer>;
- def ObjCProtocol : DeclNode<ObjCContainer, "Objective-C protocols">;
- def ObjCInterface : DeclNode<ObjCContainer, "Objective-C interfaces">;
- def ObjCImpl
- : DeclNode<ObjCContainer, "Objective-C implementation declarations", 1>;
- def ObjCCategoryImpl : DeclNode<ObjCImpl>;
- def ObjCImplementation : DeclNode<ObjCImpl>;
- def ObjCProperty : DeclNode<Named, "Objective-C properties">;
- def ObjCCompatibleAlias : DeclNode<Named>;
+def NamespaceBase : DeclNode<Named, "namespace declarations", 1>;
+def Namespace : DeclNode<NamespaceBase, "namespaces">, DeclContext;
+def NamespaceAlias : DeclNode<NamespaceBase>;
+def UsingDirective : DeclNode<Named>;
+def Label : DeclNode<Named, "labels">;
+def Type : DeclNode<Named, "types", 1>;
+def TypedefName : DeclNode<Type, "typedefs", 1>;
+def Typedef : DeclNode<TypedefName>;
+def TypeAlias : DeclNode<TypedefName>;
+def ObjCTypeParam : DeclNode<TypedefName>;
+def UnresolvedUsingTypename : DeclNode<Type>;
+def Tag : DeclNode<Type, "tag types", 1>, DeclContext;
+def Enum : DeclNode<Tag, "enums">;
+def Record : DeclNode<Tag, "structs, unions, classes">;
+def CXXRecord : DeclNode<Record, "classes">;
+def ClassTemplateSpecialization : DeclNode<CXXRecord>;
+def ClassTemplatePartialSpecialization : DeclNode<ClassTemplateSpecialization>;
+def TemplateTypeParm : DeclNode<Type>;
+def Value : DeclNode<Named, "value declarations", 1>;
+def EnumConstant : DeclNode<Value, "enumerators">;
+def UnresolvedUsingValue : DeclNode<Value>;
+def IndirectField : DeclNode<Value>;
+def Binding : DeclNode<Value>;
+def OMPDeclareReduction : DeclNode<Value>, DeclContext;
+def OMPDeclareMapper : DeclNode<Value>, DeclContext;
+def MSGuid : DeclNode<Value>;
+def UnnamedGlobalConstant : DeclNode<Value>;
+def TemplateParamObject : DeclNode<Value>;
+def Declarator : DeclNode<Value, "declarators", 1>;
+def Field : DeclNode<Declarator, "non-static data members">;
+def ObjCIvar : DeclNode<Field>;
+def ObjCAtDefsField : DeclNode<Field>;
+def MSProperty : DeclNode<Declarator>;
+def Function : DeclNode<Declarator, "functions">, DeclContext;
+def CXXDeductionGuide : DeclNode<Function>;
+def CXXMethod : DeclNode<Function>;
+def CXXConstructor : DeclNode<CXXMethod>;
+def CXXDestructor : DeclNode<CXXMethod>;
+def CXXConversion : DeclNode<CXXMethod>;
+def Var : DeclNode<Declarator, "variables">;
+def VarTemplateSpecialization : DeclNode<Var>;
+def VarTemplatePartialSpecialization : DeclNode<VarTemplateSpecialization>;
+def ImplicitParam : DeclNode<Var>;
+def ParmVar : DeclNode<Var, "parameters">;
+def Decomposition : DeclNode<Var>;
+def OMPCapturedExpr : DeclNode<Var>;
+def NonTypeTemplateParm : DeclNode<Declarator>;
+def Template : DeclNode<Named, "templates", 1>;
+def RedeclarableTemplate : DeclNode<Template, "redeclarable templates", 1>;
+def FunctionTemplate : DeclNode<RedeclarableTemplate>;
+def ClassTemplate : DeclNode<RedeclarableTemplate>;
+def VarTemplate : DeclNode<R...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/148012
More information about the llvm-branch-commits
mailing list