================ @@ -245,3 +243,56 @@ struct AggregateViaDefaultInit { void testAggregateViaDefaultInit() { AggregateViaDefaultInit A; }; + +struct A { + int arr[2]; + + [[clang::unsafe_buffer_usage]] + int *ptr; +}; + +namespace std{ + template <typename T> class span { + + T *elements; + + public: + + constexpr span(T *, unsigned){} + + template<class Begin, class End> + constexpr span(Begin first, End last){} + + constexpr T* data() const noexcept { + return elements; + } + }; +} + +[[clang::unsafe_buffer_usage]] +void check_no_warnings(unsigned idx) { + int *arr = new int[20]; + + int k = arr[idx]; // no-warning + + std::span<int> sp = {arr, 20}; // no-warning + A *ptr = reinterpret_cast<A*> (sp.data()); // no-warning + A a; + a.ptr = arr; // no-warning +} + +[[clang::unsafe_buffer_usage]] +void check_no_warning_variadic(unsigned idx, int arr[20], ...) { + int k = arr[idx]; // no-warning + + std::span<int> sp = {arr, 20}; // no-warning + A *ptr = reinterpret_cast<A*> (sp.data()); // no-warning + A a; + a.ptr = arr; // no-warning +} + +void invoke_methods() { + int array[20]; + check_no_warnings(30); //expected-warning{{function introduces unsafe buffer manipulation}} ---------------- Fznamznon wrote:
Now I'm confused. Should the warning not be emitted for the call to `check_no_warnings` since it is marked with the attribute? https://github.com/llvm/llvm-project/pull/125671 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits