================
@@ -0,0 +1,89 @@
+// RUN: %check_clang_tidy -std=c++20 %s modernize-use-std-erase %t
+#include <deque>
+#include <list>
+#include <string>
+#include <vector>
+
+namespace std {
+template <class ForwardIt, class T>
+ForwardIt remove(ForwardIt first, ForwardIt last, const T& value);
+
+template <class ForwardIt, class UnaryPredicate>
+ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p);
+
+// Dummy implementation
+template <class ForwardIt, class UnaryPredicate>
+ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p) {
+  return first;
+}
+
+} // namespace std
+
+// Custom container - should be ignored
+template <typename T>
+struct MyContainer {
+  using iterator = T*;
+  iterator begin();
+  iterator end();
+  iterator erase(iterator, iterator);
+};
+
+void test_standard_remove_idiom() {
+  std::vector<int> v;
+  v.erase(std::remove(v.begin(), v.end(), 42), v.end());
+  // CHECK-MESSAGES: {{.*}}: warning: prefer std::erase over the erase-remove 
idiom [modernize-use-std-erase]
+  // CHECK-FIXES: std::erase(v, 42);
+
+  std::deque<int> d;
+  d.erase(std::remove(d.begin(), d.end(), 42), d.end());
+  // CHECK-MESSAGES: {{.*}}: warning: prefer std::erase over the erase-remove 
idiom [modernize-use-std-erase]
+  // CHECK-FIXES: std::erase(d, 42);
+}
+
+void test_standard_remove_if_idiom() {
+  std::vector<int> v;
+  auto IsNegative = [](int x) { return x < 0; };
+  
+  v.erase(std::remove_if(v.begin(), v.end(), IsNegative), v.end());
+  // CHECK-MESSAGES: {{.*}}: warning: prefer std::erase_if over the 
erase-remove_if idiom [modernize-use-std-erase]
+  // CHECK-FIXES: std::erase_if(v, IsNegative);
+
+  std::list<int> l;
+  l.erase(std::remove_if(l.begin(), l.end(), IsNegative), l.end());
+  // CHECK-MESSAGES: {{.*}}: warning: prefer std::erase_if over the 
erase-remove_if idiom [modernize-use-std-erase]
+  // CHECK-FIXES: std::erase_if(l, IsNegative);
+}
+
+void test_string_special_case() {
+  std::string s;
+  s.erase(std::remove(s.begin(), s.end(), ' '), s.end());
+  // CHECK-MESSAGES: {{.*}}: warning: prefer std::erase over the erase-remove 
idiom [modernize-use-std-erase]
+  // CHECK-FIXES: std::erase(s, ' ');
+}
+
+auto IsEven = [](int i) { return i % 2 == 0; };
+
+void test_remove_negative_cases() {
+  std::vector<int> v;
+  std::vector<int> v2;
+
+  v.erase(std::remove_if(v.rbegin(), v.rend(), IsEven), v.rend());
+  // CHECK-FIXES: v.erase(std::remove_if(v.rbegin(), v.rend(), IsEven), 
v.rend());
----------------
vbvictor wrote:

Don't write fixes for negative cases

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

Reply via email to