From 2bb03eb72f5b55edc6deadc2e0320a046d046fa8 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 26 Feb 2018 20:51:05 +0100 Subject: [PATCH] re PR c++/84557 (ICE with invalid firstprivate variable) PR c++/84557 * parser.c (cp_parser_omp_var_list_no_open): Only call cp_parser_lookup_name_simple on names satisfying identifier_p. (cp_parser_oacc_routine): Likewise. * g++.dg/gomp/pr84557.C: New test. From-SVN: r258011 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 9 +++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/gomp/pr84557.C | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr84557.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bf995f0e8ef5..94f684b041b0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-02-26 Jakub Jelinek + + PR c++/84557 + * parser.c (cp_parser_omp_var_list_no_open): Only call + cp_parser_lookup_name_simple on names satisfying identifier_p. + (cp_parser_oacc_routine): Likewise. + 2018-02-26 Jason Merrill PR c++/84551 - ICE with concepts and -g. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f305c9c7eba4..bcee1214c2f3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -31342,7 +31342,10 @@ cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind, if (name == error_mark_node) goto skip_comma; - decl = cp_parser_lookup_name_simple (parser, name, token->location); + if (identifier_p (name)) + decl = cp_parser_lookup_name_simple (parser, name, token->location); + else + decl = name; if (decl == error_mark_node) cp_parser_name_lookup_error (parser, name, decl, NLE_NULL, token->location); @@ -37846,7 +37849,9 @@ cp_parser_oacc_routine (cp_parser *parser, cp_token *pragma_tok, /*template_p=*/NULL, /*declarator_p=*/false, /*optional_p=*/false); - tree decl = cp_parser_lookup_name_simple (parser, name, name_loc); + tree decl = (identifier_p (name) + ? cp_parser_lookup_name_simple (parser, name, name_loc) + : name); if (name != error_mark_node && decl == error_mark_node) cp_parser_name_lookup_error (parser, name, decl, NLE_NULL, name_loc); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6fd236cd1afa..9ebfd3edd93d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-02-26 Jakub Jelinek + + PR c++/84557 + * g++.dg/gomp/pr84557.C: New test. + 2018-02-26 Marek Polacek PR c++/84325 diff --git a/gcc/testsuite/g++.dg/gomp/pr84557.C b/gcc/testsuite/g++.dg/gomp/pr84557.C new file mode 100644 index 000000000000..cd215901aefd --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr84557.C @@ -0,0 +1,14 @@ +// PR c++/84557 +// { dg-do compile } + +template struct A {}; +template struct B {}; + +void +foo () +{ + #pragma omp parallel firstprivate (A) // { dg-error "is not a variable in clause" } + ; + #pragma omp parallel firstprivate (B<0>) // { dg-error "is not a variable in clause" } + ; +} -- 2.47.2