diff options
| -rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 14 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 20 |
2 files changed, 32 insertions, 2 deletions
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 893e5fa65d4..d64daa66875 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -306,7 +306,17 @@ private: FormatToken *Left = CurrentToken->Previous; Left->ParentBracket = Contexts.back().ContextKind; FormatToken *Parent = Left->getPreviousNonComment(); - bool StartsObjCMethodExpr = + + // Cases where '>' is followed by '['. + // In C++, this can happen either in array of templates (foo<int>[10]) + // or when array is a nested template type (unique_ptr<type1<type2>[]>). + bool CppArrayTemplates = + Style.Language == FormatStyle::LK_Cpp && Parent && + Parent->is(TT_TemplateCloser) && + (Contexts.back().CanBeExpression || Contexts.back().IsExpression || + Contexts.back().InTemplateArgument); + + bool StartsObjCMethodExpr = !CppArrayTemplates && Style.Language == FormatStyle::LK_Cpp && Contexts.back().CanBeExpression && Left->isNot(TT_LambdaLSquare) && CurrentToken->isNot(tok::l_brace) && @@ -327,7 +337,7 @@ private: Parent->isOneOf(tok::l_brace, tok::comma)) { Left->Type = TT_JsComputedPropertyName; } else if (Style.Language == FormatStyle::LK_Proto || - (Parent && + (!CppArrayTemplates && Parent && Parent->isOneOf(TT_BinaryOperator, TT_TemplateCloser, tok::at, tok::comma, tok::l_paren, tok::l_square, tok::question, tok::colon, tok::kw_return, diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index f526d458437..0056436e537 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -11544,6 +11544,26 @@ TEST_F(FormatTest, FormatsTableGenCode) { verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style); } +TEST_F(FormatTest, ArrayOfTemplates) { + EXPECT_EQ("auto a = new unique_ptr<int>[10];", + format("auto a = new unique_ptr<int > [ 10];")); + + FormatStyle Spaces = getLLVMStyle(); + Spaces.SpacesInSquareBrackets = true; + EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];", + format("auto a = new unique_ptr<int > [10];", Spaces)); +} + +TEST_F(FormatTest, ArrayAsTemplateType) { + EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;", + format("auto a = unique_ptr < Foo < Bar>[ 10]> ;")); + + FormatStyle Spaces = getLLVMStyle(); + Spaces.SpacesInSquareBrackets = true; + EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;", + format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces)); +} + // Since this test case uses UNIX-style file path. We disable it for MS // compiler. #if !defined(_MSC_VER) && !defined(__MINGW32__) |

