diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 13b853ea9e226..74d82db043e67 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -1173,7 +1173,15 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) { } if (NextNonComment->is(TT_TemplateString) && NextNonComment->closesScope()) return State.Stack[State.Stack.size() - 2].LastSpace; + // Field labels in a nested type should be aligned to the brace. For example + // in ProtoBuf: + // optional int32 b = 2 [(foo_options) = {aaaaaaaaaaaaaaaaaaa: 123, + // bbbbbbbbbbbbbbbbbbbbbbbb:"baz"}]; + // For Verilog, a quote following a brace is treated as an identifier. And + // Both braces and colons get annotated as TT_DictLiteral. So we have to + // check. if (Current.is(tok::identifier) && Current.Next && + (!Style.isVerilog() || Current.Next->is(tok::colon)) && (Current.Next->is(TT_DictLiteral) || ((Style.Language == FormatStyle::LK_Proto || Style.Language == FormatStyle::LK_TextProto) && diff --git a/clang/unittests/Format/FormatTestVerilog.cpp b/clang/unittests/Format/FormatTestVerilog.cpp index 5c94d5afbac96..45839aea54ff0 100644 --- a/clang/unittests/Format/FormatTestVerilog.cpp +++ b/clang/unittests/Format/FormatTestVerilog.cpp @@ -1172,6 +1172,15 @@ TEST_F(FormatTestVerilog, StructLiteral) { verifyFormat("c = '{a : 0, b : 0.0, default : 0};", Style); verifyFormat("c = ab'{a : 0, b : 0.0};", Style); verifyFormat("c = ab'{cd : cd'{1, 1.0}, ef : ef'{2, 2.0}};", Style); + + // It should be indented correctly when the line has to break. + verifyFormat("c = //\n" + " '{default: 0};"); + Style = getDefaultStyle(); + Style.ContinuationIndentWidth = 2; + verifyFormat("c = //\n" + " '{default: 0};", + Style); } TEST_F(FormatTestVerilog, StructuredProcedure) {