From b1a5df174e1d5a58f2498c30795cf18c9bf3e1b1 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Mon, 8 Mar 2021 09:00:48 +0100 Subject: [PATCH] [clangd] Drop explicit specifier on define out-of-line Explicit specifier can only be mentioned on the in-line declaration of a constructor, so don't carry it over to the definition. Differential Revision: https://reviews.llvm.org/D98164 --- .../clangd/refactor/tweaks/DefineOutline.cpp | 4 ++++ .../unittests/tweaks/DefineOutlineTests.cpp | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp b/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp index 4cdd36cbd4c93..18c521119972b 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -272,6 +272,10 @@ getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace, if (MD->isStatic()) DelKeyword(tok::kw_static, {FD->getBeginLoc(), FD->getLocation()}); } + if (const auto *CD = dyn_cast(FD)) { + if (CD->isExplicit()) + DelKeyword(tok::kw_explicit, {FD->getBeginLoc(), FD->getLocation()}); + } if (Errors) return std::move(Errors); diff --git a/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp index fa627282e1937..a872341a871aa 100644 --- a/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp @@ -267,6 +267,28 @@ TEST_F(DefineOutlineTest, ApplyTest) { };)cpp", " void A::foo() {}\n", }, + { + R"cpp( + struct Foo { + explicit Fo^o(int) {} + };)cpp", + R"cpp( + struct Foo { + explicit Foo(int) ; + };)cpp", + " Foo::Foo(int) {}\n", + }, + { + R"cpp( + struct Foo { + explicit explicit Fo^o(int) {} + };)cpp", + R"cpp( + struct Foo { + explicit explicit Foo(int) ; + };)cpp", + " Foo::Foo(int) {}\n", + }, }; for (const auto &Case : Cases) { SCOPED_TRACE(Case.Test);