[llvm-branch-commits] [clang] 42ee33c - [clang-format] Handle shifts within conditions
Hans Wennborg via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Sep 8 10:04:21 PDT 2020
Author: mydeveloperday
Date: 2020-09-08T18:59:41+02:00
New Revision: 42ee33ca2bee10faedb6a02031c88bd6f70193f0
URL: https://github.com/llvm/llvm-project/commit/42ee33ca2bee10faedb6a02031c88bd6f70193f0
DIFF: https://github.com/llvm/llvm-project/commit/42ee33ca2bee10faedb6a02031c88bd6f70193f0.diff
LOG: [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
(cherry picked from commit c81dd3d159ab03d46e4280c458d3c29e56648218)
Added:
Modified:
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 7f8e35126512..914c05f72aec 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -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 @@ class AnnotatingParser {
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:
@@ -2733,13 +2746,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) {
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 6ac3ffbffd1c..17d302f0b659 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -7508,6 +7508,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) {
More information about the llvm-branch-commits
mailing list