diff --git a/clang/lib/Format/UnwrappedLineFormatter.cpp b/clang/lib/Format/UnwrappedLineFormatter.cpp --- a/clang/lib/Format/UnwrappedLineFormatter.cpp +++ b/clang/lib/Format/UnwrappedLineFormatter.cpp @@ -390,7 +390,7 @@ for (auto *CompactedLine = I + J; CompactedLine <= ClosingLine; ++CompactedLine) { if (!(*CompactedLine)->InPPDirective) - (*CompactedLine)->Level -= OutdentBy; + (*CompactedLine)->Level -= std::min(OutdentBy, (*CompactedLine)->Level); } } return J - 1; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -4223,6 +4223,19 @@ "void foo() {}\n" "} // namespace ns\n", Style); + + FormatStyle LLVMWithCompactInnerNamespace = getLLVMStyle(); + LLVMWithCompactInnerNamespace.CompactNamespaces = true; + LLVMWithCompactInnerNamespace.NamespaceIndentation = FormatStyle::NI_Inner; + verifyNoCrash("namespace ns1 { namespace ns2 { namespace ns3 {\n" + "void func_in_ns() {\n" + " int res{0};\n" + "// block for debug mode\n" + "#ifndef NDEBUG\n" + "#endif\n" + "}\n" + "}}}\n", + LLVMWithCompactInnerNamespace); } TEST_F(FormatTest, NamespaceMacros) {