mirror of git://gcc.gnu.org/git/gcc.git
re PR fortran/66366 ([OOP] ICE on invalid with non-allocatable CLASS variable)
2016-11-13 Janus Weil <janus@gcc.gnu.org> PR fortran/66366 * resolve.c (resolve_component): Move check for C437 to ... * decl.c (build_struct): ... here. Fix indentation. 2016-11-13 Janus Weil <janus@gcc.gnu.org> PR fortran/66366 * gfortran.dg/class_57.f90: Changed error message. * gfortran.dg/class_60.f90: New test. From-SVN: r242351
This commit is contained in:
parent
559f2bbc36
commit
9cbf867310
|
|
@ -1,3 +1,10 @@
|
||||||
|
2016-11-13 Janus Weil <janus@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR fortran/66366
|
||||||
|
* resolve.c (resolve_component): Move check for C437
|
||||||
|
to ...
|
||||||
|
* decl.c (build_struct): ... here. Fix indentation.
|
||||||
|
|
||||||
2016-11-12 Janus Weil <janus@gcc.gnu.org>
|
2016-11-12 Janus Weil <janus@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/77501
|
PR fortran/77501
|
||||||
|
|
|
||||||
|
|
@ -1866,9 +1866,18 @@ build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
|
||||||
}
|
}
|
||||||
else if (current_attr.allocatable == 0)
|
else if (current_attr.allocatable == 0)
|
||||||
{
|
{
|
||||||
gfc_error ("Component at %C must have the POINTER attribute");
|
gfc_error ("Component at %C must have the POINTER attribute");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* F03:C437. */
|
||||||
|
if (current_ts.type == BT_CLASS
|
||||||
|
&& !(current_attr.pointer || current_attr.allocatable))
|
||||||
|
{
|
||||||
|
gfc_error ("Component %qs with CLASS at %C must be allocatable "
|
||||||
|
"or pointer", name);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
|
if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
|
||||||
|
|
|
||||||
|
|
@ -13587,19 +13587,6 @@ resolve_component (gfc_component *c, gfc_symbol *sym)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* C437. */
|
|
||||||
if (c->ts.type == BT_CLASS && c->attr.flavor != FL_PROCEDURE
|
|
||||||
&& (!c->attr.class_ok
|
|
||||||
|| !(CLASS_DATA (c)->attr.class_pointer
|
|
||||||
|| CLASS_DATA (c)->attr.allocatable)))
|
|
||||||
{
|
|
||||||
gfc_error ("Component %qs with CLASS at %L must be allocatable "
|
|
||||||
"or pointer", c->name, &c->loc);
|
|
||||||
/* Prevent a recurrence of the error. */
|
|
||||||
c->ts.type = BT_UNKNOWN;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If an allocatable component derived type is of the same type as
|
/* If an allocatable component derived type is of the same type as
|
||||||
the enclosing derived type, we need a vtable generating so that
|
the enclosing derived type, we need a vtable generating so that
|
||||||
the __deallocate procedure is created. */
|
the __deallocate procedure is created. */
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
2016-11-13 Janus Weil <janus@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR fortran/66366
|
||||||
|
* gfortran.dg/class_57.f90: Changed error message.
|
||||||
|
* gfortran.dg/class_60.f90: New test.
|
||||||
|
|
||||||
2016-11-12 David Edelsohn <dje.gcc@gmail.com>
|
2016-11-12 David Edelsohn <dje.gcc@gmail.com>
|
||||||
|
|
||||||
* g++.dg/pr78112.C: XFAIL AIX.
|
* g++.dg/pr78112.C: XFAIL AIX.
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ contains
|
||||||
function pc(pd)
|
function pc(pd)
|
||||||
type(p) :: pc
|
type(p) :: pc
|
||||||
class(d), intent(in), target :: pd
|
class(d), intent(in), target :: pd
|
||||||
pc%cc => pd ! { dg-error "Non-POINTER in pointer association context" }
|
pc%cc => pd ! { dg-error "is not a member of" }
|
||||||
end function
|
end function
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
! { dg-do compile }
|
||||||
|
!
|
||||||
|
! PR 66366: [OOP] ICE on invalid with non-allocatable CLASS variable
|
||||||
|
!
|
||||||
|
! Contributed by Andrew Benson <abensonca@gmail.com>
|
||||||
|
|
||||||
|
module bug
|
||||||
|
|
||||||
|
type :: t1d
|
||||||
|
contains
|
||||||
|
procedure :: interpolate => interp
|
||||||
|
end type t1d
|
||||||
|
|
||||||
|
type :: tff
|
||||||
|
class(t1d) :: transfer ! { dg-error "must be allocatable or pointer" }
|
||||||
|
end type tff
|
||||||
|
|
||||||
|
contains
|
||||||
|
|
||||||
|
double precision function interp(self)
|
||||||
|
implicit none
|
||||||
|
class(t1d), intent(inout) :: self
|
||||||
|
return
|
||||||
|
end function interp
|
||||||
|
|
||||||
|
double precision function fvb(self)
|
||||||
|
implicit none
|
||||||
|
class(tff), intent(inout) :: self
|
||||||
|
fvb=self%transfer%interpolate() ! { dg-error "is not a member of" }
|
||||||
|
return
|
||||||
|
end function fvb
|
||||||
|
|
||||||
|
end module bug
|
||||||
Loading…
Reference in New Issue