C++: add -std={c,gnu}++{current,future}

Message ID 045690d0-9a3a-13c9-61d8-6e2c54d53fc7@acm.org
State New, archived
Headers
Series C++: add -std={c,gnu}++{current,future} |

Commit Message

Nathan Sidwell July 13, 2022, 7:29 p.m. UTC
  Inspired by a user question.  Jason, thoughts?

Since C++ is such a moving target, Microsoft have /std:c++latest
(AFAICT clang does not), to select the currently implemented version
of the working paper.  But the use of 'std:latest' is somewhat
ambiguous -- the current std is C++20 -- that's the latest std, the
next std will more than likely but not necessarily be C++23.  So this
adds:

   -std=c++current -- the current std (c++20)
   -std=c++future -- the working paper (c++2b)

also adds gnu++current and gnu++future to select the gnu-extended
variants.

nathan
  

Comments

Marek Polacek Aug. 30, 2022, 12:20 p.m. UTC | #1
On Wed, Jul 13, 2022 at 03:29:04PM -0400, Nathan Sidwell via Gcc-patches wrote:
> Inspired by a user question.  Jason, thoughts?

FWIW, this makes sense.  I mean, how could I be against a patch
quoting Macbeth?!
 
> Since C++ is such a moving target, Microsoft have /std:c++latest
> (AFAICT clang does not), to select the currently implemented version
> of the working paper.  But the use of 'std:latest' is somewhat
> ambiguous -- the current std is C++20 -- that's the latest std, the
> next std will more than likely but not necessarily be C++23.  So this
> adds:
> 
>   -std=c++current -- the current std (c++20)
>   -std=c++future -- the working paper (c++2b)
> 
> also adds gnu++current and gnu++future to select the gnu-extended
> variants.
> 
> nathan
> 
> -- 
> Nathan Sidwell

