Commit 5b9a40df by Tom Tromey Committed by Tom Tromey

re PR preprocessor/30786 (ICE on _Pragma at end of file)

gcc/testsuite
	PR preprocessor/30786:
	* gcc.dg/cpp/pr30786.c: New file.
libcpp
	PR preprocessor/30786:
	* macro.c (builtin_macro): Return result of _cpp_do__Pragma.
	* directives.c (_cpp_do__Pragma): Return error status.
	* internal.h (_cpp_do__Pragma): Update.
	* directives.c (get__Pragma_string): Back up if EOF seen.

From-SVN: r129800
parent 69d10e15
2007-10-31 Tom Tromey <tromey@redhat.com>
PR preprocessor/30786:
* gcc.dg/cpp/pr30786.c: New file.
2007-10-31 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2007-10-31 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/33162 PR fortran/33162
/* PR preprocessor/30786 - _Pragma at end of file should not ICE */
/* { dg-do compile } */
/* { dg-error "parenthesized" "" { target *-*-* } 9 } */
/* { dg-error "expected" "" { target *-*-* } 9 } */
int x;
_Pragma
2007-10-31 Tom Tromey <tromey@redhat.com>
PR preprocessor/30786:
* macro.c (builtin_macro): Return result of _cpp_do__Pragma.
* directives.c (_cpp_do__Pragma): Return error status.
* internal.h (_cpp_do__Pragma): Update.
* directives.c (get__Pragma_string): Back up if EOF seen.
2007-09-06 Tom Tromey <tromey@redhat.com> 2007-09-06 Tom Tromey <tromey@redhat.com>
* internal.h (struct cpp_reader) <invocation_location>: New * internal.h (struct cpp_reader) <invocation_location>: New
......
...@@ -1467,15 +1467,24 @@ static const cpp_token * ...@@ -1467,15 +1467,24 @@ static const cpp_token *
get__Pragma_string (cpp_reader *pfile) get__Pragma_string (cpp_reader *pfile)
{ {
const cpp_token *string; const cpp_token *string;
const cpp_token *paren;
if (get_token_no_padding (pfile)->type != CPP_OPEN_PAREN) paren = get_token_no_padding (pfile);
if (paren->type == CPP_EOF)
_cpp_backup_tokens (pfile, 1);
if (paren->type != CPP_OPEN_PAREN)
return NULL; return NULL;
string = get_token_no_padding (pfile); string = get_token_no_padding (pfile);
if (string->type == CPP_EOF)
_cpp_backup_tokens (pfile, 1);
if (string->type != CPP_STRING && string->type != CPP_WSTRING) if (string->type != CPP_STRING && string->type != CPP_WSTRING)
return NULL; return NULL;
if (get_token_no_padding (pfile)->type != CPP_CLOSE_PAREN) paren = get_token_no_padding (pfile);
if (paren->type == CPP_EOF)
_cpp_backup_tokens (pfile, 1);
if (paren->type != CPP_CLOSE_PAREN)
return NULL; return NULL;
return string; return string;
...@@ -1595,18 +1604,21 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in) ...@@ -1595,18 +1604,21 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in)
_cpp_push_token_context (pfile, NULL, toks, count); _cpp_push_token_context (pfile, NULL, toks, count);
} }
/* Handle the _Pragma operator. */ /* Handle the _Pragma operator. Return 0 on error, 1 if ok. */
void int
_cpp_do__Pragma (cpp_reader *pfile) _cpp_do__Pragma (cpp_reader *pfile)
{ {
const cpp_token *string = get__Pragma_string (pfile); const cpp_token *string = get__Pragma_string (pfile);
pfile->directive_result.type = CPP_PADDING; pfile->directive_result.type = CPP_PADDING;
if (string) if (string)
destringize_and_run (pfile, &string->val.str); {
else destringize_and_run (pfile, &string->val.str);
cpp_error (pfile, CPP_DL_ERROR, return 1;
"_Pragma takes a parenthesized string literal"); }
cpp_error (pfile, CPP_DL_ERROR,
"_Pragma takes a parenthesized string literal");
return 0;
} }
/* Handle #ifdef. */ /* Handle #ifdef. */
......
...@@ -576,7 +576,7 @@ extern int _cpp_handle_directive (cpp_reader *, int); ...@@ -576,7 +576,7 @@ extern int _cpp_handle_directive (cpp_reader *, int);
extern void _cpp_define_builtin (cpp_reader *, const char *); extern void _cpp_define_builtin (cpp_reader *, const char *);
extern char ** _cpp_save_pragma_names (cpp_reader *); extern char ** _cpp_save_pragma_names (cpp_reader *);
extern void _cpp_restore_pragma_names (cpp_reader *, char **); extern void _cpp_restore_pragma_names (cpp_reader *, char **);
extern void _cpp_do__Pragma (cpp_reader *); extern int _cpp_do__Pragma (cpp_reader *);
extern void _cpp_init_directives (cpp_reader *); extern void _cpp_init_directives (cpp_reader *);
extern void _cpp_init_internal_pragmas (cpp_reader *); extern void _cpp_init_internal_pragmas (cpp_reader *);
extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *, extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *,
......
...@@ -300,8 +300,7 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node) ...@@ -300,8 +300,7 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
if (pfile->state.in_directive) if (pfile->state.in_directive)
return 0; return 0;
_cpp_do__Pragma (pfile); return _cpp_do__Pragma (pfile);
return 1;
} }
buf = _cpp_builtin_macro_text (pfile, node); buf = _cpp_builtin_macro_text (pfile, node);
......
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