diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -4114,6 +4114,22 @@ InnerMatcher.matches(*Initializer, Finder, Builder)); } +/// \brief Matches a variable initializer is a direct-initializer. +/// +/// Example matches i1, but not i2, i3 or i4 +/// (matcher = varDecl(isStaticLocal())) +/// \code +/// void f() { +/// int i1 = 3; +/// int i2(3); +/// int i3{3}; +/// int i4; +/// } +/// \endcode +AST_MATCHER(VarDecl, isDirectInit) { + return Node.isDirectInit(); +} + /// \brief Matches a static variable with local scope. /// /// Example matches y (matcher = varDecl(isStaticLocal())) diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -1439,6 +1439,20 @@ EXPECT_TRUE(notMatches("int X;", M)); } +TEST_P(ASTMatchersTest, IsDirectInit) { + auto M = varDecl(isDirectInit()); + EXPECT_TRUE(notMatches("int i1 = 3;", M)); + if (!GetParam().isCXX()) { + return; + } + EXPECT_TRUE(matches("int i2(3);", M)); + if (!GetParam().isCXX11OrLater()) { + return; + } + EXPECT_TRUE(matches("int i3{3};", M)); + EXPECT_TRUE(notMatches("int i4;", M)); +} + TEST_P(ASTMatchersTest, StorageDuration) { StringRef T = "void f() { int x; static int y; } int a;static int b;extern int c;";