llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-powerpc
@llvm/pr-subscribers-hlsl

@llvm/pr-subscribers-backend-webassembly

Author: Matheus Izvekov (mizvekov)

<details>
<summary>Changes</summary>

Other changes

Second patch in the series starting at 
https://github.com/llvm/llvm-project/pull/147835

---

Patch is 800.27 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/148012.diff


173 Files Affected:

- (modified) clang/include/clang/ASTMatchers/ASTMatchers.h (+66-91) 
- (modified) clang/include/clang/ASTMatchers/ASTMatchersInternal.h (+7-13) 
- (modified) clang/include/clang/Analysis/FlowSensitive/ASTOps.h (+8-2) 
- (modified) clang/include/clang/Basic/DeclNodes.td (+74-75) 
- (modified) clang/include/clang/Basic/TypeNodes.td (+1-2) 
- (modified) clang/include/clang/ExtractAPI/DeclarationFragments.h (+2-3) 
- (modified) clang/include/clang/Sema/CodeCompleteConsumer.h (+4-3) 
- (modified) clang/include/clang/Sema/DeclSpec.h (+9-39) 
- (modified) clang/include/clang/Sema/HeuristicResolver.h (+1-2) 
- (modified) clang/include/clang/Sema/ParsedTemplate.h (+16-10) 
- (modified) clang/include/clang/Sema/Sema.h (+17-21) 
- (modified) clang/include/clang/Sema/SemaInternal.h (+4-4) 
- (modified) clang/include/clang/Sema/TypoCorrection.h (+15-14) 
- (modified) clang/include/clang/Serialization/ASTRecordReader.h (+1-1) 
- (modified) clang/include/clang/Serialization/ASTRecordWriter.h (+2-3) 
- (modified) clang/include/clang/Serialization/TypeBitCodes.def (-1) 
- (modified) clang/include/clang/Tooling/Refactoring/Lookup.h (+1-2) 
- (modified) clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h 
(+9-6) 
- (modified) clang/lib/ASTMatchers/ASTMatchFinder.cpp (+63-52) 
- (modified) clang/lib/ASTMatchers/ASTMatchersInternal.cpp (+2-3) 
- (modified) clang/lib/ASTMatchers/Dynamic/Registry.cpp (+1-4) 
- (modified) clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp (+4-2) 
- (modified) clang/lib/Analysis/ThreadSafety.cpp (+3-1) 
- (modified) clang/lib/Analysis/ThreadSafetyCommon.cpp (+2-2) 
- (modified) clang/lib/Analysis/UnsafeBufferUsage.cpp (+8-4) 
- (modified) clang/lib/CodeGen/ABIInfo.cpp (+1-1) 
- (modified) clang/lib/CodeGen/ABIInfoImpl.cpp (+18-18) 
- (modified) clang/lib/CodeGen/CGBlocks.cpp (+2-1) 
- (modified) clang/lib/CodeGen/CGCUDANV.cpp (+2-1) 
- (modified) clang/lib/CodeGen/CGCXX.cpp (+10-9) 
- (modified) clang/lib/CodeGen/CGCXXABI.cpp (+2-2) 
- (modified) clang/lib/CodeGen/CGCall.cpp (+16-11) 
- (modified) clang/lib/CodeGen/CGClass.cpp (+56-39) 
- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+65-62) 
- (modified) clang/lib/CodeGen/CGDecl.cpp (+9-4) 
- (modified) clang/lib/CodeGen/CGExpr.cpp (+29-16) 
- (modified) clang/lib/CodeGen/CGExprAgg.cpp (+17-8) 
- (modified) clang/lib/CodeGen/CGExprCXX.cpp (+20-17) 
- (modified) clang/lib/CodeGen/CGExprConstant.cpp (+21-8) 
- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+7-4) 
- (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+1-2) 
- (modified) clang/lib/CodeGen/CGNonTrivialStruct.cpp (+6-3) 
- (modified) clang/lib/CodeGen/CGObjC.cpp (+3-1) 
- (modified) clang/lib/CodeGen/CGObjCMac.cpp (+6-5) 
- (modified) clang/lib/CodeGen/CGObjCRuntime.cpp (+3-1) 
- (modified) clang/lib/CodeGen/CGOpenMPRuntime.cpp (+21-14) 
- (modified) clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp (+2-2) 
- (modified) clang/lib/CodeGen/CGPointerAuth.cpp (+1-1) 
- (modified) clang/lib/CodeGen/CGStmt.cpp (+2-2) 
- (modified) clang/lib/CodeGen/CGStmtOpenMP.cpp (+6-3) 
- (modified) clang/lib/CodeGen/CGVTables.cpp (+4-4) 
- (modified) clang/lib/CodeGen/CodeGenFunction.cpp (+3-5) 
- (modified) clang/lib/CodeGen/CodeGenFunction.h (+3-3) 
- (modified) clang/lib/CodeGen/CodeGenModule.cpp (+17-11) 
- (modified) clang/lib/CodeGen/CodeGenTBAA.cpp (+7-6) 
- (modified) clang/lib/CodeGen/CodeGenTypes.cpp (+20-13) 
- (modified) clang/lib/CodeGen/HLSLBufferLayoutBuilder.cpp (+2-1) 
- (modified) clang/lib/CodeGen/ItaniumCXXABI.cpp (+40-28) 
- (modified) clang/lib/CodeGen/MicrosoftCXXABI.cpp (+13-12) 
- (modified) clang/lib/CodeGen/SwiftCallingConv.cpp (+5-4) 
- (modified) clang/lib/CodeGen/Targets/AArch64.cpp (+5-4) 
- (modified) clang/lib/CodeGen/Targets/AMDGPU.cpp (+3-3) 
- (modified) clang/lib/CodeGen/Targets/ARC.cpp (+3-2) 
- (modified) clang/lib/CodeGen/Targets/ARM.cpp (+5-4) 
- (modified) clang/lib/CodeGen/Targets/BPF.cpp (+3-2) 
- (modified) clang/lib/CodeGen/Targets/CSKY.cpp (+1-1) 
- (modified) clang/lib/CodeGen/Targets/Hexagon.cpp (+3-2) 
- (modified) clang/lib/CodeGen/Targets/Lanai.cpp (+3-2) 
- (modified) clang/lib/CodeGen/Targets/LoongArch.cpp (+6-4) 
- (modified) clang/lib/CodeGen/Targets/Mips.cpp (+4-4) 
- (modified) clang/lib/CodeGen/Targets/NVPTX.cpp (+3-3) 
- (modified) clang/lib/CodeGen/Targets/PNaCl.cpp (+2-2) 
- (modified) clang/lib/CodeGen/Targets/PPC.cpp (+5-3) 
- (modified) clang/lib/CodeGen/Targets/RISCV.cpp (+6-4) 
- (modified) clang/lib/CodeGen/Targets/SPIR.cpp (+3-3) 
- (modified) clang/lib/CodeGen/Targets/Sparc.cpp (+1-1) 
- (modified) clang/lib/CodeGen/Targets/SystemZ.cpp (+4-4) 
- (modified) clang/lib/CodeGen/Targets/WebAssembly.cpp (+2-1) 
- (modified) clang/lib/CodeGen/Targets/X86.cpp (+35-24) 
- (modified) clang/lib/CodeGen/Targets/XCore.cpp (+2-2) 
- (modified) clang/lib/ExtractAPI/DeclarationFragments.cpp (+57-60) 
- (modified) clang/lib/ExtractAPI/TypedefUnderlyingTypeResolver.cpp (+1-1) 
- (modified) clang/lib/Frontend/ASTConsumers.cpp (+5-2) 
- (modified) clang/lib/Frontend/ASTUnit.cpp (+1-1) 
- (modified) clang/lib/Index/IndexTypeSourceInfo.cpp (+20-32) 
- (modified) clang/lib/Index/USRGeneration.cpp (+9-9) 
- (modified) clang/lib/InstallAPI/Visitor.cpp (+4-4) 
- (modified) clang/lib/Interpreter/InterpreterValuePrinter.cpp (+1-1) 
- (modified) clang/lib/Interpreter/Value.cpp (+3-3) 
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+1-2) 
- (modified) clang/lib/Parse/ParseExprCXX.cpp (+8-5) 
- (modified) clang/lib/Parse/ParseTemplate.cpp (+17-12) 
- (modified) clang/lib/Parse/ParseTentative.cpp (+1-1) 
- (modified) clang/lib/Parse/Parser.cpp (+5-4) 
- (modified) clang/lib/Sema/AnalysisBasedWarnings.cpp (+4-7) 
- (modified) clang/lib/Sema/DeclSpec.cpp (+5-31) 
- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp (+4-19) 
- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h (+1-1) 
- (modified) clang/lib/Sema/HeuristicResolver.cpp (+23-27) 
- (modified) clang/lib/Sema/Sema.cpp (+12-9) 
- (modified) clang/lib/Sema/SemaAccess.cpp (+21-22) 
- (modified) clang/lib/Sema/SemaAvailability.cpp (+2-2) 
- (modified) clang/lib/Sema/SemaBPF.cpp (+3-3) 
- (modified) clang/lib/Sema/SemaCUDA.cpp (+5-2) 
- (modified) clang/lib/Sema/SemaCXXScopeSpec.cpp (+184-147) 
- (modified) clang/lib/Sema/SemaCast.cpp (+25-26) 
- (modified) clang/lib/Sema/SemaChecking.cpp (+62-35) 
- (modified) clang/lib/Sema/SemaCodeComplete.cpp (+102-79) 
- (modified) clang/lib/Sema/SemaCoroutine.cpp (+16-19) 
- (modified) clang/lib/Sema/SemaDecl.cpp (+337-254) 
- (modified) clang/lib/Sema/SemaDeclAttr.cpp (+15-8) 
- (modified) clang/lib/Sema/SemaDeclCXX.cpp (+246-238) 
- (modified) clang/lib/Sema/SemaDeclObjC.cpp (+20-12) 
- (modified) clang/lib/Sema/SemaExceptionSpec.cpp (+3-2) 
- (modified) clang/lib/Sema/SemaExpr.cpp (+70-55) 
- (modified) clang/lib/Sema/SemaExprCXX.cpp (+85-77) 
- (modified) clang/lib/Sema/SemaExprMember.cpp (+4-3) 
- (modified) clang/lib/Sema/SemaExprObjC.cpp (+8-7) 
- (modified) clang/lib/Sema/SemaFunctionEffects.cpp (+6-2) 
- (modified) clang/lib/Sema/SemaHLSL.cpp (+11-9) 
- (modified) clang/lib/Sema/SemaInit.cpp (+78-67) 
- (modified) clang/lib/Sema/SemaLambda.cpp (+4-4) 
- (modified) clang/lib/Sema/SemaLookup.cpp (+152-88) 
- (modified) clang/lib/Sema/SemaObjC.cpp (+3-2) 
- (modified) clang/lib/Sema/SemaObjCProperty.cpp (+3-1) 
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+8-5) 
- (modified) clang/lib/Sema/SemaOverload.cpp (+96-85) 
- (modified) clang/lib/Sema/SemaPPC.cpp (+4-2) 
- (modified) clang/lib/Sema/SemaSYCL.cpp (+1-1) 
- (modified) clang/lib/Sema/SemaStmt.cpp (+23-17) 
- (modified) clang/lib/Sema/SemaStmtAsm.cpp (+6-4) 
- (modified) clang/lib/Sema/SemaSwift.cpp (+3-2) 
- (modified) clang/lib/Sema/SemaTemplate.cpp (+258-286) 
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+71-91) 
- (modified) clang/lib/Sema/SemaTemplateDeductionGuide.cpp (+32-26) 
- (modified) clang/lib/Sema/SemaTemplateInstantiate.cpp (+75-109) 
- (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+37-47) 
- (modified) clang/lib/Sema/SemaTemplateVariadic.cpp (+21-18) 
- (modified) clang/lib/Sema/SemaType.cpp (+110-74) 
- (modified) clang/lib/Sema/SemaTypeTraits.cpp (+16-19) 
- (modified) clang/lib/Sema/UsedDeclVisitor.h (+4-3) 
- (modified) clang/lib/Serialization/ASTReader.cpp (+58-68) 
- (modified) clang/lib/Serialization/ASTReaderDecl.cpp (+8-20) 
- (modified) clang/lib/Serialization/ASTWriter.cpp (+58-55) 
- (modified) clang/lib/Serialization/ASTWriterDecl.cpp (+3-4) 
- (modified) clang/lib/Serialization/TemplateArgumentHasher.cpp (+2-6) 
- (modified) clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp (+1-1) 
- (modified) clang/lib/StaticAnalyzer/Checkers/CastSizeChecker.cpp (+1-1) 
- (modified) clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp 
(+1-1) 
- (modified) clang/lib/StaticAnalyzer/Checkers/EnumCastOutOfRangeChecker.cpp 
(+2-1) 
- (modified) clang/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp 
(+2-5) 
- (modified) clang/lib/StaticAnalyzer/Checkers/NonNullParamChecker.cpp (+3-1) 
- (modified) 
clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp (+1-4) 
- (modified) 
clang/lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp (+5-6) 
- (modified) clang/lib/StaticAnalyzer/Checkers/PaddingChecker.cpp (+7-9) 
- (modified) clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp 
(+2-2) 
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp 
(+10-23) 
- (modified) 
clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp 
(+2-6) 
- (modified) clang/lib/StaticAnalyzer/Core/CallEvent.cpp (+7-4) 
- (modified) clang/lib/StaticAnalyzer/Core/MemRegion.cpp (+2-2) 
- (modified) clang/lib/StaticAnalyzer/Core/RegionStore.cpp (+3-2) 
- (modified) clang/lib/StaticAnalyzer/Core/SValBuilder.cpp (+2-2) 
- (modified) clang/lib/Tooling/ASTDiff/ASTDiff.cpp (+7-6) 
- (modified) clang/lib/Tooling/Refactoring/Lookup.cpp (+2-12) 
- (modified) clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp (+92-75) 
- (modified) clang/lib/Tooling/Syntax/BuildTree.cpp (+85-87) 
- (modified) clang/lib/Tooling/Transformer/RangeSelector.cpp (+2-6) 
- (modified) clang/tools/libclang/CIndex.cpp (+64-115) 
- (modified) clang/tools/libclang/CIndexCodeCompletion.cpp (+2-2) 
- (modified) clang/tools/libclang/CXCursor.cpp (+1-7) 
- (modified) clang/tools/libclang/CXIndexDataConsumer.cpp (+17-8) 
- (modified) clang/tools/libclang/CXType.cpp (+16-20) 
- (modified) clang/tools/libclang/CursorVisitor.h (+2-2) 


