aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-decl.c28
-rw-r--r--gcc/c-parser.c6
-rw-r--r--gcc/c-tree.h1
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr29955.c14
6 files changed, 49 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b92949e..24ee579 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2006-11-24 Jakub Jelinek <jakub@redhat.com>
+ 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 80f1a1a..fa1c340 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 8520253..c6be639 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 5785e1c..87af5cb 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 473307a..9372914 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2006-11-24 Jakub Jelinek <jakub@redhat.com>
+ 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 0000000..e49c11c
--- /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);
+}