[PATCH] D139281: [clang-format] Fix an assertion failure in block parsing
Owen Pan via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 6 00:50:16 PST 2022
owenpan updated this revision to Diff 480364.
owenpan added a comment.
Moved `isBlockBegin()` to `UnwrappedLineParser`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139281/new/
https://reviews.llvm.org/D139281
Files:
clang/lib/Format/FormatToken.h
clang/lib/Format/UnwrappedLineParser.cpp
clang/lib/Format/UnwrappedLineParser.h
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -6602,6 +6602,13 @@
" x = 1;\n"
"FOO_END(Baz)",
Style);
+
+ Style.RemoveBracesLLVM = true;
+ verifyNoCrash("for (;;)\n"
+ " FOO_BEGIN\n"
+ " foo();\n"
+ " FOO_END",
+ Style);
}
//===----------------------------------------------------------------------===//
Index: clang/lib/Format/UnwrappedLineParser.h
===================================================================
--- clang/lib/Format/UnwrappedLineParser.h
+++ clang/lib/Format/UnwrappedLineParser.h
@@ -143,6 +143,7 @@
void parseUnbracedBody(bool CheckEOF = false);
void handleAttributes();
bool handleCppAttributes();
+ bool isBlockBegin(const FormatToken &Tok) const;
FormatToken *parseIfThenElse(IfStmtKind *IfKind, bool KeepBraces = false);
void parseTryCatch();
void parseLoopBody(bool KeepBraces, bool WrapRightBrace);
Index: clang/lib/Format/UnwrappedLineParser.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -2739,6 +2739,14 @@
return false;
}
+/// Returns whether \c Tok begins a block.
+bool UnwrappedLineParser::isBlockBegin(const FormatToken &Tok) const {
+ // FIXME: rename the function or make
+ // Tok.isOneOf(tok::l_brace, TT_MacroBlockBegin) work.
+ return Style.isVerilog() ? Keywords.isVerilogBegin(Tok)
+ : Tok.is(tok::l_brace);
+}
+
FormatToken *UnwrappedLineParser::parseIfThenElse(IfStmtKind *IfKind,
bool KeepBraces) {
assert(FormatTok->is(tok::kw_if) && "'if' expected");
@@ -2764,7 +2772,7 @@
FormatToken *IfLeftBrace = nullptr;
IfStmtKind IfBlockKind = IfStmtKind::NotIf;
- if (Keywords.isBlockBegin(*FormatTok, Style)) {
+ if (isBlockBegin(*FormatTok)) {
FormatTok->setFinalizedType(TT_ControlStatementLBrace);
IfLeftBrace = FormatTok;
CompoundStatementIndenter Indenter(this, Style, Line->Level);
@@ -2796,7 +2804,7 @@
}
nextToken();
handleAttributes();
- if (Keywords.isBlockBegin(*FormatTok, Style)) {
+ if (isBlockBegin(*FormatTok)) {
const bool FollowedByIf = Tokens->peekNextToken()->is(tok::kw_if);
FormatTok->setFinalizedType(TT_ElseLBrace);
ElseLeftBrace = FormatTok;
@@ -3063,7 +3071,7 @@
void UnwrappedLineParser::parseLoopBody(bool KeepBraces, bool WrapRightBrace) {
keepAncestorBraces();
- if (Keywords.isBlockBegin(*FormatTok, Style)) {
+ if (isBlockBegin(*FormatTok)) {
if (!KeepBraces)
FormatTok->setFinalizedType(TT_ControlStatementLBrace);
FormatToken *LeftBrace = FormatTok;
Index: clang/lib/Format/FormatToken.h
===================================================================
--- clang/lib/Format/FormatToken.h
+++ clang/lib/Format/FormatToken.h
@@ -1785,12 +1785,6 @@
kw_input, kw_output, kw_sequence)));
}
- /// Whether the token begins a block.
- bool isBlockBegin(const FormatToken &Tok, const FormatStyle &Style) const {
- return Tok.is(TT_MacroBlockBegin) ||
- (Style.isVerilog() ? isVerilogBegin(Tok) : Tok.is(tok::l_brace));
- }
-
private:
/// The JavaScript keywords beyond the C++ keyword set.
std::unordered_set<IdentifierInfo *> JsExtraKeywords;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139281.480364.patch
Type: text/x-patch
Size: 3573 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221206/2cb0ce27/attachment.bin>
More information about the cfe-commits
mailing list