From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15773 invoked by alias); 23 May 2008 08:50:53 -0000 Received: (qmail 15638 invoked by uid 48); 23 May 2008 08:50:05 -0000 Date: Fri, 23 May 2008 08:50:00 -0000 Subject: [Bug c++/36308] New: OpenMP privatized vars don't get dtors called if they are virtual X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "jakub at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2008-05/txt/msg01758.txt.bz2 // { dg-do run } #include #include #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. -- Summary: OpenMP privatized vars don't get dtors called if they are virtual Product: gcc Version: 4.3.1 Status: UNCONFIRMED Keywords: openmp Severity: normal Priority: P3 Component: c++ AssignedTo: jakub at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36308