-
Notifications
You must be signed in to change notification settings - Fork 15k
[clang-format] Fix formatting of requires expressions in braced initializers
#163005
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang-format] Fix formatting of requires expressions in braced initializers
#163005
Conversation
…alizers
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 llvm#162984.
[1]: https://github.com/llvm/llvm-project/blob/7eee67202378932d03331ad04e7d07ed4d988381/clang/lib/Format/UnwrappedLineParser.cpp#L2713-L2718
Signed-off-by: Ruoyu Zhong <[email protected]>
|
@llvm/pr-subscribers-clang-format Author: Ruoyu Zhong (ZhongRuoyu) ChangesWhen clang-format encountered a bool bar{requires {0;
}
}
;The issue was that This fix adds a case for llvm-project/clang/lib/Format/UnwrappedLineParser.cpp Lines 2713 to 2718 in 7eee672
Fixes #162984. Full diff: https://github.com/llvm/llvm-project/pull/163005.diff 2 Files Affected:
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"
|
…braced initializer
… braced initializer Co-authored-by: Owen Pan <[email protected]>
f769ff0 to
e836a16
Compare
…tializers (llvm#163005) `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`. Fixes llvm#162984.
…tializers (llvm#163005) `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`. Fixes llvm#162984.
When clang-format encountered a
requiresexpression inside a braced initializer (e.g.,bool foo{requires { 0; }};), it would incorrectly format the code to the following:The issue was that
UnwrappedLineParser::parseBracedListhad no explicit handling for therequireskeyword, so it would just callnextToken()instead of properly parsing therequiresexpression.This fix adds a case for
tok::kw_requiresinparseBracedList, callingparseRequiresExpressionto handle it correctly, matching the existing behavior inparseParens:llvm-project/clang/lib/Format/UnwrappedLineParser.cpp
Lines 2713 to 2718 in 7eee672
Fixes #162984.