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:
parent
7135570043
commit
f9f16b9f74
3 changed files with 32 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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" }
|
||||
|
|
11
gcc/testsuite/gfortran.dg/empty_derived_type_2.f90
Normal file
11
gcc/testsuite/gfortran.dg/empty_derived_type_2.f90
Normal 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
|
Loading…
Add table
Reference in a new issue