diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -3294,6 +3294,11 @@ return Right.WhitespaceRange.getBegin() != Right.WhitespaceRange.getEnd(); }; + // If the token is finalized don't touch it (as it could be in a + // clang-format-off section). + if (Left.Finalized) + return HasExistingWhitespace(); + if (Right.Tok.getIdentifierInfo() && Left.Tok.getIdentifierInfo()) return true; // Never ever merge two identifiers. 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 @@ -21156,6 +21156,16 @@ verifyFormat("A< A< int > >();", Spaces); verifyFormat("A >();", Spaces); verifyFormat("A< A< int>>();", Spaces); + + Spaces.SpacesInAngles = FormatStyle::SIAS_Always; + verifyFormat("// clang-format off\n" + "foo<<<1, 1>>>();\n" + "// clang-format on\n", + Spaces); + verifyFormat("// clang-format off\n" + "foo< < <1, 1> > >();\n" + "// clang-format on\n", + Spaces); } TEST_F(FormatTest, SpaceAfterTemplateKeyword) {