https://github.com/higher-performance updated https://github.com/llvm/llvm-project/pull/90634
>From a58dbe94dde39b44065321fd2d3444332536c778 Mon Sep 17 00:00:00 2001 From: higher-performance <higher.performance.git...@gmail.com> Date: Tue, 30 Apr 2024 14:40:59 -0600 Subject: [PATCH] Add isTrivial() and isTriviallyCopyable() AST matchers --- clang/include/clang/ASTMatchers/ASTMatchers.h | 37 +++++++++++++++++++ .../ASTMatchers/ASTMatchersNarrowingTest.cpp | 27 ++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 8a2bbfff9e9e6..e3a286d23cb54 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -5442,6 +5442,43 @@ AST_MATCHER(FunctionDecl, isDefaulted) { return Node.isDefaulted(); } +/// Matches trivial methods and types. +/// +/// Given: +/// \code +/// class A { A(); }; +/// A::A() = default; +/// class B { B() = default; }; +/// \endcode +/// cxxMethodDecl(isTrivial()) +/// matches the declaration of B, but not A. +AST_POLYMORPHIC_MATCHER(isTrivial, + AST_POLYMORPHIC_SUPPORTED_TYPES(CXXMethodDecl, + CXXRecordDecl)) { + if (const auto *E = dyn_cast<CXXMethodDecl>(&Node)) + return E->isTrivial(); + if (const auto *E = dyn_cast<CXXRecordDecl>(&Node)) { + const auto *Def = Node.getDefinition(); + return Def && Def->isTrivial(); + } + return false; +} + +/// Matches trivially copyable types. +/// +/// Given: +/// \code +/// class A { A(const A &); }; +/// A::A(const A &) = default; +/// class B { B(const B &) = default; }; +/// \endcode +/// cxxMethodDecl(isTriviallyCopyable()) +/// matches the declaration of B, but not A. +AST_MATCHER(CXXRecordDecl, isTriviallyCopyable) { + CXXRecordDecl *Def = Node.getDefinition(); + return Def && Def->isTriviallyCopyable(); +} + /// Matches weak function declarations. /// /// Given: diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index 87774b00956a5..9c648588ba970 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -1849,6 +1849,33 @@ TEST_P(ASTMatchersTest, IsDeleted) { functionDecl(hasName("Func"), isDeleted()))); } +TEST_P(ASTMatchersTest, IsTrivial) { + if (!GetParam().isCXX()) { + return; + } + + EXPECT_TRUE(notMatches("class A { A(); };", + cxxRecordDecl(hasName("A"), isTrivial()))); + EXPECT_TRUE(matches("class B { B() = default; };", + cxxRecordDecl(hasName("B"), isTrivial()))); + + EXPECT_TRUE(notMatches("class A { ~A(); }; A::~A() = default;", + cxxMethodDecl(hasName("~A"), isTrivial()))); + EXPECT_TRUE(matches("class B { ~B() = default; };", + cxxMethodDecl(hasName("~B"), isTrivial()))); +} + +TEST_P(ASTMatchersTest, IsTriviallyCopyable) { + if (!GetParam().isCXX()) { + return; + } + + EXPECT_TRUE(notMatches("class A { ~A(); }; A::~A() = default;", + cxxRecordDecl(hasName("A"), isTriviallyCopyable()))); + EXPECT_TRUE(matches("class B { ~B() = default; };", + cxxRecordDecl(hasName("B"), isTriviallyCopyable()))); +} + TEST_P(ASTMatchersTest, IsNoThrow_DynamicExceptionSpec) { if (!GetParam().supportsCXXDynamicExceptionSpecification()) { return; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits