[clang] 9f578bc - [clang-format] Reset `Line->IsModuleOrImportDecl` in `addUnwrappedLine` (#204565)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jun 20 01:33:12 PDT 2026
Author: Damian Höster
Date: 2026-06-20T10:33:07+02:00
New Revision: 9f578bc595ca7c1a5ce35b17c483fd6c557d11ef
URL: https://github.com/llvm/llvm-project/commit/9f578bc595ca7c1a5ce35b17c483fd6c557d11ef
DIFF: https://github.com/llvm/llvm-project/commit/9f578bc595ca7c1a5ce35b17c483fd6c557d11ef.diff
LOG: [clang-format] Reset `Line->IsModuleOrImportDecl` in `addUnwrappedLine` (#204565)
The `IsModuleOrImportDecl` flag was not reset in `addUnwrappedLine`.
Since the parser recycles the `Line` object, this flag remained `true`
for all subsequent lines in the file, which disabled wrapping
(`CanBreakBefore` in `TokenAnnotator.cpp`) for expression-level
constructs after any C++20 module or import statement, causing some
formatting rules to not be applied in places. This patch fixes the issue
by resetting the flag to `false`.
---------
Co-authored-by: Owen Pan <owenpiano at gmail.com>
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/lib/Format/UnwrappedLineParser.h
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index c83e82674dee1..534b356175f82 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -108,7 +108,6 @@ class ScopedLineState {
Parser.Line->PPLevel = PreBlockLine->PPLevel;
Parser.Line->InPPDirective = PreBlockLine->InPPDirective;
Parser.Line->InMacroBody = PreBlockLine->InMacroBody;
- Parser.Line->IsModuleOrImportDecl = PreBlockLine->IsModuleOrImportDecl;
Parser.Line->UnbracedBodyLevel = PreBlockLine->UnbracedBodyLevel;
}
@@ -4718,6 +4717,7 @@ void UnwrappedLineParser::addUnwrappedLine(LineLevel AdjustLevel) {
Line->FirstStartColumn = 0;
Line->IsContinuation = false;
Line->SeenDecltypeAuto = false;
+ Line->IsModuleOrImportDecl = false;
if (ClosesWhitesmithsBlock && AdjustLevel == LineLevel::Remove)
--Line->Level;
diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h
index 5014fad7e6ef1..22803a837cc63 100644
--- a/clang/lib/Format/UnwrappedLineParser.h
+++ b/clang/lib/Format/UnwrappedLineParser.h
@@ -48,8 +48,6 @@ struct UnwrappedLine {
bool InPragmaDirective = false;
/// Whether it is part of a macro body.
bool InMacroBody = false;
- /// Whether it is a C++20 module/import declaration.
- bool IsModuleOrImportDecl = false;
/// Nesting level of unbraced body of a control statement.
unsigned UnbracedBodyLevel = 0;
@@ -63,6 +61,9 @@ struct UnwrappedLine {
/// addition to the normal indention level.
bool IsContinuation = false;
+ /// Whether it is a C++20 module/import declaration.
+ bool IsModuleOrImportDecl = false;
+
/// If this \c UnwrappedLine closes a block in a sequence of lines,
/// \c MatchingOpeningBlockLineIndex stores the index of the corresponding
/// opening line. Otherwise, \c MatchingOpeningBlockLineIndex must be
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index f85422dbf4f42..c42cc147cf21e 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -24909,6 +24909,15 @@ TEST_F(FormatTest, Cpp20ModulesSupport) {
verifyFormat("import <Foo/Bar> /* comment */;", Style);
verifyFormat("import <Foo/Bar>; // Trailing comment", Style);
+ Style.BreakStringLiterals = true;
+ Style.ColumnLimit = 20;
+ verifyFormat("export module foobar;\n"
+ "char *s = \"s1\"\n"
+ " \"s2\";",
+ "export module foobar;\n"
+ "char *s = \"s1\" \"s2\";",
+ Style);
+
// Somewhat gracefully handle import in pre-C++20 code.
verifyFormat("import /* not keyword */ = val ? 2 : 1;");
verifyFormat("_world->import<engine_module>();");
More information about the cfe-commits
mailing list