re PR fortran/60355 ([F08] constraint C519 for BIND attribute not enforced)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 11 Aug 2017 17:45:36 +0000 (17:45 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 11 Aug 2017 17:45:36 +0000 (17:45 +0000)
2017-08-11  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/60355
* resolve.c (resolve_symbol): Adjust (and reformat)
comment.  Perform check if a BIND(C) is declared
at module level regardless of whether it is typed
implicitly or not.

2017-08-11  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/60355
* gfortran.dg (bind_c_usage_30): New test.

From-SVN: r251054

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

index 50f2f0449085d6efe5d27228ffb6b6fe41a3af7b..5c4ad74b785f99d0fdded976fc27c85a103d07a0 100644 (file)
@@ -1,3 +1,11 @@
+2017-08-11  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/60355
+       * resolve.c (resolve_symbol): Adjust (and reformat)
+       comment.  Perform check if a BIND(C) is declared
+       at module level regardless of whether it is typed
+       implicitly or not.
+
 2017-08-10  Fritz Reese <fritzoreese@gmail.com>
 
        * options.c (set_dec_flags): Only set legacy standards when value
index 5caf76761ee66e61749e75c9b72721caa0336a3b..30928a2ac2dbe0ef6a88a5210906cf806a2e9d5a 100644 (file)
@@ -14397,17 +14397,18 @@ resolve_symbol (gfc_symbol *sym)
        }
     }
 
-  /* If the symbol is marked as bind(c), verify it's type and kind.  Do not
-     do this for something that was implicitly typed because that is handled
-     in gfc_set_default_type.  Handle dummy arguments and procedure
-     definitions separately.  Also, anything that is use associated is not
-     handled here but instead is handled in the module it is declared in.
-     Finally, derived type definitions are allowed to be BIND(C) since that
-     only implies that they're interoperable, and they are checked fully for
-     interoperability when a variable is declared of that type.  */
-  if (sym->attr.is_bind_c && sym->attr.implicit_type == 0 &&
-      sym->attr.use_assoc == 0 && sym->attr.dummy == 0 &&
-      sym->attr.flavor != FL_PROCEDURE && sym->attr.flavor != FL_DERIVED)
+  /* If the symbol is marked as bind(c), that it is declared at module level
+     scope and verify its type and kind.  Do not do the latter for symbols
+     that are implicitly typed because that is handled in
+     gfc_set_default_type.  Handle dummy arguments and procedure definitions
+     separately.  Also, anything that is use associated is not handled here
+     but instead is handled in the module it is declared in.  Finally, derived
+     type definitions are allowed to be BIND(C) since that only implies that
+     they're interoperable, and they are checked fully for interoperability
+     when a variable is declared of that type.  */
+  if (sym->attr.is_bind_c && sym->attr.use_assoc == 0
+      && sym->attr.dummy == 0 && sym->attr.flavor != FL_PROCEDURE
+      && sym->attr.flavor != FL_DERIVED)
     {
       bool t = true;
 
@@ -14421,11 +14422,11 @@ resolve_symbol (gfc_symbol *sym)
                     "module level scope", sym->name, &(sym->declared_at));
          t = false;
        }
-      else if (sym->common_head != NULL)
+      else if (sym->common_head != NULL && sym->attr.implicit_type == 0)
         {
           t = verify_com_block_vars_c_interop (sym->common_head);
         }
-      else
+      else if (sym->attr.implicit_type == 0)
        {
          /* If type() declaration, we need to verify that the components
             of the given type are all C interoperable, etc.  */
index 80ee13eaaa0f20acdc8c488b13e85944b9ad69f9..71b7c6269802e7c66e43df20409a049a4f1c73cd 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-11  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/60355
+       * gfortran.dg (bind_c_usage_30): New test.
+
 2017-08-11  Martin Liska  <mliska@suse.cz>
 
        PR tree-opt/79987
diff --git a/gcc/testsuite/gfortran.dg/bind_c_usage_30.f90 b/gcc/testsuite/gfortran.dg/bind_c_usage_30.f90
new file mode 100644 (file)
index 0000000..932d38e
--- /dev/null
@@ -0,0 +1,6 @@
+! { dg-do compile }
+! PR 60355 - there was no error message for implicitly typed variables
+! Test case contributed by Vladimir Fuka
+program main
+  bind(c) test_BIND ! { dg-error "cannot be BIND" }
+END