re PR fortran/51056 ([OOP] Bogus "Unused module variable '__vtab_domain_Domain_contai...
authorTobias Burnus <burnus@net-b.de>
Fri, 20 Jan 2012 08:06:53 +0000 (09:06 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Fri, 20 Jan 2012 08:06:53 +0000 (09:06 +0100)
2012-01-20  Tobias Burnus  <burnus@net-b.de>
            Janus Weil  <janus@gcc.gnu.org>

        PR fortran/51056
        * module.c (load_needed, read_module): Don't mark __vtab etc.
        as use_only.

2012-01-20  Tobias Burnus  <burnus@net-b.de>
            Janus Weil  <janus@gcc.gnu.org>

        PR fortran/51056
        * gfortran.dg/use_21.f90: New.

Co-Authored-By: Janus Weil <janus@gcc.gnu.org>
From-SVN: r183326

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

index c3106a5..22828ef 100644 (file)
@@ -1,3 +1,10 @@
+2012-01-20  Tobias Burnus  <burnus@net-b.de>
+           Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/51056
+       * module.c (load_needed, read_module): Don't mark __vtab etc.
+       as use_only.
+
 2012-01-19  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/51904
index 0616a85..b2808d4 100644 (file)
@@ -4351,7 +4351,11 @@ load_needed (pointer_info *p)
 
   mio_symbol (sym);
   sym->attr.use_assoc = 1;
-  if (only_flag)
+
+  /* Mark as only or rename for later diagnosis for explicitly imported
+     but not used warnings; don't mark internal symbols such as __vtab,
+     __def_init etc.  */
+  if (only_flag && sym->name[0] != '_' && sym->name[1] != '_')
     sym->attr.use_only = 1;
   if (p->u.rsym.renamed)
     sym->attr.use_rename = 1;
@@ -4574,8 +4578,9 @@ read_module (void)
            p = name;
 
          /* Exception: Always import vtabs & vtypes.  */
-         if (p == NULL && (strncmp (name, "__vtab_", 5) == 0
-                           || strncmp (name, "__vtype_", 6) == 0))
+         if (p == NULL && name[0] == '_'
+             && (strncmp (name, "__vtab_", 5) == 0
+                 || strncmp (name, "__vtype_", 6) == 0))
            p = name;
 
          /* Skip symtree nodes not in an ONLY clause, unless there
@@ -4641,7 +4646,10 @@ read_module (void)
              if (strcmp (name, p) != 0)
                sym->attr.use_rename = 1;
 
-             sym->attr.use_only = only_flag;
+             if (name[0] != '_'
+                 || (strncmp (name, "__vtab_", 5) != 0
+                     && strncmp (name, "__vtype_", 6) != 0))
+               sym->attr.use_only = only_flag;
 
              /* Store the symtree pointing to this symbol.  */
              info->u.rsym.symtree = st;
index c1dd677..2d42abf 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-20  Tobias Burnus  <burnus@net-b.de>
+           Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/51056
+       * gfortran.dg/use_21.f90: New.
+
 2012-01-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/51106
diff --git a/gcc/testsuite/gfortran.dg/use_21.f90 b/gcc/testsuite/gfortran.dg/use_21.f90
new file mode 100644 (file)
index 0000000..eba412d
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do compile }
+! { dg-options "-Wall" }
+!
+! PR fortran/51056
+!
+! Contributed by Kacper Kowalik
+!
+module domain
+   implicit none
+   private
+   public :: domain_container, dom
+
+   type :: domain_container
+      integer :: D_x      !< set to 1 when x-direction exists, 0 otherwise
+    contains
+      procedure :: init => init_domain_container
+   end type domain_container
+
+   type(domain_container) :: dom
+
+   contains
+      subroutine init_domain_container(this)
+         implicit none
+         class(domain_container), intent(inout) :: this
+         this%D_x = 0
+      end subroutine init_domain_container
+end module domain
+
+program ala
+   use domain, only: dom
+   implicit none
+   call dom%init
+end program ala
+
+! { dg-final { cleanup-modules "domain" } }