``````````diff
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h 
b/clang/include/clang/ASTMatchers/ASTMatchers.h
index bae004896c11f..599155c5c9950 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -221,6 +221,19 @@ extern const internal::VariadicDynCastAllOfMatcher<Decl, 
TypedefNameDecl>
 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
     typeAliasDecl;
 
+/// \brief Matches shadow declarations introduced into a scope by a
+///        (resolved) using declaration.
+///
+/// Given
+/// \code
+///   namespace n { int f; }
+///   namespace declToImport { using n::f; }
+/// \endcode
+/// usingShadowDecl()
+///   matches \code f \endcode
+extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingShadowDecl>
+    usingShadowDecl;
+
 /// Matches type alias template declarations.
 ///
 /// typeAliasTemplateDecl() matches
@@ -3718,7 +3731,7 @@ extern const internal::VariadicOperatorMatcherFunc<1, 1> 
unless;
 ///   Matcher<MemberExpr>, Matcher<QualType>, Matcher<RecordType>,
 ///   Matcher<TagType>, Matcher<TemplateSpecializationType>,
 ///   Matcher<TemplateTypeParmType>, Matcher<TypedefType>,
-///   Matcher<UnresolvedUsingType>
+///   Matcher<UnresolvedUsingType>, Matcher<UsingType>
 inline internal::PolymorphicMatcher<
     internal::HasDeclarationMatcher,
     void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
