The following program causes an ICE with -fopenmp -fexceptions: extern void bar (int); void foo (int n) { int i; #pragma omp parallel for schedule(dynamic) for (i = 0; i < n; i++) { bar (0); @throw 0; } }
Actually you can reproduce the same ICE (with the same backtrace) with C++ code: extern void bar (int); void foo (int n) { int i; #pragma omp parallel for schedule(dynamic) for (i = 0; i < n; i++) { throw 0; } } So this is not specific to Objective-C any more.
That's actually ICE on invalid, you can't throw out of a parallel region. OpenMP 2.5, section 2.4 says: "A throw executed inside a parallel region must cause execution to resume within the same parallel region, and it must be caught by the same thread that threw the exception."
This is similar to PR27328 which was only fixed for omp parallel (and even then only when not inlined or inlined at most once). Started fixing these omp region with NULL region->exit and/or region->cond issues today, but still have some to finish tomorrow.
Subject: Bug 29965 Author: jakub Date: Mon Dec 4 10:20:51 2006 New Revision: 119483 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=119483 Log: PR middle-end/29965 * omp-low.c (determine_parallel_type): Don't try to optimize combined parallels if region->exit or region->inner->exit is NULL. (expand_omp_parallel): Handle NULL region->exit even if cfg is already built. (expand_omp_for_generic): Handle NULL region->cond and region->exit. (expand_omp_for): Use expand_omp_for_generic if either region->cond or region->exit is NULL. (expand_omp_sections): Handle NULL region->cond or region->exit. (expand_omp_synch): * gcc.dg/gomp/pr29965-1.c: New test. * gcc.dg/gomp/pr29965-2.c: New test. * gcc.dg/gomp/pr29965-3.c: New test. * gcc.dg/gomp/pr29965-4.c: New test. * gcc.dg/gomp/pr29965-5.c: New test. * gcc.dg/gomp/pr29965-6.c: New test. * g++.dg/gomp/pr29965-1.C: New test. * g++.dg/gomp/pr29965-2.C: New test. * g++.dg/gomp/pr29965-3.C: New test. * g++.dg/gomp/pr29965-4.C: New test. * g++.dg/gomp/pr29965-5.C: New test. * g++.dg/gomp/pr29965-6.C: New test. * g++.dg/gomp/pr29965-7.C: New test. * g++.dg/gomp/pr29965-8.C: New test. * g++.dg/gomp/pr29965-9.C: New test. * g++.dg/gomp/pr29965-10.C: New test. Added: trunk/gcc/testsuite/g++.dg/gomp/pr29965-1.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-10.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-2.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-3.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-4.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-5.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-6.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-7.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-8.C trunk/gcc/testsuite/g++.dg/gomp/pr29965-9.C trunk/gcc/testsuite/gcc.dg/gomp/pr29965-1.c trunk/gcc/testsuite/gcc.dg/gomp/pr29965-2.c trunk/gcc/testsuite/gcc.dg/gomp/pr29965-3.c trunk/gcc/testsuite/gcc.dg/gomp/pr29965-4.c trunk/gcc/testsuite/gcc.dg/gomp/pr29965-5.c trunk/gcc/testsuite/gcc.dg/gomp/pr29965-6.c Modified: trunk/gcc/ChangeLog trunk/gcc/omp-low.c trunk/gcc/testsuite/ChangeLog
Subject: Bug 29965 Author: jakub Date: Mon Dec 4 10:23:06 2006 New Revision: 119484 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=119484 Log: PR middle-end/29965 * omp-low.c (determine_parallel_type): Don't try to optimize combined parallels if region->exit or region->inner->exit is NULL. (expand_omp_parallel): Handle NULL region->exit even if cfg is already built. (expand_omp_for_generic): Handle NULL region->cond and region->exit. (expand_omp_for): Use expand_omp_for_generic if either region->cond or region->exit is NULL. (expand_omp_sections): Handle NULL region->cond or region->exit. (expand_omp_synch): * gcc.dg/gomp/pr29965-1.c: New test. * gcc.dg/gomp/pr29965-2.c: New test. * gcc.dg/gomp/pr29965-3.c: New test. * gcc.dg/gomp/pr29965-4.c: New test. * gcc.dg/gomp/pr29965-5.c: New test. * gcc.dg/gomp/pr29965-6.c: New test. * g++.dg/gomp/pr29965-1.C: New test. * g++.dg/gomp/pr29965-2.C: New test. * g++.dg/gomp/pr29965-3.C: New test. * g++.dg/gomp/pr29965-4.C: New test. * g++.dg/gomp/pr29965-5.C: New test. * g++.dg/gomp/pr29965-6.C: New test. * g++.dg/gomp/pr29965-7.C: New test. * g++.dg/gomp/pr29965-8.C: New test. * g++.dg/gomp/pr29965-9.C: New test. * g++.dg/gomp/pr29965-10.C: New test. Added: branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-1.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-10.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-2.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-3.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-4.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-5.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-6.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-7.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-8.C branches/gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr29965-9.C branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr29965-1.c branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr29965-2.c branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr29965-3.c branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr29965-4.c branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr29965-5.c branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr29965-6.c Modified: branches/gcc-4_2-branch/gcc/ChangeLog branches/gcc-4_2-branch/gcc/omp-low.c branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
Fixed in SVN.