diff mbox

[Fortran] PR61234: -Wuse-no-only

Message ID 908103EDB4893A42920B21D3568BFD930CC51688@MBX23.d.ethz.ch
State New
Headers show

Commit Message

VandeVondele Joost May 30, 2014, 8:03 a.m. UTC
Hi,

the attached patch fixes PR61234 by introducing a warning for modules used without an only qualifier, triggered by a flag '-Wuse-no-only'. 

It is a two line addition to module.c, plus mechanical changes to initialize the flag and keep the tests up-to-date. I currently have no copyright assignment filed, so I hope it can pass as 'trivial' or it needs to wait till I get the paperwork sorted.

The patch has been bootstrapped and regtested on x86_64-unknown-linux-gnu. If OK, please apply to trunk.

gcc/fortran/ChangeLog:

2014-05-29 Joost VandeVondele  <Joost.VandeVondele@mat.ethz.ch>

        PR fortran/61234
        * lang.opt (Wuse-no-only): New flag.
        * gfortran.h (gfc_option_t): Add it.
        * invoke.texi: Document it.
        * module.c (gfc_use_module): Warn if needed.
        * options.c (gfc_init_options,set_Wall,gfc_handle_option): Init accordingly.

gcc/testsuite/ChangeLog:

2014-05-29 Joost VandeVondele  <Joost.VandeVondele@mat.ethz.ch>

        * gfortran.dg/c_by_val_5.f90: Add expected -Wall warning.
        * gfortran.dg/transfer_check_4.f90: idem.
        * gfortran.dg/iso_c_binding_compiler_3.f90: idem.
        * gfortran.dg/pr52370.f90: idem.
        * gfortran.dg/use_no_only_1.f90: New test.

Thanks in advance,

Joost

Comments

Jakub Jelinek May 30, 2014, 9:20 a.m. UTC | #1
On Fri, May 30, 2014 at 08:03:45AM +0000, VandeVondele  Joost wrote:
> +@item -Wuse-no-only
> +@opindex @code{Wuse-no-only}
> +@cindex warnings, use statements
> +@cindex intrinsic
> +Warn if a use statement has no only qualifier and thus implicitly imports
> +all public entities of the used module.
> +This option is implied by @option{-Wall}.

I think it is really weird if a coding style warning is included in -Wall.

	Jakub
VandeVondele Joost May 30, 2014, 9:32 a.m. UTC | #2
> I think it is really weird if a coding style warning is included in -Wall.

I have no strong opinion on this, I followed the -Wintrinsic-shadow example, and I'm happy to change things. 

Note however, that even the Fortran standard recommends the ONLY option for example for intrinsic modules, to guarantee that a program is portable to other processors and future versions of the standard, i.e. to avoid potential name conflicts (see Note 15.1 in F2003 standard).
diff mbox

Patch

gcc/fortran/ChangeLog:

2014-05-29 Joost VandeVondele  <Joost.VandeVondele@mat.ethz.ch>

        PR fortran/61234
        * lang.opt (Wuse-no-only): New flag.
        * gfortran.h (gfc_option_t): Add it.
        * invoke.texi: Document it.
        * module.c (gfc_use_module): Warn if needed.
        * options.c (gfc_init_options,set_Wall,gfc_handle_option): Init accordingly.

gcc/testsuite/ChangeLog:

2014-05-29 Joost VandeVondele  <Joost.VandeVondele@mat.ethz.ch>

	* gfortran.dg/c_by_val_5.f90: Add expected -Wall warning.
	* gfortran.dg/transfer_check_4.f90: idem.
	* gfortran.dg/iso_c_binding_compiler_3.f90: idem.
	* gfortran.dg/pr52370.f90: idem.
	* gfortran.dg/use_no_only_1.f90: New test.

Index: gcc/testsuite/gfortran.dg/c_by_val_5.f90
===================================================================
--- gcc/testsuite/gfortran.dg/c_by_val_5.f90	(revision 211022)
+++ gcc/testsuite/gfortran.dg/c_by_val_5.f90	(working copy)
@@ -59,7 +59,7 @@  END module x
 !end subroutine test
 
 program main
-  use x
+  use x ! { dg-warning "has no ONLY qualifier" }
   implicit none
 !  external test
   call Grid2BMP(10)
