This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: tradtradcpp0, cpp spec bugs, and use of '|'


This combines Chris' patch with a change of mine that makes '|' mean
'any of'.

This fixes the "trad+cpp" :-) problem. Assuming I bootstrap (which is
looking likely) and make check, OK to commit?

Neil.

	Chris Demetriou  <cgd@sibyte.com>
	Neil Booth <neilb@earthling.net>

        * gcc.c (validate_switches): Validate multiple switches named
        in '|' (or) expressions in specs.
	(handle_braces): If more than 1 alternative in a '|' spec
	matches, call do_spec1 just once.

Index: gcc.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gcc.c,v
retrieving revision 1.179
diff -u -p -r1.179 gcc.c
--- gcc.c	2000/11/19 19:30:13	1.179
+++ gcc.c	2000/11/21 23:00:45
@@ -4720,6 +4720,7 @@ handle_braces (p)
 {
   const char *filter, *body = NULL, *endbody = NULL;
   int pipe_p = 0;
+  int true_once = 0;	/* If, in %{a|b:d}, at least one of a,b was seen.  */
   int negate;
   int suffix;
   int include_blanks = 1;
@@ -4924,11 +4925,8 @@ next_member:
 	      give_switch (i, 0, include_blanks);
 	    }
 	  else
-	    {
-	      if (do_spec_1 (save_string (body, endbody - body - 1),
-			     0, NULL_PTR) < 0)
-		return 0;
-	    }
+	    /* Even if many alternatives are matched, only output once.  */
+	    true_once = 1;
 	}
       else if (pipe_p)
 	{
@@ -4943,6 +4941,14 @@ next_member:
   if (*p++ == '|')
     goto next_member;
 
+  /* Process the spec just once, regardless of match count.  */
+  if (true_once)
+    {
+      if (do_spec_1 (save_string (body, endbody - body - 1),
+		     0, NULL_PTR) < 0)
+	return 0;
+    }
+
   return endbody;
 }
 
@@ -5938,19 +5944,21 @@ validate_switches (start)
   register const char *p = start;
   const char *filter;
   register int i;
-  int suffix = 0;
+  int suffix;
 
   if (*p == '|')
     ++p;
 
+next_member:
   if (*p == '!')
     ++p;
 
+  suffix = 0;
   if (*p == '.')
     suffix = 1, ++p;
 
   filter = p;
-  while (*p != ':' && *p != '}')
+  while (*p != ':' && *p != '}' && *p != '|')
     p++;
 
   if (suffix)
@@ -5958,9 +5966,8 @@ validate_switches (start)
   else if (p[-1] == '*')
     {
       /* Mark all matching switches as valid.  */
-      --p;
       for (i = 0; i < n_switches; i++)
-	if (!strncmp (switches[i].part1, filter, p - filter))
+	if (!strncmp (switches[i].part1, filter, p - filter - 1))
 	  switches[i].validated = 1;
     }
   else
@@ -5973,6 +5980,9 @@ validate_switches (start)
 	    switches[i].validated = 1;
 	}
     }
+
+  if (*p++ == '|')
+    goto next_member;
 }
 
 /* Check whether a particular argument was used.  The first time we

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]