]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: Remove unnecessary errors when not writing compiled module
authorNathaniel Shead <nathanieloshead@gmail.com>
Sun, 18 Aug 2024 11:35:23 +0000 (21:35 +1000)
committerNathaniel Shead <nathanieloshead@gmail.com>
Tue, 20 Aug 2024 23:45:54 +0000 (09:45 +1000)
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;
      |        ^~~~~~

Similarly, whenever we decide not to emit a module CMI due to other
errors we currently emit the following message:

m.cpp:1:8: warning: not writing module â€˜M’ due to errors
    1 | export module M;
      |        ^~~~~~

Neither of these messages really add anything useful; users already
understand that when an error is reported then the normal outputs will
not be created, so these messages are just noise.

There is one case we still need this latter message, however; when an
error in a template has been silenced with '-Wno-template-body' we still
don't want to write a module CMI, so emit an error now instead.

This patch also removes a number of dg-prune-output directives in the
testsuite that are no longer needed with this change.

gcc/cp/ChangeLog:

* module.cc (module_state::write_begin): Return a boolean to
indicate errors rather than just doing set_error().
(finish_module_processing): Prevent emission of unnecessary
errors; only indicate module writing occurred if write_begin
succeeds.

gcc/testsuite/ChangeLog:

* g++.dg/modules/export-1.C: Remove message.
* g++.dg/modules/internal-1.C: Remove message.
* g++.dg/modules/ambig-2_b.C: Remove unnecessary pruning.
* g++.dg/modules/atom-decl-2.C: Likewise.
* g++.dg/modules/atom-pragma-3.C: Likewise.
* g++.dg/modules/atom-preamble-2_f.C: Likewise.
* g++.dg/modules/block-decl-2.C: Likewise.
* g++.dg/modules/dir-only-4.C: Likewise.
* g++.dg/modules/enum-12.C: Likewise.
* g++.dg/modules/exp-xlate-1_b.C: Likewise.
* g++.dg/modules/export-3.C: Likewise.
* g++.dg/modules/friend-3.C: Likewise.
* g++.dg/modules/friend-5_b.C: Likewise.
* g++.dg/modules/inc-xlate-1_e.C: Likewise.
* g++.dg/modules/linkage-2.C: Likewise.
* g++.dg/modules/local-extern-1.C: Likewise.
* g++.dg/modules/main-1.C: Likewise.
* g++.dg/modules/map-2.C: Likewise.
* g++.dg/modules/mod-decl-1.C: Likewise.
* g++.dg/modules/mod-decl-3.C: Likewise.
* g++.dg/modules/pr99174.H: Likewise.
* g++.dg/modules/pr99468.H: Likewise.
* g++.dg/modules/token-1.C: Likewise.
* g++.dg/modules/token-3.C: Likewise.
* g++.dg/modules/token-4.C: Likewise.
* g++.dg/modules/token-5.C: Likewise.
* g++.dg/modules/using-10.C: Likewise.
* g++.dg/modules/using-12.C: Likewise.
* g++.dg/modules/using-3.C: Likewise.
* g++.dg/modules/using-9.C: Likewise.
* g++.dg/modules/using-enum-2.C: Likewise.
* g++.dg/modules/permissive-error-1.C: New test.
* g++.dg/modules/permissive-error-2.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
34 files changed:
gcc/cp/module.cc
gcc/testsuite/g++.dg/modules/ambig-2_b.C
gcc/testsuite/g++.dg/modules/atom-decl-2.C
gcc/testsuite/g++.dg/modules/atom-pragma-3.C
gcc/testsuite/g++.dg/modules/atom-preamble-2_f.C
gcc/testsuite/g++.dg/modules/block-decl-2.C
gcc/testsuite/g++.dg/modules/dir-only-4.C
gcc/testsuite/g++.dg/modules/enum-12.C
gcc/testsuite/g++.dg/modules/exp-xlate-1_b.C
gcc/testsuite/g++.dg/modules/export-1.C
gcc/testsuite/g++.dg/modules/export-3.C
gcc/testsuite/g++.dg/modules/friend-3.C
gcc/testsuite/g++.dg/modules/friend-5_b.C
gcc/testsuite/g++.dg/modules/inc-xlate-1_e.C
gcc/testsuite/g++.dg/modules/internal-1.C
gcc/testsuite/g++.dg/modules/linkage-2.C
gcc/testsuite/g++.dg/modules/local-extern-1.C
gcc/testsuite/g++.dg/modules/main-1.C
gcc/testsuite/g++.dg/modules/map-2.C
gcc/testsuite/g++.dg/modules/mod-decl-1.C
gcc/testsuite/g++.dg/modules/mod-decl-3.C
gcc/testsuite/g++.dg/modules/permissive-error-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/permissive-error-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99174.H
gcc/testsuite/g++.dg/modules/pr99468.H
gcc/testsuite/g++.dg/modules/token-1.C
gcc/testsuite/g++.dg/modules/token-3.C
gcc/testsuite/g++.dg/modules/token-4.C
gcc/testsuite/g++.dg/modules/token-5.C
gcc/testsuite/g++.dg/modules/using-10.C
gcc/testsuite/g++.dg/modules/using-12.C
gcc/testsuite/g++.dg/modules/using-3.C
gcc/testsuite/g++.dg/modules/using-9.C
gcc/testsuite/g++.dg/modules/using-enum-2.C

