Skip to content

[PATCH 2/4] [clang] Improve nested name specifier AST representation #148012

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: users/mizvekov/name-qualification-refactor
Choose a base branch
from

Conversation

mizvekov
Copy link
Contributor

Other changes

Second patch in the series starting at #147835

@mizvekov mizvekov self-assigned this Jul 10, 2025
@llvmbot llvmbot added clang Clang issues not falling into any other category backend:ARM backend:AArch64 backend:AMDGPU backend:Hexagon backend:MIPS backend:RISC-V backend:PowerPC backend:Sparc backend:SystemZ backend:WebAssembly backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:modules C++20 modules and Clang Header Modules clang:codegen IR generation bugs: mangling, exceptions, etc. clang:as-a-library libclang and C++ API clang:static analyzer debuginfo backend:CSKY HLSL HLSL Language Support coroutines C++20 coroutines labels Jul 10, 2025
@llvmbot llvmbot added clang:dataflow Clang Dataflow Analysis framework - https://clang.llvm.org/docs/DataFlowAnalysisIntro.html backend:ARC backend:loongarch clang:analysis clang:openmp OpenMP related changes to Clang backend:Lanai labels Jul 10, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-debuginfo
@llvm/pr-subscribers-clang-analysis
@llvm/pr-subscribers-backend-loongarch
@llvm/pr-subscribers-backend-powerpc
@llvm/pr-subscribers-hlsl

@llvm/pr-subscribers-backend-webassembly

Author: Matheus Izvekov (mizvekov)

Changes

Other changes

Second patch in the series starting at #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 --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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-clang-codegen

Author: Matheus Izvekov (mizvekov)

Changes

Other changes

Second patch in the series starting at #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 --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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-sparc

Author: Matheus Izvekov (mizvekov)

Changes

Other changes

Second patch in the series starting at #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 --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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-x86

Author: Matheus Izvekov (mizvekov)

Changes

Other changes

Second patch in the series starting at #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 --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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-mips

Author: Matheus Izvekov (mizvekov)

Changes

Other changes

Second patch in the series starting at #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 --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]

@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-backend-aarch64

Author: Matheus Izvekov (mizvekov)

Changes

Other changes

Second patch in the series starting at #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 --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]

@mizvekov mizvekov force-pushed the users/mizvekov/name-qualification-refactor branch from 374aefc to 8da8c53 Compare July 10, 2025 20:14
@mizvekov mizvekov force-pushed the users/mizvekov/name-qualification-refactor-2 branch from 1aae9f7 to ddaea06 Compare July 10, 2025 20:14
@mizvekov mizvekov force-pushed the users/mizvekov/name-qualification-refactor-2 branch from ddaea06 to b16b022 Compare July 11, 2025 00:05
@mizvekov mizvekov force-pushed the users/mizvekov/name-qualification-refactor branch from 8da8c53 to 7b74782 Compare July 11, 2025 00:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:AArch64 backend:AMDGPU backend:ARC backend:ARM backend:CSKY backend:Hexagon backend:Lanai backend:loongarch backend:MIPS backend:PowerPC backend:RISC-V backend:Sparc backend:SystemZ backend:WebAssembly backend:X86 clang:analysis clang:as-a-library libclang and C++ API clang:codegen IR generation bugs: mangling, exceptions, etc. clang:dataflow Clang Dataflow Analysis framework - https://clang.llvm.org/docs/DataFlowAnalysisIntro.html clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:modules C++20 modules and Clang Header Modules clang:openmp OpenMP related changes to Clang clang:static analyzer clang Clang issues not falling into any other category coroutines C++20 coroutines debuginfo HLSL HLSL Language Support
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants