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
This commit is contained in:
Marek Polacek 2016-12-12 13:57:32 +00:00 committed by Marek Polacek
parent 66dbcf2d4d
commit 3071bfa9c3
4 changed files with 36 additions and 1 deletions

View File

@ -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

View File

@ -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)));

View File

@ -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

View File

@ -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)); }