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

Reply via email to