From f76b96c20da8e6675d44f976bbe54ea62f5e5e69 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Thu, 11 Nov 2010 23:34:05 +0000 Subject: symbol.c (verify_bind_c_derived_type): Accept BIND(C) on an empty derived type. 2010-11-10 Steven G. Kargl * symbol.c (verify_bind_c_derived_type): Accept BIND(C) on an empty derived type. 2010-11-10 Steven G. Kargl * gfortran.dg/empty_derived_type.f90: New test. From-SVN: r166633 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/symbol.c | 19 +++++++++++++++---- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gfortran.dg/empty_derived_type.f90 | 7 +++++++ 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/empty_derived_type.f90 (limited to 'gcc') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3e04b60..41a5bef 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2010-11-11 Steven G. Kargl + + * symbol.c (verify_bind_c_derived_type): Accept BIND(C) on an empty + derived type. + 2010-11-11 Jan Hubicka * options.c (gfc_post_options): Remove flag_whopr. diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 9dd75490..05c6235 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -3592,14 +3592,25 @@ verify_bind_c_derived_type (gfc_symbol *derived_sym) curr_comp = derived_sym->components; - /* TODO: is this really an error? */ + /* Fortran 2003 allows an empty derived type. C99 appears to disallow an + empty struct. Section 15.2 in Fortran 2003 states: "The following + subclauses define the conditions under which a Fortran entity is + interoperable. If a Fortran entity is interoperable, an equivalent + 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." + */ if (curr_comp == NULL) { - gfc_error ("Derived type '%s' at %L is empty", - derived_sym->name, &(derived_sym->declared_at)); - return FAILURE; + gfc_warning ("Derived type '%s' 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 SUCCESS; } + /* Initialize the derived type as being C interoperable. If we find an error in the components, this will be set false. */ derived_sym->ts.is_c_interop = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 381b9c2..c054688 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-11-11 Steven G. Kargl + + * gfortran.dg/empty_derived_type.f90: New test. + 2010-11-11 Tobias Burnus PR fortran/46413 diff --git a/gcc/testsuite/gfortran.dg/empty_derived_type.f90 b/gcc/testsuite/gfortran.dg/empty_derived_type.f90 new file mode 100644 index 0000000..6bf616c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/empty_derived_type.f90 @@ -0,0 +1,7 @@ +! { dg-do compile } +module stuff + implicit none + type, bind(C) :: junk ! { dg-warning "may be inaccessible by the C companion" } + ! Empty! + end type junk +end module stuff -- cgit v1.1