[clang] [clang-format] Fix formatting of `requires` expressions in braced initializers (PR #163005)
Ruoyu Zhong via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 11 08:17:30 PDT 2025
https://github.com/ZhongRuoyu created https://github.com/llvm/llvm-project/pull/163005
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.
>From 4287fc38935f69a2b3745ddc82a526cde93f38d5 Mon Sep 17 00:00:00 2001
From: Ruoyu Zhong <zhongruoyu at outlook.com>
Date: Sat, 11 Oct 2025 23:12:36 +0800
Subject: [PATCH] [clang-format] Fix formatting of requires expressions in
braced initializers
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:
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 [1].
Fixes https://github.com/llvm/llvm-project/issues/162984.
[1]: https://github.com/llvm/llvm-project/blob/7eee67202378932d03331ad04e7d07ed4d988381/clang/lib/Format/UnwrappedLineParser.cpp#L2713-L2718
Signed-off-by: Ruoyu Zhong <zhongruoyu at outlook.com>
---
clang/lib/Format/UnwrappedLineParser.cpp | 6 ++++++
clang/unittests/Format/FormatTest.cpp | 6 ++++++
2 files changed, 12 insertions(+)
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"
More information about the cfe-commits
mailing list