@@ -4353,7 +4366,13 @@ AST_POLYMORPHIC_MATCHER_P(throughUsingDecl,
                           AST_POLYMORPHIC_SUPPORTED_TYPES(DeclRefExpr,
                                                           UsingType),
                           internal::Matcher<UsingShadowDecl>, Inner) {
-  const NamedDecl *FoundDecl = Node.getFoundDecl();
+  const NamedDecl *FoundDecl;
+  if constexpr (std::is_same_v<NodeType, UsingType>) {
+    FoundDecl = Node.getDecl();
+  } else {
+    static_assert(std::is_same_v<NodeType, DeclRefExpr>);
+    FoundDecl = Node.getFoundDecl();
+  }
   if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
     return Inner.matches(*UsingDecl, Finder, Builder);
   return false;
@@ -6982,37 +7001,6 @@ AST_POLYMORPHIC_MATCHER_P2(
          InnerMatcher.matches(Args[Index], Finder, Builder);
 }
 
-/// Matches C or C++ elaborated `TypeLoc`s.
-///
-/// Given
-/// \code
-///   struct s {};
-///   struct s ss;
-/// \endcode
-/// elaboratedTypeLoc()
-///   matches the `TypeLoc` of the variable declaration of `ss`.
-extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ElaboratedTypeLoc>
-    elaboratedTypeLoc;
-
-/// Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
-/// `InnerMatcher`.
-///
-/// Given
-/// \code
-///   template <typename T>
-///   class C {};
-///   class C<int> c;
-///
-///   class D {};
-///   class D d;
-/// \endcode
-/// elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
-///   matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
-AST_MATCHER_P(ElaboratedTypeLoc, hasNamedTypeLoc, internal::Matcher<TypeLoc>,
-              InnerMatcher) {
-  return InnerMatcher.matches(Node.getNamedTypeLoc(), Finder, Builder);
-}
-
 /// Matches type \c bool.
 ///
 /// Given
@@ -7279,7 +7267,7 @@ extern const AstTypeMatcher<DecltypeType> decltypeType;
 AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType,
                           AST_POLYMORPHIC_SUPPORTED_TYPES(AutoType));
 
