[PR preprocessor/90927] Fixe dependency output
authorNathan Sidwell <nathan@acm.org>
Wed, 26 Jun 2019 12:58:39 +0000 (12:58 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 26 Jun 2019 12:58:39 +0000 (12:58 +0000)
https://gcc.gnu.org/ml/gcc-patches/2019-06/msg01664.html
libcpp/
PR preprocessor/90927
* mkdeps.c (mkdeps::vec::operator[]): Add non-const variant.
(deps_add_target): Deal with out of order unquoted targets.

gcc/testsuite/
* c-c++-common/pr90927.c: New.

From-SVN: r272692

gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr90927.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/mkdeps.c

index b16e23a73736cbc1acd03d6aa2cbcbcf4c69a7c1..83cef684d159ed4500966b0db34ae53f5631b71c 100644 (file)
@@ -1,3 +1,7 @@
+2019-06-26  Nathan Sidwell  <nathan@acm.org>
+
+       * c-c++-common/pr90927.c: New.
+
 2019-06-26  Richard Biener  <rguenther@suse.de>
 
        PR ipa/90982
diff --git a/gcc/testsuite/c-c++-common/pr90927.c b/gcc/testsuite/c-c++-common/pr90927.c
new file mode 100644 (file)
index 0000000..6b0d348
--- /dev/null
@@ -0,0 +1,6 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-M -MQ b\\\$ob -MT b\\\$ill" } */
+
+int i;
+
+/* { dg-final { scan-file pr90927.i {b\$ill b\$\$ob:} } } */
index 71a09495440e6574b35e0a5ca88d46fcdf75d11b..1575d4bcda24199748ac5ad504f29624393e601c 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-26  Nathan Sidwell  <nathan@acm.org>
+
+       PR preprocessor/90927
+       * mkdeps.c (mkdeps::vec::operator[]): Add non-const variant.
+       (deps_add_target): Deal with out of order unquoted targets.
+
 2019-05-19  Andrew Pinski  <apinski@marvell.com>
 
        PR pch/81721
index 96cc49b9cc1720544c56e38210d48c78136011a2..676ae122bde88685e5e61454fb1289554d2a6d54 100644 (file)
@@ -59,6 +59,10 @@ public:
     {
       return ary[ix];
     }
+    T &operator[] (unsigned ix)
+    {
+      return ary[ix];
+    }
     void push (const T &elt)
     {
       if (num == alloc)
@@ -235,14 +239,22 @@ deps_free (struct mkdeps *d)
 void
 deps_add_target (struct mkdeps *d, const char *t, int quote)
 {
-  t = apply_vpath (d, t);
+  t = xstrdup (apply_vpath (d, t));
+
   if (!quote)
     {
-      gcc_assert (d->quote_lwm == d->targets.size ());
+      /* Sometimes unquoted items are added after quoted ones.
+        Swap out the lowest quoted.  */
+      if (d->quote_lwm != d->targets.size ())
+       {
+         const char *lowest = d->targets[d->quote_lwm];
+         d->targets[d->quote_lwm] = t;
+         t = lowest;
+       }
       d->quote_lwm++;
     }
 
-  d->targets.push (xstrdup (t));
+  d->targets.push (t);
 }
 
 /* Sets the default target if none has been given already.  An empty