From 55e3bd376b2214e200fa76d12b67ff259b06c212 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 15 Nov 2024 23:42:59 +0000 Subject: [PATCH] c: Default to -std=gnu23 Change the default language version for C compilation from -std=gnu17 to -std=gnu23. A few tests are updated to remove local definitions of bool, true and false (where making such an unconditional test change seemed to make more sense than changing the test conditionally earlier or building it with -std=gnu17); most test issues were already addressed in previous patches. In the case of ctf-function-pointers-2.c, it was agreed in bug 117289 that it would be OK to put -std=gnu17 in the test and leave more optimal BTF / CTF output for this test as a potential future improvement. Since the original test fixes, more such fixes have become necessary and so are included in this patch. More noinline attributes are added to simulate-thread tests where () meaning a prototype affected test results, while gcc.dg/torture/pr117496-1.c (a test declaring a function with () then calling it with arguments) gets -std=gnu17 added. Bootstrapped with no regressions for x86_64-pc-linux-gnu. NOTE: it's likely there are target-specific tests for non-x86 targets that need updating as a result of this change. See commit 9fb5348e3021021e82d75e4ca4e6f8d51a34c24f ("testsuite: Prepare for -std=gnu23 default") for examples of changes to prepare the testsuite to work with a -std=gnu23 default. In most cases, adding -Wno-old-style-definition (for warnings for old-style function definitions) or -std=gnu17 (for other issues such as unprototyped function declarations with ()) is appropriate, but watch out for cases that indicate bugs with -std=gnu23 (in particular, any ICEs - there was only the one nested function test where I had to fix an ICE on x86_64). gcc/ * doc/invoke.texi (-std=gnu17, -std=gnu23): Document -std=gnu23 as default for C code. gcc/c-family/ * c-opts.cc (c_common_init_options): Default to C23. gcc/testsuite/ * c-c++-common/analyzer/asm-x86-dyndbg-2.c, c-c++-common/analyzer/asm-x86-lp64-2.c, c-c++-common/analyzer/attr-malloc-CVE-2019-19078-usb-leak.c, c-c++-common/analyzer/coreutils-cksum-pr108664.c, c-c++-common/analyzer/feasibility-3.c, c-c++-common/analyzer/pr105783.c, c-c++-common/analyzer/sock-1.c, c-c++-common/attributes-4.c, gcc.dg/Warray-bounds-78.c, gcc.dg/analyzer/asm-x86-dyndbg-1.c: Do not define bool, true or false. * gcc.dg/debug/ctf/ctf-function-pointers-2.c: Use -std-gnu17. * gcc.dg/gnu23-version-2.c: New test. * gcc.dg/simulate-thread/atomic-load-int.c, gcc.dg/simulate-thread/atomic-load-longlong.c, gcc.dg/simulate-thread/atomic-load-short.c: Add more noinline attributes. * gcc.dg/torture/pr117496-1.c: Use -std=gnu17. --- gcc/c-family/c-opts.cc | 4 ++-- gcc/doc/invoke.texi | 5 +++-- .../c-c++-common/analyzer/asm-x86-dyndbg-2.c | 6 ------ gcc/testsuite/c-c++-common/analyzer/asm-x86-lp64-2.c | 4 ---- .../analyzer/attr-malloc-CVE-2019-19078-usb-leak.c | 4 ---- .../c-c++-common/analyzer/coreutils-cksum-pr108664.c | 4 ---- gcc/testsuite/c-c++-common/analyzer/feasibility-3.c | 3 --- gcc/testsuite/c-c++-common/analyzer/pr105783.c | 4 ---- gcc/testsuite/c-c++-common/analyzer/sock-1.c | 3 --- gcc/testsuite/c-c++-common/attributes-4.c | 1 - gcc/testsuite/gcc.dg/Warray-bounds-78.c | 2 -- gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c | 4 ---- .../gcc.dg/debug/ctf/ctf-function-pointers-2.c | 2 +- gcc/testsuite/gcc.dg/gnu23-version-2.c | 11 +++++++++++ .../gcc.dg/simulate-thread/atomic-load-int.c | 4 ++++ .../gcc.dg/simulate-thread/atomic-load-longlong.c | 4 ++++ .../gcc.dg/simulate-thread/atomic-load-short.c | 4 ++++ gcc/testsuite/gcc.dg/torture/pr117496-1.c | 1 + 18 files changed, 30 insertions(+), 40 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gnu23-version-2.c diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc index 127f9553e0c..3f2cabf9448 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -261,8 +261,8 @@ c_common_init_options (unsigned int decoded_options_count, if (c_language == clk_c) { - /* The default for C is gnu17. */ - set_std_c17 (false /* ISO */); + /* The default for C is gnu23. */ + set_std_c23 (false /* ISO */); /* If preprocessing assembly language, accept any of the C-family front end options since the driver may pass them through. */ diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 36d79d1c76b..929feaf23fb 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -2501,11 +2501,12 @@ The name @samp{gnu1x} is deprecated. @item gnu17 @itemx gnu18 -GNU dialect of ISO C17. This is the default for C code. +GNU dialect of ISO C17. @item gnu23 @itemx gnu2x -GNU dialect of ISO C23. The name @samp{gnu2x} is deprecated. +GNU dialect of ISO C23. This is the default for C code. The name +@samp{gnu2x} is deprecated. @item gnu2y The next version of the ISO C standard, still under development, plus diff --git a/gcc/testsuite/c-c++-common/analyzer/asm-x86-dyndbg-2.c b/gcc/testsuite/c-c++-common/analyzer/asm-x86-dyndbg-2.c index d5e748c9acd..db77ce9a4f9 100644 --- a/gcc/testsuite/c-c++-common/analyzer/asm-x86-dyndbg-2.c +++ b/gcc/testsuite/c-c++-common/analyzer/asm-x86-dyndbg-2.c @@ -8,12 +8,6 @@ /* Adapted from various files in the Linux kernel, all of which have: */ /* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __cplusplus - typedef _Bool bool; - #define true 1 - #define false 0 -#endif - typedef struct {} atomic_t; /* Adapted from include/linux/compiler_attributes.h */ diff --git a/gcc/testsuite/c-c++-common/analyzer/asm-x86-lp64-2.c b/gcc/testsuite/c-c++-common/analyzer/asm-x86-lp64-2.c index 37c487a69c2..5d32c9a66c3 100644 --- a/gcc/testsuite/c-c++-common/analyzer/asm-x86-lp64-2.c +++ b/gcc/testsuite/c-c++-common/analyzer/asm-x86-lp64-2.c @@ -3,10 +3,6 @@ /* Adapted from Linux x86: page_ref_dec_and_test.c (GPL-2.0). */ -#ifndef __cplusplus - typedef _Bool bool; -#endif - typedef struct { int counter; } atomic_t; diff --git a/gcc/testsuite/c-c++-common/analyzer/attr-malloc-CVE-2019-19078-usb-leak.c b/gcc/testsuite/c-c++-common/analyzer/attr-malloc-CVE-2019-19078-usb-leak.c index 24fb46bd5a9..87ad42a3c32 100644 --- a/gcc/testsuite/c-c++-common/analyzer/attr-malloc-CVE-2019-19078-usb-leak.c +++ b/gcc/testsuite/c-c++-common/analyzer/attr-malloc-CVE-2019-19078-usb-leak.c @@ -4,10 +4,6 @@ typedef unsigned char u8; typedef unsigned short u16; -#ifndef __cplusplus - typedef _Bool bool; -#endif - #define ENOMEM 12 #define EINVAL 22 diff --git a/gcc/testsuite/c-c++-common/analyzer/coreutils-cksum-pr108664.c b/gcc/testsuite/c-c++-common/analyzer/coreutils-cksum-pr108664.c index 7ae4e6b06be..67dcbce09d0 100644 --- a/gcc/testsuite/c-c++-common/analyzer/coreutils-cksum-pr108664.c +++ b/gcc/testsuite/c-c++-common/analyzer/coreutils-cksum-pr108664.c @@ -8,10 +8,6 @@ typedef unsigned int __uint32_t; typedef unsigned long int __uintmax_t; typedef struct _IO_FILE FILE; -#ifndef __cplusplus - typedef _Bool bool; -#endif - extern size_t fread_unlocked(void* __restrict __ptr, size_t __size, diff --git a/gcc/testsuite/c-c++-common/analyzer/feasibility-3.c b/gcc/testsuite/c-c++-common/analyzer/feasibility-3.c index 06194f85069..06aed88b5e8 100644 --- a/gcc/testsuite/c-c++-common/analyzer/feasibility-3.c +++ b/gcc/testsuite/c-c++-common/analyzer/feasibility-3.c @@ -6,9 +6,6 @@ /* Types. */ typedef unsigned char u8; -#ifndef __cplusplus -typedef _Bool bool; -#endif typedef unsigned int gfp_t; struct file; diff --git a/gcc/testsuite/c-c++-common/analyzer/pr105783.c b/gcc/testsuite/c-c++-common/analyzer/pr105783.c index f17519415ce..34d21c62aef 100644 --- a/gcc/testsuite/c-c++-common/analyzer/pr105783.c +++ b/gcc/testsuite/c-c++-common/analyzer/pr105783.c @@ -1,9 +1,5 @@ /* { dg-additional-options "-O" } */ -#ifndef __cplusplus -typedef _Bool bool; -#endif - struct ss_s { union out_or_counting_u { char *newstr; diff --git a/gcc/testsuite/c-c++-common/analyzer/sock-1.c b/gcc/testsuite/c-c++-common/analyzer/sock-1.c index e5e2f23bba0..57938c0c0ab 100644 --- a/gcc/testsuite/c-c++-common/analyzer/sock-1.c +++ b/gcc/testsuite/c-c++-common/analyzer/sock-1.c @@ -5,9 +5,6 @@ typedef __u32 u32; typedef __s64 s64; typedef __u64 u64; typedef long long __kernel_time64_t; -#ifndef __cplusplus -typedef _Bool bool; -#endif typedef __s64 time64_t; struct __kernel_timespec { __kernel_time64_t tv_sec; diff --git a/gcc/testsuite/c-c++-common/attributes-4.c b/gcc/testsuite/c-c++-common/attributes-4.c index 55661eb792c..d78cdae2e11 100644 --- a/gcc/testsuite/c-c++-common/attributes-4.c +++ b/gcc/testsuite/c-c++-common/attributes-4.c @@ -11,7 +11,6 @@ typedef __CHAR16_TYPE__ char16_t; typedef __CHAR32_TYPE__ char32_t; #elif !__cplusplus -typedef _Bool bool; typedef __CHAR16_TYPE__ char16_t; typedef __CHAR32_TYPE__ char32_t; typedef __WCHAR_TYPE__ wchar_t; diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-78.c b/gcc/testsuite/gcc.dg/Warray-bounds-78.c index 73c335fd8a6..26b8a9bf9fe 100644 --- a/gcc/testsuite/gcc.dg/Warray-bounds-78.c +++ b/gcc/testsuite/gcc.dg/Warray-bounds-78.c @@ -3,8 +3,6 @@ { dg-do compile } { dg-options "-O2 -Wall -Wno-strict-aliasing" } */ -typedef _Bool bool; - #define NOIPA __attribute__ ((noipa)) struct S { }; diff --git a/gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c b/gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c index cce3f6b80bc..9ea86206fd8 100644 --- a/gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c +++ b/gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c @@ -8,10 +8,6 @@ /* Adapted from various files in the Linux kernel, all of which have: */ /* SPDX-License-Identifier: GPL-2.0 */ -typedef _Bool bool; -#define true 1 -#define false 0 - typedef struct { int counter; } atomic_t; diff --git a/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c index 80b9c188cee..55c73873a84 100644 --- a/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c +++ b/gcc/testsuite/gcc.dg/debug/ctf/ctf-function-pointers-2.c @@ -4,7 +4,7 @@ different function pointer types. */ /* { dg-do compile } */ -/* { dg-options "-O0 -gctf -dA" } */ +/* { dg-options "-O0 -gctf -dA -std=gnu17" } */ /* { dg-final { scan-assembler-times "\[\t \]0x16000001\[\t \]+\[^\n\]*ctt_info" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"rcu_callback_t.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"func.0\"\[\t \]+\[^\n\]*ctf_string" 1 } } */ diff --git a/gcc/testsuite/gcc.dg/gnu23-version-2.c b/gcc/testsuite/gcc.dg/gnu23-version-2.c new file mode 100644 index 00000000000..008f445ecdf --- /dev/null +++ b/gcc/testsuite/gcc.dg/gnu23-version-2.c @@ -0,0 +1,11 @@ +/* Test __STDC_VERSION__ for C23 with GNU extensions. Test that -std=gnu23 is + the default (replace this test when updating the default to a later version + than gnu23). */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +#if __STDC_VERSION__ == 202311L +int i; +#else +#error "Bad __STDC_VERSION__." +#endif diff --git a/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-int.c b/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-int.c index a40c3ddcb31..9f75cedd023 100644 --- a/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-int.c +++ b/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-int.c @@ -49,6 +49,7 @@ unsigned int table[16] = { int table_cycle_size = 16; /* Return 0 if 'result' is a valid value to have loaded. */ +__attribute__((noinline)) int verify_result () { int x; @@ -69,6 +70,7 @@ int verify_result () } /* Iterate VALUE through the different valid values. */ +__attribute__((noinline)) void simulate_thread_other_threads () { static int current = 0; @@ -78,11 +80,13 @@ void simulate_thread_other_threads () value = table[current]; } +__attribute__((noinline)) int simulate_thread_step_verify () { return verify_result (); } +__attribute__((noinline)) int simulate_thread_final_verify () { return verify_result (); diff --git a/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-longlong.c b/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-longlong.c index 524b9845b91..6c3b3a3981f 100644 --- a/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-longlong.c +++ b/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-longlong.c @@ -51,6 +51,7 @@ unsigned long long table[16] = { int table_cycle_size = 16; /* Return 0 if 'result' is a valid value to have loaded. */ +__attribute__((noinline)) int verify_result () { int x; @@ -71,6 +72,7 @@ int verify_result () } /* Iterate VALUE through the different valid values. */ +__attribute__((noinline)) void simulate_thread_other_threads () { static int current = 0; @@ -80,11 +82,13 @@ void simulate_thread_other_threads () value = table[current]; } +__attribute__((noinline)) int simulate_thread_step_verify () { return verify_result (); } +__attribute__((noinline)) int simulate_thread_final_verify () { return verify_result (); diff --git a/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-short.c b/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-short.c index 62690cea5f8..53b8c084eb3 100644 --- a/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-short.c +++ b/gcc/testsuite/gcc.dg/simulate-thread/atomic-load-short.c @@ -49,6 +49,7 @@ unsigned short table[16] = { int table_cycle_size = 16; /* Return 0 if 'result' is a valid value to have loaded. */ +__attribute__((noinline)) int verify_result () { int x; @@ -69,6 +70,7 @@ int verify_result () } /* Iterate VALUE through the different valid values. */ +__attribute__((noinline)) void simulate_thread_other_threads () { static int current = 0; @@ -78,11 +80,13 @@ void simulate_thread_other_threads () value = table[current]; } +__attribute__((noinline)) int simulate_thread_step_verify () { return verify_result (); } +__attribute__((noinline)) int simulate_thread_final_verify () { return verify_result (); diff --git a/gcc/testsuite/gcc.dg/torture/pr117496-1.c b/gcc/testsuite/gcc.dg/torture/pr117496-1.c index f35d13dfa85..d68286ef772 100644 --- a/gcc/testsuite/gcc.dg/torture/pr117496-1.c +++ b/gcc/testsuite/gcc.dg/torture/pr117496-1.c @@ -1,4 +1,5 @@ /* { dg-do compile } */ +/* { dg-additional-options "-std=gnu17" } */ /* PR tree-optimization/117496 */