From e798f081925b5085de3c9d0f330eb6e255a377bf Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 21 Dec 2020 09:48:28 -0800 Subject: [PATCH] c++: Windows rename [PR 98412] Some system's rename(2) fails if the target already exists, so delete it first. gcc/cp/ * module.cc (create_dirs): Add logging. (finish_module_processing): Unlink before rename. --- gcc/cp/module.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index fc918d296a2..7e38293545f 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -4693,6 +4693,7 @@ create_dirs (char *path) char sep = *base; *base = 0; int failed = mkdir (path, S_IRWXU | S_IRWXG | S_IRWXO); + dump () && dump ("Mkdir ('%s') errno:=%u", path, failed ? errno : 0); *base = sep; if (failed /* Maybe racing with another creator (of a *different* @@ -19744,8 +19745,17 @@ finish_module_processing (cpp_reader *reader) input_location = loc; } if (to.end ()) - if (rename (tmp_name, path)) - to.set_error (errno); + { + /* Some OS's do not replace NEWNAME if it already + exists. This'll have a race condition in erroneous + concurrent builds. */ + unlink (path); + if (rename (tmp_name, path)) + { + dump () && dump ("Rename ('%s','%s') errno=%u", errno); + to.set_error (errno); + } + } if (to.get_error ()) { -- 2.30.2