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
This commit is contained in:
Francois-Xavier Coudert 2009-12-27 09:30:57 +00:00 committed by Daniel Kraft
parent 6f352c3a70
commit ca071303a5
8 changed files with 90 additions and 9 deletions

View File

@ -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

View File

@ -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;

View File

@ -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)
{

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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" } }