https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84924
Bug ID: 84924
Summary: Erroneous error in C_F_POINTER
Product: gcc
Version: 7.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: johnsonsr at ornl dot gov
Target Milestone: ---
Created attachment 43691
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43691&action=edit
Module exemplifying failure
The gfortran compiler mistakenly prohibits calls to `c_f_pointer` where `fptr`
is a noninteroperable *scalar* derived type. The standard only prohibits this
for *arrays* of the derived type (and this restriction is lifted in TS29113).
The compiler correctly allows `c_loc(fptr)` on the same pointer object; and
according to the standard the ability to do `c_loc` and `c_f_pointer` should be
symmetric.
I have attached a minimal test case:
```
$ gfortran-mp-7 -save-temps -std=f2003 -c -Wall -Wextra ftest.f90
ftest.f90:27:38:
call c_f_pointer(cptr=p, fptr=handle)
1
Error: TS 29113/TS 18508: Noninteroperable array FPTR at (1) to C_F_POINTER:
Expression is a noninteroperable derived type
```
I think the code in `gfc_check_c_f_pointer` in `gcc/fortran/check.c` simply
needs to be replaced by similar code in `gfc_check_c_loc`:
```
if (!is_c_interoperable (fptr, &msg, false, true))
```
should become
```
if (fptr->rank > 0 && !is_c_interoperable (fptr, &msg, false, true))
```