From 5b9a40df4e3e9c4253239bbc32578eda155577ea Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 31 Oct 2007 14:50:13 +0000 Subject: 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 --- libcpp/directives.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'libcpp/directives.c') diff --git a/libcpp/directives.c b/libcpp/directives.c index 7f72162..e8516e0 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -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. */ -- cgit v1.1