http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54990
Paul Thomas <pault at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2012-12-16 CC| |pault at gcc dot gnu.org AssignedTo|unassigned at gcc dot |pault at gcc dot gnu.org |gnu.org | Ever Confirmed|0 |1 --- Comment #1 from Paul Thomas <pault at gcc dot gnu.org> 2012-12-16 15:27:24 UTC --- trans-expr.c:203 tree gfc_get_vptr_from_expr (tree expr) { tree tmp = expr; while (tmp && !GFC_CLASS_TYPE_P (TREE_TYPE (tmp))) tmp = TREE_OPERAND (tmp, 0); tmp = gfc_class_vptr_get (tmp); return tmp; } is changed to tree gfc_get_vptr_from_expr (tree expr) { tree tmp = expr; while (tmp && !GFC_CLASS_TYPE_P (TREE_TYPE (tmp)) && !(TYPE_CANONICAL (TREE_TYPE (tmp)) && GFC_CLASS_TYPE_P (TYPE_CANONICAL (TREE_TYPE (tmp))))) tmp = TREE_OPERAND (tmp, 0); tmp = gfc_class_vptr_get (tmp); return tmp; } the bug is fixed. The array reference seems to spin a new TREE_TYPE for the class container that does not get marked as GFC_CLASS_TYPE_P. I have no idea why or what might have changed it. As soon as I get the unlimited polymorphic patch committed, I will submit this as a patch with the testcase: program test implicit none type :: ncBhStd integer :: i end type type :: tn class (ncBhStd), allocatable, dimension(:) :: cBh end type integer :: i type(tn), target :: a allocate (a%cBh(2), source = [(ncBhStd(i*99), i = 1,2)]) select type (q => a%cBh(1)) type is (ncBhStd) if (q%i .ne. 99) call abort end select end