re PR fortran/52552 ([OOP] ICE when trying to allocate non-allocatable object giving a dynamic type)

2012-06-08  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/52552
	* match.c (gfc_match_allocate): Modify order of checks. Change wording
	of error message. Remove FIXME note.
	* resolve.c (resolve_allocate_expr): Add a comment.

2012-06-08  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/52552
	* gfortran.dg/allocate_alloc_opt_1.f90: Modified.
	* gfortran.dg/allocate_class_1.f90: Modified.
	* gfortran.dg/allocate_with_typespec_4.f90: Modified.
	* gfortran.dg/allocate_class_2.f90: New.

From-SVN: r188335
This commit is contained in:
Janus Weil 2012-06-08 19:26:11 +02:00
parent ef0cd8fe8b
commit 98cf47d1a5
8 changed files with 57 additions and 25 deletions

View File

@ -1,3 +1,10 @@
2012-06-08 Janus Weil <janus@gcc.gnu.org>
PR fortran/52552
* match.c (gfc_match_allocate): Modify order of checks. Change wording
of error message. Remove FIXME note.
* resolve.c (resolve_allocate_expr): Add a comment.
2012-06-07 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/52861

View File

@ -3533,6 +3533,28 @@ gfc_match_allocate (void)
}
}
/* Check for F08:C628. */
sym = tail->expr->symtree->n.sym;
b1 = !(tail->expr->ref
&& (tail->expr->ref->type == REF_COMPONENT
|| tail->expr->ref->type == REF_ARRAY));
if (sym && sym->ts.type == BT_CLASS && sym->attr.class_ok)
b2 = !(CLASS_DATA (sym)->attr.allocatable
|| CLASS_DATA (sym)->attr.class_pointer);
else
b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
|| sym->attr.proc_pointer);
b3 = sym && sym->ns && sym->ns->proc_name
&& (sym->ns->proc_name->attr.allocatable
|| sym->ns->proc_name->attr.pointer
|| sym->ns->proc_name->attr.proc_pointer);
if (b1 && b2 && !b3)
{
gfc_error ("Allocate-object at %L is neither a data pointer "
"nor an allocatable variable", &tail->expr->where);
goto cleanup;
}
/* The ALLOCATE statement had an optional typespec. Check the
constraints. */
if (ts.type != BT_UNKNOWN)
@ -3558,28 +3580,6 @@ gfc_match_allocate (void)
if (tail->expr->ts.type == BT_DERIVED)
tail->expr->ts.u.derived = gfc_use_derived (tail->expr->ts.u.derived);
/* FIXME: disable the checking on derived types and arrays. */
sym = tail->expr->symtree->n.sym;
b1 = !(tail->expr->ref
&& (tail->expr->ref->type == REF_COMPONENT
|| tail->expr->ref->type == REF_ARRAY));
if (sym && sym->ts.type == BT_CLASS && sym->attr.class_ok)
b2 = !(CLASS_DATA (sym)->attr.allocatable
|| CLASS_DATA (sym)->attr.class_pointer);
else
b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
|| sym->attr.proc_pointer);
b3 = sym && sym->ns && sym->ns->proc_name
&& (sym->ns->proc_name->attr.allocatable
|| sym->ns->proc_name->attr.pointer
|| sym->ns->proc_name->attr.proc_pointer);
if (b1 && b2 && !b3)
{
gfc_error ("Allocate-object at %L is neither a nonprocedure pointer "
"nor an allocatable variable", &tail->expr->where);
goto cleanup;
}
if (gfc_peek_ascii_char () == '(' && !sym->attr.dimension)
{
gfc_error ("Shape specification for allocatable scalar at %C");

View File

@ -6986,6 +6986,7 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code)
}
}
/* Check for F08:C628. */
if (allocatable == 0 && pointer == 0)
{
gfc_error ("Allocate-object at %L must be ALLOCATABLE or a POINTER",

View File

@ -1,3 +1,11 @@
2012-06-08 Janus Weil <janus@gcc.gnu.org>
PR fortran/52552
* gfortran.dg/allocate_alloc_opt_1.f90: Modified.
* gfortran.dg/allocate_class_1.f90: Modified.
* gfortran.dg/allocate_with_typespec_4.f90: Modified.
* gfortran.dg/allocate_class_2.f90: New.
2012-06-07 Hans-Peter Nilsson <hp@axis.com>
PR middle-end/53535

View File

@ -24,7 +24,7 @@ program a
allocate(i(2), errmsg=err) ! { dg-warning "useless without a STAT" }
allocate(i(2), stat=j, errmsg=x) ! { dg-error "must be a scalar CHARACTER" }
allocate(err) ! { dg-error "neither a nonprocedure pointer nor an allocatable" }
allocate(err) ! { dg-error "neither a data pointer nor an allocatable" }
allocate(error(2),stat=j,errmsg=error(1)) ! { dg-error "shall not be ALLOCATEd within" }
allocate(i(2), stat = i(1)) ! { dg-error "shall not be ALLOCATEd within" }

View File

@ -7,5 +7,5 @@
type :: t0
end type
class(t0) :: x ! { dg-error "must be dummy, allocatable or pointer" }
allocate(x) ! { dg-error "is neither a nonprocedure pointer nor an allocatable variable" }
allocate(x) ! { dg-error "is neither a data pointer nor an allocatable variable" }
end

View File

@ -0,0 +1,16 @@
! { dg-do compile }
!
! PR 52552: [OOP] ICE when trying to allocate non-allocatable object giving a dynamic type
!
! Contributed by <gccbgz.lionm@xoxy.net>
type t
integer :: i
end type
class(t) :: o ! { dg-error "must be dummy, allocatable or pointer" }
allocate(t::o) ! { dg-error "is neither a data pointer nor an allocatable variable" }
end

View File

@ -21,7 +21,7 @@ subroutine not_an_f03_intrinsic
allocate(real*8 :: y(1)) ! { dg-error "Invalid type-spec at" }
allocate(real*4 :: x8) ! { dg-error "Invalid type-spec at" }
allocate(real*4 :: y8(1)) ! { dg-error "Invalid type-spec at" }
allocate(double complex :: d1) ! { dg-error "neither a nonprocedure pointer nor an allocatable" }
allocate(double complex :: d1) ! { dg-error "neither a data pointer nor an allocatable" }
allocate(real_type :: b)
allocate(real_type :: c(1))