diff options
author | Janus Weil <janus@gcc.gnu.org> | 2010-05-15 15:52:33 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2010-05-15 15:52:33 +0200 |
commit | f8dde8af6f4bf8d16fcb12544caef0aad3da56f2 (patch) | |
tree | a70032d51f8a223474b6f5114ee467e48b7758f9 /gcc/fortran/expr.c | |
parent | 46c3001944a778ddd079de47697c092bfd82419a (diff) | |
download | gcc-f8dde8af6f4bf8d16fcb12544caef0aad3da56f2.zip gcc-f8dde8af6f4bf8d16fcb12544caef0aad3da56f2.tar.gz gcc-f8dde8af6f4bf8d16fcb12544caef0aad3da56f2.tar.bz2 |
re PR fortran/43207 ([OOP] invalid (pointer) assignment to and from abstract non-polymorphic expressions)
2010-05-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/43207
PR fortran/43969
* gfortran.h (gfc_class_null_initializer): New prototype.
* expr.c (gfc_class_null_initializer): New function to build a NULL
initializer for CLASS pointers.
* symbol.c (gfc_build_class_symbol): Modify internal naming of class
containers. Remove default NULL initialization of $data component.
* trans.c (gfc_allocate_array_with_status): Fix wording of an error
message.
* trans-expr.c (gfc_conv_initializer,gfc_trans_subcomponent_assign):
Use new function 'gfc_class_null_initializer'.
* trans-intrinsic.c (gfc_conv_allocated): Handle allocatable scalar
class variables.
2010-05-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/43207
PR fortran/43969
* gfortran.dg/class_18.f03: New.
* gfortran.dg/class_19.f03: New.
From-SVN: r159431
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 8230b46..382d1fe 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3628,6 +3628,32 @@ gfc_default_initializer (gfc_typespec *ts) } +/* Build a NULL initializer for CLASS pointers, + initializing the $data and $vptr components to zero. */ + +gfc_expr * +gfc_class_null_initializer (gfc_typespec *ts) +{ + gfc_expr *init; + gfc_component *comp; + + init = gfc_get_structure_constructor_expr (ts->type, ts->kind, + &ts->u.derived->declared_at); + init->ts = *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; + gfc_constructor_append (&init->value.constructor, ctor); + } + + return init; +} + + /* Given a symbol, create an expression node with that symbol as a variable. If the symbol is array valued, setup a reference of the whole array. */ |