| // RUN: %check_clang_tidy %s bugprone-unused-return-value %t \ |
| // RUN: -config='{CheckOptions: \ |
| // RUN: [{key: bugprone-unused-return-value.CheckedFunctions, \ |
| // RUN: value: "::fun;::ns::Outer::Inner::memFun;::ns::Type::staticFun;::ns::ClassTemplate::memFun;::ns::ClassTemplate::staticFun"}]}' \ |
| // RUN: -- |
| |
| namespace std { |
| |
| template <typename T> |
| T *launder(T *); |
| |
| } // namespace std |
| |
| namespace ns { |
| |
| struct Outer { |
| struct Inner { |
| bool memFun(); |
| }; |
| }; |
| |
| using AliasName = Outer; |
| |
| struct Derived : public Outer::Inner {}; |
| |
| struct Retval { |
| int *P; |
| Retval() { P = new int; } |
| ~Retval() { delete P; } |
| }; |
| |
| struct Type { |
| Retval memFun(); |
| static Retval staticFun(); |
| }; |
| |
| template <typename T> |
| struct ClassTemplate { |
| Retval memFun(); |
| static Retval staticFun(); |
| }; |
| |
| } // namespace ns |
| |
| int fun(); |
| void fun(int); |
| |
| void warning() { |
| fun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| (fun()); |
| // CHECK-MESSAGES: [[@LINE-1]]:4: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| ns::Outer::Inner ObjA1; |
| ObjA1.memFun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| ns::AliasName::Inner ObjA2; |
| ObjA2.memFun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| ns::Derived ObjA3; |
| ObjA3.memFun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| ns::Type::staticFun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| ns::ClassTemplate<int> ObjA4; |
| ObjA4.memFun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| |
| ns::ClassTemplate<int>::staticFun(); |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should be used [bugprone-unused-return-value] |
| } |
| |
| void noWarning() { |
| auto R1 = fun(); |
| |
| ns::Outer::Inner ObjB1; |
| auto R2 = ObjB1.memFun(); |
| |
| auto R3 = ns::Type::staticFun(); |
| |
| ns::ClassTemplate<int> ObjB2; |
| auto R4 = ObjB2.memFun(); |
| |
| auto R5 = ns::ClassTemplate<int>::staticFun(); |
| |
| // test calling a void overload of a checked function |
| fun(5); |
| |
| // test discarding return value of functions that are not configured to be checked |
| int I = 1; |
| std::launder(&I); |
| |
| ns::Type ObjB3; |
| ObjB3.memFun(); |
| } |