njames93 created this revision. Herald added subscribers: cfe-commits, dexonsmith, steven_wu, hiraditya, mehdi_amini. Herald added a project: clang. njames93 added a reviewer: aaron.ballman.
Adds a traversal matcher called `isPlacement` that matches on `placement new` operators. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D73562 Files: clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp clang/docs/LibASTMatchersReference.html clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -3124,5 +3124,37 @@ EXPECT_TRUE(notMatches("template<typename T> class A {};", Matcher)); } +TEST(CXXNewExpr, Array) { + StatementMatcher NewArray = cxxNewExpr(isArray()); + + EXPECT_TRUE(matches("void foo() { int *Ptr = new int[10]; }", NewArray)); + EXPECT_TRUE(notMatches("void foo() { int *Ptr = new int; }", NewArray)); + + StatementMatcher NewArraySize10 = + cxxNewExpr(hasArraySize(integerLiteral(equals(10)))); + EXPECT_TRUE( + matches("void foo() { int *Ptr = new int[10]; }", NewArraySize10)); + EXPECT_TRUE( + notMatches("void foo() { int *Ptr = new int[20]; }", NewArraySize10)); +} + +TEST(CXXNewExpr, IsPlacement) { + StatementMatcher PlacementNew = cxxNewExpr(isPlacement()); + + EXPECT_TRUE(matches(R"( + void* operator new(decltype(sizeof(void*)), void*); + int *foo(void* Storage) { + return new (Storage) int; + })", + PlacementNew)); + + EXPECT_TRUE(notMatches(R"( + void* operator new(decltype(sizeof(void*)), void*); + int *foo(void* Storage) { + return new int; + })", + PlacementNew)); +} + } // namespace ast_matchers } // namespace clang Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -394,6 +394,7 @@ REGISTER_MATCHER(isNoneKind); REGISTER_MATCHER(isOMPStructuredBlock); REGISTER_MATCHER(isOverride); + REGISTER_MATCHER(isPlacement) REGISTER_MATCHER(isPrivate); REGISTER_MATCHER(isProtected); REGISTER_MATCHER(isPublic); Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -6752,6 +6752,16 @@ return Node.isArray(); } +/// Matches placement new expressions. +/// +/// Given: +/// \code +/// MyClass *p1 = new (Storage) MyClass(); +/// \endcode +/// cxxNewExpr(isPlacement()) +/// matches the expression 'new (Storage) MyClass()'. +AST_MATCHER(CXXNewExpr, isPlacement) { return Node.getNumPlacementArgs() > 0; } + /// Matches array new expressions with a given array size. /// /// Given: Index: clang/docs/LibASTMatchersReference.html =================================================================== --- clang/docs/LibASTMatchersReference.html +++ clang/docs/LibASTMatchersReference.html @@ -2547,6 +2547,16 @@ </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isPlacement0')"><a name="isPlacement0Anchor">isPlacement</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isPlacement0"><pre>Matches placement new expressions. + +Given: + MyClass *p1 = new (Storage) MyClass(); +cxxNewExpr(isPlacement()) + matches the expression 'new (Storage) MyClass()'. +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. Index: clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -91,7 +91,7 @@ hasArgument(0, cxxNewExpr(hasType(pointsTo(qualType(hasCanonicalType( equalsBoundNode(PointerType))))), - CanCallCtor) + CanCallCtor, unless(isPlacement())) .bind(NewExpression)), unless(isInTemplateInstantiation())) .bind(ConstructorCall)))), @@ -101,7 +101,8 @@ cxxMemberCallExpr( thisPointerType(getSmartPointerTypeMatcher()), callee(cxxMethodDecl(hasName("reset"))), - hasArgument(0, cxxNewExpr(CanCallCtor).bind(NewExpression)), + hasArgument(0, cxxNewExpr(CanCallCtor, unless(isPlacement())) + .bind(NewExpression)), unless(isInTemplateInstantiation())) .bind(ResetCall), this); @@ -119,8 +120,6 @@ const auto *Type = Result.Nodes.getNodeAs<QualType>(PointerType); const auto *New = Result.Nodes.getNodeAs<CXXNewExpr>(NewExpression); - if (New->getNumPlacementArgs() != 0) - return; // Skip when this is a new-expression with `auto`, e.g. new auto(1) if (New->getType()->getPointeeType()->getContainedAutoType()) return; Index: clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp +++ clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp @@ -16,16 +16,12 @@ namespace tidy { namespace cert { -AST_MATCHER(CXXNewExpr, isPlacementNew) { - return Node.getNumPlacementArgs() > 0; -} - void DefaultOperatorNewAlignmentCheck::registerMatchers(MatchFinder *Finder) { // Check not applicable in C++17 (or newer). if (getLangOpts().CPlusPlus17) return; - Finder->addMatcher(cxxNewExpr(unless(isPlacementNew())).bind("new"), this); + Finder->addMatcher(cxxNewExpr(unless(isPlacement())).bind("new"), this); } void DefaultOperatorNewAlignmentCheck::check(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits