2011-06-01 Tobias Burnus <burnus@net-b.de>
PR fortran/49255
* trans-expr.c (gfc_conv_procedure_call): Fix -fcheck=pointer
for F2008.
2011-06-01 Tobias Burnus <burnus@net-b.de>
PR fortran/49255
* gfortran.dg/pointer_check_9.f90: New.
* gfortran.dg/pointer_check_10.f90: New.
@@ -3269,6 +3269,12 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
else
goto end_pointer_check;
+ /* In Fortran 2008 it's allowed to pass a NULL pointer/nonallocated
+ allocatable to an optional dummy, cf. 12.5.2.12. */
+ if (fsym != NULL && fsym->attr.optional && !attr.proc_pointer
+ && (gfc_option.allow_std & GFC_STD_F2008) != 0)
+ goto end_pointer_check;
+
if (attr.optional)
{
/* If the actual argument is an optional pointer/allocatable and
@@ -0,0 +1,15 @@
+! { dg-do run }
+! { dg-options "-fcheck=all -std=f2008 -fall-intrinsics" }
+!
+! PR fortran/49255
+!
+! Valid F2008, invalid F95/F2003.
+!
+integer,pointer :: ptr => null()
+call foo (ptr)
+contains
+ subroutine foo (x)
+ integer, optional :: x
+ if (present (x)) call abort ()
+ end subroutine foo
+end
@@ -0,0 +1,16 @@
+! { dg-do run }
+! { dg-options "-fcheck=all -std=f2003 -fall-intrinsics" }
+! { dg-shouldfail "Pointer actual argument 'ptr' is not associated" }
+!
+! PR fortran/49255
+!
+! Valid F2008, invalid F95/F2003.
+!
+integer,pointer :: ptr => null()
+call foo (ptr)
+contains
+ subroutine foo (x)
+ integer, optional :: x
+ if (present (x)) call abort ()
+ end subroutine foo
+end