Bug 36308 - OpenMP privatized vars don't get dtors called if they are virtual
Summary: OpenMP privatized vars don't get dtors called if they are virtual
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.3.1
: P3 normal
Target Milestone: ---
Assignee: Jakub Jelinek
URL:
Keywords: openmp
Depends on:
Blocks:
 
Reported: 2008-05-23 08:50 UTC by Jakub Jelinek
Modified: 2008-05-23 13:34 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2008-05-23 13:31:56


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jakub Jelinek 2008-05-23 08:50:04 UTC
// { dg-do run }

#include <omp.h>
#include <assert.h>

#define N 10

struct B
{
  static int icount;
  static int ccount;
  static int dcount;
  static int xcount;

  B ();
  B (const B &);
  virtual ~B ();
  B& operator= (const B &);
  void doit ();
  static void clear () { icount = ccount = dcount = xcount = 0; }
};

int B::icount;
int B::ccount;
int B::dcount;
int B::xcount;

B::B ()
{
  #pragma omp atomic 
    icount++;
}

B::B (const B &)
{
  #pragma omp atomic
    ccount++;
}

B::~B ()
{
  #pragma omp atomic
    dcount++;
}

void
B::doit ()
{
  #pragma omp atomic
    xcount++;
}

static int nthreads;

void
test1 ()
{
  B b[N];
  #pragma omp parallel private (b)
    {
      #pragma omp master
        nthreads = omp_get_num_threads ();
      b[0].doit ();
    }
}

void
test2 ()
{
  B b;
  #pragma omp parallel firstprivate (b)
    {
      #pragma omp single
        nthreads = omp_get_num_threads ();
      b.doit ();
    }
}

int
main ()
{
  omp_set_dynamic (0);
  omp_set_num_threads (4);

  B::clear ();
  test1 ();
  assert (B::xcount == nthreads);
  assert (B::ccount == 0);
  assert (B::icount == (nthreads + 1) * N);
  assert (B::dcount == (nthreads + 1) * N);

  B::clear ();
  test2 ();
  assert (B::xcount == nthreads);
  assert (B::ccount == nthreads);
  assert (B::icount == 1);
  assert (B::dcount == nthreads + 1);
  return 0;
}

fails when the dtor is virtual, succeeds when it is not virtual.
finish_omp_clauses calls get_callee_fndecl, but in this case on CALL_EXPR
with OBJ_TYPE_REF inside and thus returns NULL.  We always know the type of the var at compile time, so we just should use cp_fold_obj_type_ref in this case.
Comment 1 Jakub Jelinek 2008-05-23 11:53:29 UTC
Subject: Bug 36308

Author: jakub
Date: Fri May 23 11:52:44 2008
New Revision: 135798

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=135798
Log:
	PR c++/36308
	* semantics.c (omp_clause_info_fndecl): New function.
	(finish_omp_clauses): Use it.

	* testsuite/libgomp.c++/ctor-11.C: New test.
	* testsuite/libgomp.c++/ctor-12.C: New test.

Added:
    trunk/libgomp/testsuite/libgomp.c++/ctor-11.C
    trunk/libgomp/testsuite/libgomp.c++/ctor-12.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/semantics.c
    trunk/libgomp/ChangeLog

Comment 2 Jakub Jelinek 2008-05-23 12:17:32 UTC
Subject: Bug 36308

Author: jakub
Date: Fri May 23 12:16:41 2008
New Revision: 135800

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=135800
Log:
	PR c++/36308
	* semantics.c (omp_clause_info_fndecl): New function.
	(finish_omp_clauses): Use it.

	* testsuite/libgomp.c++/ctor-11.C: New test.
	* testsuite/libgomp.c++/ctor-12.C: New test.

Added:
    branches/gcc-4_3-branch/libgomp/testsuite/libgomp.c++/ctor-11.C
    branches/gcc-4_3-branch/libgomp/testsuite/libgomp.c++/ctor-12.C
Modified:
    branches/gcc-4_3-branch/gcc/cp/ChangeLog
    branches/gcc-4_3-branch/gcc/cp/semantics.c
    branches/gcc-4_3-branch/libgomp/ChangeLog

Comment 3 Jakub Jelinek 2008-05-23 13:34:13 UTC
Fixed for 4.3/4.4.