Bug 55824

Summary: [OOP] ICE with ALLOCATE and SOURCE= TRANSPOSE/RESHAPE
Product: gcc Reporter: Tobias Burnus <burnus>
Component: fortranAssignee: Not yet assigned to anyone <unassigned>
Status: NEW ---    
Severity: normal CC: burnus, damian, janus, pault
Priority: P3 Keywords: ice-on-valid-code
Version: 4.8.0   
Target Milestone: ---   
Host: Target:
Build: Known to work: 7.1.0
Known to fail: 5.5.0, 6.3.0 Last reconfirmed: 2013-01-08 00:00:00
Attachments: Failing test case

Description Tobias Burnus 2012-12-28 16:49:56 UTC
Created attachment 29057 [details]
Failing test case

The following example by Reinhold Bader gives an ICE.

It uses CLASS(*) but allegedly the issue also occurs with nonunlimited polymorphics.

The ICE occurs for:

  class(*), allocatable :: x(:,:), y(:,:), z(:)
...
  allocate(y(3,3), source=transpose(x)) ! <<< ICE
...
  allocate(z(9), source=reshape(x, (/ 9 /))) ! <<< ICE


Backtraces:


0x5fd05b gfc_conv_scalarized_array_ref
        ../../gcc/fortran/trans-array.c:3042
0x5fda71 gfc_conv_array_ref(gfc_se*, gfc_array_ref*, gfc_symbol*, locus*)
        ../../gcc/fortran/trans-array.c:3168
0x62ba7f gfc_conv_variable
        ../../gcc/fortran/trans-expr.c:1795

and


0x62794d gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, gfc_expr*, vec<tree_node*, va_gc, vl_embed>*)
        ../../gcc/fortran/trans-expr.c:4955
0x63f7b5 conv_generic_with_optional_char_arg
        ../../gcc/fortran/trans-intrinsic.c:4526
0x63f7b5 gfc_conv_intrinsic_function(gfc_se*, gfc_expr*)
        ../../gcc/fortran/trans-intrinsic.c:6306
0x628488 gfc_conv_function_expr
        ../../gcc/fortran/trans-expr.c:5524
0x628488 gfc_conv_expr(gfc_se*, gfc_expr*)
Comment 1 Tobias Burnus 2012-12-28 23:34:26 UTC
>  allocate(y(3,3), source=transpose(x))

This one fails in trans-stmt.c's gfc_trans_allocate for expr3:
          gfc_init_se (&se_sz, NULL);
          gfc_conv_expr_reference (&se_sz, code->expr3);
which invokes gfc_conv_variable as se->ss is NULL and se->descriptor_only is false:
        case REF_ARRAY:
...
          gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
which expects se->ss != NULL.

If one sets descriptor_only = 1, it will fail for:
          memsize = gfc_vtable_size_get (classexpr);
Comment 2 Tobias Burnus 2012-12-29 10:12:46 UTC
From trans-stmt.c's gfc_trans_allocate

       /* Evaluate expr3 just once if not a variable.  */
...
           && code->expr3->ts.type == BT_CLASS
           && code->expr3->expr_type != EXPR_VARIABLE)
         ...
         classexpr = gfc_evaluate_now (classexpr, &se.pre);

I think we should handle intrinsic functions in a special way as they never change the actual type BT_CLASS; thus, the actual type can be taken from the actual argument of RESHAPE/TRANSPOSE. (Though, check that "transfer(f())" doesn't evaluate "f" twice.)

(If one skips that if block, the ICE occurs in gfc_array_allocate when obtaining the size via gfc_array_init_size.)
Comment 3 Dominique d'Humieres 2013-01-08 12:37:05 UTC
Confirmed.
Comment 4 Damian Rouson 2015-06-30 00:23:31 UTC
I'm guessing the code below is another manifestation of the this bug:

$ cat ice-on-pack-unlimited-polymorphic.f90 
contains
  subroutine array_to_vector(array)
    class(*), allocatable :: vector(:),array(:,:)
    allocate(vector,source=pack(array,.true.))
  end subroutine
end

$ gfortran ice-on-pack-unlimited-polymorphic.f90 
ice-on-pack-unlimited-polymorphic.f90:4:0:

     allocate(vector,source=pack(array,.true.))
1
internal compiler error: Segmentation fault: 11

ice-on-pack-unlimited-polymorphic.f90:4:0: internal compiler error: Abort trap: 6
gfortran: internal compiler error: Abort trap: 6 (program f951)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://trac.macports.org/newticket> for instructions.

$ gfortran --version
GNU Fortran (MacPorts gcc6 6-20150621_0) 6.0.0 20150621 (experimental)
...

$ sudo port select --set gcc mp-gcc5
Selecting 'mp-gcc5' for 'gcc' succeeded. 'mp-gcc5' is now active.

$ gfortran ice-on-pack-unlimited-polymorphic.f90 
ice-on-pack-unlimited-polymorphic.f90:4:13:

     allocate(vector,source=pack(array,.true.))
             1
Error: Array specification required in ALLOCATE statement at (1)
Comment 5 Damian Rouson 2015-06-30 00:24:26 UTC
I'm guessing the code below is another manifestation of the this bug:

$ cat ice-on-pack-unlimited-polymorphic.f90 
contains
  subroutine array_to_vector(array)
    class(*), allocatable :: vector(:),array(:,:)
    allocate(vector,source=pack(array,.true.))
  end subroutine
end

$ gfortran ice-on-pack-unlimited-polymorphic.f90 
ice-on-pack-unlimited-polymorphic.f90:4:0:

     allocate(vector,source=pack(array,.true.))
1
internal compiler error: Segmentation fault: 11

ice-on-pack-unlimited-polymorphic.f90:4:0: internal compiler error: Abort trap: 6
gfortran: internal compiler error: Abort trap: 6 (program f951)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://trac.macports.org/newticket> for instructions.

$ gfortran --version
GNU Fortran (MacPorts gcc6 6-20150621_0) 6.0.0 20150621 (experimental)
...

$ sudo port select --set gcc mp-gcc5
Selecting 'mp-gcc5' for 'gcc' succeeded. 'mp-gcc5' is now active.

$ gfortran ice-on-pack-unlimited-polymorphic.f90 
ice-on-pack-unlimited-polymorphic.f90:4:13:

     allocate(vector,source=pack(array,.true.))
             1
Error: Array specification required in ALLOCATE statement at (1)
Comment 6 Dominique d'Humieres 2015-10-29 12:32:33 UTC
Related to/duplicate of pr57117? With the patch in comment 5 of pr57117, the original code in comment 0 compiles but segfault at run time, while the original test in pr57117 does not (altho there is a problem with "allocate(y(3,3), source=transpose(x))".

Compiling the test in comment 4 still gives an ICE at r229494 with the patch

pr55824_1.f90:4:0:

     allocate(vector,source=pack(array,.true.))
1
internal compiler error: in wide_int_to_tree, at tree.c:1480
Comment 7 Andrew Pinski 2021-12-17 21:58:35 UTC
Seems to be working in GCC 7+.
Comment 8 Paul Thomas 2023-11-29 10:47:25 UTC
(In reply to Andrew Pinski from comment #7)
> Seems to be working in GCC 7+.

Hmmm! It seems to me to be broken from 7-branch through the current mainline.

Cheers

Paul