xref: /llvm-project/clang/test/SemaCXX/warn-unsafe-buffer-usage-multi-decl-uuc-fixits.cpp (revision fde4b80cb772897a8cf0b3d022f3041e10b6e816)
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