openmp: Diagnose syntax mismatches between declare target and end declare target
authorJakub Jelinek <jakub@redhat.com>
Thu, 12 Aug 2021 07:26:27 +0000 (09:26 +0200)
committerJakub Jelinek <jakub@redhat.com>
Thu, 12 Aug 2021 07:34:16 +0000 (09:34 +0200)
commit01f8a8b48e50cbaa68b878d9f8a330b8c0736bed
treeb07d5d4e0f30c9177afdb77c60e6922ec600f64c
parentef07b918a7ad4f64e0e1e3db21d861f2e79de92a
openmp: Diagnose syntax mismatches between declare target and end declare target

OpenMP 5.1 says:
For any directive that has a paired end directive, including those with a begin
and end pair, both directives must use either the attribute syntax or the
pragma syntax.

The following patch enforces it with the only pair so far recognized in C++
(Fortran has many, but on the other side doesn't have attribute syntax).

While I initially wanted to use vec<bool, va_gc> *member; in there, that
unfortunately doesn't work, one gets linker errors and I guess it is fixable,
but for begin declare target we'll need a struct anyway to store device_type
etc.

2021-08-12  Jakub Jelinek  <jakub@redhat.com>

* cp-tree.h (omp_declare_target_attr): New type.
(struct saved_scope): Change type of omp_declare_target_attribute
from int to vec<omp_declare_target_attr, va_gc> * and move it.
* parser.c (cp_parser_omp_declare_target): Instead of
incrementing scope_chain->omp_declare_target_attribute, push
a struct containing parser->lexer->in_omp_attribute_pragma to
the vector.
(cp_parser_omp_end_declare_target): Instead of decrementing
scope_chain->omp_declare_target_attribute, pop a structure
from it.  Diagnose mismatching declare target vs.
end declare target syntax.
* semantics.c (finish_translation_unit): Use vec_safe_length
and vec_safe_truncate on scope_chain->omp_declare_target_attributes.
* decl2.c (cplus_decl_attributes): Use vec_safe_length
on scope_chain->omp_declare_target_attributes.

* g++.dg/gomp/attrs-12.C: New test.
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/gomp/attrs-12.C [new file with mode: 0644]