This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Fortran] RFC: Enabling -fwhole-file by default


I would like to enable -fwhole-file by default. As written before, the
advantages are

- Fixes some wrong-code issues (e.g. PR 44945)
- Improves diagnostic
- Improves (non-LTO) optimizations
- More consistent codepath: The same for default, LTO and -fwhole-program


I think -fwhole-file is now stable enough to be enabled by default; one
can still use -fno-whole-file to disable it. (Though, I like to remove
that "no" option in the next release, i.e. 4.7.)

Before one can enable -fwhole-file, one should apply the following two
patches:
http://gcc.gnu.org/ml/fortran/2010-07/msg00311.html
http://gcc.gnu.org/ml/fortran/2010-07/msg00320.html

In addition, some changes to the test suite were necessary: Some changed
messages due to the different code path, a bunch of warnings, some code
fixes - see attached patch.

With the two patches mentioned above and the attached patch, I only see
one test-suite failure:
  gfortran.dg/common_resize_1.f
where a warning about different COMMON sizes disappears with
-fwhole-file (cf. PR 45045 and related PR 45044). I would suggest to
XFAIL that check if we cannot fix it soon.

The change to the compare_parameter is for gfortran.dg/hollerith.f90;
otherwise, one gets the warning: "Type mismatch in argument 'h' at (1);
passed HOLLERITH to INTEGER(8)". I think this warning does not make much
sense for Hollerith (enabled by default; error with -pedantic)  - and
with -pedantic one already gets warnings - e.g. for the line in question
a "Hollerith constant" warning.

Build and regtested on x86-64-linux - with common_resize_1.f as only
failure.
OK for the trunk?

Jakub might want to have a look at the libgomp/testsuite/ change.

Tobias

PS: If it is OK, I will write a changelog.

 gcc/fortran/interface.c                                        |    1
 gcc/fortran/options.c                                          |    2
 gcc/testsuite/gfortran.dg/bounds_check_strlen_1.f90            |    2
 gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90             |    2
 gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90 |    5 +
 gcc/testsuite/gfortran.dg/entry_17.f90                         |    4
 gcc/testsuite/gfortran.dg/func_decl_4.f90                      |   13 ++-
 gcc/testsuite/gfortran.dg/func_decl_5.f90                      |   15 +++
 gcc/testsuite/gfortran.dg/g77/19990218-0.f                     |    2
 gcc/testsuite/gfortran.dg/g77/19990218-1.f                     |    2
 gcc/testsuite/gfortran.dg/g77/970625-2.f                       |    2
 gcc/testsuite/gfortran.dg/generic_actual_arg.f90               |    2
 gcc/testsuite/gfortran.dg/global_references_1.f90              |    6 -
 gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90         |   20 ++--
 gcc/testsuite/gfortran.dg/intrinsic_std_1.f90                  |   16 +--
 gcc/testsuite/gfortran.dg/intrinsic_std_6.f90                  |   41
