c-common.c (catenate_strings): New.
* 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
This commit is contained in:
parent
b789258287
commit
0a3ee0fdb5
4 changed files with 60 additions and 12 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'" } */
|
||||
|
|
Loading…
Add table
Reference in a new issue