Commit 6604e6f3 by Neil Booth Committed by Neil Booth

re PR preprocessor/3824 (With -traditional, CPP 0xffffffff > 0 but C 0xffffffff < 0)

	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.

From-SVN: r44651
parent 67821e3a
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
* c-lex.c (map): New.
(cb_file_change): Update map and use it.
......
......@@ -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)
......
......@@ -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 */
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.
* gcc.dg/cpp/directiv.c: We no longer process directives that
interrupt macro arguments.
......
/* 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
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment