https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116668
Bug ID: 116668
Summary: A very strange error when trying to copy substrings
from a select type generic
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: jordan4ibanez at gmail dot com
Target Milestone: ---
This was a simple test I was doing making a threading library for Fortran on
the latest for Linux Mint 22 on gfortran 14.
I had talked to one of the devs of the LLVM fortran compiler to solve this
problem. But I still wanted to show this because it told me to report it.
I have made the mistake of not using the report function of gfortran. If you
would like more in depth review of this, here is a freeze frame of the fix I
have mentioned:
https://github.com/jordan4ibanez/Formine/tree/cbc3f7c602b9acaf84bb405f0ab7959526a8adbb
BEGIN REPORT
BEGIN TERMINAL OUTPUT
testament.f90 done.
thread_filo_queue.f90 failed.
[ 5%] Compiling...
././src/bindings/thread/thread_filo_queue.f90:239:78:
239 | new_queue_element_pointer%string(1:string_len) =
generic(1:string_len)
|
1
internal compiler error: Segmentation fault
0x15967a3 crash_signal
../../src/gcc/toplev.cc:319
0x79f8c244531f ???
./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
0xf04d67 gfc_conv_scalarized_array_ref
../../src/gcc/fortran/trans-array.cc:3938
0xf05c36 gfc_conv_array_ref(gfc_se*, gfc_array_ref*, gfc_expr*, locus*)
../../src/gcc/fortran/trans-array.cc:4094
0xf48146 gfc_conv_variable
../../src/gcc/fortran/trans-expr.cc:3181
0xf4e918 gfc_trans_assignment_1
../../src/gcc/fortran/trans-expr.cc:12273
0xef9b27 trans_code
../../src/gcc/fortran/trans.cc:2363
0xf99038 gfc_trans_block_construct(gfc_code*)
../../src/gcc/fortran/trans-stmt.cc:2377
0xef9bf7 trans_code
../../src/gcc/fortran/trans.cc:2459
0xf99038 gfc_trans_block_construct(gfc_code*)
../../src/gcc/fortran/trans-stmt.cc:2377
0xef9bf7 trans_code
../../src/gcc/fortran/trans.cc:2459
0xf8f7e4 gfc_trans_select_type_cases
../../src/gcc/fortran/trans-stmt.cc:3020
0xf9a9ad gfc_trans_select_type(gfc_code*)
../../src/gcc/fortran/trans-stmt.cc:3729
0xef9967 trans_code
../../src/gcc/fortran/trans.cc:2479
0xf99038 gfc_trans_block_construct(gfc_code*)
../../src/gcc/fortran/trans-stmt.cc:2377
0xef9bf7 trans_code
../../src/gcc/fortran/trans.cc:2459
0xf2ef2b gfc_generate_function_code(gfc_namespace*)
../../src/gcc/fortran/trans-decl.cc:7879
0xefef41 gfc_generate_module_code(gfc_namespace*)
../../src/gcc/fortran/trans.cc:2785
0xea188d translate_all_program_units
../../src/gcc/fortran/parse.cc:7086
0xea188d gfc_parse_file()
../../src/gcc/fortran/parse.cc:7413
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-14/README.Bugs> for instructions.
<ERROR> Compilation failed for object "
src_bindings_thread_thread_filo_queue.f90.o "
<ERROR> stopping due to failed compilation
STOP 1
make: *** [Makefile:27: test] Error 1
END TERMINAL OUTPUT
BEGIN SOURCE CODE
function queue_data_constructor(generic) result(new_queue_element_pointer)
implicit none
type(queue_data), pointer :: new_queue_element_pointer
class(*), intent(in), target :: generic
allocate(new_queue_element_pointer)
select type(generic)
type is (integer(c_int))
new_queue_element_pointer%type = QUEUE_I32
allocate(new_queue_element_pointer%i32)
new_queue_element_pointer%i32 = generic
type is (integer(c_int64_t))
new_queue_element_pointer%type = QUEUE_I64
allocate(new_queue_element_pointer%i64)
new_queue_element_pointer%i64 = generic
type is (real(c_float))
new_queue_element_pointer%type = QUEUE_F32
allocate(new_queue_element_pointer%f32)
new_queue_element_pointer%f32 = generic
type is (real(c_double))
new_queue_element_pointer%type = QUEUE_F64
allocate(new_queue_element_pointer%f64)
new_queue_element_pointer%f64 = generic
type is (logical)
new_queue_element_pointer%type = QUEUE_BOOL
allocate(new_queue_element_pointer%bool)
new_queue_element_pointer%bool = generic
type is (character(len = *, kind = c_char))
new_queue_element_pointer%type = QUEUE_STRING
associate (string_len => len(generic))
allocate(character(len = string_len, kind = c_char) ::
new_queue_element_pointer%string)
new_queue_element_pointer%string(1:string_len) = generic(1:string_len)
end associate
class default
!? We will check if this thing is a pointer.
!! If it's not, it's going to blow up.
new_queue_element_pointer%type = QUEUE_GENERIC
new_queue_element_pointer%generic => generic
end select
end function queue_data_constructor
END SOURCE CODE
END REPORT