Fortran: a C interoperable function cannot have the CLASS attribute [PR95375]

gcc/fortran/ChangeLog:

	PR fortran/95375
	* decl.cc (verify_bind_c_sym): Extend interoperability check to
	CLASS variables.

gcc/testsuite/ChangeLog:

	PR fortran/95375
	* gfortran.dg/bind_c_procs_4.f90: New test.
This commit is contained in:
Harald Anlauf 2022-12-20 21:17:08 +01:00
parent a6504f13a0
commit aed5584ff6
2 changed files with 25 additions and 4 deletions

View File

@ -5998,10 +5998,14 @@ verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
}
else
{
if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
gfc_error ("Type declaration %qs at %L is not C "
"interoperable but it is BIND(C)",
tmp_sym->name, &(tmp_sym->declared_at));
if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED
|| tmp_sym->ts.type == BT_CLASS || ts->type == BT_CLASS)
{
gfc_error ("Type declaration %qs at %L is not C "
"interoperable but it is BIND(C)",
tmp_sym->name, &(tmp_sym->declared_at));
retval = false;
}
else if (warn_c_binding_type)
gfc_warning (OPT_Wc_binding_type, "Variable %qs at %L "
"may not be a C interoperable "

View File

@ -0,0 +1,17 @@
! { dg-do compile }
! PR fortran/95375 - ICE in add_use_op
! Contributed by G.Steinmetz
function f() result(n) bind(c) ! { dg-error "not C interoperable" }
class(*), allocatable :: n
end
program p
interface
function f() result(n) bind(c)
integer :: n
end
end interface
if ( f() /= 0 ) stop
end
! { dg-prune-output "Type mismatch" }