https://github.com/bdunkin updated https://github.com/llvm/llvm-project/pull/183183
>From b359773904f71b4e2bb7cac64a21bde37e4972b7 Mon Sep 17 00:00:00 2001 From: Ben Dunkin <[email protected]> Date: Tue, 24 Feb 2026 14:06:44 -0800 Subject: [PATCH 1/2] Fix spaces not being added with SpaceBeforeParens on functions which are explicit template specializations. --- clang/lib/Format/TokenAnnotator.cpp | 4 +++- clang/unittests/Format/FormatTest.cpp | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 34e81bbc97578..8f235cfd6458c 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -4913,8 +4913,10 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, return true; // Space before parentheses common for all languages if (Right.is(tok::l_paren)) { - if (Left.is(TT_TemplateCloser) && Right.isNot(TT_FunctionTypeLParen)) + if (Left.is(TT_TemplateCloser) && Right.isNot(TT_FunctionTypeLParen) && + !Line.MightBeFunctionDecl) { return spaceRequiredBeforeParens(Right); + } if (Left.isOneOf(TT_RequiresClause, TT_RequiresClauseInARequiresExpression)) { return Style.SpaceBeforeParensOptions.AfterRequiresInClause || diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 43633b582a8ab..dfc21bcefad53 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -17334,6 +17334,8 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { verifyFormat("void f(int a, T b) {}", SpaceFuncDecl); verifyFormat("void __attribute__((asdf)) f(int a, T b) {}", SpaceFuncDecl); verifyFormat("A::A() : a(1) {}", SpaceFuncDecl); + verifyFormat("template <> void A<C> (C x);", SpaceFuncDecl); + verifyFormat("template <> void A<C>(C x) {}", SpaceFuncDecl); verifyFormat("void f () __attribute__((asdf));", SpaceFuncDecl); verifyFormat("void __attribute__((asdf)) f ();", SpaceFuncDecl); verifyFormat("#define A(x) x", SpaceFuncDecl); @@ -17370,6 +17372,8 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { verifyFormat("void f (int a, T b) {}", SpaceFuncDef); verifyFormat("void __attribute__((asdf)) f (int a, T b) {}", SpaceFuncDef); verifyFormat("A::A () : a(1) {}", SpaceFuncDef); + verifyFormat("template <> void A<C>(C x);", SpaceFuncDef); + verifyFormat("template <> void A<C> (C x) {}", SpaceFuncDef); verifyFormat("void f() __attribute__((asdf));", SpaceFuncDef); verifyFormat("void __attribute__((asdf)) f();", SpaceFuncDef); verifyFormat("#define A(x) x", SpaceFuncDef); >From 1ed410a8cc85396314f0f985c0f3222fd297b315 Mon Sep 17 00:00:00 2001 From: Ben Dunkin <[email protected]> Date: Fri, 27 Feb 2026 10:16:11 -0800 Subject: [PATCH 2/2] Move the check for function declaration above the check for templated function type signatures, rather than change the checks based on review feedback. --- clang/lib/Format/TokenAnnotator.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 8f235cfd6458c..1b588435d6302 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -4913,10 +4913,17 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, return true; // Space before parentheses common for all languages if (Right.is(tok::l_paren)) { - if (Left.is(TT_TemplateCloser) && Right.isNot(TT_FunctionTypeLParen) && - !Line.MightBeFunctionDecl) { - return spaceRequiredBeforeParens(Right); + // Function declaration or definition + if (Line.MightBeFunctionDecl && Right.is(TT_FunctionDeclarationLParen)) { + if (spaceRequiredBeforeParens(Right)) + return true; + const auto &Options = Style.SpaceBeforeParensOptions; + return Line.mightBeFunctionDefinition() + ? Options.AfterFunctionDefinitionName + : Options.AfterFunctionDeclarationName; } + if (Left.is(TT_TemplateCloser) && Right.isNot(TT_FunctionTypeLParen)) + return spaceRequiredBeforeParens(Right); if (Left.isOneOf(TT_RequiresClause, TT_RequiresClauseInARequiresExpression)) { return Style.SpaceBeforeParensOptions.AfterRequiresInClause || @@ -4960,15 +4967,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, // SpaceBeforeParensOptions if (Right.is(TT_OverloadedOperatorLParen)) return spaceRequiredBeforeParens(Right); - // Function declaration or definition - if (Line.MightBeFunctionDecl && Right.is(TT_FunctionDeclarationLParen)) { - if (spaceRequiredBeforeParens(Right)) - return true; - const auto &Options = Style.SpaceBeforeParensOptions; - return Line.mightBeFunctionDefinition() - ? Options.AfterFunctionDefinitionName - : Options.AfterFunctionDeclarationName; - } + // Lambda if (Line.Type != LT_PreprocessorDirective && Left.is(tok::r_square) && Left.MatchingParen && Left.MatchingParen->is(TT_LambdaLSquare)) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
