c++: don't default -frange-for-ext-temps in -std=gnu++20 [PR188574]

Since -frange-for-ext-temps has been causing trouble, let's not enable it
by default in pre-C++23 GNU modes for GCC 15, and also allow disabling it in
C++23 and up.

	PR c++/188574

gcc/c-family/ChangeLog:

	* c-opts.cc (c_common_post_options): Only enable
	-frange-for-ext-temps by default in C++23.

gcc/ChangeLog:

	* doc/invoke.texi: Adjust -frange-for-ext-temps documentation.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp23/range-for3.C: Use -frange-for-ext-temps.
	* g++.dg/cpp23/range-for4.C: Adjust expected result.

libgomp/ChangeLog:

	* testsuite/libgomp.c++/range-for-4.C: Adjust expected result.
This commit is contained in:
Jason Merrill 2025-02-11 13:51:32 +01:00
parent 0d2a5f3cb7
commit 556248d7d2
5 changed files with 10 additions and 22 deletions

View file

@ -1213,20 +1213,9 @@ c_common_post_options (const char **pfilename)
if (cxx_dialect >= cxx20)
flag_concepts = 1;
/* Enable lifetime extension of range based for temporaries for C++23.
Diagnose -std=c++23 -fno-range-for-ext-temps. */
if (cxx_dialect >= cxx23)
{
if (OPTION_SET_P (flag_range_for_ext_temps)
&& !flag_range_for_ext_temps)
error ("%<-fno-range-for-ext-temps%> is incompatible with C++23");
flag_range_for_ext_temps = 1;
}
/* Otherwise default to enabled in GNU modes but allow user to override. */
else if (cxx_dialect >= cxx11
&& !flag_iso
&& !OPTION_SET_P (flag_range_for_ext_temps))
flag_range_for_ext_temps = 1;
/* Enable lifetime extension of range based for temporaries for C++23. */
SET_OPTION_IF_UNSET (&global_options, &global_options_set,
flag_range_for_ext_temps, cxx_dialect >= cxx23);
/* -fimmediate-escalation has no effect when immediate functions are not
supported. */

View file

@ -3548,9 +3548,8 @@ easier, you can use @option{-fno-pretty-templates} to disable them.
Enable lifetime extension of C++ range based for temporaries.
With @option{-std=c++23} and above this is part of the language standard,
so lifetime of the temporaries is extended until the end of the loop
regardless of this option. This option allows enabling that behavior also
in earlier versions of the standard and is enabled by default in the
GNU dialects, from @option{-std=gnu++11} until @option{-std=gnu++20}.
by default. This option allows enabling that behavior also
in earlier versions of the standard.
@opindex fno-rtti
@opindex frtti

View file

@ -1,7 +1,7 @@
// P2718R0 - Wording for P2644R1 Fix for Range-based for Loop
// { dg-do run { target c++11 } }
// Verify -frange-for-ext-temps is set by default in -std=gnu++* modes.
// { dg-options "" }
// Verify -frange-for-ext-temps works in earlier standards.
// { dg-additional-options "-frange-for-ext-temps" }
#define RANGE_FOR_EXT_TEMPS 1
#include "range-for1.C"

View file

@ -1,7 +1,7 @@
// P2718R0 - Wording for P2644R1 Fix for Range-based for Loop
// { dg-do run { target c++11 } }
// Verify -frange-for-ext-temps is set by default in -std=gnu++* modes.
// Verify -frange-for-ext-temps is not set by default in -std=gnu++* modes.
// { dg-options "" }
#define RANGE_FOR_EXT_TEMPS 1
#define RANGE_FOR_EXT_TEMPS 0
#include "range-for2.C"

View file

@ -3,5 +3,5 @@
// { dg-additional-options "-std=gnu++17" }
// { dg-require-effective-target tls_runtime }
#define RANGE_FOR_EXT_TEMPS 1
#define RANGE_FOR_EXT_TEMPS 0
#include "range-for-1.C"