| // RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage -fdiagnostics-parseable-fixits -fsafe-buffer-usage-suggestions %s 2>&1 | FileCheck %s |
| |
| void foo1a() { |
| int *r = new int[7]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| int *p = new int[4]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| p = r; |
| int tmp = p[9]; |
| int *q; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| q = r; // FIXME: we do not fix `q = r` here as the `.data()` fix-it is not generally correct |
| } |
| |
| void foo1b() { |
| int *r = new int[7]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}" |
| int *p = new int[4]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" |
| p = r; |
| int tmp = p[9]; |
| int *q = new int[4]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> q" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" |
| q = r; |
| tmp = q[9]; |
| } |
| |
| void foo1c() { |
| int *r = new int[7]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| int *p = new int[4]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| p = r; // FIXME: we do not fix `p = r` here as the `.data()` fix-it is not generally correct |
| int tmp = r[9]; |
| int *q; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| q = r; |
| tmp = q[9]; |
| } |
| |
| void foo2a() { |
| int *r = new int[7]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}" |
| int *p = new int[5]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 5}" |
| int *q = new int[4]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> q" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" |
| p = q; |
| int tmp = p[8]; |
| q = r; |
| } |
| |
| void foo2b() { |
| int *r = new int[7]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| int *p = new int[5]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| int *q = new int[4]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| p = q; // FIXME: we do not fix `p = q` here as the `.data()` fix-it is not generally correct |
| int tmp = q[8]; |
| q = r; |
| } |
| |
| void foo2c() { |
| int *r = new int[7]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}" |
| int *p = new int[5]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 5}" |
| int *q = new int[4]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> q" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" |
| p = q; |
| int tmp = p[8]; |
| q = r; |
| tmp = q[8]; |
| } |
| |
| void foo3a() { |
| int *r = new int[7]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| int *p = new int[5]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| int *q = new int[4]; |
| // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]: |
| q = p; // FIXME: we do not fix `q = p` here as the `.data()` fix-it is not generally correct |
| int tmp = p[8]; |
| q = r; |
| } |
| |
| void foo3b() { |
| int *r = new int[10]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}" |
| int *p = new int[10]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}" |
| int *q = new int[10]; |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> q" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" |
| // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}" |
| q = p; |
| int tmp = q[8]; |
| q = r; |
| } |