driver: error for nonexistent linker inputs [PR 98943]
authorNathan Sidwell <nathan@acm.org>
Thu, 4 Feb 2021 16:16:17 +0000 (08:16 -0800)
committerNathan Sidwell <nathan@acm.org>
Fri, 5 Feb 2021 13:32:34 +0000 (05:32 -0800)
We used to check all unknown input files, even when passing them to a
compiler.  But that caused problems.  However, not erroring out on
non-existent would-be-linker inputs confuses configure machinery that
probes the compiler to see if it accepts various inputs.  This
restores the access check for things that are thought to be linker
input files, when we're not linking.  (If we are linking, we presume
the linker will error out on its own accord.)

PR driver/98943
gcc/
* gcc.c (driver::maybe_run_linker): Check for input file
accessibility if not linking.
gcc/testsuite/
* c-c++-common/pr98943.c: New.

gcc/gcc.c
gcc/testsuite/c-c++-common/pr98943.c [new file with mode: 0644]

index 76f1d422f9a0264d1d13a7f9a9617df86788726b..7837553958b44a124c7d710a6cea0b15d7a041e2 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -9020,8 +9020,15 @@ driver::maybe_run_linker (const char *argv0) const
     for (i = 0; (int) i < n_infiles; i++)
       if (explicit_link_files[i]
          && !(infiles[i].language && infiles[i].language[0] == '*'))
-       warning (0, "%s: linker input file unused because linking not done",
-                outfiles[i]);
+       {
+         warning (0, "%s: linker input file unused because linking not done",
+                  outfiles[i]);
+         if (access (outfiles[i], F_OK) < 0)
+           /* This is can be an indication the user specifed an errorneous
+              separated option value, (or used the wrong prefix for an
+              option).  */
+           error ("%s: linker input file not found: %m", outfiles[i]);
+       }
 }
 
 /* The end of "main".  */
diff --git a/gcc/testsuite/c-c++-common/pr98943.c b/gcc/testsuite/c-c++-common/pr98943.c
new file mode 100644 (file)
index 0000000..53d8838
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// PR 98943, compiler feature tests can get confused by not linking
+// { dg-options "NOTAFILE" }
+
+int main ()
+{
+  return 0;
+}
+
+// { dg-regexp {[^\n:]*: warning: NOTAFILE: linker input file unused because linking not done\n[^\n:]*: error: NOTAFILE: linker input file not found: [^\n]*\n} }