c-common.c (catenate_strings): New.
authorGabriel Dos Reis <gdr@integrable-solutions.net>
Sun, 31 Oct 2004 02:10:12 +0000 (02:10 +0000)
committerGabriel Dos Reis <gdr@gcc.gnu.org>
Sun, 31 Oct 2004 02:10:12 +0000 (02:10 +0000)
        * c-common.c (catenate_strings): New.
        (c_parse_error): Use it.  Don't over-escape.
testsuite/
        * gcc.dg/20040910-1.c: Adjust regex.

From-SVN: r89910

gcc/ChangeLog
gcc/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20040910-1.c

index 78c19ddc43dead741e5f8562f01a7b3a1e82a1bf..05f4e819137b6cce4a8d7700cfb7bcaa4ca61e0f 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-30  Gabriel Dos Reis  <gdr@integrable-solutions.net>
+
+       * c-common.c (catenate_strings): New.
+       (c_parse_error): Use it.  Don't over-escape.
+
 2004-10-30  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * config/sh/sh.c (calc_live_regs): Declare reg as unsigned and
index 271b4365961527c04d8700d46482af2567d76551..ea8b26c574314d7d4d3009b38fd569c2066f7c7d 100644 (file)
@@ -5479,36 +5479,75 @@ resort_sorted_fields (void *obj,
         resort_field_decl_cmp);
 }
 
+/* Subroutine of c_parse_error.
+   Return the result of concatenating LHS and RHS. RHS is really
+   a string literal, its first character is indicated by RHS_START and
+   RHS_SIZE is its lenght (including the terminating NUL character).
+
+   The caller is responsible for deleting the returned pointer.  */
+
+static char *
+catenate_strings (const char *lhs, const char *rhs_start, int rhs_size)
+{
+  const int lhs_size = strlen (lhs);
+  char *result = XNEWVEC (char, lhs_size + rhs_size);
+  strncpy (result, lhs, lhs_size);
+  strncpy (result + lhs_size, rhs_start, rhs_size);
+  return result;
+}
+
 /* Issue the error given by MSGID, indicating that it occurred before
    TOKEN, which had the associated VALUE.  */
 
 void
 c_parse_error (const char *msgid, enum cpp_ttype token, tree value)
 {
-  const char *string = _(msgid);
+#define catenate_messages(M1, M2) catenate_strings ((M1), (M2), sizeof (M2))
+
+  char *message = NULL;
 
   if (token == CPP_EOF)
-    error ("%s at end of input", string);
+    message = catenate_messages (msgid, " at end of input");
   else if (token == CPP_CHAR || token == CPP_WCHAR)
     {
       unsigned int val = TREE_INT_CST_LOW (value);
       const char *const ell = (token == CPP_CHAR) ? "" : "L";
       if (val <= UCHAR_MAX && ISGRAPH (val))
-       error ("%s before %s'%c'", string, ell, val);
+        message = catenate_messages (msgid, " before %s'%c'");
       else
-       error ("%s before %s'\\x%x'", string, ell, val);
+        message = catenate_messages (msgid, " before %s'\\x%x'");
+
+      error (message, ell, val);
+      free (message);
+      message = NULL;
     }
-  else if (token == CPP_STRING
-          || token == CPP_WSTRING)
-    error ("%s before string constant", string);
+  else if (token == CPP_STRING || token == CPP_WSTRING)
+    message = catenate_messages (msgid, " before string constant");
   else if (token == CPP_NUMBER)
-    error ("%s before numeric constant", string);
+    message = catenate_messages (msgid, " before numeric constant");
   else if (token == CPP_NAME)
-    error ("%s before \"%s\"", string, IDENTIFIER_POINTER (value));
+    {
+      message = catenate_messages (msgid, " before %qs");
+      error (message, IDENTIFIER_POINTER (value));
+      free (message);
+      message = NULL;
+    }
   else if (token < N_TTYPES)
-    error ("%s before %qs token", string, cpp_type2name (token));
+    {
+      message = catenate_messages (msgid, " before %qs token");
+      error (message, cpp_type2name (token));
+      free (message);
+      message = NULL;
+    }
   else
-    error ("%s", string);
+    error (msgid);
+
+  if (message)
+    {
+      error (message);
+      free (message);
+    }
+#undef catenate_messages  
 }
 
 /* Walk a gimplified function and warn for functions whose return value is
index aa3247ef5fd673158064fe190df2e2da32bb0a9c..98b107fc85367e8f9dcf89264b90b51adcf38bf6 100644 (file)
@@ -1,3 +1,7 @@
+2004-10-30  Gabriel Dos Reis  <gdr@integrable-solutions.net>
+
+       * gcc.dg/20040910-1.c: Adjust regex.
+
 2004-10-30  Roger Sayle  <roger@eyesopen.com>
 
        PR rtl-optimization/18084
index 25b51ff7e1b48f0d59a28456496ee0d6c3c41710..10f5fb32662193cc054a3593ab0dd6fc13816c75 100644 (file)
@@ -1,2 +1,2 @@
 /* Tests error recovery for invalid code.  */
-__attribute__((foo)  int f (){} /* { dg-error "(parse|syntax) error before \"int\"" } */
+__attribute__((foo)  int f (){} /* { dg-error "(parse|syntax) error before 'int'" } */