diff --git a/clang-tools-extra/clangd/refactor/tweaks/SpecialMembers.cpp b/clang-tools-extra/clangd/refactor/tweaks/SpecialMembers.cpp --- a/clang-tools-extra/clangd/refactor/tweaks/SpecialMembers.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/SpecialMembers.cpp @@ -103,7 +103,8 @@ // Trigger only on class definitions. if (auto *N = Inputs.ASTSelection.commonAncestor()) Class = const_cast(N->ASTNode.get()); - if (!Class || !Class->isThisDeclarationADefinition()) + if (!Class || !Class->isThisDeclarationADefinition() || + !(Class->isClass() || Class->isStruct())) return false; // Tweak is only available if some members are missing. diff --git a/clang-tools-extra/clangd/unittests/CMakeLists.txt b/clang-tools-extra/clangd/unittests/CMakeLists.txt --- a/clang-tools-extra/clangd/unittests/CMakeLists.txt +++ b/clang-tools-extra/clangd/unittests/CMakeLists.txt @@ -130,6 +130,7 @@ tweaks/RawStringLiteralTests.cpp tweaks/RemoveUsingNamespaceTests.cpp tweaks/ShowSelectionTreeTests.cpp + tweaks/SpecialMembersTests.cpp tweaks/SwapIfBranchesTests.cpp tweaks/TweakTesting.cpp tweaks/TweakTests.cpp diff --git a/clang-tools-extra/clangd/unittests/tweaks/SpecialMembersTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/SpecialMembersTests.cpp --- a/clang-tools-extra/clangd/unittests/tweaks/SpecialMembersTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/SpecialMembersTests.cpp @@ -7,17 +7,15 @@ //===----------------------------------------------------------------------===// #include "TweakTesting.h" -#include "gmock/gmock-matchers.h" -#include "gmock/gmock.h" #include "gtest/gtest.h" namespace clang { namespace clangd { namespace { -TWEAK_TEST(SpecialMembers); +TWEAK_TEST(DeclareCopyMove); -TEST_F(SpecialMembersTest, Test) { +TEST_F(DeclareCopyMoveTest, Test) { EXPECT_AVAILABLE("struct ^S {};"); EXPECT_UNAVAILABLE("struct S { ^ };"); EXPECT_UNAVAILABLE("union ^U {};"); @@ -27,17 +25,17 @@ "S &operator=(S&&); S &operator=(const S&);" "};"); - const char *Output = R"cpp(struct S{S(const S &) = default; - S(S &&) = default; - S &operator=(const S &) = default; - S &operator=(S &&) = default; + const char *Output = R"cpp(struct S{S(const S&) = default; +S(S&&) = default; +S &operator=(const S&) = default; +S &operator=(S&&) = default; };)cpp"; EXPECT_EQ(apply("struct ^S{};"), Output); - Output = R"cpp(struct S{S(const S &) = default; -S(S &&) = default; -S &operator=(const S &) = delete; -S &operator=(S &&) = delete; + Output = R"cpp(struct S{S(const S&) = default; +S(S&&) = default; +S &operator=(const S&) = delete; +S &operator=(S&&) = delete; int& ref;};)cpp"; EXPECT_EQ(apply("struct ^S{int& ref;};"), Output); }