[clang-format] BreakAfterReturnType ignored on functions with numeric template parameters

Summary:
Addresses PR40696 - https://bugs.llvm.org/show_bug.cgi?id=40696

The BreakAfterReturnType didn't work if it had a single arguments which was a template with an integer template parameter

```
int  foo(A<8> a) { return a; }
```

When run with the Mozilla style. would not break after the `int`

```
int TestFn(A<8> a)
{
  return a;
}

```

This revision resolves this issue by allowing numeric constants to be considered function parameters if if seen inside `<>`

Reviewers: djasper, klimek, JonasToth, krasimir, reuk, alexfh

Reviewed By: klimek

Subscribers: cfe-commits, llvm-commits

Tags: #clang-tools-extra

Differential Revision: https://reviews.llvm.org/D59309

llvm-svn: 357837
This commit is contained in:
Paul Hoad 2019-04-06 10:13:04 +00:00
parent 5182302a37
commit 1db96ac88b
2 changed files with 37 additions and 1 deletions

View File

@ -2095,7 +2095,7 @@ static bool isFunctionDeclarationName(const FormatToken &Current,
return true;
for (const FormatToken *Tok = Next->Next; Tok && Tok != Next->MatchingParen;
Tok = Tok->Next) {
if (Tok->is(tok::l_paren) && Tok->MatchingParen) {
if (Tok->isOneOf(tok::l_paren, TT_TemplateOpener) && Tok->MatchingParen) {
Tok = Tok->MatchingParen;
continue;
}

View File

@ -5709,6 +5709,42 @@ TEST_F(FormatTest, ReturnTypeBreakingStyle) {
"}\n"
"template <class T> T *f(T &c);\n", // No break here.
Style);
verifyFormat("int\n"
"foo(A<bool> a)\n"
"{\n"
" return a;\n"
"}\n",
Style);
verifyFormat("int\n"
"foo(A<8> a)\n"
"{\n"
" return a;\n"
"}\n",
Style);
verifyFormat("int\n"
"foo(A<B<bool>, 8> a)\n"
"{\n"
" return a;\n"
"}\n",
Style);
verifyFormat("int\n"
"foo(A<B<8>, bool> a)\n"
"{\n"
" return a;\n"
"}\n",
Style);
verifyFormat("int\n"
"foo(A<B<bool>, bool> a)\n"
"{\n"
" return a;\n"
"}\n",
Style);
verifyFormat("int\n"
"foo(A<B<8>, 8> a)\n"
"{\n"
" return a;\n"
"}\n",
Style);
}
TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {