From a98af3e01c164f729be70f6319cc0b280f7e8182 Mon Sep 17 00:00:00 2001
From: neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sun, 5 Aug 2001 21:31:30 +0000
Subject: [PATCH] 	PR preprocessor/3824 	* line-map.c: Update comments.
 	* line-map.h: Update comments. 	* tradcif.y: Don't consider large
 numbers unsigned. 	* gcc.dg/cpp/tr-sign.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44651 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                      |  7 +++++++
 gcc/line-map.c                     |  5 ++++-
 gcc/line-map.h                     | 11 ++++++++---
 gcc/testsuite/ChangeLog            |  4 ++++
 gcc/testsuite/gcc.dg/cpp/tr-sign.c | 18 ++++++++++++++++++
 gcc/tradcif.y                      |  6 ++----
 6 files changed, 43 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/cpp/tr-sign.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70f07e385458..4cdd33c822f1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2001-08-05  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+	PR preprocessor/3824
+	* line-map.c: Update comments.
+	* line-map.h: Update comments.
+	* tradcif.y: Don't consider large numbers unsigned.
+
 2001-08-05  Neil Booth  <neil@daikokuya.demon.co.uk>
 
 	PR preprocessor/3081
diff --git a/gcc/line-map.c b/gcc/line-map.c
index a67191d3aed1..27bcf2f94cdd 100644
--- a/gcc/line-map.c
+++ b/gcc/line-map.c
@@ -93,7 +93,10 @@ add_line_map (set, reason, from_line, to_file, to_line)
   return map;
 }
 
-/* Translate a logical line number into a (source file, line) pair.  */
+/* Given a logical line, returns the map from which the corresponding
+   (source file, line) pair can be deduced.  Since the set is built
+   chronologically, the logical lines are monotonic increasing, and so
+   the list is sorted and we can use a binary search.  */
 
 struct line_map *
 lookup_line (set, line)
diff --git a/gcc/line-map.h b/gcc/line-map.h
index b6c934435d39..bbc6caacd5a8 100644
--- a/gcc/line-map.h
+++ b/gcc/line-map.h
@@ -44,7 +44,11 @@ struct line_maps
   unsigned int used;
 };
 
-/* Reason for adding a line change with add_line_map ().  */
+/* Reason for adding a line change with add_line_map ().  LC_ENTER is
+   when including a new file, e.g. a #include directive in C.
+   LC_LEAVE is when reaching a file's end.  LC_RENAME is when a file
+   name or line number changes for neither of the above reasons
+   (e.g. a #line directive in C).  */
 enum lc_reason {LC_ENTER = 0, LC_LEAVE, LC_RENAME};
 
 /* Initialize a line map set.  */
@@ -56,7 +60,7 @@ extern void free_line_maps
   PARAMS ((struct line_maps *));
 
 /* Add a mapping of logical source line to physical source file and
-   line number.  Ther text pointed to by TO_FILE must have a lifetime
+   line number.  The text pointed to by TO_FILE must have a lifetime
    at least as long as the final call to lookup_line ().
 
    FROM_LINE should be monotonic increasing across calls to this
@@ -80,7 +84,8 @@ extern struct line_map *lookup_line
 /* Non-zero if the map is at the bottom of the include stack.  */
 #define MAIN_FILE_P(MAP) ((MAP)->included_from < 0)
 
-/* The current line map.  */
+/* The current line map.  Saves a call to lookup_line if the caller is
+   sure he is in the scope of the current map.  */
 #define CURRENT_LINE_MAP(MAPS) ((MAPS)->maps + (MAPS)->used - 1)
 
 #endif /* !GCC_LINE_MAP_H  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 512f53938138..9e3c8c89b167 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2001-08-05  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+	* gcc.dg/cpp/tr-sign.c: New testcase.
+
 2001-08-05  Neil Booth  <neil@daikokuya.demon.co.uk>
 
 	* gcc.dg/cpp/19951025-1.c: Revert.
diff --git a/gcc/testsuite/gcc.dg/cpp/tr-sign.c b/gcc/testsuite/gcc.dg/cpp/tr-sign.c
new file mode 100644
index 000000000000..e48e8ccadd86
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/tr-sign.c
@@ -0,0 +1,18 @@
+/* Copyright (C) 2001 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess { target i?86-*-* } } */
+
+/* { dg-options "-traditional" } */
+
+/* Tests that traditional numbers are signed, unless otherwise
+   specified.  This test assumes a 32 bit target.
+
+   Neil Booth, 5 Aug 2001.  Inspired by PR 3824.  */
+
+#if 0xffffffff >= 0
+# error	0xffffffff	/* { dg-bogus "0xffffffff" "0xffffffff positive" } */
+#endif
+
+#if 0xffffffffU <= 0
+# error	0xffffffffU	/* { dg-bogus "0xffffffffU" "0xffffffffU negative" } */
+#endif
diff --git a/gcc/tradcif.y b/gcc/tradcif.y
index 5def3c97fa77..771f9d2e25ef 100644
--- a/gcc/tradcif.y
+++ b/gcc/tradcif.y
@@ -231,6 +231,8 @@ parse_number (olen)
       return ERROR;
     }
 
+  /* Traditionally, all numbers are signed.  However, we make it
+     unsigned if requested with a suffix.  */
   yylval.integer.unsignedp = 0;
 
   if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
@@ -277,10 +279,6 @@ parse_number (olen)
     return ERROR;
   }
 
-  /* If too big to be signed, consider it unsigned.  */
-  if (n < 0)
-    yylval.integer.unsignedp = 1;
-
   lexptr = p;
   yylval.integer.value = n;
   return INT;
-- 
GitLab