aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/match.c
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2012-06-08 19:26:11 +0200
committerJanus Weil <janus@gcc.gnu.org>2012-06-08 19:26:11 +0200
commit98cf47d1a57c7c8f0541aa61488863f4864b0e40 (patch)
tree8d289d12a300ed4e057d71380dc78973a09d46df /gcc/fortran/match.c
parentef0cd8fe8b4576fe98f4405d99431ed225ef3c17 (diff)
downloadgcc-98cf47d1a57c7c8f0541aa61488863f4864b0e40.zip
gcc-98cf47d1a57c7c8f0541aa61488863f4864b0e40.tar.gz
gcc-98cf47d1a57c7c8f0541aa61488863f4864b0e40.tar.bz2
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
Diffstat (limited to 'gcc/fortran/match.c')
-rw-r--r--gcc/fortran/match.c44
1 files changed, 22 insertions, 22 deletions
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 29b6428..3d63510 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -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");