From c04babd9dfa5c63c10d65f1bd3fb8cf503ab739d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 4 Feb 2020 13:38:16 +0100 Subject: libcpp: Fix ICEs on __has_include syntax errors [PR93545] Some of the following testcases ICE, because one of the cpp_get_token calls in builtin_has_include reads the CPP_EOF token but the caller isn't aware that CPP_EOF has been reached and will do another cpp_get_token. get_token_no_padding is something that is use by the has_attribute/has_builtin callbacks, which will first peek and will not consume CPP_EOF (but will consume other tokens). The !SEEN_EOL () check on the other side doesn't work anymore and isn't really needed, as we don't consume the EOF. The change adds one further error to the pr88974.c testcase, if we wanted just one error per __has_include, we could add some boolean whether we've emitted errors already and only emit the first one we encounter (not implemented). 2020-02-04 Jakub Jelinek PR preprocessor/93545 * macro.c (cpp_get_token_no_padding): New function. (builtin_has_include): Use it instead of cpp_get_token. Don't check SEEN_EOL. * c-c++-common/cpp/pr88974.c: Expect another diagnostics during error recovery. * c-c++-common/cpp/pr93545-1.c: New test. * c-c++-common/cpp/pr93545-2.c: New test. * c-c++-common/cpp/pr93545-3.c: New test. * c-c++-common/cpp/pr93545-4.c: New test. --- gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/c-c++-common/cpp/pr88974.c | 1 + gcc/testsuite/c-c++-common/cpp/pr93545-1.c | 4 ++++ gcc/testsuite/c-c++-common/cpp/pr93545-2.c | 4 ++++ gcc/testsuite/c-c++-common/cpp/pr93545-3.c | 4 ++++ gcc/testsuite/c-c++-common/cpp/pr93545-4.c | 4 ++++ 6 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/c-c++-common/cpp/pr93545-1.c create mode 100644 gcc/testsuite/c-c++-common/cpp/pr93545-2.c create mode 100644 gcc/testsuite/c-c++-common/cpp/pr93545-3.c create mode 100644 gcc/testsuite/c-c++-common/cpp/pr93545-4.c (limited to 'gcc') diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e24530..e46561a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2020-02-04 Jakub Jelinek + + PR preprocessor/93545 + * c-c++-common/cpp/pr88974.c: Expect another diagnostics during error + recovery. + * c-c++-common/cpp/pr93545-1.c: New test. + * c-c++-common/cpp/pr93545-2.c: New test. + * c-c++-common/cpp/pr93545-3.c: New test. + * c-c++-common/cpp/pr93545-4.c: New test. + 2020-02-04 Iain Sandoe * g++.dg/coroutines/coro-missing-promise.C: New test. diff --git a/gcc/testsuite/c-c++-common/cpp/pr88974.c b/gcc/testsuite/c-c++-common/cpp/pr88974.c index c375d83..d6c2414 100644 --- a/gcc/testsuite/c-c++-common/cpp/pr88974.c +++ b/gcc/testsuite/c-c++-common/cpp/pr88974.c @@ -3,4 +3,5 @@ #if __has_include ( character" "" { target *-*-* } .-1 } */ +/* { dg-error "missing '\\\)' after .__has_include. operand" "" { target *-*-* } .-2 } */ #endif diff --git a/gcc/testsuite/c-c++-common/cpp/pr93545-1.c b/gcc/testsuite/c-c++-common/cpp/pr93545-1.c new file mode 100644 index 0000000..757277b --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr93545-1.c @@ -0,0 +1,4 @@ +/* PR preprocessor/93545 */ +/* { dg-do preprocess } */ + +__has_include /* { dg-error "" } */ diff --git a/gcc/testsuite/c-c++-common/cpp/pr93545-2.c b/gcc/testsuite/c-c++-common/cpp/pr93545-2.c new file mode 100644 index 0000000..5ed2dab --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr93545-2.c @@ -0,0 +1,4 @@ +/* PR preprocessor/93545 */ +/* { dg-do preprocess } */ + +__has_include ( /* { dg-error "" } */ diff --git a/gcc/testsuite/c-c++-common/cpp/pr93545-3.c b/gcc/testsuite/c-c++-common/cpp/pr93545-3.c new file mode 100644 index 0000000..eae13bd --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr93545-3.c @@ -0,0 +1,4 @@ +/* PR preprocessor/93545 */ +/* { dg-do preprocess } */ + +__has_include ("foobarbaz" /* { dg-error "" } */ diff --git a/gcc/testsuite/c-c++-common/cpp/pr93545-4.c b/gcc/testsuite/c-c++-common/cpp/pr93545-4.c new file mode 100644 index 0000000..977d210 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cpp/pr93545-4.c @@ -0,0 +1,4 @@ +/* PR preprocessor/93545 */ +/* { dg-do preprocess } */ + +__has_include () /* { dg-error "" } */ -- cgit v1.1