diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2016-12-10 22:28:32 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2016-12-10 22:28:32 +0000 |
commit | be841e112b04fe434f5ef9248f2a5e4169aebddf (patch) | |
tree | be4bfe7ad7a362f1b2ec18203a6dd437d989c28e /gcc/fortran/frontend-passes.c | |
parent | 8a45a00eee9802d81140870c84675d1e47f1f498 (diff) | |
download | gcc-be841e112b04fe434f5ef9248f2a5e4169aebddf.zip gcc-be841e112b04fe434f5ef9248f2a5e4169aebddf.tar.gz gcc-be841e112b04fe434f5ef9248f2a5e4169aebddf.tar.bz2 |
re PR fortran/78226 (Fill out location information everywhere)
2016-12-10 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/78226
* error.c (gfc_warning_internal): New function.
* frontend-passes.c (gfc_run_passes): Call check_locus if
CHECKING_P is defined.
(check_locus_code): New function.
(check_locus_expr): New function.
(check_locus): New function.
* gfortran.h: Add prototype for gfc_warning_internal.
From-SVN: r243520
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r-- | gcc/fortran/frontend-passes.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 44d2a42..82812f8 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -48,6 +48,10 @@ static gfc_code * create_do_loop (gfc_expr *, gfc_expr *, gfc_expr *, locus *, gfc_namespace *, char *vname=NULL); +#ifdef CHECKING_P +static void check_locus (gfc_namespace *); +#endif + /* How deep we are inside an argument list. */ static int count_arglist; @@ -127,6 +131,10 @@ gfc_run_passes (gfc_namespace *ns) doloop_list.release (); int w, e; +#ifdef CHECKING_P + check_locus (ns); +#endif + if (flag_frontend_optimize) { optimize_namespace (ns); @@ -145,6 +153,53 @@ gfc_run_passes (gfc_namespace *ns) realloc_strings (ns); } +#ifdef CHECKING_P + +/* Callback function: Warn if there is no location information in a + statement. */ + +static int +check_locus_code (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED) +{ + current_code = c; + if (c && *c && (((*c)->loc.nextc == NULL) || ((*c)->loc.lb == NULL))) + gfc_warning_internal (0, "No location in statement"); + + return 0; +} + + +/* Callback function: Warn if there is no location information in an + expression. */ + +static int +check_locus_expr (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED) +{ + + if (e && *e && (((*e)->where.nextc == NULL || (*e)->where.lb == NULL))) + gfc_warning_internal (0, "No location in expression near %L", + &((*current_code)->loc)); + return 0; +} + +/* Run check for missing location information. */ + +static void +check_locus (gfc_namespace *ns) +{ + gfc_code_walker (&ns->code, check_locus_code, check_locus_expr, NULL); + + for (ns = ns->contained; ns; ns = ns->sibling) + { + if (ns->code == NULL || ns->code->op != EXEC_BLOCK) + check_locus (ns); + } +} + +#endif + /* Callback for each gfc_code node invoked from check_realloc_strings. For an allocatable LHS string which also appears as a variable on the RHS, replace |