diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-08-15 18:04:49 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-08-15 18:04:49 +0200 |
commit | 08857b61110b21df00ad74de9d36ef8392dc98d3 (patch) | |
tree | a4cb2857a24f9fc0a97c5791a6cc3f3c2d51f227 /gcc/fortran/interface.c | |
parent | 7d54ef80fef93c68354ffa09448ad9c6e32c1545 (diff) | |
download | gcc-08857b61110b21df00ad74de9d36ef8392dc98d3.zip gcc-08857b61110b21df00ad74de9d36ef8392dc98d3.tar.gz gcc-08857b61110b21df00ad74de9d36ef8392dc98d3.tar.bz2 |
trans-expr.c (gfc_conv_expr_present): Regard nullified pointer arrays as absent.
2010-08-15 Tobias Burnus <burnus@net-b.de>
* trans-expr.c (gfc_conv_expr_present): Regard nullified
pointer arrays as absent.
(gfc_conv_procedure_call): Handle EXPR_NULL for non-pointer
dummys as absent argument.
* interface.c (compare_actual_formal,compare_parameter):
Ditto.
2010-08-15 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/optional_absent_1.f90: New.
* gfortran.dg/null_actual.f90: New.
From-SVN: r163263
Diffstat (limited to 'gcc/fortran/interface.c')
-rw-r--r-- | gcc/fortran/interface.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index fa32c5c..e9d310a 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -1589,7 +1589,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual, if (rank_check || ranks_must_agree || (formal->attr.pointer && actual->expr_type != EXPR_NULL) || (actual->rank != 0 && !(is_elemental || formal->attr.dimension)) - || (actual->rank == 0 && formal->as->type == AS_ASSUMED_SHAPE) + || (actual->rank == 0 && formal->as->type == AS_ASSUMED_SHAPE + && actual->expr_type != EXPR_NULL) || (actual->rank == 0 && formal->attr.dimension && gfc_is_coindexed (actual))) { @@ -2004,6 +2005,20 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal, "call at %L", where); return 0; } + + if (a->expr->expr_type == EXPR_NULL && !f->sym->attr.pointer + && (f->sym->attr.allocatable || !f->sym->attr.optional + || (gfc_option.allow_std & GFC_STD_F2008) == 0)) + { + if (where && (f->sym->attr.allocatable || !f->sym->attr.optional)) + gfc_error ("Unexpected NULL() intrinsic at %L to dummy '%s'", + where, f->sym->name); + else if (where) + gfc_error ("Fortran 2008: Null pointer at %L to non-pointer " + "dummy '%s'", where, f->sym->name); + + return 0; + } if (!compare_parameter (f->sym, a->expr, ranks_must_agree, is_elemental, where)) |