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
287 lines
8.3 KiB
C++
287 lines
8.3 KiB
C++
// RUN: %check_clang_tidy -std=c++17-or-later %s modernize-use-nodiscard %t -- \
|
|
// RUN: -config="{CheckOptions: {modernize-use-nodiscard.ReplacementString: 'NO_DISCARD'}}"
|
|
#include <string>
|
|
|
|
namespace std {
|
|
template <class>
|
|
class function;
|
|
}
|
|
|
|
namespace boost {
|
|
template <class>
|
|
class function;
|
|
}
|
|
|
|
#define MUST_USE_RESULT __attribute__((warn_unused_result))
|
|
#define NO_DISCARD [[nodiscard]]
|
|
#define NO_RETURN [[noreturn]]
|
|
|
|
#define BOOLEAN_FUNC bool f23() const
|
|
|
|
typedef unsigned my_unsigned;
|
|
typedef unsigned &my_unsigned_reference;
|
|
typedef const unsigned &my_unsigned_const_reference;
|
|
|
|
struct NO_DISCARD NoDiscardStruct{};
|
|
|
|
template <typename T>
|
|
struct NO_DISCARD NoDiscardTemplate {};
|
|
|
|
using NoDiscardTemplateAlias = NoDiscardTemplate<int>;
|
|
typedef NoDiscardTemplate<int> NoDiscardTemplateTypedef;
|
|
|
|
class Foo {
|
|
public:
|
|
using size_type = unsigned;
|
|
|
|
bool f1() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f1' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f1() const;
|
|
|
|
bool f2(int) const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f2' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f2(int) const;
|
|
|
|
bool f3(const int &) const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f3' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f3(const int &) const;
|
|
|
|
bool f4(void) const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f4' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f4(void) const;
|
|
|
|
// negative tests
|
|
|
|
void f5() const;
|
|
|
|
bool f6();
|
|
|
|
bool f7(int &);
|
|
|
|
bool f8(int &) const;
|
|
|
|
bool f9(int *) const;
|
|
|
|
bool f10(const int &, int &) const;
|
|
|
|
NO_DISCARD bool f12() const;
|
|
|
|
MUST_USE_RESULT bool f13() const;
|
|
|
|
[[nodiscard]] bool f11() const;
|
|
|
|
[[clang::warn_unused_result]] bool f11a() const;
|
|
|
|
[[gnu::warn_unused_result]] bool f11b() const;
|
|
|
|
bool _f20() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function '_f20' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool _f20() const;
|
|
|
|
NO_RETURN bool f21() const;
|
|
|
|
~Foo();
|
|
|
|
bool operator+=(int) const;
|
|
|
|
// extra keywords (virtual,inline,const) on return type
|
|
|
|
virtual bool f14() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f14' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD virtual bool f14() const;
|
|
|
|
const bool f15() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f15' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD const bool f15() const;
|
|
|
|
inline const bool f16() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f16' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD inline const bool f16() const;
|
|
|
|
inline const std::string &f45() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f45' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD inline const std::string &f45() const;
|
|
|
|
inline virtual const bool f17() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f17' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD inline virtual const bool f17() const;
|
|
|
|
// inline with body
|
|
bool f18() const
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f18' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f18() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool f19() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f19' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f19() const;
|
|
|
|
BOOLEAN_FUNC;
|
|
|
|
bool f24(size_type) const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f24' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f24(size_type) const;
|
|
|
|
bool f28(my_unsigned) const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f28' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f28(my_unsigned) const;
|
|
|
|
bool f29(my_unsigned_reference) const;
|
|
|
|
bool f30(my_unsigned_const_reference) const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f30' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool f30(my_unsigned_const_reference) const;
|
|
|
|
template <class F>
|
|
F f37(F a, F b) const;
|
|
|
|
template <class F>
|
|
bool f38(F a) const;
|
|
|
|
bool f39(const std::function<bool()> &predicate) const;
|
|
|
|
bool f39a(std::function<bool()> predicate) const;
|
|
|
|
bool f39b(const std::function<bool()> predicate) const;
|
|
|
|
bool f45(const boost::function<bool()> &predicate) const;
|
|
|
|
bool f45a(boost::function<bool()> predicate) const;
|
|
|
|
bool f45b(const boost::function<bool()> predicate) const;
|
|
|
|
// Do not add ``[[nodiscard]]`` to parameter packs.
|
|
template <class... Args>
|
|
bool ParameterPack(Args... args) const;
|
|
|
|
template <typename... Targs>
|
|
bool ParameterPack2(Targs... Fargs) const;
|
|
|
|
// Do not add ``[[nodiscard]]`` to variadic functions.
|
|
bool VariadicFunctionTest(const int &, ...) const;
|
|
|
|
// Do not add ``[[nodiscard]]`` to non constant static functions.
|
|
static bool not_empty();
|
|
|
|
// Do not add ``[[nodiscard]]`` to conversion functions.
|
|
// explicit operator bool() const { return true; }
|
|
|
|
// Do not add ``[[nodiscard]]`` to functions returning types marked [[nodiscard]].
|
|
NoDiscardStruct f50() const;
|
|
|
|
// Do not add ``[[nodiscard]]`` to functions returning class template
|
|
// specializations whose primary template is marked [[nodiscard]].
|
|
NoDiscardTemplate<int> f51() const;
|
|
|
|
NoDiscardTemplateAlias f52() const;
|
|
|
|
NoDiscardTemplateTypedef f53() const;
|
|
|
|
const NoDiscardTemplate<int> f54() const;
|
|
|
|
const NoDiscardTemplate<int> &f55() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f55' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD const NoDiscardTemplate<int> &f55() const;
|
|
};
|
|
|
|
// Do not add ``[[nodiscard]]`` to Lambda.
|
|
const auto nonConstReferenceType = [] {
|
|
return true;
|
|
};
|
|
|
|
auto lambda1 = [](int a, int b) { return a < b; };
|
|
auto lambda1a = [](int a) { return a; };
|
|
auto lambda1b = []() { return true;};
|
|
|
|
auto get_functor = [](bool check) {
|
|
return [&](const std::string& sr)->std::string {
|
|
if(check){
|
|
return std::string();
|
|
}
|
|
return std::string();
|
|
};
|
|
};
|
|
|
|
// Do not add ``[[nodiscard]]`` to function definition.
|
|
bool Foo::f19() const {
|
|
return true;
|
|
}
|
|
|
|
template <class T>
|
|
class Bar {
|
|
public:
|
|
using value_type = T;
|
|
using reference = value_type &;
|
|
using const_reference = const value_type &;
|
|
|
|
// Do not add ``[[nodiscard]]`` to non explicit conversion functions.
|
|
operator bool() const { return true; }
|
|
|
|
bool empty() const;
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'empty' should be marked NO_DISCARD [modernize-use-nodiscard]
|
|
// CHECK-FIXES: NO_DISCARD bool empty() const;
|
|
|
|
// we cannot assume that the template parameter isn't a pointer
|
|
bool f25(value_type) const;
|
|
|
|
bool f27(reference) const;
|
|
|
|
typename T::value_type f35() const;
|
|
|
|
T f34() const;
|
|
|
|
bool f31(T) const;
|
|
|
|
bool f33(T &) const;
|
|
|
|
bool f26(const_reference) const;
|
|
|
|
bool f32(const T &) const;
|
|
};
|
|
|
|
template <typename _Tp, int cn>
|
|
class Vec {
|
|
public:
|
|
Vec(_Tp v0, _Tp v1); //!< 2-element vector constructor
|
|
|
|
Vec cross(const Vec &v) const;
|
|
|
|
template <typename T2>
|
|
operator Vec<T2, cn>() const;
|
|
};
|
|
|
|
template <class T>
|
|
class Bar2 {
|
|
public:
|
|
typedef T value_type;
|
|
typedef value_type &reference;
|
|
typedef const value_type &const_reference;
|
|
|
|
// we cannot assume that the template parameter isn't a pointer
|
|
bool f40(value_type) const;
|
|
|
|
bool f41(reference) const;
|
|
|
|
value_type f42() const;
|
|
|
|
typename T::value_type f43() const;
|
|
|
|
bool f44(const_reference) const;
|
|
};
|
|
|
|
template <class T>
|
|
bool Bar<T>::empty() const {
|
|
return true;
|
|
}
|
|
|
|
// don't mark typical ``[[nodiscard]]`` candidates if the class
|
|
// has mutable member variables
|
|
class MutableExample {
|
|
mutable bool m_isempty;
|
|
|
|
public:
|
|
bool empty() const;
|
|
};
|