index 7c42aea05eec5edd3f15bd32924b31b725f946a8..07477d33955c7eb154fb1a1b5405f301c32ac397 100644 (file)
@@ -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,20 +20846,29 @@ finish_module_processing (cpp_reader *reader)
 
       cookie = new module_processing_cookie (cmi_name, tmp_name, fd, e);
 
-      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 ());
+      if (errorcount)
+       /* Don't write the module if we have reported errors.  */;
+      else if (erroneous_templates
+              && !erroneous_templates->is_empty ())
+       {
+         /* Don't write the module if it contains an erroneous template.
+            Also emit notes about where errors occurred in case
+            -Wno-template-body was passed.  */
+         auto_diagnostic_group d;
+         error_at (state->loc, "not writing module %qs due to errors "
+                   "in template bodies", state->get_flatname ());
+         if (!warn_template_body)
+           inform (state->loc, "enable %<-Wtemplate-body%> for more details");
+         for (auto e : *erroneous_templates)
+           inform (e.second, "first error in %qD appeared here", e.first);
+       }
       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;
        }
 
       dump.pop (n);
index b94416aabbf2964520ad4698173e59674da1a9f1..859cf14ac07ea78d212a32e6dbdc37e4138e527e 100644 (file)
@@ -6,5 +6,3 @@ import A;
 
 extern "C++" int foo ();
 extern "C++" int bar ();  // { dg-error "ambiguating new declaration" }
-
-// { dg-prune-output "not writing module" }
index b463dc8e214b9f94984b392ea0c28ed197f1b098..43120152b457851b13712f8348fb218b217fcc5b 100644 (file)
@@ -2,5 +2,3 @@
 export module thing;
 int i;
 import baz; // { dg-error "must be contiguous" }
-
-// { dg-prune-output "not writing module" }
index b95b2c8ad752be5d16b9a2d2152a053fcec4ace1..f2cadf02f2fad3a9645a45bf2d76ff76c6a537f0 100644 (file)
@@ -8,5 +8,3 @@ export module foo;
 import baz; // { dg-error "must be contiguous" }
 
 int i;
-
-// { dg-prune-output "not writing module" }
index 28e54b808b2925141638a012f587db130ba5fb3c..42b84af651ce20d25643152424309d341617c3f4 100644 (file)
@@ -7,4 +7,3 @@ import kevin; // { dg-error "not be from header" }
 # 8 "" 2
 
 import kevin; // ok
-// { dg-prune-output "not writing module" }
index 974e26f9b7aea1600efd2d59dffdcbb220f31812..d491a18dfb1214e7602125f5a60b279df9897d83 100644 (file)
@@ -17,5 +17,3 @@ export extern "C++" auto foo() {
   };
   return X{};
 }
-
-// { dg-prune-output "failed to write compiled module" }
index 80d6461e81fc4022966fe0e1fe0731f7cdfb66f3..9cb0587c0aa1e257d15b0d647d690755e440a1ce 100644 (file)
@@ -7,4 +7,3 @@ export module foo;
 class import {};
 
 import x; // { dg-error "post-module-declaration" }
- // { dg-prune-output "not writing module" }
index cf8f445e0763658353a741915b78672966ef5a41..3f29c52d59d9a2a08a8b8a7df2ad972e460aecc9 100644 (file)
@@ -6,5 +6,3 @@ export module foo;
 namespace std {
   enum class align_val_t : decltype(sizeof(int)) {};  // { dg-error "in module .foo. conflicts with builtin" }
 }
-
-// { dg-prune-output "not writing module" }
index 3295a6af05055528aac1172b691188be48fddb9f..736e891d1c78ed5a96c8f289ee310597069ad987 100644 (file)
@@ -4,4 +4,3 @@ export module evil;
 
 export // { dg-error "not part of following" }
 #include "exp-xlate-1_a.H" // { dg-error "must be contiguous" }
-// { dg-prune-output {not writing module} }
index 598814370eca9f71e510919af72f85209ec463c2..071f5ca2f35eeebecc084a750c59f15af12a3c55 100644 (file)
@@ -24,5 +24,3 @@ export class A; // { dg-error "conflicting exporting for declaration" }
 
 template <typename T> struct B;
 export template <typename T> struct B {};  // { dg-error "conflicting exporting for declaration" }
