================
@@ -0,0 +1,107 @@
+// RUN: %check_clang_tidy %s llvm-use-vector-utils %t
+
+// CHECK-FIXES: #include "llvm/ADT/SmallVectorExtras.h"
+
+namespace llvm {
+
+template <typename T> class SmallVector {};
+
+template <typename RangeT>
+SmallVector<int> to_vector(RangeT &&Range);
+
+template <unsigned Size, typename RangeT>
+SmallVector<int> to_vector(RangeT &&Range);
+
+template <typename Out, typename RangeT>
+SmallVector<Out> to_vector_of(RangeT &&Range);
+
+template <typename Out, unsigned Size, typename RangeT>
+SmallVector<Out> to_vector_of(RangeT &&Range);
+
+template <typename ContainerT, typename FuncT>
+struct mapped_range {};
+
+template <typename ContainerT, typename FuncT>
+mapped_range<ContainerT, FuncT> map_range(ContainerT &&C, FuncT &&F);
+
+// Hypothetical 3-arg overload (for future-proofing).
+template <typename ContainerT, typename FuncT, typename ExtraT>
+mapped_range<ContainerT, FuncT> map_range(ContainerT &&C, FuncT &&F, ExtraT 
&&E);
+
+template <typename ContainerT, typename PredT>
+struct filter_range {};
+
+template <typename ContainerT, typename PredT>
+filter_range<ContainerT, PredT> make_filter_range(ContainerT &&C, PredT &&P);
+
+// Hypothetical 3-arg overload (for future-proofing).
+template <typename ContainerT, typename PredT, typename ExtraT>
+filter_range<ContainerT, PredT> make_filter_range(ContainerT &&C, PredT &&P, 
ExtraT &&E);
+
+} // namespace llvm
+
+int transform(int x);
+bool is_even(int x);
+
+void test_map_range() {
+  llvm::SmallVector<int> vec;
+
+  auto result = llvm::to_vector(llvm::map_range(vec, transform));
+  // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use 'map_to_vector'
+  // CHECK-FIXES: auto result = llvm::map_to_vector(vec, transform);
+
+  auto result_sized = llvm::to_vector<4>(llvm::map_range(vec, transform));
+  // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: use 'map_to_vector'
+  // CHECK-FIXES: auto result_sized = llvm::map_to_vector<4>(vec, transform);
+
+  auto result_global = ::llvm::to_vector(::llvm::map_range(vec, transform));
+  // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use 'map_to_vector'
+  // CHECK-FIXES: auto result_global = ::llvm::map_to_vector(vec, transform);
+}
+
+void test_filter_range() {
+  llvm::SmallVector<int> vec;
+
+  auto result = llvm::to_vector(llvm::make_filter_range(vec, is_even));
+  // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use 'filter_to_vector'
+  // CHECK-FIXES: auto result = llvm::filter_to_vector(vec, is_even);
+
+  auto result_sized = llvm::to_vector<6>(llvm::make_filter_range(vec, 
is_even));
+  // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: use 'filter_to_vector'
+  // CHECK-FIXES: auto result_sized = llvm::filter_to_vector<6>(vec, is_even);
+}
+
+namespace llvm {
+
+void test_inside_llvm_namespace() {
+  SmallVector<int> vec;
+
+  // Unprefixed calls inside the `llvm` namespace should also be detected.
+  auto result = to_vector(map_range(vec, transform));
+  // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use 'map_to_vector'
+  // CHECK-FIXES: auto result = map_to_vector(vec, transform);
+}
+
+} // namespace llvm
+
----------------
zeyi2 wrote:

It might be worth adding a test case to verify that the check preserves 
comments correctly :)

For example:

```c++
auto r1 = llvm::to_vector( /* please keep me */ llvm::map_range(vec, 
transform));
auto r2 = llvm::to_vector(llvm::map_range( /* please keep me */ vec, 
transform));
```

I grepped the codebase and didn't find any current occurrences of this pattern, 
so this is a minor nit (I'm okay if you don't want to address it in this PR), 
but it would be good to ensure the Fix-It logic is robust.


https://github.com/llvm/llvm-project/pull/177722
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to