[clang] Fix test added in #229871 to work in C++20 mode. (PR #230875)

Douglas Yung via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 10 18:10:24 PDT 2026


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 at +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 at +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 <douglas.yung at sony.com>
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 at +1{{unsafe pointer used for buffer access}}
 int main(int argc, char **argv) {
-  // expected-warning at +1{{unsafe buffer access}}
+  // expected-17-warning at +2{{unsafe buffer access}}
+  // expected-20-note at +1{{used in buffer access here}}
   char c = argv[1][0];
 
-  // expected-warning at +1{{unsafe pointer arithmetic}}
+  // expected-17-warning at +2{{unsafe pointer arithmetic}}
+  // expected-20-note at +1{{used in pointer arithmetic here}}
   char **ptr1 = argv + 1;
-  // expected-warning at +1{{unsafe pointer arithmetic}}
+  // expected-17-warning at +2{{unsafe pointer arithmetic}}
+  // expected-20-note at +1{{used in pointer arithmetic here}}
   argv++;
-  // expected-warning at +1{{unsafe pointer arithmetic}}
+  // expected-17-warning at +2{{unsafe pointer arithmetic}}
+  // expected-20-note at +1{{used in pointer arithmetic here}}
   argv += 1;
 
+  // both-20-warning at +2{{unsafe pointer used for buffer access}}
+  // both-20-note at +1{{change type of 'p' to 'std::span' to preserve bounds information}}
   int *p = nullptr;
-  // both-warning at +1{{unsafe buffer access}}
+  // both-17-warning at +2{{unsafe buffer access}}
+  // both-20-note at +1{{used in buffer access here}}
   return p[5];
 }
 
+// both-20-warning at +2{{unsafe pointer used for buffer access}}
+// both-20-note at +1{{change type of 'argv' to 'std::span' to preserve bounds information}}
 int other_func(int argc, char **argv) {
-  // both-warning at +1{{unsafe buffer access}}
+  // both-17-warning at +2{{unsafe buffer access}}
+  // both-20-note at +1{{used in buffer access here}}
   return argv[1][0];
 }



More information about the cfe-commits mailing list