| // RUN: %clang_analyze_cc1 -std=c++23 -analyzer-checker=core,cplusplus.Move -verify %s | |
| #include "Inputs/system-header-simulator-cxx.h" | |
| int implicit_capture_by_value() { | |
| int d = 0; | |
| auto lam = [d]() { return 1 / d; }; // expected-warning {{Division by zero}} | |
| return lam(); | |
| } | |
| int explicit_rvalue_self_capture_by_reference() { | |
| int d = 0; | |
| auto lam = [&d](this auto &&self) { return 1 / d; }; // expected-warning {{Division by zero}} | |
| return lam(); | |
| } | |
| int gh218708_explicit_rvalue_self() { | |
| int d = 0; | |
| auto lam = [d](this auto &&self) { return 1 / d; }; // expected-warning {{Division by zero}} | |
| return lam(); | |
| } | |
| int gh218708_explicit_lvalue_self() { | |
| int d = 0; | |
| auto lam = [d](this auto &self) { return 1 / d; }; // expected-warning {{Division by zero}} | |
| return lam(); | |
| } | |
| int gh218708_explicit_by_value_self() { | |
| int d = 0; | |
| auto lam = [d](this auto self) { return 1 / d; }; // expected-warning {{Division by zero}} | |
| return lam(); | |
| } | |
| int explicit_rvalue_no_error() { | |
| int d = 5; | |
| auto lam = [d](this auto &&self) { return 1 / d; }; // no-warning | |
| return lam(); | |
| } | |
| int explicit_by_value_no_error() { | |
| int d = 9; | |
| auto lam = [d](this auto self) { return 1 / d; }; // no-warning | |
| return lam(); | |
| } | |
| auto by_val() { | |
| std::vector<int> v; | |
| auto lam = [v](this auto self) { | |
| auto res = std::move(v); | |
| return res; | |
| }; | |
| lam(); | |
| lam(); | |
| } | |
| auto by_lval() { | |
| std::vector<int> v; | |
| auto lam = [v](this auto &self) { | |
| auto res = std::move(v); // expected-warning {{Moved-from object '' of type 'std::vector' is moved}} | |
| return res; | |
| }; | |
| lam(); | |
| lam(); | |
| } | |
| auto by_rval() { | |
| std::vector<int> v; | |
| auto lam = [v](this auto &&self) { | |
| auto res = std::move(v); // expected-warning {{Moved-from object '' of type 'std::vector' is moved}} | |
| return res; | |
| }; | |
| std::move(lam)(); | |
| std::move(lam)(); | |
| } |