From 4f934809190163d548edbde5bae728bf954c5702 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek <jakub@redhat.com> Date: Fri, 17 Jul 2009 12:40:09 +0200 Subject: [PATCH] re PR c++/40780 (ICE in gimplify_conversion) PR c++/40780 * gimplify.c (gimplify_conversion): Don't change non-conversions into VIEW_CONVERT_EXPR. * g++.dg/template/ptrmem19.C: New test. From-SVN: r149740 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 4 ++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/ptrmem19.C | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/ptrmem19.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9a61ea724398..2d926260394d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-07-17 Jakub Jelinek <jakub@redhat.com> + + PR c++/40780 + * gimplify.c (gimplify_conversion): Don't change non-conversions into + VIEW_CONVERT_EXPR. + 2009-07-16 Sandra Loosemore <sandra@codesourcery.com> * doc/extend.texi (Nested Functions): Replace broken link with diff --git a/gcc/gimplify.c b/gcc/gimplify.c index cd3de9d5c6a4..db7de3b573b6 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1827,9 +1827,9 @@ gimplify_conversion (tree *expr_p) /* If we have a conversion to a non-register type force the use of a VIEW_CONVERT_EXPR instead. */ - if (!is_gimple_reg_type (TREE_TYPE (*expr_p))) + if (CONVERT_EXPR_P (*expr_p) && !is_gimple_reg_type (TREE_TYPE (*expr_p))) *expr_p = fold_build1_loc (loc, VIEW_CONVERT_EXPR, TREE_TYPE (*expr_p), - TREE_OPERAND (*expr_p, 0)); + TREE_OPERAND (*expr_p, 0)); return GS_OK; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19a26f72603f..fdd4d18d5b3a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-07-17 Jakub Jelinek <jakub@redhat.com> + + PR c++/40780 + * g++.dg/template/ptrmem19.C: New test. + 2009-07-17 Aldy Hernandez <aldyh@redhat.com> Manuel López-Ibáñez <manu@gcc.gnu.org> diff --git a/gcc/testsuite/g++.dg/template/ptrmem19.C b/gcc/testsuite/g++.dg/template/ptrmem19.C new file mode 100644 index 000000000000..52711c6cb688 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem19.C @@ -0,0 +1,19 @@ +// PR c++/40780 +// { dg-do compile } + +template <class T1, typename T2, typename T3> +struct A +{ + typedef T2 (T1::*m) (T3); + A (m) {} +}; +struct B; +struct C +{ + void foo (B *); +}; +typedef A <C, void, B *> D; +typedef void (C::*E) (B *); +struct F; +typedef void (C::*G) (F); +D d ((E) (G) & C::foo); -- GitLab