aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2011-01-07 13:08:21 +0100
committerJanus Weil <janus@gcc.gnu.org>2011-01-07 13:08:21 +0100
commit0d87fa8ca8f0ccf7184e7606d60693530d0c4a13 (patch)
tree023ebc065d893b6ac71d6d6906442cf961c2e194 /gcc/fortran/class.c
parenta14e516339b8d3b5a3a35ec1c6e33e74019bb576 (diff)
downloadgcc-0d87fa8ca8f0ccf7184e7606d60693530d0c4a13.zip
gcc-0d87fa8ca8f0ccf7184e7606d60693530d0c4a13.tar.gz
gcc-0d87fa8ca8f0ccf7184e7606d60693530d0c4a13.tar.bz2
re PR fortran/47189 ([OOP] calling STORAGE_SIZE on a NULL-initialized class pointer)
2011-01-07 Janus Weil <janus@gcc.gnu.org> PR fortran/47189 PR fortran/47194 * gfortran.h (gfc_lval_expr_from_sym): Moved prototype. * class.c (gfc_class_null_initializer): Initialize _vptr to declared type. * expr.c (gfc_lval_expr_from_sym): Moved here from symbol.c. * resolve.c (resolve_deallocate_expr): _data component will be added at translation stage. * symbol.c (gfc_lval_expr_from_sym): Moved to expr.c. * trans-stmt.c (gfc_trans_deallocate): Reset _vptr to declared type. 2011-01-07 Janus Weil <janus@gcc.gnu.org> PR fortran/47189 PR fortran/47194 * gfortran.dg/storage_size_3.f08: Extended. From-SVN: r168565
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 7095d3e..d07df87 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -83,7 +83,8 @@ gfc_add_component_ref (gfc_expr *e, const char *name)
/* Build a NULL initializer for CLASS pointers,
- initializing the _data and _vptr components to zero. */
+ initializing the _data component to NULL and
+ the _vptr component to the declared type. */
gfc_expr *
gfc_class_null_initializer (gfc_typespec *ts)
@@ -98,9 +99,10 @@ gfc_class_null_initializer (gfc_typespec *ts)
for (comp = ts->u.derived->components; comp; comp = comp->next)
{
gfc_constructor *ctor = gfc_constructor_get();
- ctor->expr = gfc_get_expr ();
- ctor->expr->expr_type = EXPR_NULL;
- ctor->expr->ts = comp->ts;
+ if (strcmp (comp->name, "_vptr") == 0)
+ ctor->expr = gfc_lval_expr_from_sym (gfc_find_derived_vtab (ts->u.derived));
+ else
+ ctor->expr = gfc_get_null_expr (NULL);
gfc_constructor_append (&init->value.constructor, ctor);
}