Hi!

Now that the C++ FE supports these attributes, but not through registering
them in the attributes tables (they work quite differently from other
attributes), this teaches c_common_has_attributes about those.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2021-07-23  Jakub Jelinek  <ja...@redhat.com>

        * c-lex.c (c_common_has_attribute): Call canonicalize_attr_name also
        on attr_id.  Return 1 for omp::directive or omp::sequence in C++11
        and later.

        * c-c++-common/gomp/attrs-1.c: New test.
        * c-c++-common/gomp/attrs-2.c: New test.
        * c-c++-common/gomp/attrs-3.c: New test.

--- gcc/c-family/c-lex.c.jj     2021-05-21 10:34:09.046563955 +0200
+++ gcc/c-family/c-lex.c        2021-07-22 15:16:37.340412532 +0200
@@ -338,7 +338,20 @@ c_common_has_attribute (cpp_reader *pfil
              tree attr_id
                = get_identifier ((const char *)
                                  cpp_token_as_text (pfile, nxt_token));
-             attr_name = build_tree_list (attr_ns, attr_id);
+             attr_id = canonicalize_attr_name (attr_id);
+             if (c_dialect_cxx ())
+               {
+                 /* OpenMP attributes need special handling.  */
+                 if ((flag_openmp || flag_openmp_simd)
+                     && is_attribute_p ("omp", attr_ns)
+                     && (is_attribute_p ("directive", attr_id)
+                         || is_attribute_p ("sequence", attr_id)))
+                   result = 1;
+               }
+             if (result)
+               attr_name = NULL_TREE;
+             else
+               attr_name = build_tree_list (attr_ns, attr_id);
            }
          else
            {
--- gcc/testsuite/c-c++-common/gomp/attrs-1.c.jj        2021-07-22 
14:34:26.718586059 +0200
+++ gcc/testsuite/c-c++-common/gomp/attrs-1.c   2021-07-22 15:16:00.389926789 
+0200
@@ -0,0 +1,146 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#if __has_attribute(omp::directive)
+#ifndef __cplusplus
+#error omp::directive supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::directive not supported in C++
+#endif
+#endif
+
+#if __has_attribute(omp::sequence)
+#ifndef __cplusplus
+#error omp::sequence supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::sequence not supported in C++
+#endif
+#endif
+
+#if __has_attribute(omp::unknown)
+#error omp::unknown supported
+#endif
+
+#if __has_cpp_attribute(omp::directive)
+#ifndef __cplusplus
+#error omp::directive supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::directive not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(omp::sequence)
+#ifndef __cplusplus
+#error omp::sequence supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::sequence not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(omp::unknown)
+#error omp::unknown supported
+#endif
+
+#if __has_attribute(__omp__::__directive__)
+#ifndef __cplusplus
+#error __omp__::__directive__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__directive__ not supported in C++
+#endif
+#endif
+
+#if __has_attribute(__omp__::__sequence__)
+#ifndef __cplusplus
+#error __omp__::__sequence__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__sequence__ not supported in C++
+#endif
+#endif
+
+#if __has_attribute(__omp__::__unknown__)
+#error __omp__::__unknown__ supported
+#endif
+
+#if __has_cpp_attribute(__omp__::__directive__)
+#ifndef __cplusplus
+#error __omp__::__directive__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__directive__ not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(__omp__::__sequence__)
+#ifndef __cplusplus
+#error __omp__::__sequence__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__sequence__ not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(__omp__::__unknown__)
+#error __omp__::__unknown__ supported
+#endif
+
+#if __has_attribute(omp::__directive__)
+#ifndef __cplusplus
+#error omp::__directive__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::__directive__ not supported in C++
+#endif
+#endif
+
+#if __has_attribute(__omp__::sequence)
+#ifndef __cplusplus
+#error __omp__::sequence supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::sequence not supported in C++
+#endif
+#endif
+
+#if __has_attribute(omp::__unknown__)
+#error omp::__unknown__ supported
+#endif
+
+#if __has_cpp_attribute(__omp__::directive)
+#ifndef __cplusplus
+#error __omp__::directive supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::directive not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(omp::__sequence__)
+#ifndef __cplusplus
+#error omp::__sequence__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::__sequence__ not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(__omp__::unknown)
+#error __omp__::unknown supported
+#endif
--- gcc/testsuite/c-c++-common/gomp/attrs-2.c.jj        2021-07-22 
14:34:34.508477846 +0200
+++ gcc/testsuite/c-c++-common/gomp/attrs-2.c   2021-07-22 15:16:18.635672852 
+0200
@@ -0,0 +1,146 @@
+/* { dg-do compile } */
+/* { dg-options "-fno-openmp -fopenmp-simd" } */
+
+#if __has_attribute(omp::directive)
+#ifndef __cplusplus
+#error omp::directive supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::directive not supported in C++
+#endif
+#endif
+
+#if __has_attribute(omp::sequence)
+#ifndef __cplusplus
+#error omp::sequence supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::sequence not supported in C++
+#endif
+#endif
+
+#if __has_attribute(omp::unknown)
+#error omp::unknown supported
+#endif
+
+#if __has_cpp_attribute(omp::directive)
+#ifndef __cplusplus
+#error omp::directive supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::directive not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(omp::sequence)
+#ifndef __cplusplus
+#error omp::sequence supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::sequence not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(omp::unknown)
+#error omp::unknown supported
+#endif
+
+#if __has_attribute(__omp__::__directive__)
+#ifndef __cplusplus
+#error __omp__::__directive__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__directive__ not supported in C++
+#endif
+#endif
+
+#if __has_attribute(__omp__::__sequence__)
+#ifndef __cplusplus
+#error __omp__::__sequence__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__sequence__ not supported in C++
+#endif
+#endif
+
+#if __has_attribute(__omp__::__unknown__)
+#error __omp__::__unknown__ supported
+#endif
+
+#if __has_cpp_attribute(__omp__::__directive__)
+#ifndef __cplusplus
+#error __omp__::__directive__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__directive__ not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(__omp__::__sequence__)
+#ifndef __cplusplus
+#error __omp__::__sequence__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::__sequence__ not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(__omp__::__unknown__)
+#error __omp__::__unknown__ supported
+#endif
+
+#if __has_attribute(omp::__directive__)
+#ifndef __cplusplus
+#error omp::__directive__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::__directive__ not supported in C++
+#endif
+#endif
+
+#if __has_attribute(__omp__::sequence)
+#ifndef __cplusplus
+#error __omp__::sequence supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::sequence not supported in C++
+#endif
+#endif
+
+#if __has_attribute(omp::__unknown__)
+#error omp::__unknown__ supported
+#endif
+
+#if __has_cpp_attribute(__omp__::directive)
+#ifndef __cplusplus
+#error __omp__::directive supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error __omp__::directive not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(omp::__sequence__)
+#ifndef __cplusplus
+#error omp::__sequence__ supported in C
+#endif
+#else
+#ifdef __cplusplus
+#error omp::__sequence__ not supported in C++
+#endif
+#endif
+
+#if __has_cpp_attribute(__omp__::unknown)
+#error __omp__::unknown supported
+#endif
--- gcc/testsuite/c-c++-common/gomp/attrs-3.c.jj        2021-07-22 
14:34:56.393173843 +0200
+++ gcc/testsuite/c-c++-common/gomp/attrs-3.c   2021-07-22 14:58:17.525708003 
+0200
@@ -0,0 +1,74 @@
+/* { dg-do compile } */
+/* { dg-options "-fno-openmp -fno-openmp-simd" } */
+
+#if __has_attribute(omp::directive)
+#error omp::directive supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_attribute(omp::sequence)
+#error omp::sequence supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_attribute(omp::unknown)
+#error omp::unknown supported
+#endif
+
+#if __has_cpp_attribute(omp::directive)
+#error omp::directive supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_cpp_attribute(omp::sequence)
+#error omp::sequence supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_cpp_attribute(omp::unknown)
+#error omp::unknown supported
+#endif
+
+#if __has_attribute(__omp__::__directive__)
+#error __omp__::__directive__ supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_attribute(__omp__::__sequence__)
+#error __omp__::__sequence__ supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_attribute(__omp__::__unknown__)
+#error __omp__::__unknown__ supported
+#endif
+
+#if __has_cpp_attribute(__omp__::__directive__)
+#error __omp__::__directive__ supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_cpp_attribute(__omp__::__sequence__)
+#error __omp__::__sequence__ supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_cpp_attribute(__omp__::__unknown__)
+#error __omp__::__unknown__ supported
+#endif
+
+#if __has_attribute(omp::__directive__)
+#error omp::__directive__ supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_attribute(__omp__::sequence)
+#error __omp__::sequence supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_attribute(omp::__unknown__)
+#error omp::__unknown__ supported
+#endif
+
+#if __has_cpp_attribute(__omp__::directive)
+#error __omp__::directive supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_cpp_attribute(omp::__sequence__)
+#error omp::__sequence__ supported even when -fno-openmp{,-simd}
+#endif
+
+#if __has_cpp_attribute(__omp__::unknown)
+#error __omp__::unknown supported
+#endif

        Jakub

Reply via email to