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