[Fortran] PR 92072 – fix %C corner case
authorTobias Burnus <tobias@codesourcery.com>
Mon, 14 Oct 2019 08:14:23 +0000 (08:14 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Mon, 14 Oct 2019 08:14:23 +0000 (10:14 +0200)
        PR fortran/92072
        * error.c (error_print, gfc_format_decoder): Fix %C column-
        offset handling.

From-SVN: r276953

gcc/fortran/ChangeLog
gcc/fortran/error.c

index 2892011b740e48c5113bed3dc1591cb6f8f98ab5..ad30ff2ceac4c9969f6fda59138b6860da0a60f2 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-14  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/92072
+       * error.c (error_print, gfc_format_decoder): Fix %C column-
+       offset handling.
+
 2019-10-13  Damian Rouson  <damain@sourceryinstitue.org>
 
        PR fortran/91513
 
 2019-10-04  Tobias Burnus  <tobias@codesourcery.com>
 
-       * error (error_print, gfc_format_decoder): Fix off-by one issue with %C.
+       * error.c (error_print, gfc_format_decoder): Fix off-by one issue
+       with %C.
 
 2019-10-03  Steven G. Kargl  <kargl@gcc.gnu.org>
 
index 1019f17d73cd661545bbb762b82910812d6ce673..7962c93b108621a0c583972675b6465dd4d0edeb 100644 (file)
@@ -1,3 +1,4 @@
+#pragma GCC optimize("O0")
 /* Handle errors.
    Copyright (C) 2000-2019 Free Software Foundation, Inc.
    Contributed by Andy Vaught & Niels Kristian Bech Jensen
@@ -619,7 +620,7 @@ error_print (const char *type, const char *format0, va_list argp)
                l2 = loc;
                arg[pos].u.stringval = "(2)";
                /* Point %C first offending character not the last good one. */
-               if (arg[pos].type == TYPE_CURRENTLOC)
+               if (arg[pos].type == TYPE_CURRENTLOC && *l2->nextc != '\0')
                  l2->nextc++;
              }
            else
@@ -628,7 +629,7 @@ error_print (const char *type, const char *format0, va_list argp)
                have_l1 = 1;
                arg[pos].u.stringval = "(1)";
                /* Point %C first offending character not the last good one. */
-               if (arg[pos].type == TYPE_CURRENTLOC)
+               if (arg[pos].type == TYPE_CURRENTLOC && *l1->nextc != '\0')
                  l1->nextc++;
              }
            break;
@@ -969,7 +970,7 @@ gfc_format_decoder (pretty_printer *pp, text_info *text, const char *spec,
          loc = va_arg (*text->args_ptr, locus *);
        gcc_assert (loc->nextc - loc->lb->line >= 0);
        unsigned int offset = loc->nextc - loc->lb->line;
-       if (*spec == 'C')
+       if (*spec == 'C' && *loc->nextc != '\0')
          /* Point %C first offending character not the last good one. */
          offset++;
        /* If location[0] != UNKNOWN_LOCATION means that we already