https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97864
Bug ID: 97864
Summary: Homebrew Operator Overload ICE
Product: gcc
Version: 10.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: everythingfunctional at protonmail dot com
Target Milestone: ---
I have a project that was building fine on linux, but when I switched to MacOS
and tried to build, I got an ICE. I was able to narrow it down to the operator
overload. I'm completely baffled as to why this would build and run just fine
on linux, but cause an ICE on MacOS.
Version info:
GNU Fortran (Homebrew GCC 10.2.0) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
MWE (this could probably be simplified a bit more, but this seemed far enough):
module string_m
implicit none
private
type, public :: VARYING_STRING
private
character(len=1), allocatable :: characters(:)
end type
interface operator(==)
module procedure character_EQ_String
module procedure string_EQ_String
end interface
interface CHAR
module procedure stringToChar
end interface
public :: &
operator(==), &
CHAR, &
VAR_STR
contains
elemental function character_EQ_String(lhs, rhs) result(equals)
character(len=*), intent(in) :: lhs
type(VARYING_STRING), intent(in) :: rhs
logical :: equals
equals = lhs == char(rhs)
end function character_EQ_String
elemental function string_EQ_String(lhs, rhs) result(equals)
type(VARYING_STRING), intent(in) :: lhs
type(VARYING_STRING), intent(in) :: rhs
logical :: equals
equals = char(lhs) == char(rhs)
end function
pure function stringToChar(string) result(chars)
type(VARYING_STRING), intent(in) :: string
character(len=size(string%characters)) :: chars
integer :: i
integer :: length_input
integer :: length_output
length_output = len(chars)
if (allocated(string%characters)) then
length_input = size(string%characters)
do concurrent (i = 1 : min(length_input, length_output))
chars(i:i) = string%characters(i)
end do
if (length_input < length_output) then
do concurrent (i = length_input+1 : length_output)
chars(i:i) = " "
end do
end if
else
do concurrent (i = 1 : length_output)
chars(i:i) = " "
end do
end if
end function stringToChar
elemental function VAR_STR(char)
character(len=*), intent(in) :: char
type(VARYING_STRING) :: VAR_STR
integer :: i
integer :: length
length = len(char)
allocate(VAR_STR%characters(length))
do concurrent (i = 1 : length)
VAR_STR%characters(i) = char(i:i)
end do
end function VAR_STR
end module
module equal_test
use string_m, only: VARYING_STRING, operator(==), char
implicit none
private
public :: do_compare
contains
pure function do_compare(first, second) result(result_)
type(VARYING_STRING), intent(in) :: first
type(VARYING_STRING), intent(in) :: second
logical :: result_
result_ = char(first) == char(second) ! works
result_ = first == second ! works
! result_ = char(first) == second ! causes ice
end function
end module
program main
use equal_test, only: do_compare
use string_m, only: var_str
implicit none
print *, do_compare(var_str("Hello"), var_str("World"))
end program main