krasimir created this revision. krasimir requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
https://github.com/llvm/llvm-project/commit/21c18d5a04316891110cecc2bf37ce51533decba improved the detection of multiplication in function all argument lists, but unintentionally regressed the handling of function type casts (there were no tests covering those). This patch improves the detection of function type casts and adds a few tests. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D104209 Files: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -8707,6 +8707,11 @@ verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); verifyFormat("void f() { f(float{1}, a * a); }"); verifyFormat("void f() { f(float(1), a * a); }"); + + verifyFormat("f((void (*)(int))g);"); + verifyFormat("f((void (&)(int))g);"); + verifyFormat("f((void (^)(int))g);"); + // FIXME: Is there a way to make this work? // verifyIndependentOfContext("MACRO(A *a);"); verifyFormat("MACRO(A &B);"); Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -397,9 +397,13 @@ !CurrentToken->Next->HasUnescapedNewline && !CurrentToken->Next->isTrailingComment()) HasMultipleParametersOnALine = true; + bool ProbablyFunctionTypeLParen = + (CurrentToken->is(tok::l_paren) && CurrentToken->Next && + CurrentToken->Next->isOneOf(tok::star, tok::amp, tok::caret)); if ((CurrentToken->Previous->isOneOf(tok::kw_const, tok::kw_auto) || CurrentToken->Previous->isSimpleTypeSpecifier()) && - !CurrentToken->isOneOf(tok::l_brace, tok::l_paren)) + !(CurrentToken->is(tok::l_brace) || + (CurrentToken->is(tok::l_paren) && !ProbablyFunctionTypeLParen))) Contexts.back().IsExpression = false; if (CurrentToken->isOneOf(tok::semi, tok::colon)) { MightBeObjCForRangeLoop = false;
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -8707,6 +8707,11 @@ verifyIndependentOfContext("MACRO('0' <= c && c <= '9');"); verifyFormat("void f() { f(float{1}, a * a); }"); verifyFormat("void f() { f(float(1), a * a); }"); + + verifyFormat("f((void (*)(int))g);"); + verifyFormat("f((void (&)(int))g);"); + verifyFormat("f((void (^)(int))g);"); + // FIXME: Is there a way to make this work? // verifyIndependentOfContext("MACRO(A *a);"); verifyFormat("MACRO(A &B);"); Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -397,9 +397,13 @@ !CurrentToken->Next->HasUnescapedNewline && !CurrentToken->Next->isTrailingComment()) HasMultipleParametersOnALine = true; + bool ProbablyFunctionTypeLParen = + (CurrentToken->is(tok::l_paren) && CurrentToken->Next && + CurrentToken->Next->isOneOf(tok::star, tok::amp, tok::caret)); if ((CurrentToken->Previous->isOneOf(tok::kw_const, tok::kw_auto) || CurrentToken->Previous->isSimpleTypeSpecifier()) && - !CurrentToken->isOneOf(tok::l_brace, tok::l_paren)) + !(CurrentToken->is(tok::l_brace) || + (CurrentToken->is(tok::l_paren) && !ProbablyFunctionTypeLParen))) Contexts.back().IsExpression = false; if (CurrentToken->isOneOf(tok::semi, tok::colon)) { MightBeObjCForRangeLoop = false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits