OpenMP/C++: Permit mapping classes with virtual members [PR102204]
PR c++/102204 gcc/cp/ChangeLog: * decl2.cc (cp_omp_mappable_type_1): Remove check for virtual members as those are permitted since OpenMP 5.0. libgomp/ChangeLog: * testsuite/libgomp.c++/target-virtual-1.C: New test. gcc/testsuite/ChangeLog: * g++.dg/gomp/unmappable-1.C: Remove previously expected dg-message.
This commit is contained in:
parent
2ac7b19f1e
commit
c22f3fb780
|
@ -1540,14 +1540,6 @@ cp_omp_mappable_type_1 (tree type, bool notes)
|
|||
/* Arrays have mappable type if the elements have mappable type. */
|
||||
while (TREE_CODE (type) == ARRAY_TYPE)
|
||||
type = TREE_TYPE (type);
|
||||
/* A mappable type cannot contain virtual members. */
|
||||
if (CLASS_TYPE_P (type) && CLASSTYPE_VTABLES (type))
|
||||
{
|
||||
if (notes)
|
||||
inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
|
||||
"type %qT with virtual members is not mappable", type);
|
||||
result = false;
|
||||
}
|
||||
/* All data members must be non-static. */
|
||||
if (CLASS_TYPE_P (type))
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-fopenmp" } */
|
||||
|
||||
class C /* { dg-message "type .C. with virtual members is not mappable" } */
|
||||
class C
|
||||
{
|
||||
public:
|
||||
static int static_member; /* { dg-message "static field .C::static_member. is not mappable" } */
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/* { dg-do run } */
|
||||
/* Check that classes with virtual member functions works,
|
||||
when using it as declared type. */
|
||||
struct base {
|
||||
float data [100];
|
||||
|
||||
base() = default;
|
||||
virtual ~base() = default;
|
||||
};
|
||||
|
||||
struct derived : public base {
|
||||
int scalar, array[5];
|
||||
|
||||
derived() = default;
|
||||
void do_work ()
|
||||
{
|
||||
int error = 0;
|
||||
#pragma omp target map (tofrom: this[:1], error)
|
||||
{
|
||||
if (scalar != 42 || this->array[0] != 123 || array[4] != 555)
|
||||
error = 1;
|
||||
if (data[0] != 333 || data[99] != -3)
|
||||
error = 1;
|
||||
this->scalar = 99;
|
||||
array[0] = 5;
|
||||
array[4] = -4;
|
||||
this->data[0] = 11;
|
||||
this->data[99] = 99;
|
||||
}
|
||||
if (error)
|
||||
__builtin_abort ();
|
||||
if (data[0] != 11 || data[99] != 99)
|
||||
__builtin_abort ();
|
||||
if (scalar != 99 || array[0] != 5 || array[4] != -4)
|
||||
__builtin_abort ();
|
||||
}
|
||||
};
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
struct derived x;
|
||||
x.data[0] = 333;
|
||||
x.data[99] = -3;
|
||||
x.scalar = 42;
|
||||
x.array[0] = 123;
|
||||
x.array[4] = 555;
|
||||
x.do_work ();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue