Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
cb748c3
[clang-tidy] Add modernize-use-span-first-last check
hjanuschka Nov 29, 2024
ec5a6b0
format
hjanuschka Nov 29, 2024
5cf1b7c
format
hjanuschka Nov 29, 2024
b357f8c
format
hjanuschka Nov 29, 2024
42d1df2
format
hjanuschka Nov 29, 2024
04f3edc
format
hjanuschka Nov 29, 2024
2f9cc3e
format
hjanuschka Nov 29, 2024
24690e3
up
hjanuschka Nov 29, 2024
39833d4
up
hjanuschka Nov 29, 2024
964fadc
format
hjanuschka Nov 29, 2024
79afa9e
format
hjanuschka Nov 29, 2024
31d300f
format
hjanuschka Nov 29, 2024
c7fd4d5
format
hjanuschka Nov 29, 2024
4a9fc6e
Update clang-tools-extra/clang-tidy/readability/UseSpanFirstLastCheck…
hjanuschka Dec 2, 2024
3f604e5
Update clang-tools-extra/clang-tidy/readability/UseSpanFirstLastCheck.h
hjanuschka Dec 2, 2024
7e2aaa4
feed
hjanuschka Dec 2, 2024
b2e82cf
Merge branch 'subspan' of github.com:hjanuschka/llvm-project into sub…
hjanuschka Dec 2, 2024
c707971
up
hjanuschka Dec 2, 2024
cd2fce3
feedback
hjanuschka Dec 2, 2024
72610ac
feedback
hjanuschka Dec 2, 2024
b565ef7
feedback
hjanuschka Dec 2, 2024
3e9b0c6
feedback
hjanuschka Dec 3, 2024
2c65d52
feedback
hjanuschka Dec 3, 2024
8c16f74
up
hjanuschka Dec 4, 2024
514ac50
up
hjanuschka Dec 5, 2024
86b467b
up
hjanuschka Dec 5, 2024
6ab0051
up
hjanuschka Dec 5, 2024
39da599
up
hjanuschka Dec 11, 2024
8ba6771
feedback
hjanuschka Dec 11, 2024
79702fb
feedback
hjanuschka Dec 11, 2024
0a1d6cb
feedback
hjanuschka Dec 14, 2024
3354841
feedback
hjanuschka Dec 14, 2024
1fc1375
feedback
hjanuschka Dec 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions clang-tools-extra/clang-tidy/readability/UseSpanFirstLastCheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
//===----------------------------------------------------------------------===//

#include "UseSpanFirstLastCheck.h"
#include "../utils/ASTUtils.h"
#include "../utils/Matchers.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Lex/Lexer.h"

using namespace clang::ast_matchers;
using namespace clang::tidy::matchers;

namespace clang::tidy::readability {

Expand All @@ -32,13 +35,17 @@ void UseSpanFirstLastCheck::registerMatchers(MatchFinder *Finder) {
.bind("first_subspan"),
this);

// Match span.subspan(size() - n) or span.subspan(std::ranges::size(span) - n)
// Match span.subspan(span.size() - n) or span.subspan(std::ranges::size(span)
// - n)
// -> last(n)
const auto SizeCall = anyOf(
cxxMemberCallExpr(
callee(memberExpr(hasDeclaration(cxxMethodDecl(hasName("size")))))),
callExpr(callee(
functionDecl(hasAnyName("::std::size", "::std::ranges::size")))));
callee(memberExpr(hasDeclaration(cxxMethodDecl(hasName("size"))))),
on(expr(isStatementIdenticalToBoundNode("span_object")))),
callExpr(callee(functionDecl(
hasAnyName("::std::size", "::std::ranges::size"))),
hasArgument(
0, expr(isStatementIdenticalToBoundNode("span_object")))));

Finder->addMatcher(
cxxMemberCallExpr(
Expand Down Expand Up @@ -75,6 +82,7 @@ void UseSpanFirstLastCheck::check(const MatchFinder::MatchResult &Result) {
diag(FirstCall->getBeginLoc(), "prefer 'span::first()' over 'subspan()'")
<< FixItHint::CreateReplacement(FirstCall->getSourceRange(),
Replacement);
return;
}

if (const auto *LastCall =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,30 @@ void test_ranges() {
// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: prefer 'span::last()' over 'subspan()'
// CHECK-FIXES: auto sub2 = s.last(n);
}

void test_different_spans() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {6, 7, 8, 9, 10};
std::span<int> s1(arr1, 5);
std::span<int> s2(arr2, 5);

// These should NOT trigger warnings as they use size() from a different span
auto sub1 = s1.subspan(s2.size() - 2); // No warning
auto sub2 = s2.subspan(s1.size() - 3); // No warning

// Also check with std::ranges::size
auto sub3 = s1.subspan(std::ranges::size(s2) - 2); // No warning
auto sub4 = s2.subspan(std::ranges::size(s1) - 3); // No warning

// Mixed usage should also not trigger
auto sub5 = s1.subspan(s2.size() - s1.size()); // No warning

// Verify that correct usage still triggers warnings
auto good1 = s1.subspan(s1.size() - 2);
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer 'span::last()' over 'subspan()'
// CHECK-FIXES: auto good1 = s1.last(2);

auto good2 = s2.subspan(std::ranges::size(s2) - 3);
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer 'span::last()' over 'subspan()'
// CHECK-FIXES: auto good2 = s2.last(3);
}
Loading