From: Iain Buclaw Date: Mon, 26 Jul 2021 15:24:38 +0000 (+0200) Subject: d: Remove generated D header files on error (PR101657) X-Git-Tag: basepoints/gcc-13~5717 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75f2e3f6cbbb79421b12e399498e9c14241359e7;p=thirdparty%2Fgcc.git d: Remove generated D header files on error (PR101657) If an error occurs later during compilation, remember that we generated the headers, so that they can be removed before exit. PR d/101657 gcc/d/ChangeLog: * d-lang.cc (d_parse_file): Remove generated D header files on error. gcc/testsuite/ChangeLog: * gdc.dg/pr101657.d: New test. --- diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc index 6ad3823d910d..ac0945b1f344 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 000000000000..0d77c36f0306 --- /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 { \} } }