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.
This commit is contained in:
Harald Anlauf 2025-03-02 22:20:28 +01:00
parent 7135570043
commit f9f16b9f74
3 changed files with 32 additions and 3 deletions

View file

@ -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;

View file

@ -1,4 +1,5 @@
! { dg-do compile }
! { dg-options "" }
module stuff
implicit none
type, bind(C) :: junk ! { dg-warning "may be inaccessible by the C companion" }

View file

@ -0,0 +1,11 @@
! { dg-do compile }
! { dg-additional-options "-std=f2018" }
!
! PR fortran/101577
!
! Contributed by Tobias Burnus
type, bind(C) :: t ! { dg-error "has no components" }
! Empty!
end type t
end