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 > >