cppfiles.c (find_position): Drop 'colp' argument, return the new line base.
authorZack Weinberg <zack@wolery.cumb.org>
Sun, 30 Jan 2000 18:09:07 +0000 (18:09 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Sun, 30 Jan 2000 18:09:07 +0000 (18:09 +0000)
* cppfiles.c (find_position): Drop 'colp' argument, return the
new line base.
(read_and_prescan): Adjust to match.  Don't ever manipulate
line or line_base except via find_position.

From-SVN: r31700

gcc/ChangeLog
gcc/cppfiles.c
gcc/testsuite/gcc.dg/20000129-1.c [new file with mode: 0644]

index 501e926..d041bea 100644 (file)
@@ -1,3 +1,10 @@
+2000-01-30  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * cppfiles.c (find_position): Drop 'colp' argument, return the
+       new line base.
+       (read_and_prescan): Adjust to match.  Don't ever manipulate
+       line or line_base except via find_position.
+
 2000-01-29  Zack Weinberg  <zack@wolery.cumb.org>
 
        * c-parse.in: Apply Ulrich's changes from c-parse.y.
index 95f1196..a89a0ca 100644 (file)
@@ -34,23 +34,22 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 static struct include_hash *redundant_include_p
                                        PARAMS ((cpp_reader *,
-                                               struct include_hash *,
-                                               struct file_name_list *));
-static struct file_name_map *read_name_map     PARAMS ((cpp_reader *,
-                                                       const char *));
+                                                struct include_hash *,
+                                                struct file_name_list *));
+static struct file_name_map *read_name_map
+                                       PARAMS ((cpp_reader *, const char *));
 static char *read_filename_string      PARAMS ((int, FILE *));
 static char *remap_filename            PARAMS ((cpp_reader *, char *,
-                                               struct file_name_list *));
+                                                struct file_name_list *));
 static long read_and_prescan           PARAMS ((cpp_reader *, cpp_buffer *,
-                                               int, size_t));
-static struct file_name_list *actual_directory PARAMS ((cpp_reader *,
-                                                      const char *));
+                                                int, size_t));
+static struct file_name_list *actual_directory
+                                       PARAMS ((cpp_reader *, const char *));
 static void initialize_input_buffer    PARAMS ((cpp_reader *, int,
-                                               struct stat *));
+                                                struct stat *));
 static int file_cleanup                        PARAMS ((cpp_buffer *, cpp_reader *));
-static void find_position              PARAMS ((U_CHAR *, U_CHAR *,
-                                               unsigned long *,
-                                               unsigned long *));
+static U_CHAR *find_position           PARAMS ((U_CHAR *, U_CHAR *,
+                                                unsigned long *));
 
 #if 0
 static void hack_vms_include_specification PARAMS ((char *));
@@ -772,23 +771,25 @@ actual_directory (pfile, fname)
 }
 
 /* Determine the current line and column.  Used only by read_and_prescan. */
-static void
-find_position (start, limit, linep, colp)
+static U_CHAR *
+find_position (start, limit, linep)
      U_CHAR *start;
      U_CHAR *limit;
      unsigned long *linep;
-     unsigned long *colp;
 {
-  unsigned long line = *linep, col = 0;
+  unsigned long line = *linep;
+  U_CHAR *lbase = start;
   while (start < limit)
     {
       U_CHAR ch = *start++;
       if (ch == '\n' || ch == '\r')
-       line++, col = 1;
-      else
-       col++;
+       {
+         line++;
+         lbase = start;
+       }
     }
-  *linep = line, *colp = col;
+  *linep = line;
+  return lbase;
 }
 
 /* Read the entire contents of file DESC into buffer BUF.  LEN is how
@@ -950,8 +951,6 @@ read_and_prescan (pfile, fp, desc, len)
                    *op++ = '\r';
                  else
                    deferred_newlines++;
-                 line++;
-                 line_base = op;
                }
              else if (*ip == '\r')
                {
@@ -967,8 +966,6 @@ read_and_prescan (pfile, fp, desc, len)
                    *op++ = '\r';
                  else
                    deferred_newlines++;
-                 line++;
-                 line_base = op;
                }
              else
                *op++ = '\\';
@@ -1023,10 +1020,14 @@ read_and_prescan (pfile, fp, desc, len)
                if (CPP_OPTIONS (pfile)->warn_trigraphs)
                  {
                    unsigned long col;
-                   find_position (line_base, op, &line, &col);
-                   line_base = op - col;
-                   cpp_warning_with_line (pfile, line, col,
-                                          "trigraph ??%c encountered", d);
+                   line_base = find_position (line_base, op, &line);
+                   col = op - line_base + 1;
+                   if (CPP_OPTIONS (pfile)->trigraphs)
+                     cpp_warning_with_line (pfile, line, col,
+                            "trigraph ??%c converted to %c", d, t);
+                   else
+                     cpp_warning_with_line (pfile, line, col,
+                            "trigraph ??%c ignored", d);
                  }
                if (CPP_OPTIONS (pfile)->trigraphs)
                  {
@@ -1075,7 +1076,8 @@ read_and_prescan (pfile, fp, desc, len)
   if (op[-1] != '\n')
     {
       unsigned long col;
-      find_position (line_base, op, &line, &col);
+      line_base = find_position (line_base, op, &line);
+      col = op - line_base + 1;
       cpp_warning_with_line (pfile, line, col, "no newline at end of file\n");
       if (offset + 1 > len)
        {
diff --git a/gcc/testsuite/gcc.dg/20000129-1.c b/gcc/testsuite/gcc.dg/20000129-1.c
new file mode 100644 (file)
index 0000000..878002b
--- /dev/null
@@ -0,0 +1,15 @@
+/* Regression test for trigraph warnings.  Under certain conditions we
+   got the line numbers wrong.
+   Originally exposed by XEmacs and reported by Martin Buchholz
+   <martin@xemacs.org>; this test case is synthetic.  */
+
+/* { dg-do preprocess } */
+/* { dg-options -Wall } */
+
+#define some_macro \
+       blah    \
+       blah    \
+       blah    \
+       blah
+
+??>    /* { dg-warning "trigraph ..." "trigraph encountered" } */