forked from OSchip/llvm-project
[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:
parent
c2f6a00128
commit
c81dd3d159
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue