diff mbox

[Fortran] -Wtabs cleanup

Message ID 5471A873.40607@net-b.de
State New
Headers show

Commit Message

Tobias Burnus Nov. 23, 2014, 9:27 a.m. UTC
This patch moves -Wtabs closer to the common diagnostics - and changed 
the odd reversed logic of flags = 0 meaning off.

This brings nice common diagnostic features to fixed-form source code 
for the initial indentation [tab = 6 spaces] (which doesn't show a 
location), but not to free-form source code or in-line tabs (also in 
fixed-form) as that shows a location %C but gfc_current_location doesn't 
contain a valid localtion for the common diagnostics.

For the fixed-form initial-tab diagnostic of -Wtabs, the colored output 
is not new, but it now also shows the "[-Wtabs]" or "[-Werror=tabs]" and 
handles the latter.

Note: The Wpedantic (with alias -pedantic and --pedantic) had to be 
added as otherwise the LangEnabledBy for Wall (!) didn't work; as known, 
-(W)pedantic itself is not a new option.

Note 2: As -pedantic enables -Wtabs, -pedantic-errors now also enabled 
-Werror=tabs. The testsuite seems to be run with -pedantic-errors, 
hence, I had to change a test case. Alternatively, one could either 
explicitly ("dg-options") or in the general test setup change 
"-pedantic-errors" to "-pedantic".

Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias

Comments

FX Coudert Nov. 23, 2014, 4:08 p.m. UTC | #1
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?

OK. One question: I don’t understand why you need two separate Wtabs lines in lang.opt.

FX
Tobias Burnus Nov. 23, 2014, 5:17 p.m. UTC | #2
FX wrote:
> OK. One question: I don’t understand why you need two separate Wtabs 
> lines in lang.opt.

Thanks for the review!

Because EnabledByLanguage(Fortran,Wall || Wpedantic) isn't supported – 
using two separate Wtabs is the work around.

Cf. https://gcc.gnu.org/ml/gcc-patches/2014-11/msg02895.html

Tobias
FX Coudert Nov. 23, 2014, 5:41 p.m. UTC | #3
> Because EnabledByLanguage(Fortran,Wall || Wpedantic) isn't supported – using two separate Wtabs is the work around.
> Cf. https://gcc.gnu.org/ml/gcc-patches/2014-11/msg02895.html

You’re the best :)

FX
Manuel López-Ibáñez Nov. 23, 2014, 6:38 p.m. UTC | #4
On 23 November 2014 at 10:27, Tobias Burnus <burnus@net-b.de> wrote:
> This patch moves -Wtabs closer to the common diagnostics - and changed the
> odd reversed logic of flags = 0 meaning off.

You may wish to update the documentation to reflect this change in
behavior (invoke.texi, lang.opt and perhaps changes.html).

Cheers,

Manuel.
diff mbox

Patch

2014-11-23  Tobias Burnus  <burnus@net-b.de>
	    Manuel López-Ibáñez  <manu@gcc.gnu.org>

gcc/fortran/
	* gfortran.h (gfc_option_t): Remove warn_tabs.
	* lang.opt (Wpedantic): Add.
	(Wtabs): Use Var and LangEnabledBy.
	* options.c (gfc_init_options, gfc_post_options,
	set_Wall): Remove -Wtabs handling.
	(gfc_handle_option): Update -std=, remove OPT_Wtabs.
	* scanner.c (gfc_gobble_whitespace): Update for
	flag-variable renaming.
	(load_line): Ditto. Pass warn flag to diagnostic.

gcc/testsuite/
	* gfortran.dg/tab_continuation.f: Update dg-*.

diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index b0f15b4..1ee7dd4 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -2452,7 +2452,6 @@  typedef struct
   int warn_implicit_procedure;
   int warn_line_truncation;
   int warn_surprising;
-  int warn_tabs;
   int warn_underflow;
   int warn_intrinsic_shadow;
   int warn_intrinsics_std;
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index d6fe603..5da0453 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -269,6 +269,10 @@  Wopenmp-simd
 Fortran
 ; Documented in C
 
+Wpedantic
+Fortran
+; Documented in common.opt
+
 Wreal-q-constant
 Fortran Warning
 Warn about real-literal-constants with 'q' exponent-letter
@@ -294,9 +298,13 @@  Fortran Warning
 Warn about \"suspicious\" constructs
 
 Wtabs
-Fortran Warning
+Fortran Warning Var(warn_tabs) LangEnabledBy(Fortran,Wall)
 Permit nonconforming uses of the tab character
 
+Wtabs
+LangEnabledBy(Fortran,Wpedantic)
+;
+
 Wunderflow
 Fortran Warning
 Warn about underflow of numerical constant expressions
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index bbbd6ab..dee1af4 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -104,7 +104,6 @@  gfc_init_options (unsigned int decoded_options_count,
   gfc_option.warn_implicit_interface = 0;
   gfc_option.warn_line_truncation = 0;
   gfc_option.warn_surprising = 0;
-  gfc_option.warn_tabs = 1;
   gfc_option.warn_underflow = 1;
   gfc_option.warn_intrinsic_shadow = 0;
   gfc_option.warn_intrinsics_std = 0;
@@ -430,10 +429,7 @@  gfc_post_options (const char **pfilename)
     gfc_option.flag_max_stack_var_size = 0;
   
   if (pedantic)
-    { 
-      gfc_option.warn_ampersand = 1;
-      gfc_option.warn_tabs = 0;
-    }
+    gfc_option.warn_ampersand = 1;
 
   /* Optimization implies front end optimization, unless the user
      specified it directly.  */
@@ -461,7 +457,6 @@  set_Wall (int setting)
   gfc_option.gfc_warn_conversion = setting;
   gfc_option.warn_line_truncation = setting;
   gfc_option.warn_surprising = setting;
-  gfc_option.warn_tabs = !setting;
   gfc_option.warn_underflow = setting;
   gfc_option.warn_intrinsic_shadow = setting;
   gfc_option.warn_intrinsics_std = setting;
@@ -720,10 +715,6 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.warn_surprising = value;
       break;
 
-    case OPT_Wtabs:
-      gfc_option.warn_tabs = value;
-      break;
-
     case OPT_Wtarget_lifetime:
       gfc_option.warn_target_lifetime = value;
       break;
@@ -1038,7 +1029,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.max_continue_free = 39;
       gfc_option.max_identifier_length = 31;
       gfc_option.warn_ampersand = 1;
-      gfc_option.warn_tabs = 0;
+      warn_tabs = 1;
       break;
 
     case OPT_std_f2003:
@@ -1047,7 +1038,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.warn_std = GFC_STD_F95_OBS;
       gfc_option.max_identifier_length = 63;
       gfc_option.warn_ampersand = 1;
-      gfc_option.warn_tabs = 0;
+      warn_tabs = 1;
       break;
 
     case OPT_std_f2008:
@@ -1056,7 +1047,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
       gfc_option.warn_ampersand = 1;
-      gfc_option.warn_tabs = 0;
+      warn_tabs = 1;
       break;
 
     case OPT_std_f2008ts:
@@ -1066,7 +1057,7 @@  gfc_handle_option (size_t scode, const char *arg, int value,
       gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS;
       gfc_option.max_identifier_length = 63;
       gfc_option.warn_ampersand = 1;
-      gfc_option.warn_tabs = 0;
+      warn_tabs = 1;
       break;
 
     case OPT_std_gnu:
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index 2c0d4c3..e0b9a3b 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -1382,7 +1382,7 @@  gfc_gobble_whitespace (void)
       /* Issue a warning for nonconforming tabs.  We keep track of the line
 	 number because the Fortran matchers will often back up and the same
 	 line will be scanned multiple times.  */
-      if (!gfc_option.warn_tabs && c == '\t')
+      if (warn_tabs && c == '\t')
 	{
 	  int cur_linenum = LOCATION_LINE (gfc_current_locus.lb->location);
 	  if (cur_linenum != linenum)
@@ -1534,12 +1534,12 @@  load_line (FILE *input, gfc_char_t **pbuf, int *pbuflen, const int *first_char)
 	{
 	  found_tab = true;
 
-	  if (!gfc_option.warn_tabs && seen_comment == 0
-	      && current_line != linenum)
+	  if (warn_tabs && seen_comment == 0 && current_line != linenum)
 	    {
 	      linenum = current_line;
-	      gfc_warning_now_2 ("Nonconforming tab character in column %d "
-				   "of line %d", i+1, linenum);
+	      gfc_warning_now_2 (OPT_Wtabs,
+				 "Nonconforming tab character in column %d "
+				 "of line %d", i+1, linenum);
 	    }
 
 	  while (i < 6)
diff --git a/gcc/testsuite/gfortran.dg/tab_continuation.f b/gcc/testsuite/gfortran.dg/tab_continuation.f
index 65cb7b4..85d2307 100644
--- a/gcc/testsuite/gfortran.dg/tab_continuation.f
+++ b/gcc/testsuite/gfortran.dg/tab_continuation.f
@@ -5,11 +5,16 @@ 
 ! Allow <tab>1 to <tab>9 as continuation marker, which is a very common
 ! vendor extension.
 !
+! Note: The test suite is run with -pedantic-errors, which both enables
+! the tab warning (-pedantic implies -Wtabs) and turns it into errors
+! (-pedantic-errors hence implies -Werror=tabs).
+!
 	PARAMETER (LUMIN=11,LUMAX=20,MAPMAX=256,NPLANEMAX=999)
 	INTEGER NAXIS(0:MAPMAX,LUMIN:LUMAX),NAXIS1(0:MAPMAX,LUMIN:LUMAX),
 	1NAXIS2(0:MAPMAX,LUMIN:LUMAX),NAXIS3(0:MAPMAX,LUMIN:LUMAX)
 	end
-! { dg-warning "Nonconforming tab character in column 1 of line 8" "Nonconforming tab" { target *-*-* } 0 }
-! { dg-warning "Nonconforming tab character in column 1 of line 9" "Nonconforming tab" { target *-*-* } 0 }
-! { dg-warning "Nonconforming tab character in column 1 of line 10" "Nonconforming tab" { target *-*-* } 0 }
-! { dg-warning "Nonconforming tab character in column 1 of line 11" "Nonconforming tab" { target *-*-* } 0 }
+! { dg-error "Nonconforming tab character in column 1 of line 12" "Nonconforming tab" { target *-*-* } 0 }
+! { dg-error "Nonconforming tab character in column 1 of line 13" "Nonconforming tab" { target *-*-* } 0 }
+! { dg-error "Nonconforming tab character in column 1 of line 14" "Nonconforming tab" { target *-*-* } 0 }
+! { dg-error "Nonconforming tab character in column 1 of line 15" "Nonconforming tab" { target *-*-* } 0 }
+! { dg-excess-errors "some warnings being treated as errors" }