https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70842
--- Comment #3 from nathanael.huebbe at informatik dot uni-hamburg.de --- This is getting even nastier. As it turns out, even though the code I gave above compiles, it does not produce correct results. To be precise, if I use a routine like subroutine bar(me) class(t_Intermediate), pointer, intent(in) :: me class(*), pointer :: meAlias character(len = :), pointer :: textAlias meAlias => me select type(meAlias) type is(t_Foo) textAlias => meAlias%string print*, "'"//textAlias//"', len = ", len(textAlias) !OK print*, "'"//meAlias%string//"', len = ", len(meAlias%string) !string ok, len = nonsense end select end subroutine I get some completely wrong length in the second `print` statement (like `152660480`), even though the string itself is output correctly. Again, the indirection via an additional pointer produces correct results. Another curious fact is, that the large number is constant across objects within a single run, but different when I restart my program. So I'm willing to speculate that somehow the vtable pointer is mistaken for the string length, but that may be completely wrong.