-/// Matches \c DecltypeType or \c UsingType nodes to find the underlying type.
+/// Matches \c QualType nodes to find the underlying type.
 ///
 /// Given
 /// \code
@@ -7289,10 +7277,13 @@ AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, 
getDeducedType,
 /// decltypeType(hasUnderlyingType(isInteger()))
 ///   matches the type of "a"
 ///
-/// Usable as: Matcher<DecltypeType>, Matcher<UsingType>
-AST_TYPE_TRAVERSE_MATCHER(hasUnderlyingType, getUnderlyingType,
-                          AST_POLYMORPHIC_SUPPORTED_TYPES(DecltypeType,
-                                                          UsingType));
+/// Usable as: Matcher<QualType>
+AST_MATCHER_P(Type, hasUnderlyingType, internal::Matcher<QualType>, Inner) {
+  QualType QT = Node.getLocallyUnqualifiedSingleStepDesugaredType();
+  if (QT == QualType(&Node, 0))
+    return false;
+  return Inner.matches(QT, Finder, Builder);
+}
 
 /// Matches \c FunctionType nodes.
 ///
@@ -7571,27 +7562,7 @@ extern const AstTypeMatcher<RecordType> recordType;
 /// and \c c.
 extern const AstTypeMatcher<TagType> tagType;
 
