From c84f79e9e3f63e9ae447fd15dbd0a768cab3f643 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Aug 2021 09:10:46 +0200 Subject: [PATCH] openmp: Diagnose omp::directive/sequence on using-directive With the using-directive parsing changes, we now emit only a warning for [[omp::directive (...)]] on using-directive. While that is right without -fopenmp/-fopenmp-simd, when OpenMP is enabled, that should be an error as OpenMP (is going to) disallow such attributes there as they do not appertain to a statement. 2021-08-12 Jakub Jelinek * name-lookup.c (finish_using_directive): Diagnose omp::directive or omp::sequence attributes on using-directive. * g++.dg/gomp/attrs-11.C: Adjust expected diagnostics. --- gcc/cp/name-lookup.c | 11 +++++++++++ gcc/testsuite/g++.dg/gomp/attrs-11.C | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 1be5f3da6d5..8e9c61e1ee8 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -8560,6 +8560,7 @@ finish_using_directive (tree target, tree attribs) add_using_namespace (current_binding_level->using_directives, ORIGINAL_NAMESPACE (target)); + bool diagnosed = false; if (attribs != error_mark_node) for (tree a = attribs; a; a = TREE_CHAIN (a)) { @@ -8572,6 +8573,16 @@ finish_using_directive (tree target, tree attribs) inform (DECL_SOURCE_LOCATION (target), "you can use an inline namespace instead"); } + else if ((flag_openmp || flag_openmp_simd) + && get_attribute_namespace (a) == omp_identifier + && (is_attribute_p ("directive", name) + || is_attribute_p ("sequence", name))) + { + if (!diagnosed) + error ("% not allowed to be specified in this " + "context", name); + diagnosed = true; + } else warning (OPT_Wattributes, "%qD attribute directive ignored", name); } diff --git a/gcc/testsuite/g++.dg/gomp/attrs-11.C b/gcc/testsuite/g++.dg/gomp/attrs-11.C index a8e27b74df5..009bcb2d87f 100644 --- a/gcc/testsuite/g++.dg/gomp/attrs-11.C +++ b/gcc/testsuite/g++.dg/gomp/attrs-11.C @@ -11,7 +11,7 @@ foo () [[omp::directive (parallel)]] __extension__ asm (""); // { dg-error "expected" } __extension__ [[omp::directive (parallel)]] asm (""); // { dg-error "expected" } [[omp::directive (parallel)]] namespace M = ::N; // { dg-error "expected" } - [[omp::directive (parallel)]] using namespace N; // { dg-bogus "expected" "" { xfail *-*-* } } + [[omp::directive (parallel)]] using namespace N; // { dg-error "not allowed to be specified in this context" } [[omp::directive (parallel)]] using O::T; // { dg-error "expected" } [[omp::directive (parallel)]] __label__ foo; // { dg-error "expected" } [[omp::directive (parallel)]] static_assert (true, ""); // { dg-error "expected" }