Index: gcc/testsuite/gfortran.dg/transfer_check_4.f90
===================================================================
--- gcc/testsuite/gfortran.dg/transfer_check_4.f90	(revision 211022)
+++ gcc/testsuite/gfortran.dg/transfer_check_4.f90	(working copy)
@@ -6,7 +6,7 @@ 
 
 subroutine transfers (test)
 
-  use, intrinsic :: iso_fortran_env
+  use, intrinsic :: iso_fortran_env ! { dg-warning "has no ONLY qualifier" }
   
   integer, intent(in) :: test
 
Index: gcc/testsuite/gfortran.dg/iso_c_binding_compiler_3.f90
===================================================================
--- gcc/testsuite/gfortran.dg/iso_c_binding_compiler_3.f90	(revision 211022)
+++ gcc/testsuite/gfortran.dg/iso_c_binding_compiler_3.f90	(working copy)
@@ -7,8 +7,8 @@ 
 !  "Type specified for intrinsic function" for this file
 !
 
-use iso_c_binding
-use iso_Fortran_env
+use iso_c_binding ! { dg-warning "has no ONLY qualifier" }
+use iso_Fortran_env ! { dg-warning "has no ONLY qualifier" }
 implicit none
 intrinsic sin
 real :: x = 3.4
@@ -17,9 +17,9 @@  end
 
 
 module test_mod
-    use iso_fortran_env
+    use iso_fortran_env ! { dg-warning "has no ONLY qualifier" }
 end module test_mod
 
 subroutine test
-use test_mod
+use test_mod ! { dg-warning "has no ONLY qualifier" }
 end subroutine test
Index: gcc/testsuite/gfortran.dg/use_no_only_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/use_no_only_1.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/use_no_only_1.f90	(revision 0)
@@ -0,0 +1,22 @@ 
+! PR fortran/61234 Warn for use-stmt without explicit only-list.
+! { dg-do compile }
+! { dg-options "-Wuse-no-only" }
+MODULE foo
+  INTEGER :: bar
+END MODULE
+
+MODULE testmod
+  USE foo ! { dg-warning "has no ONLY qualifier" }
+  IMPLICIT NONE
+CONTAINS
+  SUBROUTINE S1
+     USE foo ! { dg-warning "has no ONLY qualifier" }
+  END SUBROUTINE S1
+  SUBROUTINE S2
+     USE foo, ONLY: bar ! { dg-bogus "has no ONLY qualifier" }
+  END SUBROUTINE
+  SUBROUTINE S3
+     USE ISO_C_BINDING ! { dg-warning "has no ONLY qualifier" }
+  END SUBROUTINE S3
+END MODULE
+! { dg-final { cleanup-modules "foo testmod" } }
Index: gcc/testsuite/gfortran.dg/pr52370.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr52370.f90	(revision 211022)
+++ gcc/testsuite/gfortran.dg/pr52370.f90	(working copy)
@@ -15,7 +15,7 @@  contains
 end module pr52370
 
 program prg52370
-  use pr52370
+  use pr52370 ! { dg-warning "has no ONLY qualifier" }
   real :: a
   call foo(a)
 end program prg52370
