https://github.com/dyung created
https://github.com/llvm/llvm-project/pull/230875
Our downstream compiler defaults to c++20 mode for the compiler, so this newly
added test from #229871 failed because in C++20 mode there are a different set
of warnings/notes emitted by the compiler.
Here is the compiler output when compiled with C++20 as the default:
```
$ ~/src/upstream/1fcb5a0-linux/bin/clang -std=c++20 -Wunsafe-buffer-usage
-fsafe-buffer-usage-suggestions warn-unsafe-buffer-usage-main-argv.cpp
warn-unsafe-buffer-usage-main-argv.cpp:4:27: warning: 'argv' is an unsafe
pointer used for buffer access [-Wunsafe-buffer-usage-main-argv]
4 | int main(int argc, char **argv) {
| ~~~~~~~^~~~
warn-unsafe-buffer-usage-main-argv.cpp:9:17: note: used in pointer arithmetic
here
9 | char **ptr1 = argv + 1;
| ^~~~
warn-unsafe-buffer-usage-main-argv.cpp:11:3: note: used in pointer arithmetic
here
11 | argv++;
| ^~~~
warn-unsafe-buffer-usage-main-argv.cpp:6:12: note: used in buffer access here
6 | char c = argv[1][0];
| ^~~~
warn-unsafe-buffer-usage-main-argv.cpp:13:3: note: used in pointer arithmetic
here
13 | argv += 1;
| ^~~~
warn-unsafe-buffer-usage-main-argv.cpp:15:8: warning: 'p' is an unsafe pointer
used for buffer access [-Wunsafe-buffer-usage]
15 | int *p = nullptr;
| ~~~~~^~~~~~~~~~~
warn-unsafe-buffer-usage-main-argv.cpp:15:8: note: change type of 'p' to
'std::span' to preserve bounds information
15 | int *p = nullptr;
| ~~~~~^ ~~~~~~~
| std::span<int>
warn-unsafe-buffer-usage-main-argv.cpp:17:10: note: used in buffer access here
17 | return p[5];
| ^
warn-unsafe-buffer-usage-main-argv.cpp:20:33: warning: 'argv' is an unsafe
pointer used for buffer access [-Wunsafe-buffer-usage]
20 | int other_func(int argc, char **argv) {
| ~~~~~~~^~~~
warn-unsafe-buffer-usage-main-argv.cpp:20:33: note: change type of 'argv' to
'std::span' to preserve bounds information
20 | int other_func(int argc, char **argv) {
| ~~~~~~~^~~~
| std::span<char *> argv
21 | // both-warning@+1{{unsafe buffer access}}
22 | return argv[1][0];
23 | }
|
warn-unsafe-buffer-usage-main-argv.cpp:22:10: note: used in buffer access here
22 | return argv[1][0];
| ^~~~
3 warnings generated.
```
And:
```
$ ~/src/upstream/1fcb5a0-linux/bin/clang -std=c++20 -Wunsafe-buffer-usage
-Wno-unsafe-buffer-usage-main-argv -fsafe-buffer-usage-suggestions
warn-unsafe-buffer-usage-main-argv.cpp
warn-unsafe-buffer-usage-main-argv.cpp:15:8: warning: 'p' is an unsafe pointer
used for buffer access [-Wunsafe-buffer-usage]
15 | int *p = nullptr;
| ~~~~~^~~~~~~~~~~
warn-unsafe-buffer-usage-main-argv.cpp:15:8: note: change type of 'p' to
'std::span' to preserve bounds information
15 | int *p = nullptr;
| ~~~~~^ ~~~~~~~
| std::span<int>
warn-unsafe-buffer-usage-main-argv.cpp:17:10: note: used in buffer access here
17 | return p[5];
| ^
warn-unsafe-buffer-usage-main-argv.cpp:20:33: warning: 'argv' is an unsafe
pointer used for buffer access [-Wunsafe-buffer-usage]
20 | int other_func(int argc, char **argv) {
| ~~~~~~~^~~~
warn-unsafe-buffer-usage-main-argv.cpp:20:33: note: change type of 'argv' to
'std::span' to preserve bounds information
20 | int other_func(int argc, char **argv) {
| ~~~~~~~^~~~
| std::span<char *> argv
21 | // both-warning@+1{{unsafe buffer access}}
22 | return argv[1][0];
23 | }
|
warn-unsafe-buffer-usage-main-argv.cpp:22:10: note: used in buffer access here
22 | return argv[1][0];
| ^~~~
2 warnings generated.
```
This PR adds testing for both c++17 and c++20 modes and adds the appropriate
checks for both modes.
>From 434d69797ce9bc0a90fec3d5b3da4a74a004ce88 Mon Sep 17 00:00:00 2001
From: Douglas Yung <[email protected]>
Date: Sat, 10 Oct 2026 17:59:54 -0700
Subject: [PATCH] Fix test added in #229871 to work in C++20 mode.
---
.../warn-unsafe-buffer-usage-main-argv.cpp | 29 ++++++++++++++-----
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/clang/test/SemaCXX/warn-unsafe-buffer-usage-main-argv.cpp
b/clang/test/SemaCXX/warn-unsafe-buffer-usage-main-argv.cpp
index fc4297b33033f..cd2a65fb9dd98 100644
--- a/clang/test/SemaCXX/warn-unsafe-buffer-usage-main-argv.cpp
+++ b/clang/test/SemaCXX/warn-unsafe-buffer-usage-main-argv.cpp
@@ -1,23 +1,36 @@
-// RUN: %clang_cc1 -Wunsafe-buffer-usage -fsafe-buffer-usage-suggestions
-verify=expected,both %s
-// RUN: %clang_cc1 -Wunsafe-buffer-usage -Wno-unsafe-buffer-usage-main-argv
-fsafe-buffer-usage-suggestions -verify=both %s
+// RUN: %clang_cc1 -std=c++17 -Wunsafe-buffer-usage
-fsafe-buffer-usage-suggestions -verify=expected-17,both-17 %s
+// RUN: %clang_cc1 -std=c++17 -Wunsafe-buffer-usage
-Wno-unsafe-buffer-usage-main-argv -fsafe-buffer-usage-suggestions
-verify=both-17 %s
+// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage
-fsafe-buffer-usage-suggestions -verify=expected-20,both-20 %s
+// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage
-Wno-unsafe-buffer-usage-main-argv -fsafe-buffer-usage-suggestions
-verify=both-20 %s
+// expected-20-warning@+1{{unsafe pointer used for buffer access}}
int main(int argc, char **argv) {
- // expected-warning@+1{{unsafe buffer access}}
+ // expected-17-warning@+2{{unsafe buffer access}}
+ // expected-20-note@+1{{used in buffer access here}}
char c = argv[1][0];
- // expected-warning@+1{{unsafe pointer arithmetic}}
+ // expected-17-warning@+2{{unsafe pointer arithmetic}}
+ // expected-20-note@+1{{used in pointer arithmetic here}}
char **ptr1 = argv + 1;
- // expected-warning@+1{{unsafe pointer arithmetic}}
+ // expected-17-warning@+2{{unsafe pointer arithmetic}}
+ // expected-20-note@+1{{used in pointer arithmetic here}}
argv++;
- // expected-warning@+1{{unsafe pointer arithmetic}}
+ // expected-17-warning@+2{{unsafe pointer arithmetic}}
+ // expected-20-note@+1{{used in pointer arithmetic here}}
argv += 1;
+ // both-20-warning@+2{{unsafe pointer used for buffer access}}
+ // both-20-note@+1{{change type of 'p' to 'std::span' to preserve bounds
information}}
int *p = nullptr;
- // both-warning@+1{{unsafe buffer access}}
+ // both-17-warning@+2{{unsafe buffer access}}
+ // both-20-note@+1{{used in buffer access here}}
return p[5];
}
+// both-20-warning@+2{{unsafe pointer used for buffer access}}
+// both-20-note@+1{{change type of 'argv' to 'std::span' to preserve bounds
information}}
int other_func(int argc, char **argv) {
- // both-warning@+1{{unsafe buffer access}}
+ // both-17-warning@+2{{unsafe buffer access}}
+ // both-20-note@+1{{used in buffer access here}}
return argv[1][0];
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits