this patch fixes 90927. The assert triggers when the user uses both -MT and -MQ target options in an unfortunate order. I had thought about this and thought users wouldn't use both. You'd think by now that I've learnt the answer to 'Would a user ever do $X?', is 'Yes, of course they will'. Heck, they do things I can't even imagine!

applying to trunk

--
Nathan Sidwell
2019-06-26  Nathan Sidwell  <nat...@acm.org>

	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.


Index: libcpp/mkdeps.c
===================================================================
--- libcpp/mkdeps.c	(revision 272688)
+++ libcpp/mkdeps.c	(working copy)
@@ -60,4 +60,8 @@ public:
       return ary[ix];
     }
+    T &operator[] (unsigned ix)
+    {
+      return ary[ix];
+    }
     void push (const T &elt)
     {
@@ -236,12 +240,20 @@ 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);
 }
 
Index: gcc/testsuite/c-c++-common/pr90927.c
===================================================================
--- gcc/testsuite/c-c++-common/pr90927.c	(revision 0)
+++ gcc/testsuite/c-c++-common/pr90927.c	(working copy)
@@ -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:} } } */

Reply via email to