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

Reply via email to