1 // RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage \
2 // RUN: -fsafe-buffer-usage-suggestions \
3 // RUN: -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
4
unsafe_array_func_ptr_call(void (* fn_ptr)(int * param))5 void unsafe_array_func_ptr_call(void (*fn_ptr)(int *param)) {
6 int p[32];
7 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:12}:"std::array<int, 32> p"
8
9 int idx;
10 p[idx] = 10;
11 fn_ptr(p);
12 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:".data()"
13 }
14
unsafe_ptr_func_ptr_call(void (* fn_ptr)(int * param))15 void unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {
16 int *p;
17 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
18
19 p[5] = 10;
20 fn_ptr(p);
21 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:".data()"
22 }
23
addr_of_unsafe_ptr_func_ptr_call(void (* fn_ptr)(int * param))24 void addr_of_unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {
25 int *p;
26 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
27
28 p[5] = 10;
29 fn_ptr(&p[0]);
30 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:15}:"p.data()"
31 }
32
addr_of_unsafe_ptr_w_offset_func_ptr_call(void (* fn_ptr)(int * param))33 void addr_of_unsafe_ptr_w_offset_func_ptr_call(void (*fn_ptr)(int *param)) {
34 int *p;
35 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
36
37 p[5] = 10;
38 fn_ptr(&p[3]);
39 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:15}:"&p.data()[3]"
40 }
41
preincrement_unsafe_ptr_func_ptr_call(void (* fn_ptr)(int * param))42 void preincrement_unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {
43 int *p;
44 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
45
46 p[5] = 10;
47 fn_ptr(++p);
48 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:13}:"(p = p.subspan(1)).data()"
49 }
50