]> gcc.gnu.org Git - gcc.git/blob - gcc/c-lex.c
c-lex.c (yylex): Initialize traditional_type, ansi_type and type.
[gcc.git] / gcc / c-lex.c
1 /* Lexical analyzer for C and Objective C.
2 Copyright (C) 1987, 88, 89, 92, 94-96, 1997 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "config.h"
22 #include "system.h"
23 #include <setjmp.h>
24
25 #include "rtl.h"
26 #include "tree.h"
27 #include "input.h"
28 #include "c-lex.h"
29 #include "c-tree.h"
30 #include "flags.h"
31 #include "c-parse.h"
32 #include "c-pragma.h"
33
34 /* MULTIBYTE_CHARS support only works for native compilers.
35 ??? Ideally what we want is to model widechar support after
36 the current floating point support. */
37 #ifdef CROSS_COMPILE
38 #undef MULTIBYTE_CHARS
39 #endif
40
41 #ifdef MULTIBYTE_CHARS
42 #include <locale.h>
43 #endif
44
45 #if USE_CPPLIB
46 #include "cpplib.h"
47 cpp_reader parse_in;
48 cpp_options parse_options;
49 static enum cpp_token cpp_token;
50 #endif
51
52 /* The elements of `ridpointers' are identifier nodes
53 for the reserved type names and storage classes.
54 It is indexed by a RID_... value. */
55 tree ridpointers[(int) RID_MAX];
56
57 /* Cause the `yydebug' variable to be defined. */
58 #define YYDEBUG 1
59
60 #if USE_CPPLIB
61 static unsigned char *yy_cur, *yy_lim;
62
63 int
64 yy_get_token ()
65 {
66 for (;;)
67 {
68 parse_in.limit = parse_in.token_buffer;
69 cpp_token = cpp_get_token (&parse_in);
70 if (cpp_token == CPP_EOF)
71 return -1;
72 yy_lim = CPP_PWRITTEN (&parse_in);
73 yy_cur = parse_in.token_buffer;
74 if (yy_cur < yy_lim)
75 return *yy_cur++;
76 }
77 }
78
79 #define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
80 #define UNGETC(c) ((c), yy_cur--)
81 #else
82 #define GETC() getc (finput)
83 #define UNGETC(c) ungetc (c, finput)
84 #endif
85
86 /* the declaration found for the last IDENTIFIER token read in.
87 yylex must look this up to detect typedefs, which get token type TYPENAME,
88 so it is left around in case the identifier is not a typedef but is
89 used in a context which makes it a reference to a variable. */
90 tree lastiddecl;
91
92 /* Nonzero enables objc features. */
93
94 int doing_objc_thang;
95
96 extern tree is_class_name ();
97
98 extern int yydebug;
99
100 /* File used for outputting assembler code. */
101 extern FILE *asm_out_file;
102
103 #ifndef WCHAR_TYPE_SIZE
104 #ifdef INT_TYPE_SIZE
105 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
106 #else
107 #define WCHAR_TYPE_SIZE BITS_PER_WORD
108 #endif
109 #endif
110
111 /* Number of bytes in a wide character. */
112 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
113
114 static int maxtoken; /* Current nominal length of token buffer. */
115 char *token_buffer; /* Pointer to token buffer.
116 Actual allocated length is maxtoken + 2.
117 This is not static because objc-parse.y uses it. */
118
119 static int indent_level = 0; /* Number of { minus number of }. */
120
121 /* Nonzero if end-of-file has been seen on input. */
122 static int end_of_file;
123
124 #if !USE_CPPLIB
125 /* Buffered-back input character; faster than using ungetc. */
126 static int nextchar = -1;
127 #endif
128
129 #ifdef HANDLE_SYSV_PRAGMA
130 static int handle_sysv_pragma PROTO((int));
131 #endif /* HANDLE_SYSV_PRAGMA */
132 static int skip_white_space PROTO((int));
133 static char *extend_token_buffer PROTO((char *));
134 static int readescape PROTO((int *));
135 int check_newline ();
136 \f
137 /* Do not insert generated code into the source, instead, include it.
138 This allows us to build gcc automatically even for targets that
139 need to add or modify the reserved keyword lists. */
140 #include "c-gperf.h"
141 \f
142 /* Return something to represent absolute declarators containing a *.
143 TARGET is the absolute declarator that the * contains.
144 TYPE_QUALS is a list of modifiers such as const or volatile
145 to apply to the pointer type, represented as identifiers.
146
147 We return an INDIRECT_REF whose "contents" are TARGET
148 and whose type is the modifier list. */
149
150 tree
151 make_pointer_declarator (type_quals, target)
152 tree type_quals, target;
153 {
154 return build1 (INDIRECT_REF, type_quals, target);
155 }
156 \f
157 void
158 forget_protocol_qualifiers ()
159 {
160 int i, n = sizeof wordlist / sizeof (struct resword);
161
162 for (i = 0; i < n; i++)
163 if ((int) wordlist[i].rid >= (int) RID_IN
164 && (int) wordlist[i].rid <= (int) RID_ONEWAY)
165 wordlist[i].name = "";
166 }
167
168 void
169 remember_protocol_qualifiers ()
170 {
171 int i, n = sizeof wordlist / sizeof (struct resword);
172
173 for (i = 0; i < n; i++)
174 if (wordlist[i].rid == RID_IN)
175 wordlist[i].name = "in";
176 else if (wordlist[i].rid == RID_OUT)
177 wordlist[i].name = "out";
178 else if (wordlist[i].rid == RID_INOUT)
179 wordlist[i].name = "inout";
180 else if (wordlist[i].rid == RID_BYCOPY)
181 wordlist[i].name = "bycopy";
182 else if (wordlist[i].rid == RID_ONEWAY)
183 wordlist[i].name = "oneway";
184 }
185 \f
186 #if USE_CPPLIB
187 void
188 init_parse (filename)
189 char *filename;
190 {
191 init_lex ();
192 yy_cur = "\n";
193 yy_lim = yy_cur+1;
194
195 cpp_reader_init (&parse_in);
196 parse_in.data = &parse_options;
197 cpp_options_init (&parse_options);
198 cpp_handle_options (&parse_in, 0, NULL); /* FIXME */
199 parse_in.show_column = 1;
200 if (! cpp_start_read (&parse_in, filename))
201 abort ();
202 }
203
204 void
205 finish_parse ()
206 {
207 cpp_finish (&parse_in);
208 }
209 #endif
210
211 void
212 init_lex ()
213 {
214 /* Make identifier nodes long enough for the language-specific slots. */
215 set_identifier_size (sizeof (struct lang_identifier));
216
217 /* Start it at 0, because check_newline is called at the very beginning
218 and will increment it to 1. */
219 lineno = 0;
220
221 #ifdef MULTIBYTE_CHARS
222 /* Change to the native locale for multibyte conversions. */
223 setlocale (LC_CTYPE, "");
224 #endif
225
226 maxtoken = 40;
227 token_buffer = (char *) xmalloc (maxtoken + 2);
228
229 ridpointers[(int) RID_INT] = get_identifier ("int");
230 ridpointers[(int) RID_CHAR] = get_identifier ("char");
231 ridpointers[(int) RID_VOID] = get_identifier ("void");
232 ridpointers[(int) RID_FLOAT] = get_identifier ("float");
233 ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
234 ridpointers[(int) RID_SHORT] = get_identifier ("short");
235 ridpointers[(int) RID_LONG] = get_identifier ("long");
236 ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
237 ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
238 ridpointers[(int) RID_INLINE] = get_identifier ("inline");
239 ridpointers[(int) RID_CONST] = get_identifier ("const");
240 ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
241 ridpointers[(int) RID_AUTO] = get_identifier ("auto");
242 ridpointers[(int) RID_STATIC] = get_identifier ("static");
243 ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
244 ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
245 ridpointers[(int) RID_REGISTER] = get_identifier ("register");
246 ridpointers[(int) RID_ITERATOR] = get_identifier ("iterator");
247 ridpointers[(int) RID_COMPLEX] = get_identifier ("complex");
248 ridpointers[(int) RID_ID] = get_identifier ("id");
249 ridpointers[(int) RID_IN] = get_identifier ("in");
250 ridpointers[(int) RID_OUT] = get_identifier ("out");
251 ridpointers[(int) RID_INOUT] = get_identifier ("inout");
252 ridpointers[(int) RID_BYCOPY] = get_identifier ("bycopy");
253 ridpointers[(int) RID_ONEWAY] = get_identifier ("oneway");
254 forget_protocol_qualifiers();
255
256 /* Some options inhibit certain reserved words.
257 Clear those words out of the hash table so they won't be recognized. */
258 #define UNSET_RESERVED_WORD(STRING) \
259 do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
260 if (s) s->name = ""; } while (0)
261
262 if (! doing_objc_thang)
263 UNSET_RESERVED_WORD ("id");
264
265 if (flag_traditional)
266 {
267 UNSET_RESERVED_WORD ("const");
268 UNSET_RESERVED_WORD ("volatile");
269 UNSET_RESERVED_WORD ("typeof");
270 UNSET_RESERVED_WORD ("signed");
271 UNSET_RESERVED_WORD ("inline");
272 UNSET_RESERVED_WORD ("iterator");
273 UNSET_RESERVED_WORD ("complex");
274 }
275 if (flag_no_asm)
276 {
277 UNSET_RESERVED_WORD ("asm");
278 UNSET_RESERVED_WORD ("typeof");
279 UNSET_RESERVED_WORD ("inline");
280 UNSET_RESERVED_WORD ("iterator");
281 UNSET_RESERVED_WORD ("complex");
282 }
283 }
284
285 void
286 reinit_parse_for_function ()
287 {
288 }
289 \f
290 /* Function used when yydebug is set, to print a token in more detail. */
291
292 void
293 yyprint (file, yychar, yylval)
294 FILE *file;
295 int yychar;
296 YYSTYPE yylval;
297 {
298 tree t;
299 switch (yychar)
300 {
301 case IDENTIFIER:
302 case TYPENAME:
303 case OBJECTNAME:
304 t = yylval.ttype;
305 if (IDENTIFIER_POINTER (t))
306 fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
307 break;
308
309 case CONSTANT:
310 t = yylval.ttype;
311 if (TREE_CODE (t) == INTEGER_CST)
312 fprintf (file,
313 #if HOST_BITS_PER_WIDE_INT == 64
314 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
315 " 0x%x%016x",
316 #else
317 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
318 " 0x%lx%016lx",
319 #else
320 " 0x%llx%016llx",
321 #endif
322 #endif
323 #else
324 #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
325 " 0x%lx%08lx",
326 #else
327 " 0x%x%08x",
328 #endif
329 #endif
330 TREE_INT_CST_HIGH (t), TREE_INT_CST_LOW (t));
331 break;
332 }
333 }
334 \f
335 /* Iff C is a carriage return, warn about it - if appropriate -
336 and return nonzero. */
337 int
338 whitespace_cr (c)
339 int c;
340 {
341 static int newline_warning = 0;
342
343 if (c == '\r')
344 {
345 /* ANSI C says the effects of a carriage return in a source file
346 are undefined. */
347 if (pedantic && !newline_warning)
348 {
349 warning ("carriage return in source file");
350 warning ("(we only warn about the first carriage return)");
351 newline_warning = 1;
352 }
353 return 1;
354 }
355 return 0;
356 }
357
358 /* If C is not whitespace, return C.
359 Otherwise skip whitespace and return first nonwhite char read. */
360
361 static int
362 skip_white_space (c)
363 register int c;
364 {
365 for (;;)
366 {
367 switch (c)
368 {
369 /* We don't recognize comments here, because
370 cpp output can include / and * consecutively as operators.
371 Also, there's no need, since cpp removes all comments. */
372
373 case '\n':
374 c = check_newline ();
375 break;
376
377 case ' ':
378 case '\t':
379 case '\f':
380 case '\v':
381 case '\b':
382 c = GETC();
383 break;
384
385 case '\r':
386 whitespace_cr (c);
387 c = GETC();
388 break;
389
390 case '\\':
391 c = GETC();
392 if (c == '\n')
393 lineno++;
394 else
395 error ("stray '\\' in program");
396 c = GETC();
397 break;
398
399 default:
400 return (c);
401 }
402 }
403 }
404
405 /* Skips all of the white space at the current location in the input file.
406 Must use and reset nextchar if it has the next character. */
407
408 void
409 position_after_white_space ()
410 {
411 register int c;
412
413 #if !USE_CPPLIB
414 if (nextchar != -1)
415 c = nextchar, nextchar = -1;
416 else
417 #endif
418 c = GETC();
419
420 UNGETC (skip_white_space (c));
421 }
422
423 /* Like skip_white_space, but don't advance beyond the end of line.
424 Moreover, we don't get passed a character to start with. */
425 static int
426 skip_white_space_on_line ()
427 {
428 register int c;
429
430 while (1)
431 {
432 c = GETC();
433 switch (c)
434 {
435 case '\n':
436 default:
437 break;
438
439 case ' ':
440 case '\t':
441 case '\f':
442 case '\v':
443 case '\b':
444 continue;
445
446 case '\r':
447 whitespace_cr (c);
448 continue;
449 }
450 break;
451 }
452 return c;
453 }
454
455 /* Make the token buffer longer, preserving the data in it.
456 P should point to just beyond the last valid character in the old buffer.
457 The value we return is a pointer to the new buffer
458 at a place corresponding to P. */
459
460 static char *
461 extend_token_buffer (p)
462 char *p;
463 {
464 int offset = p - token_buffer;
465
466 maxtoken = maxtoken * 2 + 10;
467 token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
468
469 return token_buffer + offset;
470 }
471 \f
472 #if !USE_CPPLIB
473 #define GET_DIRECTIVE_LINE() get_directive_line (finput)
474 #else /* USE_CPPLIB */
475 /* Read the rest of a #-directive from input stream FINPUT.
476 In normal use, the directive name and the white space after it
477 have already been read, so they won't be included in the result.
478 We allow for the fact that the directive line may contain
479 a newline embedded within a character or string literal which forms
480 a part of the directive.
481
482 The value is a string in a reusable buffer. It remains valid
483 only until the next time this function is called. */
484
485 static char *
486 GET_DIRECTIVE_LINE ()
487 {
488 static char *directive_buffer = NULL;
489 static unsigned buffer_length = 0;
490 register char *p;
491 register char *buffer_limit;
492 register int looking_for = 0;
493 register int char_escaped = 0;
494
495 if (buffer_length == 0)
496 {
497 directive_buffer = (char *)xmalloc (128);
498 buffer_length = 128;
499 }
500
501 buffer_limit = &directive_buffer[buffer_length];
502
503 for (p = directive_buffer; ; )
504 {
505 int c;
506
507 /* Make buffer bigger if it is full. */
508 if (p >= buffer_limit)
509 {
510 register unsigned bytes_used = (p - directive_buffer);
511
512 buffer_length *= 2;
513 directive_buffer
514 = (char *)xrealloc (directive_buffer, buffer_length);
515 p = &directive_buffer[bytes_used];
516 buffer_limit = &directive_buffer[buffer_length];
517 }
518
519 c = GETC ();
520
521 /* Discard initial whitespace. */
522 if ((c == ' ' || c == '\t') && p == directive_buffer)
523 continue;
524
525 /* Detect the end of the directive. */
526 if (c == '\n' && looking_for == 0)
527 {
528 UNGETC (c);
529 c = '\0';
530 }
531
532 *p++ = c;
533
534 if (c == 0)
535 return directive_buffer;
536
537 /* Handle string and character constant syntax. */
538 if (looking_for)
539 {
540 if (looking_for == c && !char_escaped)
541 looking_for = 0; /* Found terminator... stop looking. */
542 }
543 else
544 if (c == '\'' || c == '"')
545 looking_for = c; /* Don't stop buffering until we see another
546 another one of these (or an EOF). */
547
548 /* Handle backslash. */
549 char_escaped = (c == '\\' && ! char_escaped);
550 }
551 }
552 #endif /* USE_CPPLIB */
553 \f
554 /* At the beginning of a line, increment the line number
555 and process any #-directive on this line.
556 If the line is a #-directive, read the entire line and return a newline.
557 Otherwise, return the line's first non-whitespace character. */
558
559 int
560 check_newline ()
561 {
562 register int c;
563 register int token;
564
565 lineno++;
566
567 /* Read first nonwhite char on the line. */
568
569 c = GETC();
570 while (c == ' ' || c == '\t')
571 c = GETC();
572
573 if (c != '#')
574 {
575 /* If not #, return it so caller will use it. */
576 return c;
577 }
578
579 /* Read first nonwhite char after the `#'. */
580
581 c = GETC();
582 while (c == ' ' || c == '\t')
583 c = GETC();
584
585 /* If a letter follows, then if the word here is `line', skip
586 it and ignore it; otherwise, ignore the line, with an error
587 if the word isn't `pragma', `ident', `define', or `undef'. */
588
589 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
590 {
591 if (c == 'p')
592 {
593 if (GETC() == 'r'
594 && GETC() == 'a'
595 && GETC() == 'g'
596 && GETC() == 'm'
597 && GETC() == 'a'
598 && ((c = GETC()) == ' ' || c == '\t' || c == '\n'
599 || whitespace_cr (c) ))
600 {
601 while (c == ' ' || c == '\t' || whitespace_cr (c))
602 c = GETC ();
603 if (c == '\n')
604 return c;
605 #ifdef HANDLE_SYSV_PRAGMA
606 UNGETC (c);
607 token = yylex ();
608 if (token != IDENTIFIER)
609 goto skipline;
610 return handle_sysv_pragma (token);
611 #else /* !HANDLE_SYSV_PRAGMA */
612 #ifdef HANDLE_PRAGMA
613 #if !USE_CPPLIB
614 UNGETC (c);
615 token = yylex ();
616 if (token != IDENTIFIER)
617 goto skipline;
618 if (HANDLE_PRAGMA (finput, yylval.ttype))
619 {
620 c = GETC ();
621 return c;
622 }
623 #else
624 ??? do not know what to do ???;
625 #endif /* !USE_CPPLIB */
626 #endif /* HANDLE_PRAGMA */
627 #endif /* !HANDLE_SYSV_PRAGMA */
628 goto skipline;
629 }
630 }
631
632 else if (c == 'd')
633 {
634 if (GETC() == 'e'
635 && GETC() == 'f'
636 && GETC() == 'i'
637 && GETC() == 'n'
638 && GETC() == 'e'
639 && ((c = GETC()) == ' ' || c == '\t' || c == '\n'))
640 {
641 if (c != '\n')
642 debug_define (lineno, GET_DIRECTIVE_LINE ());
643 goto skipline;
644 }
645 }
646 else if (c == 'u')
647 {
648 if (GETC() == 'n'
649 && GETC() == 'd'
650 && GETC() == 'e'
651 && GETC() == 'f'
652 && ((c = GETC()) == ' ' || c == '\t' || c == '\n'))
653 {
654 if (c != '\n')
655 debug_undef (lineno, GET_DIRECTIVE_LINE ());
656 goto skipline;
657 }
658 }
659 else if (c == 'l')
660 {
661 if (GETC() == 'i'
662 && GETC() == 'n'
663 && GETC() == 'e'
664 && ((c = GETC()) == ' ' || c == '\t'))
665 goto linenum;
666 }
667 else if (c == 'i')
668 {
669 if (GETC() == 'd'
670 && GETC() == 'e'
671 && GETC() == 'n'
672 && GETC() == 't'
673 && ((c = GETC()) == ' ' || c == '\t'))
674 {
675 /* #ident. The pedantic warning is now in cccp.c. */
676
677 /* Here we have just seen `#ident '.
678 A string constant should follow. */
679
680 c = skip_white_space_on_line ();
681
682 /* If no argument, ignore the line. */
683 if (c == '\n')
684 return c;
685
686 UNGETC (c);
687 token = yylex ();
688 if (token != STRING
689 || TREE_CODE (yylval.ttype) != STRING_CST)
690 {
691 error ("invalid #ident");
692 goto skipline;
693 }
694
695 if (!flag_no_ident)
696 {
697 #ifdef ASM_OUTPUT_IDENT
698 ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (yylval.ttype));
699 #endif
700 }
701
702 /* Skip the rest of this line. */
703 goto skipline;
704 }
705 }
706
707 error ("undefined or invalid # directive");
708 goto skipline;
709 }
710
711 linenum:
712 /* Here we have either `#line' or `# <nonletter>'.
713 In either case, it should be a line number; a digit should follow. */
714
715 /* Can't use skip_white_space here, but must handle all whitespace
716 that is not '\n', lest we get a recursion for '\r' '\n' when
717 calling yylex. */
718 UNGETC (c);
719 c = skip_white_space_on_line ();
720
721 /* If the # is the only nonwhite char on the line,
722 just ignore it. Check the new newline. */
723 if (c == '\n')
724 return c;
725
726 /* Something follows the #; read a token. */
727
728 UNGETC (c);
729 token = yylex ();
730
731 if (token == CONSTANT
732 && TREE_CODE (yylval.ttype) == INTEGER_CST)
733 {
734 int old_lineno = lineno;
735 int used_up = 0;
736 /* subtract one, because it is the following line that
737 gets the specified number */
738
739 int l = TREE_INT_CST_LOW (yylval.ttype) - 1;
740
741 /* Is this the last nonwhite stuff on the line? */
742 c = skip_white_space_on_line ();
743 if (c == '\n')
744 {
745 /* No more: store the line number and check following line. */
746 lineno = l;
747 return c;
748 }
749 UNGETC (c);
750
751 /* More follows: it must be a string constant (filename). */
752
753 /* Read the string constant. */
754 token = yylex ();
755
756 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
757 {
758 error ("invalid #line");
759 goto skipline;
760 }
761
762 input_filename
763 = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
764 strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
765 lineno = l;
766
767 /* Each change of file name
768 reinitializes whether we are now in a system header. */
769 in_system_header = 0;
770
771 if (main_input_filename == 0)
772 main_input_filename = input_filename;
773
774 /* Is this the last nonwhite stuff on the line? */
775 c = skip_white_space_on_line ();
776 if (c == '\n')
777 {
778 /* Update the name in the top element of input_file_stack. */
779 if (input_file_stack)
780 input_file_stack->name = input_filename;
781
782 return c;
783 }
784 UNGETC (c);
785
786 token = yylex ();
787 used_up = 0;
788
789 /* `1' after file name means entering new file.
790 `2' after file name means just left a file. */
791
792 if (token == CONSTANT
793 && TREE_CODE (yylval.ttype) == INTEGER_CST)
794 {
795 if (TREE_INT_CST_LOW (yylval.ttype) == 1)
796 {
797 /* Pushing to a new file. */
798 struct file_stack *p
799 = (struct file_stack *) xmalloc (sizeof (struct file_stack));
800 input_file_stack->line = old_lineno;
801 p->next = input_file_stack;
802 p->name = input_filename;
803 p->indent_level = indent_level;
804 input_file_stack = p;
805 input_file_stack_tick++;
806 debug_start_source_file (input_filename);
807 used_up = 1;
808 }
809 else if (TREE_INT_CST_LOW (yylval.ttype) == 2)
810 {
811 /* Popping out of a file. */
812 if (input_file_stack->next)
813 {
814 struct file_stack *p = input_file_stack;
815 if (indent_level != p->indent_level)
816 {
817 warning_with_file_and_line
818 (p->name, old_lineno,
819 "This file contains more `%c's than `%c's.",
820 indent_level > p->indent_level ? '{' : '}',
821 indent_level > p->indent_level ? '}' : '{');
822 }
823 input_file_stack = p->next;
824 free (p);
825 input_file_stack_tick++;
826 debug_end_source_file (input_file_stack->line);
827 }
828 else
829 error ("#-lines for entering and leaving files don't match");
830
831 used_up = 1;
832 }
833 }
834
835 /* Now that we've pushed or popped the input stack,
836 update the name in the top element. */
837 if (input_file_stack)
838 input_file_stack->name = input_filename;
839
840 /* If we have handled a `1' or a `2',
841 see if there is another number to read. */
842 if (used_up)
843 {
844 /* Is this the last nonwhite stuff on the line? */
845 c = skip_white_space_on_line ();
846 if (c == '\n')
847 return c;
848 UNGETC (c);
849
850 token = yylex ();
851 used_up = 0;
852 }
853
854 /* `3' after file name means this is a system header file. */
855
856 if (token == CONSTANT
857 && TREE_CODE (yylval.ttype) == INTEGER_CST
858 && TREE_INT_CST_LOW (yylval.ttype) == 3)
859 in_system_header = 1, used_up = 1;
860
861 if (used_up)
862 {
863 /* Is this the last nonwhite stuff on the line? */
864 c = skip_white_space_on_line ();
865 if (c == '\n')
866 return c;
867 UNGETC (c);
868 }
869
870 warning ("unrecognized text at end of #line");
871 }
872 else
873 error ("invalid #-line");
874
875 /* skip the rest of this line. */
876 skipline:
877 #if !USE_CPPLIB
878 if (c != '\n' && c != EOF && nextchar >= 0)
879 c = nextchar, nextchar = -1;
880 #endif
881 while (c != '\n' && c != EOF)
882 c = GETC();
883 return c;
884 }
885 \f
886 #ifdef HANDLE_SYSV_PRAGMA
887
888 /* Handle a #pragma directive.
889 TOKEN is the token we read after `#pragma'. Processes the entire input
890 line and returns a character for the caller to reread: either \n or EOF. */
891
892 /* This function has to be in this file, in order to get at
893 the token types. */
894
895 static int
896 handle_sysv_pragma (token)
897 register int token;
898 {
899 register int c;
900
901 for (;;)
902 {
903 switch (token)
904 {
905 case IDENTIFIER:
906 case TYPENAME:
907 case STRING:
908 case CONSTANT:
909 handle_pragma_token (token_buffer, yylval.ttype);
910 break;
911 default:
912 handle_pragma_token (token_buffer, 0);
913 }
914 #if !USE_CPPLIB
915 if (nextchar >= 0)
916 c = nextchar, nextchar = -1;
917 else
918 #endif
919 c = GETC ();
920
921 while (c == ' ' || c == '\t')
922 c = GETC ();
923 if (c == '\n' || c == EOF)
924 {
925 handle_pragma_token (0, 0);
926 return c;
927 }
928 UNGETC (c);
929 token = yylex ();
930 }
931 }
932
933 #endif /* HANDLE_SYSV_PRAGMA */
934 \f
935 #define ENDFILE -1 /* token that represents end-of-file */
936
937 /* Read an escape sequence, returning its equivalent as a character,
938 or store 1 in *ignore_ptr if it is backslash-newline. */
939
940 static int
941 readescape (ignore_ptr)
942 int *ignore_ptr;
943 {
944 register int c = GETC();
945 register int code;
946 register unsigned count;
947 unsigned firstdig = 0;
948 int nonnull;
949
950 switch (c)
951 {
952 case 'x':
953 if (warn_traditional)
954 warning ("the meaning of `\\x' varies with -traditional");
955
956 if (flag_traditional)
957 return c;
958
959 code = 0;
960 count = 0;
961 nonnull = 0;
962 while (1)
963 {
964 c = GETC();
965 if (!(c >= 'a' && c <= 'f')
966 && !(c >= 'A' && c <= 'F')
967 && !(c >= '0' && c <= '9'))
968 {
969 UNGETC (c);
970 break;
971 }
972 code *= 16;
973 if (c >= 'a' && c <= 'f')
974 code += c - 'a' + 10;
975 if (c >= 'A' && c <= 'F')
976 code += c - 'A' + 10;
977 if (c >= '0' && c <= '9')
978 code += c - '0';
979 if (code != 0 || count != 0)
980 {
981 if (count == 0)
982 firstdig = code;
983 count++;
984 }
985 nonnull = 1;
986 }
987 if (! nonnull)
988 error ("\\x used with no following hex digits");
989 else if (count == 0)
990 /* Digits are all 0's. Ok. */
991 ;
992 else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
993 || (count > 1
994 && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4))
995 <= firstdig)))
996 pedwarn ("hex escape out of range");
997 return code;
998
999 case '0': case '1': case '2': case '3': case '4':
1000 case '5': case '6': case '7':
1001 code = 0;
1002 count = 0;
1003 while ((c <= '7') && (c >= '0') && (count++ < 3))
1004 {
1005 code = (code * 8) + (c - '0');
1006 c = GETC();
1007 }
1008 UNGETC (c);
1009 return code;
1010
1011 case '\\': case '\'': case '"':
1012 return c;
1013
1014 case '\n':
1015 lineno++;
1016 *ignore_ptr = 1;
1017 return 0;
1018
1019 case 'n':
1020 return TARGET_NEWLINE;
1021
1022 case 't':
1023 return TARGET_TAB;
1024
1025 case 'r':
1026 return TARGET_CR;
1027
1028 case 'f':
1029 return TARGET_FF;
1030
1031 case 'b':
1032 return TARGET_BS;
1033
1034 case 'a':
1035 if (warn_traditional)
1036 warning ("the meaning of `\\a' varies with -traditional");
1037
1038 if (flag_traditional)
1039 return c;
1040 return TARGET_BELL;
1041
1042 case 'v':
1043 #if 0 /* Vertical tab is present in common usage compilers. */
1044 if (flag_traditional)
1045 return c;
1046 #endif
1047 return TARGET_VT;
1048
1049 case 'e':
1050 case 'E':
1051 if (pedantic)
1052 pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
1053 return 033;
1054
1055 case '?':
1056 return c;
1057
1058 /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */
1059 case '(':
1060 case '{':
1061 case '[':
1062 /* `\%' is used to prevent SCCS from getting confused. */
1063 case '%':
1064 if (pedantic)
1065 pedwarn ("non-ANSI escape sequence `\\%c'", c);
1066 return c;
1067 }
1068 if (c >= 040 && c < 0177)
1069 pedwarn ("unknown escape sequence `\\%c'", c);
1070 else
1071 pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
1072 return c;
1073 }
1074 \f
1075 void
1076 yyerror (string)
1077 char *string;
1078 {
1079 char buf[200];
1080
1081 strcpy (buf, string);
1082
1083 /* We can't print string and character constants well
1084 because the token_buffer contains the result of processing escapes. */
1085 if (end_of_file)
1086 strcat (buf, " at end of input");
1087 else if (token_buffer[0] == 0)
1088 strcat (buf, " at null character");
1089 else if (token_buffer[0] == '"')
1090 strcat (buf, " before string constant");
1091 else if (token_buffer[0] == '\'')
1092 strcat (buf, " before character constant");
1093 else if (token_buffer[0] < 040 || (unsigned char) token_buffer[0] >= 0177)
1094 sprintf (buf + strlen (buf), " before character 0%o",
1095 (unsigned char) token_buffer[0]);
1096 else
1097 strcat (buf, " before `%s'");
1098
1099 error (buf, token_buffer);
1100 }
1101
1102 #if 0
1103
1104 struct try_type
1105 {
1106 tree *node_var;
1107 char unsigned_flag;
1108 char long_flag;
1109 char long_long_flag;
1110 };
1111
1112 struct try_type type_sequence[] =
1113 {
1114 { &integer_type_node, 0, 0, 0},
1115 { &unsigned_type_node, 1, 0, 0},
1116 { &long_integer_type_node, 0, 1, 0},
1117 { &long_unsigned_type_node, 1, 1, 0},
1118 { &long_long_integer_type_node, 0, 1, 1},
1119 { &long_long_unsigned_type_node, 1, 1, 1}
1120 };
1121 #endif /* 0 */
1122 \f
1123 int
1124 yylex ()
1125 {
1126 register int c;
1127 register char *p;
1128 register int value;
1129 int wide_flag = 0;
1130 int objc_flag = 0;
1131
1132 #if !USE_CPPLIB
1133 if (nextchar >= 0)
1134 c = nextchar, nextchar = -1;
1135 else
1136 #endif
1137 c = GETC();
1138
1139 /* Effectively do c = skip_white_space (c)
1140 but do it faster in the usual cases. */
1141 while (1)
1142 switch (c)
1143 {
1144 case ' ':
1145 case '\t':
1146 case '\f':
1147 case '\v':
1148 case '\b':
1149 c = GETC();
1150 break;
1151
1152 case '\r':
1153 /* Call skip_white_space so we can warn if appropriate. */
1154
1155 case '\n':
1156 case '/':
1157 case '\\':
1158 c = skip_white_space (c);
1159 default:
1160 goto found_nonwhite;
1161 }
1162 found_nonwhite:
1163
1164 token_buffer[0] = c;
1165 token_buffer[1] = 0;
1166
1167 /* yylloc.first_line = lineno; */
1168
1169 switch (c)
1170 {
1171 case EOF:
1172 end_of_file = 1;
1173 token_buffer[0] = 0;
1174 value = ENDFILE;
1175 break;
1176
1177 case 'L':
1178 /* Capital L may start a wide-string or wide-character constant. */
1179 {
1180 register int c = GETC();
1181 if (c == '\'')
1182 {
1183 wide_flag = 1;
1184 goto char_constant;
1185 }
1186 if (c == '"')
1187 {
1188 wide_flag = 1;
1189 goto string_constant;
1190 }
1191 UNGETC (c);
1192 }
1193 goto letter;
1194
1195 case '@':
1196 if (!doing_objc_thang)
1197 {
1198 value = c;
1199 break;
1200 }
1201 else
1202 {
1203 /* '@' may start a constant string object. */
1204 register int c = GETC ();
1205 if (c == '"')
1206 {
1207 objc_flag = 1;
1208 goto string_constant;
1209 }
1210 UNGETC (c);
1211 /* Fall through to treat '@' as the start of an identifier. */
1212 }
1213
1214 case 'A': case 'B': case 'C': case 'D': case 'E':
1215 case 'F': case 'G': case 'H': case 'I': case 'J':
1216 case 'K': case 'M': case 'N': case 'O':
1217 case 'P': case 'Q': case 'R': case 'S': case 'T':
1218 case 'U': case 'V': case 'W': case 'X': case 'Y':
1219 case 'Z':
1220 case 'a': case 'b': case 'c': case 'd': case 'e':
1221 case 'f': case 'g': case 'h': case 'i': case 'j':
1222 case 'k': case 'l': case 'm': case 'n': case 'o':
1223 case 'p': case 'q': case 'r': case 's': case 't':
1224 case 'u': case 'v': case 'w': case 'x': case 'y':
1225 case 'z':
1226 case '_':
1227 case '$':
1228 letter:
1229 p = token_buffer;
1230 while (isalnum (c) || c == '_' || c == '$' || c == '@')
1231 {
1232 /* Make sure this char really belongs in an identifier. */
1233 if (c == '@' && ! doing_objc_thang)
1234 break;
1235 if (c == '$')
1236 {
1237 if (! dollars_in_ident)
1238 error ("`$' in identifier");
1239 else if (pedantic)
1240 pedwarn ("`$' in identifier");
1241 }
1242
1243 if (p >= token_buffer + maxtoken)
1244 p = extend_token_buffer (p);
1245
1246 *p++ = c;
1247 c = GETC();
1248 }
1249
1250 *p = 0;
1251 #if USE_CPPLIB
1252 UNGETC (c);
1253 #else
1254 nextchar = c;
1255 #endif
1256
1257 value = IDENTIFIER;
1258 yylval.itype = 0;
1259
1260 /* Try to recognize a keyword. Uses minimum-perfect hash function */
1261
1262 {
1263 register struct resword *ptr;
1264
1265 if ((ptr = is_reserved_word (token_buffer, p - token_buffer)))
1266 {
1267 if (ptr->rid)
1268 yylval.ttype = ridpointers[(int) ptr->rid];
1269 value = (int) ptr->token;
1270
1271 /* Only return OBJECTNAME if it is a typedef. */
1272 if (doing_objc_thang && value == OBJECTNAME)
1273 {
1274 lastiddecl = lookup_name(yylval.ttype);
1275
1276 if (lastiddecl == NULL_TREE
1277 || TREE_CODE (lastiddecl) != TYPE_DECL)
1278 value = IDENTIFIER;
1279 }
1280
1281 /* Even if we decided to recognize asm, still perhaps warn. */
1282 if (pedantic
1283 && (value == ASM_KEYWORD || value == TYPEOF
1284 || ptr->rid == RID_INLINE)
1285 && token_buffer[0] != '_')
1286 pedwarn ("ANSI does not permit the keyword `%s'",
1287 token_buffer);
1288 }
1289 }
1290
1291 /* If we did not find a keyword, look for an identifier
1292 (or a typename). */
1293
1294 if (value == IDENTIFIER)
1295 {
1296 if (token_buffer[0] == '@')
1297 error("invalid identifier `%s'", token_buffer);
1298
1299 yylval.ttype = get_identifier (token_buffer);
1300 lastiddecl = lookup_name (yylval.ttype);
1301
1302 if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL)
1303 value = TYPENAME;
1304 /* A user-invisible read-only initialized variable
1305 should be replaced by its value.
1306 We handle only strings since that's the only case used in C. */
1307 else if (lastiddecl != 0 && TREE_CODE (lastiddecl) == VAR_DECL
1308 && DECL_IGNORED_P (lastiddecl)
1309 && TREE_READONLY (lastiddecl)
1310 && DECL_INITIAL (lastiddecl) != 0
1311 && TREE_CODE (DECL_INITIAL (lastiddecl)) == STRING_CST)
1312 {
1313 tree stringval = DECL_INITIAL (lastiddecl);
1314
1315 /* Copy the string value so that we won't clobber anything
1316 if we put something in the TREE_CHAIN of this one. */
1317 yylval.ttype = build_string (TREE_STRING_LENGTH (stringval),
1318 TREE_STRING_POINTER (stringval));
1319 value = STRING;
1320 }
1321 else if (doing_objc_thang)
1322 {
1323 tree objc_interface_decl = is_class_name (yylval.ttype);
1324
1325 if (objc_interface_decl)
1326 {
1327 value = CLASSNAME;
1328 yylval.ttype = objc_interface_decl;
1329 }
1330 }
1331 }
1332
1333 break;
1334
1335 case '0': case '1':
1336 {
1337 int next_c;
1338 /* Check first for common special case: single-digit 0 or 1. */
1339
1340 next_c = GETC ();
1341 UNGETC (next_c); /* Always undo this lookahead. */
1342 if (!isalnum (next_c) && next_c != '.')
1343 {
1344 token_buffer[0] = (char)c, token_buffer[1] = '\0';
1345 yylval.ttype = (c == '0') ? integer_zero_node : integer_one_node;
1346 value = CONSTANT;
1347 break;
1348 }
1349 /*FALLTHRU*/
1350 }
1351 case '2': case '3': case '4':
1352 case '5': case '6': case '7': case '8': case '9':
1353 case '.':
1354 {
1355 int base = 10;
1356 int count = 0;
1357 int largest_digit = 0;
1358 int numdigits = 0;
1359 /* for multi-precision arithmetic,
1360 we actually store only HOST_BITS_PER_CHAR bits in each part.
1361 The number of parts is chosen so as to be sufficient to hold
1362 the enough bits to fit into the two HOST_WIDE_INTs that contain
1363 the integer value (this is always at least as many bits as are
1364 in a target `long long' value, but may be wider). */
1365 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2)
1366 int parts[TOTAL_PARTS];
1367 int overflow = 0;
1368
1369 enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag
1370 = NOT_FLOAT;
1371
1372 for (count = 0; count < TOTAL_PARTS; count++)
1373 parts[count] = 0;
1374
1375 p = token_buffer;
1376 *p++ = c;
1377
1378 if (c == '0')
1379 {
1380 *p++ = (c = GETC());
1381 if ((c == 'x') || (c == 'X'))
1382 {
1383 base = 16;
1384 *p++ = (c = GETC());
1385 }
1386 /* Leading 0 forces octal unless the 0 is the only digit. */
1387 else if (c >= '0' && c <= '9')
1388 {
1389 base = 8;
1390 numdigits++;
1391 }
1392 else
1393 numdigits++;
1394 }
1395
1396 /* Read all the digits-and-decimal-points. */
1397
1398 while (c == '.'
1399 || (isalnum (c) && c != 'l' && c != 'L'
1400 && c != 'u' && c != 'U'
1401 && c != 'i' && c != 'I' && c != 'j' && c != 'J'
1402 && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F')))))
1403 {
1404 if (c == '.')
1405 {
1406 if (base == 16)
1407 error ("floating constant may not be in radix 16");
1408 if (floatflag == TOO_MANY_POINTS)
1409 /* We have already emitted an error. Don't need another. */
1410 ;
1411 else if (floatflag == AFTER_POINT)
1412 {
1413 error ("malformed floating constant");
1414 floatflag = TOO_MANY_POINTS;
1415 /* Avoid another error from atof by forcing all characters
1416 from here on to be ignored. */
1417 p[-1] = '\0';
1418 }
1419 else
1420 floatflag = AFTER_POINT;
1421
1422 base = 10;
1423 *p++ = c = GETC();
1424 /* Accept '.' as the start of a floating-point number
1425 only when it is followed by a digit.
1426 Otherwise, unread the following non-digit
1427 and use the '.' as a structural token. */
1428 if (p == token_buffer + 2 && !isdigit (c))
1429 {
1430 if (c == '.')
1431 {
1432 c = GETC();
1433 if (c == '.')
1434 {
1435 *p++ = c;
1436 *p = 0;
1437 return ELLIPSIS;
1438 }
1439 error ("parse error at `..'");
1440 }
1441 UNGETC (c);
1442 token_buffer[1] = 0;
1443 value = '.';
1444 goto done;
1445 }
1446 }
1447 else
1448 {
1449 /* It is not a decimal point.
1450 It should be a digit (perhaps a hex digit). */
1451
1452 if (isdigit (c))
1453 {
1454 c = c - '0';
1455 }
1456 else if (base <= 10)
1457 {
1458 if (c == 'e' || c == 'E')
1459 {
1460 base = 10;
1461 floatflag = AFTER_POINT;
1462 break; /* start of exponent */
1463 }
1464 error ("nondigits in number and not hexadecimal");
1465 c = 0;
1466 }
1467 else if (c >= 'a')
1468 {
1469 c = c - 'a' + 10;
1470 }
1471 else
1472 {
1473 c = c - 'A' + 10;
1474 }
1475 if (c >= largest_digit)
1476 largest_digit = c;
1477 numdigits++;
1478
1479 for (count = 0; count < TOTAL_PARTS; count++)
1480 {
1481 parts[count] *= base;
1482 if (count)
1483 {
1484 parts[count]
1485 += (parts[count-1] >> HOST_BITS_PER_CHAR);
1486 parts[count-1]
1487 &= (1 << HOST_BITS_PER_CHAR) - 1;
1488 }
1489 else
1490 parts[0] += c;
1491 }
1492
1493 /* If the extra highest-order part ever gets anything in it,
1494 the number is certainly too big. */
1495 if (parts[TOTAL_PARTS - 1] != 0)
1496 overflow = 1;
1497
1498 if (p >= token_buffer + maxtoken - 3)
1499 p = extend_token_buffer (p);
1500 *p++ = (c = GETC());
1501 }
1502 }
1503
1504 if (numdigits == 0)
1505 error ("numeric constant with no digits");
1506
1507 if (largest_digit >= base)
1508 error ("numeric constant contains digits beyond the radix");
1509
1510 /* Remove terminating char from the token buffer and delimit the string */
1511 *--p = 0;
1512
1513 if (floatflag != NOT_FLOAT)
1514 {
1515 tree type = double_type_node;
1516 int exceeds_double = 0;
1517 int imag = 0;
1518 REAL_VALUE_TYPE value;
1519 jmp_buf handler;
1520
1521 /* Read explicit exponent if any, and put it in tokenbuf. */
1522
1523 if ((c == 'e') || (c == 'E'))
1524 {
1525 if (p >= token_buffer + maxtoken - 3)
1526 p = extend_token_buffer (p);
1527 *p++ = c;
1528 c = GETC();
1529 if ((c == '+') || (c == '-'))
1530 {
1531 *p++ = c;
1532 c = GETC();
1533 }
1534 if (! isdigit (c))
1535 error ("floating constant exponent has no digits");
1536 while (isdigit (c))
1537 {
1538 if (p >= token_buffer + maxtoken - 3)
1539 p = extend_token_buffer (p);
1540 *p++ = c;
1541 c = GETC();
1542 }
1543 }
1544
1545 *p = 0;
1546 errno = 0;
1547
1548 /* Convert string to a double, checking for overflow. */
1549 if (setjmp (handler))
1550 {
1551 error ("floating constant out of range");
1552 value = dconst0;
1553 }
1554 else
1555 {
1556 int fflag = 0, lflag = 0;
1557 /* Copy token_buffer now, while it has just the number
1558 and not the suffixes; once we add `f' or `i',
1559 REAL_VALUE_ATOF may not work any more. */
1560 char *copy = (char *) alloca (p - token_buffer + 1);
1561 bcopy (token_buffer, copy, p - token_buffer + 1);
1562
1563 set_float_handler (handler);
1564
1565 while (1)
1566 {
1567 int lose = 0;
1568
1569 /* Read the suffixes to choose a data type. */
1570 switch (c)
1571 {
1572 case 'f': case 'F':
1573 if (fflag)
1574 error ("more than one `f' in numeric constant");
1575 fflag = 1;
1576 break;
1577
1578 case 'l': case 'L':
1579 if (lflag)
1580 error ("more than one `l' in numeric constant");
1581 lflag = 1;
1582 break;
1583
1584 case 'i': case 'I':
1585 if (imag)
1586 error ("more than one `i' or `j' in numeric constant");
1587 else if (pedantic)
1588 pedwarn ("ANSI C forbids imaginary numeric constants");
1589 imag = 1;
1590 break;
1591
1592 default:
1593 lose = 1;
1594 }
1595
1596 if (lose)
1597 break;
1598
1599 if (p >= token_buffer + maxtoken - 3)
1600 p = extend_token_buffer (p);
1601 *p++ = c;
1602 *p = 0;
1603 c = GETC();
1604 }
1605
1606 /* The second argument, machine_mode, of REAL_VALUE_ATOF
1607 tells the desired precision of the binary result
1608 of decimal-to-binary conversion. */
1609
1610 if (fflag)
1611 {
1612 if (lflag)
1613 error ("both `f' and `l' in floating constant");
1614
1615 type = float_type_node;
1616 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
1617 /* A diagnostic is required here by some ANSI C testsuites.
1618 This is not pedwarn, become some people don't want
1619 an error for this. */
1620 if (REAL_VALUE_ISINF (value) && pedantic)
1621 warning ("floating point number exceeds range of `float'");
1622 }
1623 else if (lflag)
1624 {
1625 type = long_double_type_node;
1626 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
1627 if (REAL_VALUE_ISINF (value) && pedantic)
1628 warning ("floating point number exceeds range of `long double'");
1629 }
1630 else
1631 {
1632 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
1633 if (REAL_VALUE_ISINF (value) && pedantic)
1634 warning ("floating point number exceeds range of `double'");
1635 }
1636
1637 set_float_handler (NULL_PTR);
1638 }
1639 #ifdef ERANGE
1640 if (errno == ERANGE && !flag_traditional && pedantic)
1641 {
1642 /* ERANGE is also reported for underflow,
1643 so test the value to distinguish overflow from that. */
1644 if (REAL_VALUES_LESS (dconst1, value)
1645 || REAL_VALUES_LESS (value, dconstm1))
1646 {
1647 warning ("floating point number exceeds range of `double'");
1648 exceeds_double = 1;
1649 }
1650 }
1651 #endif
1652
1653 /* If the result is not a number, assume it must have been
1654 due to some error message above, so silently convert
1655 it to a zero. */
1656 if (REAL_VALUE_ISNAN (value))
1657 value = dconst0;
1658
1659 /* Create a node with determined type and value. */
1660 if (imag)
1661 yylval.ttype = build_complex (NULL_TREE,
1662 convert (type, integer_zero_node),
1663 build_real (type, value));
1664 else
1665 yylval.ttype = build_real (type, value);
1666 }
1667 else
1668 {
1669 tree traditional_type, ansi_type, type;
1670 HOST_WIDE_INT high, low;
1671 int spec_unsigned = 0;
1672 int spec_long = 0;
1673 int spec_long_long = 0;
1674 int spec_imag = 0;
1675 int bytes, warn, i;
1676
1677 traditional_type = ansi_type = type = NULL_TREE;
1678 while (1)
1679 {
1680 if (c == 'u' || c == 'U')
1681 {
1682 if (spec_unsigned)
1683 error ("two `u's in integer constant");
1684 spec_unsigned = 1;
1685 }
1686 else if (c == 'l' || c == 'L')
1687 {
1688 if (spec_long)
1689 {
1690 if (spec_long_long)
1691 error ("three `l's in integer constant");
1692 else if (pedantic)
1693 pedwarn ("ANSI C forbids long long integer constants");
1694 spec_long_long = 1;
1695 }
1696 spec_long = 1;
1697 }
1698 else if (c == 'i' || c == 'j' || c == 'I' || c == 'J')
1699 {
1700 if (spec_imag)
1701 error ("more than one `i' or `j' in numeric constant");
1702 else if (pedantic)
1703 pedwarn ("ANSI C forbids imaginary numeric constants");
1704 spec_imag = 1;
1705 }
1706 else
1707 break;
1708 if (p >= token_buffer + maxtoken - 3)
1709 p = extend_token_buffer (p);
1710 *p++ = c;
1711 c = GETC();
1712 }
1713
1714 /* If the constant won't fit in an unsigned long long,
1715 then warn that the constant is out of range. */
1716
1717 /* ??? This assumes that long long and long integer types are
1718 a multiple of 8 bits. This better than the original code
1719 though which assumed that long was exactly 32 bits and long
1720 long was exactly 64 bits. */
1721
1722 bytes = TYPE_PRECISION (long_long_integer_type_node) / 8;
1723
1724 warn = overflow;
1725 for (i = bytes; i < TOTAL_PARTS; i++)
1726 if (parts[i])
1727 warn = 1;
1728 if (warn)
1729 pedwarn ("integer constant out of range");
1730
1731 /* This is simplified by the fact that our constant
1732 is always positive. */
1733
1734 high = low = 0;
1735
1736 for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
1737 {
1738 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
1739 / HOST_BITS_PER_CHAR)]
1740 << (i * HOST_BITS_PER_CHAR));
1741 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
1742 }
1743
1744 yylval.ttype = build_int_2 (low, high);
1745 TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
1746
1747 /* If warn_traditional, calculate both the ANSI type and the
1748 traditional type, then see if they disagree.
1749 Otherwise, calculate only the type for the dialect in use. */
1750 if (warn_traditional || flag_traditional)
1751 {
1752 /* Calculate the traditional type. */
1753 /* Traditionally, any constant is signed;
1754 but if unsigned is specified explicitly, obey that.
1755 Use the smallest size with the right number of bits,
1756 except for one special case with decimal constants. */
1757 if (! spec_long && base != 10
1758 && int_fits_type_p (yylval.ttype, unsigned_type_node))
1759 traditional_type = (spec_unsigned ? unsigned_type_node
1760 : integer_type_node);
1761 /* A decimal constant must be long
1762 if it does not fit in type int.
1763 I think this is independent of whether
1764 the constant is signed. */
1765 else if (! spec_long && base == 10
1766 && int_fits_type_p (yylval.ttype, integer_type_node))
1767 traditional_type = (spec_unsigned ? unsigned_type_node
1768 : integer_type_node);
1769 else if (! spec_long_long)
1770 traditional_type = (spec_unsigned ? long_unsigned_type_node
1771 : long_integer_type_node);
1772 else
1773 traditional_type = (spec_unsigned
1774 ? long_long_unsigned_type_node
1775 : long_long_integer_type_node);
1776 }
1777 if (warn_traditional || ! flag_traditional)
1778 {
1779 /* Calculate the ANSI type. */
1780 if (! spec_long && ! spec_unsigned
1781 && int_fits_type_p (yylval.ttype, integer_type_node))
1782 ansi_type = integer_type_node;
1783 else if (! spec_long && (base != 10 || spec_unsigned)
1784 && int_fits_type_p (yylval.ttype, unsigned_type_node))
1785 ansi_type = unsigned_type_node;
1786 else if (! spec_unsigned && !spec_long_long
1787 && int_fits_type_p (yylval.ttype, long_integer_type_node))
1788 ansi_type = long_integer_type_node;
1789 else if (! spec_long_long
1790 && int_fits_type_p (yylval.ttype,
1791 long_unsigned_type_node))
1792 ansi_type = long_unsigned_type_node;
1793 else if (! spec_unsigned
1794 && int_fits_type_p (yylval.ttype,
1795 long_long_integer_type_node))
1796 ansi_type = long_long_integer_type_node;
1797 else
1798 ansi_type = long_long_unsigned_type_node;
1799 }
1800
1801 type = flag_traditional ? traditional_type : ansi_type;
1802
1803 if (warn_traditional && traditional_type != ansi_type)
1804 {
1805 if (TYPE_PRECISION (traditional_type)
1806 != TYPE_PRECISION (ansi_type))
1807 warning ("width of integer constant changes with -traditional");
1808 else if (TREE_UNSIGNED (traditional_type)
1809 != TREE_UNSIGNED (ansi_type))
1810 warning ("integer constant is unsigned in ANSI C, signed with -traditional");
1811 else
1812 warning ("width of integer constant may change on other systems with -traditional");
1813 }
1814
1815 if (pedantic && !flag_traditional && !spec_long_long && !warn
1816 && (TYPE_PRECISION (long_integer_type_node)
1817 < TYPE_PRECISION (type)))
1818 pedwarn ("integer constant out of range");
1819
1820 if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
1821 warning ("decimal constant is so large that it is unsigned");
1822
1823 if (spec_imag)
1824 {
1825 if (TYPE_PRECISION (type)
1826 <= TYPE_PRECISION (integer_type_node))
1827 yylval.ttype
1828 = build_complex (NULL_TREE, integer_zero_node,
1829 convert (integer_type_node,
1830 yylval.ttype));
1831 else
1832 error ("complex integer constant is too wide for `complex int'");
1833 }
1834 else if (flag_traditional && !int_fits_type_p (yylval.ttype, type))
1835 /* The traditional constant 0x80000000 is signed
1836 but doesn't fit in the range of int.
1837 This will change it to -0x80000000, which does fit. */
1838 {
1839 TREE_TYPE (yylval.ttype) = unsigned_type (type);
1840 yylval.ttype = convert (type, yylval.ttype);
1841 TREE_OVERFLOW (yylval.ttype)
1842 = TREE_CONSTANT_OVERFLOW (yylval.ttype) = 0;
1843 }
1844 else
1845 TREE_TYPE (yylval.ttype) = type;
1846 }
1847
1848 UNGETC (c);
1849 *p = 0;
1850
1851 if (isalnum (c) || c == '.' || c == '_' || c == '$'
1852 || (!flag_traditional && (c == '-' || c == '+')
1853 && (p[-1] == 'e' || p[-1] == 'E')))
1854 error ("missing white space after number `%s'", token_buffer);
1855
1856 value = CONSTANT; break;
1857 }
1858
1859 case '\'':
1860 char_constant:
1861 {
1862 register int result = 0;
1863 register int num_chars = 0;
1864 unsigned width = TYPE_PRECISION (char_type_node);
1865 int max_chars;
1866
1867 if (wide_flag)
1868 {
1869 width = WCHAR_TYPE_SIZE;
1870 #ifdef MULTIBYTE_CHARS
1871 max_chars = MB_CUR_MAX;
1872 #else
1873 max_chars = 1;
1874 #endif
1875 }
1876 else
1877 max_chars = TYPE_PRECISION (integer_type_node) / width;
1878
1879 while (1)
1880 {
1881 tryagain:
1882
1883 c = GETC();
1884
1885 if (c == '\'' || c == EOF)
1886 break;
1887
1888 if (c == '\\')
1889 {
1890 int ignore = 0;
1891 c = readescape (&ignore);
1892 if (ignore)
1893 goto tryagain;
1894 if (width < HOST_BITS_PER_INT
1895 && (unsigned) c >= (1 << width))
1896 pedwarn ("escape sequence out of range for character");
1897 #ifdef MAP_CHARACTER
1898 if (isprint (c))
1899 c = MAP_CHARACTER (c);
1900 #endif
1901 }
1902 else if (c == '\n')
1903 {
1904 if (pedantic)
1905 pedwarn ("ANSI C forbids newline in character constant");
1906 lineno++;
1907 }
1908 #ifdef MAP_CHARACTER
1909 else
1910 c = MAP_CHARACTER (c);
1911 #endif
1912
1913 num_chars++;
1914 if (num_chars > maxtoken - 4)
1915 extend_token_buffer (token_buffer);
1916
1917 token_buffer[num_chars] = c;
1918
1919 /* Merge character into result; ignore excess chars. */
1920 if (num_chars < max_chars + 1)
1921 {
1922 if (width < HOST_BITS_PER_INT)
1923 result = (result << width) | (c & ((1 << width) - 1));
1924 else
1925 result = c;
1926 }
1927 }
1928
1929 token_buffer[num_chars + 1] = '\'';
1930 token_buffer[num_chars + 2] = 0;
1931
1932 if (c != '\'')
1933 error ("malformatted character constant");
1934 else if (num_chars == 0)
1935 error ("empty character constant");
1936 else if (num_chars > max_chars)
1937 {
1938 num_chars = max_chars;
1939 error ("character constant too long");
1940 }
1941 else if (num_chars != 1 && ! flag_traditional)
1942 warning ("multi-character character constant");
1943
1944 /* If char type is signed, sign-extend the constant. */
1945 if (! wide_flag)
1946 {
1947 int num_bits = num_chars * width;
1948 if (num_bits == 0)
1949 /* We already got an error; avoid invalid shift. */
1950 yylval.ttype = build_int_2 (0, 0);
1951 else if (TREE_UNSIGNED (char_type_node)
1952 || ((result >> (num_bits - 1)) & 1) == 0)
1953 yylval.ttype
1954 = build_int_2 (result & (~(unsigned HOST_WIDE_INT) 0
1955 >> (HOST_BITS_PER_WIDE_INT - num_bits)),
1956 0);
1957 else
1958 yylval.ttype
1959 = build_int_2 (result | ~(~(unsigned HOST_WIDE_INT) 0
1960 >> (HOST_BITS_PER_WIDE_INT - num_bits)),
1961 -1);
1962 TREE_TYPE (yylval.ttype) = integer_type_node;
1963 }
1964 else
1965 {
1966 #ifdef MULTIBYTE_CHARS
1967 /* Set the initial shift state and convert the next sequence. */
1968 result = 0;
1969 /* In all locales L'\0' is zero and mbtowc will return zero,
1970 so don't use it. */
1971 if (num_chars > 1
1972 || (num_chars == 1 && token_buffer[1] != '\0'))
1973 {
1974 wchar_t wc;
1975 (void) mbtowc (NULL_PTR, NULL_PTR, 0);
1976 if (mbtowc (& wc, token_buffer + 1, num_chars) == num_chars)
1977 result = wc;
1978 else
1979 warning ("Ignoring invalid multibyte character");
1980 }
1981 #endif
1982 yylval.ttype = build_int_2 (result, 0);
1983 TREE_TYPE (yylval.ttype) = wchar_type_node;
1984 }
1985
1986 value = CONSTANT;
1987 break;
1988 }
1989
1990 case '"':
1991 string_constant:
1992 {
1993 c = GETC();
1994 p = token_buffer + 1;
1995
1996 while (c != '"' && c >= 0)
1997 {
1998 if (c == '\\')
1999 {
2000 int ignore = 0;
2001 c = readescape (&ignore);
2002 if (ignore)
2003 goto skipnewline;
2004 if (!wide_flag
2005 && TYPE_PRECISION (char_type_node) < HOST_BITS_PER_INT
2006 && c >= (1 << TYPE_PRECISION (char_type_node)))
2007 pedwarn ("escape sequence out of range for character");
2008 }
2009 else if (c == '\n')
2010 {
2011 if (pedantic)
2012 pedwarn ("ANSI C forbids newline in string constant");
2013 lineno++;
2014 }
2015
2016 if (p == token_buffer + maxtoken)
2017 p = extend_token_buffer (p);
2018 *p++ = c;
2019
2020 skipnewline:
2021 c = GETC();
2022 }
2023 *p = 0;
2024
2025 if (c < 0)
2026 error ("Unterminated string constant");
2027
2028 /* We have read the entire constant.
2029 Construct a STRING_CST for the result. */
2030
2031 if (wide_flag)
2032 {
2033 /* If this is a L"..." wide-string, convert the multibyte string
2034 to a wide character string. */
2035 char *widep = (char *) alloca ((p - token_buffer) * WCHAR_BYTES);
2036 int len;
2037
2038 #ifdef MULTIBYTE_CHARS
2039 len = mbstowcs ((wchar_t *) widep, token_buffer + 1, p - token_buffer);
2040 if (len < 0 || len >= (p - token_buffer))
2041 {
2042 warning ("Ignoring invalid multibyte string");
2043 len = 0;
2044 }
2045 bzero (widep + (len * WCHAR_BYTES), WCHAR_BYTES);
2046 #else
2047 {
2048 char *wp, *cp;
2049
2050 wp = widep + (BYTES_BIG_ENDIAN ? WCHAR_BYTES - 1 : 0);
2051 bzero (widep, (p - token_buffer) * WCHAR_BYTES);
2052 for (cp = token_buffer + 1; cp < p; cp++)
2053 *wp = *cp, wp += WCHAR_BYTES;
2054 len = p - token_buffer - 1;
2055 }
2056 #endif
2057 yylval.ttype = build_string ((len + 1) * WCHAR_BYTES, widep);
2058 TREE_TYPE (yylval.ttype) = wchar_array_type_node;
2059 value = STRING;
2060 }
2061 else if (objc_flag)
2062 {
2063 extern tree build_objc_string();
2064 /* Return an Objective-C @"..." constant string object. */
2065 yylval.ttype = build_objc_string (p - token_buffer,
2066 token_buffer + 1);
2067 TREE_TYPE (yylval.ttype) = char_array_type_node;
2068 value = OBJC_STRING;
2069 }
2070 else
2071 {
2072 yylval.ttype = build_string (p - token_buffer, token_buffer + 1);
2073 TREE_TYPE (yylval.ttype) = char_array_type_node;
2074 value = STRING;
2075 }
2076
2077 *p++ = '"';
2078 *p = 0;
2079
2080 break;
2081 }
2082
2083 case '+':
2084 case '-':
2085 case '&':
2086 case '|':
2087 case ':':
2088 case '<':
2089 case '>':
2090 case '*':
2091 case '/':
2092 case '%':
2093 case '^':
2094 case '!':
2095 case '=':
2096 {
2097 register int c1;
2098
2099 combine:
2100
2101 switch (c)
2102 {
2103 case '+':
2104 yylval.code = PLUS_EXPR; break;
2105 case '-':
2106 yylval.code = MINUS_EXPR; break;
2107 case '&':
2108 yylval.code = BIT_AND_EXPR; break;
2109 case '|':
2110 yylval.code = BIT_IOR_EXPR; break;
2111 case '*':
2112 yylval.code = MULT_EXPR; break;
2113 case '/':
2114 yylval.code = TRUNC_DIV_EXPR; break;
2115 case '%':
2116 yylval.code = TRUNC_MOD_EXPR; break;
2117 case '^':
2118 yylval.code = BIT_XOR_EXPR; break;
2119 case LSHIFT:
2120 yylval.code = LSHIFT_EXPR; break;
2121 case RSHIFT:
2122 yylval.code = RSHIFT_EXPR; break;
2123 case '<':
2124 yylval.code = LT_EXPR; break;
2125 case '>':
2126 yylval.code = GT_EXPR; break;
2127 }
2128
2129 token_buffer[1] = c1 = GETC();
2130 token_buffer[2] = 0;
2131
2132 if (c1 == '=')
2133 {
2134 switch (c)
2135 {
2136 case '<':
2137 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
2138 case '>':
2139 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
2140 case '!':
2141 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
2142 case '=':
2143 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
2144 }
2145 value = ASSIGN; goto done;
2146 }
2147 else if (c == c1)
2148 switch (c)
2149 {
2150 case '+':
2151 value = PLUSPLUS; goto done;
2152 case '-':
2153 value = MINUSMINUS; goto done;
2154 case '&':
2155 value = ANDAND; goto done;
2156 case '|':
2157 value = OROR; goto done;
2158 case '<':
2159 c = LSHIFT;
2160 goto combine;
2161 case '>':
2162 c = RSHIFT;
2163 goto combine;
2164 }
2165 else
2166 switch (c)
2167 {
2168 case '-':
2169 if (c1 == '>')
2170 { value = POINTSAT; goto done; }
2171 break;
2172 case ':':
2173 if (c1 == '>')
2174 { value = ']'; goto done; }
2175 break;
2176 case '<':
2177 if (c1 == '%')
2178 { value = '{'; indent_level++; goto done; }
2179 if (c1 == ':')
2180 { value = '['; goto done; }
2181 break;
2182 case '%':
2183 if (c1 == '>')
2184 { value = '}'; indent_level--; goto done; }
2185 break;
2186 }
2187 UNGETC (c1);
2188 token_buffer[1] = 0;
2189
2190 if ((c == '<') || (c == '>'))
2191 value = ARITHCOMPARE;
2192 else value = c;
2193 goto done;
2194 }
2195
2196 case 0:
2197 /* Don't make yyparse think this is eof. */
2198 value = 1;
2199 break;
2200
2201 case '{':
2202 indent_level++;
2203 value = c;
2204 break;
2205
2206 case '}':
2207 indent_level--;
2208 value = c;
2209 break;
2210
2211 default:
2212 value = c;
2213 }
2214
2215 done:
2216 /* yylloc.last_line = lineno; */
2217
2218 return value;
2219 }
2220
2221 /* Sets the value of the 'yydebug' variable to VALUE.
2222 This is a function so we don't have to have YYDEBUG defined
2223 in order to build the compiler. */
2224
2225 void
2226 set_yydebug (value)
2227 int value;
2228 {
2229 #if YYDEBUG != 0
2230 yydebug = value;
2231 #else
2232 warning ("YYDEBUG not defined.");
2233 #endif
2234 }
This page took 0.13364 seconds and 6 git commands to generate.