From 7d54ef80fef93c68354ffa09448ad9c6e32c1545 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Sun, 15 Aug 2010 17:47:11 +0200 Subject: interface.c (compare_pointer, ): Allow passing TARGETs to pointers dummies with intent(in). 2010-08-15 Tobias Burnus * interface.c (compare_pointer, ): Allow passing TARGETs to pointers dummies with intent(in). 2010-08-15 Tobias Burnus * gfortran.dg/pointer_target_1.f90: New. * gfortran.dg/pointer_target_2.f90: New. * gfortran.dg/pointer_target_3.f90: New. From-SVN: r163262 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/interface.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 41d0bd3..63a3927 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2010-08-15 Tobias Burnus + + * interface.c (compare_pointer, ): Allow passing TARGETs to pointers + dummies with intent(in). + 2010-08-15 Daniel Kraft PR fortran/45197 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 1e72a90..fa32c5c 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -1368,6 +1368,11 @@ compare_pointer (gfc_symbol *formal, gfc_expr *actual) if (formal->attr.pointer) { attr = gfc_expr_attr (actual); + + /* Fortran 2008 allows non-pointer actual arguments. */ + if (!attr.pointer && attr.target && formal->attr.intent == INTENT_IN) + return 2; + if (!attr.pointer) return 0; } @@ -2113,6 +2118,17 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal, return 0; } + if (a->expr->expr_type != EXPR_NULL + && (gfc_option.allow_std & GFC_STD_F2008) == 0 + && compare_pointer (f->sym, a->expr) == 2) + { + if (where) + gfc_error ("Fortran 2008: Non-pointer actual argument at %L to " + "pointer dummy '%s'", &a->expr->where,f->sym->name); + return 0; + } + + /* Fortran 2008, C1242. */ if (f->sym->attr.pointer && gfc_is_coindexed (a->expr)) { -- cgit v1.1