[clang] [clang-format] Fix for BreakTemplateDeclarations and RequiresClausePosition (PR #159261)

via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 17 00:20:57 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-format

Author: NagaChaitanya Vellanki (chaitanyav)

<details>
<summary>Changes</summary>


               when BreakTemplateDeclarations is set to yes and
               RequiresClausePosition is SingleLine or WithPreceding
               requires clause should be on the same line

Fixes #<!-- -->150845

---
Full diff: https://github.com/llvm/llvm-project/pull/159261.diff


2 Files Affected:

- (modified) clang/lib/Format/TokenAnnotator.cpp (+5) 
- (modified) clang/unittests/Format/FormatTest.cpp (+13) 


``````````diff
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;

``````````

</details>


https://github.com/llvm/llvm-project/pull/159261


More information about the cfe-commits mailing list