Hi Jerry,

I found 2 corner invalid cases which are silently accepted with
your patch when iso_c_binding is used indirectly:

  print *, c_associated(c_loc(val), C_NULL_FUNPTR)
  print *, c_associated(C_NULL_FUNPTR, c_loc(val))

These should get rejected, too.  Can you see how to catch these, too?

Thanks,
Harald

On 5/17/25 19:22, Jerry D wrote:
Hello all,

The attached patch revises the logic of the checks in gfc_check_c_associated to handle previous cases that ICE'ed as seen in the PR. There are multiple gotchas in these cases, particularly with the optional c_ptr_2 argument.

I factored the logic into two new helper functions. This helps to see what is happening and allows the c_ptr_1 checks to be performed separately in the event the c_ptr_2 checks succeed.

In  gfc_typename we did not handle the BT_VOID case which occurs in some of the error conditions.  I thought to possibly let it fall through to "UNKNOWN".  As it is with the patch I return "VOID".

I added a new test case.

I want to add Steve as Co-author as soon as I figure out how to do that with the git machinery.

Regression tested on x86_64.  OK for trunk and eventual backport to 15?

Regards,

Jerry

Author: Jerry DeLisle <jvdeli...@gcc.gnu.org>
Date:   Sat May 17 09:45:14 2025 -0700

     Fortran: Fix c_associated argument checks.

           PR fortran/120049

     gcc/fortran/ChangeLog:

           * check.cc (gfc_check_c_associated): Use new helper functions.
             Only call check_c_ptr_1 if optional c_ptr_2 tests succeed.
             (check_c_ptr_1):  Handle only c_ptr_1 checks.
             (check_c_ptr_2): Expand checks for c_ptr_2 and handles cases
             where there is no derived pointer in the gfc_expr and check
             the inmod_sym_id only if it exists.
             * misc.cc (gfc_typename): Handle the case for BT_VOID rather
             than throw an internal error.

     gcc/testsuite/ChangeLog:

             * gfortran.dg/pr120049_2.f90: New test.


Reply via email to