diff options
author | Jeff Law <law@gcc.gnu.org> | 1997-12-06 10:30:09 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-12-06 10:30:09 -0700 |
commit | 27b6b158c29b45fd80c2f104d5da1f4bc818d7ab (patch) | |
tree | 9c7c51a3a8bfd63cf7d84a535015234d31dc02f3 /gcc/cexp.c | |
parent | db2a8c5b6d1f4ac88a5dc270f3be8a8902e4fddb (diff) | |
download | gcc-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.c | 172 |
1 files changed, 98 insertions, 74 deletions
@@ -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. */ |