https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80751

--- Comment #2 from Vittorio Zecca <zeccav at gmail dot com> ---
I found that at trans-stmt.c:455 a NULL pointer is being dereferenced
at line 455
compiling test case gfortran.dg/bounds_check_fail_2.f90 and others.

This is the code fragment:

gfc_conv_ss_startstride (&loop);
      /* TODO: gfc_conv_loop_setup generates a temporary for vector
         subscripts.  This could be prevented in the elemental case
         as temporaries are handled separatedly
         (below in gfc_conv_elemental_dependencies).  */
      gfc_conv_loop_setup (&loop, &code->expr1->where); /* NULL
dereferencing here*/
      gfc_mark_ss_chain_used (ss, 1);

So I put a gcc_assert before as in:

gfc_conv_ss_startstride (&loop);
      /* TODO: gfc_conv_loop_setup generates a temporary for vector
         subscripts.  This could be prevented in the elemental case
         as temporaries are handled separatedly
         (below in gfc_conv_elemental_dependencies).  */
      gcc_assert(code->expr1);/*!vz gfortran.dg/bounds_check_fail_2.f90*/
      gfc_conv_loop_setup (&loop, &code->expr1->where);
      gfc_mark_ss_chain_used (ss, 1);

On my test case, and several more, the gcc_assert fails thus confirming that
pointer code->expr1 is NULL but it is dereferenced in the second
argument of gfc_conv_loop_setup.

I hope it is clear now.
So the compiler fails not on calling an elemental procedure, but while
compiling
the call to an elemental procedure.
I am sorry if I was obscure before.

Reply via email to