diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2021-09-23 08:03:52 -0700 |
---|---|---|
committer | Sandra Loosemore <sandra@codesourcery.com> | 2021-09-23 16:42:35 -0700 |
commit | 2646d0e06b170569be1da28fce1d6e2f03a15f60 (patch) | |
tree | 5b1a43523e1b310bd5ec3df6a5dc252d5e168689 /gcc/fortran/decl.c | |
parent | e5c0492b7f42ccc093f9f4385bbbc4b39dc5ffcb (diff) | |
download | gcc-2646d0e06b170569be1da28fce1d6e2f03a15f60.zip gcc-2646d0e06b170569be1da28fce1d6e2f03a15f60.tar.gz gcc-2646d0e06b170569be1da28fce1d6e2f03a15f60.tar.bz2 |
Fortran: Diagnose default-initialized pointer/allocatable dummies
TS29113 changed what was then C516 in the 2010 Fortran standard (now
C1557 in F2018) from disallowing all of pointer, allocatable, and
optional attributes on dummy arguments to BIND(C) functions, to
disallowing only pointer/allocatable with default-initialization.
gfortran was previously failing to diagnose violations of this
constraint.
2021-09-23 Sandra Loosemore <sandra@codesourcery.com>
PR fortran/101320
gcc/fortran/
* decl.c (gfc_verify_c_interop_param): Handle F2018 C1557,
aka TS29113 C516.
gcc/testsuite/
* gfortran.dg/c-interop/c516.f90: Remove xfails. Add more
tests.
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index f2e8896..b3c65b7 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1557,6 +1557,20 @@ gfc_verify_c_interop_param (gfc_symbol *sym) "CONTIGUOUS attribute as procedure %qs is BIND(C)", sym->name, &sym->declared_at, sym->ns->proc_name->name); + /* Per F2018, C1557, pointer/allocatable dummies to a bind(c) + procedure that are default-initialized are not permitted. */ + if ((sym->attr.pointer || sym->attr.allocatable) + && sym->ts.type == BT_DERIVED + && gfc_has_default_initializer (sym->ts.u.derived)) + { + gfc_error ("Default-initialized %s dummy argument %qs " + "at %L is not permitted in BIND(C) procedure %qs", + (sym->attr.pointer ? "pointer" : "allocatable"), + sym->name, &sym->declared_at, + sym->ns->proc_name->name); + retval = false; + } + /* Character strings are only C interoperable if they have a length of 1. However, as an argument they are also iteroperable when passed as descriptor (which requires len=: or len=*). */ |