> From 9671f4d5e7efa130280b6d50fb4e9e8492d5b587 Mon Sep 17 00:00:00 2001
> From: Nathan Sidwell <nathan@acm.org>
> Date: Wed, 13 Jul 2022 12:11:40 -0700
> Subject: [PATCH] C++: add -std={c,gnu}++{current,future}
> 
> Since C++ is such a moving target, Microsoft have /std:c++latest
> (AFAICT clang does not), to select the currently implemented version
> of the working paper.  But the use of 'std:latest' is somewhat
> ambiguous -- the current std is C++20 -- that's the latest std, the
> next std will more than likely but not necessarily be C++23.  So this
> adds:
> 
>   -std=c++current -- the current std (c++20)
>   -std=c++future -- the working paper (c++2b)
> 
> also adds gnu++current and gnu++future to select the gnu-extended
> variants.
> 
> 	gcc/
> 	* doc/invoke.texi (-std=): Document new c++ current & future
> 	options.
> 	gcc/c-family/
> 	* c.opt (-std={c,gnu}++{current,future}: New alias options.
> 	gcc/testsuite/
> 	* g++.dg/gnu-current.C: New.
> 	* g++.dg/gnu-future.C: New.
> 	* g++.dg/std-current.C: New.
> 	* g++.dg/std-future.C: New.
> ---
>  gcc/c-family/c.opt                 | 16 ++++++++++++++++
>  gcc/doc/invoke.texi                | 23 +++++++++++++++++++++++
>  gcc/testsuite/g++.dg/gnu-current.C |  7 +++++++
>  gcc/testsuite/g++.dg/gnu-future.C  |  7 +++++++
>  gcc/testsuite/g++.dg/std-current.C | 11 +++++++++++
>  gcc/testsuite/g++.dg/std-future.C  |  8 ++++++++
>  6 files changed, 72 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/gnu-current.C
>  create mode 100644 gcc/testsuite/g++.dg/gnu-future.C
>  create mode 100644 gcc/testsuite/g++.dg/std-current.C
>  create mode 100644 gcc/testsuite/g++.dg/std-future.C
> 
> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
> index 44e1a60ce24..9292029a967 100644
> --- a/gcc/c-family/c.opt
> +++ b/gcc/c-family/c.opt
> @@ -2321,6 +2321,14 @@ std=c++23
>  C++ ObjC++ Undocumented
>  Conform to the ISO 2023 C++ draft standard (experimental and incomplete support).
>  
> +std=c++current
> +C++ ObjC++ Alias(std=c++20) Undocumented
> +Conform to the current ISO C++ standard (C++20).
> +
> +std=c++future
> +C++ ObjC++ Alias(std=c++23) Undocumented
> +Conform to a future ISO C++ standard (C++2b, experimentatl and incomplete support).

Since the option says 23, why not use 23 here as well instead of 2b?
And below too.

> +
>  std=c11
>  C ObjC
>  Conform to the ISO 2011 C standard.
> @@ -2407,6 +2415,14 @@ std=gnu++23
>  C++ ObjC++ Undocumented
>  Conform to the ISO 2023 C++ draft standard with GNU extensions (experimental and incomplete support).
>  
> +std=gnu++current
> +C++ ObjC++ Alias(std=gnu++20) Undocumented
> +Conform to the current ISO C++ standard with GNU extensions (C++20).
> +
> +std=gnu++future
> +C++ ObjC++ Alias(std=gnu++23) Undocumented
> +Conform to a future ISO C++ standard with GNU extensions (C++2b, experimentatl and incomplete support).
> +
>  std=gnu11
>  C ObjC
>  Conform to the ISO 2011 C standard with GNU extensions.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index d5ff1018372..1c0edb9df68 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -2462,6 +2462,17 @@ GNU dialect of @option{-std=c++17}.
>  This is the default for C++ code.
>  The name @samp{gnu++1z} is deprecated.
>  
> +@item gnu++current
> +@itemx gnu++current
> +GNU dialect of the current C++ standard, currently @option{-std=gnu++20}.
> +The C++ version selected by this option is a moving target.
> +
> +@item gnu++future
> +@itemx gnu++future
> +GNU dialect of the next C++ standard, currently @option{-std=gnu++2b}.
> +The C++ version selected by this option is a moving target (as are the
> +semantics of that proposed version).
> +
>  @item c++20
>  @itemx c++2a
>  The 2020 ISO C++ standard plus amendments.
> @@ -2487,6 +2498,18 @@ change in incompatible ways in future releases.
>  GNU dialect of @option{-std=c++2b}.  Support is highly experimental,
>  and will almost certainly change in incompatible ways in future
>  releases.
> +
> +@item c++current
> +@itemx c++current
> +The current C++ standard, currently @option{-std=gnu++20}.
> +The C++ version selected by this option is a moving target.
> +
> +@item c++future
> +@itemx c++future
> +The next C++ standard, currently @option{-std=gnu++2b}.
> +The C++ version selected by this option is a moving target (as are the
> +semantics of that proposed version).
> +
>  @end table
>  
>  @item -aux-info @var{filename}
> diff --git a/gcc/testsuite/g++.dg/gnu-current.C b/gcc/testsuite/g++.dg/gnu-current.C
> new file mode 100644
> index 00000000000..c95c56d3ad8
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/gnu-current.C
> @@ -0,0 +1,7 @@
> +// { dg-do compile }
> +// { dg-options -std=gnu++current }
> +
> +static_assert (__cplusplus == 202002L, "time has moved on");
> +#if __STRICT_ANSI__
> +#error "__STRICT_ANSI__ surprisingly non-zero"
> +#endif
> diff --git a/gcc/testsuite/g++.dg/gnu-future.C b/gcc/testsuite/g++.dg/gnu-future.C
> new file mode 100644
> index 00000000000..366dcdeebc2
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/gnu-future.C
> @@ -0,0 +1,7 @@
> +// { dg-do compile }
> +// { dg-options -std=gnu++future }
> +
> +static_assert (__cplusplus > 202002L, "time has moved on");
> +#if __STRICT_ANSI__
> +#error "__STRICT_ANSI__ surprisingly non-zero"
> +#endif
> diff --git a/gcc/testsuite/g++.dg/std-current.C b/gcc/testsuite/g++.dg/std-current.C
> new file mode 100644
> index 00000000000..334ffd1d2c4
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/std-current.C
> @@ -0,0 +1,11 @@
> +// { dg-do compile }
> +// { dg-options -std=c++current }
> +
> +// Adust as tomorrow and tomorrow and tomorrow
> +// Creeps in this petty pace from day to day
> +// To the last syllable of recorded time.
> +
> +static_assert (__cplusplus == 202002L, "time has moved on");
> +#if !__STRICT_ANSI__
> +#error "__STRICT_ANSI__ surprisingly zero"
> +#endif
> diff --git a/gcc/testsuite/g++.dg/std-future.C b/gcc/testsuite/g++.dg/std-future.C
> new file mode 100644
> index 00000000000..dade97e6a71
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/std-future.C
> @@ -0,0 +1,8 @@
> +// { dg-do compile }
> +// { dg-options -std=c++future }
> +
> +static_assert (__cplusplus > 202002L, "time has moved on");
> +#if !__STRICT_ANSI__
> +#error "__STRICT_ANSI__ surprisingly zero"
> +#endif
> +
> -- 
> 2.30.2
> 


Marek
  
Jason Merrill Aug. 30, 2022, 1:22 p.m. UTC | #2
On 7/13/22 15:29, Nathan Sidwell wrote:
> Inspired by a user question.  Jason, thoughts?
> 
> Since C++ is such a moving target, Microsoft have /std:c++latest
> (AFAICT clang does not), to select the currently implemented version
> of the working paper.  But the use of 'std:latest' is somewhat
> ambiguous -- the current std is C++20 -- that's the latest std, the
> next std will more than likely but not necessarily be C++23.  So this
> adds:
> 
>    -std=c++current -- the current std (c++20)
>    -std=c++future -- the working paper (c++2b)
> 
> also adds gnu++current and gnu++future to select the gnu-extended
> variants.

I like this direction.

I imagine people using these to mean roughly beta and alpha, respectively.

Perhaps we also want -std=c++stable, which would currently be equivalent 
to the default (c++17) but might not always be.

Jason
  
Li, Pan2 via Gcc-patches Aug. 30, 2022, 1:32 p.m. UTC | #3
> On Aug 30, 2022, at 9:22 AM, Jason Merrill via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> 
> On 7/13/22 15:29, Nathan Sidwell wrote:
>> Inspired by a user question.  Jason, thoughts?
>> Since C++ is such a moving target, Microsoft have /std:c++latest
>> (AFAICT clang does not), to select the currently implemented version
>> of the working paper.  But the use of 'std:latest' is somewhat
>> ambiguous -- the current std is C++20 -- that's the latest std, the
>> next std will more than likely but not necessarily be C++23.  So this
>> adds:
>>   -std=c++current -- the current std (c++20)
>>   -std=c++future -- the working paper (c++2b)
>> also adds gnu++current and gnu++future to select the gnu-extended
>> variants.
> 
> I like this direction.
> 
> I imagine people using these to mean roughly beta and alpha, respectively.
> 
> Perhaps we also want -std=c++stable, which would currently be equivalent to the default (c++17) but might not always be.
> 
> Jason

I'm not so sure.

In general, switches have a fixed meaning.  These do not.  "Current" has an intuitive meaning, but the actual meaning is "whatever what current when the version you happen to be invoking was released".  "Future" is like that only stranger.

If I create a software package that uses one of these switches in its Makefile, what will happen?  In a few years, perhaps sooner, the outcome will change without any changes to my code.  The answer would be "don't use those switches", and that is a good answer, but if so why add these switches?

	paul
  
Marek Polacek Aug. 30, 2022, 2 p.m. UTC | #4
On Tue, Aug 30, 2022 at 09:22:14AM -0400, Jason Merrill via Gcc-patches wrote:
> On 7/13/22 15:29, Nathan Sidwell wrote:
> > Inspired by a user question.  Jason, thoughts?
> > 
> > Since C++ is such a moving target, Microsoft have /std:c++latest
> > (AFAICT clang does not), to select the currently implemented version
> > of the working paper.  But the use of 'std:latest' is somewhat
> > ambiguous -- the current std is C++20 -- that's the latest std, the
> > next std will more than likely but not necessarily be C++23.  So this
> > adds:
> > 
> >    -std=c++current -- the current std (c++20)
> >    -std=c++future -- the working paper (c++2b)
> > 
> > also adds gnu++current and gnu++future to select the gnu-extended
> > variants.
> 
> I like this direction.
> 
> I imagine people using these to mean roughly beta and alpha, respectively.
> 
> Perhaps we also want -std=c++stable, which would currently be equivalent to
> the default (c++17) but might not always be.

I wonder how these new switches would be useful in older releases.  If
I use -std=c++current with gcc 5 years old, that's probably not very
useful?  Should there be a way to know what these options map to?

Also, I suppose that if we switch the default to gnu++20, then there may
be a window when -std=gnu++current == the default.

Marek
  

Patch

From 9671f4d5e7efa130280b6d50fb4e9e8492d5b587 Mon Sep 17 00:00:00 2001
From: Nathan Sidwell <nathan@acm.org>
Date: Wed, 13 Jul 2022 12:11:40 -0700
Subject: [PATCH] C++: add -std={c,gnu}++{current,future}

Since C++ is such a moving target, Microsoft have /std:c++latest
(AFAICT clang does not), to select the currently implemented version
of the working paper.  But the use of 'std:latest' is somewhat
ambiguous -- the current std is C++20 -- that's the latest std, the
next std will more than likely but not necessarily be C++23.  So this
adds:

  -std=c++current -- the current std (c++20)
  -std=c++future -- the working paper (c++2b)

also adds gnu++current and gnu++future to select the gnu-extended
variants.

	gcc/
	* doc/invoke.texi (-std=): Document new c++ current & future
	options.
	gcc/c-family/
	* c.opt (-std={c,gnu}++{current,future}: New alias options.
	gcc/testsuite/
	* g++.dg/gnu-current.C: New.
	* g++.dg/gnu-future.C: New.
	* g++.dg/std-current.C: New.
	* g++.dg/std-future.C: New.
---
 gcc/c-family/c.opt                 | 16 ++++++++++++++++
 gcc/doc/invoke.texi                | 23 +++++++++++++++++++++++
 gcc/testsuite/g++.dg/gnu-current.C |  7 +++++++
 gcc/testsuite/g++.dg/gnu-future.C  |  7 +++++++
 gcc/testsuite/g++.dg/std-current.C | 11 +++++++++++
 gcc/testsuite/g++.dg/std-future.C  |  8 ++++++++
 6 files changed, 72 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/gnu-current.C
 create mode 100644 gcc/testsuite/g++.dg/gnu-future.C
 create mode 100644 gcc/testsuite/g++.dg/std-current.C
 create mode 100644 gcc/testsuite/g++.dg/std-future.C

diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 44e1a60ce24..9292029a967 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -2321,6 +2321,14 @@  std=c++23
 C++ ObjC++ Undocumented
 Conform to the ISO 2023 C++ draft standard (experimental and incomplete support).
 
+std=c++current
+C++ ObjC++ Alias(std=c++20) Undocumented
+Conform to the current ISO C++ standard (C++20).
+
+std=c++future
+C++ ObjC++ Alias(std=c++23) Undocumented
+Conform to a future ISO C++ standard (C++2b, experimentatl and incomplete support).
+
 std=c11
 C ObjC
 Conform to the ISO 2011 C standard.
@@ -2407,6 +2415,14 @@  std=gnu++23
 C++ ObjC++ Undocumented
 Conform to the ISO 2023 C++ draft standard with GNU extensions (experimental and incomplete support).
 
+std=gnu++current
+C++ ObjC++ Alias(std=gnu++20) Undocumented
+Conform to the current ISO C++ standard with GNU extensions (C++20).
+
+std=gnu++future
+C++ ObjC++ Alias(std=gnu++23) Undocumented
+Conform to a future ISO C++ standard with GNU extensions (C++2b, experimentatl and incomplete support).
+
 std=gnu11
 C ObjC
 Conform to the ISO 2011 C standard with GNU extensions.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index d5ff1018372..1c0edb9df68 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -2462,6 +2462,17 @@  GNU dialect of @option{-std=c++17}.
 This is the default for C++ code.
 The name @samp{gnu++1z} is deprecated.
 
+@item gnu++current
+@itemx gnu++current
+GNU dialect of the current C++ standard, currently @option{-std=gnu++20}.
+The C++ version selected by this option is a moving target.
+
+@item gnu++future
+@itemx gnu++future
+GNU dialect of the next C++ standard, currently @option{-std=gnu++2b}.
+The C++ version selected by this option is a moving target (as are the
+semantics of that proposed version).
+
 @item c++20
 @itemx c++2a
 The 2020 ISO C++ standard plus amendments.
@@ -2487,6 +2498,18 @@  change in incompatible ways in future releases.
 GNU dialect of @option{-std=c++2b}.  Support is highly experimental,
 and will almost certainly change in incompatible ways in future
 releases.
+
+@item c++current
+@itemx c++current
+The current C++ standard, currently @option{-std=gnu++20}.
+The C++ version selected by this option is a moving target.
+
+@item c++future
+@itemx c++future
+The next C++ standard, currently @option{-std=gnu++2b}.
+The C++ version selected by this option is a moving target (as are the
+semantics of that proposed version).
+
 @end table
 
 @item -aux-info @var{filename}
diff --git a/gcc/testsuite/g++.dg/gnu-current.C b/gcc/testsuite/g++.dg/gnu-current.C
new file mode 100644
index 00000000000..c95c56d3ad8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gnu-current.C
@@ -0,0 +1,7 @@ 
+// { dg-do compile }
+// { dg-options -std=gnu++current }
+
+static_assert (__cplusplus == 202002L, "time has moved on");
+#if __STRICT_ANSI__
+#error "__STRICT_ANSI__ surprisingly non-zero"
+#endif
diff --git a/gcc/testsuite/g++.dg/gnu-future.C b/gcc/testsuite/g++.dg/gnu-future.C
new file mode 100644
index 00000000000..366dcdeebc2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gnu-future.C
@@ -0,0 +1,7 @@ 
+// { dg-do compile }
+// { dg-options -std=gnu++future }
+
+static_assert (__cplusplus > 202002L, "time has moved on");
+#if __STRICT_ANSI__
+#error "__STRICT_ANSI__ surprisingly non-zero"
+#endif
diff --git a/gcc/testsuite/g++.dg/std-current.C b/gcc/testsuite/g++.dg/std-current.C
new file mode 100644
index 00000000000..334ffd1d2c4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/std-current.C
@@ -0,0 +1,11 @@ 
+// { dg-do compile }
+// { dg-options -std=c++current }
+
+// Adust as tomorrow and tomorrow and tomorrow
+// Creeps in this petty pace from day to day
+// To the last syllable of recorded time.
+
+static_assert (__cplusplus == 202002L, "time has moved on");
+#if !__STRICT_ANSI__
+#error "__STRICT_ANSI__ surprisingly zero"
+#endif
diff --git a/gcc/testsuite/g++.dg/std-future.C b/gcc/testsuite/g++.dg/std-future.C
new file mode 100644
index 00000000000..dade97e6a71
--- /dev/null
+++ b/gcc/testsuite/g++.dg/std-future.C
@@ -0,0 +1,8 @@ 
+// { dg-do compile }
+// { dg-options -std=c++future }
+
+static_assert (__cplusplus > 202002L, "time has moved on");
+#if !__STRICT_ANSI__
+#error "__STRICT_ANSI__ surprisingly zero"
+#endif
+
-- 
2.30.2