+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
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)));
--- /dev/null
+// 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)); }