diff options
author | Marek Polacek <polacek@redhat.com> | 2016-12-12 13:57:32 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2016-12-12 13:57:32 +0000 |
commit | 3071bfa9c33aaad54db7ae1e87f0b5e26f095022 (patch) | |
tree | 570d46db7b508e23aa0ad2623da034fa2122e779 | |
parent | 66dbcf2d4d74b29f7188dd682116ace71f2fc977 (diff) | |
download | gcc-3071bfa9c33aaad54db7ae1e87f0b5e26f095022.zip gcc-3071bfa9c33aaad54db7ae1e87f0b5e26f095022.tar.gz gcc-3071bfa9c33aaad54db7ae1e87f0b5e26f095022.tar.bz2 |
re PR middle-end/78716 (ICE in gimplify_va_arg_expr, at gimplify.c:12650 (i686-linux-gnu))
PR middle-end/78716
* gimplify.c (gimplify_va_arg_expr): Don't require ADDR_EXPR for
Case 1; check POINTER_TYPE_P instead.
* g++.dg/other/vararg-5.C: New.
From-SVN: r243553
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gimplify.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/vararg-5.C | 24 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1dc690f..81b0a3b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-12-12 Marek Polacek <polacek@redhat.com> + + PR middle-end/78716 + * gimplify.c (gimplify_va_arg_expr): Don't require ADDR_EXPR for + Case 1; check POINTER_TYPE_P instead. + 2016-12-12 Bernd Schmidt <bschmidt@redhat.com> PR rtl-optimization/78669 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 8611060..b738855 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -12643,7 +12643,7 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, return GS_ERROR; have_va_type = targetm.canonical_va_list_type (have_va_type); if (have_va_type == NULL_TREE - && TREE_CODE (valist) == ADDR_EXPR) + && POINTER_TYPE_P (TREE_TYPE (valist))) /* Handle 'Case 1: Not an array type' from c-common.c/build_va_arg. */ have_va_type = targetm.canonical_va_list_type (TREE_TYPE (TREE_TYPE (valist))); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66407ff..588c51b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-12 Marek Polacek <polacek@redhat.com> + + PR middle-end/78716 + * g++.dg/other/vararg-5.C: New. + 2016-12-12 Bernd Schmidt <bschmidt@redhat.com> PR rtl-optimization/78669 diff --git a/gcc/testsuite/g++.dg/other/vararg-5.C b/gcc/testsuite/g++.dg/other/vararg-5.C new file mode 100644 index 0000000..9327bd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/vararg-5.C @@ -0,0 +1,24 @@ +// PR middle-end/78716 +// { dg-do compile } + +template <typename = int, typename = int, typename = int, typename = int, + typename = int> + struct a; + template <typename> struct b; + template <typename = int, typename d = void> class e : b<d>::c { + public: + typedef e f; + typedef typename b<d>::c g; + e(__builtin_va_list *s) : g(__builtin_va_arg(*s, int)) {} + }; +template <> struct b<void> { typedef e<> c; }; +template <> struct e<> { template <typename h> e(h); }; +template <typename i> class a<i> : public e<i> {}; +template <typename i, typename j, typename k, typename l> +class a<i, j, k, l> : e<typename a<j>::f> { + public: + template <typename m, typename n, typename o, typename p> + a(a<m, n, o, p>) : a::f(0) {} +}; +template <typename i, typename j, typename k, typename l> a<> r(i, j, k, l); +void q() { a<float, float>(r(4, 6, 9, 7)); } |