Skip to content

Commit

Permalink
[clang-format] Fixed edge-case with SpacesInSquareBrackets with trail…
Browse files Browse the repository at this point in the history
…ing bare "&" lambda capture.

Summary:
Lambda captures allow for a lone `&` capture, so `&]` needs to be properly handled.

`int foo = [& ]() {}` is fixed to give `int foo = [ & ]() {}`

Reviewers: MyDeveloperDay

Reviewed by: MyDeveloperDay

Subscribers: cfe-commits

Tags: #clang, #clang-format

Differential Revision: https://reviews.llvm.org/D70249
  • Loading branch information
Mitchell Balan committed Nov 14, 2019
1 parent 5fe3f00 commit 4ee70e0
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
10 changes: 7 additions & 3 deletions clang/lib/Format/TokenAnnotator.cpp
Expand Up @@ -2996,14 +2996,18 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
return true;
}
if (Left.is(TT_UnaryOperator)) {
// The alternative operators for ~ and ! are "compl" and "not".
// If they are used instead, we do not want to combine them with
// the token to the right, unless that is a left paren.
if (!Right.is(tok::l_paren)) {
// The alternative operators for ~ and ! are "compl" and "not".
// If they are used instead, we do not want to combine them with
// the token to the right, unless that is a left paren.
if (Left.is(tok::exclaim) && Left.TokenText == "not")
return true;
if (Left.is(tok::tilde) && Left.TokenText == "compl")
return true;
// Lambda captures allow for a lone &, so "&]" needs to be properly
// handled.
if (Left.is(tok::amp) && Right.is(tok::r_square))
return Style.SpacesInSquareBrackets;
}
return (Style.SpaceAfterLogicalNot && Left.is(tok::exclaim)) ||
Right.is(TT_BinaryOperator);
Expand Down
1 change: 1 addition & 0 deletions clang/unittests/Format/FormatTest.cpp
Expand Up @@ -10638,6 +10638,7 @@ TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
verifyFormat("return [ i, args... ] {};", Spaces);
verifyFormat("int foo = [ &bar ]() {};", Spaces);
verifyFormat("int foo = [ = ]() {};", Spaces);
verifyFormat("int foo = [ & ]() {};", Spaces);
verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
}
Expand Down

0 comments on commit 4ee70e0

Please sign in to comment.