diff options
| author | Ben Hamilton <benhamilton@google.com> | 2018-03-12 15:42:40 +0000 |
|---|---|---|
| committer | Ben Hamilton <benhamilton@google.com> | 2018-03-12 15:42:40 +0000 |
| commit | 788a2227b7bcbff8384fe0b96e4bd66bfa11ccf1 (patch) | |
| tree | 01e0b8735f503c1be3dc8c069408387a8ca3c811 /clang/unittests/Format/FormatTestObjC.cpp | |
| parent | b060ad870f4e3770e4d5b2ca149c59669f8d56b8 (diff) | |
| download | bcm5719-llvm-788a2227b7bcbff8384fe0b96e4bd66bfa11ccf1.tar.gz bcm5719-llvm-788a2227b7bcbff8384fe0b96e4bd66bfa11ccf1.zip | |
[clang-format] Improve detection of Objective-C block types
Summary:
Previously, clang-format would detect the following as an
Objective-C block type:
FOO(^);
when it actually must be a C or C++ macro dealing with an XOR
statement or an XOR operator overload.
According to the Clang Block Language Spec:
https://clang.llvm.org/docs/BlockLanguageSpec.html
block types are of the form:
int (^)(char, float)
and block variables of block type are of the form:
void (^blockReturningVoidWithVoidArgument)(void);
int (^blockReturningIntWithIntAndCharArguments)(int, char);
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);
This tightens up the detection so we don't unnecessarily detect
C macros which pass in the XOR operator.
Depends On D43904
Test Plan: New tests added. Ran tests with:
make -j12 FormatTests &&
./tools/clang/unittests/Format/FormatTests
Reviewers: krasimir, jolesiak, djasper
Reviewed By: djasper
Subscribers: djasper, cfe-commits, klimek
Differential Revision: https://reviews.llvm.org/D43906
llvm-svn: 327285
Diffstat (limited to 'clang/unittests/Format/FormatTestObjC.cpp')
| -rw-r--r-- | clang/unittests/Format/FormatTestObjC.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/unittests/Format/FormatTestObjC.cpp b/clang/unittests/Format/FormatTestObjC.cpp index 8773088c82e..efc227d3109 100644 --- a/clang/unittests/Format/FormatTestObjC.cpp +++ b/clang/unittests/Format/FormatTestObjC.cpp @@ -845,6 +845,15 @@ TEST_F(FormatTestObjC, ObjCAt) { verifyFormat("@ /*foo*/ interface"); } +TEST_F(FormatTestObjC, ObjCBlockTypesAndVariables) { + verifyFormat("void DoStuffWithBlockType(int (^)(char));"); + verifyFormat("int (^foo)(char, float);"); + verifyFormat("int (^foo[10])(char, float);"); + verifyFormat("int (^foo[kNumEntries])(char, float);"); + verifyFormat("int (^foo[kNumEntries + 10])(char, float);"); + verifyFormat("int (^foo[(kNumEntries + 10)])(char, float);"); +} + TEST_F(FormatTestObjC, ObjCSnippets) { verifyFormat("@autoreleasepool {\n" " foo();\n" |

