gcc80: Handle TZ specific "%+" format in strftime.
[dragonfly.git] / contrib / gcc-8.0 / gcc / gengtype-parse.c
1 /* Process source files and output type information.
2    Copyright (C) 2006-2018 Free Software Foundation, Inc.
3
4    This file is part of GCC.
5
6    GCC is free software; you can redistribute it and/or modify it under
7    the terms of the GNU General Public License as published by the Free
8    Software Foundation; either version 3, or (at your option) any later
9    version.
10
11    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12    WARRANTY; without even the implied warranty of MERCHANTABILITY or
13    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14    for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GCC; see the file COPYING3.  If not see
18    <http://www.gnu.org/licenses/>.  */
19
20 #ifdef HOST_GENERATOR_FILE
21 #include "config.h"
22 #define GENERATOR_FILE 1
23 #else
24 #include "bconfig.h"
25 #endif
26 #include "system.h"
27 #include "gengtype.h"
28
29 /* This is a simple recursive-descent parser which understands a subset of
30    the C type grammar.
31
32    Rule functions are suffixed _seq if they scan a sequence of items;
33    _opt if they may consume zero tokens; _seqopt if both are true.  The
34    "consume_" prefix indicates that a sequence of tokens is parsed for
35    syntactic correctness and then thrown away.  */
36
37 /* Simple one-token lookahead mechanism.  */
38
39 struct token
40 {
41   const char *value;
42   int code;
43   bool valid;
44 };
45 static struct token T;
46
47 /* Retrieve the code of the current token; if there is no current token,
48    get the next one from the lexer.  */
49 static inline int
50 token (void)
51 {
52   if (!T.valid)
53     {
54       T.code = yylex (&T.value);
55       T.valid = true;
56     }
57   return T.code;
58 }
59
60 /* Retrieve the value of the current token (if any) and mark it consumed.
61    The next call to token() will get another token from the lexer.  */
62 static inline const char *
63 advance (void)
64 {
65   T.valid = false;
66   return T.value;
67 }
68
69 /* Diagnostics.  */
70
71 /* This array is indexed by the token code minus CHAR_TOKEN_OFFSET.  */
72 static const char *const token_names[] = {
73   "GTY",
74   "typedef",
75   "extern",
76   "static",
77   "union",
78   "struct",
79   "enum",
80   "...",
81   "ptr_alias",
82   "nested_ptr",
83   "a param<N>_is option",
84   "a number",
85   "a scalar type",
86   "an identifier",
87   "a string constant",
88   "a character constant",
89   "an array declarator",
90   "a C++ keyword to ignore"
91 };
92
93 /* This array is indexed by token code minus FIRST_TOKEN_WITH_VALUE.  */
94 static const char *const token_value_format[] = {
95   "%s",
96   "'%s'",
97   "'%s'",
98   "'%s'",
99   "'\"%s\"'",
100   "\"'%s'\"",
101   "'[%s]'",
102   "'%s'",
103 };
104
105 /* Produce a printable representation for a token defined by CODE and
106    VALUE.  This sometimes returns pointers into malloc memory and
107    sometimes not, therefore it is unsafe to free the pointer it
108    returns, so that memory is leaked.  This does not matter, as this
109    function is only used for diagnostics, and in a successful run of
110    the program there will be none.  */
111 static const char *
112 print_token (int code, const char *value)
113 {
114   if (code < CHAR_TOKEN_OFFSET)
115     return xasprintf ("'%c'", code);
116   else if (code < FIRST_TOKEN_WITH_VALUE)
117     return xasprintf ("'%s'", token_names[code - CHAR_TOKEN_OFFSET]);
118   else if (!value)
119     return token_names[code - CHAR_TOKEN_OFFSET];       /* don't quote these */
120   else
121     return xasprintf (token_value_format[code - FIRST_TOKEN_WITH_VALUE],
122                       value);
123 }
124
125 /* Convenience wrapper around print_token which produces the printable
126    representation of the current token.  */
127 static inline const char *
128 print_cur_token (void)
129 {
130   return print_token (T.code, T.value);
131 }
132
133 /* Report a parse error on the current line, with diagnostic MSG.
134    Behaves as standard printf with respect to additional arguments and
135    format escapes.  */
136 static void ATTRIBUTE_PRINTF_1
137 parse_error (const char *msg, ...)
138 {
139   va_list ap;
140
141   fprintf (stderr, "%s:%d: parse error: ", 
142            get_input_file_name (lexer_line.file), lexer_line.line);
143
144   va_start (ap, msg);
145   vfprintf (stderr, msg, ap);
146   va_end (ap);
147
148   fputc ('\n', stderr);
149
150   hit_error = true;
151 }
152
153 /* If the next token does not have code T, report a parse error; otherwise
154    return the token's value.  */
155 static const char *
156 require (int t)
157 {
158   int u = token ();
159   const char *v = advance ();
160   if (u != t)
161     {
162       parse_error ("expected %s, have %s",
163                    print_token (t, 0), print_token (u, v));
164       return 0;
165     }
166   return v;
167 }
168
169 /* As per require, but do not advance.  */
170 static const char *
171 require_without_advance (int t)
172 {
173   int u = token ();
174   const char *v = T.value;
175   if (u != t)
176     {
177       parse_error ("expected %s, have %s",
178                    print_token (t, 0), print_token (u, v));
179       return 0;
180     }
181   return v;
182 }
183
184 /* If the next token does not have one of the codes T1 or T2, report a
185    parse error; otherwise return the token's value.  */
186 static const char *
187 require2 (int t1, int t2)
188 {
189   int u = token ();
190   const char *v = advance ();
191   if (u != t1 && u != t2)
192     {
193       parse_error ("expected %s or %s, have %s",
194                    print_token (t1, 0), print_token (t2, 0),
195                    print_token (u, v));
196       return 0;
197     }
198   return v;
199 }
200
201 /* If the next token does not have one of the codes T1, T2, T3 or T4, report a
202    parse error; otherwise return the token's value.  */
203 static const char *
204 require4 (int t1, int t2, int t3, int t4)
205 {
206   int u = token ();
207   const char *v = advance ();
208   if (u != t1 && u != t2 && u != t3 && u != t4)
209     {
210       parse_error ("expected %s, %s, %s or %s, have %s",
211                    print_token (t1, 0), print_token (t2, 0),
212                    print_token (t3, 0), print_token (t4, 0),
213                    print_token (u, v));
214       return 0;
215     }
216   return v;
217 }
218
219 /* Near-terminals.  */
220
221 /* C-style string constant concatenation: STRING+
222    Bare STRING should appear nowhere else in this file.  */
223 static const char *
224 string_seq (void)
225 {
226   const char *s1, *s2;
227   size_t l1, l2;
228   char *buf;
229
230   s1 = require (STRING);
231   if (s1 == 0)
232     return "";
233   while (token () == STRING)
234     {
235       s2 = advance ();
236
237       l1 = strlen (s1);
238       l2 = strlen (s2);
239       buf = XRESIZEVEC (char, CONST_CAST (char *, s1), l1 + l2 + 1);
240       memcpy (buf + l1, s2, l2 + 1);
241       XDELETE (CONST_CAST (char *, s2));
242       s1 = buf;
243     }
244   return s1;
245 }
246
247
248 /* The caller has detected a template declaration that starts
249    with TMPL_NAME.  Parse up to the closing '>'.  This recognizes
250    simple template declarations of the form ID<ID1,ID2,...,IDn>,
251    potentially with a single level of indirection e.g.
252      ID<ID1 *, ID2, ID3 *, ..., IDn>.
253    It does not try to parse anything more sophisticated than that.
254
255    Returns the template declaration string "ID<ID1,ID2,...,IDn>".  */
256
257 static const char *
258 require_template_declaration (const char *tmpl_name)
259 {
260   char *str;
261   int num_indirections = 0;
262
263   /* Recognize the opening '<'.  */
264   require ('<');
265   str = concat (tmpl_name, "<", (char *) 0);
266
267   /* Read the comma-separated list of identifiers.  */
268   int depth = 1;
269   while (depth > 0)
270     {
271       if (token () == ENUM)
272         {
273           advance ();
274           str = concat (str, "enum ", (char *) 0);
275           continue;
276         }
277       if (token () == NUM
278           || token () == ':'
279           || token () == '+')
280         {
281           str = concat (str, advance (), (char *) 0);
282           continue;
283         }
284       if (token () == '<')
285         {
286           advance ();
287           str = concat (str, "<", (char *) 0);
288           depth += 1;
289           continue;
290         }
291       if (token () == '>')
292         {
293           advance ();
294           str = concat (str, ">", (char *) 0);
295           depth -= 1;
296           continue;
297         }
298       const char *id = require4 (SCALAR, ID, '*', ',');
299       if (id == NULL)
300         {
301           if (T.code == '*')
302             {
303               id = "*";
304               if (num_indirections++)
305                 parse_error ("only one level of indirection is supported"
306                              " in template arguments");
307             }
308           else
309             id = ",";
310         }
311       else
312         num_indirections = 0;
313       str = concat (str, id, (char *) 0);
314     }
315   return str;
316 }
317
318
319 /* typedef_name: either an ID, or a template type
320    specification of the form ID<t1,t2,...,tn>.  */
321
322 static const char *
323 typedef_name (void)
324 {
325   const char *id = require (ID);
326   if (token () == '<')
327     return require_template_declaration (id);
328   else
329     return id;
330 }
331
332 /* Absorb a sequence of tokens delimited by balanced ()[]{}.  */
333 static void
334 consume_balanced (int opener, int closer)
335 {
336   require (opener);
337   for (;;)
338     switch (token ())
339       {
340       default:
341         advance ();
342         break;
343       case '(':
344         consume_balanced ('(', ')');
345         break;
346       case '[':
347         consume_balanced ('[', ']');
348         break;
349       case '{':
350         consume_balanced ('{', '}');
351         break;
352
353       case '}':
354       case ']':
355       case ')':
356         if (token () != closer)
357           parse_error ("unbalanced delimiters - expected '%c', have '%c'",
358                        closer, token ());
359       advance ();
360       return;
361
362       case EOF_TOKEN:
363         parse_error ("unexpected end of file within %c%c-delimited construct",
364                      opener, closer);
365         return;
366       }
367 }
368
369 /* Absorb a sequence of tokens, possibly including ()[]{}-delimited
370    expressions, until we encounter an end-of-statement marker (a ';' or
371    a '}') outside any such delimiters; absorb that too.  */
372
373 static void
374 consume_until_eos (void)
375 {
376   for (;;)
377     switch (token ())
378       {
379       case ';':
380         advance ();
381         return;
382
383       case '{':
384         consume_balanced ('{', '}');
385         return;
386
387       case '(':
388         consume_balanced ('(', ')');
389         break;
390
391       case '[':
392         consume_balanced ('[', ']');
393         break;
394
395       case '}':
396       case ']':
397       case ')':
398         parse_error ("unmatched '%c' while scanning for ';'", token ());
399         return;
400
401       case EOF_TOKEN:
402         parse_error ("unexpected end of file while scanning for ';'");
403         return;
404
405       default:
406         advance ();
407         break;
408       }
409 }
410
411 /* Absorb a sequence of tokens, possibly including ()[]{}-delimited
412    expressions, until we encounter a comma or semicolon outside any
413    such delimiters; absorb that too.  Returns true if the loop ended
414    with a comma.  */
415
416 static bool
417 consume_until_comma_or_eos ()
418 {
419   for (;;)
420     switch (token ())
421       {
422       case ',':
423         advance ();
424         return true;
425
426       case ';':
427         advance ();
428         return false;
429
430       case '{':
431         consume_balanced ('{', '}');
432         return false;
433
434       case '(':
435         consume_balanced ('(', ')');
436         break;
437
438       case '[':
439         consume_balanced ('[', ']');
440         break;
441
442       case '}':
443       case ']':
444       case ')':
445         parse_error ("unmatched '%s' while scanning for ',' or ';'",
446                      print_cur_token ());
447       return false;
448
449       case EOF_TOKEN:
450         parse_error ("unexpected end of file while scanning for ',' or ';'");
451         return false;
452
453       default:
454         advance ();
455         break;
456       }
457 }
458 \f
459
460 /* GTY(()) option handling.  */
461 static type_p type (options_p *optsp, bool nested);
462
463 /* Optional parenthesized string: ('(' string_seq ')')? */
464 static options_p
465 str_optvalue_opt (options_p prev)
466 {
467   const char *name = advance ();
468   const char *value = "";
469   if (token () == '(')
470     {
471       advance ();
472       value = string_seq ();
473       require (')');
474     }
475   return create_string_option (prev, name, value);
476 }
477
478 /* absdecl: type '*'*
479    -- a vague approximation to what the C standard calls an abstract
480    declarator.  The only kinds that are actually used are those that
481    are just a bare type and those that have trailing pointer-stars.
482    Further kinds should be implemented if and when they become
483    necessary.  Used only within GTY(()) option values, therefore
484    further GTY(()) tags within the type are invalid.  Note that the
485    return value has already been run through adjust_field_type.  */
486 static type_p
487 absdecl (void)
488 {
489   type_p ty;
490   options_p opts;
491
492   ty = type (&opts, true);
493   while (token () == '*')
494     {
495       ty = create_pointer (ty);
496       advance ();
497     }
498
499   if (opts)
500     parse_error ("nested GTY(()) options are invalid");
501
502   return adjust_field_type (ty, 0);
503 }
504
505 /* Type-option: '(' absdecl ')' */
506 static options_p
507 type_optvalue (options_p prev, const char *name)
508 {
509   type_p ty;
510   require ('(');
511   ty = absdecl ();
512   require (')');
513   return create_type_option (prev, name, ty);
514 }
515
516 /* Nested pointer data: '(' type '*'* ',' string_seq ',' string_seq ')' */
517 static options_p
518 nestedptr_optvalue (options_p prev)
519 {
520   type_p ty;
521   const char *from, *to;
522
523   require ('(');
524   ty = absdecl ();
525   require (',');
526   to = string_seq ();
527   require (',');
528   from = string_seq ();
529   require (')');
530
531   return create_nested_ptr_option (prev, ty, to, from);
532 }
533
534 /* One GTY(()) option:
535    ID str_optvalue_opt
536    | PTR_ALIAS type_optvalue
537    | NESTED_PTR nestedptr_optvalue
538 */
539 static options_p
540 option (options_p prev)
541 {
542   switch (token ())
543     {
544     case ID:
545       return str_optvalue_opt (prev);
546
547     case PTR_ALIAS:
548       advance ();
549       return type_optvalue (prev, "ptr_alias");
550
551     case NESTED_PTR:
552       advance ();
553       return nestedptr_optvalue (prev);
554
555     case USER_GTY:
556       advance ();
557       return create_string_option (prev, "user", "");
558
559     default:
560       parse_error ("expected an option keyword, have %s", print_cur_token ());
561       advance ();
562       return create_string_option (prev, "", "");
563     }
564 }
565
566 /* One comma-separated list of options.  */
567 static options_p
568 option_seq (void)
569 {
570   options_p o;
571
572   o = option (0);
573   while (token () == ',')
574     {
575       advance ();
576       o = option (o);
577     }
578   return o;
579 }
580
581 /* GTY marker: 'GTY' '(' '(' option_seq? ')' ')' */
582 static options_p
583 gtymarker (void)
584 {
585   options_p result = 0;
586   require (GTY_TOKEN);
587   require ('(');
588   require ('(');
589   if (token () != ')')
590     result = option_seq ();
591   require (')');
592   require (')');
593   return result;
594 }
595
596 /* Optional GTY marker.  */
597 static options_p
598 gtymarker_opt (void)
599 {
600   if (token () != GTY_TOKEN)
601     return 0;
602   return gtymarker ();
603 }
604
605
606 \f
607 /* Declarators. The logic here is largely lifted from c-parser.c.
608    Note that we do not have to process abstract declarators, which can
609    appear only in parameter type lists or casts (but see absdecl,
610    above).  Also, type qualifiers are thrown out in gengtype-lex.l so
611    we don't have to do it.  */
612
613 /* array_and_function_declarators_opt:
614    \epsilon
615    array_and_function_declarators_opt ARRAY
616    array_and_function_declarators_opt '(' ... ')'
617
618    where '...' indicates stuff we ignore except insofar as grouping
619    symbols ()[]{} must balance.
620
621    Subroutine of direct_declarator - do not use elsewhere. */
622
623 static type_p
624 array_and_function_declarators_opt (type_p ty)
625 {
626   if (token () == ARRAY)
627     {
628       const char *array = advance ();
629       return create_array (array_and_function_declarators_opt (ty), array);
630     }
631   else if (token () == '(')
632     {
633       /* We don't need exact types for functions.  */
634       consume_balanced ('(', ')');
635       array_and_function_declarators_opt (ty);
636       return create_scalar_type ("function type");
637     }
638   else
639     return ty;
640 }
641
642 static type_p inner_declarator (type_p, const char **, options_p *, bool);
643
644 /* direct_declarator:
645    '(' inner_declarator ')'
646    '(' \epsilon ')'     <-- C++ ctors/dtors
647    gtymarker_opt ID array_and_function_declarators_opt
648
649    Subroutine of declarator, mutually recursive with inner_declarator;
650    do not use elsewhere.
651
652    IN_STRUCT is true if we are called while parsing structures or classes.  */
653
654 static type_p
655 direct_declarator (type_p ty, const char **namep, options_p *optsp,
656                    bool in_struct)
657 {
658   /* The first token in a direct-declarator must be an ID, a
659      GTY marker, or an open parenthesis.  */
660   switch (token ())
661     {
662     case GTY_TOKEN:
663       *optsp = gtymarker ();
664       /* fall through */
665
666     case ID:
667       *namep = require (ID);
668       /* If the next token is '(', we are parsing a function declaration.
669          Functions are ignored by gengtype, so we return NULL.  */
670       if (token () == '(')
671         return NULL;
672       break;
673
674     case '(':
675       /* If the declarator starts with a '(', we have three options.  We
676          are either parsing 'TYPE (*ID)' (i.e., a function pointer)
677          or 'TYPE(...)'.
678
679          The latter will be a constructor iff we are inside a
680          structure or class.  Otherwise, it could be a typedef, but
681          since we explicitly reject typedefs inside structures, we can
682          assume that we found a ctor and return NULL.  */
683       advance ();
684       if (in_struct && token () != '*')
685         {
686           /* Found a constructor.  Find and consume the closing ')'.  */
687           while (token () != ')')
688             advance ();
689           advance ();
690           /* Tell the caller to ignore this.  */
691           return NULL;
692         }
693       ty = inner_declarator (ty, namep, optsp, in_struct);
694       require (')');
695       break;
696
697     case IGNORABLE_CXX_KEYWORD:
698       /* Any C++ keyword like 'operator' means that we are not looking
699          at a regular data declarator.  */
700       return NULL;
701
702     default:
703       parse_error ("expected '(', ')', 'GTY', or an identifier, have %s",
704                    print_cur_token ());
705       /* Do _not_ advance if what we have is a close squiggle brace, as
706          we will get much better error recovery that way.  */
707       if (token () != '}')
708         advance ();
709       return 0;
710     }
711   return array_and_function_declarators_opt (ty);
712 }
713
714 /* The difference between inner_declarator and declarator is in the
715    handling of stars.  Consider this declaration:
716
717    char * (*pfc) (void)
718
719    It declares a pointer to a function that takes no arguments and
720    returns a char*.  To construct the correct type for this
721    declaration, the star outside the parentheses must be processed
722    _before_ the function type, the star inside the parentheses must
723    be processed _after_ the function type.  To accomplish this,
724    declarator() creates pointers before recursing (it is actually
725    coded as a while loop), whereas inner_declarator() recurses before
726    creating pointers.  */
727
728 /* inner_declarator:
729    '*' inner_declarator
730    direct_declarator
731
732    Mutually recursive subroutine of direct_declarator; do not use
733    elsewhere.
734
735    IN_STRUCT is true if we are called while parsing structures or classes.  */
736
737 static type_p
738 inner_declarator (type_p ty, const char **namep, options_p *optsp,
739                   bool in_struct)
740 {
741   if (token () == '*')
742     {
743       type_p inner;
744       advance ();
745       inner = inner_declarator (ty, namep, optsp, in_struct);
746       if (inner == 0)
747         return 0;
748       else
749         return create_pointer (ty);
750     }
751   else
752     return direct_declarator (ty, namep, optsp, in_struct);
753 }
754
755 /* declarator: '*'+ direct_declarator
756
757    This is the sole public interface to this part of the grammar.
758    Arguments are the type known so far, a pointer to where the name
759    may be stored, and a pointer to where GTY options may be stored.
760
761    IN_STRUCT is true when we are called to parse declarators inside
762    a structure or class.
763
764    Returns the final type.  */
765
766 static type_p
767 declarator (type_p ty, const char **namep, options_p *optsp,
768             bool in_struct = false)
769 {
770   *namep = 0;
771   *optsp = 0;
772   while (token () == '*')
773     {
774       advance ();
775       ty = create_pointer (ty);
776     }
777   return direct_declarator (ty, namep, optsp, in_struct);
778 }
779 \f
780 /* Types and declarations.  */
781
782 /* Structure field(s) declaration:
783    (
784    type bitfield ';'
785    | type declarator bitfield? ( ',' declarator bitfield? )+ ';'
786    )*
787
788    Knows that such declarations must end with a close brace (or,
789    erroneously, at EOF).
790 */
791 static pair_p
792 struct_field_seq (void)
793 {
794   pair_p f = 0;
795   type_p ty, dty;
796   options_p opts, dopts;
797   const char *name;
798   bool another;
799
800   while (token () != '}' && token () != EOF_TOKEN)
801     {
802       ty = type (&opts, true);
803
804       /* Ignore access-control keywords ("public:" etc).  */
805       while (!ty && token () == IGNORABLE_CXX_KEYWORD)
806         {
807           const char *keyword = advance ();
808           if (strcmp (keyword, "public:") != 0
809               && strcmp (keyword, "private:") != 0
810               && strcmp (keyword, "protected:") != 0)
811             break;
812           ty = type (&opts, true);
813         }
814
815       if (!ty || token () == ':')
816         {
817           consume_until_eos ();
818           continue;
819         }
820
821       do
822         {
823           dty = declarator (ty, &name, &dopts, true);
824
825           /* There could be any number of weird things after the declarator,
826              notably bitfield declarations and __attribute__s.  If this
827              function returns true, the last thing was a comma, so we have
828              more than one declarator paired with the current type.  */
829           another = consume_until_comma_or_eos ();
830
831           if (!dty)
832             continue;
833
834           if (opts && dopts)
835             parse_error ("two GTY(()) options for field %s", name);
836           if (opts && !dopts)
837             dopts = opts;
838
839           f = create_field_at (f, dty, name, dopts, &lexer_line);
840         }
841       while (another);
842     }
843   return nreverse_pairs (f);
844 }
845
846 /* Return true if OPTS contain the option named STR.  */
847
848 bool
849 opts_have (options_p opts, const char *str)
850 {
851   for (options_p opt = opts; opt; opt = opt->next)
852     if (strcmp (opt->name, str) == 0)
853       return true;
854   return false;
855 }
856
857
858 /* This is called type(), but what it parses (sort of) is what C calls
859    declaration-specifiers and specifier-qualifier-list:
860
861    SCALAR
862    | ID     // typedef
863    | (STRUCT|UNION) ID? gtymarker? ( '{' gtymarker? struct_field_seq '}' )?
864    | ENUM ID ( '{' ... '}' )?
865
866    Returns a partial type; under some conditions (notably
867    "struct foo GTY((...)) thing;") it may write an options
868    structure to *OPTSP.
869
870    NESTED is true when parsing a declaration already known to have a
871    GTY marker. In these cases, typedef and enum declarations are not
872    allowed because gengtype only understands types at the global
873    scope.  */
874
875 static type_p
876 type (options_p *optsp, bool nested)
877 {
878   const char *s;
879   *optsp = 0;
880   switch (token ())
881     {
882     case SCALAR:
883       s = advance ();
884       return create_scalar_type (s);
885
886     case ID:
887       s = typedef_name ();
888       return resolve_typedef (s, &lexer_line);
889
890     case IGNORABLE_CXX_KEYWORD:
891       /* By returning NULL here, we indicate to the caller that they
892          should ignore everything following this keyword up to the
893          next ';' or '}'.  */
894       return NULL;
895
896     case STRUCT:
897     case UNION:
898       {
899         type_p base_class = NULL;
900         options_p opts = 0;
901         /* GTY annotations follow attribute syntax
902            GTY_BEFORE_ID is for union/struct declarations
903            GTY_AFTER_ID is for variable declarations.  */
904         enum
905         {
906           NO_GTY,
907           GTY_BEFORE_ID,
908           GTY_AFTER_ID
909         } is_gty = NO_GTY;
910         enum typekind kind = (token () == UNION) ? TYPE_UNION : TYPE_STRUCT;
911         advance ();
912
913         /* Top-level structures that are not explicitly tagged GTY(())
914            are treated as mere forward declarations.  This is because
915            there are a lot of structures that we don't need to know
916            about, and some of those have C++ and macro constructs that
917            we cannot handle.  */
918         if (nested || token () == GTY_TOKEN)
919           {
920             is_gty = GTY_BEFORE_ID;
921             opts = gtymarker_opt ();
922           }
923
924         if (token () == ID)
925           s = advance ();
926         else
927           s = xasprintf ("anonymous:%s:%d",
928                          get_input_file_name (lexer_line.file),
929                          lexer_line.line);
930
931         /* Unfortunately above GTY_TOKEN check does not capture the
932            typedef struct_type GTY case.  */
933         if (token () == GTY_TOKEN)
934           {
935             is_gty = GTY_AFTER_ID;
936             opts = gtymarker_opt ();
937           }
938
939         bool is_user_gty = opts_have (opts, "user");
940
941         if (token () == ':')
942           {
943             if (is_gty && !is_user_gty)
944               {
945                 /* For GTY-marked types that are not "user", parse some C++
946                    inheritance specifications.
947                    We require single-inheritance from a non-template type.  */
948                 advance ();
949                 const char *basename = require (ID);
950                 /* This may be either an access specifier, or the base name.  */
951                 if (strcmp (basename, "public") == 0
952                     || strcmp (basename, "protected") == 0
953                     || strcmp (basename, "private") == 0)
954                   basename = require (ID);
955                 base_class = find_structure (basename, TYPE_STRUCT);
956                 if (!base_class)
957                   parse_error ("unrecognized base class: %s", basename);
958                 require_without_advance ('{');
959               }
960             else
961               {
962                 /* For types lacking GTY-markings, skip over C++ inheritance
963                    specification (and thus avoid having to parse e.g. template
964                    types).  */
965                 while (token () != '{')
966                   advance ();
967               }
968           }
969
970         if (is_gty)
971           {
972             if (token () == '{')
973               {
974                 pair_p fields;
975
976                 if (is_gty == GTY_AFTER_ID)
977                   parse_error ("GTY must be specified before identifier");
978
979                 if (!is_user_gty)
980                   {
981                     advance ();
982                     fields = struct_field_seq ();
983                     require ('}');
984                   }
985                 else
986                   {
987                     /* Do not look inside user defined structures.  */
988                     fields = NULL;
989                     kind = TYPE_USER_STRUCT;
990                     consume_balanced ('{', '}');
991                     return create_user_defined_type (s, &lexer_line);
992                   }
993
994                 return new_structure (s, kind, &lexer_line, fields, opts,
995                                       base_class);
996               }
997           }
998         else if (token () == '{')
999           consume_balanced ('{', '}');
1000         if (opts)
1001           *optsp = opts;
1002         return find_structure (s, kind);
1003       }
1004
1005     case TYPEDEF:
1006       /* In C++, a typedef inside a struct/class/union defines a new
1007          type for that inner scope.  We cannot support this in
1008          gengtype because we have no concept of scoping.
1009
1010          We handle typedefs in the global scope separately (see
1011          parse_file), so if we find a 'typedef', we must be inside
1012          a struct.  */
1013       gcc_assert (nested);
1014       parse_error ("typedefs not supported in structures marked with "
1015                    "automatic GTY markers.  Use GTY((user)) to mark "
1016                    "this structure.");
1017       advance ();
1018       return NULL;
1019
1020     case ENUM:
1021       advance ();
1022       if (token () == ID)
1023         s = advance ();
1024       else
1025         s = xasprintf ("anonymous:%s:%d",
1026                        get_input_file_name (lexer_line.file),
1027                        lexer_line.line);
1028
1029       if (token () == '{')
1030         consume_balanced ('{', '}');
1031
1032       /* If after parsing the enum we are at the end of the statement,
1033          and we are currently inside a structure, then this was an
1034          enum declaration inside this scope.
1035
1036          We cannot support this for the same reason we cannot support
1037          'typedef' inside structures (see the TYPEDEF handler above).
1038          If this happens, emit an error and return NULL.  */
1039       if (nested && token () == ';')
1040         {
1041           parse_error ("enum definitions not supported in structures marked "
1042                        "with automatic GTY markers.  Use GTY((user)) to mark "
1043                        "this structure.");
1044           advance ();
1045           return NULL;
1046         }
1047
1048       return create_scalar_type (s);
1049
1050     default:
1051       parse_error ("expected a type specifier, have %s", print_cur_token ());
1052       advance ();
1053       return create_scalar_type ("erroneous type");
1054     }
1055 }
1056 \f
1057 /* Top level constructs.  */
1058
1059 /* Dispatch declarations beginning with 'typedef'.  */
1060
1061 static void
1062 typedef_decl (void)
1063 {
1064   type_p ty, dty;
1065   const char *name;
1066   options_p opts;
1067   bool another;
1068
1069   gcc_assert (token () == TYPEDEF);
1070   advance ();
1071
1072   ty = type (&opts, false);
1073   if (!ty)
1074     return;
1075   if (opts)
1076     parse_error ("GTY((...)) cannot be applied to a typedef");
1077   do
1078     {
1079       dty = declarator (ty, &name, &opts);
1080       if (opts)
1081         parse_error ("GTY((...)) cannot be applied to a typedef");
1082
1083       /* Yet another place where we could have junk (notably attributes)
1084          after the declarator.  */
1085       another = consume_until_comma_or_eos ();
1086       if (dty)
1087         do_typedef (name, dty, &lexer_line);
1088     }
1089   while (another);
1090 }
1091
1092 /* Structure definition: type() does all the work.  */
1093
1094 static void
1095 struct_or_union (void)
1096 {
1097   options_p dummy;
1098   type (&dummy, false);
1099   /* There may be junk after the type: notably, we cannot currently
1100      distinguish 'struct foo *function(prototype);' from 'struct foo;'
1101      ...  we could call declarator(), but it's a waste of time at
1102      present.  Instead, just eat whatever token is currently lookahead
1103      and go back to lexical skipping mode. */
1104   advance ();
1105 }
1106
1107 /* GC root declaration:
1108    (extern|static) gtymarker? type ID array_declarators_opt (';'|'=')
1109    If the gtymarker is not present, we ignore the rest of the declaration.  */
1110 static void
1111 extern_or_static (void)
1112 {
1113   options_p opts, opts2, dopts;
1114   type_p ty, dty;
1115   const char *name;
1116   require2 (EXTERN, STATIC);
1117
1118   if (token () != GTY_TOKEN)
1119     {
1120       advance ();
1121       return;
1122     }
1123
1124   opts = gtymarker ();
1125   ty = type (&opts2, true);     /* if we get here, it's got a GTY(()) */
1126   dty = declarator (ty, &name, &dopts);
1127
1128   if ((opts && dopts) || (opts && opts2) || (opts2 && dopts))
1129     parse_error ("GTY((...)) specified more than once for %s", name);
1130   else if (opts2)
1131     opts = opts2;
1132   else if (dopts)
1133     opts = dopts;
1134
1135   if (dty)
1136     {
1137       note_variable (name, adjust_field_type (dty, opts), opts, &lexer_line);
1138       require2 (';', '=');
1139     }
1140 }
1141
1142 /* Parse the file FNAME for GC-relevant declarations and definitions.
1143    This is the only entry point to this file.  */
1144 void
1145 parse_file (const char *fname)
1146 {
1147   yybegin (fname);
1148   for (;;)
1149     {
1150       switch (token ())
1151         {
1152         case EXTERN:
1153         case STATIC:
1154           extern_or_static ();
1155           break;
1156
1157         case STRUCT:
1158         case UNION:
1159           struct_or_union ();
1160           break;
1161
1162         case TYPEDEF:
1163           typedef_decl ();
1164           break;
1165
1166         case EOF_TOKEN:
1167           goto eof;
1168
1169         default:
1170           parse_error ("unexpected top level token, %s", print_cur_token ());
1171           goto eof;
1172         }
1173       lexer_toplevel_done = 1;
1174     }
1175
1176  eof:
1177   advance ();
1178   yyend ();
1179 }