On Wed, 9 Oct 2024, Jason Merrill wrote:
> Tested x86_64-pc-linux-gnu, will apply to trunk with the rest of the patch
> series.
>
> -- 8< --
>
> At this point there doesn't seem to be much reason not to have modules
> support enabled by default in C++20, and it's good get more test coverage to
> find corner case bugs like some I fixed recently.
Not sure how much we care about PCH anymore, but won't this effectively
disable PCH in C++20 and later due to
/* C++ modules and PCH don't play together. */
if (flag_modules)
return 2;
in c_common_valid_pch?
>
> It also seems to make more sense to use the spelling -fmodules rather than
> -fmodules-ts, much like we moved from -fconcepts-ts to -fconcepts. The old
> spelling is still accepted for backward compatibility.
>
> gcc/ChangeLog:
>
> * doc/invoke.texi: Modules are now enabled by default in C++20.
> Change advertised flag from -fmodules-ts to -fmodules.
>
> gcc/c-family/ChangeLog:
>
> * c.opt: Change advertised flag from -fmodules-ts to -fmodules.
> * c-opts.cc (c_common_post_options): Enable modules by default
> in C++20.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/template/error25.C: Adjust 'export' diagnostic.
> * g++.old-deja/g++.benjamin/tem05.C: Likewise.
> * g++.old-deja/g++.pt/export1.C: Likewise.
> * g++.dg/pch/pch.exp: Specify -fno-modules.
> ---
> gcc/doc/invoke.texi | 32 +++++++++----------
> gcc/c-family/c.opt | 10 +++---
> gcc/c-family/c-opts.cc | 6 +++-
> gcc/testsuite/g++.dg/template/error25.C | 2 +-
> .../g++.old-deja/g++.benjamin/tem05.C | 8 ++---
> gcc/testsuite/g++.old-deja/g++.pt/export1.C | 2 +-
> gcc/testsuite/g++.dg/pch/pch.exp | 2 +-
> 7 files changed, 32 insertions(+), 30 deletions(-)
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index b27e85bc38a..29fd99fff92 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -223,7 +223,7 @@ in the following sections.
> -fno-implicit-templates
> -fno-implicit-inline-templates
> -fno-implement-inlines
> --fmodule-header@r{[}=@var{kind}@r{]} -fmodule-only -fmodules-ts
> +-fmodule-header@r{[}=@var{kind}@r{]} -fmodule-only -fmodules
> -fmodule-implicit-inline
> -fno-module-lazy
> -fmodule-mapper=@var{specification}
> @@ -3501,14 +3501,12 @@ To save space, do not emit out-of-line copies of
> inline functions
> controlled by @code{#pragma implementation}. This causes linker
> errors if these functions are not inlined everywhere they are called.
>
> -@opindex fmodules-ts
> -@opindex fno-modules-ts
> -@item -fmodules-ts
> -@itemx -fno-modules-ts
> -Enable support for C++20 modules (@pxref{C++ Modules}). The
> -@option{-fno-modules-ts} is usually not needed, as that is the
> -default. Even though this is a C++20 feature, it is not currently
> -implicitly enabled by selecting that standard version.
> +@opindex fmodules
> +@opindex fno-modules
> +@item -fmodules
> +@itemx -fno-modules
> +Enable support for C++20 modules (@pxref{C++ Modules}). This flag is
> +enabled by default for C++20 and above.
>
> @opindex fmodule-header
> @item -fmodule-header
> @@ -38004,9 +38002,9 @@ affected by how you partition header files into
> header units.
>
> @end table
>
> -Modular compilation is @emph{not} enabled with just the
> -@option{-std=c++20} option. You must explicitly enable it with the
> -@option{-fmodules-ts} option. It is independent of the language
> +Modular compilation is enabled with the @option{-std=c++20} option.
> +You can also enable or disable it explicitly with the
> +@option{-fmodules} option. It is independent of the language
> version selected, although in pre-C++20 versions, it is of course an
> extension.
>
> @@ -38024,7 +38022,7 @@ Acyclic Graph (DAG). You must build imports before
> the importer.
> Header files may themselves be compiled to header units, which are a
> transitional ability aiming at faster compilation. The
> @option{-fmodule-header} option is used to enable this, and implies
> -the @option{-fmodules-ts} option. These CMIs are named by the fully
> +the @option{-fmodules} option. These CMIs are named by the fully
> resolved underlying header file, and thus may be a complete pathname
> containing subdirectories. If the header file is found at an absolute
> pathname, the CMI location is still relative to a CMI root directory.
> @@ -38033,7 +38031,7 @@ As header files often have no suffix, you commonly
> have to specify a
> @option{-x} option to tell the compiler the source is a header file.
> You may use @option{-x c++-header}, @option{-x c++-user-header} or
> @option{-x c++-system-header}. When used in conjunction with
> -@option{-fmodules-ts}, these all imply an appropriate
> +@option{-fmodules}, these all imply an appropriate
> @option{-fmodule-header} option. The latter two variants use the
> user or system include path to search for the file specified. This
> allows you to, for instance, compile standard library header files as
> @@ -38056,8 +38054,8 @@ the bits/stdc++.h header used for libstdc++
> precompiled headers you
> can
>
> @smallexample
> -g++ -fmodules-ts -x c++-system-header -c bits/stdc++.h
> -g++ -fmodules-ts -include bits/stdc++.h mycode.C
> +g++ -fmodules -x c++-system-header -c bits/stdc++.h
> +g++ -fmodules -include bits/stdc++.h mycode.C
> @end smallexample
>
> and any standard library #includes in mycode.C will be skipped,
> @@ -38244,7 +38242,7 @@ preprocessed header; the simplest way to do that is
> compiling the
> @option{-fmodule-header}.
>
> @smallexample
> -g++ -fmodules-ts -E my-header.hh -o my-header.ii
> +g++ -fmodules -E my-header.hh -o my-header.ii
> g++ -c -fmodule-header my-header.ii
> @end smallexample
>
> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
> index 6056dbde4b4..ade49b8cb65 100644
> --- a/gcc/c-family/c.opt
> +++ b/gcc/c-family/c.opt
> @@ -1997,12 +1997,12 @@ flax-vector-conversions
> C ObjC C++ ObjC++ Var(flag_lax_vector_conversions)
> Allow implicit conversions between vectors with differing numbers of
> subparts and/or differing element types.
>
> -fmodules-ts
> -C++ ObjC++ Var(flag_modules) Integer Init(0)
> -Enable C++ modules-ts (experimental).
> +fmodules
> +C++ ObjC++ Var(flag_modules) Integer
> +Enable C++20 Modules (experimental).
>
> -fno-modules
> -C++ ObjC++ Undocumented RejectNegative Var(flag_modules,0) Integer
> +fmodules-ts
> +C++ ObjC++ Alias(fmodules) Undocumented
> ;; undocumented
>
> fmodule-header
> diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
> index c7115e63ce7..4be6259979d 100644
> --- a/gcc/c-family/c-opts.cc
> +++ b/gcc/c-family/c-opts.cc
> @@ -1183,7 +1183,11 @@ c_common_post_options (const char **pfilename)
> /* C++20 is the final version of concepts. We still use -fconcepts
> to know when concepts are enabled. */
> if (cxx_dialect >= cxx20)
> - flag_concepts = 1;
> + {
> + flag_concepts = 1;
> + if (!OPTION_SET_P (flag_modules))
> + flag_modules = true;
> + }
>
> /* Enable lifetime extension of range based for temporaries for C++23.
> Diagnose -std=c++23 -fno-range-for-ext-temps. */
> diff --git a/gcc/testsuite/g++.dg/template/error25.C
> b/gcc/testsuite/g++.dg/template/error25.C
> index 77b59cd7ca2..6aaf67471b5 100644
> --- a/gcc/testsuite/g++.dg/template/error25.C
> +++ b/gcc/testsuite/g++.dg/template/error25.C
> @@ -12,5 +12,5 @@ extern void f2 ();
> template<>
> extern void f2<void> (); // { dg-error "explicit template specialization
> cannot have a storage class" }
>
> -export template<class T> // { dg-warning "keyword 'export'" }
> +export template<class T> // { dg-message "'export'" }
> static void* f3 ();
> diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/tem05.C
> b/gcc/testsuite/g++.old-deja/g++.benjamin/tem05.C
> index 7b6b955383b..81fb5c4c069 100644
> --- a/gcc/testsuite/g++.old-deja/g++.benjamin/tem05.C
> +++ b/gcc/testsuite/g++.old-deja/g++.benjamin/tem05.C
> @@ -18,7 +18,7 @@
>
> // 1
> // template definition
> -export template <class T> // { dg-warning "" }
> +export template <class T> // { dg-message "export" }
> bool templ_one(T a) {
> if (a > 0)
> return true;
> @@ -41,15 +41,15 @@ public:
> template <class T2> bool compare_ge(T2 test);
> };
>
> -export template <class T> // { dg-warning "" }
> +export template <class T> // { dg-message "export" }
> const bool X_one<T>::is_specialized = false;
>
> -export template <class T> // { dg-warning "" }
> +export template <class T> // { dg-message "export" }
> unsigned short X_one<T>::ret_id() {
> return id;
> }
>
> -export template <class T2> // { dg-warning "" }
> +export template <class T2> // { dg-message "export" }
> bool compare_ge(T2 test) {
> if (test > type) // { dg-error "" } .*
> return true;
> diff --git a/gcc/testsuite/g++.old-deja/g++.pt/export1.C
> b/gcc/testsuite/g++.old-deja/g++.pt/export1.C
> index 53e7e9b160c..e79785424d2 100644
> --- a/gcc/testsuite/g++.old-deja/g++.pt/export1.C
> +++ b/gcc/testsuite/g++.old-deja/g++.pt/export1.C
> @@ -15,4 +15,4 @@ return 0;
> }
>
> template <class T> class Y;
> -export template <class T> class X; // { dg-warning "" } export not
> implemented
> +export template <class T> class X; // { dg-message "export" } export not
> implemented
> diff --git a/gcc/testsuite/g++.dg/pch/pch.exp
> b/gcc/testsuite/g++.dg/pch/pch.exp
> index a443e8fc392..5e3e9b1fdd2 100644
> --- a/gcc/testsuite/g++.dg/pch/pch.exp
> +++ b/gcc/testsuite/g++.dg/pch/pch.exp
> @@ -31,7 +31,7 @@ set old_dg_do_what_default "${dg-do-what-default}"
> foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.C]] {
> # We don't try to use the loop-optimizing options, since they are highly
> # unlikely to make any difference to PCH.
> - dg-pch $subdir $test [list "-g" "-O2 -g" "-O2"] ".H"
> + dg-flags-pch $subdir $test "-fno-modules" [list "-g" "-O2 -g" "-O2"] ".H"
> }
>
> set dg-do-what-default "$old_dg_do_what_default"
> --
> 2.46.2
>
>