Hi all, the attached patch fixes the PR in the subject line by introducing a new check to reject invalid code. It's a slight update of an old patch that I posted in the PR quite some time ago, using somewhat tighter checking to avoid side effects on the testsuite.
Regtests cleanly on x86_64-linux-gnu. Ok for trunk? Cheers, Janus 2016-12-02 Janus Weil <ja...@gcc.gnu.org> PR fortran/43207 * primary.c (gfc_match_varspec): Reject nonpolymorphic references to abstract types. 2016-12-02 Janus Weil <ja...@gcc.gnu.org> PR fortran/43207 * gfortran.dg/abstract_type_9.f90: New test case.
Index: gcc/fortran/primary.c =================================================================== --- gcc/fortran/primary.c (revision 243176) +++ gcc/fortran/primary.c (working copy) @@ -2222,7 +2222,15 @@ check_substring: } } - /* F2008, C727. */ + /* F08:C611. */ + if (primary->ts.type == BT_DERIVED && primary->ref + && primary->ts.u.derived && primary->ts.u.derived->attr.abstract) + { + gfc_error ("Nonpolymorphic reference to abstract type at %C"); + return MATCH_ERROR; + } + + /* F08:C727. */ if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary)) { gfc_error ("Coindexed procedure-pointer component at %C");
! { dg-do compile } ! ! PR 43207: [OOP] invalid (pointer) assignment to and from abstract non-polymorphic expressions ! ! Contributed by Tobias Burnus <bur...@gcc.gnu.org> implicit none type, abstract :: parent integer :: i end type type, extends(parent) :: child class(parent), pointer :: comp end type type(child), target :: c1 class(child), allocatable :: c2 class(parent), pointer :: cp c1%parent = c1%parent ! { dg-error "Nonpolymorphic reference to abstract type" } c2%parent = c1%parent ! { dg-error "Nonpolymorphic reference to abstract type" } cp => c1%comp cp => c1%parent ! { dg-error "Nonpolymorphic reference to abstract type" } call sub(c1%comp) call sub(c1%parent) ! { dg-error "Nonpolymorphic reference to abstract type" } contains subroutine sub(arg) class(parent) :: arg end subroutine end