http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49255
Summary: -fcheck=pointer diagnosts too much: Passing NULL
pointer to OPTIONAL argument
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Keywords: diagnostic, patch, rejects-valid
Severity: normal
Priority: P3
Component: fortran
AssignedTo: [email protected]
ReportedBy: [email protected]
Valid F2008 test case:
integer,pointer :: ptr => null()
call foo(ptr)
contains
subroutine foo (x)
integer, optional :: x
print *, present (x)
end subroutine foo
end
But with -fcheck=pointer, gfortran prints at run time:
At line 2 of file test.f90
Fortran runtime error: Pointer actual argument 'ptr' is not associated
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -3269,13 +3269,16 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
else
goto end_pointer_check;
- if (attr.optional)
+ if (attr.optional
+ && ((gfc_option.allow_std & GFC_STD_F2008) == 0
+ || attr.proc_pointer))
{
/* If the actual argument is an optional pointer/allocatable and
the formal argument takes an nonpointer optional value,
it is invalid to pass a non-present argument on, even
though there is no technical reason for this in gfortran.
- See Fortran 2003, Section 12.4.1.6 item (7)+(8). */
+ See Fortran 2003, Section 12.4.1.6 item (7)+(8).
+ In Fortran 2008 that's allowed; cf. 12.5.2.12. */
tree present, null_ptr, type;
if (attr.allocatable