Revert "preprocessor/58580 - preprocessor goes OOM with warning for zero literals"
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Nov 2013 22:51:36 +0000 (22:51 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 6 Nov 2013 22:51:36 +0000 (22:51 +0000)
This reverts commit fc3eff8854861fcd70d33d26095b17fe456fae31.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204490 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/diagnostic.c
gcc/input.c
gcc/input.h
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c [deleted file]

index d9bc7c6..75603e7 100644 (file)
        (register_new_assert_for): Use drop_tree_overflow.
        (vrp_visit_phi_node): Likewise.
 
-2013-11-06  Dodji Seketeli  <dodji@redhat.com>
-
-       preprocessor/58580
-       * input.h (location_get_source_line): Take an additional line_size
-       parameter.
-       * input.c (get_line): New static function definition.
-       (read_line): Take an additional line_length output parameter to be
-       set to the size of the line.  Use the new get_line function do the
-       actual line reading.
-       (location_get_source_line): Take an additional output line_len
-       parameter.  Update the use of read_line to pass it the line_len
-       parameter.
-       * diagnostic.c (adjust_line): Take an additional input parameter
-       for the length of the line, rather than calculating it with
-       strlen.
-       (diagnostic_show_locus): Adjust the use of
-       location_get_source_line and adjust_line with respect to their new
-       signature.  While displaying a line now, do not stop at the first
-       null byte.  Rather, display the zero byte as a space and keep
-       going until we reach the size of the line.
-
 2013-11-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/i386/i386.c (ix86_expand_prologue): Optimize stack
index e0c5d9d..36094a1 100644 (file)
@@ -259,13 +259,12 @@ diagnostic_build_prefix (diagnostic_context *context,
    MAX_WIDTH by some margin, then adjust the start of the line such
    that the COLUMN is smaller than MAX_WIDTH minus the margin.  The
    margin is either 10 characters or the difference between the column
-   and the length of the line, whatever is smaller.  The length of
-   LINE is given by LINE_WIDTH.  */
+   and the length of the line, whatever is smaller.  */
 static const char *
-adjust_line (const char *line, int line_width,
-            int max_width, int *column_p)
+adjust_line (const char *line, int max_width, int *column_p)
 {
   int right_margin = 10;
+  int line_width = strlen (line);
   int column = *column_p;
 
   right_margin = MIN (line_width - column, right_margin);
@@ -285,7 +284,6 @@ diagnostic_show_locus (diagnostic_context * context,
                       const diagnostic_info *diagnostic)
 {
   const char *line;
-  int line_width;
   char *buffer;
   expanded_location s;
   int max_width;
@@ -299,25 +297,22 @@ diagnostic_show_locus (diagnostic_context * context,
 
   context->last_location = diagnostic->location;
   s = expand_location_to_spelling_point (diagnostic->location);
-  line = location_get_source_line (s, &line_width);
+  line = location_get_source_line (s);
   if (line == NULL)
     return;
 
   max_width = context->caret_max_width;
-  line = adjust_line (line, line_width, max_width, &(s.column));
+  line = adjust_line (line, max_width, &(s.column));
 
   pp_newline (context->printer);
   saved_prefix = pp_get_prefix (context->printer);
   pp_set_prefix (context->printer, NULL);
   pp_space (context->printer);
-  while (max_width > 0 && line_width > 0)
+  while (max_width > 0 && *line != '\0')
     {
       char c = *line == '\t' ? ' ' : *line;
-      if (c == '\0')
-       c = ' ';
       pp_character (context->printer, c);
       max_width--;
-      line_width--;
       line++;
     }
   pp_newline (context->printer);
index cb3a0a0..a141a92 100644 (file)
@@ -87,114 +87,53 @@ expand_location_1 (source_location loc,
   return xloc;
 }
 
-/* This function reads a line that might contain bytes whose value is
-   zero.  It returns the number of bytes read.  The 'end-of-line'
-   character found at the end of the line is not contained in the
-   returned buffer.  Note that this function has been adapted from
-   getline() and _IO_getdelim() GNU C library functions.  It's been
-   duplicated here because the getline() function is not necessarily
-   present on all platforms.
-
-   LINEPTR points to a buffer that is to contain the line read.
-
-   N points to the size of the the LINEPTR buffer.
-
-   FP points to the file to consider.  */
-
-static ssize_t
-get_line (char **lineptr, size_t *n, FILE *fp)
+/* Reads one line from file into a static buffer.  */
+static const char *
+read_line (FILE *file)
 {
-  ssize_t cur_len = 0, len;
-  char buf[16384];
-
-  if (lineptr == NULL || n == NULL)
-    return -1;
+  static char *string;
+  static size_t string_len;
+  size_t pos = 0;
+  char *ptr;
 
-  if (*lineptr == NULL || *n == 0)
+  if (!string_len)
     {
-      *n = 120;
-      *lineptr = XNEWVEC (char, *n);
+      string_len = 200;
+      string = XNEWVEC (char, string_len);
     }
 
-  len = fread (buf, 1, sizeof buf, fp);
-  if (ferror (fp))
-    return -1;
-
-  for (;;)
+  while ((ptr = fgets (string + pos, string_len - pos, file)))
     {
-      size_t needed;
-      char *t = (char*) memchr (buf, '\n', len);
-      if (t != NULL) len = (t - buf);
-      if (__builtin_expect (len >= SSIZE_MAX - cur_len, 0))
-       return -1;
-      needed = cur_len + len + 1;
-      if (needed > *n)
+      size_t len = strlen (string + pos);
+
+      if (string[pos + len - 1] == '\n')
        {
-         char *new_lineptr;
-         if (needed < 2 * *n)
-           needed = 2 * *n;
-         new_lineptr = XRESIZEVEC (char, *lineptr, needed);
-         *lineptr = new_lineptr;
-         *n = needed;
+         string[pos + len - 1] = 0;
+         return string;
        }
-      memcpy (*lineptr + cur_len, buf, len);
-      cur_len += len;
-      if (t != NULL)
-       break;
-      len = fread (buf, 1, sizeof buf, fp);
-      if (ferror (fp))
-       return -1;
-      if (len == 0)
-       break;
+      pos += len;
+      string = XRESIZEVEC (char, string, string_len * 2);
+      string_len *= 2;
     }
-
-  if (cur_len)
-    (*lineptr)[cur_len] = '\0';
-  return cur_len;
-}
-
-/* Reads one line from FILE into a static buffer.  If LINE_LENGTH is
- *non-null LINE_LENGTH, will be set by this function to the length of
- *the returned line.  Note that the returned line can contain several
- *zero bytes.  Also note that the returned string is allocated in
- *static storage that is going to be re-used by subsequent invocations
- *of read_line.  */
-static const char *
-read_line (FILE *file, int *line_length)
-{
-  static char *string;
-  static size_t string_len;
-  int len;
-
-  len = get_line (&string, &string_len, file);
-  if (line_length)
-    *line_length = len;
-  return len ? string : NULL;
+      
+  return pos ? string : NULL;
 }
 
 /* Return the physical source line that corresponds to xloc in a
    buffer that is statically allocated.  The newline is replaced by
-   the null character.  Note that the line can contain several null
-   characters, so LINE_LEN, if non-null, points to the actual length
-   of the line.  */
+   the null character.  */
 
 const char *
-location_get_source_line (expanded_location xloc,
-                         int *line_len)
+location_get_source_line (expanded_location xloc)
 {
-  const char *buffer = NULL, *ptr;
-  int lines = 0, len = 0;
+  const char *buffer;
+  int lines = 1;
   FILE *stream = xloc.file ? fopen (xloc.file, "r") : NULL;
   if (!stream)
     return NULL;
 
-  while ((ptr = read_line (stream, &len)) && lines < xloc.line)
-    {
-      buffer = ptr;
-      lines++;
-      if (line_len)
-       *line_len = len;
-    }
+  while ((buffer = read_line (stream)) && lines < xloc.line)
+    lines++;
 
   fclose (stream);
   return buffer;
index 128e28c..8fdc7b2 100644 (file)
@@ -37,8 +37,7 @@ extern char builtins_location_check[(BUILTINS_LOCATION
                                     < RESERVED_LOCATION_COUNT) ? 1 : -1];
 
 extern expanded_location expand_location (source_location);
-extern const char *location_get_source_line (expanded_location xloc,
-                                            int *line_size);
+extern const char *location_get_source_line (expanded_location xloc);
 extern expanded_location expand_location_to_spelling_point (source_location);
 extern source_location expansion_point_location_if_in_system_header (source_location);
 
index 27a7628..ce0c26c 100644 (file)
        * gcc.dg/cilk-plus/cilk-plus.exp: Removed duplicate/un-necessary
        compiler flag testing.
 
-2013-11-06  Dodji Seketeli  <dodji@redhat.com>
-
-       preprocessor/58580
-       * c-c++-common/cpp/warning-zero-in-literals-1.c: New test file.
-
 2013-11-06  Christian Bruel  <christian.bruel@st.com>
 
        * gcc.target/sh/strlen.c: New test.
diff --git a/gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c b/gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c
deleted file mode 100644 (file)
index ff2ed96..0000000
Binary files a/gcc/testsuite/c-c++-common/cpp/warning-zero-in-literals-1.c and /dev/null differ