mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-22 11:31:05 +08:00
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
This commit is contained in:
parent
69d10e15fb
commit
5b9a40df4e
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR fortran/33162
|
||||
|
9
gcc/testsuite/gcc.dg/cpp/pr30786.c
Normal file
9
gcc/testsuite/gcc.dg/cpp/pr30786.c
Normal file
@ -0,0 +1,9 @@
|
||||
/* 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
|
@ -1,3 +1,11 @@
|
||||
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>
|
||||
|
||||
* internal.h (struct cpp_reader) <invocation_location>: New
|
||||
|
@ -1467,15 +1467,24 @@ static const cpp_token *
|
||||
get__Pragma_string (cpp_reader *pfile)
|
||||
{
|
||||
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;
|
||||
|
||||
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)
|
||||
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 string;
|
||||
@ -1595,18 +1604,21 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in)
|
||||
_cpp_push_token_context (pfile, NULL, toks, count);
|
||||
}
|
||||
|
||||
/* Handle the _Pragma operator. */
|
||||
void
|
||||
/* Handle the _Pragma operator. Return 0 on error, 1 if ok. */
|
||||
int
|
||||
_cpp_do__Pragma (cpp_reader *pfile)
|
||||
{
|
||||
const cpp_token *string = get__Pragma_string (pfile);
|
||||
pfile->directive_result.type = CPP_PADDING;
|
||||
|
||||
if (string)
|
||||
destringize_and_run (pfile, &string->val.str);
|
||||
else
|
||||
cpp_error (pfile, CPP_DL_ERROR,
|
||||
"_Pragma takes a parenthesized string literal");
|
||||
{
|
||||
destringize_and_run (pfile, &string->val.str);
|
||||
return 1;
|
||||
}
|
||||
cpp_error (pfile, CPP_DL_ERROR,
|
||||
"_Pragma takes a parenthesized string literal");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Handle #ifdef. */
|
||||
|
@ -576,7 +576,7 @@ extern int _cpp_handle_directive (cpp_reader *, int);
|
||||
extern void _cpp_define_builtin (cpp_reader *, const char *);
|
||||
extern char ** _cpp_save_pragma_names (cpp_reader *);
|
||||
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_internal_pragmas (cpp_reader *);
|
||||
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)
|
||||
if (pfile->state.in_directive)
|
||||
return 0;
|
||||
|
||||
_cpp_do__Pragma (pfile);
|
||||
return 1;
|
||||
return _cpp_do__Pragma (pfile);
|
||||
}
|
||||
|
||||
buf = _cpp_builtin_macro_text (pfile, node);
|
||||
|
Loading…
x
Reference in New Issue
Block a user