]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP/C++: Allow classes with static members to be mappable [PR104493]
authorTobias Burnus <tobias@codesourcery.com>
Wed, 17 Aug 2022 12:36:24 +0000 (14:36 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 17 Aug 2022 12:36:24 +0000 (14:36 +0200)
As this is the last lang-specific user of the omp_mappable_type hook,
the hook is removed, keeping only a generic omp_mappable_type for
incomplete types (or error_node).

PR c++/104493

gcc/c/ChangeLog:

* c-decl.cc (c_decl_attributes, finish_decl): Call omp_mappable_type
instead of removed langhook.
* c-typeck.cc (c_finish_omp_clauses): Likewise.

gcc/cp/ChangeLog:

* cp-objcp-common.h (LANG_HOOKS_OMP_MAPPABLE_TYPE): Remove.
* cp-tree.h (cp_omp_mappable_type, cp_omp_emit_unmappable_type_notes):
Remove.
* decl2.cc (cp_omp_mappable_type_1, cp_omp_mappable_type,
cp_omp_emit_unmappable_type_notes): Remove.
(cplus_decl_attributes): Call omp_mappable_type instead of
removed langhook.
* decl.cc (cp_finish_decl): Likewise; call cxx_incomplete_type_inform
in lieu of cp_omp_emit_unmappable_type_notes.
* semantics.cc (finish_omp_clauses): Likewise.

gcc/ChangeLog:

* gimplify.cc (omp_notice_variable): Call omp_mappable_type
instead of removed langhook.
* omp-general.h (omp_mappable_type): New prototype.
* omp-general.cc (omp_mappable_type):  New; moved from ...
* langhooks.cc (lhd_omp_mappable_type): ... here.
* langhooks-def.h (lhd_omp_mappable_type,
LANG_HOOKS_OMP_MAPPABLE_TYPE): Remove.
(LANG_HOOKS_FOR_TYPES_INITIALIZER): Remote the latter.
* langhooks.h (struct lang_hooks_for_types): Remove
omp_mappable_type.

gcc/testsuite/ChangeLog:

* g++.dg/gomp/unmappable-1.C: Remove dg-error; remove dg-note no
longer shown as TYPE_MAIN_DECL is NULL.
* c-c++-common/gomp/map-incomplete-type.c: New test.

Co-authored-by: Chung-Lin Tang <cltang@codesourcery.com>
(cherry picked from commit 92a5de3df2dc958d6b3d18a0466189ad31f5ae79)

19 files changed:
gcc/ChangeLog.omp
gcc/c/ChangeLog.omp
gcc/c/c-decl.cc
gcc/c/c-typeck.cc
gcc/cp/ChangeLog.omp
gcc/cp/cp-objcp-common.h
gcc/cp/cp-tree.h
gcc/cp/decl.cc
gcc/cp/decl2.cc
gcc/cp/semantics.cc
gcc/gimplify.cc
gcc/langhooks-def.h
gcc/langhooks.cc
gcc/langhooks.h
gcc/omp-general.cc
gcc/omp-general.h
gcc/testsuite/ChangeLog.omp
gcc/testsuite/c-c++-common/gomp/map-incomplete-type.c [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/unmappable-1.C

index 08ab26da8ca512a1f7c03c5245c34c67078714e9..786e3ebf2f7e1fe3627787075ea88389f6f1e67a 100644 (file)
@@ -1,3 +1,21 @@
+2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline:
+       2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+                   Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR c++/104493
+       * gimplify.cc (omp_notice_variable): Call omp_mappable_type
+       instead of removed langhook.
+       * omp-general.h (omp_mappable_type): New prototype.
+       * omp-general.cc (omp_mappable_type):  New; moved from ...
+       * langhooks.cc (lhd_omp_mappable_type): ... here.
+       * langhooks-def.h (lhd_omp_mappable_type,
+       LANG_HOOKS_OMP_MAPPABLE_TYPE): Remove.
+       (LANG_HOOKS_FOR_TYPES_INITIALIZER): Remote the latter.
+       * langhooks.h (struct lang_hooks_for_types): Remove
+       omp_mappable_type.
+
 2022-08-02  Andrew Stubbs  <ams@codesourcery.com>
 
        Backport from mainline:
index 31499fcc9c78f2c88eba1e99b5b324b324f66976..6f8dae98e0c24bed7ea46da896e853806c7ec12b 100644 (file)
@@ -1,3 +1,14 @@
+2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline:
+       2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+                   Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR c++/104493
+       * c-decl.cc (c_decl_attributes, finish_decl): Call omp_mappable_type
+       instead of removed langhook.
+       * c-typeck.cc (c_finish_omp_clauses): Likewise.
+
 2022-07-05  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline:
index bc407f98afb89782bed72a4676e8d78e1d154cbe..0260fcb8c4f9f27cee4c1bfb12d308f0ae1ba1e4 100644 (file)
@@ -5054,8 +5054,7 @@ c_decl_attributes (tree *node, tree attributes, int flags)
       && ((VAR_P (*node) && is_global_var (*node))
          || TREE_CODE (*node) == FUNCTION_DECL))
     {
-      if (VAR_P (*node)
-         && !lang_hooks.types.omp_mappable_type (TREE_TYPE (*node)))
+      if (VAR_P (*node) && !omp_mappable_type (TREE_TYPE (*node)))
        attributes = tree_cons (get_identifier ("omp declare target implicit"),
                                NULL_TREE, attributes);
       else
@@ -5680,7 +5679,7 @@ finish_decl (tree decl, location_t init_loc, tree init,
       DECL_ATTRIBUTES (decl)
        = remove_attribute ("omp declare target implicit",
                            DECL_ATTRIBUTES (decl));
-      if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (decl)))
+      if (!omp_mappable_type (TREE_TYPE (decl)))
        error ("%q+D in declare target directive does not have mappable type",
               decl);
       else if (!lookup_attribute ("omp declare target",
index d336308167b9dc42309faa5b20173ae8d6c027b3..c1852586cd84f43d4c4e0c7ec5f07360c2f0f7ff 100644 (file)
@@ -15126,7 +15126,7 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
              else
                {
                  t = OMP_CLAUSE_DECL (c);
-                 if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (t)))
+                 if (!omp_mappable_type (TREE_TYPE (t)))
                    {
                      error_at (OMP_CLAUSE_LOCATION (c),
                                "array section does not have mappable type "
@@ -15263,7 +15263,7 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                            t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
                  remove = true;
                }
-             else if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (t)))
+             else if (!omp_mappable_type (TREE_TYPE (t)))
                {
                  error_at (OMP_CLAUSE_LOCATION (c),
                            "%qE does not have a mappable type in %qs clause",
@@ -15344,7 +15344,7 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                         || (OMP_CLAUSE_MAP_KIND (c)
                             == GOMP_MAP_FORCE_DEVICEPTR)))
                   && t == OMP_CLAUSE_DECL (c)
-                  && !lang_hooks.types.omp_mappable_type (TREE_TYPE (t)))
+                  && !omp_mappable_type (TREE_TYPE (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD does not have a mappable type in %qs clause", t,
@@ -15461,7 +15461,7 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                        cname);
              remove = true;
            }
