================ @@ -0,0 +1,48 @@ +// RUN: %check_clang_tidy %s misc-must-use %t -- \ +// RUN: -config="{CheckOptions: [{key: 'misc-must-use.Types', value: '::async::Future'}]}" + +namespace async { +template<typename T> +class Future { +public: + T get() { + return Pending; + } +private: + T Pending; +}; + + +} // namespace async + +// Warning is still emitted if there are type aliases. +namespace a { +template<typename T> +using Future = async::Future<T>; +} // namespace a + +void releaseUnits(); +struct Units { + ~Units() { + releaseUnits(); + } +}; +a::Future<Units> acquireUnits(); + +template<typename T> +T qux(T Generic) { + async::Future<Units> PendingA = acquireUnits(); + auto PendingB = acquireUnits(); + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: variable 'PendingB' must be used [misc-must-use] + PendingA.get(); + return Generic; +} + +int bar(int Num) { + a::Future<Units> PendingA = acquireUnits(); + a::Future<Units> PendingB = acquireUnits(); // not used at all, unused variable not fired because of destructor side effect + // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: variable 'PendingB' must be used [misc-must-use] + auto Num2 = PendingA.get(); + auto Num3 = qux(Num); + return Num * Num3; +} ---------------- PiotrZSL wrote:
add tests with: - variable type wrapped into other type, like std::shared_ptr<async::Future> - async::Future used as an static variable - async::Future used as global variable - async::Future used as an function parameter - async::Future captured into lambda - async::Future in template function, like Future<T> Pending; - async::Future used as reference: async::Future& - async::Future used as pointer: async::Future* https://github.com/llvm/llvm-project/pull/76101 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits