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

Reply via email to