-         else if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (t)))
+         else if (!omp_mappable_type (TREE_TYPE (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD does not have a mappable type in %qs clause", t,
index d107e6cd9e643dc76d38bd85cb6c66d72ab14248..b122ac07ef98e3c9d20865b6574f3fdba9c73f18 100644 (file)
@@ -1,3 +1,21 @@
+2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline:
+       2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+                   Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR c++/104493
+       * cp-objcp-common.h (LANG_HOOKS_OMP_MAPPABLE_TYPE): Remove.
+       * cp-tree.h (cp_omp_mappable_type, cp_omp_emit_unmappable_type_notes):
+       Remove.
+       * decl2.cc (cp_omp_mappable_type_1, cp_omp_mappable_type,
+       cp_omp_emit_unmappable_type_notes): Remove.
+       (cplus_decl_attributes): Call omp_mappable_type instead of
+       removed langhook.
+       * decl.cc (cp_finish_decl): Likewise; call cxx_incomplete_type_inform
+       in lieu of cp_omp_emit_unmappable_type_notes.
+       * semantics.cc (finish_omp_clauses): Likewise.
+
 2022-07-29  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline:
index 3c04e5c026565e655197756413dc069d46b0573e..1a67f14d9b38841ebcfcf307d196bcefa858ab3a 100644 (file)
@@ -187,8 +187,6 @@ extern tree cxx_simulate_record_decl (location_t, const char *,
 #define LANG_HOOKS_OMP_FINISH_CLAUSE cxx_omp_finish_clause
 #undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
 #define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE cxx_omp_privatize_by_reference
-#undef LANG_HOOKS_OMP_MAPPABLE_TYPE
-#define LANG_HOOKS_OMP_MAPPABLE_TYPE cp_omp_mappable_type
 #undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
 #define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR cxx_omp_disregard_value_expr
 
index 72f4398a8f90717a03b5610a8c23f89500413382..73d22aac7d610ef3176e1d2f81d8c5fc99ed55f8 100644 (file)
@@ -6967,8 +6967,6 @@ extern bool possibly_inlined_p                    (tree);
 extern int parm_index                           (tree);
 extern tree vtv_start_verification_constructor_init_function (void);
 extern tree vtv_finish_verification_constructor_init_function (tree);
-extern bool cp_omp_mappable_type               (tree);
-extern bool cp_omp_emit_unmappable_type_notes  (tree);
 extern void cp_check_const_attributes (tree);
 
 /* in error.cc */
index a11dd1cc28ab21465d08672325e83c909a5c7874..3185dcf5acac1c12740163551e7830d780eb1e77 100644 (file)
@@ -8607,11 +8607,13 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
        = remove_attribute ("omp declare target implicit",
                            DECL_ATTRIBUTES (decl));
       complete_type (TREE_TYPE (decl));
-      if (!cp_omp_mappable_type (TREE_TYPE (decl)))
+      if (!omp_mappable_type (TREE_TYPE (decl)))
        {
          error ("%q+D in declare target directive does not have mappable"
                 " type", decl);
-         cp_omp_emit_unmappable_type_notes (TREE_TYPE (decl));
+         if (TREE_TYPE (decl) != error_mark_node
+             && !COMPLETE_TYPE_P (TREE_TYPE (decl)))
+           cxx_incomplete_type_inform (TREE_TYPE (decl));
        }
       else if (!lookup_attribute ("omp declare target",
                                  DECL_ATTRIBUTES (decl))
index 80a5bd97f533603ef1f55451d6ffb93603d8f80a..da32a9776fbaf5289e1faa4738d57211e21b7548 100644 (file)
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "c-family/c-ada-spec.h"
 #include "asan.h"
 #include "optabs-query.h"
+#include "omp-general.h"
 
 /* Id for dumping the raw trees.  */
 int raw_dump_id;
@@ -1551,65 +1552,6 @@ cp_check_const_attributes (tree attributes)
     }
 }
 
-/* Return true if TYPE is an OpenMP mappable type.
-   If NOTES is non-zero, emit a note message for each problem.  */
-static bool
-cp_omp_mappable_type_1 (tree type, bool notes)
-{
-  bool result = true;
-
-  /* Mappable type has to be complete.  */
-  if (type == error_mark_node || !COMPLETE_TYPE_P (type))
-    {
-      if (notes && type != error_mark_node)
-       {
-         tree decl = TYPE_MAIN_DECL (type);
-         inform ((decl ? DECL_SOURCE_LOCATION (decl) : input_location),
-                 "incomplete type %qT is not mappable", type);
-       }
-      result = false;
-    }
-  /* Arrays have mappable type if the elements have mappable type.  */
-  while (TREE_CODE (type) == ARRAY_TYPE)
-    type = TREE_TYPE (type);
-  /* All data members must be non-static.  */
-  if (CLASS_TYPE_P (type))
-    {
-      tree field;
-      for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
-       if (VAR_P (field)
-           /* Fields that are 'static constexpr' can be folded away at compile
-              time, thus does not interfere with mapping.  */
-           && !DECL_DECLARED_CONSTEXPR_P (field))
-         {
-           if (notes)
-             inform (DECL_SOURCE_LOCATION (field),
-                     "static field %qD is not mappable", field);
-           result = false;
-         }
-       /* All fields must have mappable types.  */
-       else if (TREE_CODE (field) == FIELD_DECL
-                && !cp_omp_mappable_type_1 (TREE_TYPE (field), notes))
-         result = false;
-    }
-  return result;
-}
-
-/* Return true if TYPE is an OpenMP mappable type.  */
-bool
-cp_omp_mappable_type (tree type)
-{
-  return cp_omp_mappable_type_1 (type, false);
-}
-
-/* Return true if TYPE is an OpenMP mappable type.
-   Emit an error messages if not.  */
-bool
-cp_omp_emit_unmappable_type_notes (tree type)
-{
-  return cp_omp_mappable_type_1 (type, true);
-}
-
 /* Return the last pushed declaration for the symbol DECL or NULL
    when no such declaration exists.  */
 
@@ -1685,7 +1627,7 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
               *decl);
       else if (VAR_P (*decl)
               && (processing_template_decl
-                  || !cp_omp_mappable_type (TREE_TYPE (*decl))))
+                  || !omp_mappable_type (TREE_TYPE (*decl))))
        attributes = tree_cons (get_identifier ("omp declare target implicit"),
                                NULL_TREE, attributes);
       else