-
-// { dg-warning "due to errors" "" { target *-*-* } 0 }
index 76765fd2b2fe5f746c45fe2496d241a2f49a68ab..6af314b95191aabd8a594d1195492e849e1d13b1 100644 (file)
@@ -26,5 +26,3 @@ namespace {
 }
 
 export namespace {}  // { dg-error "internal linkage" }
-
-// { dg-prune-output "not writing module" }
index 48320eba46a4ad9eac2188cf41b11ca2a7a03b0f..cf0bbb7de5ee1a66e5ac5a42ffae4c854c450cbf 100644 (file)
@@ -31,4 +31,3 @@ export void quux (); // { dg-error "conflicting export" }
 void toto (); // not exported
 
 }
-// { dg-prune-output "not writing module" }
index 6b561265155a962ff32ba7862e2b75162f358f06..b362cf825474e9ffde6e1b30737b3f6404e3a026 100644 (file)
@@ -8,4 +8,3 @@ class B { // { dg-error "conflicts with import" }
   B() { object.value = 42; }
   A object;
 };
-// { dg-prune-output "not writing module" }
index f33c464bee90ef0b7b16fab161dcea9a1f537dc6..338c017c9b9945a953604a40276b046ff85815e2 100644 (file)
@@ -1,5 +1,3 @@
 // { dg-additional-options "-fmodules-ts -fmodule-mapper=|@g++-mapper-server\\ -t\\ [srcdir]/inc-xlate-1.map" }
 export module bad;
 #include "inc-xlate-1_a.H"  // { dg-error "not be include-translated" }
-
-// { dg-prune-output "not writing module" }
index 45d3bf06f28dfef86334e84031fd4d79eba79487..9f7299a5fc7b4123c3046b7c5989a9c4d6c9b319 100644 (file)
@@ -1,6 +1,6 @@
 // { dg-additional-options "-fmodules-ts" }
 
-export module frob; // { dg-error "failed to write" }
+export module frob;
 // { dg-module-cmi !frob }
 
 namespace {
index d913d6a30fcea7c310db2bda75337d18c169a1df..4b20411572c00b3d11668d52e06b218e48024fdf 100644 (file)
@@ -28,5 +28,3 @@ export void use() {
 // here is an exposure of this type, so this should be an error; we don't yet
 // implement this checking however.
 struct {} s;  // { dg-error "TU-local" "" { xfail *-*-* } }
-
-// { dg-prune-output "not writing module" }
index 7b016053d3685319636606cc63c77a35966905ce..3e10c67d1329af850e7fcce2cb00c167eb1b2dcd 100644 (file)
@@ -15,6 +15,3 @@ inline void dob ()
 {
   extern int bob; // { dg-error "block-scope extern" }
 }
-
-
-// { dg-prune-output "not writing module" }
index 0d79edddb75a9f3540065db8a7d51716dbac5576..429297784810e2a0b3010528c3c1d880fd5b3485 100644 (file)
@@ -1,5 +1,4 @@
 // { dg-additional-options "-fmodules-ts" }
-// { dg-prune-output "not writing module" }
 
 export module M;
 int main() {}  // { dg-error "attach" }
index dceb183419624367eb37be69e0635cfe3329db3d..94d3f7a1a41dec53189c6474218d175c393a810f 100644 (file)
@@ -7,5 +7,3 @@
 export module foo;
 // { dg-error "Interface: no such module" "" { target *-*-* } .-1 }
 // { dg-error "failed reading mapper" "" { target *-*-* } 0 }
-
-// { dg-prune-output "not writing module" }
index df398b3ef50a5cb1ed2a7bd8d343acd94026f8b4..ac7bb84699a1abdf9e97948f99b18c0ae8db2273 100644 (file)
@@ -27,5 +27,3 @@ void Bink ()
 
 module a.; // { dg-error "only permitted as" }
 
-// { dg-prune-output "not writing module" }
-
index 16fa5a85a565d200870ad9d6070875bc4f9e7009..23ba7f139571b92504083de9a28709073c8a24a4 100644 (file)
@@ -22,5 +22,3 @@ namespace Bink
   import  // { dg-error "does not name" }
   ben;
 }
-
-// { dg-prune-output "not writing module" }
diff --git a/gcc/testsuite/g++.dg/modules/permissive-error-1.C b/gcc/testsuite/g++.dg/modules/permissive-error-1.C
new file mode 100644 (file)
index 0000000..70ae1ec
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-additional-options "-fmodules-ts -fpermissive" }
+// { dg-module-cmi !M }
+
+export module M;  // { dg-error "not writing module" }
+
+template <typename T> void f() {
+  const int n = 42;
+  ++n;  // { dg-warning "read-only" }
+       // { dg-message "appeared here" "" { target *-*-* } .-1 }
+}
diff --git a/gcc/testsuite/g++.dg/modules/permissive-error-2.C b/gcc/testsuite/g++.dg/modules/permissive-error-2.C
new file mode 100644 (file)
index 0000000..1e62d45
--- /dev/null
@@ -0,0 +1,11 @@
+// { dg-additional-options "-fmodules-ts -Wno-template-body" }
+// { dg-module-cmi !M }
+
+export module M;  // { dg-error "not writing module" }
+
+template <typename T> void f() {
+  const int n = 42;
+  ++n;  // { dg-message "appeared here" }
+}
+
+// { dg-message "enable \[^\n\r\]* for more details" "" { target *-*-* } 0 }
index 62d5513b19a93b1d4f616b0ef90053b071764e48..60d01c59c772f1b46cf29fb477a097af8f0061ea 100644 (file)
@@ -1,5 +1,3 @@
 // { dg-additional-options -fmodule-header }
 // { dg-module-cmi !{} }
 import "pr99174.H"; // { dg-error "cannot import" }
-
-// { dg-prune-output {not writing module} }
index b6be0c349d5bedb4d4abf9d1e9dd7e068bd6478f..d7da3a83e1cbd7d0d49e4beb9577e0f5310c632a 100644 (file)
@@ -4,4 +4,3 @@
 module M; // { dg-error "module-declaration not permitted" }
 
 int i;
-// { dg-prune-output "not writing" }
index 50eee4c7ea1049301bc4619df20b044d20a67b95..db9a09b415f0e147b088d2924899e1d26f33d315 100644 (file)
@@ -4,4 +4,3 @@ module ; // { dg-error "cannot be in included file" }
 export module bob; // { dg-error "cannot be in included file" }
 # 6 "" 2
 // { dg-module-cmi !bob }
-// { dg-prune-output "not writing module" }
index 5bab426e2a6cfd4eb317b2fd0b9a5eed1938237b..1b4f66e634516c6eb58573d5946c7d7c2d7762b8 100644 (file)
@@ -3,4 +3,3 @@
 export module bob; // { dg-error "in included file" }
 # 6 "" 2
 // { dg-module-cmi !bob }
-// { dg-prune-output "not writing module" }
index 5a852370d661e605726ae96d00cb3c1b7f73d198..388da102f5fd4ac935880e718843076a96ec7f33 100644 (file)
@@ -2,4 +2,3 @@
 #define MODULE module   // { dg-error "does not name a type" }
 export MODULE bob; // { dg-error "may only occur after" }
 // { dg-module-cmi !bob }
-// { dg-prune-output "not writing module" }
index 29d3ec8fd705565067d3d825783747e09954c914..8190f5ef6fb0b338ddcf2ff19c3ea1f9ebac2355 100644 (file)
@@ -7,4 +7,3 @@ class Y;
 
 export module frob;
 // { dg-module-cmi !frob }
-// { dg-prune-output "not writing module" }
index 5735353ee2181abd5962e16fd82d9f6b2e95b52c..d468a36f5d879fcca1ead46a3baf54dea62ae72b 100644 (file)
@@ -67,5 +67,3 @@ namespace t {
 export using t::a;  // { dg-error "does not have external linkage" }
 export using t::b;  // { dg-error "does not have external linkage" }
 export using t::c;  // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }
index 54eacf7276eb1988791d0a29fbc0b4b8875949b5..52ef3c6285d8f575868ee7d31a38cd47d3a60d55 100644 (file)
@@ -69,5 +69,3 @@ namespace t {
   export using t::b;  // { dg-error "does not have external linkage" }
   export using t::c;  // { dg-error "does not have external linkage" }
 }
-
-// { dg-prune-output "not writing module" }
index d21512fb20ab17ba537d019a4e691a3ba40e00fc..898618d6cc0877318508a19fe1e944526c3ffc57 100644 (file)
@@ -13,5 +13,3 @@ using N::bar;
 
 export using N::foo; // { dg-error "does not have external linkage" }
 export using N::bar; // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }
index 4290280d89756d57d3f383187fd4ab9b6e9225a7..8fb7b5e2c85f401582fc193d2c11de69c10b5b67 100644 (file)
@@ -9,5 +9,3 @@ namespace outer {
 }
 
 export using outer::any_of;  // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }
index 813e2f630abcbaa65a5076125071c3a5b1c4ab3a..12e37758e813100e6e4fb7ad2ac9c434a7e8344b 100644 (file)
@@ -19,5 +19,3 @@ export using enum s::e1;  // { dg-error "does not have external linkage" }
 export using enum s::e2;  // { dg-error "does not have external linkage" }
 export using enum m::e3;  // { dg-error "does not have external linkage" }
 export using enum m::e4;  // { dg-error "does not have external linkage" }
-
-// { dg-prune-output "not writing module" }