On Tue, Nov 05, 2019 at 09:27:45AM +0100, Richard Biener wrote: > > --- gcc/gimplify.c.jj 2019-11-02 10:00:59.595253274 +0100 > > +++ gcc/gimplify.c 2019-11-05 00:21:01.585958514 +0100 > > @@ -6235,8 +6235,14 @@ gimplify_asm_expr (tree *expr_p, gimple_ > > is_inout = false; > > } > > > > - /* If we can't make copies, we can only accept memory. */ > > - if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link)))) > > + /* If we can't make copies, we can only accept memory. > > + Similarly for VLAs. */ > > + tree outtype = TREE_TYPE (TREE_VALUE (link)); > > + if (outtype != error_mark_node > > so for error_mark_node we don't diagnose anything?
Yes, we should have diagnosed it already. The != error_mark_node I've added only after seeing tons of ICEs in the testsuite with earlier version of the patch. > > + && (TREE_ADDRESSABLE (outtype) > > + || !COMPLETE_TYPE_P (outtype) > > + || (!tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype)) > > + && max_int_size_in_bytes (outtype)))) > > so max_int_size_in_bytes == 0 is OK? I suppose we have a testcase > for this? Actually, I meant max_int_size_in_bytes (outtype) < 0, i.e. something on which force_constant_size ICE immediately, sorry for screwing it up in the end. All these VLAs with max_int_size_in_bytes >= 0 sizes are specific to Ada and I have no idea what is and isn't valid there, for C/C++ it should always return -1. > Otherwise looks reasonable to me. So, is the following ok if it passes bootstrap/regtest, or shall I just go for || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype))) ? 2019-11-05 Jakub Jelinek <ja...@redhat.com> PR inline-asm/92352 * gimplify.c (gimplify_asm_expr): Reject VLA in output or input operands with non-memory constraints. * c-c++-common/pr92352.c: New test. --- gcc/gimplify.c.jj 2019-11-02 10:00:59.595253274 +0100 +++ gcc/gimplify.c 2019-11-05 00:21:01.585958514 +0100 @@ -6235,8 +6235,14 @@ gimplify_asm_expr (tree *expr_p, gimple_ is_inout = false; } - /* If we can't make copies, we can only accept memory. */ - if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link)))) + /* If we can't make copies, we can only accept memory. + Similarly for VLAs. */ + tree outtype = TREE_TYPE (TREE_VALUE (link)); + if (outtype != error_mark_node + && (TREE_ADDRESSABLE (outtype) + || !COMPLETE_TYPE_P (outtype) + || (!tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype)) + && max_int_size_in_bytes (outtype) < 0))) { if (allows_mem) allows_reg = 0; @@ -6392,7 +6398,12 @@ gimplify_asm_expr (tree *expr_p, gimple_ oconstraints, &allows_mem, &allows_reg); /* If we can't make copies, we can only accept memory. */ - if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link)))) + tree intype = TREE_TYPE (TREE_VALUE (link)); + if (intype != error_mark_node + && (TREE_ADDRESSABLE (intype) + || !COMPLETE_TYPE_P (intype) + || (!tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (intype)) + && max_int_size_in_bytes (intype) < 0))) { if (allows_mem) allows_reg = 0; --- gcc/testsuite/c-c++-common/pr92352.c.jj 2019-11-04 14:03:18.725275255 +0100 +++ gcc/testsuite/c-c++-common/pr92352.c 2019-11-04 14:02:55.211629675 +0100 @@ -0,0 +1,15 @@ +/* PR inline-asm/92352 */ + +void +foo (int x) +{ + int var[x]; + asm volatile ("" : "+r" (var)); /* { dg-error "impossible constraint in 'asm'" } */ +} /* { dg-error "non-memory output 0 must stay in memory" "" { target *-*-* } .-1 } */ + +void +bar (int x) +{ + int var[x]; + asm volatile ("" : "+m" (var)); +} Jakub