Index: gcc/fortran/invoke.texi
===================================================================
--- gcc/fortran/invoke.texi	(revision 211022)
+++ gcc/fortran/invoke.texi	(working copy)
@@ -142,7 +142,7 @@  and warnings}.
 @gccoptlist{-Waliasing -Wall -Wampersand -Warray-bounds
 -Wc-binding-type -Wcharacter-truncation @gol
 -Wconversion -Wfunction-elimination -Wimplicit-interface @gol
--Wimplicit-procedure -Wintrinsic-shadow -Wintrinsics-std @gol
+-Wimplicit-procedure -Wintrinsic-shadow -Wuse-no-only -Wintrinsics-std @gol
 -Wline-truncation -Wno-align-commons -Wno-tabs -Wreal-q-constant @gol
 -Wsurprising -Wunderflow -Wunused-parameter -Wrealloc-lhs -Wrealloc-lhs-all @gol
 -Wtarget-lifetime -fmax-errors=@var{n} -fsyntax-only -pedantic -pedantic-errors
@@ -729,7 +729,7 @@  we recommend avoiding and that we believ
 This currently includes @option{-Waliasing}, @option{-Wampersand},
 @option{-Wconversion}, @option{-Wsurprising}, @option{-Wc-binding-type},
 @option{-Wintrinsics-std}, @option{-Wno-tabs}, @option{-Wintrinsic-shadow},
-@option{-Wline-truncation}, @option{-Wtarget-lifetime},
+@option{-Wuse-no-only}, @option{-Wline-truncation}, @option{-Wtarget-lifetime},
 @option{-Wreal-q-constant} and @option{-Wunused}.
 
 @item -Waliasing
@@ -896,6 +896,14 @@  intrinsic; in this case, an explicit int
 @code{INTRINSIC} declaration might be needed to get calls later resolved to
 the desired intrinsic/procedure.  This option is implied by @option{-Wall}.
 
+@item -Wuse-no-only
+@opindex @code{Wuse-no-only}
+@cindex warnings, use statements
+@cindex intrinsic
+Warn if a use statement has no only qualifier and thus implicitly imports
+all public entities of the used module.
+This option is implied by @option{-Wall}.
+
 @item -Wunused-dummy-argument
 @opindex @code{Wunused-dummy-argument}
 @cindex warnings, unused dummy argument
Index: gcc/fortran/gfortran.h
===================================================================
--- gcc/fortran/gfortran.h	(revision 211022)
+++ gcc/fortran/gfortran.h	(working copy)
@@ -2321,6 +2321,7 @@  typedef struct
   int warn_tabs;
   int warn_underflow;
   int warn_intrinsic_shadow;
+  int warn_use_no_only;
   int warn_intrinsics_std;
   int warn_character_truncation;
   int warn_array_temp;
Index: gcc/fortran/options.c
===================================================================
--- gcc/fortran/options.c	(revision 211022)
+++ gcc/fortran/options.c	(working copy)
@@ -105,6 +105,7 @@  gfc_init_options (unsigned int decoded_o
   gfc_option.warn_tabs = 1;
   gfc_option.warn_underflow = 1;
   gfc_option.warn_intrinsic_shadow = 0;
+  gfc_option.warn_use_no_only = 0;
   gfc_option.warn_intrinsics_std = 0;
   gfc_option.warn_align_commons = 1;
   gfc_option.warn_real_q_constant = 0;
@@ -455,6 +456,7 @@  set_Wall (int setting)
   gfc_option.warn_tabs = !setting;
   gfc_option.warn_underflow = setting;
   gfc_option.warn_intrinsic_shadow = setting;
+  gfc_option.warn_use_no_only = setting;
   gfc_option.warn_intrinsics_std = setting;
   gfc_option.warn_character_truncation = setting;
   gfc_option.warn_real_q_constant = setting;
@@ -730,6 +732,10 @@  gfc_handle_option (size_t scode, const c
       gfc_option.warn_intrinsic_shadow = value;
       break;
 
+    case OPT_Wuse_no_only:
+      gfc_option.warn_use_no_only = value;
+      break;
+
     case OPT_Walign_commons:
       gfc_option.warn_align_commons = value;
       break;
Index: gcc/fortran/lang.opt
===================================================================
--- gcc/fortran/lang.opt	(revision 211022)
+++ gcc/fortran/lang.opt	(working copy)
@@ -257,6 +257,10 @@  Wintrinsics-std
 Fortran Warning
 Warn on intrinsics not part of the selected standard
 
+Wuse-no-only
+Fortran Warning
+Warn about USE statements that have no only qualifier
+
 Wopenmp-simd
 Fortran
 ; Documented in C
Index: gcc/fortran/module.c
===================================================================
--- gcc/fortran/module.c	(revision 211022)
+++ gcc/fortran/module.c	(working copy)
@@ -6398,6 +6398,9 @@  gfc_use_module (gfc_use_list *module)
   gfc_rename_list = module->rename;
   only_flag = module->only_flag;
 
+  if (!only_flag && gfc_option.warn_use_no_only) 
+    gfc_warning_now ("USE statement at %C has no ONLY qualifier");
+
   filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION)
 			       + 1);
   strcpy (filename, module_name);