aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2025-03-02 22:20:28 +0100
committerHarald Anlauf <anlauf@gmx.de>2025-03-03 20:18:04 +0100
commitf9f16b9f74b767ca799a82f25be66a5fed25756d (patch)
tree3d1d967666f76188417cc846a216c164f8f8fe86 /gcc/fortran
parent71355700432b15590123dc13833304c75ad8a0b6 (diff)
downloadgcc-f9f16b9f74b767ca799a82f25be66a5fed25756d.zip
gcc-f9f16b9f74b767ca799a82f25be66a5fed25756d.tar.gz
gcc-f9f16b9f74b767ca799a82f25be66a5fed25756d.tar.bz2
Fortran: reject empty derived type with bind(C) attribute [PR101577]
PR fortran/101577 gcc/fortran/ChangeLog: * symbol.cc (verify_bind_c_derived_type): Generate error message for derived type with no components in standard conformance mode, indicating that this is a GNU extension. gcc/testsuite/ChangeLog: * gfortran.dg/empty_derived_type.f90: Adjust dg-options. * gfortran.dg/empty_derived_type_2.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/symbol.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index c689481..81aa81d 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -4624,12 +4624,29 @@ verify_bind_c_derived_type (gfc_symbol *derived_sym)
entity may be defined by means of C and the Fortran entity is said
to be interoperable with the C entity. There does not have to be such
an interoperating C entity."
+
+ However, later discussion on the J3 mailing list
+ (https://mailman.j3-fortran.org/pipermail/j3/2021-July/013190.html)
+ found this to be a defect, and Fortran 2018 added in section 18.3.4
+ the following constraint:
+ "C1805: A derived type with the BIND attribute shall have at least one
+ component."
+
+ We thus allow empty derived types only as GNU extension while giving a
+ warning by default, or reject empty types in standard conformance mode.
*/
if (curr_comp == NULL)
{
- gfc_warning (0, "Derived type %qs with BIND(C) attribute at %L is empty, "
- "and may be inaccessible by the C companion processor",
- derived_sym->name, &(derived_sym->declared_at));
+ if (!gfc_notify_std (GFC_STD_GNU, "Derived type %qs with BIND(C) "
+ "attribute at %L has no components",
+ derived_sym->name, &(derived_sym->declared_at)))
+ return false;
+ else if (!pedantic)
+ /* Generally emit warning, but not twice if -pedantic is given. */
+ gfc_warning (0, "Derived type %qs with BIND(C) attribute at %L "
+ "is empty, and may be inaccessible by the C "
+ "companion processor",
+ derived_sym->name, &(derived_sym->declared_at));
derived_sym->ts.is_c_interop = 1;
derived_sym->attr.is_bind_c = 1;
return true;