++++++++++
 gcc/testsuite/gfortran.dg/loc_1.f90                            |    3
 gcc/testsuite/gfortran.dg/pr20865.f90                          |    2
 gcc/testsuite/gfortran.dg/pr37243.f                            |    6 -
 gcc/testsuite/gfortran.dg/sizeof.f90                           |    4
 gcc/testsuite/gfortran.dg/use_only_1.f90                       |    1
 gcc/testsuite/gfortran.dg/used_before_typed_4.f90              |    2
 libgomp/testsuite/libgomp.fortran/appendix-a/a.28.5.f90        |    5 +
 23 files changed, 115 insertions(+), 43 deletions(-)
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c	(revision 162456)
+++ gcc/fortran/interface.c	(working copy)
@@ -1470,6 +1470,7 @@ compare_parameter (gfc_symbol *formal, g
     }
 
   if ((actual->expr_type != EXPR_NULL || actual->ts.type != BT_UNKNOWN)
+      && actual->ts.type != BT_HOLLERITH
       && !gfc_compare_types (&formal->ts, &actual->ts))
     {
       if (where)
Index: gcc/fortran/options.c
===================================================================
--- gcc/fortran/options.c	(revision 162456)
+++ gcc/fortran/options.c	(working copy)
@@ -96,7 +96,7 @@ gfc_init_options (unsigned int argc, con
   gfc_option.flag_default_real = 0;
   gfc_option.flag_dollar_ok = 0;
   gfc_option.flag_underscoring = 1;
-  gfc_option.flag_whole_file = 0;
+  gfc_option.flag_whole_file = 1;
   gfc_option.flag_f2c = 0;
   gfc_option.flag_second_underscore = -1;
   gfc_option.flag_implicit_none = 0;
Index: gcc/testsuite/gfortran.dg/func_decl_4.f90
===================================================================
--- gcc/testsuite/gfortran.dg/func_decl_4.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/func_decl_4.f90	(working copy)
@@ -3,13 +3,18 @@
 !
 ! Functions shall not have an initializer.
 !
+! Due to -fwhole-file, the function declaration
+! warnings come before the init warnings; thus
+! the warning for the WRONG lines have been moved to
+! func_decl_5.f90
+!
 
-function f1()                      ! { dg-error "cannot have an initializer" }
-  integer :: f1 = 42
+function f1()
+  integer :: f1 = 42 ! WRONG, see  func_decl_5.f90
 end function
 
-function f2() RESULT (r)           ! { dg-error "cannot have an initializer" }
-  integer :: r = 42
+function f2() RESULT (r)
+  integer :: r = 42 ! WRONG, see func_decl_5.f90
 end function
 
 function f3() RESULT (f3)          ! { dg-error "must be different than function name" }
Index: gcc/testsuite/gfortran.dg/intrinsic_std_6.f90
===================================================================
--- gcc/testsuite/gfortran.dg/intrinsic_std_6.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/intrinsic_std_6.f90	(revision 0)
@@ -0,0 +1,41 @@
+! { dg-do compile }
+! { dg-options "-std=f95 -Wintrinsics-std -fdump-tree-original" }
+
+!
+! See intrinsic_std_1.f90 for more compile-time checks
+!
+
+! PR fortran/33141
+! Check for the expected behaviour when an intrinsic function/subroutine is
+! called that is not available in the defined standard or that is a GNU
+! extension:
+! There should be a warning emitted on the call, and the reference should be
+! treated like an external call.
+! For declaring a non-standard intrinsic INTRINSIC, a hard error should be
+! generated, of course.
+
+SUBROUTINE no_implicit
+  IMPLICIT NONE
+  REAL :: asinh ! { dg-warning "Fortran 2008" }
+
+  ! abort is a GNU extension
+  CALL abort () ! { dg-warning "extension" }
+
+  ! ASINH is an intrinsic of F2008
+  ! The warning should be issued in the declaration above where it is declared
+  ! EXTERNAL.
+  WRITE (*,*) ASINH (1.) ! { dg-warning "Fortran 2008" }
+END SUBROUTINE no_implicit
+
+SUBROUTINE implicit_type
+  ! acosh has implicit type
+
+  WRITE (*,*) ACOSH (1.) ! { dg-warning "Fortran 2008" }
+  WRITE (*,*) ACOSH (1.) ! { dg-bogus "Fortran 2008" }
+END SUBROUTINE implicit_type
+
+! Scan that really external functions are called.
+! { dg-final { scan-tree-dump " abort " "original" } }
+! { dg-final { scan-tree-dump " asinh " "original" } }
+! { dg-final { scan-tree-dump " acosh " "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
Index: gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90	(working copy)
@@ -22,7 +22,7 @@ end subroutine gfcbug34
 ! This is PR25669
 subroutine foo (a)
   real a(*)
-  call bar (a, LBOUND(a),2)
+  call bar (a, LBOUND(a),2) ! { dg-warning "Rank mismatch in argument" }
 end subroutine foo
 subroutine bar (b, i, j)
   real b(i:j)
Index: gcc/testsuite/gfortran.dg/global_references_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/global_references_1.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/global_references_1.f90	(working copy)
@@ -32,11 +32,11 @@ function h(x)       ! { dg-error "is alr
 end function h
 
 SUBROUTINE TT()
-  CHARACTER(LEN=10), EXTERNAL :: j
+  CHARACTER(LEN=10), EXTERNAL :: j ! { dg-warning "Return type mismatch" }
   CHARACTER(LEN=10)          :: T
 ! PR20881=========================================================== 
 ! Error only appears once but testsuite associates with both lines.
-  T = j () ! { dg-error "is already being used as a FUNCTION" }
+  T = j (1.0) ! { dg-error "is already being used as a SUBROUTINE" }
   print *, T
 END SUBROUTINE TT
 
@@ -78,7 +78,7 @@ end
 ! Lahey - 2636-S: "SOURCE.F90", line 81:
 ! Subroutine 'j' is previously referenced as a function in 'line 39'.
 
-SUBROUTINE j (x)    ! { dg-error "is already being used as a FUNCTION" }
+SUBROUTINE j (x)    ! { dg-error "is already being used as a SUBROUTINE" }
   integer a(10)
   common /bar/ a    ! Global entity foo
   real x
Index: gcc/testsuite/gfortran.dg/generic_actual_arg.f90
===================================================================
--- gcc/testsuite/gfortran.dg/generic_actual_arg.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/generic_actual_arg.f90	(working copy)
@@ -37,7 +37,7 @@ USE TEST
 USE TEST2
 CALL F(CALCULATION)  ! { dg-error "GENERIC procedure" } 
 
-CALL F(CALCULATION2) ! OK because there is a same name specific 
+CALL F(CALCULATION2) ! OK because there is a same name specific, but: ! { dg-warning "More actual than formal arguments" }
 END
 
 SUBROUTINE F()
Index: gcc/testsuite/gfortran.dg/entry_17.f90
===================================================================
--- gcc/testsuite/gfortran.dg/entry_17.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/entry_17.f90	(working copy)
@@ -24,7 +24,7 @@ function test3() ! { dg-warning "Obsoles
   return
 entry bar3()
   bar3 = ""
-end function test3 ! { dg-warning "Obsolescent feature" }
+end function test3
 
 function test4(n) ! { dg-error "returning variables of different string lengths" }
   integer  :: n
@@ -52,4 +52,4 @@ function test6() ! { dg-warning "Obsoles
   return
 entry bar6()
   bar6 = ""
-end function test6 ! { dg-warning "Obsolescent feature" }
+end function test6
Index: gcc/testsuite/gfortran.dg/used_before_typed_4.f90
===================================================================
--- gcc/testsuite/gfortran.dg/used_before_typed_4.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/used_before_typed_4.f90	(working copy)
@@ -22,5 +22,5 @@ END SUBROUTINE test
 PROGRAM main
   IMPLICIT NONE
   INTEGER :: arr1(42), arr2(42)
-  CALL test (3, arr1, 2, arr2)
+  CALL test (3, arr1, 2, arr2) ! { dg-warning "Type mismatch in argument" }
 END PROGRAM main
Index: gcc/testsuite/gfortran.dg/bounds_check_strlen_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/bounds_check_strlen_1.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/bounds_check_strlen_1.f90	(working copy)
@@ -12,7 +12,7 @@ END SUBROUTINE test
 
 PROGRAM main
   IMPLICIT NONE
-  CALL test ('abc') ! String is too short.
+  CALL test ('abc') ! { dg-warning "Character length of actual argument shorter" }
 END PROGRAM main
 
 ! { dg-output "shorter than the declared one for dummy argument 'str' \\(3/5\\)" }
Index: gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90
===================================================================
--- gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90	(working copy)
@@ -1,4 +1,9 @@
 ! { dg-do run }
+! { dg-options "-fwhole-file" }
+!
+! PR fortran/19107
+! -fwhole-file flag added for PR fortran/44945
+!
 ! This test the fix of PR19107, where character array actual
 ! arguments in derived type constructors caused an ICE.
 ! It also checks that the scalar counterparts are OK.
Index: gcc/testsuite/gfortran.dg/intrinsic_std_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/intrinsic_std_1.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/intrinsic_std_1.f90	(working copy)
@@ -1,5 +1,9 @@
 ! { dg-do compile }
-! { dg-options "-std=f95 -Wintrinsics-std -fdump-tree-original" }
+! { dg-options "-std=f95 -Wintrinsics-std" }
+
+!
+! See intrinsic_std_6.f90 for the dump check.
+!
 
 ! PR fortran/33141
 ! Check for the expected behaviour when an intrinsic function/subroutine is
@@ -32,8 +36,8 @@ END SUBROUTINE implicit_type
 
 SUBROUTINE specification_expression
   CHARACTER(KIND=selected_char_kind("ascii")) :: x
-! { dg-error "must be an intrinsic function" "" { target "*-*-*" } 34 }
-! { dg-warning "Fortran 2003" "" { target "*-*-*" } 34 }
+! { dg-error "must be an intrinsic function" "" { target "*-*-*" } 38 }
+! { dg-warning "Fortran 2003" "" { target "*-*-*" } 38 }
 END SUBROUTINE specification_expression
 
 SUBROUTINE intrinsic_decl
@@ -41,9 +45,3 @@ SUBROUTINE intrinsic_decl
   INTRINSIC :: atanh ! { dg-error "Fortran 2008" }
   INTRINSIC :: abort ! { dg-error "extension" }
 END SUBROUTINE intrinsic_decl
-
-! Scan that really external functions are called.
-! { dg-final { scan-tree-dump " abort " "original" } }
-! { dg-final { scan-tree-dump " asinh " "original" } }
-! { dg-final { scan-tree-dump " acosh " "original" } }
-! { dg-final { cleanup-tree-dump "original" } }
Index: gcc/testsuite/gfortran.dg/func_decl_5.f90
===================================================================
--- gcc/testsuite/gfortran.dg/func_decl_5.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/func_decl_5.f90	(revision 0)
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-c" }
+!
+! Functions shall not have an initializer.
+!
+! Some tests were moved from func_decl_4.f90 to here.
+!
+
+function f1()                      ! { dg-error "cannot have an initializer" }
+  integer :: f1 = 42
+end function
+
+function f2() RESULT (r)           ! { dg-error "cannot have an initializer" }
+  integer :: r = 42
+end function
Index: gcc/testsuite/gfortran.dg/sizeof.f90
===================================================================
--- gcc/testsuite/gfortran.dg/sizeof.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/sizeof.f90	(working copy)
@@ -82,7 +82,7 @@ subroutine check_derived ()
        call abort
 end subroutine check_derived
 
-call check_int ()
-call check_real ()
+call check_int (1)
+call check_real (1.0, (/1.0, 2.0, 3.0, 4.0, 5.0/))
 call check_derived ()
 end
Index: gcc/testsuite/gfortran.dg/pr20865.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr20865.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/pr20865.f90	(working copy)
@@ -8,5 +8,5 @@
 
   integer :: i, st
   st(i) = (i*i+2)
-  call tt(st) ! { dg-error "Statement function .* is not allowed as an actual argument" }
+  call tt(st) ! { dg-error "Statement function .* is not allowed as an actual argument|Invalid procedure argument" }
   end
Index: gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90	(working copy)
@@ -139,16 +139,16 @@ subroutine foo(a)
   call gee_i(i**(-huge(0_4)))
   call gee_i(i**(-huge(0_4)-1_4))
 
-  call gee_i(i**0_8)
-  call gee_i(i**1_8)
-  call gee_i(i**2_8)
-  call gee_i(i**3_8)
-  call gee_i(i**(-1_8))
-  call gee_i(i**(-2_8))
-  call gee_i(i**(-3_8))
-  call gee_i(i**huge(0_8))
-  call gee_i(i**(-huge(0_8)))
-  call gee_i(i**(-huge(0_8)-1_8))
+  call gee_i(i**0_8) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**1_8) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**2_8) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**3_8) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**(-1_8)) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**(-2_8)) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**(-3_8)) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**huge(0_8)) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**(-huge(0_8))) ! { dg-warning "Type mismatch in argument" }
+  call gee_i(i**(-huge(0_8)-1_8)) ! { dg-warning "Type mismatch in argument" }
 
   ! Real
   call gee_r(a**0_1)
