From ba09d11a9d0ae2382bab715b102a7746d20dea6d Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Wed, 3 Mar 2021 09:55:19 +0100
Subject: c-family: Avoid ICE on va_arg [PR99324]

build_va_arg calls the middle-end mark_addressable, which e.g. requires that
cfun is non-NULL.  The following patch calls instead c_common_mark_addressable_vec
which is the c-family variant similarly to the FE c_mark_addressable and
cxx_mark_addressable, except that it doesn't error on addresses of register
variables.  As the taking of the address is artificial for the .VA_ARG
ifn and when that is lowered goes away, it is similar case to the vector
subscripting for which c_common_mark_addressable_vec has been added.

2021-03-03  Jakub Jelinek  <jakub@redhat.com>

	PR c/99324
	* c-common.c (build_va_arg): Call c_common_mark_addressable_vec
	instead of mark_addressable.  Fix a comment typo -
	neutrallly -> neutrally.

	* gcc.c-torture/compile/pr99324.c: New test.
---
 gcc/testsuite/gcc.c-torture/compile/pr99324.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr99324.c

(limited to 'gcc/testsuite/gcc.c-torture')

diff --git a/gcc/testsuite/gcc.c-torture/compile/pr99324.c b/gcc/testsuite/gcc.c-torture/compile/pr99324.c
new file mode 100644
index 0000000..7a41e5c
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr99324.c
@@ -0,0 +1,19 @@
+/* PR c/99324 */
+
+#include <stdarg.h>
+
+int
+foo (int x, ...)
+{
+  va_list a;
+  va_start (a, x);
+  int b[6] = {};
+  int bar (c)
+    int c[1][va_arg (a, int)];
+  {
+    return sizeof c[0];
+  }
+  int r = bar (b);
+  va_end (a);
+  return r;
+}
-- 
cgit v1.1