Commit 744868aa by Janus Weil

re PR fortran/64244 (ICE at class.c:236 when using non_overridable)

2014-12-16  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/64244
	* resolve.c (resolve_typebound_call): New argument to pass out the
	non-overridable attribute of the specific procedure.
	(resolve_typebound_subroutine): Get overridable flag from
	resolve_typebound_call.

2014-12-16  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/64244
	* gfortran.dg/typebound_call_26.f90: New.

From-SVN: r218776
parent 728f661c
2014-12-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/64244
* resolve.c (resolve_typebound_call): New argument to pass out the
non-overridable attribute of the specific procedure.
(resolve_typebound_subroutine): Get overridable flag from
resolve_typebound_call.
2014-12-15 Steven Bosscher <steven@gcc.gnu.org> 2014-12-15 Steven Bosscher <steven@gcc.gnu.org>
PR fortran/61669 PR fortran/61669
......
...@@ -5676,7 +5676,7 @@ success: ...@@ -5676,7 +5676,7 @@ success:
/* Resolve a call to a type-bound subroutine. */ /* Resolve a call to a type-bound subroutine. */
static bool static bool
resolve_typebound_call (gfc_code* c, const char **name) resolve_typebound_call (gfc_code* c, const char **name, bool *overridable)
{ {
gfc_actual_arglist* newactual; gfc_actual_arglist* newactual;
gfc_symtree* target; gfc_symtree* target;
...@@ -5700,6 +5700,10 @@ resolve_typebound_call (gfc_code* c, const char **name) ...@@ -5700,6 +5700,10 @@ resolve_typebound_call (gfc_code* c, const char **name)
if (!resolve_typebound_generic_call (c->expr1, name)) if (!resolve_typebound_generic_call (c->expr1, name))
return false; return false;
/* Pass along the NON_OVERRIDABLE attribute of the specific TBP. */
if (overridable)
*overridable = !c->expr1->value.compcall.tbp->non_overridable;
/* Transform into an ordinary EXEC_CALL for now. */ /* Transform into an ordinary EXEC_CALL for now. */
if (!resolve_typebound_static (c->expr1, &target, &newactual)) if (!resolve_typebound_static (c->expr1, &target, &newactual))
...@@ -5959,7 +5963,7 @@ resolve_typebound_subroutine (gfc_code *code) ...@@ -5959,7 +5963,7 @@ resolve_typebound_subroutine (gfc_code *code)
if (c->ts.u.derived == NULL) if (c->ts.u.derived == NULL)
c->ts.u.derived = gfc_find_derived_vtab (declared); c->ts.u.derived = gfc_find_derived_vtab (declared);
if (!resolve_typebound_call (code, &name)) if (!resolve_typebound_call (code, &name, NULL))
return false; return false;
/* Use the generic name if it is there. */ /* Use the generic name if it is there. */
...@@ -5991,7 +5995,7 @@ resolve_typebound_subroutine (gfc_code *code) ...@@ -5991,7 +5995,7 @@ resolve_typebound_subroutine (gfc_code *code)
} }
if (st == NULL) if (st == NULL)
return resolve_typebound_call (code, NULL); return resolve_typebound_call (code, NULL, NULL);
if (!resolve_ref (code->expr1)) if (!resolve_ref (code->expr1))
return false; return false;
...@@ -6004,10 +6008,10 @@ resolve_typebound_subroutine (gfc_code *code) ...@@ -6004,10 +6008,10 @@ resolve_typebound_subroutine (gfc_code *code)
|| (!class_ref && st->n.sym->ts.type != BT_CLASS)) || (!class_ref && st->n.sym->ts.type != BT_CLASS))
{ {
gfc_free_ref_list (new_ref); gfc_free_ref_list (new_ref);
return resolve_typebound_call (code, NULL); return resolve_typebound_call (code, NULL, NULL);
} }
if (!resolve_typebound_call (code, &name)) if (!resolve_typebound_call (code, &name, &overridable))
{ {
gfc_free_ref_list (new_ref); gfc_free_ref_list (new_ref);
return false; return false;
......
2014-12-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/64244
* gfortran.dg/typebound_call_26.f90: New.
2014-12-15 Jan Hubicka <hubicka@ucw.cz> 2014-12-15 Jan Hubicka <hubicka@ucw.cz>
PR lto/64043 PR lto/64043
......
! { dg-do compile }
!
! PR 64244: [4.8/4.9/5 Regression] ICE at class.c:236 when using non_overridable
!
! Contributed by Ondřej Čertík <ondrej.certik@gmail.com>
module m
implicit none
type :: A
contains
generic :: f => g
procedure, non_overridable :: g
end type
contains
subroutine g(this)
class(A), intent(in) :: this
end subroutine
end module
program test_non_overridable
use m, only: A
implicit none
class(A), allocatable :: h
call h%f()
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment