From 05a26161b47e20ef03df11724609d82f372a37f7 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Wed, 3 Sep 2008 15:03:56 +0200
Subject: [PATCH] re PR target/37436 (arm-cross-g++. internal compiler error:
 in extract_insn, at recog.c:1990)

	PR c++/37436
	* gimple.h (gimple_has_substatements): GIMPLE_OMP_CRITICAL has
	substatements.
	* tree-inline.c (remap_gimple_stmt): Handle GIMPLE_OMP_CRITICAL.

	* g++.dg/gomp/pr37436.C: New test.

From-SVN: r139937
---
 gcc/ChangeLog                       |  7 +++++++
 gcc/gimple.h                        |  1 +
 gcc/testsuite/ChangeLog             |  5 +++++
 gcc/testsuite/g++.dg/gomp/pr37436.C | 15 +++++++++++++++
 gcc/tree-inline.c                   |  6 ++++++
 5 files changed, 34 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/gomp/pr37436.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 894a32d47959..e0275e181f8f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2008-09-03  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/37436
+	* gimple.h (gimple_has_substatements): GIMPLE_OMP_CRITICAL has
+	substatements.
+	* tree-inline.c (remap_gimple_stmt): Handle GIMPLE_OMP_CRITICAL.
+
 2008-09-03  Bernd Schmidt  <bernd.schmidt@analog.com>
 
 	From Michael Frysinger  <michael.frysinger@analog.com>
diff --git a/gcc/gimple.h b/gcc/gimple.h
index ca8e64404e26..f8af057dfea8 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1052,6 +1052,7 @@ gimple_has_substatements (gimple g)
     case GIMPLE_OMP_TASK:
     case GIMPLE_OMP_SECTIONS:
     case GIMPLE_OMP_SINGLE:
+    case GIMPLE_OMP_CRITICAL:
     case GIMPLE_WITH_CLEANUP_EXPR:
       return true;
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3cb12d1406f2..225c99943f76 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-03  Jakub Jelinek  <jakub@redhat.com>
+
+	PR c++/37436
+	* g++.dg/gomp/pr37436.C: New test.
+
 2008-09-03  Bernd Schmidt  <bernd.schmidt@analog.com>
 
 	From Mike Frysinger  <michael.frysinger@analog.com>
diff --git a/gcc/testsuite/g++.dg/gomp/pr37436.C b/gcc/testsuite/g++.dg/gomp/pr37436.C
new file mode 100644
index 000000000000..e2cfe44de8ef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr37436.C
@@ -0,0 +1,15 @@
+// PR c++/37436
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+  A ();
+  int i;
+};
+
+A::A ()
+{
+#pragma omp critical
+  i++;
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 5919b2be0c2d..3b77c0e68ae6 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1156,6 +1156,12 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
 	           (s1, gimple_omp_single_clauses (stmt));
 	  break;
 
+	case GIMPLE_OMP_CRITICAL:
+	  s1 = remap_gimple_seq (gimple_omp_body (stmt), id);
+	  copy
+	    = gimple_build_omp_critical (s1, gimple_omp_critical_name (stmt));
+	  break;
+
 	default:
 	  gcc_unreachable ();
 	}
-- 
GitLab