[clang-format] Do not treat the asm clobber [ as ObjCExpr

Summary:
The opening square of an inline asm clobber was being annotated as an ObjCExpr.
This caused, amongst other things, the ObjCGuesser to guess header files
containing that pattern as ObjC files.

Reviewers: benhamilton

Reviewed By: benhamilton

Subscribers: cfe-commits

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

llvm-svn: 346756
This commit is contained in:
Krasimir Georgiev 2018-11-13 15:38:12 +00:00
parent 077a42ca9f
commit 28e2dbb14d
2 changed files with 18 additions and 2 deletions

View File

@ -404,8 +404,9 @@ private:
Contexts.back().CanBeExpression && Left->isNot(TT_LambdaLSquare) &&
!CurrentToken->isOneOf(tok::l_brace, tok::r_square) &&
(!Parent ||
Parent->isOneOf(tok::colon, tok::l_square, tok::l_paren,
tok::kw_return, tok::kw_throw) ||
(Parent->is(tok::colon) && Parent->isNot(TT_InlineASMColon)) ||
Parent->isOneOf(tok::l_square, tok::l_paren, tok::kw_return,
tok::kw_throw) ||
Parent->isUnaryOperator() ||
// FIXME(bug 36976): ObjC return types shouldn't use TT_CastRParen.
Parent->isOneOf(TT_ObjCForIn, TT_CastRParen) ||

View File

@ -12755,6 +12755,21 @@ TEST_F(FormatTest, GuessLanguageWithCaret) {
guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
}
TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
"void f() {\n"
" asm (\"mov %[e], %[d]\"\n"
" : [d] \"=rm\" (d)\n"
" [e] \"rm\" (*e));\n"
"}"));
EXPECT_EQ(FormatStyle::LK_Cpp,
guessLanguage("foo.h", "void f() {\n"
" asm volatile (\"mov %[e], %[d]\"\n"
" : [d] \"=rm\" (d)\n"
" [e] \"rm\" (*e));\n"
"}"));
}
TEST_F(FormatTest, GuessLanguageWithChildLines) {
EXPECT_EQ(FormatStyle::LK_Cpp,
guessLanguage("foo.h", "#define FOO ({ std::string s; })"));