index 2f49fa7787773f715ecd0cad8da8f95a6c76b33f..85ec4807dc8cf71253f62b4a0d9fbce2b41df6e8 100644 (file)
@@ -8163,13 +8163,15 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                  t = OMP_CLAUSE_DECL (c);
                  if (TREE_CODE (t) != TREE_LIST
                      && !type_dependent_expression_p (t)
-                     && !cp_omp_mappable_type (TREE_TYPE (t)))
+                     && !omp_mappable_type (TREE_TYPE (t)))
                    {
                      error_at (OMP_CLAUSE_LOCATION (c),
                                "array section does not have mappable type "
                                "in %qs clause",
                                omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
-                     cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
+                     if (TREE_TYPE (t) != error_mark_node
+                         && !COMPLETE_TYPE_P (TREE_TYPE (t)))
+                       cxx_incomplete_type_inform (TREE_TYPE (t));
                      remove = true;
                    }
                  while (TREE_CODE (t) == ARRAY_REF)
@@ -8305,12 +8307,14 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                            t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
                  remove = true;
                }
-             else if (!cp_omp_mappable_type (TREE_TYPE (t)))
+             else if (!omp_mappable_type (TREE_TYPE (t)))
                {
                  error_at (OMP_CLAUSE_LOCATION (c),
                            "%qE does not have a mappable type in %qs clause",
                            t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
-                 cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
+                 if (TREE_TYPE (t) != error_mark_node
+                     && !COMPLETE_TYPE_P (TREE_TYPE (t)))
+                   cxx_incomplete_type_inform (TREE_TYPE (t));
                  remove = true;
                }
              while (TREE_CODE (t) == COMPONENT_REF)
@@ -8403,14 +8407,16 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                             == GOMP_MAP_FIRSTPRIVATE_POINTER)))
                   && t == OMP_CLAUSE_DECL (c)
                   && !type_dependent_expression_p (t)