Index: gcc/testsuite/gfortran.dg/g77/19990218-0.f
===================================================================
--- gcc/testsuite/gfortran.dg/g77/19990218-0.f	(revision 162456)
+++ gcc/testsuite/gfortran.dg/g77/19990218-0.f	(working copy)
@@ -2,7 +2,7 @@ c { dg-do compile }
         program test
         double precision a,b,c
         data a,b/1.0d-46,1.0d0/
-        c=fun(a,b)
+        c=fun(a,b) ! { dg-error "Return type mismatch of function" }
         print*,'in main: fun=',c
         end
         double precision function fun(a,b)
Index: gcc/testsuite/gfortran.dg/g77/19990218-1.f
===================================================================
--- gcc/testsuite/gfortran.dg/g77/19990218-1.f	(revision 162456)
+++ gcc/testsuite/gfortran.dg/g77/19990218-1.f	(working copy)
@@ -20,6 +20,6 @@ c
         program test
         double precision a,b,c
         data a,b/1.0d-46,1.0d0/
-        c=fun(a,b)
+        c=fun(a,b) ! { dg-error "Return type mismatch of function" }
         print*,'in main: fun=',c
         end
Index: gcc/testsuite/gfortran.dg/g77/970625-2.f
===================================================================
--- gcc/testsuite/gfortran.dg/g77/970625-2.f	(revision 162456)
+++ gcc/testsuite/gfortran.dg/g77/970625-2.f	(working copy)
@@ -40,7 +40,7 @@
          PROGRAM = THEN - IF
          ELSE IF = THEN .GT. IF
          IF (THEN.GT.REAL) THEN
