https://github.com/ckandeler created https://github.com/llvm/llvm-project/pull/117565
... in DefineOutline tweak for function templates. As opposed to class templates, the name is not required for writing an out-of-line definition. >From 064d23753ed1ac673bda33ab815dbb12c6bcc6f6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler <christian.kande...@qt.io> Date: Mon, 25 Nov 2024 15:42:54 +0100 Subject: [PATCH] [clangd] Drop requirement for named template parameters ... in DefineOutline tweak for function templates. As opposed to class templates, the name is not required for writing an out-of-line definition. --- .../clangd/refactor/tweaks/DefineOutline.cpp | 13 ++----------- .../unittests/tweaks/DefineOutlineTests.cpp | 18 ++++++------------ 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp b/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp index 789c10bdd4822a..e4eef228b6b99f 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp @@ -467,18 +467,9 @@ class DefineOutline : public Tweak { } } - // For function templates, the same limitations as for class templates - // apply. - if (const TemplateParameterList *Params = - MD->getDescribedTemplateParams()) { - // FIXME: Is this really needed? It inhibits application on - // e.g. std::enable_if. - for (NamedDecl *P : *Params) { - if (!P->getIdentifier()) - return false; - } + // Function templates must be defined in the same file. + if (MD->getDescribedTemplate()) SameFile = true; - } // The refactoring is meaningless for unnamed classes and namespaces, // unless we're outlining in the same file diff --git a/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp index d2d2ae9e7bb610..b5f09f9b14604f 100644 --- a/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/DefineOutlineTests.cpp @@ -118,12 +118,6 @@ TEST_F(DefineOutlineTest, TriggersOnFunctionDecl) { template <> void fo^o<int>() {} )cpp"); - // Not available on member function templates with unnamed template - // parameters. - EXPECT_UNAVAILABLE(R"cpp( - struct Foo { template <typename> void ba^r() {} }; - )cpp"); - // Not available on methods of unnamed classes. EXPECT_UNAVAILABLE(R"cpp( struct Foo { @@ -410,14 +404,14 @@ inline typename O1<T, U...>::template O2<V, A>::E O1<T, U...>::template O2<V, A> { R"cpp( struct Foo { - template <typename T, bool B = true> + template <typename T, typename, bool B = true> T ^bar() { return {}; } };)cpp", R"cpp( struct Foo { - template <typename T, bool B = true> + template <typename T, typename, bool B = true> T bar() ; - };template <typename T, bool B> + };template <typename T, typename, bool B> inline T Foo::bar() { return {}; } )cpp", ""}, @@ -426,13 +420,13 @@ inline T Foo::bar() { return {}; } { R"cpp( template <typename T> struct Foo { - template <typename U> T ^bar(const T& t, const U& u) { return {}; } + template <typename U, bool> T ^bar(const T& t, const U& u) { return {}; } };)cpp", R"cpp( template <typename T> struct Foo { - template <typename U> T bar(const T& t, const U& u) ; + template <typename U, bool> T bar(const T& t, const U& u) ; };template <typename T> -template <typename U> +template <typename U, bool> inline T Foo<T>::bar(const T& t, const U& u) { return {}; } )cpp", ""}, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits