[clang] [clang-format] Fix formatting of `requires` expressions in braced initializers (PR #163005)

via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 11 08:18:07 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-format

Author: Ruoyu Zhong (ZhongRuoyu)

<details>
<summary>Changes</summary>

When clang-format encountered a `requires` expression inside a braced initializer (e.g., `bool foo{requires { 0; }};`), it would incorrectly format the code to the following:

```cpp
bool bar{requires {0;
}
}
;
```

The issue was that `UnwrappedLineParser::parseBracedList` had no explicit handling for the `requires` keyword, so it would just call `nextToken()` instead of properly parsing the `requires` expression.

This fix adds a case for `tok::kw_requires` in `parseBracedList`, calling `parseRequiresExpression` to handle it correctly, matching the existing behavior in `parseParens`:

https://github.com/llvm/llvm-project/blob/7eee67202378932d03331ad04e7d07ed4d988381/clang/lib/Format/UnwrappedLineParser.cpp#L2713-L2718

Fixes https://github.com/llvm/llvm-project/issues/162984.


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


2 Files Affected:

- (modified) clang/lib/Format/UnwrappedLineParser.cpp (+6) 
- (modified) clang/unittests/Format/FormatTest.cpp (+6) 


``````````diff
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 28797433e06e3..dec71191d7356 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -2569,6 +2569,12 @@ bool UnwrappedLineParser::parseBracedList(bool IsAngleBracket, bool IsEnum) {
       if (IsEnum && !Style.AllowShortEnumsOnASingleLine)
         addUnwrappedLine();
       break;
+    case tok::kw_requires: {
+      auto *RequiresToken = FormatTok;
+      nextToken();
+      parseRequiresExpression(RequiresToken);
+      break;
+    }
     default:
       nextToken();
       break;
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index fef70365b5e18..5a8056e310d45 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -26973,6 +26973,12 @@ TEST_F(FormatTest, RequiresExpressionIndentation) {
                Style);
 }
 
+TEST_F(FormatTest, RequiresExpressionInBracedInitializer) {
+  verifyFormat("bool foo{requires { 0; }};");
+  verifyFormat("int bar{requires(T t) { t.f(); }};");
+  verifyFormat("auto baz{requires { typename T::type; } && true};");
+}
+
 TEST_F(FormatTest, StatementAttributeLikeMacros) {
   FormatStyle Style = getLLVMStyle();
   StringRef Source = "void Foo::slot() {\n"

``````````

</details>


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


More information about the cfe-commits mailing list