-            CALL FUNCTION PROGRAM (ELSE IF, GO TO PROGRAM, THEN)
+            CALL FUNCTION PROGRAM (ELSE IF, GO TO PROGRAM, THEN) ! { dg-warning "Type mismatch in argument" }
          ELSE IF (ELSE IF) THEN
             REAL = THEN + END DO
          END IF
Index: gcc/testsuite/gfortran.dg/pr37243.f
===================================================================
--- gcc/testsuite/gfortran.dg/pr37243.f	(revision 162456)
+++ gcc/testsuite/gfortran.dg/pr37243.f	(working copy)
@@ -20,8 +20,8 @@
       IF (I .EQ. M) GO TO 160
       I1 = I+1
       DO 140 J = I1,M
-      DUM = -DDOT(N,V(1,J),1,V(1,I),1)
-      CALL DAXPY(N,DUM,V(1,I),1,V(1,J),1)
+      DUM = -DDOT(N,V(1,J),1,V(1,I),1) ! { dg-warning "More actual than formal arguments" }
+      CALL DAXPY(N,DUM,V(1,I),1,V(1,J),1) ! { dg-warning "More actual than formal arguments" }
   140 CONTINUE
   160 CONTINUE
       IF (M .EQ. N) RETURN
@@ -35,7 +35,7 @@
       IF (J .GT. N) GO TO 320
       DO 240 K = 1,N
   240 V(K,I) = ZERO
