symbol.c (verify_bind_c_derived_type): Accept BIND(C) on an empty derived type.
authorSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 11 Nov 2010 23:34:05 +0000 (23:34 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 11 Nov 2010 23:34:05 +0000 (23:34 +0000)
2010-11-10  Steven G. Kargl <kargl@gcc.gnu.org>

* symbol.c (verify_bind_c_derived_type):  Accept BIND(C) on an empty
derived type.

2010-11-10  Steven G. Kargl <kargl@gcc.gnu.org>

* gfortran.dg/empty_derived_type.f90: New test.

From-SVN: r166633

gcc/fortran/ChangeLog
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/empty_derived_type.f90 [new file with mode: 0644]

index 3e04b60196ed427f1ec7ed4a4a8a8db52fbee4d7..41a5bef05125027fa9883b04462be244d19c9a55 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-11  Steven G. Kargl <kargl@gcc.gnu.org>
+
+       * symbol.c (verify_bind_c_derived_type):  Accept BIND(C) on an empty
+       derived type.
+
 2010-11-11  Jan Hubicka  <jh@suse.cz>
 
        * options.c (gfc_post_options): Remove flag_whopr.
index 9dd754904f409e7bdf106b947b8653fef5b7789d..05c62351383dc88db5e15842e6bba309f037ba4a 100644 (file)
@@ -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;
index 381b9c2375b29c72a09f6b3c14f7bfa5c75799f0..c05468890c625287547484d26f05bab5cbe2fe94 100644 (file)
@@ -1,3 +1,7 @@
+2010-11-11  Steven G. Kargl <kargl@gcc.gnu.org>
+
+       * gfortran.dg/empty_derived_type.f90: New test.
+
 2010-11-11  Tobias Burnus  <burnus@net-b.de>
 
        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 (file)
index 0000000..6bf616c
--- /dev/null
@@ -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