Commit 5d6342eb by Tom Tromey Committed by Tom Tromey

re PR preprocessor/27777 (Bad diagnostic emission when #error contains a trigraph)

gcc/testsuite
	PR preprocessor/27777:
	* gcc.dg/cpp/pr27777.c: New file.
libcpp
	PR preprocessor/27777:
	* lex.c (cpp_output_line_to_string): New function.
	* internal.h (_cpp_begin_message): Don't declare.
	* errors.c (_cpp_begin_message): Now static.
	* include/cpplib.h (cpp_output_line_to_string): Declare.
	* directives.c (do_diagnostic): Rewrote.  Use
	cpp_output_line_to_string.  Don't use _cpp_begin_message.

From-SVN: r135740
parent 0fda18dd
2008-05-21 Tom Tromey <tromey@redhat.com>
PR preprocessor/27777:
* gcc.dg/cpp/pr27777.c: New file.
2008-05-21 Jakub Jelinek <jakub@redhat.com> 2008-05-21 Jakub Jelinek <jakub@redhat.com>
PR c++/36023 PR c++/36023
......
/* PR preprocessor/27777 */
/* { dg-do preprocess } */
/* { dg-options { -trigraphs -Wall } } */
#error "BUG??!"
/* { dg-error "BUG" "" { target *-*-* } 5 } */
/* { dg-warning "trigraph" "" { target *-*-* } 5 } */
2008-05-21 Tom Tromey <tromey@redhat.com> 2008-05-21 Tom Tromey <tromey@redhat.com>
PR preprocessor/27777:
* lex.c (cpp_output_line_to_string): New function.
* internal.h (_cpp_begin_message): Don't declare.
* errors.c (_cpp_begin_message): Now static.
* include/cpplib.h (cpp_output_line_to_string): Declare.
* directives.c (do_diagnostic): Rewrote. Use
cpp_output_line_to_string. Don't use _cpp_begin_message.
2008-05-21 Tom Tromey <tromey@redhat.com>
* include/symtab.h (HT_ALLOCED): Remove. * include/symtab.h (HT_ALLOCED): Remove.
(ht_purge): Declare. (ht_purge): Declare.
* symtab.c (DELETED): New define. * symtab.c (DELETED): New define.
......
...@@ -1016,14 +1016,20 @@ _cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason, ...@@ -1016,14 +1016,20 @@ _cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason,
static void static void
do_diagnostic (cpp_reader *pfile, int code, int print_dir) do_diagnostic (cpp_reader *pfile, int code, int print_dir)
{ {
if (_cpp_begin_message (pfile, code, pfile->cur_token[-1].src_loc, 0)) const unsigned char *dir_name;
{ unsigned char *line;
if (print_dir) source_location src_loc = pfile->cur_token[-1].src_loc;
fprintf (stderr, "#%s ", pfile->directive->name);
pfile->state.prevent_expansion++; if (print_dir)
cpp_output_line (pfile, stderr); dir_name = pfile->directive->name;
pfile->state.prevent_expansion--; else
} dir_name = NULL;
pfile->state.prevent_expansion++;
line = cpp_output_line_to_string (pfile, dir_name);
pfile->state.prevent_expansion--;
cpp_error_with_line (pfile, code, src_loc, 0, "%s", line);
free (line);
} }
static void static void
......
...@@ -76,7 +76,7 @@ print_location (cpp_reader *pfile, source_location line, unsigned int col) ...@@ -76,7 +76,7 @@ print_location (cpp_reader *pfile, source_location line, unsigned int col)
big enough max_column_hint.) big enough max_column_hint.)
Returns 0 if the error has been suppressed. */ Returns 0 if the error has been suppressed. */
int static int
_cpp_begin_message (cpp_reader *pfile, int code, _cpp_begin_message (cpp_reader *pfile, int code,
source_location src_loc, unsigned int column) source_location src_loc, unsigned int column)
{ {
......
...@@ -844,6 +844,8 @@ extern void cpp_error_with_line (cpp_reader *, int, source_location, unsigned, ...@@ -844,6 +844,8 @@ extern void cpp_error_with_line (cpp_reader *, int, source_location, unsigned,
/* In lex.c */ /* In lex.c */
extern int cpp_ideq (const cpp_token *, const char *); extern int cpp_ideq (const cpp_token *, const char *);
extern void cpp_output_line (cpp_reader *, FILE *); extern void cpp_output_line (cpp_reader *, FILE *);
extern unsigned char *cpp_output_line_to_string (cpp_reader *,
const unsigned char *);
extern void cpp_output_token (const cpp_token *, FILE *); extern void cpp_output_token (const cpp_token *, FILE *);
extern const char *cpp_type2name (enum cpp_ttype); extern const char *cpp_type2name (enum cpp_ttype);
/* Returns the value of an escape sequence, truncated to the correct /* Returns the value of an escape sequence, truncated to the correct
......
...@@ -518,10 +518,6 @@ cpp_in_primary_file (cpp_reader *pfile) ...@@ -518,10 +518,6 @@ cpp_in_primary_file (cpp_reader *pfile)
return pfile->line_table->depth == 1; return pfile->line_table->depth == 1;
} }
/* In errors.c */
extern int _cpp_begin_message (cpp_reader *, int,
source_location, unsigned int);
/* In macro.c */ /* In macro.c */
extern void _cpp_free_definition (cpp_hashnode *); extern void _cpp_free_definition (cpp_hashnode *);
extern bool _cpp_create_definition (cpp_reader *, cpp_hashnode *); extern bool _cpp_create_definition (cpp_reader *, cpp_hashnode *);
......
/* CPP Library - lexical analysis. /* CPP Library - lexical analysis.
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
Contributed by Per Bothner, 1994-95. Contributed by Per Bothner, 1994-95.
Based on CCCP program by Paul Rubin, June 1986 Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987 Adapted to ANSI C, Richard Stallman, Jan 1987
...@@ -1539,6 +1539,51 @@ cpp_output_line (cpp_reader *pfile, FILE *fp) ...@@ -1539,6 +1539,51 @@ cpp_output_line (cpp_reader *pfile, FILE *fp)
putc ('\n', fp); putc ('\n', fp);
} }
/* Return a string representation of all the remaining tokens on the
current line. The result is allocated using xmalloc and must be
freed by the caller. */
unsigned char *
cpp_output_line_to_string (cpp_reader *pfile, const unsigned char *dir_name)
{
const cpp_token *token;
unsigned int out = dir_name ? ustrlen (dir_name) : 0;
unsigned int alloced = 120 + out;
unsigned char *result = (unsigned char *) xmalloc (alloced);
/* If DIR_NAME is empty, there are no initial contents. */
if (dir_name)
{
sprintf ((char *) result, "#%s ", dir_name);
out += 2;
}
token = cpp_get_token (pfile);
while (token->type != CPP_EOF)
{
unsigned char *last;
/* Include room for a possible space and the terminating nul. */
unsigned int len = cpp_token_len (token) + 2;
if (out + len > alloced)
{
alloced *= 2;
if (out + len > alloced)
alloced = out + len;
result = (unsigned char *) xrealloc (result, alloced);
}
last = cpp_spell_token (pfile, token, &result[out], 0);
out = last - result;
token = cpp_get_token (pfile);
if (token->flags & PREV_WHITE)
result[out++] = ' ';
}
result[out] = '\0';
return result;
}
/* Memory buffers. Changing these three constants can have a dramatic /* Memory buffers. Changing these three constants can have a dramatic
effect on performance. The values here are reasonable defaults, effect on performance. The values here are reasonable defaults,
but might be tuned. If you adjust them, be sure to test across a but might be tuned. If you adjust them, be sure to test across a
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment