The following C++ code was being detected by
guessLanguage() as Objective-C:
#define FOO(...) auto bar = [] __VA_ARGS__;
This was because [] __VA_ARGS__ is not currently detected as a C++
lambda expression (it has no parens or braces), so
TokenAnnotator::parseSquare() incorrectly treats the opening square
as an ObjC method expression.
We have two options to fix this:
- Parse [] __VA_ARGS__ explicitly as a C++ lambda
- Make it so [] is never parsed as an Objective-C method expression
This diff implements option 2, which causes the [ to be parsed
as TT_ArraySubscriptLSquare instead of TT_ObjCMethodExpr.
Note that when I fixed this, it caused one change in formatting
behavior, where the following was implicitly relying on the [
being parsed as TT_ObjCMethodExpr:
A<int * []> a;
becomes:
A<int *[]> a;
with Style.PointerAlignment = Middle.
I don't really know what the desired format is for this syntax; the
test was added by Janusz Sobczak and integrated by @djasper in
https://github.com/llvm-mirror/clang/commit/b511fe9818829d7ece0cc0b2ce1fbe04a1f0739a
.
I went ahead and changed the test for now.
Test Plan: New tests added. Ran tests with:
% make -j12 FormatTests && ./tools/clang/unittests/Format/FormatTests