Hi Tobias,

For assumed shape, gfortran generates an "arg.0 = arg->data"
artificial variable – and with optional one has something like

if (arg != NULL && arg->data != NULL)
   {
     arg.0 = arg->data;
     lbound.0 = ...
   }

And an "if (present(arg))" becomes
"if (arg != NULL && arg->data != NULL)".

The proposed change changes the init to:

if (arg != NULL && arg->data != NULL)
   {
     arg.0 = arg->data;
     lbound.0 = ...
   }
else
   arg.0 = NULL;  // <-- new

I think this is a good idea in general. We later use the arg.0
variable to access the contents of the argument, so this generates
a clear segfault for all cases where the user accesses non-present
opiontal arguments instead of something random.

Also, this avoids potential warnings about undefined variables.


Thus: I think either variant (checking arg directly vs. checking arg.0
plus setting it to NULL) works equally well with normal Fortran code;

Like I said, I think it is better :-)

one can probably design code where one or the other is slightly faster,
but at the end it should not matter.
And for OpenMP/OpenACC, the new variant avoids several problems.

Hence:
OK for the trunk – and GCC 10 (regression, rejects valid code)?

OK for both, and thanks for the patch!

Regards

        Thomas

Reply via email to