From: Jakub Jelinek Date: Fri, 17 Apr 2020 07:07:49 +0000 (+0200) Subject: inliner: Don't ICE on NULL TYPE_DOMAIN [PR94621] X-Git-Tag: basepoints/gcc-11~310 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c58cb6ac6891886b7aa01c440ac71a5e7cbcba97;p=thirdparty%2Fgcc.git inliner: Don't ICE on NULL TYPE_DOMAIN [PR94621] When I've added the VLA tweak for OpenMP to avoid error_mark_nodes in the IL in type, I forgot that TYPE_DOMAIN could be NULL. Furthermore, as an optimization, this patch checks the hopefully cheapest condition that is very likely false most of the time (enabled only during OpenMP handling) first. 2020-04-17 Jakub Jelinek PR tree-optimization/94621 * tree-inline.c (remap_type_1): Don't dereference NULL TYPE_DOMAIN. Move id->adjust_array_error_bounds check first in the condition. * gcc.c-torture/compile/pr94621.c: New test. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80a37618d753..80b0534ba51f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-04-17 Jakub Jelinek + + PR tree-optimization/94621 + * tree-inline.c (remap_type_1): Don't dereference NULL TYPE_DOMAIN. + Move id->adjust_array_error_bounds check first in the condition. + 2020-04-17 Martin Liska Jonathan Yong <10walls@gmail.com> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1341eb2745ad..64181e4e532f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2020-04-17 Jakub Jelinek + PR tree-optimization/94621 + * gcc.c-torture/compile/pr94621.c: New test. + PR c++/94314 * g++.dg/pr94314-4.C: Require c++14 rather than c++11. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr94621.c b/gcc/testsuite/gcc.c-torture/compile/pr94621.c new file mode 100644 index 000000000000..0d98dfd53a5b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr94621.c @@ -0,0 +1,16 @@ +/* PR tree-optimization/94621 */ + +struct S { int c, e[]; }; + +static inline int +foo (struct S *m, int r, int c) +{ + int (*a)[][m->c] = (int (*)[][m->c])&m->e; + return (*a)[r][c]; +} + +void +bar (struct S *a) +{ + foo (a, 0, 0); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index f095795f06f9..26c23f504be9 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -556,8 +556,9 @@ remap_type_1 (tree type, copy_body_data *id) /* For array bounds where we have decided not to copy over the bounds variable which isn't used in OpenMP/OpenACC region, change them to an uninitialized VAR_DECL temporary. */ - if (TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) == error_mark_node - && id->adjust_array_error_bounds + if (id->adjust_array_error_bounds + && TYPE_DOMAIN (new_tree) + && TYPE_MAX_VALUE (TYPE_DOMAIN (new_tree)) == error_mark_node && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != error_mark_node) { tree v = create_tmp_var (TREE_TYPE (TYPE_DOMAIN (new_tree)));