-      CALL DAXPY(N,DUM,V(1,I),1,V(1,I),1)
+      CALL DAXPY(N,DUM,V(1,I),1,V(1,I),1) ! { dg-warning "More actual than formal arguments" }
   260 CONTINUE
       DUMI = ZERO
       DO 280 K = 1,N
Index: gcc/testsuite/gfortran.dg/use_only_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/use_only_1.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/use_only_1.f90	(working copy)
@@ -73,6 +73,7 @@ contains
     USE xmod, ONLY: xfoobar_renamed => xfoobar
     USE ymod, ONLY: yfoobar_renamed => yfoobar
     USE ymod
+    implicit integer(4) (a-z)
     if (xfoobar_renamed (42) == xfoobar ()) call abort ()
     if (yfoobar_renamed (42) == yfoobar ()) call abort ()
   end subroutine
Index: gcc/testsuite/gfortran.dg/loc_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/loc_1.f90	(revision 162456)
+++ gcc/testsuite/gfortran.dg/loc_1.f90	(working copy)
@@ -17,9 +17,10 @@ subroutine fn
 end subroutine fn
 
 subroutine foo (ii)
+  use iso_c_binding, only: c_intptr_t
   common /targ/targ
   integer targ(10)
-  integer ii
+  integer(c_intptr_t) ii
   targ(2) = ii
 end subroutine foo
 
Index: libgomp/testsuite/libgomp.fortran/appendix-a/a.28.5.f90
===================================================================
--- libgomp/testsuite/libgomp.fortran/appendix-a/a.28.5.f90	(revision 162456)
+++ libgomp/testsuite/libgomp.fortran/appendix-a/a.28.5.f90	(working copy)
@@ -1,4 +1,9 @@
 ! { dg-do compile }
+! { dg-options "-w" }
+!
+! "-w" added as libgomp/testsuite seemingly cannot parse with
+! dg-warning Fortran's output. Fortran warns for "call sub1(a)"
+! that there is a "Rank mismatch in argument 'x'".
 
       SUBROUTINE SUB1(X)
         DIMENSION X(10)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]