From 5c386a95ee20b9bb8f705ed1f8394ca7b4bafa7d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 24 Nov 2006 22:28:38 +0100 Subject: [PATCH] re PR c/29955 (ICE with -fopenmp -fexceptions) PR c/29955 * c-tree.h (c_maybe_initialize_eh): New prototype. * c-decl.c (finish_decl): Move EH initialization... (c_maybe_initialize_eh): ... here. New function. * c-parser.c (c_parser_omp_construct): Call c_maybe_initialize_eh if not #pragma omp atomic. * gcc.dg/gomp/pr29955.c: New test. From-SVN: r119168 --- gcc/ChangeLog | 7 +++++++ gcc/c-decl.c | 28 ++++++++++++++++++---------- gcc/c-parser.c | 6 ++++++ gcc/c-tree.h | 1 + gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/gomp/pr29955.c | 14 ++++++++++++++ 6 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/gomp/pr29955.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b92949e202e..24ee5793d7a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2006-11-24 Jakub Jelinek + PR c/29955 + * c-tree.h (c_maybe_initialize_eh): New prototype. + * c-decl.c (finish_decl): Move EH initialization... + (c_maybe_initialize_eh): ... here. New function. + * c-parser.c (c_parser_omp_construct): Call c_maybe_initialize_eh + if not #pragma omp atomic. + PR c/29736 * c-common.c (handle_vector_size_attribute): Disallow VECTOR_TYPE or UNION_TYPE inner types. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 80f1a1a621f..fa1c3406d95 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3385,6 +3385,23 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs, return tem; } +/* Initialize EH if not initialized yet and exceptions are enabled. */ + +void +c_maybe_initialize_eh (void) +{ + if (!flag_exceptions || c_eh_initialized_p) + return; + + c_eh_initialized_p = true; + eh_personality_libfunc + = init_one_libfunc (USING_SJLJ_EXCEPTIONS + ? "__gcc_personality_sj0" + : "__gcc_personality_v0"); + default_init_unwind_resume_libfunc (); + using_eh_for_cleanups (); +} + /* Finish processing of a declaration; install its initial value. If the length of an array type is not known before, @@ -3676,16 +3693,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree) TREE_USED (cleanup_decl) = 1; /* Initialize EH, if we've been told to do so. */ - if (flag_exceptions && !c_eh_initialized_p) - { - c_eh_initialized_p = true; - eh_personality_libfunc - = init_one_libfunc (USING_SJLJ_EXCEPTIONS - ? "__gcc_personality_sj0" - : "__gcc_personality_v0"); - default_init_unwind_resume_libfunc (); - using_eh_for_cleanups (); - } + c_maybe_initialize_eh (); push_cleanup (decl, cleanup, false); } diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 85202539283..c6be63918f6 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -7755,6 +7755,12 @@ c_parser_omp_construct (c_parser *parser) p_kind = c_parser_peek_token (parser)->pragma_kind; c_parser_consume_pragma (parser); + /* For all constructs below except #pragma omp atomic + MUST_NOT_THROW catch handlers are needed when exceptions + are enabled. */ + if (p_kind != PRAGMA_OMP_ATOMIC) + c_maybe_initialize_eh (); + switch (p_kind) { case PRAGMA_OMP_ATOMIC: diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 5785e1cb96f..87af5cbae9d 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -456,6 +456,7 @@ extern void declare_parm_level (void); extern void undeclared_variable (tree, location_t); extern tree declare_label (tree); extern tree define_label (location_t, tree); +extern void c_maybe_initialize_eh (void); extern void finish_decl (tree, tree, tree); extern tree finish_enum (tree, tree, tree); extern void finish_function (void); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 473307a7d3e..937291468e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2006-11-24 Jakub Jelinek + PR c/29955 + * gcc.dg/gomp/pr29955.c: New test. + PR c/29736 * gcc.dg/pr29736.c: New test. diff --git a/gcc/testsuite/gcc.dg/gomp/pr29955.c b/gcc/testsuite/gcc.dg/gomp/pr29955.c new file mode 100644 index 00000000000..e49c11cae1d --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr29955.c @@ -0,0 +1,14 @@ +/* PR c/29955 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -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); +} -- 2.30.2