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