From 2dc9294c3c7c81a6d5e1d4dedf58fea87bbadde6 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 15 Apr 2020 09:59:14 +0200 Subject: openmp: Reject requires directives not at file or namespace scope [PR94593] This change started with a bugreport about a typo in one requires testcase (diagnosed with -Wunknown-pragmas only), but following discussion lead to noting that we do not diagnose restriction that requires directives in C/C++ may only appear at file or namespace scope; and several our tests violated that. 2020-04-15 Jakub Jelinek PR c/94593 * c-parser.c (c_parser_pragma) : Reject requires directive when not at file scope. * parser.c (cp_parser_pragma) : Reject requires directive when not at file or namespace scope. * c-c++-common/gomp/requires-1.c: Fix a typo, requries -> requires. Move directives to file scope. (i): Remove. * c-c++-common/gomp/requires-2.c: Move directives to file scope. (i, foo): Remove. * c-c++-common/gomp/requires-4.c: Move directives to file scope. * c-c++-common/gomp/atomic-19.c: Move requires directive to file scope. * c-c++-common/gomp/atomic-20.c: Likewise. * c-c++-common/gomp/atomic-21.c: Likewise. * c-c++-common/gomp/atomic-22.c: Likewise. * gcc.dg/gomp/requires-1.c: New test. * g++.dg/gomp/requires-1.C: New test. * g++.dg/gomp/requires-2.C: New test. * g++.dg/gomp/atomic-18.C: Move requires directive to file scope. --- gcc/c/ChangeLog | 6 ++++++ gcc/c/c-parser.c | 7 +++++++ 2 files changed, 13 insertions(+) (limited to 'gcc/c') diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 482a01b..a1831d4 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2020-04-15 Jakub Jelinek + + PR c/94593 + * c-parser.c (c_parser_pragma) : Reject + requires directive when not at file scope. + 2020-04-08 Tobias Burnus PR middle-end/94120 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index d1c954c..679c14d 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -12402,6 +12402,13 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) return false; case PRAGMA_OMP_REQUIRES: + if (context != pragma_external) + { + error_at (c_parser_peek_token (parser)->location, + "%<#pragma omp requires%> may only be used at file scope"); + c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL); + return false; + } c_parser_omp_requires (parser); return false; -- cgit v1.1