Skip to content

Commit 1db8112

Browse files
[clang-format] Fix crash with ObjC Blocks
Fixes #54367 Fixes #54368 Differential Revision: https://reviews.llvm.org/D121596
1 parent d4c39f1 commit 1db8112

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ class AnnotatingParser {
783783
OpeningBrace.ParentBracket = Contexts.back().ContextKind;
784784

785785
if (Contexts.back().CaretFound)
786-
OpeningBrace.setType(TT_ObjCBlockLBrace);
786+
OpeningBrace.overwriteFixedType(TT_ObjCBlockLBrace);
787787
Contexts.back().CaretFound = false;
788788

789789
ScopedContextCreator ContextCreator(*this, tok::l_brace, 1);

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,22 @@ TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
644644
EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
645645
}
646646

647+
TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {
648+
auto Tokens = annotate("int (^)() = ^ ()\n"
649+
" external_source_symbol() { //\n"
650+
" return 1;\n"
651+
"};");
652+
ASSERT_EQ(Tokens.size(), 21u) << Tokens;
653+
EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);
654+
EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_ObjCBlockLBrace);
655+
656+
Tokens = annotate("int *p = ^int*(){ //\n"
657+
" return nullptr;\n"
658+
"}();");
659+
ASSERT_EQ(Tokens.size(), 19u) << Tokens;
660+
EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_ObjCBlockLBrace);
661+
}
662+
647663
} // namespace
648664
} // namespace format
649665
} // namespace clang

0 commit comments

Comments
 (0)