CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
125 lines
5.1 KiB
C++
125 lines
5.1 KiB
C++
// RUN: %check_clang_tidy %s bugprone-inc-dec-in-conditions %t
|
|
|
|
template<typename T>
|
|
struct Iterator {
|
|
Iterator operator++(int);
|
|
Iterator operator--(int);
|
|
Iterator& operator++();
|
|
Iterator& operator--();
|
|
T operator*();
|
|
bool operator==(Iterator) const;
|
|
bool operator!=(Iterator) const;
|
|
};
|
|
|
|
template<typename T>
|
|
struct Container {
|
|
Iterator<T> begin();
|
|
Iterator<T> end();
|
|
};
|
|
|
|
bool f(int x) {
|
|
return (++x != 5 or x == 10);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: incrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool f2(int x) {
|
|
return (x++ != 5 or x == 10);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: incrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool c(Container<int> x) {
|
|
auto it = x.begin();
|
|
return (it++ != x.end() and *it);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: incrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool c2(Container<int> x) {
|
|
auto it = x.begin();
|
|
return (++it != x.end() and *it);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: incrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool d(int x) {
|
|
return (--x != 5 or x == 10);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: decrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool d2(int x) {
|
|
return (x-- != 5 or x == 10);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: decrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool g(Container<int> x) {
|
|
auto it = x.begin();
|
|
return (it-- != x.end() and *it);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: decrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool g2(Container<int> x) {
|
|
auto it = x.begin();
|
|
return (--it != x.end() and *it);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: decrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
bool doubleCheck(Container<int> x) {
|
|
auto it = x.begin();
|
|
auto it2 = x.begin();
|
|
return (--it != x.end() and ++it2 != x.end()) and (*it == *it2);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: decrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:31: warning: incrementing and referencing a variable in a complex condition can cause unintended side-effects due to C++'s order of evaluation, consider moving the modification outside of the condition to avoid misunderstandings [bugprone-inc-dec-in-conditions]
|
|
}
|
|
|
|
namespace PR85838 {
|
|
void test()
|
|
{
|
|
auto foo = 0;
|
|
auto bar = 0;
|
|
if (++foo < static_cast<decltype(foo)>(bar)) {}
|
|
if (static_cast<decltype(++foo)>(bar) < foo) {}
|
|
}
|
|
}
|
|
|
|
namespace GH163913 {
|
|
void lambdaWithIncrement(int size) {
|
|
if ([](int n) {
|
|
++n;
|
|
return n;
|
|
}(size) < 42) {}
|
|
}
|
|
|
|
void lambdaWithDecrement(int size) {
|
|
if ([](int n) {
|
|
--n;
|
|
return n;
|
|
}(size) < 42) {}
|
|
}
|
|
|
|
template <typename Func>
|
|
auto eval(Func&& fn) -> decltype(fn()) {
|
|
return fn();
|
|
}
|
|
|
|
void lambdaWithForLoop(int size) {
|
|
if (eval([&] {
|
|
int result = 0;
|
|
for (int i = 0; i < size; i++) {
|
|
result += i;
|
|
}
|
|
return result;
|
|
}) < 42) {}
|
|
}
|
|
|
|
void outsideLambda(int size) {
|
|
if ([](int n) {
|
|
--n;
|
|
return n;
|
|
}(size) < ++size) {}
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: incrementing and referencing a variable in a complex condition
|
|
if (++size > [](int n) {
|
|
--n;
|
|
return n;
|
|
}(size)) {}
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:9: warning: incrementing and referencing a variable in a complex condition
|
|
}
|
|
}
|