aboutsummaryrefslogtreecommitdiff
path: root/gcc/cexp.c
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1997-12-06 10:30:09 -0700
committerJeff Law <law@gcc.gnu.org>1997-12-06 10:30:09 -0700
commit27b6b158c29b45fd80c2f104d5da1f4bc818d7ab (patch)
tree9c7c51a3a8bfd63cf7d84a535015234d31dc02f3 /gcc/cexp.c
parentdb2a8c5b6d1f4ac88a5dc270f3be8a8902e4fddb (diff)
downloadgcc-27b6b158c29b45fd80c2f104d5da1f4bc818d7ab.zip
gcc-27b6b158c29b45fd80c2f104d5da1f4bc818d7ab.tar.gz
gcc-27b6b158c29b45fd80c2f104d5da1f4bc818d7ab.tar.bz2
This commit was generated by cvs2svn to compensate for changes in r16983,
which included commits to RCS files with non-trunk default branches. From-SVN: r16984
Diffstat (limited to 'gcc/cexp.c')
-rw-r--r--gcc/cexp.c172
1 files changed, 98 insertions, 74 deletions
diff --git a/gcc/cexp.c b/gcc/cexp.c
index 3156a2c..f7c51a7 100644
--- a/gcc/cexp.c
+++ b/gcc/cexp.c
@@ -25,26 +25,16 @@
#include <setjmp.h>
/* #define YYDEBUG 1 */
-/* The following symbols should be autoconfigured:
- STDC_HEADERS
- In the mean time, we'll get by with approximations based
- on existing GCC configuration symbols. */
-
-#ifdef POSIX
-# ifndef STDC_HEADERS
-# define STDC_HEADERS 1
-# endif
-#endif /* defined (POSIX) */
-#if STDC_HEADERS
+#ifdef HAVE_STRING_H
# include <string.h>
#endif
-#if HAVE_STDLIB_H || defined (MULTIBYTE_CHARS)
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
-#if HAVE_LIMITS_H
+#ifdef HAVE_LIMITS_H
# include <limits.h>
#endif
@@ -91,12 +81,10 @@ struct arglist {
# define HOST_WIDE_INT intmax_t
# define unsigned_HOST_WIDE_INT uintmax_t
# else
-# if (HOST_BITS_PER_LONG <= HOST_BITS_PER_INT \
- && HOST_BITS_PER_LONGLONG <= HOST_BITS_PER_INT)
+# if (HOST_BITS_PER_LONG <= HOST_BITS_PER_INT && HOST_BITS_PER_LONGLONG <= HOST_BITS_PER_INT)
# define HOST_WIDE_INT int
# else
-# if (HOST_BITS_PER_LONGLONG <= HOST_BITS_PER_LONG \
- || ! (defined LONG_LONG_MAX || defined LLONG_MAX))
+# if (HOST_BITS_PER_LONGLONG <= HOST_BITS_PER_LONG || ! (defined LONG_LONG_MAX || defined LLONG_MAX))
# define HOST_WIDE_INT long
# else
# define HOST_WIDE_INT long long
@@ -153,11 +141,14 @@ struct arglist {
#define PRINTF_PROTO_1(ARGS) PRINTF_PROTO(ARGS, 1, 2)
-HOST_WIDE_INT parse_c_expression PROTO((char *));
+HOST_WIDE_INT parse_c_expression PROTO((char *, int));
static int yylex PROTO((void));
static void yyerror PROTO((char *)) __attribute__ ((noreturn));
static HOST_WIDE_INT expression_value;
+#ifdef TEST_EXP_READER
+static int expression_signedp;
+#endif
static jmp_buf parse_return_error;
@@ -168,6 +159,9 @@ static int keyword_parsing = 0;
This is a count, since unevaluated expressions can nest. */
static int skip_evaluation;
+/* Nonzero means warn if undefined identifiers are evaluated. */
+static int warn_undef;
+
/* some external tables of character types */
extern unsigned char is_idstart[], is_idchar[], is_space[];
@@ -180,9 +174,6 @@ extern int traditional;
/* Flag for -lang-c89. */
extern int c89;
-/* Flag for -Wundef. */
-extern int warn_undef;
-
#ifndef CHAR_TYPE_SIZE
#define CHAR_TYPE_SIZE BITS_PER_UNIT
#endif
@@ -252,7 +243,7 @@ static void integer_overflow PROTO((void));
#define SIGNED (~0)
#define UNSIGNED 0
-#line 260 "cexp.y"
+#line 251 "cexp.y"
typedef union {
struct constant {HOST_WIDE_INT value; int signedp;} integer;
struct name {U_CHAR *address; int length;} name;
@@ -333,10 +324,10 @@ static const short yyrhs[] = { 35,
#if YYDEBUG != 0
static const short yyrline[] = { 0,
- 290, 295, 296, 303, 308, 311, 313, 316, 320, 322,
- 327, 332, 345, 362, 375, 381, 387, 393, 399, 402,
- 405, 412, 419, 426, 433, 436, 439, 442, 445, 448,
- 451, 454, 456, 459, 462, 464, 466, 474, 476, 489
+ 281, 291, 292, 299, 304, 307, 309, 312, 316, 318,
+ 323, 328, 341, 358, 371, 377, 383, 389, 395, 398,
+ 401, 408, 415, 422, 429, 432, 435, 438, 441, 444,
+ 447, 450, 452, 455, 458, 460, 462, 470, 472, 485
};
#endif
@@ -934,59 +925,64 @@ yyreduce:
switch (yyn) {
case 1:
-#line 291 "cexp.y"
-{ expression_value = yyvsp[0].integer.value; ;
+#line 282 "cexp.y"
+{
+ expression_value = yyvsp[0].integer.value;
+#ifdef TEST_EXP_READER
+ expression_signedp = yyvsp[0].integer.signedp;
+#endif
+ ;
break;}
case 3:
-#line 297 "cexp.y"
+#line 293 "cexp.y"
{ if (pedantic)
pedwarn ("comma operator in operand of `#if'");
yyval.integer = yyvsp[0].integer; ;
break;}
case 4:
-#line 304 "cexp.y"
+#line 300 "cexp.y"
{ yyval.integer.value = - yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[0].integer.signedp;
if ((yyval.integer.value & yyvsp[0].integer.value & yyval.integer.signedp) < 0)
integer_overflow (); ;
break;}
case 5:
-#line 309 "cexp.y"
+#line 305 "cexp.y"
{ yyval.integer.value = ! yyvsp[0].integer.value;
yyval.integer.signedp = SIGNED; ;
break;}
case 6:
-#line 312 "cexp.y"
+#line 308 "cexp.y"
{ yyval.integer = yyvsp[0].integer; ;
break;}
case 7:
-#line 314 "cexp.y"
+#line 310 "cexp.y"
{ yyval.integer.value = ~ yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[0].integer.signedp; ;
break;}
case 8:
-#line 317 "cexp.y"
+#line 313 "cexp.y"
{ yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length,
0, NULL_PTR);
yyval.integer.signedp = SIGNED; ;
break;}
case 9:
-#line 321 "cexp.y"
+#line 317 "cexp.y"
{ keyword_parsing = 1; ;
break;}
case 10:
-#line 323 "cexp.y"
+#line 319 "cexp.y"
{ yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length,
1, yyvsp[-1].keywords);
keyword_parsing = 0;
yyval.integer.signedp = SIGNED; ;
break;}
case 11:
-#line 328 "cexp.y"
+#line 324 "cexp.y"
{ yyval.integer = yyvsp[-1].integer; ;
break;}
case 12:
-#line 333 "cexp.y"
+#line 329 "cexp.y"
{ yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp;
if (yyval.integer.signedp)
{
@@ -1001,7 +997,7 @@ case 12:
* yyvsp[0].integer.value); ;
break;}
case 13:
-#line 346 "cexp.y"
+#line 342 "cexp.y"
{ if (yyvsp[0].integer.value == 0)
{
if (!skip_evaluation)
@@ -1020,7 +1016,7 @@ case 13:
/ yyvsp[0].integer.value); ;
break;}
case 14:
-#line 363 "cexp.y"
+#line 359 "cexp.y"
{ if (yyvsp[0].integer.value == 0)
{
if (!skip_evaluation)
@@ -1035,7 +1031,7 @@ case 14:
% yyvsp[0].integer.value); ;
break;}
case 15:
-#line 376 "cexp.y"
+#line 372 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp;
if (overflow_sum_sign (yyvsp[-2].integer.value, yyvsp[0].integer.value,
@@ -1043,7 +1039,7 @@ case 15:
integer_overflow (); ;
break;}
case 16:
-#line 382 "cexp.y"
+#line 378 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp;
if (overflow_sum_sign (yyval.integer.value, yyvsp[0].integer.value,
@@ -1051,7 +1047,7 @@ case 16:
integer_overflow (); ;
break;}
case 17:
-#line 388 "cexp.y"
+#line 384 "cexp.y"
{ yyval.integer.signedp = yyvsp[-2].integer.signedp;
if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0)
yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
@@ -1059,7 +1055,7 @@ case 17:
yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ;
break;}
case 18:
-#line 394 "cexp.y"
+#line 390 "cexp.y"
{ yyval.integer.signedp = yyvsp[-2].integer.signedp;
if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0)
yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
@@ -1067,17 +1063,17 @@ case 18:
yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ;
break;}
case 19:
-#line 400 "cexp.y"
+#line 396 "cexp.y"
{ yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ;
break;}
case 20:
-#line 403 "cexp.y"
+#line 399 "cexp.y"
{ yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ;
break;}
case 21:
-#line 406 "cexp.y"
+#line 402 "cexp.y"
{ yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value;
@@ -1086,7 +1082,7 @@ case 21:
<= yyvsp[0].integer.value); ;
break;}
case 22:
-#line 413 "cexp.y"
+#line 409 "cexp.y"
{ yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value;
@@ -1095,7 +1091,7 @@ case 22:
>= yyvsp[0].integer.value); ;
break;}
case 23:
-#line 420 "cexp.y"
+#line 416 "cexp.y"
{ yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value;
@@ -1104,7 +1100,7 @@ case 23:
< yyvsp[0].integer.value); ;
break;}
case 24:
-#line 427 "cexp.y"
+#line 423 "cexp.y"
{ yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value;
@@ -1113,64 +1109,64 @@ case 24:
> yyvsp[0].integer.value); ;
break;}
case 25:
-#line 434 "cexp.y"
+#line 430 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ;
break;}
case 26:
-#line 437 "cexp.y"
+#line 433 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ;
break;}
case 27:
-#line 440 "cexp.y"
+#line 436 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ;
break;}
case 28:
-#line 443 "cexp.y"
+#line 439 "cexp.y"
{ skip_evaluation += !yyvsp[-1].integer.value; ;
break;}
case 29:
-#line 445 "cexp.y"
+#line 441 "cexp.y"
{ skip_evaluation -= !yyvsp[-3].integer.value;
yyval.integer.value = (yyvsp[-3].integer.value && yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ;
break;}
case 30:
-#line 449 "cexp.y"
+#line 445 "cexp.y"
{ skip_evaluation += !!yyvsp[-1].integer.value; ;
break;}
case 31:
-#line 451 "cexp.y"
+#line 447 "cexp.y"
{ skip_evaluation -= !!yyvsp[-3].integer.value;
yyval.integer.value = (yyvsp[-3].integer.value || yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ;
break;}
case 32:
-#line 455 "cexp.y"
+#line 451 "cexp.y"
{ skip_evaluation += !yyvsp[-1].integer.value; ;
break;}
case 33:
-#line 457 "cexp.y"
+#line 453 "cexp.y"
{ skip_evaluation += !!yyvsp[-4].integer.value - !yyvsp[-4].integer.value; ;
break;}
case 34:
-#line 459 "cexp.y"
+#line 455 "cexp.y"
{ skip_evaluation -= !!yyvsp[-6].integer.value;
yyval.integer.value = yyvsp[-6].integer.value ? yyvsp[-3].integer.value : yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-3].integer.signedp & yyvsp[0].integer.signedp; ;
break;}
case 35:
-#line 463 "cexp.y"
+#line 459 "cexp.y"
{ yyval.integer = yylval.integer; ;
break;}
case 36:
-#line 465 "cexp.y"
+#line 461 "cexp.y"
{ yyval.integer = yylval.integer; ;
break;}
case 37:
-#line 467 "cexp.y"
+#line 463 "cexp.y"
{ if (warn_undef && !skip_evaluation)
warning ("`%.*s' is not defined",
yyvsp[0].name.length, yyvsp[0].name.address);
@@ -1178,11 +1174,11 @@ case 37:
yyval.integer.signedp = SIGNED; ;
break;}
case 38:
-#line 475 "cexp.y"
+#line 471 "cexp.y"
{ yyval.keywords = 0; ;
break;}
case 39:
-#line 477 "cexp.y"
+#line 473 "cexp.y"
{ struct arglist *temp;
yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
yyval.keywords->next = yyvsp[-2].keywords;
@@ -1197,7 +1193,7 @@ case 39:
temp->next->length = 1; ;
break;}
case 40:
-#line 490 "cexp.y"
+#line 486 "cexp.y"
{ yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
yyval.keywords->name = yyvsp[-1].name.address;
yyval.keywords->length = yyvsp[-1].name.length;
@@ -1401,7 +1397,7 @@ yyerrhandle:
yystate = yyn;
goto yynewstate;
}
-#line 495 "cexp.y"
+#line 491 "cexp.y"
/* During parsing of a C expression, the pointer to the next character
@@ -1610,7 +1606,7 @@ yylex ()
It is mostly copied from c-lex.c. */
{
register HOST_WIDE_INT result = 0;
- register num_chars = 0;
+ register int num_chars = 0;
unsigned width = MAX_CHAR_TYPE_SIZE;
int max_chars;
char *token_buffer;
@@ -1968,17 +1964,20 @@ right_shift (a, b)
/* This page contains the entry point to this file. */
/* Parse STRING as an expression, and complain if this fails
- to use up all of the contents of STRING. */
-/* STRING may contain '\0' bytes; it is terminated by the first '\n'
- outside a string constant, so that we can diagnose '\0' properly. */
-/* We do not support C comments. They should be removed before
+ to use up all of the contents of STRING.
+ STRING may contain '\0' bytes; it is terminated by the first '\n'
+ outside a string constant, so that we can diagnose '\0' properly.
+ If WARN_UNDEFINED is nonzero, warn if undefined identifiers are evaluated.
+ We do not support C comments. They should be removed before
this function is called. */
HOST_WIDE_INT
-parse_c_expression (string)
+parse_c_expression (string, warn_undefined)
char *string;
+ int warn_undefined;
{
lexptr = string;
+ warn_undef = warn_undefined;
/* if there is some sort of scanning error, just return 0 and assume
the parsing routine has printed an error message somewhere.
@@ -2006,6 +2005,7 @@ int traditional;
int main PROTO((int, char **));
static void initialize_random_junk PROTO((void));
+static void print_unsigned_host_wide_int PROTO((unsigned_HOST_WIDE_INT));
/* Main program for testing purposes. */
int
@@ -2015,6 +2015,7 @@ main (argc, argv)
{
int n, c;
char buf[1024];
+ unsigned_HOST_WIDE_INT u;
pedantic = 1 < argc;
traditional = 2 < argc;
@@ -2030,12 +2031,35 @@ main (argc, argv)
n++;
if (c == EOF)
break;
- printf ("parser returned %ld\n", (long) parse_c_expression (buf));
+ parse_c_expression (buf, 1);
+ printf ("parser returned ");
+ u = (unsigned_HOST_WIDE_INT) expression_value;
+ if (expression_value < 0 && expression_signedp) {
+ u = -u;
+ printf ("-");
+ }
+ if (u == 0)
+ printf ("0");
+ else
+ print_unsigned_host_wide_int (u);
+ if (! expression_signedp)
+ printf("u");
+ printf ("\n");
}
return 0;
}
+static void
+print_unsigned_host_wide_int (u)
+ unsigned_HOST_WIDE_INT u;
+{
+ if (u) {
+ print_unsigned_host_wide_int (u / 10);
+ putchar ('0' + (int) (u % 10));
+ }
+}
+
/* table to tell if char can be part of a C identifier. */
unsigned char is_idchar[256];
/* table to tell if char can be first char of a c identifier. */