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
bar(int * param)5 void bar(int * param) {}
6
foo1a()7 void foo1a() {
8 int *r = new int[7];
9 // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:
10 int *p = new int[4];
11 // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:
12 p = r;
13 int tmp = p[9];
14 int *q;
15 q = r; // FIXME: we do not fix `q = r` here as the `.data()` fix-it is not generally correct
16 }
17
uuc_if_body()18 void uuc_if_body() {
19 int *r = new int[7];
20 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
21 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
22 // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}"
23 int *p = new int[4];
24 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
25 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
26 // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}"
27 if (true)
28 p = r;
29 p[5] = 4;
30 }
31
uuc_if_body1(bool flag)32 void uuc_if_body1(bool flag) {
33 int *r = new int[7];
34 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
35 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
36 // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}"
37 int *p = new int[4];
38 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
39 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
40 // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}"
41 if (flag) {
42 p = r;
43 }
44 p[5] = 4;
45 }
46
uuc_if_body2_ptr_init(bool flag)47 void uuc_if_body2_ptr_init(bool flag) {
48 int *r = new int[7];
49 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
50 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
51 // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}"
52 if (flag) {
53 } else {
54 int* p = r;
55 // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:5-[[@LINE-1]]:9}:"std::span<int>"
56 // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:14-[[@LINE-2]]:14}:"{"
57 // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:15}:", <# placeholder #>}"
58 p[5] = 4;
59 }
60 }
61
uuc_if_cond_no_unsafe_op()62 void uuc_if_cond_no_unsafe_op() {
63 int *r = new int[7];
64 int *p = new int[4];
65 if ((p = r)) {
66 int x = 0;
67 }
68 }
69
uuc_if_cond_unsafe_op()70 void uuc_if_cond_unsafe_op() {
71 int *r = new int[7];
72 int *p = new int[4];
73 if ((p = r)) {
74 p[3] = 2;
75 }
76 }
77
uuc_if_cond_unsafe_op1()78 void uuc_if_cond_unsafe_op1() {
79 int *r = new int[7];
80 int *p = new int[4];
81 if ((p = r)) {
82 r[3] = 2;
83 }
84 }
85
uuc_if_cond_unsafe_op2()86 void uuc_if_cond_unsafe_op2() {
87 int *r = new int[7];
88 int *p = new int[4];
89 if ((p = r)) {
90 r[3] = 2;
91 }
92 p[4] = 6;
93 }
94
uuc_call1()95 void uuc_call1() {
96 int *w = new int[4];
97 int *y = new int[4];
98 bar(w = y);
99 w[5] = 0;
100 }
101