-                  && !cp_omp_mappable_type (TYPE_REF_P (TREE_TYPE (t))
-                                            ? TREE_TYPE (TREE_TYPE (t))
-                                            : TREE_TYPE (t)))
+                  && !omp_mappable_type (TYPE_REF_P (TREE_TYPE (t))
+                                         ? TREE_TYPE (TREE_TYPE (t))
+                                         : TREE_TYPE (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD does not have a mappable type in %qs clause", t,
                        omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
-             cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
+             if (TREE_TYPE (t) != error_mark_node
+                 && !COMPLETE_TYPE_P (TREE_TYPE (t)))
+               cxx_incomplete_type_inform (TREE_TYPE (t));
              remove = true;
            }
          else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
@@ -8581,12 +8587,14 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                        cname);
              remove = true;
            }
-         else if (!cp_omp_mappable_type (TREE_TYPE (t)))
+         else if (!omp_mappable_type (TREE_TYPE (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD does not have a mappable type in %qs clause", t,
                        cname);
-             cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
+             if (TREE_TYPE (t) != error_mark_node
+                 && !COMPLETE_TYPE_P (TREE_TYPE (t)))
+               cxx_incomplete_type_inform (TREE_TYPE (t));
              remove = true;
            }
          if (remove)
index 5409d4b0b6f6a83c4acad2ec3f2a1cdbae1259b7..6b0ec75f01ae74518f7df4c942ccbf4626b8a3cc 100644 (file)
@@ -7911,7 +7911,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
              if (gimplify_omp_ctxp->target_firstprivatize_array_bases
                  && omp_privatize_by_reference (decl))
                type = TREE_TYPE (type);
-             if (!lang_hooks.types.omp_mappable_type (type))
+             if (!omp_mappable_type (type))
                {
                  error ("%qD referenced in target region does not have "
                         "a mappable type", decl);
index a8ef426c26d331cc376aa5d3888790e677a1d3bd..2a6f372a2cb66783e1c315be66d37ab59fb5be0f 100644 (file)
@@ -92,7 +92,6 @@ extern tree lhd_omp_array_size (tree, gimple_seq *);
 struct gimplify_omp_ctx;
 extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
                                               tree);
-extern bool lhd_omp_mappable_type (tree);
 extern bool lhd_omp_scalar_p (tree, bool);
 extern tree *lhd_omp_get_decl_init (tree);
 extern void lhd_omp_finish_decl_inits ();
@@ -208,7 +207,6 @@ extern tree lhd_unit_size_without_reusable_padding (tree);
 #define LANG_HOOKS_TYPE_MAX_SIZE       lhd_return_null_const_tree
 #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
   lhd_omp_firstprivatize_type_sizes
-#define LANG_HOOKS_OMP_MAPPABLE_TYPE   lhd_omp_mappable_type
 #define LANG_HOOKS_TYPE_HASH_EQ                NULL
 #define LANG_HOOKS_COPY_LANG_QUALIFIERS NULL
 #define LANG_HOOKS_GET_ARRAY_DESCR_INFO        NULL
@@ -237,7 +235,6 @@ extern tree lhd_unit_size_without_reusable_padding (tree);
   LANG_HOOKS_INCOMPLETE_TYPE_ERROR, \
   LANG_HOOKS_TYPE_MAX_SIZE, \
   LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES, \
-  LANG_HOOKS_OMP_MAPPABLE_TYPE, \
   LANG_HOOKS_TYPE_HASH_EQ, \
   LANG_HOOKS_COPY_LANG_QUALIFIERS, \
   LANG_HOOKS_GET_ARRAY_DESCR_INFO, \
index fc1f6216cfe5faba600f5ef9cb315b02ff2afe61..31521f4c324c05ad96974de1e23727b7ccb08a36 100644 (file)
@@ -710,17 +710,6 @@ lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED,
 {
 }
 
-/* Return true if TYPE is an OpenMP mappable type.  */
-
-bool
-lhd_omp_mappable_type (tree type)
-{
-  /* Mappable type has to be complete.  */
-  if (type == error_mark_node || !COMPLETE_TYPE_P (type))
-    return false;
-  return true;
-}
-
 /* Common function for add_builtin_function, add_builtin_function_ext_scope
    and simulate_builtin_function_decl.  */
 
index 1c6380dc4cf7c48ca33dea413d5ba0102845c68e..e883b49de1494331a08aa01bce48cc1d28e83303 100644 (file)
@@ -128,9 +128,6 @@ struct lang_hooks_for_types
      firstprivate variables.  */
   void (*omp_firstprivatize_type_sizes) (struct gimplify_omp_ctx *, tree);
 
-  /* Return true if TYPE is a mappable type.  */
-  bool (*omp_mappable_type) (tree type);
-
   /* Return TRUE if TYPE1 and TYPE2 are identical for type hashing purposes.
      Called only after doing all language independent checks.
      At present, this function is only called when both TYPE1 and TYPE2 are
index 1cfb118225cd9e4db79443eb47b522a2b8a5a6ad..13d9a5e4492a096cfba6fede189171f818d1e1b8 100644 (file)
@@ -81,6 +81,17 @@ omp_check_optional_argument (tree decl, bool for_present_check)
   return lang_hooks.decls.omp_check_optional_argument (decl, for_present_check);
 }
 
+/* Return true if TYPE is an OpenMP mappable type.  */
+
+bool
+omp_mappable_type (tree type)
+{
+  /* Mappable type has to be complete.  */
+  if (type == error_mark_node || !COMPLETE_TYPE_P (type))
+    return false;
+  return true;
+}
+
 /* True if OpenMP should privatize what this DECL points to rather
    than the DECL itself.  */
 
index fd66697ff6726ec18e7481dbdf0da5594186815d..1c39eadee0026df2f84142e8e82b8e88c2b54301 100644 (file)
@@ -106,6 +106,7 @@ struct omp_metadirective_variant
 extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
 extern bool omp_is_allocatable_or_ptr (tree decl);
 extern tree omp_check_optional_argument (tree decl, bool for_present_check);
+extern bool omp_mappable_type (tree type);
 extern bool omp_privatize_by_reference (tree decl);
 extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
                                      tree *n2, tree v, tree step);
