aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-01-17 21:55:42 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-01-17 21:55:42 +0100
commit664ceb1e2c62338ceacbbc89d3e218f39965c145 (patch)
tree0175ffcfd1d2d531d5e03b3bdd4bb83bded36f60
parenta95aef3c126b193ad4f7cf6bed6c40534236bc0b (diff)
downloadgcc-664ceb1e2c62338ceacbbc89d3e218f39965c145.zip
gcc-664ceb1e2c62338ceacbbc89d3e218f39965c145.tar.gz
gcc-664ceb1e2c62338ceacbbc89d3e218f39965c145.tar.bz2
re PR fortran/59706 (ICE with do concurrent and internal subprogram)
PR middle-end/59706 * gimplify.c (gimplify_expr): Use create_tmp_var instead of create_tmp_var_raw. If cond doesn't have integral type, don't add the IFN_ANNOTATE builtin at all. * gfortran.dg/pr59706.f90: New test. * g++.dg/ext/pr59706.C: New test. From-SVN: r206732
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/ext/pr59706.C21
-rw-r--r--gcc/testsuite/gfortran.dg/pr59706.f9010
5 files changed, 52 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7bf5733..0240d7e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/59706
+ * gimplify.c (gimplify_expr): Use create_tmp_var
+ instead of create_tmp_var_raw. If cond doesn't have
+ integral type, don't add the IFN_ANNOTATE builtin at all.
+
2014-01-17 Martin Jambor <mjambor@suse.cz>
PR ipa/59736
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 202d084..9c9998d 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -7491,7 +7491,14 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
{
tree cond = TREE_OPERAND (*expr_p, 0);
tree id = TREE_OPERAND (*expr_p, 1);
- tree tmp = create_tmp_var_raw (TREE_TYPE(cond), NULL);
+ tree type = TREE_TYPE (cond);
+ if (!INTEGRAL_TYPE_P (type))
+ {
+ *expr_p = cond;
+ ret = GS_OK;
+ break;
+ }
+ tree tmp = create_tmp_var (type, NULL);
gimplify_arg (&cond, pre_p, EXPR_LOCATION (*expr_p));
gimple call = gimple_build_call_internal (IFN_ANNOTATE, 2,
cond, id);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c471ae9..be4aa90 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/59706
+ * gfortran.dg/pr59706.f90: New test.
+ * g++.dg/ext/pr59706.C: New test.
+
2014-01-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/59270
diff --git a/gcc/testsuite/g++.dg/ext/pr59706.C b/gcc/testsuite/g++.dg/ext/pr59706.C
new file mode 100644
index 0000000..b82b45e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr59706.C
@@ -0,0 +1,21 @@
+// PR middle-end/59706
+// { dg-do compile }
+
+extern struct S s;
+struct T { T (); ~T (); int t; } t;
+
+void
+foo ()
+{
+ #pragma GCC ivdep
+ while (s) // { dg-error "could not convert" }
+ ;
+}
+
+void
+bar ()
+{
+ #pragma GCC ivdep
+ while (t) // { dg-error "could not convert" }
+ ;
+}
diff --git a/gcc/testsuite/gfortran.dg/pr59706.f90 b/gcc/testsuite/gfortran.dg/pr59706.f90
new file mode 100644
index 0000000..64a7de5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr59706.f90
@@ -0,0 +1,10 @@
+! PR middle-end/59706
+! { dg-do compile }
+
+ integer i
+ do concurrent (i=1:2)
+ end do
+contains
+ subroutine foo
+ end
+end