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 <[email protected]> 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>();"); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
