[clang-format] Handle shifts within conditions

In some situation shifts can be treated as a template, and is thus formatted as one. So, by doing a couple extra checks to assure that the condition doesn't contain a template, and is in fact a bit shift should solve this problem.

This is a fix for [[ https://bugs.llvm.org/show_bug.cgi?id=46969 | bug 46969 ]]

Reviewed By: MyDeveloperDay

Patch By: Saldivarcher

Differential Revision: https://reviews.llvm.org/D86581
This commit is contained in:
mydeveloperday 2020-09-08 16:39:11 +01:00
parent c2f6a00128
commit c81dd3d159
2 changed files with 28 additions and 7 deletions

View File

@ -56,6 +56,13 @@ static bool isLambdaParameterList(const FormatToken *Left) {
Left->Previous->MatchingParen->is(TT_LambdaLSquare);
}
/// Returns \c true if the token is followed by a boolean condition, \c false
/// otherwise.
static bool isKeywordWithCondition(const FormatToken &Tok) {
return Tok.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch,
tok::kw_constexpr, tok::kw_catch);
}
/// A parser that gathers additional information about tokens.
///
/// The \c TokenAnnotator tries to match parenthesis and square brakets and
@ -108,6 +115,12 @@ private:
while (CurrentToken) {
if (CurrentToken->is(tok::greater)) {
// Try to do a better job at looking for ">>" within the condition of
// a statement.
if (CurrentToken->Next && CurrentToken->Next->is(tok::greater) &&
Left->ParentBracket != tok::less &&
isKeywordWithCondition(*Line.First))
return false;
Left->MatchingParen = CurrentToken;
CurrentToken->MatchingParen = Left;
// In TT_Proto, we must distignuish between:
@ -2768,13 +2781,6 @@ bool TokenAnnotator::spaceRequiredBeforeParens(const FormatToken &Right) const {
Right.ParameterCount > 0);
}
/// Returns \c true if the token is followed by a boolean condition, \c false
/// otherwise.
static bool isKeywordWithCondition(const FormatToken &Tok) {
return Tok.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch,
tok::kw_constexpr, tok::kw_catch);
}
bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
const FormatToken &Left,
const FormatToken &Right) {

View File

@ -7565,6 +7565,21 @@ TEST_F(FormatTest, UnderstandsTemplateParameters) {
verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
verifyFormat("some_templated_type<decltype([](int i) { return i; })>");
}
TEST_F(FormatTest, UnderstandsShiftOperators) {
verifyFormat("if (i < x >> 1)");
verifyFormat("while (i < x >> 1)");
verifyFormat("for (unsigned i = 0; i < i; ++i, v = v >> 1)");
verifyFormat("for (unsigned i = 0; i < x >> 1; ++i, v = v >> 1)");
verifyFormat(
"for (std::vector<int>::iterator i = 0; i < x >> 1; ++i, v = v >> 1)");
verifyFormat("Foo.call<Bar<Function>>()");
verifyFormat("if (Foo.call<Bar<Function>>() == 0)");
verifyFormat("for (std::vector<std::pair<int>>::iterator i = 0; i < x >> 1; "
"++i, v = v >> 1)");
verifyFormat("if (w<u<v<x>>, 1>::t)");
}
TEST_F(FormatTest, BitshiftOperatorWidth) {