diff mbox series

[committed] d: Remove generated D header files on error (PR101657)

Message ID 20210729152239.273234-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d: Remove generated D header files on error (PR101657) | expand

Commit Message

Iain Buclaw July 29, 2021, 3:22 p.m. UTC
Hi,

This patch adds a clean-up for removing any generated DI header files
created before semantic analysis was ran.

If an error occurs later during compilation, remember that we generated
the headers, so that they can be removed before exit.

Bootstrapped and regression tested on x86_64-linux-gnu/-mx32/-m32, and
committed to mainline.

Regards,
Iain

---
gcc/d/ChangeLog:

	PR d/101657
	* d-lang.cc (d_parse_file): Remove generated D header files on error.

gcc/testsuite/ChangeLog:

	PR d/101657
	* gdc.dg/pr101657.d: New test.
---
 gcc/d/d-lang.cc                 | 19 +++++++++++++++++++
 gcc/testsuite/gdc.dg/pr101657.d | 14 ++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 gcc/testsuite/gdc.dg/pr101657.d
diff mbox series

Patch

diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc
index 6ad3823d910..ac0945b1f34 100644
--- a/gcc/d/d-lang.cc
+++ b/gcc/d/d-lang.cc
@@ -1000,6 +1000,10 @@  d_parse_file (void)
 	}
     }
 
+  /* If an error occurs later during compilation, remember that we generated
+     the headers, so that they can be removed before exit.  */
+  bool dump_headers = false;
+
   if (global.errors)
     goto had_errors;
 
@@ -1019,6 +1023,8 @@  d_parse_file (void)
 
 	  genhdrfile (m);
 	}
+
+      dump_headers = true;
     }
 
   if (global.errors)
@@ -1243,6 +1249,19 @@  d_parse_file (void)
      exit with an error status.  */
   errorcount += (global.errors + global.warnings);
 
+  /* Remove generated .di files on error.  */
+  if (errorcount && dump_headers)
+    {
+      for (size_t i = 0; i < modules.length; i++)
+	{
+	  Module *m = modules[i];
+	  if (d_option.fonly && m != Module::rootModule)
+	    continue;
+
+	  remove (m->hdrfile->toChars ());
+	}
+    }
+
   /* Write out globals.  */
   d_finish_compilation (vec_safe_address (global_declarations),
 			vec_safe_length (global_declarations));
diff --git a/gcc/testsuite/gdc.dg/pr101657.d b/gcc/testsuite/gdc.dg/pr101657.d
new file mode 100644
index 00000000000..0d77c36f030
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr101657.d
@@ -0,0 +1,14 @@ 
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101657
+// { dg-do compile }
+// { dg-additional-options "-H" }
+
+void fun101657()
+{
+    fail; // { dg-error "undefined identifier 'fail'" }
+}
+
+// { dg-final { if ![file exists pr101657.di] \{                } }
+// { dg-final {     pass "gdc.dg/pr101657.d   (file exists pr101657.di)" } }
+// { dg-final { \} else \{                                      } }
+// { dg-final {     fail "gdc.dg/pr101657.d   (file exists pr101657.di)" } }
+// { dg-final { \}                                              } }