From 897145e3e11c868abb2b5ec23ef5f65a87914270 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Nov 2010 20:02:46 +0100 Subject: [PATCH] re PR c++/46160 (ICE with volatile structure and enum) PR c++/46160 * cp-gimplify.c (cp_gimplify_expr): Drop volatile MEM_REFs on the RHS to avoid infinite recursion with gimplify_expr. * g++.dg/opt/empty2.C: New test. From-SVN: r166372 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-gimplify.c | 10 ++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/opt/empty2.C | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/empty2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e884898115c..939b05af362 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-11-05 Jakub Jelinek + + PR c++/46160 + * cp-gimplify.c (cp_gimplify_expr): Drop volatile MEM_REFs + on the RHS to avoid infinite recursion with gimplify_expr. + 2010-11-05 Jason Merrill PR c++/46304 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index dd879c63b15..705979d6c55 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -595,6 +595,16 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) if (!TREE_SIDE_EFFECTS (op1) || (DECL_P (op1) && TREE_THIS_VOLATILE (op1))) *expr_p = op0; + else if (TREE_CODE (op1) == MEM_REF + && TREE_THIS_VOLATILE (op1)) + { + /* Similarly for volatile MEM_REFs on the RHS. */ + if (!TREE_SIDE_EFFECTS (TREE_OPERAND (op1, 0))) + *expr_p = op0; + else + *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p), + TREE_OPERAND (op1, 0), op0); + } else *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p), op0, op1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index debdd5467a3..203f3e0a119 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-11-05 Jakub Jelinek + PR c++/46160 + * g++.dg/opt/empty2.C: New test. + PR target/45670 * gcc.target/i386/pr45670.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/empty2.C b/gcc/testsuite/g++.dg/opt/empty2.C new file mode 100644 index 00000000000..86caa5ccb0f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/empty2.C @@ -0,0 +1,18 @@ +// PR c++/46160 +// { dg-do compile } + +struct S +{ + enum E { A }; +} s; +volatile S t; + +void f (S::E); + +void +g () +{ + volatile S *p = &s; + f (p->A); + f (t.A); +}