diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2009-12-27 09:30:57 +0000 |
---|---|---|
committer | Daniel Kraft <domob@gcc.gnu.org> | 2009-12-27 10:30:57 +0100 |
commit | ca071303a504199e2ded9caad0d441196ede757b (patch) | |
tree | f5dbe5c613b211c7d20ee051b0b26433da3aca76 | |
parent | 6f352c3a70dffef99f478c25b48e64c8ab4de991 (diff) | |
download | gcc-ca071303a504199e2ded9caad0d441196ede757b.zip gcc-ca071303a504199e2ded9caad0d441196ede757b.tar.gz gcc-ca071303a504199e2ded9caad0d441196ede757b.tar.bz2 |
re PR fortran/22552 (Would like warning when an undeclared function is called)
2009-12-27 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Daniel Kraft <d@domob.eu>
PR fortran/22552
* lang.opt (Wimplicit-procedure): New option.
* gfortran.h (struct gfc_option_t): New member `warn_implicit_procedure'
* options.c (gfc_handle_option): Handle -Wimplicit-procedure.
* interface.c (gfc_procedure_use): Warn about procedure never
explicitly declared if requested by the new flag.
* invoke.texi: Document new flag -Wimplicit-procedure.
2009-12-27 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Daniel Kraft <d@domob.eu>
PR fortran/22552
* gfortran.dg/warn_implicit_procedure_1.f90: New test.
Co-Authored-By: Daniel Kraft <d@domob.eu>
From-SVN: r155479
-rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 1 | ||||
-rw-r--r-- | gcc/fortran/interface.c | 18 | ||||
-rw-r--r-- | gcc/fortran/invoke.texi | 12 | ||||
-rw-r--r-- | gcc/fortran/lang.opt | 4 | ||||
-rw-r--r-- | gcc/fortran/options.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/warn_implicit_procedure_1.f90 | 43 |
8 files changed, 90 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f65bcd0..0f2ecc7e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2009-12-27 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + Daniel Kraft <d@domob.eu> + + PR fortran/22552 + * lang.opt (Wimplicit-procedure): New option. + * gfortran.h (struct gfc_option_t): New member `warn_implicit_procedure' + * options.c (gfc_handle_option): Handle -Wimplicit-procedure. + * interface.c (gfc_procedure_use): Warn about procedure never + explicitly declared if requested by the new flag. + * invoke.texi: Document new flag -Wimplicit-procedure. + 2009-12-17 Janus Weil <janus@gcc.gnu.org> PR fortran/42144 diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 9ea5ad1..20f52ea 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -2103,6 +2103,7 @@ typedef struct int warn_ampersand; int warn_conversion; int warn_implicit_interface; + int warn_implicit_procedure; int warn_line_truncation; int warn_surprising; int warn_tabs; diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 866a81c..0034f75 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -2380,12 +2380,18 @@ gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where) /* Warn about calls with an implicit interface. Special case for calling a ISO_C_BINDING becase c_loc and c_funloc - are pseudo-unknown. */ - if (gfc_option.warn_implicit_interface - && sym->attr.if_source == IFSRC_UNKNOWN - && ! sym->attr.is_iso_c) - gfc_warning ("Procedure '%s' called with an implicit interface at %L", - sym->name, where); + are pseudo-unknown. Additionally, warn about procedures not + explicitly declared at all if requested. */ + if (sym->attr.if_source == IFSRC_UNKNOWN && ! sym->attr.is_iso_c) + { + if (gfc_option.warn_implicit_interface) + gfc_warning ("Procedure '%s' called with an implicit interface at %L", + sym->name, where); + else if (gfc_option.warn_implicit_procedure + && sym->attr.proc == PROC_UNKNOWN) + gfc_warning ("Procedure '%s' called at %L is not explicitly declared", + sym->name, where); + } if (sym->attr.if_source == IFSRC_UNKNOWN) { diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 47cb149..2485e37 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -137,9 +137,9 @@ and warnings}. @gccoptlist{-fmax-errors=@var{n} @gol -fsyntax-only -pedantic -pedantic-errors @gol -Wall -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation @gol --Wconversion -Wimplicit-interface -Wline-truncation -Wintrinsics-std @gol --Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter -Wintrinsics-shadow @gol --Wno-align-commons} +-Wconversion -Wimplicit-interface -Wimplicit-procedure -Wline-truncation @gol +-Wintrinsics-std -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter @gol +-Wintrinsics-shadow -Wno-align-commons} @item Debugging Options @xref{Debugging Options,,Options for debugging your program or GNU Fortran}. @@ -754,6 +754,12 @@ Warn if a procedure is called without an explicit interface. Note this only checks that an explicit interface is present. It does not check that the declared interfaces are consistent across program units. +@item -Wimplicit-procedure +@opindex @code{Wimplicit-procedure} +@cindex warnings, implicit procedure +Warn if a procedure is called that has neither an explicit interface +nor has been declared as @code{EXTERNAL}. + @item -Wintrinsics-std @opindex @code{Wintrinsics-std} @cindex warnings, non-standard intrinsics diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index d29ddde..10f4a89 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -96,6 +96,10 @@ Wimplicit-interface Fortran Warning Warn about calls with implicit interface +Wimplicit-procedure +Fortran Warning +Warn about called procedures not explicitly declared + Wline-truncation Fortran Warning Warn about truncated source lines diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c index 3742add..43c44db 100644 --- a/gcc/fortran/options.c +++ b/gcc/fortran/options.c @@ -561,6 +561,10 @@ gfc_handle_option (size_t scode, const char *arg, int value) gfc_option.warn_implicit_interface = value; break; + case OPT_Wimplicit_procedure: + gfc_option.warn_implicit_procedure = value; + break; + case OPT_Wline_truncation: gfc_option.warn_line_truncation = value; break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14bc7b7..dbf9831 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-12-27 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + Daniel Kraft <d@domob.eu> + + PR fortran/22552 + * gfortran.dg/warn_implicit_procedure_1.f90: New test. + 2009-12-24 Jason Merrill <jason@redhat.com> PR c++/41305 diff --git a/gcc/testsuite/gfortran.dg/warn_implicit_procedure_1.f90 b/gcc/testsuite/gfortran.dg/warn_implicit_procedure_1.f90 new file mode 100644 index 0000000..8f21b60 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/warn_implicit_procedure_1.f90 @@ -0,0 +1,43 @@ +! { dg-do compile } +! { dg-options "-Wimplicit-procedure" } + +! PR fortran/22552 +! Check for correct -Wimplicit-procedure warnings. + +MODULE m + +CONTAINS + + SUBROUTINE my_sub () + END SUBROUTINE my_sub + + INTEGER FUNCTION my_func () + my_func = 42 + END FUNCTION my_func + +END MODULE m + +SUBROUTINE test (proc) + IMPLICIT NONE + CALL proc () ! { dg-bogus "is not explicitly declared" } +END SUBROUTINE test + +PROGRAM main + USE m + EXTERNAL :: ext_sub + EXTERNAL :: test + INTEGER :: ext_func + + CALL ext_sub () ! { dg-bogus "is not explicitly declared" } + PRINT *, ext_func () ! { dg-bogus "is not explicitly declared" } + PRINT *, implicit_func () ! { dg-bogus "is not explicitly declared" } + CALL my_sub () ! { dg-bogus "is not explicitly declared" } + PRINT *, my_func () ! { dg-bogus "is not explicitly declared" } + PRINT *, SIN (3.14159) ! { dg-bogus "is not explicitly declared" } + + CALL undef_sub (1, 2, 3) ! { dg-warning "is not explicitly declared" } + ! Can't check undefined function, because it needs to be declared a type + ! in any case (and the implicit type is enough to not trigger this warning). +END PROGRAM + +! { dg-final { cleanup-modules "m" } } |