index 808cc47c0e8b250b610ddc1fdd19acd5bc6d6083..84f762ff3cc45d4ec9ffd8b9b3486fb55469c629 100644 (file)
@@ -1,3 +1,14 @@
+2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backport from mainline:
+       2022-08-17  Tobias Burnus  <tobias@codesourcery.com>
+                   Chung-Lin Tang  <cltang@codesourcery.com>
+
+       PR c++/104493
+       * g++.dg/gomp/unmappable-1.C: Remove dg-error; remove dg-note no
+       longer shown as TYPE_MAIN_DECL is NULL.
+       * c-c++-common/gomp/map-incomplete-type.c: New test.
+
 2022-07-29  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline:
diff --git a/gcc/testsuite/c-c++-common/gomp/map-incomplete-type.c b/gcc/testsuite/c-c++-common/gomp/map-incomplete-type.c
new file mode 100644 (file)
index 0000000..29702de
--- /dev/null
@@ -0,0 +1,17 @@
+struct incomplete_t;
+/* { dg-note "forward declaration of 'struct incomplete_t'" "" { target c++ } .-1 } */
+
+/* Note: This note is only printed with C++ (trice); the loc is available due to TYPE_MAIN_DECL.  */
+
+struct incomplete_t *ptr;
+int i;
+
+void
+foo (void)
+{
+  #pragma omp target enter data map(to: i) map(to: ptr[0])
+    /* All apply to the line above.  The first error is printed twice.  */
+    /* { dg-error "invalid use of undefined type 'struct incomplete_t'" "" { target c } .-2 } */
+    /* { dg-error "invalid use of incomplete type 'struct incomplete_t'" "" { target c++ } .-3 } */
+    /* { dg-error "array section does not have mappable type in 'map' clause" "" { target *-*-* } .-4 } */
+}
index 364f884500c61834f885a34a641f452ba25615b6..28ba184a57a5162caebf95631fa4ef5734bb6ca4 100644 (file)
@@ -4,7 +4,7 @@
 class C
 {
 public:
-  static int static_member; /* { dg-message "static field .C::static_member. is not mappable" } */
+  static int static_member;
   virtual void f() {}
 };
 
@@ -14,7 +14,6 @@ int
 main ()
 {
 #pragma omp target map(v) /* { dg-error ".v. does not have a mappable type in .map. clause" } */
-  /* { dg-message "incomplete type .C \\\[\\\]. is not mappable" "" { target *-*-* } .-1 } */
   {
   }
 }