[PATCH] c++/modules: Slightly clean up error for referencing TU-local entity
Jason Merrill
jason@redhat.com
Mon Aug 19 16:55:22 GMT 2024
On 8/18/24 8:11 AM, Nathaniel Shead wrote:
> Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
>
> Or should we even just remove the warning entirely? I'm not sure it
> really adds all that much, since it's usual AFAICT for errors to prevent
> the intended outputs from being generated.
Agreed, removing it seems fine.
> -- >8 --
>
> It was pointed out to me that the current error referencing an internal
> linkage entity reads almost like an ICE message, with the message
> finishing with the unhelpful:
>
> m.cpp:1:8: error: failed to write compiled module: Bad file data
> 1 | export module M;
> | ^~~~~~
>
> It would probably be clearer to just emit the same warning that we do in
> other cases where we don't write modules due to errors.
>
> gcc/cp/ChangeLog:
>
> * module.cc (module_state::write_begin): Return a boolean to
> indicate errors rather than just doing to->set_error().
> (finish_module_processing): Check for failed write_begin and
> disable module writing in that case.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/modules/block-decl-2.C: Adjust error message.
> * g++.dg/modules/internal-1.C: Likewise.
>
> Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
> ---
> gcc/cp/module.cc | 30 ++++++++++++---------
> gcc/testsuite/g++.dg/modules/block-decl-2.C | 2 +-
> gcc/testsuite/g++.dg/modules/internal-1.C | 2 +-
> 3 files changed, 19 insertions(+), 15 deletions(-)
>
> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> index f4d137b13a1..9f23feece09 100644
> --- a/gcc/cp/module.cc
> +++ b/gcc/cp/module.cc
> @@ -3681,7 +3681,7 @@ class GTY((chain_next ("%h.parent"), for_user)) module_state {
>
> public:
> /* Read and write module. */
> - void write_begin (elf_out *to, cpp_reader *,
> + bool write_begin (elf_out *to, cpp_reader *,
> module_state_config &, unsigned &crc);
> void write_end (elf_out *to, cpp_reader *,
> module_state_config &, unsigned &crc);
> @@ -18317,7 +18317,7 @@ ool_cmp (const void *a_, const void *b_)
> MOD_SNAME_PFX.cfg : config data
> */
>
> -void
> +bool
> module_state::write_begin (elf_out *to, cpp_reader *reader,
> module_state_config &config, unsigned &crc)
> {
> @@ -18395,10 +18395,7 @@ module_state::write_begin (elf_out *to, cpp_reader *reader,
> table.find_dependencies (this);
>
> if (!table.finalize_dependencies ())
> - {
> - to->set_error ();
> - return;
> - }
> + return false;
>
> #if CHECKING_P
> /* We're done verifying at-most once reading, reset to verify
> @@ -18595,6 +18592,8 @@ module_state::write_begin (elf_out *to, cpp_reader *reader,
> // so-controlled.
> if (false)
> write_env (to);
> +
> + return true;
> }
>
> // Finish module writing after we've emitted all dynamic initializers.
> @@ -20847,22 +20846,27 @@ finish_module_processing (cpp_reader *reader)
>
> cookie = new module_processing_cookie (cmi_name, tmp_name, fd, e);
>
> + bool report_error = false;
> if (errorcount
> /* Don't write the module if it contains an erroneous template. */
> || (erroneous_templates
> && !erroneous_templates->is_empty ()))
> - warning_at (state->loc, 0, "not writing module %qs due to errors",
> - state->get_flatname ());
> + report_error = true;
> else if (cookie->out.begin ())
> {
> - cookie->began = true;
> - auto loc = input_location;
> /* So crashes finger-point the module decl. */
> - input_location = state->loc;
> - state->write_begin (&cookie->out, reader, cookie->config, cookie->crc);
> - input_location = loc;
> + iloc_sentinel ils = state->loc;
> + if (state->write_begin (&cookie->out, reader, cookie->config,
> + cookie->crc))
> + cookie->began = true;
> + else
> + report_error = true;
> }
>
> + if (report_error)
> + warning_at (state->loc, 0, "not writing module %qs due to errors",
> + state->get_flatname ());
> +
> dump.pop (n);
> timevar_stop (TV_MODULE_EXPORT);
>
> diff --git a/gcc/testsuite/g++.dg/modules/block-decl-2.C b/gcc/testsuite/g++.dg/modules/block-decl-2.C
> index 974e26f9b7a..90f18b30945 100644
> --- a/gcc/testsuite/g++.dg/modules/block-decl-2.C
> +++ b/gcc/testsuite/g++.dg/modules/block-decl-2.C
> @@ -18,4 +18,4 @@ export extern "C++" auto foo() {
> return X{};
> }
>
> -// { dg-prune-output "failed to write compiled module" }
> +// { dg-prune-output "not writing module" }
> diff --git a/gcc/testsuite/g++.dg/modules/internal-1.C b/gcc/testsuite/g++.dg/modules/internal-1.C
> index 45d3bf06f28..399dd68b92e 100644
> --- a/gcc/testsuite/g++.dg/modules/internal-1.C
> +++ b/gcc/testsuite/g++.dg/modules/internal-1.C
> @@ -1,6 +1,6 @@
> // { dg-additional-options "-fmodules-ts" }
>
> -export module frob; // { dg-error "failed to write" }
> +export module frob; // { dg-warning "not writing module" }
> // { dg-module-cmi !frob }
>
> namespace {
More information about the Gcc-patches
mailing list