-/// Matches types specified with an elaborated type keyword or with a
-/// qualified name.
-///
-/// Given
-/// \code
-///   namespace N {
-///     namespace M {
-///       class D {};
-///     }
-///   }
-///   class C {};
-///
-///   class C c;
-///   N::M::D d;
-/// \endcode
-///
-/// \c elaboratedType() matches the type of the variable declarations of both
-/// \c c and \c d.
-extern const AstTypeMatcher<ElaboratedType> elaboratedType;
-
-/// Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
+/// Matches Types whose qualifier, a NestedNameSpecifier,
 /// matches \c InnerMatcher if the qualifier exists.
 ///
 /// Given
@@ -7606,34 +7577,14 @@ extern const AstTypeMatcher<ElaboratedType> 
elaboratedType;
 ///
 /// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
 /// matches the type of the variable declaration of \c d.
-AST_MATCHER_P(ElaboratedType, hasQualifier,
-              internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
-  if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
-    return InnerMatcher.matches(*Qualifier, Finder, Builder);
+AST_MATCHER_P(Type, hasQualifier, internal::Matcher<NestedNameSpecifier>,
+              InnerMatcher) {
+  if (NestedNameSpecifier Qualifier = Node.getPrefix())
+    return InnerMatcher.matches(Qualifier, Finder, Builder);
 
   return false;
 }
 
-/// Matches ElaboratedTypes whose named type matches \c InnerMatcher.
-///
-/// Given
-/// \code
-///   namespace N {
-///     namespace M {
-///       class D {};
-///     }
-///   }
-///   N::M::D d;
-/// \endcode
-///
-/// \c elaboratedType(namesType(recordType(
-/// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
-/// declaration of \c d.
-AST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
-              InnerMatcher) {
-  return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
-}
-
 /// Matches types specified through a using declaration.
 ///
 /// Given
@@ -7802,7 +7753,7 @@ AST_MATCHER_FUNCTION_P_OVERLOAD(
 ///   matches "A::"
 AST_MATCHER_P(NestedNameSpecifier, specifiesType,
               internal::Matcher<QualType>, InnerMatcher) {
-  if (!Node.getAsType())
+  if (Node.getKind() != NestedNameSpecifier::Kind::Type)
     return false;
   return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
 }
@@ -7820,8 +7771,12 @@ AST_MATCHER_P(NestedNameSpecifier, specifiesType,
 ///   matches "A::"
 AST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
               internal::Matcher<TypeLoc>, InnerMatcher) {
-  return Node && Node.getNestedNameSpecifier()->getAsType() &&
-         InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
+  if (!Node)
+    return false;
+  TypeLoc TL = Node.getAsTypeLoc();
+  if (!TL)
+    return false;
+  return InnerMatcher.matches(TL, Finder, Builder);
 }
 
 /// Matches on the prefix of a \c NestedNameSpecifier.
@@ -7836,10 +7791,21 @@ AST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
 AST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
                        internal::Matcher<NestedNameSpecifier>, InnerMatcher,
                        0) {
-  const NestedNameSpecifier *NextNode = Node.getPrefix();
+  NestedNameSpecifier NextNode = std::nullopt;
+  switch (Node.getKind()) {
+  case NestedNameSpecifier::Kind::Namespace:
+    NextNode = Node.getAsNamespaceAndPrefix().Prefix;
+    break;
+  case NestedNameSpecifier::Kind::Type:
+    NextNode = Node.getAsType()->getPrefix();
+    break;
+  default:
+    break;
+  }
+
   if (!NextNode)
     return false;
-  return InnerMatcher.matches(*NextNode, Finder, Builder);
+  return InnerMatcher.matches(NextNode, Finder, Builder);
 }
 
 /// Matches on the prefix of a \c NestedNameSpecifierLoc.
@@ -7854,7 +7820,12 @@ AST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
 AST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
                        internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
                        1) {
-  NestedNameSpecifierLoc NextNode = Node.getPrefix();
+  NestedNameSpecifierLoc NextNode;
+  if (TypeLoc TL = Node.getAsTypeLoc())
+    NextNode = TL.getPrefix();
+  else
+    NextNode = Node.getAsNamespaceAndPrefix().Prefix;
+
   if (!NextNode)
     return false;
   return InnerMatcher.matches(NextNode, Finder, Builder);
@@ -7872,9 +7843,13 @@ AST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
 ///   matches "ns::"
 AST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
               internal::Matcher<NamespaceDecl>, InnerMatcher) {
-  if (!Node.getAsNamespace())
+  if (Node.getKind() != NestedNameSpecifier::Kind::Namespace)
+    return false;
+  const auto *Namespace =
+      dyn_cast<NamespaceDecl>(Node.getAsNamespaceAndPrefix().Namespace);
+  if (!Namespace)
     return false;
-  return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
+  return InnerMatcher.matches(*Namespace, Finder, Builder);
 }
 
 /// Matches attributes.
diff --git a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h 
b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
index 667a044abcef1..399af3d888551 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -1013,10 +1013,7 @@ class HasDeclarationMatcher : public MatcherInterface<T> 
{
     // First, for any types that have a declaration, extract the declaration 
and
     // match on it.
     if (const auto *S = dyn_cast<TagType>(&Node)) {
-      return matchesDecl(S->getDecl(), Finder, Builder);
-    }
-    if (const auto *S = dyn_cast<InjectedClassNameType>(&Node)) {
-      return matchesDecl(S->getDecl(), Finder, Builder);
+      return matchesDecl(S->getOriginalDecl(), Finder, Builder);
     }
     if (const auto *S = dyn_cast<TemplateTypeParmType>(&Node)) {
       return matchesDecl(S->getDecl(), Finder, Builder);
@@ -1027,6 +1024,9 @@ class HasDeclarationMatcher : public MatcherInterface<T> {
     if (const auto *S = dyn_cast<UnresolvedUsingType>(&Node)) {
       return matchesDecl(S->getDecl(), Finder, Builder);
     }
+    if (const auto *S = dyn_cast<UsingType>(&Node)) {
+      return matchesDecl(S->getDecl(), Finder, Builder);
+    }
     if (const auto *S = dyn_cast<ObjCObjectType>(&Node)) {
       return matchesDecl(S->getInterface(), Finder, Builder);
     }
@@ -1062,12 +1062,6 @@ class HasDeclarationMatcher : public MatcherInterface<T> 
{
                          Builder);
     }
 
-    // FIXME: We desugar elaborated types. This makes the assumption that users
-    // do never want to match on whether a type is elaborated - there are
-    // arguments for both sides; for now, continue desugaring.
-    if (const auto *S = dyn_cast<ElaboratedType>(&Node)) {
-      return matchesSpecialized(S->desugar(), Finder, Builder);
-    }
     // Similarly types found via using declarations.
     // These are *usually* meaningless sugar, and this matches the historical
     // behavior prior to the introduction of UsingType.
@@ -1207,8 +1201,8 @@ using AdaptativeDefaultToTypes =
 /// All types that are supported by HasDeclarationMatcher above.
 using HasDeclarationSupportedTypes =
     TypeList<CallExpr, CXXConstructExpr, CXXNewExpr, DeclRefExpr, EnumType,
-             ElaboratedType, InjectedClassNameType, LabelStmt, AddrLabelExpr,
-             MemberExpr, QualType, RecordType, TagType,
+             InjectedClassNameType, LabelStmt, AddrLabelExpr, MemberExpr,
+             QualType, RecordType, TagType, UsingType,
              TemplateSpecializationType, TemplateTypeParmType, TypedefType,
              UnresolvedUsingType, ObjCIvarRefExpr, ObjCInterfaceDecl>;
 
@@ -1785,7 +1779,7 @@ class LocMatcher : public MatcherInterface<TLoc> {
 
 private:
   static DynTypedNode extract(const NestedNameSpecifierLoc &Loc) {
-    return DynTypedNode::create(*Loc.getNestedNameSpecifier());
+    return DynTypedNode::create(Loc.getNestedNameSpecifier());
   }
 };
 
diff --git a/clang/include/clang/Analysis/FlowSensitive/ASTOps.h 
b/clang/include/clang/Analysis/FlowSensitive/ASTOps.h
index 8c7ee86d15c06..a404b06cd62ca 100644
--- a/clang/include/clang/Analysis/FlowSensitive/ASTOps.h
+++ b/clang/include/clang/Analysis/FlowSensitive/ASTOps.h
@@ -112,8 +112,14 @@ class AnalysisASTVisitor : public 
DynamicRecursiveASTVisitor {
   // fields that are only used in these.
   // Note: The operand of the `noexcept` operator is an unevaluated operand, 
but
   // nevertheless it appears in the Clang CFG, so we don't exclude it here.
-  bool TraverseDecltypeTypeLoc(DecltypeTypeLoc) override { return true; }
-  bool TraverseTypeOfExprTypeLoc(TypeOfExprTypeLoc) override { return true; }
+  bool TraverseDecltypeTypeLoc(DecltypeTypeLoc,
+                               bool TraverseQualifier) override {
+    return true;
+  }
+  bool TraverseTypeOfExprTypeLoc(TypeOfExprTypeLoc,
+                                 bool TraverseQualifier) override {
+    return true;
+  }
   bool TraverseCXXTypeidExpr(CXXTypeidExpr *TIE) override {
     if (TIE->isPotentiallyEvaluated())
       return DynamicRecursiveASTVisitor::TraverseCXXTypeidExpr(TIE);
diff --git a/clang/include/clang/Basic/DeclNodes.td 
b/clang/include/clang/Basic/DeclNodes.td
index f1ebaf1db3fc0..b4c02949426a1 100644
--- a/clang/include/clang/Basic/DeclNodes.td
+++ b/clang/include/clang/Basic/DeclNodes.td
@@ -15,81 +15,80 @@ def PragmaComment : DeclNode<Decl>;
 def PragmaDetectMismatch : DeclNode<Decl>;
 def ExternCContext : DeclNode<Decl>, DeclContext;
 def Named : DeclNode<Decl, "named declarations", 1>;
-  def Namespace : DeclNode<Named, "namespaces">, DeclContext;
-  def UsingDirective : DeclNode<Named>;
-  def NamespaceAlias : DeclNode<Named>;
-  def Label : DeclNode<Named, "labels">;
-  def Type : DeclNode<Named, "types", 1>;
-    def TypedefName : DeclNode<Type, "typedefs", 1>;
-      def Typedef : DeclNode<TypedefName>;
-      def TypeAlias : DeclNode<TypedefName>;
-      def ObjCTypeParam : DeclNode<TypedefName>;
-    def UnresolvedUsingTypename : DeclNode<Type>;
-    def Tag : DeclNode<Type, "tag types", 1>, DeclContext;
-      def Enum : DeclNode<Tag, "enums">;
-      def Record : DeclNode<Tag, "structs, unions, classes">;
-        def CXXRecord : DeclNode<Record, "classes">;
-          def ClassTemplateSpecialization : DeclNode<CXXRecord>;
-            def ClassTemplatePartialSpecialization
-              : DeclNode<ClassTemplateSpecialization>;
-    def TemplateTypeParm : DeclNode<Type>;
-  def Value : DeclNode<Named, "value declarations", 1>;
-    def EnumConstant : DeclNode<Value, "enumerators">;
-    def UnresolvedUsingValue : DeclNode<Value>;
-    def IndirectField : DeclNode<Value>;
-    def Binding : DeclNode<Value>;
-    def OMPDeclareReduction : DeclNode<Value>, DeclContext;
-    def OMPDeclareMapper : DeclNode<Value>, DeclContext;
-    def MSGuid : DeclNode<Value>;
-    def UnnamedGlobalConstant : DeclNode<Value>;
-    def TemplateParamObject : DeclNode<Value>;
-    def Declarator : DeclNode<Value, "declarators", 1>;
-      def Field : DeclNode<Declarator, "non-static data members">;
-        def ObjCIvar : DeclNode<Field>;
-        def ObjCAtDefsField : DeclNode<Field>;
-      def MSProperty : DeclNode<Declarator>;
-      def Function : DeclNode<Declarator, "functions">, DeclContext;
-        def CXXDeductionGuide : DeclNode<Function>;
-        def CXXMethod : DeclNode<Function>;
-          def CXXConstructor : DeclNode<CXXMethod>;
-          def CXXDestructor : DeclNode<CXXMethod>;
-          def CXXConversion : DeclNode<CXXMethod>;
-      def Var : DeclNode<Declarator, "variables">;
-        def VarTemplateSpecialization : DeclNode<Var>;
-          def VarTemplatePartialSpecialization
-            : DeclNode<VarTemplateSpecialization>;
-        def ImplicitParam : DeclNode<Var>;
-        def ParmVar : DeclNode<Var, "parameters">;
-        def Decomposition : DeclNode<Var>;
-        def OMPCapturedExpr : DeclNode<Var>;
-      def NonTypeTemplateParm : DeclNode<Declarator>;
-  def Template : DeclNode<Named, "templates", 1>;
-    def RedeclarableTemplate : DeclNode<Template, "redeclarable templates", 1>;
-      def FunctionTemplate : DeclNode<RedeclarableTemplate>;
-      def ClassTemplate : DeclNode<RedeclarableTemplate>;
-      def VarTemplate : DeclNode<RedeclarableTemplate>;
-      def TypeAliasTemplate : DeclNode<RedeclarableTemplate>;
-    def TemplateTemplateParm : DeclNode<Template>;
-    def BuiltinTemplate : DeclNode<Template>;
-    def Concept : DeclNode<Template>;
-  def BaseUsing : DeclNode<Named, "", 1>;
-    def Using : DeclNode<BaseUsing>;
-    def UsingEnum : DeclNode<BaseUsing>;
-  def UsingPack : DeclNode<Named>;
-  def UsingShadow : DeclNode<Named>;
-    def ConstructorUsingShadow : DeclNode<UsingShadow>;
-  def UnresolvedUsingIfExists : DeclNode<Named>;
-  def ObjCMethod : DeclNode<Named, "Objective-C methods">, DeclContext;
-  def ObjCContainer : DeclNode<Named, "Objective-C containers", 1>, 
DeclContext;
-    def ObjCCategory : DeclNode<ObjCContainer>;
-    def ObjCProtocol : DeclNode<ObjCContainer, "Objective-C protocols">;
-    def ObjCInterface : DeclNode<ObjCContainer, "Objective-C interfaces">;
-    def ObjCImpl
-        : DeclNode<ObjCContainer, "Objective-C implementation declarations", 
1>;
-      def ObjCCategoryImpl : DeclNode<ObjCImpl>;
-      def ObjCImplementation : DeclNode<ObjCImpl>;
-  def ObjCProperty : DeclNode<Named, "Objective-C properties">;
-  def ObjCCompatibleAlias : DeclNode<Named>;
+def NamespaceBase : DeclNode<Named, "namespace declarations", 1>;
+def Namespace : DeclNode<NamespaceBase, "namespaces">, DeclContext;
+def NamespaceAlias : DeclNode<NamespaceBase>;
+def UsingDirective : DeclNode<Named>;
+def Label : DeclNode<Named, "labels">;
+def Type : DeclNode<Named, "types", 1>;
+def TypedefName : DeclNode<Type, "typedefs", 1>;
+def Typedef : DeclNode<TypedefName>;
+def TypeAlias : DeclNode<TypedefName>;
+def ObjCTypeParam : DeclNode<TypedefName>;
+def UnresolvedUsingTypename : DeclNode<Type>;
+def Tag : DeclNode<Type, "tag types", 1>, DeclContext;
+def Enum : DeclNode<Tag, "enums">;
+def Record : DeclNode<Tag, "structs, unions, classes">;
+def CXXRecord : DeclNode<Record, "classes">;
+def ClassTemplateSpecialization : DeclNode<CXXRecord>;
+def ClassTemplatePartialSpecialization : DeclNode<ClassTemplateSpecialization>;
+def TemplateTypeParm : DeclNode<Type>;
+def Value : DeclNode<Named, "value declarations", 1>;
+def EnumConstant : DeclNode<Value, "enumerators">;
+def UnresolvedUsingValue : DeclNode<Value>;
+def IndirectField : DeclNode<Value>;
+def Binding : DeclNode<Value>;
+def OMPDeclareReduction : DeclNode<Value>, DeclContext;
+def OMPDeclareMapper : DeclNode<Value>, DeclContext;
+def MSGuid : DeclNode<Value>;
+def UnnamedGlobalConstant : DeclNode<Value>;
+def TemplateParamObject : DeclNode<Value>;
+def Declarator : DeclNode<Value, "declarators", 1>;
+def Field : DeclNode<Declarator, "non-static data members">;
+def ObjCIvar : DeclNode<Field>;
+def ObjCAtDefsField : DeclNode<Field>;
+def MSProperty : DeclNode<Declarator>;
+def Function : DeclNode<Declarator, "functions">, DeclContext;
+def CXXDeductionGuide : DeclNode<Function>;
+def CXXMethod : DeclNode<Function>;
+def CXXConstructor : DeclNode<CXXMethod>;
+def CXXDestructor : DeclNode<CXXMethod>;
+def CXXConversion : DeclNode<CXXMethod>;
+def Var : DeclNode<Declarator, "variables">;
+def VarTemplateSpecialization : DeclNode<Var>;
+def VarTemplatePartialSpecialization : DeclNode<VarTemplateSpecialization>;
+def ImplicitParam : DeclNode<Var>;
+def ParmVar : DeclNode<Var, "parameters">;
+def Decomposition : DeclNode<Var>;
+def OMPCapturedExpr : DeclNode<Var>;
+def NonTypeTemplateParm : DeclNode<Declarator>;
+def Template : DeclNode<Named, "templates", 1>;
+def RedeclarableTemplate : DeclNode<Template, "redeclarable templates", 1>;
+def FunctionTemplate : DeclNode<RedeclarableTemplate>;
+def ClassTemplate : DeclNode<RedeclarableTemplate>;
+def VarTemplate : DeclNode<R...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/148012
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to