[clang] [clang-format] Fix for BreakTemplateDeclarations and RequiresClausePosition (PR #159261)
NagaChaitanya Vellanki via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 17 00:20:31 PDT 2025
https://github.com/chaitanyav updated https://github.com/llvm/llvm-project/pull/159261
>From ec7a0a72497882f18940d71af3911a31b819f9ef Mon Sep 17 00:00:00 2001
From: NagaChaitanya Vellanki <pnagato at protonmail.com>
Date: Wed, 17 Sep 2025 00:04:24 -0700
Subject: [PATCH] [clang-format] Fix for BreakTemplateDeclarations and
RequiresClausePosition
when BreakTemplateDeclarations is set to yes and
RequiresClausePosition is SingleLine or WithPreceding
requires clause should be on the same line
Fixes #150845
---
clang/lib/Format/TokenAnnotator.cpp | 5 +++++
clang/unittests/Format/FormatTest.cpp | 13 +++++++++++++
2 files changed, 18 insertions(+)
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index d97f56751ea69..f22c51af7d3f1 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -5854,6 +5854,11 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
// concept ...
if (Right.is(tok::kw_concept))
return Style.BreakBeforeConceptDeclarations == FormatStyle::BBCDS_Always;
+ if (Right.is(TT_RequiresClause) &&
+ (Style.RequiresClausePosition == FormatStyle::RCPS_WithPreceding ||
+ Style.RequiresClausePosition == FormatStyle::RCPS_SingleLine)) {
+ return false;
+ }
return Style.BreakTemplateDeclarations == FormatStyle::BTDS_Yes ||
(Style.BreakTemplateDeclarations == FormatStyle::BTDS_Leave &&
Right.NewlinesBefore > 0);
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index d9db06667d802..efbc86af72c17 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -10848,6 +10848,19 @@ TEST_F(FormatTest, WrapsTemplateDeclarations) {
"public:\n"
" E *f();\n"
"};");
+ Style.RequiresClausePosition = FormatStyle::RCPS_SingleLine;
+ verifyNoChange("template <typename T> requires std::floating_point<T>\n"
+ "using LerpValue = ClampedValue<T, T{ 0 }, T{ 1 }>;",
+ Style);
+ Style.RequiresClausePosition = FormatStyle::RCPS_WithPreceding;
+ verifyNoChange("template <typename T> requires std::floating_point<T>\n"
+ "using LerpValue = ClampedValue<T, T{ 0 }, T{ 1 }>;",
+ Style);
+ Style.RequiresClausePosition = FormatStyle::RCPS_OwnLine;
+ verifyFormat("template <typename T>\n"
+ "requires std::floating_point<T>\n"
+ "using LerpValue = ClampedValue<T, T{ 0 }, T{ 1 }>;",
+ Style);
FormatStyle NeverBreak = getLLVMStyle();
NeverBreak.BreakTemplateDeclarations = FormatStyle::BTDS_No;
More information about the cfe-commits
mailing list