aaron.ballman added a comment. > Previously if you wanted to match the statement associated with a case, > default, or labelled statement, you had to use hasDescendant.
This isn't true. You can use `has()` to do direct substatemematching, and I'm wondering whether we need this new matcher at all. e.g., https://godbolt.org/z/K5sYP757r ================ Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2432 dependentCoawaitExpr; + /// Matches co_yield expressions. ---------------- Spurious newline? ================ Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:7720 +/// Matches the substatement associated with a case, default or label statement. +/// ---------------- May need to reformat as well, but the intent is to make it clear that this does not behave like `hasAnySubstatement()`. ================ Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:7727 +/// foo: return; +/// bar: break; +/// \endcode ---------------- This is invalid code (there's nothing to break out of), so you may want to tweak the example a bit. ================ Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:7730-7734 +/// caseStmt(hasSubstmt(returnStmt())) +/// matches "case 2: return;" +/// defaultStmt(hasSubstmt(returnStmt())) +/// matches "default: return;" +/// labelStmt(hasSubstmt(breakStmt())) ---------------- ================ Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:7737-7738 +AST_POLYMORPHIC_MATCHER_P(hasSubstatement, + AST_POLYMORPHIC_SUPPORTED_TYPES(CaseStmt, DefaultStmt, + LabelStmt), + internal::Matcher<Stmt>, InnerMatcher) { ---------------- Pretty sure you can use the base class here as a simplification. ================ Comment at: clang/lib/ASTMatchers/Dynamic/Registry.cpp:69 registerMatcher(#name, internal::makeMatcherAutoMarshall( \ - ::clang::ast_matchers::name, #name)); + ::clang::ast_matchers::name, #name)) ---------------- Good catch; feel free to land this and related changes as an NFC commit. ================ Comment at: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp:161 +TEST_P(ASTMatchersTest, HasLabelSubstmt) { + EXPECT_TRUE(matches("void f() { while (1) { bar: break; foo: return; } }", + traverse(TK_AsIs, labelStmt(hasSubstatement(breakStmt()))))); ---------------- Should fix the formatting. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D116328/new/ https://reviews.llvm.org/D116328 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits