[clang-format] Fix regression about short functions after #else

Summary:
This patch fixes a regression introduced in r312904, where the formatter confuses
the `else` in `#else` with an `else` of an `if-else` statement.
For example, formatting this code with google style
```
#ifdef A
int f() {}
#else
int f() {}
#endif
```
resulted in
```
#ifdef A
int f() {}
#else
int f() {
}
#endif
```

Reviewers: sammccall

Reviewed By: sammccall

Subscribers: klimek, cfe-commits

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

llvm-svn: 314683
This commit is contained in:
Krasimir Georgiev 2017-10-02 15:53:37 +00:00
parent 65bde8806f
commit 6a1c9d51fa
2 changed files with 11 additions and 2 deletions

View File

@ -466,8 +466,7 @@ private:
// Check that the current line allows merging. This depends on whether we
// are in a control flow statements as well as several style flags.
if (Line.First->isOneOf(tok::kw_else, tok::kw_case) ||
(Line.First->Next && Line.First->Next->is(tok::kw_else)) ||
(I != AnnotatedLines.begin() && I[-1]->Last->is(tok::kw_else)))
(Line.First->Next && Line.First->Next->is(tok::kw_else)))
return 0;
if (Line.First->isOneOf(tok::kw_if, tok::kw_while, tok::kw_do, tok::kw_try,
tok::kw___try, tok::kw_catch, tok::kw___finally,

View File

@ -7102,6 +7102,16 @@ TEST_F(FormatTest, SplitEmptyFunction) {
"}",
Style);
}
TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
FormatStyle Style = getLLVMStyle();
Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
verifyFormat("#ifdef A\n"
"int f() {}\n"
"#else\n"
"int g() {}\n"
"#endif",
Style);
}
TEST_F(FormatTest, SplitEmptyClass) {
FormatStyle Style = getLLVMStyle();