OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [c-parser.c] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Parser for C and Objective-C.
2
   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
 
5
   Parser actions based on the old Bison parser; structure somewhat
6
   influenced by and fragments based on the C++ parser.
7
 
8
This file is part of GCC.
9
 
10
GCC is free software; you can redistribute it and/or modify it under
11
the terms of the GNU General Public License as published by the Free
12
Software Foundation; either version 2, or (at your option) any later
13
version.
14
 
15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16
WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18
for more details.
19
 
20
You should have received a copy of the GNU General Public License
21
along with GCC; see the file COPYING.  If not, write to the Free
22
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
23
02110-1301, USA.  */
24
 
25
/* TODO:
26
 
27
   Make sure all relevant comments, and all relevant code from all
28
   actions, brought over from old parser.  Verify exact correspondence
29
   of syntax accepted.
30
 
31
   Add testcases covering every input symbol in every state in old and
32
   new parsers.
33
 
34
   Include full syntax for GNU C, including erroneous cases accepted
35
   with error messages, in syntax productions in comments.
36
 
37
   Make more diagnostics in the front end generally take an explicit
38
   location rather than implicitly using input_location.  */
39
 
40
#include "config.h"
41
#include "system.h"
42
#include "coretypes.h"
43
#include "tm.h"
44
#include "tree.h"
45
#include "langhooks.h"
46
#include "input.h"
47
#include "cpplib.h"
48
#include "timevar.h"
49
#include "c-pragma.h"
50
#include "c-tree.h"
51
#include "flags.h"
52
#include "output.h"
53
#include "toplev.h"
54
#include "ggc.h"
55
#include "c-common.h"
56
 
57
 
58
/* Miscellaneous data and functions needed for the parser.  */
59
 
60
int yydebug;
61
 
62
/* Objective-C specific parser/lexer information.  */
63
 
64
static int objc_pq_context = 0;
65
 
66
/* The following flag is needed to contextualize Objective-C lexical
67
   analysis.  In some cases (e.g., 'int NSObject;'), it is undesirable
68
   to bind an identifier to an Objective-C class, even if a class with
69
   that name exists.  */
70
static int objc_need_raw_identifier = 0;
71
#define OBJC_NEED_RAW_IDENTIFIER(VAL)           \
72
  do {                                          \
73
    if (c_dialect_objc ())                      \
74
      objc_need_raw_identifier = VAL;           \
75
  } while (0)
76
 
77
/* The reserved keyword table.  */
78
struct resword
79
{
80
  const char *word;
81
  ENUM_BITFIELD(rid) rid : 16;
82
  unsigned int disable   : 16;
83
};
84
 
85
/* Disable mask.  Keywords are disabled if (reswords[i].disable &
86
   mask) is _true_.  */
87
#define D_C89   0x01    /* not in C89 */
88
#define D_EXT   0x02    /* GCC extension */
89
#define D_EXT89 0x04    /* GCC extension incorporated in C99 */
90
#define D_OBJC  0x08    /* Objective C only */
91
 
92
static const struct resword reswords[] =
93
{
94
  { "_Bool",            RID_BOOL,       0 },
95
  { "_Complex",         RID_COMPLEX,    0 },
96
  { "__FUNCTION__",     RID_FUNCTION_NAME, 0 },
97
  { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
98
  { "__alignof",        RID_ALIGNOF,    0 },
99
  { "__alignof__",      RID_ALIGNOF,    0 },
100
  { "__asm",            RID_ASM,        0 },
101
  { "__asm__",          RID_ASM,        0 },
102
  { "__attribute",      RID_ATTRIBUTE,  0 },
103
  { "__attribute__",    RID_ATTRIBUTE,  0 },
104
  { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
105
  { "__builtin_offsetof", RID_OFFSETOF, 0 },
106
  { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
107
  { "__builtin_va_arg", RID_VA_ARG,     0 },
108
  { "__complex",        RID_COMPLEX,    0 },
109
  { "__complex__",      RID_COMPLEX,    0 },
110
  { "__const",          RID_CONST,      0 },
111
  { "__const__",        RID_CONST,      0 },
112
  { "__extension__",    RID_EXTENSION,  0 },
113
  { "__func__",         RID_C99_FUNCTION_NAME, 0 },
114
  { "__imag",           RID_IMAGPART,   0 },
115
  { "__imag__",         RID_IMAGPART,   0 },
116
  { "__inline",         RID_INLINE,     0 },
117
  { "__inline__",       RID_INLINE,     0 },
118
  { "__label__",        RID_LABEL,      0 },
119
  { "__real",           RID_REALPART,   0 },
120
  { "__real__",         RID_REALPART,   0 },
121
  { "__restrict",       RID_RESTRICT,   0 },
122
  { "__restrict__",     RID_RESTRICT,   0 },
123
  { "__signed",         RID_SIGNED,     0 },
124
  { "__signed__",       RID_SIGNED,     0 },
125
  { "__thread",         RID_THREAD,     0 },
126
  { "__typeof",         RID_TYPEOF,     0 },
127
  { "__typeof__",       RID_TYPEOF,     0 },
128
  { "__volatile",       RID_VOLATILE,   0 },
129
  { "__volatile__",     RID_VOLATILE,   0 },
130
  { "asm",              RID_ASM,        D_EXT },
131
  { "auto",             RID_AUTO,       0 },
132
  { "break",            RID_BREAK,      0 },
133
  { "case",             RID_CASE,       0 },
134
  { "char",             RID_CHAR,       0 },
135
  { "const",            RID_CONST,      0 },
136
  { "continue",         RID_CONTINUE,   0 },
137
  { "default",          RID_DEFAULT,    0 },
138
  { "do",               RID_DO,         0 },
139
  { "double",           RID_DOUBLE,     0 },
140
  { "else",             RID_ELSE,       0 },
141
  { "enum",             RID_ENUM,       0 },
142
  { "extern",           RID_EXTERN,     0 },
143
  { "float",            RID_FLOAT,      0 },
144
  { "for",              RID_FOR,        0 },
145
  { "goto",             RID_GOTO,       0 },
146
  { "if",               RID_IF,         0 },
147
  { "inline",           RID_INLINE,     D_EXT89 },
148
  { "int",              RID_INT,        0 },
149
  { "long",             RID_LONG,       0 },
150
  { "register",         RID_REGISTER,   0 },
151
  { "restrict",         RID_RESTRICT,   D_C89 },
152
  { "return",           RID_RETURN,     0 },
153
  { "short",            RID_SHORT,      0 },
154
  { "signed",           RID_SIGNED,     0 },
155
  { "sizeof",           RID_SIZEOF,     0 },
156
  { "static",           RID_STATIC,     0 },
157
  { "struct",           RID_STRUCT,     0 },
158
  { "switch",           RID_SWITCH,     0 },
159
  { "typedef",          RID_TYPEDEF,    0 },
160
  { "typeof",           RID_TYPEOF,     D_EXT },
161
  { "union",            RID_UNION,      0 },
162
  { "unsigned",         RID_UNSIGNED,   0 },
163
  { "void",             RID_VOID,       0 },
164
  { "volatile",         RID_VOLATILE,   0 },
165
  { "while",            RID_WHILE,      0 },
166
  /* These Objective-C keywords are recognized only immediately after
167
     an '@'.  */
168
  { "class",            RID_AT_CLASS,           D_OBJC },
169
  { "compatibility_alias", RID_AT_ALIAS,        D_OBJC },
170
  { "defs",             RID_AT_DEFS,            D_OBJC },
171
  { "encode",           RID_AT_ENCODE,          D_OBJC },
172
  { "end",              RID_AT_END,             D_OBJC },
173
  { "implementation",   RID_AT_IMPLEMENTATION,  D_OBJC },
174
  { "interface",        RID_AT_INTERFACE,       D_OBJC },
175
  { "private",          RID_AT_PRIVATE,         D_OBJC },
176
  { "protected",        RID_AT_PROTECTED,       D_OBJC },
177
  { "protocol",         RID_AT_PROTOCOL,        D_OBJC },
178
  { "public",           RID_AT_PUBLIC,          D_OBJC },
179
  { "selector",         RID_AT_SELECTOR,        D_OBJC },
180
  { "throw",            RID_AT_THROW,           D_OBJC },
181
  { "try",              RID_AT_TRY,             D_OBJC },
182
  { "catch",            RID_AT_CATCH,           D_OBJC },
183
  { "finally",          RID_AT_FINALLY,         D_OBJC },
184
  { "synchronized",     RID_AT_SYNCHRONIZED,    D_OBJC },
185
  /* These are recognized only in protocol-qualifier context
186
     (see above) */
187
  { "bycopy",           RID_BYCOPY,             D_OBJC },
188
  { "byref",            RID_BYREF,              D_OBJC },
189
  { "in",               RID_IN,                 D_OBJC },
190
  { "inout",            RID_INOUT,              D_OBJC },
191
  { "oneway",           RID_ONEWAY,             D_OBJC },
192
  { "out",              RID_OUT,                D_OBJC },
193
};
194
#define N_reswords (sizeof reswords / sizeof (struct resword))
195
 
196
/* Initialization routine for this file.  */
197
 
198
void
199
c_parse_init (void)
200
{
201
  /* The only initialization required is of the reserved word
202
     identifiers.  */
203
  unsigned int i;
204
  tree id;
205
  int mask = (flag_isoc99 ? 0 : D_C89)
206
              | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);
207
 
208
  if (!c_dialect_objc ())
209
     mask |= D_OBJC;
210
 
211
  ridpointers = GGC_CNEWVEC (tree, (int) RID_MAX);
212
  for (i = 0; i < N_reswords; i++)
213
    {
214
      /* If a keyword is disabled, do not enter it into the table
215
         and so create a canonical spelling that isn't a keyword.  */
216
      if (reswords[i].disable & mask)
217
        continue;
218
 
219
      id = get_identifier (reswords[i].word);
220
      C_RID_CODE (id) = reswords[i].rid;
221
      C_IS_RESERVED_WORD (id) = 1;
222
      ridpointers [(int) reswords[i].rid] = id;
223
    }
224
}
225
 
226
/* The C lexer intermediates between the lexer in cpplib and c-lex.c
227
   and the C parser.  Unlike the C++ lexer, the parser structure
228
   stores the lexer information instead of using a separate structure.
229
   Identifiers are separated into ordinary identifiers, type names,
230
   keywords and some other Objective-C types of identifiers, and some
231
   look-ahead is maintained.
232
 
233
   ??? It might be a good idea to lex the whole file up front (as for
234
   C++).  It would then be possible to share more of the C and C++
235
   lexer code, if desired.  */
236
 
237
/* The following local token type is used.  */
238
 
239
/* A keyword.  */
240
#define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
241
 
242
/* More information about the type of a CPP_NAME token.  */
243
typedef enum c_id_kind {
244
  /* An ordinary identifier.  */
245
  C_ID_ID,
246
  /* An identifier declared as a typedef name.  */
247
  C_ID_TYPENAME,
248
  /* An identifier declared as an Objective-C class name.  */
249
  C_ID_CLASSNAME,
250
  /* Not an identifier.  */
251
  C_ID_NONE
252
} c_id_kind;
253
 
254
/* A single C token after string literal concatenation and conversion
255
   of preprocessing tokens to tokens.  */
256
typedef struct c_token GTY (())
257
{
258
  /* The kind of token.  */
259
  ENUM_BITFIELD (cpp_ttype) type : 8;
260
  /* If this token is a CPP_NAME, this value indicates whether also
261
     declared as some kind of type.  Otherwise, it is C_ID_NONE.  */
262
  ENUM_BITFIELD (c_id_kind) id_kind : 8;
263
  /* If this token is a keyword, this value indicates which keyword.
264
     Otherwise, this value is RID_MAX.  */
265
  ENUM_BITFIELD (rid) keyword : 8;
266
  /* True if this token is from a system header.  */
267
  BOOL_BITFIELD in_system_header : 1;
268
  /* The value associated with this token, if any.  */
269
  tree value;
270
  /* The location at which this token was found.  */
271
  location_t location;
272
} c_token;
273
 
274
/* A parser structure recording information about the state and
275
   context of parsing.  Includes lexer information with up to two
276
   tokens of look-ahead; more are not needed for C.  */
277
typedef struct c_parser GTY(())
278
{
279
  /* The look-ahead tokens.  */
280
  c_token tokens[2];
281
  /* How many look-ahead tokens are available (0, 1 or 2).  */
282
  short tokens_avail;
283
  /* True if a syntax error is being recovered from; false otherwise.
284
     c_parser_error sets this flag.  It should clear this flag when
285
     enough tokens have been consumed to recover from the error.  */
286
  BOOL_BITFIELD error : 1;
287
} c_parser;
288
 
289
/* Read in and lex a single token, storing it in *TOKEN.  */
290
 
291
static void
292
c_lex_one_token (c_token *token)
293
{
294
  timevar_push (TV_LEX);
295
  token->type = c_lex_with_flags (&token->value, &token->location, NULL);
296
  token->in_system_header = in_system_header;
297
  switch (token->type)
298
    {
299
    case CPP_NAME:
300
      token->id_kind = C_ID_NONE;
301
      token->keyword = RID_MAX;
302
      {
303
        tree decl;
304
 
305
        int objc_force_identifier = objc_need_raw_identifier;
306
        OBJC_NEED_RAW_IDENTIFIER (0);
307
 
308
        if (C_IS_RESERVED_WORD (token->value))
309
          {
310
            enum rid rid_code = C_RID_CODE (token->value);
311
 
312
            if (c_dialect_objc ())
313
              {
314
                if (!OBJC_IS_AT_KEYWORD (rid_code)
315
                    && (!OBJC_IS_PQ_KEYWORD (rid_code) || objc_pq_context))
316
                  {
317
                    /* Return the canonical spelling for this keyword.  */
318
                    token->value = ridpointers[(int) rid_code];
319
                    token->type = CPP_KEYWORD;
320
                    token->keyword = rid_code;
321
                    break;
322
                  }
323
              }
324
            else
325
              {
326
                /* Return the canonical spelling for this keyword.  */
327
                token->value = ridpointers[(int) rid_code];
328
                token->type = CPP_KEYWORD;
329
                token->keyword = rid_code;
330
                break;
331
              }
332
          }
333
 
334
        decl = lookup_name (token->value);
335
        if (decl)
336
          {
337
            if (TREE_CODE (decl) == TYPE_DECL)
338
              {
339
                token->id_kind = C_ID_TYPENAME;
340
                break;
341
              }
342
          }
343
        else if (c_dialect_objc ())
344
          {
345
            tree objc_interface_decl = objc_is_class_name (token->value);
346
            /* Objective-C class names are in the same namespace as
347
               variables and typedefs, and hence are shadowed by local
348
               declarations.  */
349
            if (objc_interface_decl
350
                && (global_bindings_p ()
351
                    || (!objc_force_identifier && !decl)))
352
              {
353
                token->value = objc_interface_decl;
354
                token->id_kind = C_ID_CLASSNAME;
355
                break;
356
              }
357
          }
358
      }
359
      token->id_kind = C_ID_ID;
360
      break;
361
    case CPP_AT_NAME:
362
      /* This only happens in Objective-C; it must be a keyword.  */
363
      token->type = CPP_KEYWORD;
364
      token->id_kind = C_ID_NONE;
365
      token->keyword = C_RID_CODE (token->value);
366
      break;
367
    case CPP_COLON:
368
    case CPP_COMMA:
369
    case CPP_CLOSE_PAREN:
370
    case CPP_SEMICOLON:
371
      /* These tokens may affect the interpretation of any identifiers
372
         following, if doing Objective-C.  */
373
      OBJC_NEED_RAW_IDENTIFIER (0);
374
      token->id_kind = C_ID_NONE;
375
      token->keyword = RID_MAX;
376
      break;
377
    default:
378
      token->id_kind = C_ID_NONE;
379
      token->keyword = RID_MAX;
380
      break;
381
    }
382
  timevar_pop (TV_LEX);
383
}
384
 
385
/* Return a pointer to the next token from PARSER, reading it in if
386
   necessary.  */
387
 
388
static inline c_token *
389
c_parser_peek_token (c_parser *parser)
390
{
391
  if (parser->tokens_avail == 0)
392
    {
393
      c_lex_one_token (&parser->tokens[0]);
394
      parser->tokens_avail = 1;
395
    }
396
  return &parser->tokens[0];
397
}
398
 
399
/* Return true if the next token from PARSER has the indicated
400
   TYPE.  */
401
 
402
static inline bool
403
c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
404
{
405
  return c_parser_peek_token (parser)->type == type;
406
}
407
 
408
/* Return true if the next token from PARSER does not have the
409
   indicated TYPE.  */
410
 
411
static inline bool
412
c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
413
{
414
  return !c_parser_next_token_is (parser, type);
415
}
416
 
417
/* Return true if the next token from PARSER is the indicated
418
   KEYWORD.  */
419
 
420
static inline bool
421
c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
422
{
423
  c_token *token;
424
 
425
  /* Peek at the next token.  */
426
  token = c_parser_peek_token (parser);
427
  /* Check to see if it is the indicated keyword.  */
428
  return token->keyword == keyword;
429
}
430
 
431
/* Return true if TOKEN can start a type name,
432
   false otherwise.  */
433
static bool
434
c_token_starts_typename (c_token *token)
435
{
436
  switch (token->type)
437
    {
438
    case CPP_NAME:
439
      switch (token->id_kind)
440
        {
441
        case C_ID_ID:
442
          return false;
443
        case C_ID_TYPENAME:
444
          return true;
445
        case C_ID_CLASSNAME:
446
          gcc_assert (c_dialect_objc ());
447
          return true;
448
        default:
449
          gcc_unreachable ();
450
        }
451
    case CPP_KEYWORD:
452
      switch (token->keyword)
453
        {
454
        case RID_UNSIGNED:
455
        case RID_LONG:
456
        case RID_SHORT:
457
        case RID_SIGNED:
458
        case RID_COMPLEX:
459
        case RID_INT:
460
        case RID_CHAR:
461
        case RID_FLOAT:
462
        case RID_DOUBLE:
463
        case RID_VOID:
464
        case RID_BOOL:
465
        case RID_ENUM:
466
        case RID_STRUCT:
467
        case RID_UNION:
468
        case RID_TYPEOF:
469
        case RID_CONST:
470
        case RID_VOLATILE:
471
        case RID_RESTRICT:
472
        case RID_ATTRIBUTE:
473
          return true;
474
        default:
475
          return false;
476
        }
477
    case CPP_LESS:
478
      if (c_dialect_objc ())
479
        return true;
480
      return false;
481
    default:
482
      return false;
483
    }
484
}
485
 
486
/* Return true if the next token from PARSER can start a type name,
487
   false otherwise.  */
488
static inline bool
489
c_parser_next_token_starts_typename (c_parser *parser)
490
{
491
  c_token *token = c_parser_peek_token (parser);
492
  return c_token_starts_typename (token);
493
}
494
 
495
/* Return true if TOKEN can start declaration specifiers, false
496
   otherwise.  */
497
static bool
498
c_token_starts_declspecs (c_token *token)
499
{
500
  switch (token->type)
501
    {
502
    case CPP_NAME:
503
      switch (token->id_kind)
504
        {
505
        case C_ID_ID:
506
          return false;
507
        case C_ID_TYPENAME:
508
          return true;
509
        case C_ID_CLASSNAME:
510
          gcc_assert (c_dialect_objc ());
511
          return true;
512
        default:
513
          gcc_unreachable ();
514
        }
515
    case CPP_KEYWORD:
516
      switch (token->keyword)
517
        {
518
        case RID_STATIC:
519
        case RID_EXTERN:
520
        case RID_REGISTER:
521
        case RID_TYPEDEF:
522
        case RID_INLINE:
523
        case RID_AUTO:
524
        case RID_THREAD:
525
        case RID_UNSIGNED:
526
        case RID_LONG:
527
        case RID_SHORT:
528
        case RID_SIGNED:
529
        case RID_COMPLEX:
530
        case RID_INT:
531
        case RID_CHAR:
532
        case RID_FLOAT:
533
        case RID_DOUBLE:
534
        case RID_VOID:
535
        case RID_BOOL:
536
        case RID_ENUM:
537
        case RID_STRUCT:
538
        case RID_UNION:
539
        case RID_TYPEOF:
540
        case RID_CONST:
541
        case RID_VOLATILE:
542
        case RID_RESTRICT:
543
        case RID_ATTRIBUTE:
544
          return true;
545
        default:
546
          return false;
547
        }
548
    case CPP_LESS:
549
      if (c_dialect_objc ())
550
        return true;
551
      return false;
552
    default:
553
      return false;
554
    }
555
}
556
 
557
/* Return true if the next token from PARSER can start declaration
558
   specifiers, false otherwise.  */
559
static inline bool
560
c_parser_next_token_starts_declspecs (c_parser *parser)
561
{
562
  c_token *token = c_parser_peek_token (parser);
563
  return c_token_starts_declspecs (token);
564
}
565
 
566
/* Return a pointer to the next-but-one token from PARSER, reading it
567
   in if necessary.  The next token is already read in.  */
568
 
569
static c_token *
570
c_parser_peek_2nd_token (c_parser *parser)
571
{
572
  if (parser->tokens_avail >= 2)
573
    return &parser->tokens[1];
574
  gcc_assert (parser->tokens_avail == 1);
575
  gcc_assert (parser->tokens[0].type != CPP_EOF);
576
  c_lex_one_token (&parser->tokens[1]);
577
  parser->tokens_avail = 2;
578
  return &parser->tokens[1];
579
}
580
 
581
/* Consume the next token from PARSER.  */
582
 
583
static void
584
c_parser_consume_token (c_parser *parser)
585
{
586
  if (parser->tokens_avail == 2)
587
    parser->tokens[0] = parser->tokens[1];
588
  else
589
    {
590
      gcc_assert (parser->tokens_avail == 1);
591
      gcc_assert (parser->tokens[0].type != CPP_EOF);
592
    }
593
  parser->tokens_avail--;
594
}
595
 
596
/* Update the globals input_location and in_system_header from
597
   TOKEN.  */
598
static inline void
599
c_parser_set_source_position_from_token (c_token *token)
600
{
601
  if (token->type != CPP_EOF)
602
    {
603
      input_location = token->location;
604
      in_system_header = token->in_system_header;
605
    }
606
}
607
 
608
/* Allocate a new parser.  */
609
 
610
static c_parser *
611
c_parser_new (void)
612
{
613
  /* Use local storage to lex the first token because loading a PCH
614
     file may cause garbage collection.  */
615
  c_parser tparser;
616
  c_parser *ret;
617
  memset (&tparser, 0, sizeof tparser);
618
  c_lex_one_token (&tparser.tokens[0]);
619
  tparser.tokens_avail = 1;
620
  ret = GGC_NEW (c_parser);
621
  memcpy (ret, &tparser, sizeof tparser);
622
  return ret;
623
}
624
 
625
/* Issue a diagnostic of the form
626
      FILE:LINE: MESSAGE before TOKEN
627
   where TOKEN is the next token in the input stream of PARSER.
628
   MESSAGE (specified by the caller) is usually of the form "expected
629
   OTHER-TOKEN".
630
 
631
   Do not issue a diagnostic if still recovering from an error.
632
 
633
   ??? This is taken from the C++ parser, but building up messages in
634
   this way is not i18n-friendly and some other approach should be
635
   used.  */
636
 
637
static void
638
c_parser_error (c_parser *parser, const char *gmsgid)
639
{
640
  c_token *token = c_parser_peek_token (parser);
641
  if (parser->error)
642
    return;
643
  parser->error = true;
644
  if (!gmsgid)
645
    return;
646
  /* This diagnostic makes more sense if it is tagged to the line of
647
     the token we just peeked at.  */
648
  c_parser_set_source_position_from_token (token);
649
  c_parse_error (gmsgid,
650
                 /* Because c_parse_error does not understand
651
                    CPP_KEYWORD, keywords are treated like
652
                    identifiers.  */
653
                 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
654
                 token->value);
655
}
656
 
657
/* If the next token is of the indicated TYPE, consume it.  Otherwise,
658
   issue the error MSGID.  If MSGID is NULL then a message has already
659
   been produced and no message will be produced this time.  Returns
660
   true if found, false otherwise.  */
661
 
662
static bool
663
c_parser_require (c_parser *parser,
664
                  enum cpp_ttype type,
665
                  const char *msgid)
666
{
667
  if (c_parser_next_token_is (parser, type))
668
    {
669
      c_parser_consume_token (parser);
670
      return true;
671
    }
672
  else
673
    {
674
      c_parser_error (parser, msgid);
675
      return false;
676
    }
677
}
678
 
679
/* If the next token is the indicated keyword, consume it.  Otherwise,
680
   issue the error MSGID.  Returns true if found, false otherwise.  */
681
 
682
static bool
683
c_parser_require_keyword (c_parser *parser,
684
                          enum rid keyword,
685
                          const char *msgid)
686
{
687
  if (c_parser_next_token_is_keyword (parser, keyword))
688
    {
689
      c_parser_consume_token (parser);
690
      return true;
691
    }
692
  else
693
    {
694
      c_parser_error (parser, msgid);
695
      return false;
696
    }
697
}
698
 
699
/* Like c_parser_require, except that tokens will be skipped until the
700
   desired token is found.  An error message is still produced if the
701
   next token is not as expected.  If MSGID is NULL then a message has
702
   already been produced and no message will be produced this
703
   time.  */
704
 
705
static void
706
c_parser_skip_until_found (c_parser *parser,
707
                           enum cpp_ttype type,
708
                           const char *msgid)
709
{
710
  unsigned nesting_depth = 0;
711
 
712
  if (c_parser_require (parser, type, msgid))
713
    return;
714
 
715
  /* Skip tokens until the desired token is found.  */
716
  while (true)
717
    {
718
      /* Peek at the next token.  */
719
      c_token *token = c_parser_peek_token (parser);
720
      /* If we've reached the token we want, consume it and stop.  */
721
      if (token->type == type && !nesting_depth)
722
        {
723
          c_parser_consume_token (parser);
724
          break;
725
        }
726
      /* If we've run out of tokens, stop.  */
727
      if (token->type == CPP_EOF)
728
        return;
729
      if (token->type == CPP_OPEN_BRACE
730
          || token->type == CPP_OPEN_PAREN
731
          || token->type == CPP_OPEN_SQUARE)
732
        ++nesting_depth;
733
      else if (token->type == CPP_CLOSE_BRACE
734
               || token->type == CPP_CLOSE_PAREN
735
               || token->type == CPP_CLOSE_SQUARE)
736
        {
737
          if (nesting_depth-- == 0)
738
            break;
739
        }
740
      /* Consume this token.  */
741
      c_parser_consume_token (parser);
742
    }
743
  parser->error = false;
744
}
745
 
746
/* Skip tokens until the end of a parameter is found, but do not
747
   consume the comma, semicolon or closing delimiter.  */
748
 
749
static void
750
c_parser_skip_to_end_of_parameter (c_parser *parser)
751
{
752
  unsigned nesting_depth = 0;
753
 
754
  while (true)
755
    {
756
      c_token *token = c_parser_peek_token (parser);
757
      if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
758
          && !nesting_depth)
759
        break;
760
      /* If we've run out of tokens, stop.  */
761
      if (token->type == CPP_EOF)
762
        return;
763
      if (token->type == CPP_OPEN_BRACE
764
          || token->type == CPP_OPEN_PAREN
765
          || token->type == CPP_OPEN_SQUARE)
766
        ++nesting_depth;
767
      else if (token->type == CPP_CLOSE_BRACE
768
               || token->type == CPP_CLOSE_PAREN
769
               || token->type == CPP_CLOSE_SQUARE)
770
        {
771
          if (nesting_depth-- == 0)
772
            break;
773
        }
774
      /* Consume this token.  */
775
      c_parser_consume_token (parser);
776
    }
777
  parser->error = false;
778
}
779
 
780
/* Skip tokens until we have consumed an entire block, or until we
781
   have consumed a non-nested ';'.  */
782
 
783
static void
784
c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
785
{
786
  unsigned nesting_depth = 0;
787
 
788
  while (true)
789
    {
790
      c_token *token;
791
 
792
      /* Peek at the next token.  */
793
      token = c_parser_peek_token (parser);
794
      /* If we've run out of tokens, stop.  */
795
      if (token->type == CPP_EOF)
796
        return;
797
      /* If the next token is a ';', we have reached the end of the
798
         statement.  */
799
      if (token->type == CPP_SEMICOLON && !nesting_depth)
800
        {
801
          /* Consume the ';'.  */
802
          c_parser_consume_token (parser);
803
          break;
804
        }
805
      /* If the next token is a non-nested '}', then we have reached
806
         the end of the current block.  */
807
      if (token->type == CPP_CLOSE_BRACE
808
          && (nesting_depth == 0 || --nesting_depth == 0))
809
        {
810
          c_parser_consume_token (parser);
811
          break;
812
        }
813
      /* If it the next token is a '{', then we are entering a new
814
         block.  Consume the entire block.  */
815
      if (token->type == CPP_OPEN_BRACE)
816
        ++nesting_depth;
817
      c_parser_consume_token (parser);
818
    }
819
  parser->error = false;
820
}
821
 
822
 
823
/* Save the warning flags which are controlled by __extension__.  */
824
 
825
static inline int
826
disable_extension_diagnostics (void)
827
{
828
  int ret = (pedantic
829
             | (warn_pointer_arith << 1)
830
             | (warn_traditional << 2)
831
             | (flag_iso << 3));
832
  pedantic = 0;
833
  warn_pointer_arith = 0;
834
  warn_traditional = 0;
835
  flag_iso = 0;
836
  return ret;
837
}
838
 
839
/* Restore the warning flags which are controlled by __extension__.
840
   FLAGS is the return value from disable_extension_diagnostics.  */
841
 
842
static inline void
843
restore_extension_diagnostics (int flags)
844
{
845
  pedantic = flags & 1;
846
  warn_pointer_arith = (flags >> 1) & 1;
847
  warn_traditional = (flags >> 2) & 1;
848
  flag_iso = (flags >> 3) & 1;
849
}
850
 
851
/* Possibly kinds of declarator to parse.  */
852
typedef enum c_dtr_syn {
853
  /* A normal declarator with an identifier.  */
854
  C_DTR_NORMAL,
855
  /* An abstract declarator (maybe empty).  */
856
  C_DTR_ABSTRACT,
857
  /* A parameter declarator: may be either, but after a type name does
858
     not redeclare a typedef name as an identifier if it can
859
     alternatively be interpreted as a typedef name; see DR#009,
860
     applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
861
     following DR#249.  For example, given a typedef T, "int T" and
862
     "int *T" are valid parameter declarations redeclaring T, while
863
     "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
864
     abstract declarators rather than involving redundant parentheses;
865
     the same applies with attributes inside the parentheses before
866
     "T".  */
867
  C_DTR_PARM
868
} c_dtr_syn;
869
 
870
static void c_parser_external_declaration (c_parser *);
871
static void c_parser_asm_definition (c_parser *);
872
static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
873
static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
874
                                bool);
875
static struct c_typespec c_parser_enum_specifier (c_parser *);
876
static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
877
static tree c_parser_struct_declaration (c_parser *);
878
static struct c_typespec c_parser_typeof_specifier (c_parser *);
879
static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
880
                                                 bool *);
881
static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
882
                                                        c_dtr_syn, bool *);
883
static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
884
                                                              bool,
885
                                                              struct c_declarator *);
886
static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
887
static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
888
static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
889
static tree c_parser_simple_asm_expr (c_parser *);
890
static tree c_parser_attributes (c_parser *);
891
static struct c_type_name *c_parser_type_name (c_parser *);
892
static struct c_expr c_parser_initializer (c_parser *);
893
static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
894
static void c_parser_initelt (c_parser *);
895
static void c_parser_initval (c_parser *, struct c_expr *);
896
static tree c_parser_compound_statement (c_parser *);
897
static void c_parser_compound_statement_nostart (c_parser *);
898
static void c_parser_label (c_parser *);
899
static void c_parser_statement (c_parser *);
900
static void c_parser_statement_after_labels (c_parser *);
901
static void c_parser_if_statement (c_parser *);
902
static void c_parser_switch_statement (c_parser *);
903
static void c_parser_while_statement (c_parser *);
904
static void c_parser_do_statement (c_parser *);
905
static void c_parser_for_statement (c_parser *);
906
static tree c_parser_asm_statement (c_parser *);
907
static tree c_parser_asm_operands (c_parser *, bool);
908
static tree c_parser_asm_clobbers (c_parser *);
909
static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
910
static struct c_expr c_parser_conditional_expression (c_parser *,
911
                                                      struct c_expr *);
912
static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
913
static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
914
static struct c_expr c_parser_unary_expression (c_parser *);
915
static struct c_expr c_parser_sizeof_expression (c_parser *);
916
static struct c_expr c_parser_alignof_expression (c_parser *);
917
static struct c_expr c_parser_postfix_expression (c_parser *);
918
static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
919
                                                                   struct c_type_name *);
920
static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
921
                                                                struct c_expr);
922
static struct c_expr c_parser_expression (c_parser *);
923
static struct c_expr c_parser_expression_conv (c_parser *);
924
static tree c_parser_expr_list (c_parser *, bool);
925
 
926
/* These Objective-C parser functions are only ever called when
927
   compiling Objective-C.  */
928
static void c_parser_objc_class_definition (c_parser *);
929
static void c_parser_objc_class_instance_variables (c_parser *);
930
static void c_parser_objc_class_declaration (c_parser *);
931
static void c_parser_objc_alias_declaration (c_parser *);
932
static void c_parser_objc_protocol_definition (c_parser *);
933
static enum tree_code c_parser_objc_method_type (c_parser *);
934
static void c_parser_objc_method_definition (c_parser *);
935
static void c_parser_objc_methodprotolist (c_parser *);
936
static void c_parser_objc_methodproto (c_parser *);
937
static tree c_parser_objc_method_decl (c_parser *);
938
static tree c_parser_objc_type_name (c_parser *);
939
static tree c_parser_objc_protocol_refs (c_parser *);
940
static void c_parser_objc_try_catch_statement (c_parser *);
941
static void c_parser_objc_synchronized_statement (c_parser *);
942
static tree c_parser_objc_selector (c_parser *);
943
static tree c_parser_objc_selector_arg (c_parser *);
944
static tree c_parser_objc_receiver (c_parser *);
945
static tree c_parser_objc_message_args (c_parser *);
946
static tree c_parser_objc_keywordexpr (c_parser *);
947
 
948
/* Parse a translation unit (C90 6.7, C99 6.9).
949
 
950
   translation-unit:
951
     external-declarations
952
 
953
   external-declarations:
954
     external-declaration
955
     external-declarations external-declaration
956
 
957
   GNU extensions:
958
 
959
   translation-unit:
960
     empty
961
*/
962
 
963
static void
964
c_parser_translation_unit (c_parser *parser)
965
{
966
  if (c_parser_next_token_is (parser, CPP_EOF))
967
    {
968
      if (pedantic)
969
        pedwarn ("ISO C forbids an empty source file");
970
    }
971
  else
972
    {
973
      void *obstack_position = obstack_alloc (&parser_obstack, 0);
974
      do
975
        {
976
          ggc_collect ();
977
          c_parser_external_declaration (parser);
978
          obstack_free (&parser_obstack, obstack_position);
979
        }
980
      while (c_parser_next_token_is_not (parser, CPP_EOF));
981
    }
982
}
983
 
984
/* Parse an external declaration (C90 6.7, C99 6.9).
985
 
986
   external-declaration:
987
     function-definition
988
     declaration
989
 
990
   GNU extensions:
991
 
992
   external-declaration:
993
     asm-definition
994
     ;
995
     __extension__ external-declaration
996
 
997
   Objective-C:
998
 
999
   external-declaration:
1000
     objc-class-definition
1001
     objc-class-declaration
1002
     objc-alias-declaration
1003
     objc-protocol-definition
1004
     objc-method-definition
1005
     @end
1006
*/
1007
 
1008
static void
1009
c_parser_external_declaration (c_parser *parser)
1010
{
1011
  int ext;
1012
  switch (c_parser_peek_token (parser)->type)
1013
    {
1014
    case CPP_KEYWORD:
1015
      switch (c_parser_peek_token (parser)->keyword)
1016
        {
1017
        case RID_EXTENSION:
1018
          ext = disable_extension_diagnostics ();
1019
          c_parser_consume_token (parser);
1020
          c_parser_external_declaration (parser);
1021
          restore_extension_diagnostics (ext);
1022
          break;
1023
        case RID_ASM:
1024
          c_parser_asm_definition (parser);
1025
          break;
1026
        case RID_AT_INTERFACE:
1027
        case RID_AT_IMPLEMENTATION:
1028
          gcc_assert (c_dialect_objc ());
1029
          c_parser_objc_class_definition (parser);
1030
          break;
1031
        case RID_AT_CLASS:
1032
          gcc_assert (c_dialect_objc ());
1033
          c_parser_objc_class_declaration (parser);
1034
          break;
1035
        case RID_AT_ALIAS:
1036
          gcc_assert (c_dialect_objc ());
1037
          c_parser_objc_alias_declaration (parser);
1038
          break;
1039
        case RID_AT_PROTOCOL:
1040
          gcc_assert (c_dialect_objc ());
1041
          c_parser_objc_protocol_definition (parser);
1042
          break;
1043
        case RID_AT_END:
1044
          gcc_assert (c_dialect_objc ());
1045
          c_parser_consume_token (parser);
1046
          objc_finish_implementation ();
1047
          break;
1048
        default:
1049
          goto decl_or_fndef;
1050
        }
1051
      break;
1052
    case CPP_SEMICOLON:
1053
      if (pedantic)
1054
        pedwarn ("ISO C does not allow extra %<;%> outside of a function");
1055
      c_parser_consume_token (parser);
1056
      break;
1057
    case CPP_PLUS:
1058
    case CPP_MINUS:
1059
      if (c_dialect_objc ())
1060
        {
1061
          c_parser_objc_method_definition (parser);
1062
          break;
1063
        }
1064
      /* Else fall through, and yield a syntax error trying to parse
1065
         as a declaration or function definition.  */
1066
    default:
1067
    decl_or_fndef:
1068
      /* A declaration or a function definition.  We can only tell
1069
         which after parsing the declaration specifiers, if any, and
1070
         the first declarator.  */
1071
      c_parser_declaration_or_fndef (parser, true, true, false, true);
1072
      break;
1073
    }
1074
}
1075
 
1076
/* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1077
   6.7, 6.9.1).  If FNDEF_OK is true, a function definition is
1078
   accepted; otherwise (old-style parameter declarations) only other
1079
   declarations are accepted.  If NESTED is true, we are inside a
1080
   function or parsing old-style parameter declarations; any functions
1081
   encountered are nested functions and declaration specifiers are
1082
   required; otherwise we are at top level and functions are normal
1083
   functions and declaration specifiers may be optional.  If EMPTY_OK
1084
   is true, empty declarations are OK (subject to all other
1085
   constraints); otherwise (old-style parameter declarations) they are
1086
   diagnosed.  If START_ATTR_OK is true, the declaration specifiers
1087
   may start with attributes; otherwise they may not.
1088
 
1089
   declaration:
1090
     declaration-specifiers init-declarator-list[opt] ;
1091
 
1092
   function-definition:
1093
     declaration-specifiers[opt] declarator declaration-list[opt]
1094
       compound-statement
1095
 
1096
   declaration-list:
1097
     declaration
1098
     declaration-list declaration
1099
 
1100
   init-declarator-list:
1101
     init-declarator
1102
     init-declarator-list , init-declarator
1103
 
1104
   init-declarator:
1105
     declarator simple-asm-expr[opt] attributes[opt]
1106
     declarator simple-asm-expr[opt] attributes[opt] = initializer
1107
 
1108
   GNU extensions:
1109
 
1110
   nested-function-definition:
1111
     declaration-specifiers declarator declaration-list[opt]
1112
       compound-statement
1113
 
1114
   The simple-asm-expr and attributes are GNU extensions.
1115
 
1116
   This function does not handle __extension__; that is handled in its
1117
   callers.  ??? Following the old parser, __extension__ may start
1118
   external declarations, declarations in functions and declarations
1119
   at the start of "for" loops, but not old-style parameter
1120
   declarations.
1121
 
1122
   C99 requires declaration specifiers in a function definition; the
1123
   absence is diagnosed through the diagnosis of implicit int.  In GNU
1124
   C we also allow but diagnose declarations without declaration
1125
   specifiers, but only at top level (elsewhere they conflict with
1126
   other syntax).  */
1127
 
1128
static void
1129
c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
1130
                               bool nested, bool start_attr_ok)
1131
{
1132
  struct c_declspecs *specs;
1133
  tree prefix_attrs;
1134
  tree all_prefix_attrs;
1135
  bool diagnosed_no_specs = false;
1136
  specs = build_null_declspecs ();
1137
  c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1138
  if (parser->error)
1139
    {
1140
      c_parser_skip_to_end_of_block_or_statement (parser);
1141
      return;
1142
    }
1143
  if (nested && !specs->declspecs_seen_p)
1144
    {
1145
      c_parser_error (parser, "expected declaration specifiers");
1146
      c_parser_skip_to_end_of_block_or_statement (parser);
1147
      return;
1148
    }
1149
  finish_declspecs (specs);
1150
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1151
    {
1152
      if (empty_ok)
1153
        shadow_tag (specs);
1154
      else
1155
        {
1156
          shadow_tag_warned (specs, 1);
1157
          pedwarn ("empty declaration");
1158
        }
1159
      c_parser_consume_token (parser);
1160
      return;
1161
    }
1162
  pending_xref_error ();
1163
  prefix_attrs = specs->attrs;
1164
  all_prefix_attrs = prefix_attrs;
1165
  specs->attrs = NULL_TREE;
1166
  while (true)
1167
    {
1168
      struct c_declarator *declarator;
1169
      bool dummy = false;
1170
      tree fnbody;
1171
      /* Declaring either one or more declarators (in which case we
1172
         should diagnose if there were no declaration specifiers) or a
1173
         function definition (in which case the diagnostic for
1174
         implicit int suffices).  */
1175
      declarator = c_parser_declarator (parser, specs->type_seen_p,
1176
                                        C_DTR_NORMAL, &dummy);
1177
      if (declarator == NULL)
1178
        {
1179
          c_parser_skip_to_end_of_block_or_statement (parser);
1180
          return;
1181
        }
1182
      if (c_parser_next_token_is (parser, CPP_EQ)
1183
          || c_parser_next_token_is (parser, CPP_COMMA)
1184
          || c_parser_next_token_is (parser, CPP_SEMICOLON)
1185
          || c_parser_next_token_is_keyword (parser, RID_ASM)
1186
          || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1187
        {
1188
          tree asm_name = NULL_TREE;
1189
          tree postfix_attrs = NULL_TREE;
1190
          if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1191
            {
1192
              diagnosed_no_specs = true;
1193
              pedwarn ("data definition has no type or storage class");
1194
            }
1195
          /* Having seen a data definition, there cannot now be a
1196
             function definition.  */
1197
          fndef_ok = false;
1198
          if (c_parser_next_token_is_keyword (parser, RID_ASM))
1199
            asm_name = c_parser_simple_asm_expr (parser);
1200
          if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1201
            postfix_attrs = c_parser_attributes (parser);
1202
          if (c_parser_next_token_is (parser, CPP_EQ))
1203
            {
1204
              tree d;
1205
              struct c_expr init;
1206
              c_parser_consume_token (parser);
1207
              /* The declaration of the variable is in effect while
1208
                 its initializer is parsed.  */
1209
              d = start_decl (declarator, specs, true,
1210
                              chainon (postfix_attrs, all_prefix_attrs));
1211
              if (!d)
1212
                d = error_mark_node;
1213
              start_init (d, asm_name, global_bindings_p ());
1214
              init = c_parser_initializer (parser);
1215
              finish_init ();
1216
              if (d != error_mark_node)
1217
                {
1218
                  maybe_warn_string_init (TREE_TYPE (d), init);
1219
                  finish_decl (d, init.value, asm_name);
1220
                }
1221
            }
1222
          else
1223
            {
1224
              tree d = start_decl (declarator, specs, false,
1225
                                   chainon (postfix_attrs,
1226
                                            all_prefix_attrs));
1227
              if (d)
1228
                finish_decl (d, NULL_TREE, asm_name);
1229
            }
1230
          if (c_parser_next_token_is (parser, CPP_COMMA))
1231
            {
1232
              c_parser_consume_token (parser);
1233
              if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1234
                all_prefix_attrs = chainon (c_parser_attributes (parser),
1235
                                            prefix_attrs);
1236
              else
1237
                all_prefix_attrs = prefix_attrs;
1238
              continue;
1239
            }
1240
          else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1241
            {
1242
              c_parser_consume_token (parser);
1243
              return;
1244
            }
1245
          else
1246
            {
1247
              c_parser_error (parser, "expected %<,%> or %<;%>");
1248
              c_parser_skip_to_end_of_block_or_statement (parser);
1249
              return;
1250
            }
1251
        }
1252
      else if (!fndef_ok)
1253
        {
1254
          c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1255
                          "%<asm%> or %<__attribute__%>");
1256
          c_parser_skip_to_end_of_block_or_statement (parser);
1257
          return;
1258
        }
1259
      /* Function definition (nested or otherwise).  */
1260
      if (nested)
1261
        {
1262
          if (pedantic)
1263
            pedwarn ("ISO C forbids nested functions");
1264
          push_function_context ();
1265
        }
1266
      if (!start_function (specs, declarator, all_prefix_attrs))
1267
        {
1268
          /* This can appear in many cases looking nothing like a
1269
             function definition, so we don't give a more specific
1270
             error suggesting there was one.  */
1271
          c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1272
                          "or %<__attribute__%>");
1273
          if (nested)
1274
            pop_function_context ();
1275
          break;
1276
        }
1277
      /* Parse old-style parameter declarations.  ??? Attributes are
1278
         not allowed to start declaration specifiers here because of a
1279
         syntax conflict between a function declaration with attribute
1280
         suffix and a function definition with an attribute prefix on
1281
         first old-style parameter declaration.  Following the old
1282
         parser, they are not accepted on subsequent old-style
1283
         parameter declarations either.  However, there is no
1284
         ambiguity after the first declaration, nor indeed on the
1285
         first as long as we don't allow postfix attributes after a
1286
         declarator with a nonempty identifier list in a definition;
1287
         and postfix attributes have never been accepted here in
1288
         function definitions either.  */
1289
      while (c_parser_next_token_is_not (parser, CPP_EOF)
1290
             && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1291
        c_parser_declaration_or_fndef (parser, false, false, true, false);
1292
      DECL_SOURCE_LOCATION (current_function_decl)
1293
        = c_parser_peek_token (parser)->location;
1294
      store_parm_decls ();
1295
      fnbody = c_parser_compound_statement (parser);
1296
      if (nested)
1297
        {
1298
          tree decl = current_function_decl;
1299
          add_stmt (fnbody);
1300
          finish_function ();
1301
          pop_function_context ();
1302
          add_stmt (build_stmt (DECL_EXPR, decl));
1303
        }
1304
      else
1305
        {
1306
          add_stmt (fnbody);
1307
          finish_function ();
1308
        }
1309
      break;
1310
    }
1311
}
1312
 
1313
/* Parse an asm-definition (asm() outside a function body).  This is a
1314
   GNU extension.
1315
 
1316
   asm-definition:
1317
     simple-asm-expr ;
1318
*/
1319
 
1320
static void
1321
c_parser_asm_definition (c_parser *parser)
1322
{
1323
  tree asm_str = c_parser_simple_asm_expr (parser);
1324
  /* ??? This only works sensibly in the presence of
1325
     -fno-unit-at-a-time; file-scope asms really need to be passed to
1326
     cgraph which needs to preserve the order of functions and
1327
     file-scope asms.  */
1328
  if (asm_str)
1329
    assemble_asm (asm_str);
1330
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1331
}
1332
 
1333
/* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1334
   6.7), adding them to SPECS (which may already include some).
1335
   Storage class specifiers are accepted iff SCSPEC_OK; type
1336
   specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1337
   the start iff START_ATTR_OK.
1338
 
1339
   declaration-specifiers:
1340
     storage-class-specifier declaration-specifiers[opt]
1341
     type-specifier declaration-specifiers[opt]
1342
     type-qualifier declaration-specifiers[opt]
1343
     function-specifier declaration-specifiers[opt]
1344
 
1345
   Function specifiers (inline) are from C99, and are currently
1346
   handled as storage class specifiers, as is __thread.
1347
 
1348
   C90 6.5.1, C99 6.7.1:
1349
   storage-class-specifier:
1350
     typedef
1351
     extern
1352
     static
1353
     auto
1354
     register
1355
 
1356
   C99 6.7.4:
1357
   function-specifier:
1358
     inline
1359
 
1360
   C90 6.5.2, C99 6.7.2:
1361
   type-specifier:
1362
     void
1363
     char
1364
     short
1365
     int
1366
     long
1367
     float
1368
     double
1369
     signed
1370
     unsigned
1371
     _Bool
1372
     _Complex
1373
     [_Imaginary removed in C99 TC2]
1374
     struct-or-union-specifier
1375
     enum-specifier
1376
     typedef-name
1377
 
1378
   (_Bool and _Complex are new in C99.)
1379
 
1380
   C90 6.5.3, C99 6.7.3:
1381
 
1382
   type-qualifier:
1383
     const
1384
     restrict
1385
     volatile
1386
 
1387
   (restrict is new in C99.)
1388
 
1389
   GNU extensions:
1390
 
1391
   declaration-specifiers:
1392
     attributes declaration-specifiers[opt]
1393
 
1394
   storage-class-specifier:
1395
     __thread
1396
 
1397
   type-specifier:
1398
     typeof-specifier
1399
 
1400
   Objective-C:
1401
 
1402
   type-specifier:
1403
     class-name objc-protocol-refs[opt]
1404
     typedef-name objc-protocol-refs
1405
     objc-protocol-refs
1406
*/
1407
 
1408
static void
1409
c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1410
                    bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1411
{
1412
  bool attrs_ok = start_attr_ok;
1413
  bool seen_type = specs->type_seen_p;
1414
  while (c_parser_next_token_is (parser, CPP_NAME)
1415
         || c_parser_next_token_is (parser, CPP_KEYWORD)
1416
         || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1417
    {
1418
      struct c_typespec t;
1419
      tree attrs;
1420
      if (c_parser_next_token_is (parser, CPP_NAME))
1421
        {
1422
          tree value = c_parser_peek_token (parser)->value;
1423
          c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1424
          /* This finishes the specifiers unless a type name is OK, it
1425
             is declared as a type name and a type name hasn't yet
1426
             been seen.  */
1427
          if (!typespec_ok || seen_type
1428
              || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
1429
            break;
1430
          c_parser_consume_token (parser);
1431
          seen_type = true;
1432
          attrs_ok = true;
1433
          if (kind == C_ID_TYPENAME
1434
              && (!c_dialect_objc ()
1435
                  || c_parser_next_token_is_not (parser, CPP_LESS)))
1436
            {
1437
              t.kind = ctsk_typedef;
1438
              /* For a typedef name, record the meaning, not the name.
1439
                 In case of 'foo foo, bar;'.  */
1440
              t.spec = lookup_name (value);
1441
            }
1442
          else
1443
            {
1444
              tree proto = NULL_TREE;
1445
              gcc_assert (c_dialect_objc ());
1446
              t.kind = ctsk_objc;
1447
              if (c_parser_next_token_is (parser, CPP_LESS))
1448
                proto = c_parser_objc_protocol_refs (parser);
1449
              t.spec = objc_get_protocol_qualified_type (value, proto);
1450
            }
1451
          declspecs_add_type (specs, t);
1452
          continue;
1453
        }
1454
      if (c_parser_next_token_is (parser, CPP_LESS))
1455
        {
1456
          /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
1457
             nisse@lysator.liu.se.  */
1458
          tree proto;
1459
          gcc_assert (c_dialect_objc ());
1460
          if (!typespec_ok || seen_type)
1461
            break;
1462
          proto = c_parser_objc_protocol_refs (parser);
1463
          t.kind = ctsk_objc;
1464
          t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
1465
          declspecs_add_type (specs, t);
1466
          continue;
1467
        }
1468
      gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
1469
      switch (c_parser_peek_token (parser)->keyword)
1470
        {
1471
        case RID_STATIC:
1472
        case RID_EXTERN:
1473
        case RID_REGISTER:
1474
        case RID_TYPEDEF:
1475
        case RID_INLINE:
1476
        case RID_AUTO:
1477
        case RID_THREAD:
1478
          if (!scspec_ok)
1479
            goto out;
1480
          attrs_ok = true;
1481
          /* TODO: Distinguish between function specifiers (inline)
1482
             and storage class specifiers, either here or in
1483
             declspecs_add_scspec.  */
1484
          declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
1485
          c_parser_consume_token (parser);
1486
          break;
1487
        case RID_UNSIGNED:
1488
        case RID_LONG:
1489
        case RID_SHORT:
1490
        case RID_SIGNED:
1491
        case RID_COMPLEX:
1492
        case RID_INT:
1493
        case RID_CHAR:
1494
        case RID_FLOAT:
1495
        case RID_DOUBLE:
1496
        case RID_VOID:
1497
        case RID_BOOL:
1498
          if (!typespec_ok)
1499
            goto out;
1500
          attrs_ok = true;
1501
          seen_type = true;
1502
          OBJC_NEED_RAW_IDENTIFIER (1);
1503
          t.kind = ctsk_resword;
1504
          t.spec = c_parser_peek_token (parser)->value;
1505
          declspecs_add_type (specs, t);
1506
          c_parser_consume_token (parser);
1507
          break;
1508
        case RID_ENUM:
1509
          if (!typespec_ok)
1510
            goto out;
1511
          attrs_ok = true;
1512
          seen_type = true;
1513
          t = c_parser_enum_specifier (parser);
1514
          declspecs_add_type (specs, t);
1515
          break;
1516
        case RID_STRUCT:
1517
        case RID_UNION:
1518
          if (!typespec_ok)
1519
            goto out;
1520
          attrs_ok = true;
1521
          seen_type = true;
1522
          t = c_parser_struct_or_union_specifier (parser);
1523
          declspecs_add_type (specs, t);
1524
          break;
1525
        case RID_TYPEOF:
1526
          /* ??? The old parser rejected typeof after other type
1527
             specifiers, but is a syntax error the best way of
1528
             handling this?  */
1529
          if (!typespec_ok || seen_type)
1530
            goto out;
1531
          attrs_ok = true;
1532
          seen_type = true;
1533
          t = c_parser_typeof_specifier (parser);
1534
          declspecs_add_type (specs, t);
1535
          break;
1536
        case RID_CONST:
1537
        case RID_VOLATILE:
1538
        case RID_RESTRICT:
1539
          attrs_ok = true;
1540
          declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
1541
          c_parser_consume_token (parser);
1542
          break;
1543
        case RID_ATTRIBUTE:
1544
          if (!attrs_ok)
1545
            goto out;
1546
          attrs = c_parser_attributes (parser);
1547
          declspecs_add_attrs (specs, attrs);
1548
          break;
1549
        default:
1550
          goto out;
1551
        }
1552
    }
1553
 out: ;
1554
}
1555
 
1556
/* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
1557
 
1558
   enum-specifier:
1559
     enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
1560
     enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
1561
     enum attributes[opt] identifier
1562
 
1563
   The form with trailing comma is new in C99.  The forms with
1564
   attributes are GNU extensions.  In GNU C, we accept any expression
1565
   without commas in the syntax (assignment expressions, not just
1566
   conditional expressions); assignment expressions will be diagnosed
1567
   as non-constant.
1568
 
1569
   enumerator-list:
1570
     enumerator
1571
     enumerator-list , enumerator
1572
 
1573
   enumerator:
1574
     enumeration-constant
1575
     enumeration-constant = constant-expression
1576
*/
1577
 
1578
static struct c_typespec
1579
c_parser_enum_specifier (c_parser *parser)
1580
{
1581
  struct c_typespec ret;
1582
  tree attrs;
1583
  tree ident = NULL_TREE;
1584
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
1585
  c_parser_consume_token (parser);
1586
  attrs = c_parser_attributes (parser);
1587
  if (c_parser_next_token_is (parser, CPP_NAME))
1588
    {
1589
      ident = c_parser_peek_token (parser)->value;
1590
      c_parser_consume_token (parser);
1591
    }
1592
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1593
    {
1594
      /* Parse an enum definition.  */
1595
      tree type = start_enum (ident);
1596
      tree postfix_attrs;
1597
      /* We chain the enumerators in reverse order, then put them in
1598
         forward order at the end.  */
1599
      tree values = NULL_TREE;
1600
      c_parser_consume_token (parser);
1601
      while (true)
1602
        {
1603
          tree enum_id;
1604
          tree enum_value;
1605
          tree enum_decl;
1606
          bool seen_comma;
1607
          if (c_parser_next_token_is_not (parser, CPP_NAME))
1608
            {
1609
              c_parser_error (parser, "expected identifier");
1610
              c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1611
              values = error_mark_node;
1612
              break;
1613
            }
1614
          enum_id = c_parser_peek_token (parser)->value;
1615
          c_parser_consume_token (parser);
1616
          if (c_parser_next_token_is (parser, CPP_EQ))
1617
            {
1618
              c_parser_consume_token (parser);
1619
              enum_value = c_parser_expr_no_commas (parser, NULL).value;
1620
            }
1621
          else
1622
            enum_value = NULL_TREE;
1623
          enum_decl = build_enumerator (enum_id, enum_value);
1624
          TREE_CHAIN (enum_decl) = values;
1625
          values = enum_decl;
1626
          seen_comma = false;
1627
          if (c_parser_next_token_is (parser, CPP_COMMA))
1628
            {
1629
              seen_comma = true;
1630
              c_parser_consume_token (parser);
1631
            }
1632
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1633
            {
1634
              if (seen_comma && pedantic && !flag_isoc99)
1635
                pedwarn ("comma at end of enumerator list");
1636
              c_parser_consume_token (parser);
1637
              break;
1638
            }
1639
          if (!seen_comma)
1640
            {
1641
              c_parser_error (parser, "expected %<,%> or %<}%>");
1642
              c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1643
              values = error_mark_node;
1644
              break;
1645
            }
1646
        }
1647
      postfix_attrs = c_parser_attributes (parser);
1648
      ret.spec = finish_enum (type, nreverse (values),
1649
                              chainon (attrs, postfix_attrs));
1650
      ret.kind = ctsk_tagdef;
1651
      return ret;
1652
    }
1653
  else if (!ident)
1654
    {
1655
      c_parser_error (parser, "expected %<{%>");
1656
      ret.spec = error_mark_node;
1657
      ret.kind = ctsk_tagref;
1658
      return ret;
1659
    }
1660
  ret = parser_xref_tag (ENUMERAL_TYPE, ident);
1661
  /* In ISO C, enumerated types can be referred to only if already
1662
     defined.  */
1663
  if (pedantic && !COMPLETE_TYPE_P (ret.spec))
1664
    pedwarn ("ISO C forbids forward references to %<enum%> types");
1665
  return ret;
1666
}
1667
 
1668
/* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
1669
 
1670
   struct-or-union-specifier:
1671
     struct-or-union attributes[opt] identifier[opt]
1672
       { struct-contents } attributes[opt]
1673
     struct-or-union attributes[opt] identifier
1674
 
1675
   struct-contents:
1676
     struct-declaration-list
1677
 
1678
   struct-declaration-list:
1679
     struct-declaration ;
1680
     struct-declaration-list struct-declaration ;
1681
 
1682
   GNU extensions:
1683
 
1684
   struct-contents:
1685
     empty
1686
     struct-declaration
1687
     struct-declaration-list struct-declaration
1688
 
1689
   struct-declaration-list:
1690
     struct-declaration-list ;
1691
     ;
1692
 
1693
   (Note that in the syntax here, unlike that in ISO C, the semicolons
1694
   are included here rather than in struct-declaration, in order to
1695
   describe the syntax with extra semicolons and missing semicolon at
1696
   end.)
1697
 
1698
   Objective-C:
1699
 
1700
   struct-declaration-list:
1701
     @defs ( class-name )
1702
 
1703
   (Note this does not include a trailing semicolon, but can be
1704
   followed by further declarations, and gets a pedwarn-if-pedantic
1705
   when followed by a semicolon.)  */
1706
 
1707
static struct c_typespec
1708
c_parser_struct_or_union_specifier (c_parser *parser)
1709
{
1710
  struct c_typespec ret;
1711
  tree attrs;
1712
  tree ident = NULL_TREE;
1713
  enum tree_code code;
1714
  switch (c_parser_peek_token (parser)->keyword)
1715
    {
1716
    case RID_STRUCT:
1717
      code = RECORD_TYPE;
1718
      break;
1719
    case RID_UNION:
1720
      code = UNION_TYPE;
1721
      break;
1722
    default:
1723
      gcc_unreachable ();
1724
    }
1725
  c_parser_consume_token (parser);
1726
  attrs = c_parser_attributes (parser);
1727
  if (c_parser_next_token_is (parser, CPP_NAME))
1728
    {
1729
      ident = c_parser_peek_token (parser)->value;
1730
      c_parser_consume_token (parser);
1731
    }
1732
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1733
    {
1734
      /* Parse a struct or union definition.  Start the scope of the
1735
         tag before parsing components.  */
1736
      tree type = start_struct (code, ident);
1737
      tree postfix_attrs;
1738
      /* We chain the components in reverse order, then put them in
1739
         forward order at the end.  Each struct-declaration may
1740
         declare multiple components (comma-separated), so we must use
1741
         chainon to join them, although when parsing each
1742
         struct-declaration we can use TREE_CHAIN directly.
1743
 
1744
         The theory behind all this is that there will be more
1745
         semicolon separated fields than comma separated fields, and
1746
         so we'll be minimizing the number of node traversals required
1747
         by chainon.  */
1748
      tree contents = NULL_TREE;
1749
      c_parser_consume_token (parser);
1750
      /* Handle the Objective-C @defs construct,
1751
         e.g. foo(sizeof(struct{ @defs(ClassName) }));.  */
1752
      if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
1753
        {
1754
          tree name;
1755
          gcc_assert (c_dialect_objc ());
1756
          c_parser_consume_token (parser);
1757
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1758
            goto end_at_defs;
1759
          if (c_parser_next_token_is (parser, CPP_NAME)
1760
              && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
1761
            {
1762
              name = c_parser_peek_token (parser)->value;
1763
              c_parser_consume_token (parser);
1764
            }
1765
          else
1766
            {
1767
              c_parser_error (parser, "expected class name");
1768
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
1769
              goto end_at_defs;
1770
            }
1771
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
1772
                                     "expected %<)%>");
1773
          contents = nreverse (objc_get_class_ivars (name));
1774
        }
1775
    end_at_defs:
1776
      /* Parse the struct-declarations and semicolons.  Problems with
1777
         semicolons are diagnosed here; empty structures are diagnosed
1778
         elsewhere.  */
1779
      while (true)
1780
        {
1781
          tree decls;
1782
          /* Parse any stray semicolon.  */
1783
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1784
            {
1785
              if (pedantic)
1786
                pedwarn ("extra semicolon in struct or union specified");
1787
              c_parser_consume_token (parser);
1788
              continue;
1789
            }
1790
          /* Stop if at the end of the struct or union contents.  */
1791
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1792
            {
1793
              c_parser_consume_token (parser);
1794
              break;
1795
            }
1796
          /* Parse some comma-separated declarations, but not the
1797
             trailing semicolon if any.  */
1798
          decls = c_parser_struct_declaration (parser);
1799
          contents = chainon (decls, contents);
1800
          /* If no semicolon follows, either we have a parse error or
1801
             are at the end of the struct or union and should
1802
             pedwarn.  */
1803
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1804
            c_parser_consume_token (parser);
1805
          else
1806
            {
1807
              if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1808
                pedwarn ("no semicolon at end of struct or union");
1809
              else
1810
                {
1811
                  c_parser_error (parser, "expected %<;%>");
1812
                  c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1813
                  break;
1814
                }
1815
            }
1816
        }
1817
      postfix_attrs = c_parser_attributes (parser);
1818
      ret.spec = finish_struct (type, nreverse (contents),
1819
                                chainon (attrs, postfix_attrs));
1820
      ret.kind = ctsk_tagdef;
1821
      return ret;
1822
    }
1823
  else if (!ident)
1824
    {
1825
      c_parser_error (parser, "expected %<{%>");
1826
      ret.spec = error_mark_node;
1827
      ret.kind = ctsk_tagref;
1828
      return ret;
1829
    }
1830
  ret = parser_xref_tag (code, ident);
1831
  return ret;
1832
}
1833
 
1834
/* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
1835
   the trailing semicolon.
1836
 
1837
   struct-declaration:
1838
     specifier-qualifier-list struct-declarator-list
1839
 
1840
   specifier-qualifier-list:
1841
     type-specifier specifier-qualifier-list[opt]
1842
     type-qualifier specifier-qualifier-list[opt]
1843
     attributes specifier-qualifier-list[opt]
1844
 
1845
   struct-declarator-list:
1846
     struct-declarator
1847
     struct-declarator-list , attributes[opt] struct-declarator
1848
 
1849
   struct-declarator:
1850
     declarator attributes[opt]
1851
     declarator[opt] : constant-expression attributes[opt]
1852
 
1853
   GNU extensions:
1854
 
1855
   struct-declaration:
1856
     __extension__ struct-declaration
1857
     specifier-qualifier-list
1858
 
1859
   Unlike the ISO C syntax, semicolons are handled elsewhere.  The use
1860
   of attributes where shown is a GNU extension.  In GNU C, we accept
1861
   any expression without commas in the syntax (assignment
1862
   expressions, not just conditional expressions); assignment
1863
   expressions will be diagnosed as non-constant.  */
1864
 
1865
static tree
1866
c_parser_struct_declaration (c_parser *parser)
1867
{
1868
  struct c_declspecs *specs;
1869
  tree prefix_attrs;
1870
  tree all_prefix_attrs;
1871
  tree decls;
1872
  if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
1873
    {
1874
      int ext;
1875
      tree decl;
1876
      ext = disable_extension_diagnostics ();
1877
      c_parser_consume_token (parser);
1878
      decl = c_parser_struct_declaration (parser);
1879
      restore_extension_diagnostics (ext);
1880
      return decl;
1881
    }
1882
  specs = build_null_declspecs ();
1883
  c_parser_declspecs (parser, specs, false, true, true);
1884
  if (parser->error)
1885
    return NULL_TREE;
1886
  if (!specs->declspecs_seen_p)
1887
    {
1888
      c_parser_error (parser, "expected specifier-qualifier-list");
1889
      return NULL_TREE;
1890
    }
1891
  finish_declspecs (specs);
1892
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1893
    {
1894
      tree ret;
1895
      if (!specs->type_seen_p)
1896
        {
1897
          if (pedantic)
1898
            pedwarn ("ISO C forbids member declarations with no members");
1899
          shadow_tag_warned (specs, pedantic);
1900
          ret = NULL_TREE;
1901
        }
1902
      else
1903
        {
1904
          /* Support for unnamed structs or unions as members of
1905
             structs or unions (which is [a] useful and [b] supports
1906
             MS P-SDK).  */
1907
          ret = grokfield (build_id_declarator (NULL_TREE), specs, NULL_TREE);
1908
        }
1909
      return ret;
1910
    }
1911
  pending_xref_error ();
1912
  prefix_attrs = specs->attrs;
1913
  all_prefix_attrs = prefix_attrs;
1914
  specs->attrs = NULL_TREE;
1915
  decls = NULL_TREE;
1916
  while (true)
1917
    {
1918
      /* Declaring one or more declarators or un-named bit-fields.  */
1919
      struct c_declarator *declarator;
1920
      bool dummy = false;
1921
      if (c_parser_next_token_is (parser, CPP_COLON))
1922
        declarator = build_id_declarator (NULL_TREE);
1923
      else
1924
        declarator = c_parser_declarator (parser, specs->type_seen_p,
1925
                                          C_DTR_NORMAL, &dummy);
1926
      if (declarator == NULL)
1927
        {
1928
          c_parser_skip_to_end_of_block_or_statement (parser);
1929
          break;
1930
        }
1931
      if (c_parser_next_token_is (parser, CPP_COLON)
1932
          || c_parser_next_token_is (parser, CPP_COMMA)
1933
          || c_parser_next_token_is (parser, CPP_SEMICOLON)
1934
          || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
1935
          || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1936
        {
1937
          tree postfix_attrs = NULL_TREE;
1938
          tree width = NULL_TREE;
1939
          tree d;
1940
          if (c_parser_next_token_is (parser, CPP_COLON))
1941
            {
1942
              c_parser_consume_token (parser);
1943
              width = c_parser_expr_no_commas (parser, NULL).value;
1944
            }
1945
          if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1946
            postfix_attrs = c_parser_attributes (parser);
1947
          d = grokfield (declarator, specs, width);
1948
          decl_attributes (&d, chainon (postfix_attrs,
1949
                                        all_prefix_attrs), 0);
1950
          TREE_CHAIN (d) = decls;
1951
          decls = d;
1952
          if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1953
            all_prefix_attrs = chainon (c_parser_attributes (parser),
1954
                                        prefix_attrs);
1955
          else
1956
            all_prefix_attrs = prefix_attrs;
1957
          if (c_parser_next_token_is (parser, CPP_COMMA))
1958
            c_parser_consume_token (parser);
1959
          else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
1960
                   || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1961
            {
1962
              /* Semicolon consumed in caller.  */
1963
              break;
1964
            }
1965
          else
1966
            {
1967
              c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
1968
              break;
1969
            }
1970
        }
1971
      else
1972
        {
1973
          c_parser_error (parser,
1974
                          "expected %<:%>, %<,%>, %<;%>, %<}%> or "
1975
                          "%<__attribute__%>");
1976
          break;
1977
        }
1978
    }
1979
  return decls;
1980
}
1981
 
1982
/* Parse a typeof specifier (a GNU extension).
1983
 
1984
   typeof-specifier:
1985
     typeof ( expression )
1986
     typeof ( type-name )
1987
*/
1988
 
1989
static struct c_typespec
1990
c_parser_typeof_specifier (c_parser *parser)
1991
{
1992
  struct c_typespec ret;
1993
  ret.kind = ctsk_typeof;
1994
  ret.spec = error_mark_node;
1995
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
1996
  c_parser_consume_token (parser);
1997
  skip_evaluation++;
1998
  in_typeof++;
1999
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2000
    {
2001
      skip_evaluation--;
2002
      in_typeof--;
2003
      return ret;
2004
    }
2005
  if (c_parser_next_token_starts_typename (parser))
2006
    {
2007
      struct c_type_name *type = c_parser_type_name (parser);
2008
      skip_evaluation--;
2009
      in_typeof--;
2010
      if (type != NULL)
2011
        {
2012
          ret.spec = groktypename (type);
2013
          pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2014
        }
2015
    }
2016
  else
2017
    {
2018
      struct c_expr expr = c_parser_expression (parser);
2019
      skip_evaluation--;
2020
      in_typeof--;
2021
      if (TREE_CODE (expr.value) == COMPONENT_REF
2022
          && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2023
        error ("%<typeof%> applied to a bit-field");
2024
      ret.spec = TREE_TYPE (expr.value);
2025
      pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2026
    }
2027
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2028
  return ret;
2029
}
2030
 
2031
/* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2032
   6.5.5, C99 6.7.5, 6.7.6).  If TYPE_SEEN_P then a typedef name may
2033
   be redeclared; otherwise it may not.  KIND indicates which kind of
2034
   declarator is wanted.  Returns a valid declarator except in the
2035
   case of a syntax error in which case NULL is returned.  *SEEN_ID is
2036
   set to true if an identifier being declared is seen; this is used
2037
   to diagnose bad forms of abstract array declarators and to
2038
   determine whether an identifier list is syntactically permitted.
2039
 
2040
   declarator:
2041
     pointer[opt] direct-declarator
2042
 
2043
   direct-declarator:
2044
     identifier
2045
     ( attributes[opt] declarator )
2046
     direct-declarator array-declarator
2047
     direct-declarator ( parameter-type-list )
2048
     direct-declarator ( identifier-list[opt] )
2049
 
2050
   pointer:
2051
     * type-qualifier-list[opt]
2052
     * type-qualifier-list[opt] pointer
2053
 
2054
   type-qualifier-list:
2055
     type-qualifier
2056
     attributes
2057
     type-qualifier-list type-qualifier
2058
     type-qualifier-list attributes
2059
 
2060
   parameter-type-list:
2061
     parameter-list
2062
     parameter-list , ...
2063
 
2064
   parameter-list:
2065
     parameter-declaration
2066
     parameter-list , parameter-declaration
2067
 
2068
   parameter-declaration:
2069
     declaration-specifiers declarator attributes[opt]
2070
     declaration-specifiers abstract-declarator[opt] attributes[opt]
2071
 
2072
   identifier-list:
2073
     identifier
2074
     identifier-list , identifier
2075
 
2076
   abstract-declarator:
2077
     pointer
2078
     pointer[opt] direct-abstract-declarator
2079
 
2080
   direct-abstract-declarator:
2081
     ( attributes[opt] abstract-declarator )
2082
     direct-abstract-declarator[opt] array-declarator
2083
     direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2084
 
2085
   GNU extensions:
2086
 
2087
   direct-declarator:
2088
     direct-declarator ( parameter-forward-declarations
2089
                         parameter-type-list[opt] )
2090
 
2091
   direct-abstract-declarator:
2092
     direct-abstract-declarator[opt] ( parameter-forward-declarations
2093
                                       parameter-type-list[opt] )
2094
 
2095
   parameter-forward-declarations:
2096
     parameter-list ;
2097
     parameter-forward-declarations parameter-list ;
2098
 
2099
   The uses of attributes shown above are GNU extensions.
2100
 
2101
   Some forms of array declarator are not included in C99 in the
2102
   syntax for abstract declarators; these are disallowed elsewhere.
2103
   This may be a defect (DR#289).
2104
 
2105
   This function also accepts an omitted abstract declarator as being
2106
   an abstract declarator, although not part of the formal syntax.  */
2107
 
2108
static struct c_declarator *
2109
c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2110
                     bool *seen_id)
2111
{
2112
  /* Parse any initial pointer part.  */
2113
  if (c_parser_next_token_is (parser, CPP_MULT))
2114
    {
2115
      struct c_declspecs *quals_attrs = build_null_declspecs ();
2116
      struct c_declarator *inner;
2117
      c_parser_consume_token (parser);
2118
      c_parser_declspecs (parser, quals_attrs, false, false, true);
2119
      inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2120
      if (inner == NULL)
2121
        return NULL;
2122
      else
2123
        return make_pointer_declarator (quals_attrs, inner);
2124
    }
2125
  /* Now we have a direct declarator, direct abstract declarator or
2126
     nothing (which counts as a direct abstract declarator here).  */
2127
  return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2128
}
2129
 
2130
/* Parse a direct declarator or direct abstract declarator; arguments
2131
   as c_parser_declarator.  */
2132
 
2133
static struct c_declarator *
2134
c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2135
                            bool *seen_id)
2136
{
2137
  /* The direct declarator must start with an identifier (possibly
2138
     omitted) or a parenthesized declarator (possibly abstract).  In
2139
     an ordinary declarator, initial parentheses must start a
2140
     parenthesized declarator.  In an abstract declarator or parameter
2141
     declarator, they could start a parenthesized declarator or a
2142
     parameter list.  To tell which, the open parenthesis and any
2143
     following attributes must be read.  If a declaration specifier
2144
     follows, then it is a parameter list; if the specifier is a
2145
     typedef name, there might be an ambiguity about redeclaring it,
2146
     which is resolved in the direction of treating it as a typedef
2147
     name.  If a close parenthesis follows, it is also an empty
2148
     parameter list, as the syntax does not permit empty abstract
2149
     declarators.  Otherwise, it is a parenthesized declarator (in
2150
     which case the analysis may be repeated inside it, recursively).
2151
 
2152
     ??? There is an ambiguity in a parameter declaration "int
2153
     (__attribute__((foo)) x)", where x is not a typedef name: it
2154
     could be an abstract declarator for a function, or declare x with
2155
     parentheses.  The proper resolution of this ambiguity needs
2156
     documenting.  At present we follow an accident of the old
2157
     parser's implementation, whereby the first parameter must have
2158
     some declaration specifiers other than just attributes.  Thus as
2159
     a parameter declaration it is treated as a parenthesized
2160
     parameter named x, and as an abstract declarator it is
2161
     rejected.
2162
 
2163
     ??? Also following the old parser, attributes inside an empty
2164
     parameter list are ignored, making it a list not yielding a
2165
     prototype, rather than giving an error or making it have one
2166
     parameter with implicit type int.
2167
 
2168
     ??? Also following the old parser, typedef names may be
2169
     redeclared in declarators, but not Objective-C class names.  */
2170
 
2171
  if (kind != C_DTR_ABSTRACT
2172
      && c_parser_next_token_is (parser, CPP_NAME)
2173
      && ((type_seen_p
2174
           && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
2175
          || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2176
    {
2177
      struct c_declarator *inner
2178
        = build_id_declarator (c_parser_peek_token (parser)->value);
2179
      *seen_id = true;
2180
      inner->id_loc = c_parser_peek_token (parser)->location;
2181
      c_parser_consume_token (parser);
2182
      return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2183
    }
2184
 
2185
  if (kind != C_DTR_NORMAL
2186
      && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2187
    {
2188
      struct c_declarator *inner = build_id_declarator (NULL_TREE);
2189
      return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2190
    }
2191
 
2192
  /* Either we are at the end of an abstract declarator, or we have
2193
     parentheses.  */
2194
 
2195
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2196
    {
2197
      tree attrs;
2198
      struct c_declarator *inner;
2199
      c_parser_consume_token (parser);
2200
      attrs = c_parser_attributes (parser);
2201
      if (kind != C_DTR_NORMAL
2202
          && (c_parser_next_token_starts_declspecs (parser)
2203
              || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2204
        {
2205
          struct c_arg_info *args
2206
            = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2207
                                         attrs);
2208
          if (args == NULL)
2209
            return NULL;
2210
          else
2211
            {
2212
              inner
2213
                = build_function_declarator (args,
2214
                                             build_id_declarator (NULL_TREE));
2215
              return c_parser_direct_declarator_inner (parser, *seen_id,
2216
                                                       inner);
2217
            }
2218
        }
2219
      /* A parenthesized declarator.  */
2220
      inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2221
      if (inner != NULL && attrs != NULL)
2222
        inner = build_attrs_declarator (attrs, inner);
2223
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2224
        {
2225
          c_parser_consume_token (parser);
2226
          if (inner == NULL)
2227
            return NULL;
2228
          else
2229
            return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2230
        }
2231
      else
2232
        {
2233
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2234
                                     "expected %<)%>");
2235
          return NULL;
2236
        }
2237
    }
2238
  else
2239
    {
2240
      if (kind == C_DTR_NORMAL)
2241
        {
2242
          c_parser_error (parser, "expected identifier or %<(%>");
2243
          return NULL;
2244
        }
2245
      else
2246
        return build_id_declarator (NULL_TREE);
2247
    }
2248
}
2249
 
2250
/* Parse part of a direct declarator or direct abstract declarator,
2251
   given that some (in INNER) has already been parsed; ID_PRESENT is
2252
   true if an identifier is present, false for an abstract
2253
   declarator.  */
2254
 
2255
static struct c_declarator *
2256
c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2257
                                  struct c_declarator *inner)
2258
{
2259
  /* Parse a sequence of array declarators and parameter lists.  */
2260
  if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2261
    {
2262
      struct c_declarator *declarator;
2263
      struct c_declspecs *quals_attrs = build_null_declspecs ();
2264
      bool static_seen;
2265
      bool star_seen;
2266
      tree dimen;
2267
      c_parser_consume_token (parser);
2268
      c_parser_declspecs (parser, quals_attrs, false, false, true);
2269
      static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2270
      if (static_seen)
2271
        c_parser_consume_token (parser);
2272
      if (static_seen && !quals_attrs->declspecs_seen_p)
2273
        c_parser_declspecs (parser, quals_attrs, false, false, true);
2274
      if (!quals_attrs->declspecs_seen_p)
2275
        quals_attrs = NULL;
2276
      /* If "static" is present, there must be an array dimension.
2277
         Otherwise, there may be a dimension, "*", or no
2278
         dimension.  */
2279
      if (static_seen)
2280
        {
2281
          star_seen = false;
2282
          dimen = c_parser_expr_no_commas (parser, NULL).value;
2283
        }
2284
      else
2285
        {
2286
          if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2287
            {
2288
              dimen = NULL_TREE;
2289
              star_seen = false;
2290
            }
2291
          else if (c_parser_next_token_is (parser, CPP_MULT))
2292
            {
2293
              if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2294
                {
2295
                  dimen = NULL_TREE;
2296
                  star_seen = true;
2297
                  c_parser_consume_token (parser);
2298
                }
2299
              else
2300
                {
2301
                  star_seen = false;
2302
                  dimen = c_parser_expr_no_commas (parser, NULL).value;
2303
                }
2304
            }
2305
          else
2306
            {
2307
              star_seen = false;
2308
              dimen = c_parser_expr_no_commas (parser, NULL).value;
2309
            }
2310
        }
2311
      if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2312
        c_parser_consume_token (parser);
2313
      else
2314
        {
2315
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2316
                                     "expected %<]%>");
2317
          return NULL;
2318
        }
2319
      declarator = build_array_declarator (dimen, quals_attrs, static_seen,
2320
                                           star_seen);
2321
      inner = set_array_declarator_inner (declarator, inner, !id_present);
2322
      return c_parser_direct_declarator_inner (parser, id_present, inner);
2323
    }
2324
  else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2325
    {
2326
      tree attrs;
2327
      struct c_arg_info *args;
2328
      c_parser_consume_token (parser);
2329
      attrs = c_parser_attributes (parser);
2330
      args = c_parser_parms_declarator (parser, id_present, attrs);
2331
      if (args == NULL)
2332
        return NULL;
2333
      else
2334
        {
2335
          inner = build_function_declarator (args, inner);
2336
          return c_parser_direct_declarator_inner (parser, id_present, inner);
2337
        }
2338
    }
2339
  return inner;
2340
}
2341
 
2342
/* Parse a parameter list or identifier list, including the closing
2343
   parenthesis but not the opening one.  ATTRS are the attributes at
2344
   the start of the list.  ID_LIST_OK is true if an identifier list is
2345
   acceptable; such a list must not have attributes at the start.  */
2346
 
2347
static struct c_arg_info *
2348
c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
2349
{
2350
  push_scope ();
2351
  declare_parm_level ();
2352
  /* If the list starts with an identifier, it is an identifier list.
2353
     Otherwise, it is either a prototype list or an empty list.  */
2354
  if (id_list_ok
2355
      && !attrs
2356
      && c_parser_next_token_is (parser, CPP_NAME)
2357
      && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2358
    {
2359
      tree list = NULL_TREE, *nextp = &list;
2360
      while (c_parser_next_token_is (parser, CPP_NAME)
2361
             && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2362
        {
2363
          *nextp = build_tree_list (NULL_TREE,
2364
                                    c_parser_peek_token (parser)->value);
2365
          nextp = & TREE_CHAIN (*nextp);
2366
          c_parser_consume_token (parser);
2367
          if (c_parser_next_token_is_not (parser, CPP_COMMA))
2368
            break;
2369
          c_parser_consume_token (parser);
2370
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2371
            {
2372
              c_parser_error (parser, "expected identifier");
2373
              break;
2374
            }
2375
        }
2376
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2377
        {
2378
          struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2379
          ret->parms = 0;
2380
          ret->tags = 0;
2381
          ret->types = list;
2382
          ret->others = 0;
2383
          c_parser_consume_token (parser);
2384
          pop_scope ();
2385
          return ret;
2386
        }
2387
      else
2388
        {
2389
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2390
                                     "expected %<)%>");
2391
          pop_scope ();
2392
          return NULL;
2393
        }
2394
    }
2395
  else
2396
    {
2397
      struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
2398
      pop_scope ();
2399
      return ret;
2400
    }
2401
}
2402
 
2403
/* Parse a parameter list (possibly empty), including the closing
2404
   parenthesis but not the opening one.  ATTRS are the attributes at
2405
   the start of the list.  */
2406
 
2407
static struct c_arg_info *
2408
c_parser_parms_list_declarator (c_parser *parser, tree attrs)
2409
{
2410
  bool good_parm = false;
2411
  /* ??? Following the old parser, forward parameter declarations may
2412
     use abstract declarators, and if no real parameter declarations
2413
     follow the forward declarations then this is not diagnosed.  Also
2414
     note as above that attributes are ignored as the only contents of
2415
     the parentheses, or as the only contents after forward
2416
     declarations.  */
2417
  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2418
    {
2419
      struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2420
      ret->parms = 0;
2421
      ret->tags = 0;
2422
      ret->types = 0;
2423
      ret->others = 0;
2424
      c_parser_consume_token (parser);
2425
      return ret;
2426
    }
2427
  if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2428
    {
2429
      struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2430
      ret->parms = 0;
2431
      ret->tags = 0;
2432
      ret->others = 0;
2433
      /* Suppress -Wold-style-definition for this case.  */
2434
      ret->types = error_mark_node;
2435
      error ("ISO C requires a named argument before %<...%>");
2436
      c_parser_consume_token (parser);
2437
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2438
        {
2439
          c_parser_consume_token (parser);
2440
          return ret;
2441
        }
2442
      else
2443
        {
2444
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2445
                                     "expected %<)%>");
2446
          return NULL;
2447
        }
2448
    }
2449
  /* Nonempty list of parameters, either terminated with semicolon
2450
     (forward declarations; recurse) or with close parenthesis (normal
2451
     function) or with ", ... )" (variadic function).  */
2452
  while (true)
2453
    {
2454
      /* Parse a parameter.  */
2455
      struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
2456
      attrs = NULL_TREE;
2457
      if (parm != NULL)
2458
        {
2459
          good_parm = true;
2460
          push_parm_decl (parm);
2461
        }
2462
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2463
        {
2464
          tree new_attrs;
2465
          c_parser_consume_token (parser);
2466
          mark_forward_parm_decls ();
2467
          new_attrs = c_parser_attributes (parser);
2468
          return c_parser_parms_list_declarator (parser, new_attrs);
2469
        }
2470
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2471
        {
2472
          c_parser_consume_token (parser);
2473
          if (good_parm)
2474
            return get_parm_info (false);
2475
          else
2476
            {
2477
              struct c_arg_info *ret
2478
                = XOBNEW (&parser_obstack, struct c_arg_info);
2479
              ret->parms = 0;
2480
              ret->tags = 0;
2481
              ret->types = 0;
2482
              ret->others = 0;
2483
              return ret;
2484
            }
2485
        }
2486
      if (!c_parser_require (parser, CPP_COMMA,
2487
                             "expected %<;%>, %<,%> or %<)%>"))
2488
        {
2489
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2490
          return NULL;
2491
        }
2492
      if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2493
        {
2494
          c_parser_consume_token (parser);
2495
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2496
            {
2497
              c_parser_consume_token (parser);
2498
              if (good_parm)
2499
                return get_parm_info (true);
2500
              else
2501
                {
2502
                  struct c_arg_info *ret
2503
                    = XOBNEW (&parser_obstack, struct c_arg_info);
2504
                  ret->parms = 0;
2505
                  ret->tags = 0;
2506
                  ret->types = 0;
2507
                  ret->others = 0;
2508
                  return ret;
2509
                }
2510
            }
2511
          else
2512
            {
2513
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2514
                                         "expected %<)%>");
2515
              return NULL;
2516
            }
2517
        }
2518
    }
2519
}
2520
 
2521
/* Parse a parameter declaration.  ATTRS are the attributes at the
2522
   start of the declaration if it is the first parameter.  */
2523
 
2524
static struct c_parm *
2525
c_parser_parameter_declaration (c_parser *parser, tree attrs)
2526
{
2527
  struct c_declspecs *specs;
2528
  struct c_declarator *declarator;
2529
  tree prefix_attrs;
2530
  tree postfix_attrs = NULL_TREE;
2531
  bool dummy = false;
2532
  if (!c_parser_next_token_starts_declspecs (parser))
2533
    {
2534
      /* ??? In some Objective-C cases '...' isn't applicable so there
2535
         should be a different message.  */
2536
      c_parser_error (parser,
2537
                      "expected declaration specifiers or %<...%>");
2538
      c_parser_skip_to_end_of_parameter (parser);
2539
      return NULL;
2540
    }
2541
  specs = build_null_declspecs ();
2542
  if (attrs)
2543
    {
2544
      declspecs_add_attrs (specs, attrs);
2545
      attrs = NULL_TREE;
2546
    }
2547
  c_parser_declspecs (parser, specs, true, true, true);
2548
  finish_declspecs (specs);
2549
  pending_xref_error ();
2550
  prefix_attrs = specs->attrs;
2551
  specs->attrs = NULL_TREE;
2552
  declarator = c_parser_declarator (parser, specs->type_seen_p,
2553
                                    C_DTR_PARM, &dummy);
2554
  if (declarator == NULL)
2555
    {
2556
      c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2557
      return NULL;
2558
    }
2559
  if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2560
    postfix_attrs = c_parser_attributes (parser);
2561
  return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
2562
                       declarator);
2563
}
2564
 
2565
/* Parse a string literal in an asm expression.  It should not be
2566
   translated, and wide string literals are an error although
2567
   permitted by the syntax.  This is a GNU extension.
2568
 
2569
   asm-string-literal:
2570
     string-literal
2571
 
2572
   ??? At present, following the old parser, the caller needs to have
2573
   set c_lex_string_translate to 0.  It would be better to follow the
2574
   C++ parser rather than using the c_lex_string_translate kludge.  */
2575
 
2576
static tree
2577
c_parser_asm_string_literal (c_parser *parser)
2578
{
2579
  tree str;
2580
  if (c_parser_next_token_is (parser, CPP_STRING))
2581
    {
2582
      str = c_parser_peek_token (parser)->value;
2583
      c_parser_consume_token (parser);
2584
    }
2585
  else if (c_parser_next_token_is (parser, CPP_WSTRING))
2586
    {
2587
      error ("wide string literal in %<asm%>");
2588
      str = build_string (1, "");
2589
      c_parser_consume_token (parser);
2590
    }
2591
  else
2592
    {
2593
      c_parser_error (parser, "expected string literal");
2594
      str = NULL_TREE;
2595
    }
2596
  return str;
2597
}
2598
 
2599
/* Parse a simple asm expression.  This is used in restricted
2600
   contexts, where a full expression with inputs and outputs does not
2601
   make sense.  This is a GNU extension.
2602
 
2603
   simple-asm-expr:
2604
     asm ( asm-string-literal )
2605
*/
2606
 
2607
static tree
2608
c_parser_simple_asm_expr (c_parser *parser)
2609
{
2610
  tree str;
2611
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
2612
  /* ??? Follow the C++ parser rather than using the
2613
     c_lex_string_translate kludge.  */
2614
  c_lex_string_translate = 0;
2615
  c_parser_consume_token (parser);
2616
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2617
    {
2618
      c_lex_string_translate = 1;
2619
      return NULL_TREE;
2620
    }
2621
  str = c_parser_asm_string_literal (parser);
2622
  c_lex_string_translate = 1;
2623
  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
2624
    {
2625
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2626
      return NULL_TREE;
2627
    }
2628
  return str;
2629
}
2630
 
2631
/* Parse (possibly empty) attributes.  This is a GNU extension.
2632
 
2633
   attributes:
2634
     empty
2635
     attributes attribute
2636
 
2637
   attribute:
2638
     __attribute__ ( ( attribute-list ) )
2639
 
2640
   attribute-list:
2641
     attrib
2642
     attribute_list , attrib
2643
 
2644
   attrib:
2645
     empty
2646
     any-word
2647
     any-word ( identifier )
2648
     any-word ( identifier , nonempty-expr-list )
2649
     any-word ( expr-list )
2650
 
2651
   where the "identifier" must not be declared as a type, and
2652
   "any-word" may be any identifier (including one declared as a
2653
   type), a reserved word storage class specifier, type specifier or
2654
   type qualifier.  ??? This still leaves out most reserved keywords
2655
   (following the old parser), shouldn't we include them, and why not
2656
   allow identifiers declared as types to start the arguments?  */
2657
 
2658
static tree
2659
c_parser_attributes (c_parser *parser)
2660
{
2661
  tree attrs = NULL_TREE;
2662
  while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2663
    {
2664
      /* ??? Follow the C++ parser rather than using the
2665
         c_lex_string_translate kludge.  */
2666
      c_lex_string_translate = 0;
2667
      c_parser_consume_token (parser);
2668
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2669
        {
2670
          c_lex_string_translate = 1;
2671
          return attrs;
2672
        }
2673
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2674
        {
2675
          c_lex_string_translate = 1;
2676
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2677
          return attrs;
2678
        }
2679
      /* Parse the attribute list.  */
2680
      while (c_parser_next_token_is (parser, CPP_COMMA)
2681
             || c_parser_next_token_is (parser, CPP_NAME)
2682
             || c_parser_next_token_is (parser, CPP_KEYWORD))
2683
        {
2684
          tree attr, attr_name, attr_args;
2685
          if (c_parser_next_token_is (parser, CPP_COMMA))
2686
            {
2687
              c_parser_consume_token (parser);
2688
              continue;
2689
            }
2690
          if (c_parser_next_token_is (parser, CPP_KEYWORD))
2691
            {
2692
              /* ??? See comment above about what keywords are
2693
                 accepted here.  */
2694
              bool ok;
2695
              switch (c_parser_peek_token (parser)->keyword)
2696
                {
2697
                case RID_STATIC:
2698
                case RID_UNSIGNED:
2699
                case RID_LONG:
2700
                case RID_CONST:
2701
                case RID_EXTERN:
2702
                case RID_REGISTER:
2703
                case RID_TYPEDEF:
2704
                case RID_SHORT:
2705
                case RID_INLINE:
2706
                case RID_VOLATILE:
2707
                case RID_SIGNED:
2708
                case RID_AUTO:
2709
                case RID_RESTRICT:
2710
                case RID_COMPLEX:
2711
                case RID_THREAD:
2712
                case RID_INT:
2713
                case RID_CHAR:
2714
                case RID_FLOAT:
2715
                case RID_DOUBLE:
2716
                case RID_VOID:
2717
                case RID_BOOL:
2718
                  ok = true;
2719
                  break;
2720
                default:
2721
                  ok = false;
2722
                  break;
2723
                }
2724
              if (!ok)
2725
                break;
2726
            }
2727
          attr_name = c_parser_peek_token (parser)->value;
2728
          c_parser_consume_token (parser);
2729
          if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
2730
            {
2731
              attr = build_tree_list (attr_name, NULL_TREE);
2732
              attrs = chainon (attrs, attr);
2733
              continue;
2734
            }
2735
          c_parser_consume_token (parser);
2736
          /* Parse the attribute contents.  If they start with an
2737
             identifier which is followed by a comma or close
2738
             parenthesis, then the arguments start with that
2739
             identifier; otherwise they are an expression list.  */
2740
          if (c_parser_next_token_is (parser, CPP_NAME)
2741
              && c_parser_peek_token (parser)->id_kind == C_ID_ID
2742
              && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
2743
                  || (c_parser_peek_2nd_token (parser)->type
2744
                      == CPP_CLOSE_PAREN)))
2745
            {
2746
              tree arg1 = c_parser_peek_token (parser)->value;
2747
              c_parser_consume_token (parser);
2748
              if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2749
                attr_args = build_tree_list (NULL_TREE, arg1);
2750
              else
2751
                {
2752
                  c_parser_consume_token (parser);
2753
                  attr_args = tree_cons (NULL_TREE, arg1,
2754
                                         c_parser_expr_list (parser, false));
2755
                }
2756
            }
2757
          else
2758
            {
2759
              if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2760
                attr_args = NULL_TREE;
2761
              else
2762
                attr_args = c_parser_expr_list (parser, false);
2763
            }
2764
          attr = build_tree_list (attr_name, attr_args);
2765
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2766
            c_parser_consume_token (parser);
2767
          else
2768
            {
2769
              c_lex_string_translate = 1;
2770
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2771
                                         "expected %<)%>");
2772
              return attrs;
2773
            }
2774
          attrs = chainon (attrs, attr);
2775
        }
2776
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2777
        c_parser_consume_token (parser);
2778
      else
2779
        {
2780
          c_lex_string_translate = 1;
2781
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2782
                                     "expected %<)%>");
2783
          return attrs;
2784
        }
2785
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2786
        c_parser_consume_token (parser);
2787
      else
2788
        {
2789
          c_lex_string_translate = 1;
2790
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2791
                                     "expected %<)%>");
2792
          return attrs;
2793
        }
2794
      c_lex_string_translate = 1;
2795
    }
2796
  return attrs;
2797
}
2798
 
2799
/* Parse a type name (C90 6.5.5, C99 6.7.6).
2800
 
2801
   type-name:
2802
     specifier-qualifier-list abstract-declarator[opt]
2803
*/
2804
 
2805
static struct c_type_name *
2806
c_parser_type_name (c_parser *parser)
2807
{
2808
  struct c_declspecs *specs = build_null_declspecs ();
2809
  struct c_declarator *declarator;
2810
  struct c_type_name *ret;
2811
  bool dummy = false;
2812
  c_parser_declspecs (parser, specs, false, true, true);
2813
  if (!specs->declspecs_seen_p)
2814
    {
2815
      c_parser_error (parser, "expected specifier-qualifier-list");
2816
      return NULL;
2817
    }
2818
  pending_xref_error ();
2819
  finish_declspecs (specs);
2820
  declarator = c_parser_declarator (parser, specs->type_seen_p,
2821
                                    C_DTR_ABSTRACT, &dummy);
2822
  if (declarator == NULL)
2823
    return NULL;
2824
  ret = XOBNEW (&parser_obstack, struct c_type_name);
2825
  ret->specs = specs;
2826
  ret->declarator = declarator;
2827
  return ret;
2828
}
2829
 
2830
/* Parse an initializer (C90 6.5.7, C99 6.7.8).
2831
 
2832
   initializer:
2833
     assignment-expression
2834
     { initializer-list }
2835
     { initializer-list , }
2836
 
2837
   initializer-list:
2838
     designation[opt] initializer
2839
     initializer-list , designation[opt] initializer
2840
 
2841
   designation:
2842
     designator-list =
2843
 
2844
   designator-list:
2845
     designator
2846
     designator-list designator
2847
 
2848
   designator:
2849
     array-designator
2850
     . identifier
2851
 
2852
   array-designator:
2853
     [ constant-expression ]
2854
 
2855
   GNU extensions:
2856
 
2857
   initializer:
2858
     { }
2859
 
2860
   designation:
2861
     array-designator
2862
     identifier :
2863
 
2864
   array-designator:
2865
     [ constant-expression ... constant-expression ]
2866
 
2867
   Any expression without commas is accepted in the syntax for the
2868
   constant-expressions, with non-constant expressions rejected later.
2869
 
2870
   This function is only used for top-level initializers; for nested
2871
   ones, see c_parser_initval.  */
2872
 
2873
static struct c_expr
2874
c_parser_initializer (c_parser *parser)
2875
{
2876
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
2877
    return c_parser_braced_init (parser, NULL_TREE, false);
2878
  else
2879
    {
2880
      struct c_expr ret;
2881
      ret = c_parser_expr_no_commas (parser, NULL);
2882
      if (TREE_CODE (ret.value) != STRING_CST
2883
          && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
2884
        ret = default_function_array_conversion (ret);
2885
      return ret;
2886
    }
2887
}
2888
 
2889
/* Parse a braced initializer list.  TYPE is the type specified for a
2890
   compound literal, and NULL_TREE for other initializers and for
2891
   nested braced lists.  NESTED_P is true for nested braced lists,
2892
   false for the list of a compound literal or the list that is the
2893
   top-level initializer in a declaration.  */
2894
 
2895
static struct c_expr
2896
c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
2897
{
2898
  gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
2899
  c_parser_consume_token (parser);
2900
  if (nested_p)
2901
    push_init_level (0);
2902
  else
2903
    really_start_incremental_init (type);
2904
  if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2905
    {
2906
      if (pedantic)
2907
        pedwarn ("ISO C forbids empty initializer braces");
2908
    }
2909
  else
2910
    {
2911
      /* Parse a non-empty initializer list, possibly with a trailing
2912
         comma.  */
2913
      while (true)
2914
        {
2915
          c_parser_initelt (parser);
2916
          if (parser->error)
2917
            break;
2918
          if (c_parser_next_token_is (parser, CPP_COMMA))
2919
            c_parser_consume_token (parser);
2920
          else
2921
            break;
2922
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2923
            break;
2924
        }
2925
    }
2926
  if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
2927
    {
2928
      struct c_expr ret;
2929
      ret.value = error_mark_node;
2930
      ret.original_code = ERROR_MARK;
2931
      c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
2932
      return ret;
2933
    }
2934
  c_parser_consume_token (parser);
2935
  return pop_init_level (0);
2936
}
2937
 
2938
/* Parse a nested initializer, including designators.  */
2939
 
2940
static void
2941
c_parser_initelt (c_parser *parser)
2942
{
2943
  /* Parse any designator or designator list.  A single array
2944
     designator may have the subsequent "=" omitted in GNU C, but a
2945
     longer list or a structure member designator may not.  */
2946
  if (c_parser_next_token_is (parser, CPP_NAME)
2947
      && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
2948
    {
2949
      /* Old-style structure member designator.  */
2950
      set_init_label (c_parser_peek_token (parser)->value);
2951
      if (pedantic)
2952
        pedwarn ("obsolete use of designated initializer with %<:%>");
2953
      c_parser_consume_token (parser);
2954
      c_parser_consume_token (parser);
2955
    }
2956
  else
2957
    {
2958
      /* des_seen is 0 if there have been no designators, 1 if there
2959
         has been a single array designator and 2 otherwise.  */
2960
      int des_seen = 0;
2961
      while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
2962
             || c_parser_next_token_is (parser, CPP_DOT))
2963
        {
2964
          int des_prev = des_seen;
2965
          if (des_seen < 2)
2966
            des_seen++;
2967
          if (c_parser_next_token_is (parser, CPP_DOT))
2968
            {
2969
              des_seen = 2;
2970
              c_parser_consume_token (parser);
2971
              if (c_parser_next_token_is (parser, CPP_NAME))
2972
                {
2973
                  set_init_label (c_parser_peek_token (parser)->value);
2974
                  c_parser_consume_token (parser);
2975
                }
2976
              else
2977
                {
2978
                  struct c_expr init;
2979
                  init.value = error_mark_node;
2980
                  init.original_code = ERROR_MARK;
2981
                  c_parser_error (parser, "expected identifier");
2982
                  c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2983
                  process_init_element (init);
2984
                  return;
2985
                }
2986
            }
2987
          else
2988
            {
2989
              tree first, second;
2990
              /* ??? Following the old parser, [ objc-receiver
2991
                 objc-message-args ] is accepted as an initializer,
2992
                 being distinguished from a designator by what follows
2993
                 the first assignment expression inside the square
2994
                 brackets, but after a first array designator a
2995
                 subsequent square bracket is for Objective-C taken to
2996
                 start an expression, using the obsolete form of
2997
                 designated initializer without '=', rather than
2998
                 possibly being a second level of designation: in LALR
2999
                 terms, the '[' is shifted rather than reducing
3000
                 designator to designator-list.  */
3001
              if (des_prev == 1 && c_dialect_objc ())
3002
                {
3003
                  des_seen = des_prev;
3004
                  break;
3005
                }
3006
              if (des_prev == 0 && c_dialect_objc ())
3007
                {
3008
                  /* This might be an array designator or an
3009
                     Objective-C message expression.  If the former,
3010
                     continue parsing here; if the latter, parse the
3011
                     remainder of the initializer given the starting
3012
                     primary-expression.  ??? It might make sense to
3013
                     distinguish when des_prev == 1 as well; see
3014
                     previous comment.  */
3015
                  tree rec, args;
3016
                  struct c_expr mexpr;
3017
                  c_parser_consume_token (parser);
3018
                  if (c_parser_peek_token (parser)->type == CPP_NAME
3019
                      && ((c_parser_peek_token (parser)->id_kind
3020
                           == C_ID_TYPENAME)
3021
                          || (c_parser_peek_token (parser)->id_kind
3022
                              == C_ID_CLASSNAME)))
3023
                    {
3024
                      /* Type name receiver.  */
3025
                      tree id = c_parser_peek_token (parser)->value;
3026
                      c_parser_consume_token (parser);
3027
                      rec = objc_get_class_reference (id);
3028
                      goto parse_message_args;
3029
                    }
3030
                  first = c_parser_expr_no_commas (parser, NULL).value;
3031
                  if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3032
                      || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3033
                    goto array_desig_after_first;
3034
                  /* Expression receiver.  So far only one part
3035
                     without commas has been parsed; there might be
3036
                     more of the expression.  */
3037
                  rec = first;
3038
                  while (c_parser_next_token_is (parser, CPP_COMMA))
3039
                    {
3040
                      struct c_expr next;
3041
                      c_parser_consume_token (parser);
3042
                      next = c_parser_expr_no_commas (parser, NULL);
3043
                      next = default_function_array_conversion (next);
3044
                      rec = build_compound_expr (rec, next.value);
3045
                    }
3046
                parse_message_args:
3047
                  /* Now parse the objc-message-args.  */
3048
                  args = c_parser_objc_message_args (parser);
3049
                  c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3050
                                             "expected %<]%>");
3051
                  mexpr.value
3052
                    = objc_build_message_expr (build_tree_list (rec, args));
3053
                  mexpr.original_code = ERROR_MARK;
3054
                  /* Now parse and process the remainder of the
3055
                     initializer, starting with this message
3056
                     expression as a primary-expression.  */
3057
                  c_parser_initval (parser, &mexpr);
3058
                  return;
3059
                }
3060
              c_parser_consume_token (parser);
3061
              first = c_parser_expr_no_commas (parser, NULL).value;
3062
            array_desig_after_first:
3063
              if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3064
                {
3065
                  c_parser_consume_token (parser);
3066
                  second = c_parser_expr_no_commas (parser, NULL).value;
3067
                }
3068
              else
3069
                second = NULL_TREE;
3070
              if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3071
                {
3072
                  c_parser_consume_token (parser);
3073
                  set_init_index (first, second);
3074
                  if (pedantic && second)
3075
                    pedwarn ("ISO C forbids specifying range of "
3076
                             "elements to initialize");
3077
                }
3078
              else
3079
                c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3080
                                           "expected %<]%>");
3081
            }
3082
        }
3083
      if (des_seen >= 1)
3084
        {
3085
          if (c_parser_next_token_is (parser, CPP_EQ))
3086
            {
3087
              if (pedantic && !flag_isoc99)
3088
                pedwarn ("ISO C90 forbids specifying subobject to initialize");
3089
              c_parser_consume_token (parser);
3090
            }
3091
          else
3092
            {
3093
              if (des_seen == 1)
3094
                {
3095
                  if (pedantic)
3096
                    pedwarn ("obsolete use of designated initializer "
3097
                             "without %<=%>");
3098
                }
3099
              else
3100
                {
3101
                  struct c_expr init;
3102
                  init.value = error_mark_node;
3103
                  init.original_code = ERROR_MARK;
3104
                  c_parser_error (parser, "expected %<=%>");
3105
                  c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3106
                  process_init_element (init);
3107
                  return;
3108
                }
3109
            }
3110
        }
3111
    }
3112
  c_parser_initval (parser, NULL);
3113
}
3114
 
3115
/* Parse a nested initializer; as c_parser_initializer but parses
3116
   initializers within braced lists, after any designators have been
3117
   applied.  If AFTER is not NULL then it is an Objective-C message
3118
   expression which is the primary-expression starting the
3119
   initializer.  */
3120
 
3121
static void
3122
c_parser_initval (c_parser *parser, struct c_expr *after)
3123
{
3124
  struct c_expr init;
3125
  gcc_assert (!after || c_dialect_objc ());
3126
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3127
    init = c_parser_braced_init (parser, NULL_TREE, true);
3128
  else
3129
    {
3130
      init = c_parser_expr_no_commas (parser, after);
3131
      if (init.value != NULL_TREE
3132
          && TREE_CODE (init.value) != STRING_CST
3133
          && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3134
        init = default_function_array_conversion (init);
3135
    }
3136
  process_init_element (init);
3137
}
3138
 
3139
/* Parse a compound statement (possibly a function body) (C90 6.6.2,
3140
   C99 6.8.2).
3141
 
3142
   compound-statement:
3143
     { block-item-list[opt] }
3144
     { label-declarations block-item-list }
3145
 
3146
   block-item-list:
3147
     block-item
3148
     block-item-list block-item
3149
 
3150
   block-item:
3151
     nested-declaration
3152
     statement
3153
 
3154
   nested-declaration:
3155
     declaration
3156
 
3157
   GNU extensions:
3158
 
3159
   compound-statement:
3160
     { label-declarations block-item-list }
3161
 
3162
   nested-declaration:
3163
     __extension__ nested-declaration
3164
     nested-function-definition
3165
 
3166
   label-declarations:
3167
     label-declaration
3168
     label-declarations label-declaration
3169
 
3170
   label-declaration:
3171
     __label__ identifier-list ;
3172
 
3173
   Allowing the mixing of declarations and code is new in C99.  The
3174
   GNU syntax also permits (not shown above) labels at the end of
3175
   compound statements, which yield an error.  We don't allow labels
3176
   on declarations; this might seem like a natural extension, but
3177
   there would be a conflict between attributes on the label and
3178
   prefix attributes on the declaration.  ??? The syntax follows the
3179
   old parser in requiring something after label declarations.
3180
   Although they are erroneous if the labels declared aren't defined,
3181
   is it useful for the syntax to be this way?  */
3182
 
3183
static tree
3184
c_parser_compound_statement (c_parser *parser)
3185
{
3186
  tree stmt;
3187
  if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3188
    return error_mark_node;
3189
  stmt = c_begin_compound_stmt (true);
3190
  c_parser_compound_statement_nostart (parser);
3191
  return c_end_compound_stmt (stmt, true);
3192
}
3193
 
3194
/* Parse a compound statement except for the opening brace.  This is
3195
   used for parsing both compound statements and statement expressions
3196
   (which follow different paths to handling the opening).  */
3197
 
3198
static void
3199
c_parser_compound_statement_nostart (c_parser *parser)
3200
{
3201
  bool last_stmt = false;
3202
  bool last_label = false;
3203
  if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3204
    {
3205
      c_parser_consume_token (parser);
3206
      return;
3207
    }
3208
  if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3209
    {
3210
      /* Read zero or more forward-declarations for labels that nested
3211
         functions can jump to.  */
3212
      while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3213
        {
3214
          c_parser_consume_token (parser);
3215
          /* Any identifiers, including those declared as type names,
3216
             are OK here.  */
3217
          while (true)
3218
            {
3219
              tree label;
3220
              if (c_parser_next_token_is_not (parser, CPP_NAME))
3221
                {
3222
                  c_parser_error (parser, "expected identifier");
3223
                  break;
3224
                }
3225
              label
3226
                = declare_label (c_parser_peek_token (parser)->value);
3227
              C_DECLARED_LABEL_FLAG (label) = 1;
3228
              add_stmt (build_stmt (DECL_EXPR, label));
3229
              c_parser_consume_token (parser);
3230
              if (c_parser_next_token_is (parser, CPP_COMMA))
3231
                c_parser_consume_token (parser);
3232
              else
3233
                break;
3234
            }
3235
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3236
        }
3237
      /* ??? Locating this diagnostic on the token after the
3238
         declarations end follows the old parser, but it might be
3239
         better to locate it where the declarations start instead.  */
3240
      if (pedantic)
3241
        pedwarn ("ISO C forbids label declarations");
3242
    }
3243
  /* We must now have at least one statement, label or declaration.  */
3244
  if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3245
    {
3246
      c_parser_error (parser, "expected declaration or statement");
3247
      c_parser_consume_token (parser);
3248
      return;
3249
    }
3250
  while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3251
    {
3252
      location_t loc = c_parser_peek_token (parser)->location;
3253
      if (c_parser_next_token_is (parser, CPP_EOF))
3254
        {
3255
          c_parser_error (parser, "expected declaration or statement");
3256
          return;
3257
        }
3258
      if (c_parser_next_token_is_keyword (parser, RID_CASE)
3259
          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3260
          || (c_parser_next_token_is (parser, CPP_NAME)
3261
              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3262
        {
3263
          last_label = true;
3264
          last_stmt = false;
3265
          c_parser_label (parser);
3266
        }
3267
      else if (!last_label
3268
               && c_parser_next_token_starts_declspecs (parser))
3269
        {
3270
          last_label = false;
3271
          c_parser_declaration_or_fndef (parser, true, true, true, true);
3272
          if (last_stmt
3273
              && ((pedantic && !flag_isoc99)
3274
                  || warn_declaration_after_statement))
3275
            pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3276
                         &loc);
3277
          last_stmt = false;
3278
        }
3279
      else if (!last_label
3280
               && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3281
        {
3282
          /* __extension__ can start a declaration, but is also an
3283
             unary operator that can start an expression.  Consume all
3284
             but the last of a possible series of __extension__ to
3285
             determine which.  */
3286
          while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3287
                 && (c_parser_peek_2nd_token (parser)->keyword
3288
                     == RID_EXTENSION))
3289
            c_parser_consume_token (parser);
3290
          if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3291
            {
3292
              int ext;
3293
              ext = disable_extension_diagnostics ();
3294
              c_parser_consume_token (parser);
3295
              last_label = false;
3296
              c_parser_declaration_or_fndef (parser, true, true, true, true);
3297
              /* Following the old parser, __extension__ does not
3298
                 disable this diagnostic.  */
3299
              restore_extension_diagnostics (ext);
3300
              if (last_stmt
3301
                  && ((pedantic && !flag_isoc99)
3302
                      || warn_declaration_after_statement))
3303
                pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
3304
                             &loc);
3305
              last_stmt = false;
3306
            }
3307
          else
3308
            goto statement;
3309
        }
3310
      else
3311
        {
3312
        statement:
3313
          last_label = false;
3314
          last_stmt = true;
3315
          c_parser_statement_after_labels (parser);
3316
        }
3317
    }
3318
  if (last_label)
3319
    error ("label at end of compound statement");
3320
  c_parser_consume_token (parser);
3321
}
3322
 
3323
/* Parse a label (C90 6.6.1, C99 6.8.1).
3324
 
3325
   label:
3326
     identifier : attributes[opt]
3327
     case constant-expression :
3328
     default :
3329
 
3330
   GNU extensions:
3331
 
3332
   label:
3333
     case constant-expression ... constant-expression :
3334
 
3335
   The use of attributes on labels is a GNU extension.  The syntax in
3336
   GNU C accepts any expressions without commas, non-constant
3337
   expressions being rejected later.  */
3338
 
3339
static void
3340
c_parser_label (c_parser *parser)
3341
{
3342
  location_t loc1 = c_parser_peek_token (parser)->location;
3343
  tree label = NULL_TREE;
3344
  if (c_parser_next_token_is_keyword (parser, RID_CASE))
3345
    {
3346
      tree exp1, exp2;
3347
      c_parser_consume_token (parser);
3348
      exp1 = c_parser_expr_no_commas (parser, NULL).value;
3349
      if (c_parser_next_token_is (parser, CPP_COLON))
3350
        {
3351
          c_parser_consume_token (parser);
3352
          label = do_case (exp1, NULL_TREE);
3353
        }
3354
      else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3355
        {
3356
          c_parser_consume_token (parser);
3357
          exp2 = c_parser_expr_no_commas (parser, NULL).value;
3358
          if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3359
            label = do_case (exp1, exp2);
3360
        }
3361
      else
3362
        c_parser_error (parser, "expected %<:%> or %<...%>");
3363
    }
3364
  else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3365
    {
3366
      c_parser_consume_token (parser);
3367
      if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3368
        label = do_case (NULL_TREE, NULL_TREE);
3369
    }
3370
  else
3371
    {
3372
      tree name = c_parser_peek_token (parser)->value;
3373
      tree tlab;
3374
      location_t loc2;
3375
      tree attrs;
3376
      gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3377
      c_parser_consume_token (parser);
3378
      gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3379
      loc2 = c_parser_peek_token (parser)->location;
3380
      c_parser_consume_token (parser);
3381
      attrs = c_parser_attributes (parser);
3382
      tlab = define_label (loc2, name);
3383
      if (tlab)
3384
        {
3385
          decl_attributes (&tlab, attrs, 0);
3386
          label = add_stmt (build_stmt (LABEL_EXPR, tlab));
3387
        }
3388
    }
3389
  if (label)
3390
    SET_EXPR_LOCATION (label, loc1);
3391
}
3392
 
3393
/* Parse a statement (C90 6.6, C99 6.8).
3394
 
3395
   statement:
3396
     labeled-statement
3397
     compound-statement
3398
     expression-statement
3399
     selection-statement
3400
     iteration-statement
3401
     jump-statement
3402
 
3403
   labeled-statement:
3404
     label statement
3405
 
3406
   expression-statement:
3407
     expression[opt] ;
3408
 
3409
   selection-statement:
3410
     if-statement
3411
     switch-statement
3412
 
3413
   iteration-statement:
3414
     while-statement
3415
     do-statement
3416
     for-statement
3417
 
3418
   jump-statement:
3419
     goto identifier ;
3420
     continue ;
3421
     break ;
3422
     return expression[opt] ;
3423
 
3424
   GNU extensions:
3425
 
3426
   statement:
3427
     asm-statement
3428
 
3429
   jump-statement:
3430
     goto * expression ;
3431
 
3432
   Objective-C:
3433
 
3434
   statement:
3435
     objc-throw-statement
3436
     objc-try-catch-statement
3437
     objc-synchronized-statement
3438
 
3439
   objc-throw-statement:
3440
     @throw expression ;
3441
     @throw ;
3442
*/
3443
 
3444
static void
3445
c_parser_statement (c_parser *parser)
3446
{
3447
  while (c_parser_next_token_is_keyword (parser, RID_CASE)
3448
         || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3449
         || (c_parser_next_token_is (parser, CPP_NAME)
3450
             && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3451
    c_parser_label (parser);
3452
  c_parser_statement_after_labels (parser);
3453
}
3454
 
3455
/* Parse a statement, other than a labeled statement.  */
3456
 
3457
static void
3458
c_parser_statement_after_labels (c_parser *parser)
3459
{
3460
  location_t loc = c_parser_peek_token (parser)->location;
3461
  tree stmt = NULL_TREE;
3462
  switch (c_parser_peek_token (parser)->type)
3463
    {
3464
    case CPP_OPEN_BRACE:
3465
      add_stmt (c_parser_compound_statement (parser));
3466
      break;
3467
    case CPP_KEYWORD:
3468
      switch (c_parser_peek_token (parser)->keyword)
3469
        {
3470
        case RID_IF:
3471
          c_parser_if_statement (parser);
3472
          break;
3473
        case RID_SWITCH:
3474
          c_parser_switch_statement (parser);
3475
          break;
3476
        case RID_WHILE:
3477
          c_parser_while_statement (parser);
3478
          break;
3479
        case RID_DO:
3480
          c_parser_do_statement (parser);
3481
          break;
3482
        case RID_FOR:
3483
          c_parser_for_statement (parser);
3484
          break;
3485
        case RID_GOTO:
3486
          c_parser_consume_token (parser);
3487
          if (c_parser_next_token_is (parser, CPP_NAME))
3488
            {
3489
              stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
3490
              c_parser_consume_token (parser);
3491
            }
3492
          else if (c_parser_next_token_is (parser, CPP_MULT))
3493
            {
3494
              c_parser_consume_token (parser);
3495
              stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
3496
            }
3497
          else
3498
            c_parser_error (parser, "expected identifier or %<*%>");
3499
          goto expect_semicolon;
3500
        case RID_CONTINUE:
3501
          c_parser_consume_token (parser);
3502
          stmt = c_finish_bc_stmt (&c_cont_label, false);
3503
          goto expect_semicolon;
3504
        case RID_BREAK:
3505
          c_parser_consume_token (parser);
3506
          stmt = c_finish_bc_stmt (&c_break_label, true);
3507
          goto expect_semicolon;
3508
        case RID_RETURN:
3509
          c_parser_consume_token (parser);
3510
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3511
            {
3512
              stmt = c_finish_return (NULL_TREE);
3513
              c_parser_consume_token (parser);
3514
            }
3515
          else
3516
            {
3517
              stmt = c_finish_return (c_parser_expression_conv (parser).value);
3518
              goto expect_semicolon;
3519
            }
3520
          break;
3521
        case RID_ASM:
3522
          stmt = c_parser_asm_statement (parser);
3523
          break;
3524
        case RID_AT_THROW:
3525
          gcc_assert (c_dialect_objc ());
3526
          c_parser_consume_token (parser);
3527
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3528
            {
3529
              stmt = objc_build_throw_stmt (NULL_TREE);
3530
              c_parser_consume_token (parser);
3531
            }
3532
          else
3533
            {
3534
              stmt
3535
                = objc_build_throw_stmt (c_parser_expression (parser).value);
3536
              goto expect_semicolon;
3537
            }
3538
          break;
3539
        case RID_AT_TRY:
3540
          gcc_assert (c_dialect_objc ());
3541
          c_parser_objc_try_catch_statement (parser);
3542
          break;
3543
        case RID_AT_SYNCHRONIZED:
3544
          gcc_assert (c_dialect_objc ());
3545
          c_parser_objc_synchronized_statement (parser);
3546
          break;
3547
        default:
3548
          goto expr_stmt;
3549
        }
3550
      break;
3551
    case CPP_SEMICOLON:
3552
      c_parser_consume_token (parser);
3553
      break;
3554
    case CPP_CLOSE_PAREN:
3555
    case CPP_CLOSE_SQUARE:
3556
      /* Avoid infinite loop in error recovery:
3557
         c_parser_skip_until_found stops at a closing nesting
3558
         delimiter without consuming it, but here we need to consume
3559
         it to proceed further.  */
3560
      c_parser_error (parser, "expected statement");
3561
      c_parser_consume_token (parser);
3562
      break;
3563
    default:
3564
    expr_stmt:
3565
      stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
3566
    expect_semicolon:
3567
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3568
      break;
3569
    }
3570
  /* Two cases cannot and do not have line numbers associated: If stmt
3571
     is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3572
     cannot hold line numbers.  But that's OK because the statement
3573
     will either be changed to a MODIFY_EXPR during gimplification of
3574
     the statement expr, or discarded.  If stmt was compound, but
3575
     without new variables, we will have skipped the creation of a
3576
     BIND and will have a bare STATEMENT_LIST.  But that's OK because
3577
     (recursively) all of the component statements should already have
3578
     line numbers assigned.  ??? Can we discard no-op statements
3579
     earlier?  */
3580
  if (stmt && EXPR_P (stmt))
3581
    SET_EXPR_LOCATION (stmt, loc);
3582
}
3583
 
3584
/* Parse a parenthesized condition from an if, do or while statement.
3585
 
3586
   condition:
3587
     ( expression )
3588
*/
3589
static tree
3590
c_parser_paren_condition (c_parser *parser)
3591
{
3592
  location_t loc;
3593
  tree cond;
3594
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3595
    return error_mark_node;
3596
  loc = c_parser_peek_token (parser)->location;
3597
  cond = c_objc_common_truthvalue_conversion
3598
    (c_parser_expression_conv (parser).value);
3599
  if (EXPR_P (cond))
3600
    SET_EXPR_LOCATION (cond, loc);
3601
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3602
  return cond;
3603
}
3604
 
3605
/* Parse a statement which is a block in C99.  */
3606
 
3607
static tree
3608
c_parser_c99_block_statement (c_parser *parser)
3609
{
3610
  tree block = c_begin_compound_stmt (flag_isoc99);
3611
  c_parser_statement (parser);
3612
  return c_end_compound_stmt (block, flag_isoc99);
3613
}
3614
 
3615
/* Parse the body of an if statement or the else half thereof.  This
3616
   is just parsing a statement but (a) it is a block in C99, (b) we
3617
   track whether the body is an if statement for the sake of
3618
   -Wparentheses warnings, (c) we handle an empty body specially for
3619
   the sake of -Wextra warnings.  */
3620
 
3621
static tree
3622
c_parser_if_body (c_parser *parser, bool *if_p)
3623
{
3624
  tree block = c_begin_compound_stmt (flag_isoc99);
3625
  while (c_parser_next_token_is_keyword (parser, RID_CASE)
3626
         || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3627
         || (c_parser_next_token_is (parser, CPP_NAME)
3628
             && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3629
    c_parser_label (parser);
3630
  *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3631
  if (extra_warnings && c_parser_next_token_is (parser, CPP_SEMICOLON))
3632
    add_stmt (build (NOP_EXPR, NULL_TREE, NULL_TREE));
3633
  c_parser_statement_after_labels (parser);
3634
  return c_end_compound_stmt (block, flag_isoc99);
3635
}
3636
 
3637
/* Parse an if statement (C90 6.6.4, C99 6.8.4).
3638
 
3639
   if-statement:
3640
     if ( expression ) statement
3641
     if ( expression ) statement else statement
3642
*/
3643
 
3644
static void
3645
c_parser_if_statement (c_parser *parser)
3646
{
3647
  tree block;
3648
  location_t loc;
3649
  tree cond;
3650
  bool first_if = false, second_if = false;
3651
  tree first_body, second_body;
3652
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
3653
  c_parser_consume_token (parser);
3654
  block = c_begin_compound_stmt (flag_isoc99);
3655
  loc = c_parser_peek_token (parser)->location;
3656
  cond = c_parser_paren_condition (parser);
3657
  first_body = c_parser_if_body (parser, &first_if);
3658
  if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3659
    {
3660
      c_parser_consume_token (parser);
3661
      second_body = c_parser_if_body (parser, &second_if);
3662
    }
3663
  else
3664
    second_body = NULL_TREE;
3665
  c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
3666
  add_stmt (c_end_compound_stmt (block, flag_isoc99));
3667
}
3668
 
3669
/* Parse a switch statement (C90 6.6.4, C99 6.8.4).
3670
 
3671
   switch-statement:
3672
     switch (expression) statement
3673
*/
3674
 
3675
static void
3676
c_parser_switch_statement (c_parser *parser)
3677
{
3678
  tree block, expr, body, save_break;
3679
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
3680
  c_parser_consume_token (parser);
3681
  block = c_begin_compound_stmt (flag_isoc99);
3682
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3683
    {
3684
      expr = c_parser_expression (parser).value;
3685
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3686
    }
3687
  else
3688
    expr = error_mark_node;
3689
  c_start_case (expr);
3690
  save_break = c_break_label;
3691
  c_break_label = NULL_TREE;
3692
  body = c_parser_c99_block_statement (parser);
3693
  c_finish_case (body);
3694
  if (c_break_label)
3695
    add_stmt (build (LABEL_EXPR, void_type_node, c_break_label));
3696
  c_break_label = save_break;
3697
  add_stmt (c_end_compound_stmt (block, flag_isoc99));
3698
}
3699
 
3700
/* Parse a while statement (C90 6.6.5, C99 6.8.5).
3701
 
3702
   while-statement:
3703
      while (expression) statement
3704
*/
3705
 
3706
static void
3707
c_parser_while_statement (c_parser *parser)
3708
{
3709
  tree block, cond, body, save_break, save_cont;
3710
  location_t loc;
3711
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
3712
  c_parser_consume_token (parser);
3713
  block = c_begin_compound_stmt (flag_isoc99);
3714
  loc = c_parser_peek_token (parser)->location;
3715
  cond = c_parser_paren_condition (parser);
3716
  save_break = c_break_label;
3717
  c_break_label = NULL_TREE;
3718
  save_cont = c_cont_label;
3719
  c_cont_label = NULL_TREE;
3720
  body = c_parser_c99_block_statement (parser);
3721
  c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
3722
  add_stmt (c_end_compound_stmt (block, flag_isoc99));
3723
  c_break_label = save_break;
3724
  c_cont_label = save_cont;
3725
}
3726
 
3727
/* Parse a do statement (C90 6.6.5, C99 6.8.5).
3728
 
3729
   do-statement:
3730
     do statement while ( expression ) ;
3731
*/
3732
 
3733
static void
3734
c_parser_do_statement (c_parser *parser)
3735
{
3736
  tree block, cond, body, save_break, save_cont, new_break, new_cont;
3737
  location_t loc;
3738
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
3739
  c_parser_consume_token (parser);
3740
  block = c_begin_compound_stmt (flag_isoc99);
3741
  loc = c_parser_peek_token (parser)->location;
3742
  save_break = c_break_label;
3743
  c_break_label = NULL_TREE;
3744
  save_cont = c_cont_label;
3745
  c_cont_label = NULL_TREE;
3746
  body = c_parser_c99_block_statement (parser);
3747
  c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
3748
  new_break = c_break_label;
3749
  c_break_label = save_break;
3750
  new_cont = c_cont_label;
3751
  c_cont_label = save_cont;
3752
  cond = c_parser_paren_condition (parser);
3753
  if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
3754
    c_parser_skip_to_end_of_block_or_statement (parser);
3755
  c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
3756
  add_stmt (c_end_compound_stmt (block, flag_isoc99));
3757
}
3758
 
3759
/* Parse a for statement (C90 6.6.5, C99 6.8.5).
3760
 
3761
   for-statement:
3762
     for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
3763
     for ( nested-declaration expression[opt] ; expression[opt] ) statement
3764
 
3765
   The form with a declaration is new in C99.
3766
 
3767
   ??? In accordance with the old parser, the declaration may be a
3768
   nested function, which is then rejected in check_for_loop_decls,
3769
   but does it make any sense for this to be included in the grammar?
3770
   Note in particular that the nested function does not include a
3771
   trailing ';', whereas the "declaration" production includes one.
3772
   Also, can we reject bad declarations earlier and cheaper than
3773
   check_for_loop_decls?  */
3774
 
3775
static void
3776
c_parser_for_statement (c_parser *parser)
3777
{
3778
  tree block, cond, incr, save_break, save_cont, body;
3779
  location_t loc;
3780
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
3781
  loc = c_parser_peek_token (parser)->location;
3782
  c_parser_consume_token (parser);
3783
  block = c_begin_compound_stmt (flag_isoc99);
3784
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3785
    {
3786
      /* Parse the initialization declaration or expression.  */
3787
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3788
        {
3789
          c_parser_consume_token (parser);
3790
          c_finish_expr_stmt (NULL_TREE);
3791
        }
3792
      else if (c_parser_next_token_starts_declspecs (parser))
3793
        {
3794
          c_parser_declaration_or_fndef (parser, true, true, true, true);
3795
          check_for_loop_decls ();
3796
        }
3797
      else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3798
        {
3799
          /* __extension__ can start a declaration, but is also an
3800
             unary operator that can start an expression.  Consume all
3801
             but the last of a possible series of __extension__ to
3802
             determine which.  */
3803
          while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3804
                 && (c_parser_peek_2nd_token (parser)->keyword
3805
                     == RID_EXTENSION))
3806
            c_parser_consume_token (parser);
3807
          if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3808
            {
3809
              int ext;
3810
              ext = disable_extension_diagnostics ();
3811
              c_parser_consume_token (parser);
3812
              c_parser_declaration_or_fndef (parser, true, true, true, true);
3813
              restore_extension_diagnostics (ext);
3814
              check_for_loop_decls ();
3815
            }
3816
          else
3817
            goto init_expr;
3818
        }
3819
      else
3820
        {
3821
        init_expr:
3822
          c_finish_expr_stmt (c_parser_expression (parser).value);
3823
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3824
        }
3825
      /* Parse the loop condition.  */
3826
      loc = c_parser_peek_token (parser)->location;
3827
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3828
        {
3829
          c_parser_consume_token (parser);
3830
          cond = NULL_TREE;
3831
        }
3832
      else
3833
        {
3834
          tree ocond = c_parser_expression_conv (parser).value;
3835
          cond = c_objc_common_truthvalue_conversion (ocond);
3836
          if (EXPR_P (cond))
3837
            SET_EXPR_LOCATION (cond, loc);
3838
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3839
        }
3840
      /* Parse the increment expression.  */
3841
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3842
        incr = c_process_expr_stmt (NULL_TREE);
3843
      else
3844
        incr = c_process_expr_stmt (c_parser_expression (parser).value);
3845
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3846
    }
3847
  else
3848
    {
3849
      cond = error_mark_node;
3850
      incr = error_mark_node;
3851
    }
3852
  save_break = c_break_label;
3853
  c_break_label = NULL_TREE;
3854
  save_cont = c_cont_label;
3855
  c_cont_label = NULL_TREE;
3856
  body = c_parser_c99_block_statement (parser);
3857
  c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
3858
  add_stmt (c_end_compound_stmt (block, flag_isoc99));
3859
  c_break_label = save_break;
3860
  c_cont_label = save_cont;
3861
}
3862
 
3863
/* Parse an asm statement, a GNU extension.  This is a full-blown asm
3864
   statement with inputs, outputs, clobbers, and volatile tag
3865
   allowed.
3866
 
3867
   asm-statement:
3868
     asm type-qualifier[opt] ( asm-argument ) ;
3869
 
3870
   asm-argument:
3871
     asm-string-literal
3872
     asm-string-literal : asm-operands[opt]
3873
     asm-string-literal : asm-operands[opt] : asm-operands[opt]
3874
     asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers
3875
 
3876
   Qualifiers other than volatile are accepted in the syntax but
3877
   warned for.  */
3878
 
3879
static tree
3880
c_parser_asm_statement (c_parser *parser)
3881
{
3882
  tree quals, str, outputs, inputs, clobbers, ret;
3883
  bool simple;
3884
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
3885
  c_parser_consume_token (parser);
3886
  if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
3887
    {
3888
      quals = c_parser_peek_token (parser)->value;
3889
      c_parser_consume_token (parser);
3890
    }
3891
  else if (c_parser_next_token_is_keyword (parser, RID_CONST)
3892
           || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
3893
    {
3894
      warning (0, "%E qualifier ignored on asm",
3895
               c_parser_peek_token (parser)->value);
3896
      quals = NULL_TREE;
3897
      c_parser_consume_token (parser);
3898
    }
3899
  else
3900
    quals = NULL_TREE;
3901
  /* ??? Follow the C++ parser rather than using the
3902
     c_lex_string_translate kludge.  */
3903
  c_lex_string_translate = 0;
3904
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3905
    {
3906
      c_lex_string_translate = 1;
3907
      return NULL_TREE;
3908
    }
3909
  str = c_parser_asm_string_literal (parser);
3910
  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3911
    {
3912
      simple = true;
3913
      outputs = NULL_TREE;
3914
      inputs = NULL_TREE;
3915
      clobbers = NULL_TREE;
3916
      goto done_asm;
3917
    }
3918
  if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3919
    {
3920
      c_lex_string_translate = 1;
3921
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3922
      return NULL_TREE;
3923
    }
3924
  simple = false;
3925
  /* Parse outputs.  */
3926
  if (c_parser_next_token_is (parser, CPP_COLON)
3927
      || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3928
    outputs = NULL_TREE;
3929
  else
3930
    outputs = c_parser_asm_operands (parser, false);
3931
  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3932
    {
3933
      inputs = NULL_TREE;
3934
      clobbers = NULL_TREE;
3935
      goto done_asm;
3936
    }
3937
  if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3938
    {
3939
      c_lex_string_translate = 1;
3940
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3941
      return NULL_TREE;
3942
    }
3943
  /* Parse inputs.  */
3944
  if (c_parser_next_token_is (parser, CPP_COLON)
3945
      || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3946
    inputs = NULL_TREE;
3947
  else
3948
    inputs = c_parser_asm_operands (parser, true);
3949
  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
3950
    {
3951
      clobbers = NULL_TREE;
3952
      goto done_asm;
3953
    }
3954
  if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
3955
    {
3956
      c_lex_string_translate = 1;
3957
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3958
      return NULL_TREE;
3959
    }
3960
  /* Parse clobbers.  */
3961
  clobbers = c_parser_asm_clobbers (parser);
3962
 done_asm:
3963
  c_lex_string_translate = 1;
3964
  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
3965
    {
3966
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
3967
      return NULL_TREE;
3968
    }
3969
  if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
3970
    c_parser_skip_to_end_of_block_or_statement (parser);
3971
  ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
3972
                                               clobbers, simple));
3973
  return ret;
3974
}
3975
 
3976
/* Parse asm operands, a GNU extension.  If CONVERT_P (for inputs but
3977
   not outputs), apply the default conversion of functions and arrays
3978
   to pointers.
3979
 
3980
   asm-operands:
3981
     asm-operand
3982
     asm-operands , asm-operand
3983
 
3984
   asm-operand:
3985
     asm-string-literal ( expression )
3986
     [ identifier ] asm-string-literal ( expression )
3987
*/
3988
 
3989
static tree
3990
c_parser_asm_operands (c_parser *parser, bool convert_p)
3991
{
3992
  tree list = NULL_TREE;
3993
  while (true)
3994
    {
3995
      tree name, str;
3996
      struct c_expr expr;
3997
      if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
3998
        {
3999
          c_parser_consume_token (parser);
4000
          if (c_parser_next_token_is (parser, CPP_NAME))
4001
            {
4002
              tree id = c_parser_peek_token (parser)->value;
4003
              c_parser_consume_token (parser);
4004
              name = build_string (IDENTIFIER_LENGTH (id),
4005
                                   IDENTIFIER_POINTER (id));
4006
            }
4007
          else
4008
            {
4009
              c_parser_error (parser, "expected identifier");
4010
              c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4011
              return NULL_TREE;
4012
            }
4013
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4014
                                     "expected %<]%>");
4015
        }
4016
      else
4017
        name = NULL_TREE;
4018
      str = c_parser_asm_string_literal (parser);
4019
      if (str == NULL_TREE)
4020
        return NULL_TREE;
4021
      c_lex_string_translate = 1;
4022
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4023
        {
4024
          c_lex_string_translate = 0;
4025
          return NULL_TREE;
4026
        }
4027
      expr = c_parser_expression (parser);
4028
      if (convert_p)
4029
        expr = default_function_array_conversion (expr);
4030
      c_lex_string_translate = 0;
4031
      if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4032
        {
4033
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4034
          return NULL_TREE;
4035
        }
4036
      list = chainon (list, build_tree_list (build_tree_list (name, str),
4037
                                             expr.value));
4038
      if (c_parser_next_token_is (parser, CPP_COMMA))
4039
        c_parser_consume_token (parser);
4040
      else
4041
        break;
4042
    }
4043
  return list;
4044
}
4045
 
4046
/* Parse asm clobbers, a GNU extension.
4047
 
4048
   asm-clobbers:
4049
     asm-string-literal
4050
     asm-clobbers , asm-string-literal
4051
*/
4052
 
4053
static tree
4054
c_parser_asm_clobbers (c_parser *parser)
4055
{
4056
  tree list = NULL_TREE;
4057
  while (true)
4058
    {
4059
      tree str = c_parser_asm_string_literal (parser);
4060
      if (str)
4061
        list = tree_cons (NULL_TREE, str, list);
4062
      else
4063
        return NULL_TREE;
4064
      if (c_parser_next_token_is (parser, CPP_COMMA))
4065
        c_parser_consume_token (parser);
4066
      else
4067
        break;
4068
    }
4069
  return list;
4070
}
4071
 
4072
/* Parse an expression other than a compound expression; that is, an
4073
   assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
4074
   NULL then it is an Objective-C message expression which is the
4075
   primary-expression starting the expression as an initializer.
4076
 
4077
   assignment-expression:
4078
     conditional-expression
4079
     unary-expression assignment-operator assignment-expression
4080
 
4081
   assignment-operator: one of
4082
     = *= /= %= += -= <<= >>= &= ^= |=
4083
 
4084
   In GNU C we accept any conditional expression on the LHS and
4085
   diagnose the invalid lvalue rather than producing a syntax
4086
   error.  */
4087
 
4088
static struct c_expr
4089
c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4090
{
4091
  struct c_expr lhs, rhs, ret;
4092
  enum tree_code code;
4093
  gcc_assert (!after || c_dialect_objc ());
4094
  lhs = c_parser_conditional_expression (parser, after);
4095
  switch (c_parser_peek_token (parser)->type)
4096
    {
4097
    case CPP_EQ:
4098
      code = NOP_EXPR;
4099
      break;
4100
    case CPP_MULT_EQ:
4101
      code = MULT_EXPR;
4102
      break;
4103
    case CPP_DIV_EQ:
4104
      code = TRUNC_DIV_EXPR;
4105
      break;
4106
    case CPP_MOD_EQ:
4107
      code = TRUNC_MOD_EXPR;
4108
      break;
4109
    case CPP_PLUS_EQ:
4110
      code = PLUS_EXPR;
4111
      break;
4112
    case CPP_MINUS_EQ:
4113
      code = MINUS_EXPR;
4114
      break;
4115
    case CPP_LSHIFT_EQ:
4116
      code = LSHIFT_EXPR;
4117
      break;
4118
    case CPP_RSHIFT_EQ:
4119
      code = RSHIFT_EXPR;
4120
      break;
4121
    case CPP_AND_EQ:
4122
      code = BIT_AND_EXPR;
4123
      break;
4124
    case CPP_XOR_EQ:
4125
      code = BIT_XOR_EXPR;
4126
      break;
4127
    case CPP_OR_EQ:
4128
      code = BIT_IOR_EXPR;
4129
      break;
4130
    default:
4131
      return lhs;
4132
    }
4133
  c_parser_consume_token (parser);
4134
  rhs = c_parser_expr_no_commas (parser, NULL);
4135
  rhs = default_function_array_conversion (rhs);
4136
  ret.value = build_modify_expr (lhs.value, code, rhs.value);
4137
  if (code == NOP_EXPR)
4138
    ret.original_code = MODIFY_EXPR;
4139
  else
4140
    {
4141
      TREE_NO_WARNING (ret.value) = 1;
4142
      ret.original_code = ERROR_MARK;
4143
    }
4144
  return ret;
4145
}
4146
 
4147
/* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
4148
   is not NULL then it is an Objective-C message expression which is
4149
   the primary-expression starting the expression as an initializer.
4150
 
4151
   conditional-expression:
4152
     logical-OR-expression
4153
     logical-OR-expression ? expression : conditional-expression
4154
 
4155
   GNU extensions:
4156
 
4157
   conditional-expression:
4158
     logical-OR-expression ? : conditional-expression
4159
*/
4160
 
4161
static struct c_expr
4162
c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4163
{
4164
  struct c_expr cond, exp1, exp2, ret;
4165
  gcc_assert (!after || c_dialect_objc ());
4166
  cond = c_parser_binary_expression (parser, after);
4167
  if (c_parser_next_token_is_not (parser, CPP_QUERY))
4168
    return cond;
4169
  cond = default_function_array_conversion (cond);
4170
  c_parser_consume_token (parser);
4171
  if (c_parser_next_token_is (parser, CPP_COLON))
4172
    {
4173
      if (pedantic)
4174
        pedwarn ("ISO C forbids omitting the middle term of a ?: expression");
4175
      /* Make sure first operand is calculated only once.  */
4176
      exp1.value = save_expr (default_conversion (cond.value));
4177
      cond.value = c_objc_common_truthvalue_conversion (exp1.value);
4178
      skip_evaluation += cond.value == truthvalue_true_node;
4179
    }
4180
  else
4181
    {
4182
      cond.value
4183
        = c_objc_common_truthvalue_conversion
4184
        (default_conversion (cond.value));
4185
      skip_evaluation += cond.value == truthvalue_false_node;
4186
      exp1 = c_parser_expression_conv (parser);
4187
      skip_evaluation += ((cond.value == truthvalue_true_node)
4188
                          - (cond.value == truthvalue_false_node));
4189
    }
4190
  if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4191
    {
4192
      skip_evaluation -= cond.value == truthvalue_true_node;
4193
      ret.value = error_mark_node;
4194
      ret.original_code = ERROR_MARK;
4195
      return ret;
4196
    }
4197
  exp2 = c_parser_conditional_expression (parser, NULL);
4198
  exp2 = default_function_array_conversion (exp2);
4199
  skip_evaluation -= cond.value == truthvalue_true_node;
4200
  ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
4201
  ret.original_code = ERROR_MARK;
4202
  return ret;
4203
}
4204
 
4205
/* Parse a binary expression; that is, a logical-OR-expression (C90
4206
   6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
4207
   an Objective-C message expression which is the primary-expression
4208
   starting the expression as an initializer.
4209
 
4210
   multiplicative-expression:
4211
     cast-expression
4212
     multiplicative-expression * cast-expression
4213
     multiplicative-expression / cast-expression
4214
     multiplicative-expression % cast-expression
4215
 
4216
   additive-expression:
4217
     multiplicative-expression
4218
     additive-expression + multiplicative-expression
4219
     additive-expression - multiplicative-expression
4220
 
4221
   shift-expression:
4222
     additive-expression
4223
     shift-expression << additive-expression
4224
     shift-expression >> additive-expression
4225
 
4226
   relational-expression:
4227
     shift-expression
4228
     relational-expression < shift-expression
4229
     relational-expression > shift-expression
4230
     relational-expression <= shift-expression
4231
     relational-expression >= shift-expression
4232
 
4233
   equality-expression:
4234
     relational-expression
4235
     equality-expression == relational-expression
4236
     equality-expression != relational-expression
4237
 
4238
   AND-expression:
4239
     equality-expression
4240
     AND-expression & equality-expression
4241
 
4242
   exclusive-OR-expression:
4243
     AND-expression
4244
     exclusive-OR-expression ^ AND-expression
4245
 
4246
   inclusive-OR-expression:
4247
     exclusive-OR-expression
4248
     inclusive-OR-expression | exclusive-OR-expression
4249
 
4250
   logical-AND-expression:
4251
     inclusive-OR-expression
4252
     logical-AND-expression && inclusive-OR-expression
4253
 
4254
   logical-OR-expression:
4255
     logical-AND-expression
4256
     logical-OR-expression || logical-AND-expression
4257
*/
4258
 
4259
static struct c_expr
4260
c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4261
{
4262
  /* A binary expression is parsed using operator-precedence parsing,
4263
     with the operands being cast expressions.  All the binary
4264
     operators are left-associative.  Thus a binary expression is of
4265
     form:
4266
 
4267
     E0 op1 E1 op2 E2 ...
4268
 
4269
     which we represent on a stack.  On the stack, the precedence
4270
     levels are strictly increasing.  When a new operator is
4271
     encountered of higher precedence than that at the top of the
4272
     stack, it is pushed; its LHS is the top expression, and its RHS
4273
     is everything parsed until it is popped.  When a new operator is
4274
     encountered with precedence less than or equal to that at the top
4275
     of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4276
     by the result of the operation until the operator at the top of
4277
     the stack has lower precedence than the new operator or there is
4278
     only one element on the stack; then the top expression is the LHS
4279
     of the new operator.  In the case of logical AND and OR
4280
     expressions, we also need to adjust skip_evaluation as
4281
     appropriate when the operators are pushed and popped.  */
4282
 
4283
  /* The precedence levels, where 0 is a dummy lowest level used for
4284
     the bottom of the stack.  */
4285
  enum prec {
4286
    PREC_NONE,
4287
    PREC_LOGOR,
4288
    PREC_LOGAND,
4289
    PREC_BITOR,
4290
    PREC_BITXOR,
4291
    PREC_BITAND,
4292
    PREC_EQ,
4293
    PREC_REL,
4294
    PREC_SHIFT,
4295
    PREC_ADD,
4296
    PREC_MULT,
4297
    NUM_PRECS
4298
  };
4299
  struct {
4300
    /* The expression at this stack level.  */
4301
    struct c_expr expr;
4302
    /* The precedence of the operator on its left, PREC_NONE at the
4303
       bottom of the stack.  */
4304
    enum prec prec;
4305
    /* The operation on its left.  */
4306
    enum tree_code op;
4307
  } stack[NUM_PRECS];
4308
  int sp;
4309
#define POP                                                                   \
4310
  do {                                                                        \
4311
    switch (stack[sp].op)                                                     \
4312
      {                                                                       \
4313
      case TRUTH_ANDIF_EXPR:                                                  \
4314
        skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
4315
        break;                                                                \
4316
      case TRUTH_ORIF_EXPR:                                                   \
4317
        skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node;  \
4318
        break;                                                                \
4319
      default:                                                                \
4320
        break;                                                                \
4321
      }                                                                       \
4322
    stack[sp - 1].expr                                                        \
4323
      = default_function_array_conversion (stack[sp - 1].expr);               \
4324
    stack[sp].expr                                                            \
4325
      = default_function_array_conversion (stack[sp].expr);                   \
4326
    stack[sp - 1].expr = parser_build_binary_op (stack[sp].op,                \
4327
                                                 stack[sp - 1].expr,          \
4328
                                                 stack[sp].expr);             \
4329
    sp--;                                                                     \
4330
  } while (0)
4331
  gcc_assert (!after || c_dialect_objc ());
4332
  stack[0].expr = c_parser_cast_expression (parser, after);
4333
  stack[0].prec = PREC_NONE;
4334
  sp = 0;
4335
  while (true)
4336
    {
4337
      enum prec oprec;
4338
      enum tree_code ocode;
4339
      if (parser->error)
4340
        goto out;
4341
      switch (c_parser_peek_token (parser)->type)
4342
        {
4343
        case CPP_MULT:
4344
          oprec = PREC_MULT;
4345
          ocode = MULT_EXPR;
4346
          break;
4347
        case CPP_DIV:
4348
          oprec = PREC_MULT;
4349
          ocode = TRUNC_DIV_EXPR;
4350
          break;
4351
        case CPP_MOD:
4352
          oprec = PREC_MULT;
4353
          ocode = TRUNC_MOD_EXPR;
4354
          break;
4355
        case CPP_PLUS:
4356
          oprec = PREC_ADD;
4357
          ocode = PLUS_EXPR;
4358
          break;
4359
        case CPP_MINUS:
4360
          oprec = PREC_ADD;
4361
          ocode = MINUS_EXPR;
4362
          break;
4363
        case CPP_LSHIFT:
4364
          oprec = PREC_SHIFT;
4365
          ocode = LSHIFT_EXPR;
4366
          break;
4367
        case CPP_RSHIFT:
4368
          oprec = PREC_SHIFT;
4369
          ocode = RSHIFT_EXPR;
4370
          break;
4371
        case CPP_LESS:
4372
          oprec = PREC_REL;
4373
          ocode = LT_EXPR;
4374
          break;
4375
        case CPP_GREATER:
4376
          oprec = PREC_REL;
4377
          ocode = GT_EXPR;
4378
          break;
4379
        case CPP_LESS_EQ:
4380
          oprec = PREC_REL;
4381
          ocode = LE_EXPR;
4382
          break;
4383
        case CPP_GREATER_EQ:
4384
          oprec = PREC_REL;
4385
          ocode = GE_EXPR;
4386
          break;
4387
        case CPP_EQ_EQ:
4388
          oprec = PREC_EQ;
4389
          ocode = EQ_EXPR;
4390
          break;
4391
        case CPP_NOT_EQ:
4392
          oprec = PREC_EQ;
4393
          ocode = NE_EXPR;
4394
          break;
4395
        case CPP_AND:
4396
          oprec = PREC_BITAND;
4397
          ocode = BIT_AND_EXPR;
4398
          break;
4399
        case CPP_XOR:
4400
          oprec = PREC_BITXOR;
4401
          ocode = BIT_XOR_EXPR;
4402
          break;
4403
        case CPP_OR:
4404
          oprec = PREC_BITOR;
4405
          ocode = BIT_IOR_EXPR;
4406
          break;
4407
        case CPP_AND_AND:
4408
          oprec = PREC_LOGAND;
4409
          ocode = TRUTH_ANDIF_EXPR;
4410
          break;
4411
        case CPP_OR_OR:
4412
          oprec = PREC_LOGOR;
4413
          ocode = TRUTH_ORIF_EXPR;
4414
          break;
4415
        default:
4416
          /* Not a binary operator, so end of the binary
4417
             expression.  */
4418
          goto out;
4419
        }
4420
      c_parser_consume_token (parser);
4421
      while (oprec <= stack[sp].prec)
4422
        POP;
4423
      switch (ocode)
4424
        {
4425
        case TRUTH_ANDIF_EXPR:
4426
          stack[sp].expr
4427
            = default_function_array_conversion (stack[sp].expr);
4428
          stack[sp].expr.value = c_objc_common_truthvalue_conversion
4429
            (default_conversion (stack[sp].expr.value));
4430
          skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
4431
          break;
4432
        case TRUTH_ORIF_EXPR:
4433
          stack[sp].expr
4434
            = default_function_array_conversion (stack[sp].expr);
4435
          stack[sp].expr.value = c_objc_common_truthvalue_conversion
4436
            (default_conversion (stack[sp].expr.value));
4437
          skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
4438
          break;
4439
        default:
4440
          break;
4441
        }
4442
      sp++;
4443
      stack[sp].expr = c_parser_cast_expression (parser, NULL);
4444
      stack[sp].prec = oprec;
4445
      stack[sp].op = ocode;
4446
    }
4447
 out:
4448
  while (sp > 0)
4449
    POP;
4450
  return stack[0].expr;
4451
#undef POP
4452
}
4453
 
4454
/* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
4455
   NULL then it is an Objective-C message expression which is the
4456
   primary-expression starting the expression as an initializer.
4457
 
4458
   cast-expression:
4459
     unary-expression
4460
     ( type-name ) unary-expression
4461
*/
4462
 
4463
static struct c_expr
4464
c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4465
{
4466
  gcc_assert (!after || c_dialect_objc ());
4467
  if (after)
4468
    return c_parser_postfix_expression_after_primary (parser, *after);
4469
  /* If the expression begins with a parenthesized type name, it may
4470
     be either a cast or a compound literal; we need to see whether
4471
     the next character is '{' to tell the difference.  If not, it is
4472
     an unary expression.  */
4473
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4474
      && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4475
    {
4476
      struct c_type_name *type_name;
4477
      struct c_expr ret;
4478
      struct c_expr expr;
4479
      c_parser_consume_token (parser);
4480
      type_name = c_parser_type_name (parser);
4481
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4482
      if (type_name == NULL)
4483
        {
4484
          ret.value = error_mark_node;
4485
          ret.original_code = ERROR_MARK;
4486
          return ret;
4487
        }
4488
      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4489
        return c_parser_postfix_expression_after_paren_type (parser,
4490
                                                             type_name);
4491
      expr = c_parser_cast_expression (parser, NULL);
4492
      expr = default_function_array_conversion (expr);
4493
      ret.value = c_cast_expr (type_name, expr.value);
4494
      ret.original_code = ERROR_MARK;
4495
      return ret;
4496
    }
4497
  else
4498
    return c_parser_unary_expression (parser);
4499
}
4500
 
4501
/* Parse an unary expression (C90 6.3.3, C99 6.5.3).
4502
 
4503
   unary-expression:
4504
     postfix-expression
4505
     ++ unary-expression
4506
     -- unary-expression
4507
     unary-operator cast-expression
4508
     sizeof unary-expression
4509
     sizeof ( type-name )
4510
 
4511
   unary-operator: one of
4512
     & * + - ~ !
4513
 
4514
   GNU extensions:
4515
 
4516
   unary-expression:
4517
     __alignof__ unary-expression
4518
     __alignof__ ( type-name )
4519
     && identifier
4520
 
4521
   unary-operator: one of
4522
     __extension__ __real__ __imag__
4523
 
4524
   In addition, the GNU syntax treats ++ and -- as unary operators, so
4525
   they may be applied to cast expressions with errors for non-lvalues
4526
   given later.  */
4527
 
4528
static struct c_expr
4529
c_parser_unary_expression (c_parser *parser)
4530
{
4531
  int ext;
4532
  struct c_expr ret, op;
4533
  switch (c_parser_peek_token (parser)->type)
4534
    {
4535
    case CPP_PLUS_PLUS:
4536
      c_parser_consume_token (parser);
4537
      op = c_parser_cast_expression (parser, NULL);
4538
      op = default_function_array_conversion (op);
4539
      return parser_build_unary_op (PREINCREMENT_EXPR, op);
4540
    case CPP_MINUS_MINUS:
4541
      c_parser_consume_token (parser);
4542
      op = c_parser_cast_expression (parser, NULL);
4543
      op = default_function_array_conversion (op);
4544
      return parser_build_unary_op (PREDECREMENT_EXPR, op);
4545
    case CPP_AND:
4546
      c_parser_consume_token (parser);
4547
      return parser_build_unary_op (ADDR_EXPR,
4548
                                    c_parser_cast_expression (parser, NULL));
4549
    case CPP_MULT:
4550
      c_parser_consume_token (parser);
4551
      op = c_parser_cast_expression (parser, NULL);
4552
      op = default_function_array_conversion (op);
4553
      ret.value = build_indirect_ref (op.value, "unary *");
4554
      ret.original_code = ERROR_MARK;
4555
      return ret;
4556
    case CPP_PLUS:
4557
      c_parser_consume_token (parser);
4558
      if (!c_dialect_objc () && !in_system_header)
4559
        warning (OPT_Wtraditional,
4560
                 "traditional C rejects the unary plus operator");
4561
      op = c_parser_cast_expression (parser, NULL);
4562
      op = default_function_array_conversion (op);
4563
      return parser_build_unary_op (CONVERT_EXPR, op);
4564
    case CPP_MINUS:
4565
      c_parser_consume_token (parser);
4566
      op = c_parser_cast_expression (parser, NULL);
4567
      op = default_function_array_conversion (op);
4568
      return parser_build_unary_op (NEGATE_EXPR, op);
4569
    case CPP_COMPL:
4570
      c_parser_consume_token (parser);
4571
      op = c_parser_cast_expression (parser, NULL);
4572
      op = default_function_array_conversion (op);
4573
      return parser_build_unary_op (BIT_NOT_EXPR, op);
4574
    case CPP_NOT:
4575
      c_parser_consume_token (parser);
4576
      op = c_parser_cast_expression (parser, NULL);
4577
      op = default_function_array_conversion (op);
4578
      return parser_build_unary_op (TRUTH_NOT_EXPR, op);
4579
    case CPP_AND_AND:
4580
      /* Refer to the address of a label as a pointer.  */
4581
      c_parser_consume_token (parser);
4582
      if (c_parser_next_token_is (parser, CPP_NAME))
4583
        {
4584
          ret.value = finish_label_address_expr
4585
            (c_parser_peek_token (parser)->value);
4586
          c_parser_consume_token (parser);
4587
        }
4588
      else
4589
        {
4590
          c_parser_error (parser, "expected identifier");
4591
          ret.value = error_mark_node;
4592
        }
4593
        ret.original_code = ERROR_MARK;
4594
        return ret;
4595
    case CPP_KEYWORD:
4596
      switch (c_parser_peek_token (parser)->keyword)
4597
        {
4598
        case RID_SIZEOF:
4599
          return c_parser_sizeof_expression (parser);
4600
        case RID_ALIGNOF:
4601
          return c_parser_alignof_expression (parser);
4602
        case RID_EXTENSION:
4603
          c_parser_consume_token (parser);
4604
          ext = disable_extension_diagnostics ();
4605
          ret = c_parser_cast_expression (parser, NULL);
4606
          restore_extension_diagnostics (ext);
4607
          return ret;
4608
        case RID_REALPART:
4609
          c_parser_consume_token (parser);
4610
          op = c_parser_cast_expression (parser, NULL);
4611
          op = default_function_array_conversion (op);
4612
          return parser_build_unary_op (REALPART_EXPR, op);
4613
        case RID_IMAGPART:
4614
          c_parser_consume_token (parser);
4615
          op = c_parser_cast_expression (parser, NULL);
4616
          op = default_function_array_conversion (op);
4617
          return parser_build_unary_op (IMAGPART_EXPR, op);
4618
        default:
4619
          return c_parser_postfix_expression (parser);
4620
        }
4621
    default:
4622
      return c_parser_postfix_expression (parser);
4623
    }
4624
}
4625
 
4626
/* Parse a sizeof expression.  */
4627
 
4628
static struct c_expr
4629
c_parser_sizeof_expression (c_parser *parser)
4630
{
4631
  struct c_expr expr;
4632
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
4633
  c_parser_consume_token (parser);
4634
  skip_evaluation++;
4635
  in_sizeof++;
4636
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4637
      && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4638
    {
4639
      /* Either sizeof ( type-name ) or sizeof unary-expression
4640
         starting with a compound literal.  */
4641
      struct c_type_name *type_name;
4642
      c_parser_consume_token (parser);
4643
      type_name = c_parser_type_name (parser);
4644
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4645
      if (type_name == NULL)
4646
        {
4647
          struct c_expr ret;
4648
          skip_evaluation--;
4649
          in_sizeof--;
4650
          ret.value = error_mark_node;
4651
          ret.original_code = ERROR_MARK;
4652
          return ret;
4653
        }
4654
      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4655
        {
4656
          expr = c_parser_postfix_expression_after_paren_type (parser,
4657
                                                               type_name);
4658
          goto sizeof_expr;
4659
        }
4660
      /* sizeof ( type-name ).  */
4661
      skip_evaluation--;
4662
      in_sizeof--;
4663
      return c_expr_sizeof_type (type_name);
4664
    }
4665
  else
4666
    {
4667
      expr = c_parser_unary_expression (parser);
4668
    sizeof_expr:
4669
      skip_evaluation--;
4670
      in_sizeof--;
4671
      if (TREE_CODE (expr.value) == COMPONENT_REF
4672
          && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
4673
        error ("%<sizeof%> applied to a bit-field");
4674
      return c_expr_sizeof_expr (expr);
4675
    }
4676
}
4677
 
4678
/* Parse an alignof expression.  */
4679
 
4680
static struct c_expr
4681
c_parser_alignof_expression (c_parser *parser)
4682
{
4683
  struct c_expr expr;
4684
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
4685
  c_parser_consume_token (parser);
4686
  skip_evaluation++;
4687
  in_alignof++;
4688
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
4689
      && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4690
    {
4691
      /* Either __alignof__ ( type-name ) or __alignof__
4692
         unary-expression starting with a compound literal.  */
4693
      struct c_type_name *type_name;
4694
      struct c_expr ret;
4695
      c_parser_consume_token (parser);
4696
      type_name = c_parser_type_name (parser);
4697
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4698
      if (type_name == NULL)
4699
        {
4700
          struct c_expr ret;
4701
          skip_evaluation--;
4702
          in_alignof--;
4703
          ret.value = error_mark_node;
4704
          ret.original_code = ERROR_MARK;
4705
          return ret;
4706
        }
4707
      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
4708
        {
4709
          expr = c_parser_postfix_expression_after_paren_type (parser,
4710
                                                               type_name);
4711
          goto alignof_expr;
4712
        }
4713
      /* alignof ( type-name ).  */
4714
      skip_evaluation--;
4715
      in_alignof--;
4716
      ret.value = c_alignof (groktypename (type_name));
4717
      ret.original_code = ERROR_MARK;
4718
      return ret;
4719
    }
4720
  else
4721
    {
4722
      struct c_expr ret;
4723
      expr = c_parser_unary_expression (parser);
4724
    alignof_expr:
4725
      skip_evaluation--;
4726
      in_alignof--;
4727
      ret.value = c_alignof_expr (expr.value);
4728
      ret.original_code = ERROR_MARK;
4729
      return ret;
4730
    }
4731
}
4732
 
4733
/* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
4734
 
4735
   postfix-expression:
4736
     primary-expression
4737
     postfix-expression [ expression ]
4738
     postfix-expression ( argument-expression-list[opt] )
4739
     postfix-expression . identifier
4740
     postfix-expression -> identifier
4741
     postfix-expression ++
4742
     postfix-expression --
4743
     ( type-name ) { initializer-list }
4744
     ( type-name ) { initializer-list , }
4745
 
4746
   argument-expression-list:
4747
     argument-expression
4748
     argument-expression-list , argument-expression
4749
 
4750
   primary-expression:
4751
     identifier
4752
     constant
4753
     string-literal
4754
     ( expression )
4755
 
4756
   GNU extensions:
4757
 
4758
   primary-expression:
4759
     __func__
4760
       (treated as a keyword in GNU C)
4761
     __FUNCTION__
4762
     __PRETTY_FUNCTION__
4763
     ( compound-statement )
4764
     __builtin_va_arg ( assignment-expression , type-name )
4765
     __builtin_offsetof ( type-name , offsetof-member-designator )
4766
     __builtin_choose_expr ( assignment-expression ,
4767
                             assignment-expression ,
4768
                             assignment-expression )
4769
     __builtin_types_compatible_p ( type-name , type-name )
4770
 
4771
   offsetof-member-designator:
4772
     identifier
4773
     offsetof-member-designator . identifier
4774
     offsetof-member-designator [ expression ]
4775
 
4776
   Objective-C:
4777
 
4778
   primary-expression:
4779
     [ objc-receiver objc-message-args ]
4780
     @selector ( objc-selector-arg )
4781
     @protocol ( identifier )
4782
     @encode ( type-name )
4783
     objc-string-literal
4784
*/
4785
 
4786
static struct c_expr
4787
c_parser_postfix_expression (c_parser *parser)
4788
{
4789
  struct c_expr expr, e1, e2, e3;
4790
  struct c_type_name *t1, *t2;
4791
  switch (c_parser_peek_token (parser)->type)
4792
    {
4793
    case CPP_NUMBER:
4794
    case CPP_CHAR:
4795
    case CPP_WCHAR:
4796
      expr.value = c_parser_peek_token (parser)->value;
4797
      expr.original_code = ERROR_MARK;
4798
      c_parser_consume_token (parser);
4799
      break;
4800
    case CPP_STRING:
4801
    case CPP_WSTRING:
4802
      expr.value = c_parser_peek_token (parser)->value;
4803
      expr.original_code = STRING_CST;
4804
      c_parser_consume_token (parser);
4805
      break;
4806
    case CPP_OBJC_STRING:
4807
      gcc_assert (c_dialect_objc ());
4808
      expr.value
4809
        = objc_build_string_object (c_parser_peek_token (parser)->value);
4810
      expr.original_code = ERROR_MARK;
4811
      c_parser_consume_token (parser);
4812
      break;
4813
    case CPP_NAME:
4814
      if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
4815
        {
4816
          c_parser_error (parser, "expected expression");
4817
          expr.value = error_mark_node;
4818
          expr.original_code = ERROR_MARK;
4819
          break;
4820
        }
4821
      {
4822
        tree id = c_parser_peek_token (parser)->value;
4823
        location_t loc = c_parser_peek_token (parser)->location;
4824
        c_parser_consume_token (parser);
4825
        expr.value = build_external_ref (id,
4826
                                         (c_parser_peek_token (parser)->type
4827
                                          == CPP_OPEN_PAREN), loc);
4828
        expr.original_code = ERROR_MARK;
4829
      }
4830
      break;
4831
    case CPP_OPEN_PAREN:
4832
      /* A parenthesized expression, statement expression or compound
4833
         literal.  */
4834
      if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
4835
        {
4836
          /* A statement expression.  */
4837
          tree stmt;
4838
          c_parser_consume_token (parser);
4839
          c_parser_consume_token (parser);
4840
          if (cur_stmt_list == NULL)
4841
            {
4842
              error ("braced-group within expression allowed "
4843
                     "only inside a function");
4844
              parser->error = true;
4845
              c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
4846
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4847
              expr.value = error_mark_node;
4848
              expr.original_code = ERROR_MARK;
4849
              break;
4850
            }
4851
          stmt = c_begin_stmt_expr ();
4852
          c_parser_compound_statement_nostart (parser);
4853
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4854
                                     "expected %<)%>");
4855
          if (pedantic)
4856
            pedwarn ("ISO C forbids braced-groups within expressions");
4857
          expr.value = c_finish_stmt_expr (stmt);
4858
          expr.original_code = ERROR_MARK;
4859
        }
4860
      else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
4861
        {
4862
          /* A compound literal.  ??? Can we actually get here rather
4863
             than going directly to
4864
             c_parser_postfix_expression_after_paren_type from
4865
             elsewhere?  */
4866
          struct c_type_name *type_name;
4867
          c_parser_consume_token (parser);
4868
          type_name = c_parser_type_name (parser);
4869
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4870
                                     "expected %<)%>");
4871
          if (type_name == NULL)
4872
            {
4873
              expr.value = error_mark_node;
4874
              expr.original_code = ERROR_MARK;
4875
            }
4876
          else
4877
            expr = c_parser_postfix_expression_after_paren_type (parser,
4878
                                                                 type_name);
4879
        }
4880
      else
4881
        {
4882
          /* A parenthesized expression.  */
4883
          c_parser_consume_token (parser);
4884
          expr = c_parser_expression (parser);
4885
          if (TREE_CODE (expr.value) == MODIFY_EXPR)
4886
            TREE_NO_WARNING (expr.value) = 1;
4887
          expr.original_code = ERROR_MARK;
4888
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4889
                                     "expected %<)%>");
4890
        }
4891
      break;
4892
    case CPP_KEYWORD:
4893
      switch (c_parser_peek_token (parser)->keyword)
4894
        {
4895
        case RID_FUNCTION_NAME:
4896
        case RID_PRETTY_FUNCTION_NAME:
4897
        case RID_C99_FUNCTION_NAME:
4898
          expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
4899
                                   c_parser_peek_token (parser)->value);
4900
          expr.original_code = ERROR_MARK;
4901
          c_parser_consume_token (parser);
4902
          break;
4903
        case RID_VA_ARG:
4904
          c_parser_consume_token (parser);
4905
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4906
            {
4907
              expr.value = error_mark_node;
4908
              expr.original_code = ERROR_MARK;
4909
              break;
4910
            }
4911
          e1 = c_parser_expr_no_commas (parser, NULL);
4912
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
4913
            {
4914
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4915
              expr.value = error_mark_node;
4916
              expr.original_code = ERROR_MARK;
4917
              break;
4918
            }
4919
          t1 = c_parser_type_name (parser);
4920
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
4921
                                     "expected %<)%>");
4922
          if (t1 == NULL)
4923
            {
4924
              expr.value = error_mark_node;
4925
              expr.original_code = ERROR_MARK;
4926
            }
4927
          else
4928
            {
4929
              expr.value = build_va_arg (e1.value, groktypename (t1));
4930
              expr.original_code = ERROR_MARK;
4931
            }
4932
          break;
4933
        case RID_OFFSETOF:
4934
          c_parser_consume_token (parser);
4935
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4936
            {
4937
              expr.value = error_mark_node;
4938
              expr.original_code = ERROR_MARK;
4939
              break;
4940
            }
4941
          t1 = c_parser_type_name (parser);
4942
          if (t1 == NULL)
4943
            {
4944
              expr.value = error_mark_node;
4945
              expr.original_code = ERROR_MARK;
4946
              break;
4947
            }
4948
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
4949
            {
4950
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4951
              expr.value = error_mark_node;
4952
              expr.original_code = ERROR_MARK;
4953
              break;
4954
            }
4955
          {
4956
            tree type = groktypename (t1);
4957
            tree offsetof_ref;
4958
            if (type == error_mark_node)
4959
              offsetof_ref = error_mark_node;
4960
            else
4961
              offsetof_ref = build1 (INDIRECT_REF, type, NULL);
4962
            /* Parse the second argument to __builtin_offsetof.  We
4963
               must have one identifier, and beyond that we want to
4964
               accept sub structure and sub array references.  */
4965
            if (c_parser_next_token_is (parser, CPP_NAME))
4966
              {
4967
                offsetof_ref = build_component_ref
4968
                  (offsetof_ref, c_parser_peek_token (parser)->value);
4969
                c_parser_consume_token (parser);
4970
                while (c_parser_next_token_is (parser, CPP_DOT)
4971
                       || c_parser_next_token_is (parser,
4972
                                                  CPP_OPEN_SQUARE))
4973
                  {
4974
                    if (c_parser_next_token_is (parser, CPP_DOT))
4975
                      {
4976
                        c_parser_consume_token (parser);
4977
                        if (c_parser_next_token_is_not (parser,
4978
                                                        CPP_NAME))
4979
                          {
4980
                            c_parser_error (parser, "expected identifier");
4981
                            break;
4982
                          }
4983
                        offsetof_ref = build_component_ref
4984
                          (offsetof_ref,
4985
                           c_parser_peek_token (parser)->value);
4986
                        c_parser_consume_token (parser);
4987
                      }
4988
                    else
4989
                      {
4990
                        tree idx;
4991
                        c_parser_consume_token (parser);
4992
                        idx = c_parser_expression (parser).value;
4993
                        c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4994
                                                   "expected %<]%>");
4995
                        offsetof_ref = build_array_ref (offsetof_ref, idx);
4996
                      }
4997
                  }
4998
              }
4999
            else
5000
              c_parser_error (parser, "expected identifier");
5001
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5002
                                       "expected %<)%>");
5003
            expr.value = fold_offsetof (offsetof_ref);
5004
            expr.original_code = ERROR_MARK;
5005
          }
5006
          break;
5007
        case RID_CHOOSE_EXPR:
5008
          c_parser_consume_token (parser);
5009
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5010
            {
5011
              expr.value = error_mark_node;
5012
              expr.original_code = ERROR_MARK;
5013
              break;
5014
            }
5015
          e1 = c_parser_expr_no_commas (parser, NULL);
5016
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5017
            {
5018
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5019
              expr.value = error_mark_node;
5020
              expr.original_code = ERROR_MARK;
5021
              break;
5022
            }
5023
          e2 = c_parser_expr_no_commas (parser, NULL);
5024
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5025
            {
5026
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5027
              expr.value = error_mark_node;
5028
              expr.original_code = ERROR_MARK;
5029
              break;
5030
            }
5031
          e3 = c_parser_expr_no_commas (parser, NULL);
5032
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5033
                                     "expected %<)%>");
5034
          {
5035
            tree c;
5036
 
5037
            c = fold (e1.value);
5038
            if (TREE_CODE (c) != INTEGER_CST)
5039
              error ("first argument to %<__builtin_choose_expr%> not"
5040
                     " a constant");
5041
            expr = integer_zerop (c) ? e3 : e2;
5042
          }
5043
          break;
5044
        case RID_TYPES_COMPATIBLE_P:
5045
          c_parser_consume_token (parser);
5046
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5047
            {
5048
              expr.value = error_mark_node;
5049
              expr.original_code = ERROR_MARK;
5050
              break;
5051
            }
5052
          t1 = c_parser_type_name (parser);
5053
          if (t1 == NULL)
5054
            {
5055
              expr.value = error_mark_node;
5056
              expr.original_code = ERROR_MARK;
5057
              break;
5058
            }
5059
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5060
            {
5061
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5062
              expr.value = error_mark_node;
5063
              expr.original_code = ERROR_MARK;
5064
              break;
5065
            }
5066
          t2 = c_parser_type_name (parser);
5067
          if (t2 == NULL)
5068
            {
5069
              expr.value = error_mark_node;
5070
              expr.original_code = ERROR_MARK;
5071
              break;
5072
            }
5073
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5074
                                     "expected %<)%>");
5075
          {
5076
            tree e1, e2;
5077
 
5078
            e1 = TYPE_MAIN_VARIANT (groktypename (t1));
5079
            e2 = TYPE_MAIN_VARIANT (groktypename (t2));
5080
 
5081
            expr.value = comptypes (e1, e2)
5082
              ? build_int_cst (NULL_TREE, 1)
5083
              : build_int_cst (NULL_TREE, 0);
5084
            expr.original_code = ERROR_MARK;
5085
          }
5086
          break;
5087
        case RID_AT_SELECTOR:
5088
          gcc_assert (c_dialect_objc ());
5089
          c_parser_consume_token (parser);
5090
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5091
            {
5092
              expr.value = error_mark_node;
5093
              expr.original_code = ERROR_MARK;
5094
              break;
5095
            }
5096
          {
5097
            tree sel = c_parser_objc_selector_arg (parser);
5098
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5099
                                       "expected %<)%>");
5100
            expr.value = objc_build_selector_expr (sel);
5101
            expr.original_code = ERROR_MARK;
5102
          }
5103
          break;
5104
        case RID_AT_PROTOCOL:
5105
          gcc_assert (c_dialect_objc ());
5106
          c_parser_consume_token (parser);
5107
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5108
            {
5109
              expr.value = error_mark_node;
5110
              expr.original_code = ERROR_MARK;
5111
              break;
5112
            }
5113
          if (c_parser_next_token_is_not (parser, CPP_NAME))
5114
            {
5115
              c_parser_error (parser, "expected identifier");
5116
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5117
              expr.value = error_mark_node;
5118
              expr.original_code = ERROR_MARK;
5119
              break;
5120
            }
5121
          {
5122
            tree id = c_parser_peek_token (parser)->value;
5123
            c_parser_consume_token (parser);
5124
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5125
                                       "expected %<)%>");
5126
            expr.value = objc_build_protocol_expr (id);
5127
            expr.original_code = ERROR_MARK;
5128
          }
5129
          break;
5130
        case RID_AT_ENCODE:
5131
          /* Extension to support C-structures in the archiver.  */
5132
          gcc_assert (c_dialect_objc ());
5133
          c_parser_consume_token (parser);
5134
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5135
            {
5136
              expr.value = error_mark_node;
5137
              expr.original_code = ERROR_MARK;
5138
              break;
5139
            }
5140
          t1 = c_parser_type_name (parser);
5141
          if (t1 == NULL)
5142
            {
5143
              expr.value = error_mark_node;
5144
              expr.original_code = ERROR_MARK;
5145
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5146
              break;
5147
            }
5148
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5149
                                     "expected %<)%>");
5150
          {
5151
            tree type = groktypename (t1);
5152
            expr.value = objc_build_encode_expr (type);
5153
            expr.original_code = ERROR_MARK;
5154
          }
5155
          break;
5156
        default:
5157
          c_parser_error (parser, "expected expression");
5158
          expr.value = error_mark_node;
5159
          expr.original_code = ERROR_MARK;
5160
          break;
5161
        }
5162
      break;
5163
    case CPP_OPEN_SQUARE:
5164
      if (c_dialect_objc ())
5165
        {
5166
          tree receiver, args;
5167
          c_parser_consume_token (parser);
5168
          receiver = c_parser_objc_receiver (parser);
5169
          args = c_parser_objc_message_args (parser);
5170
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5171
                                     "expected %<]%>");
5172
          expr.value = objc_build_message_expr (build_tree_list (receiver,
5173
                                                                 args));
5174
          expr.original_code = ERROR_MARK;
5175
          break;
5176
        }
5177
      /* Else fall through to report error.  */
5178
    default:
5179
      c_parser_error (parser, "expected expression");
5180
      expr.value = error_mark_node;
5181
      expr.original_code = ERROR_MARK;
5182
      break;
5183
    }
5184
  return c_parser_postfix_expression_after_primary (parser, expr);
5185
}
5186
 
5187
/* Parse a postfix expression after a parenthesized type name: the
5188
   brace-enclosed initializer of a compound literal, possibly followed
5189
   by some postfix operators.  This is separate because it is not
5190
   possible to tell until after the type name whether a cast
5191
   expression has a cast or a compound literal, or whether the operand
5192
   of sizeof is a parenthesized type name or starts with a compound
5193
   literal.  */
5194
 
5195
static struct c_expr
5196
c_parser_postfix_expression_after_paren_type (c_parser *parser,
5197
                                              struct c_type_name *type_name)
5198
{
5199
  tree type;
5200
  struct c_expr init;
5201
  struct c_expr expr;
5202
  start_init (NULL_TREE, NULL, 0);
5203
  type = groktypename (type_name);
5204
  if (C_TYPE_VARIABLE_SIZE (type))
5205
    {
5206
      error ("compound literal has variable size");
5207
      type = error_mark_node;
5208
    }
5209
  init = c_parser_braced_init (parser, type, false);
5210
  finish_init ();
5211
  maybe_warn_string_init (type, init);
5212
 
5213
  if (pedantic && !flag_isoc99)
5214
    pedwarn ("ISO C90 forbids compound literals");
5215
  expr.value = build_compound_literal (type, init.value);
5216
  expr.original_code = ERROR_MARK;
5217
  return c_parser_postfix_expression_after_primary (parser, expr);
5218
}
5219
 
5220
/* Parse a postfix expression after the initial primary or compound
5221
   literal; that is, parse a series of postfix operators.  */
5222
 
5223
static struct c_expr
5224
c_parser_postfix_expression_after_primary (c_parser *parser,
5225
                                           struct c_expr expr)
5226
{
5227
  tree ident, idx, exprlist;
5228
  while (true)
5229
    {
5230
      switch (c_parser_peek_token (parser)->type)
5231
        {
5232
        case CPP_OPEN_SQUARE:
5233
          /* Array reference.  */
5234
          c_parser_consume_token (parser);
5235
          idx = c_parser_expression (parser).value;
5236
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5237
                                     "expected %<]%>");
5238
          expr.value = build_array_ref (expr.value, idx);
5239
          expr.original_code = ERROR_MARK;
5240
          break;
5241
        case CPP_OPEN_PAREN:
5242
          /* Function call.  */
5243
          c_parser_consume_token (parser);
5244
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5245
            exprlist = NULL_TREE;
5246
          else
5247
            exprlist = c_parser_expr_list (parser, true);
5248
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5249
                                     "expected %<)%>");
5250
          expr.value = build_function_call (expr.value, exprlist);
5251
          expr.original_code = ERROR_MARK;
5252
          break;
5253
        case CPP_DOT:
5254
          /* Structure element reference.  */
5255
          c_parser_consume_token (parser);
5256
          expr = default_function_array_conversion (expr);
5257
          if (c_parser_next_token_is (parser, CPP_NAME))
5258
            ident = c_parser_peek_token (parser)->value;
5259
          else
5260
            {
5261
              c_parser_error (parser, "expected identifier");
5262
              expr.value = error_mark_node;
5263
              expr.original_code = ERROR_MARK;
5264
              return expr;
5265
            }
5266
          c_parser_consume_token (parser);
5267
          expr.value = build_component_ref (expr.value, ident);
5268
          expr.original_code = ERROR_MARK;
5269
          break;
5270
        case CPP_DEREF:
5271
          /* Structure element reference.  */
5272
          c_parser_consume_token (parser);
5273
          expr = default_function_array_conversion (expr);
5274
          if (c_parser_next_token_is (parser, CPP_NAME))
5275
            ident = c_parser_peek_token (parser)->value;
5276
          else
5277
            {
5278
              c_parser_error (parser, "expected identifier");
5279
              expr.value = error_mark_node;
5280
              expr.original_code = ERROR_MARK;
5281
              return expr;
5282
            }
5283
          c_parser_consume_token (parser);
5284
          expr.value = build_component_ref (build_indirect_ref (expr.value,
5285
                                                                "->"), ident);
5286
          expr.original_code = ERROR_MARK;
5287
          break;
5288
        case CPP_PLUS_PLUS:
5289
          /* Postincrement.  */
5290
          c_parser_consume_token (parser);
5291
          expr = default_function_array_conversion (expr);
5292
          expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
5293
          expr.original_code = ERROR_MARK;
5294
          break;
5295
        case CPP_MINUS_MINUS:
5296
          /* Postdecrement.  */
5297
          c_parser_consume_token (parser);
5298
          expr = default_function_array_conversion (expr);
5299
          expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
5300
          expr.original_code = ERROR_MARK;
5301
          break;
5302
        default:
5303
          return expr;
5304
        }
5305
    }
5306
}
5307
 
5308
/* Parse an expression (C90 6.3.17, C99 6.5.17).
5309
 
5310
   expression:
5311
     assignment-expression
5312
     expression , assignment-expression
5313
*/
5314
 
5315
static struct c_expr
5316
c_parser_expression (c_parser *parser)
5317
{
5318
  struct c_expr expr;
5319
  expr = c_parser_expr_no_commas (parser, NULL);
5320
  while (c_parser_next_token_is (parser, CPP_COMMA))
5321
    {
5322
      struct c_expr next;
5323
      c_parser_consume_token (parser);
5324
      next = c_parser_expr_no_commas (parser, NULL);
5325
      next = default_function_array_conversion (next);
5326
      expr.value = build_compound_expr (expr.value, next.value);
5327
      expr.original_code = COMPOUND_EXPR;
5328
    }
5329
  return expr;
5330
}
5331
 
5332
/* Parse an expression and convert functions or arrays to
5333
   pointers.  */
5334
 
5335
static struct c_expr
5336
c_parser_expression_conv (c_parser *parser)
5337
{
5338
  struct c_expr expr;
5339
  expr = c_parser_expression (parser);
5340
  expr = default_function_array_conversion (expr);
5341
  return expr;
5342
}
5343
 
5344
/* Parse a non-empty list of expressions.  If CONVERT_P, convert
5345
   functions and arrays to pointers.
5346
 
5347
   nonempty-expr-list:
5348
     assignment-expression
5349
     nonempty-expr-list , assignment-expression
5350
*/
5351
 
5352
static tree
5353
c_parser_expr_list (c_parser *parser, bool convert_p)
5354
{
5355
  struct c_expr expr;
5356
  tree ret, cur;
5357
  expr = c_parser_expr_no_commas (parser, NULL);
5358
  if (convert_p)
5359
    expr = default_function_array_conversion (expr);
5360
  ret = cur = build_tree_list (NULL_TREE, expr.value);
5361
  while (c_parser_next_token_is (parser, CPP_COMMA))
5362
    {
5363
      c_parser_consume_token (parser);
5364
      expr = c_parser_expr_no_commas (parser, NULL);
5365
      if (convert_p)
5366
        expr = default_function_array_conversion (expr);
5367
      cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
5368
    }
5369
  return ret;
5370
}
5371
 
5372
 
5373
/* Parse Objective-C-specific constructs.  */
5374
 
5375
/* Parse an objc-class-definition.
5376
 
5377
   objc-class-definition:
5378
     @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
5379
       objc-class-instance-variables[opt] objc-methodprotolist @end
5380
     @implementation identifier objc-superclass[opt]
5381
       objc-class-instance-variables[opt]
5382
     @interface identifier ( identifier ) objc-protocol-refs[opt]
5383
       objc-methodprotolist @end
5384
     @implementation identifier ( identifier )
5385
 
5386
   objc-superclass:
5387
     : identifier
5388
 
5389
   "@interface identifier (" must start "@interface identifier (
5390
   identifier ) ...": objc-methodprotolist in the first production may
5391
   not start with a parenthesized identifier as a declarator of a data
5392
   definition with no declaration specifiers if the objc-superclass,
5393
   objc-protocol-refs and objc-class-instance-variables are omitted.  */
5394
 
5395
static void
5396
c_parser_objc_class_definition (c_parser *parser)
5397
{
5398
  bool iface_p;
5399
  tree id1;
5400
  tree superclass;
5401
  if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
5402
    iface_p = true;
5403
  else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
5404
    iface_p = false;
5405
  else
5406
    gcc_unreachable ();
5407
  c_parser_consume_token (parser);
5408
  if (c_parser_next_token_is_not (parser, CPP_NAME))
5409
    {
5410
      c_parser_error (parser, "expected identifier");
5411
      return;
5412
    }
5413
  id1 = c_parser_peek_token (parser)->value;
5414
  c_parser_consume_token (parser);
5415
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5416
    {
5417
      tree id2;
5418
      tree proto = NULL_TREE;
5419
      c_parser_consume_token (parser);
5420
      if (c_parser_next_token_is_not (parser, CPP_NAME))
5421
        {
5422
          c_parser_error (parser, "expected identifier");
5423
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5424
          return;
5425
        }
5426
      id2 = c_parser_peek_token (parser)->value;
5427
      c_parser_consume_token (parser);
5428
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5429
      if (!iface_p)
5430
        {
5431
          objc_start_category_implementation (id1, id2);
5432
          return;
5433
        }
5434
      if (c_parser_next_token_is (parser, CPP_LESS))
5435
        proto = c_parser_objc_protocol_refs (parser);
5436
      objc_start_category_interface (id1, id2, proto);
5437
      c_parser_objc_methodprotolist (parser);
5438
      c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5439
      objc_finish_interface ();
5440
      return;
5441
    }
5442
  if (c_parser_next_token_is (parser, CPP_COLON))
5443
    {
5444
      c_parser_consume_token (parser);
5445
      if (c_parser_next_token_is_not (parser, CPP_NAME))
5446
        {
5447
          c_parser_error (parser, "expected identifier");
5448
          return;
5449
        }
5450
      superclass = c_parser_peek_token (parser)->value;
5451
      c_parser_consume_token (parser);
5452
    }
5453
  else
5454
    superclass = NULL_TREE;
5455
  if (iface_p)
5456
    {
5457
      tree proto = NULL_TREE;
5458
      if (c_parser_next_token_is (parser, CPP_LESS))
5459
        proto = c_parser_objc_protocol_refs (parser);
5460
      objc_start_class_interface (id1, superclass, proto);
5461
    }
5462
  else
5463
    objc_start_class_implementation (id1, superclass);
5464
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5465
    c_parser_objc_class_instance_variables (parser);
5466
  if (iface_p)
5467
    {
5468
      objc_continue_interface ();
5469
      c_parser_objc_methodprotolist (parser);
5470
      c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5471
      objc_finish_interface ();
5472
    }
5473
  else
5474
    {
5475
      objc_continue_implementation ();
5476
      return;
5477
    }
5478
}
5479
 
5480
/* Parse objc-class-instance-variables.
5481
 
5482
   objc-class-instance-variables:
5483
     { objc-instance-variable-decl-list[opt] }
5484
 
5485
   objc-instance-variable-decl-list:
5486
     objc-visibility-spec
5487
     objc-instance-variable-decl ;
5488
     ;
5489
     objc-instance-variable-decl-list objc-visibility-spec
5490
     objc-instance-variable-decl-list objc-instance-variable-decl ;
5491
     objc-instance-variable-decl-list ;
5492
 
5493
   objc-visibility-spec:
5494
     @private
5495
     @protected
5496
     @public
5497
 
5498
   objc-instance-variable-decl:
5499
     struct-declaration
5500
*/
5501
 
5502
static void
5503
c_parser_objc_class_instance_variables (c_parser *parser)
5504
{
5505
  gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
5506
  c_parser_consume_token (parser);
5507
  while (c_parser_next_token_is_not (parser, CPP_EOF))
5508
    {
5509
      tree decls;
5510
      /* Parse any stray semicolon.  */
5511
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5512
        {
5513
          if (pedantic)
5514
            pedwarn ("extra semicolon in struct or union specified");
5515
          c_parser_consume_token (parser);
5516
          continue;
5517
        }
5518
      /* Stop if at the end of the instance variables.  */
5519
      if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
5520
        {
5521
          c_parser_consume_token (parser);
5522
          break;
5523
        }
5524
      /* Parse any objc-visibility-spec.  */
5525
      if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
5526
        {
5527
          c_parser_consume_token (parser);
5528
          objc_set_visibility (2);
5529
          continue;
5530
        }
5531
      else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
5532
        {
5533
          c_parser_consume_token (parser);
5534
          objc_set_visibility (0);
5535
          continue;
5536
        }
5537
      else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
5538
        {
5539
          c_parser_consume_token (parser);
5540
          objc_set_visibility (1);
5541
          continue;
5542
        }
5543
      /* Parse some comma-separated declarations.  */
5544
      decls = c_parser_struct_declaration (parser);
5545
      {
5546
        /* Comma-separated instance variables are chained together in
5547
           reverse order; add them one by one.  */
5548
        tree ivar = nreverse (decls);
5549
        for (; ivar; ivar = TREE_CHAIN (ivar))
5550
          objc_add_instance_variable (copy_node (ivar));
5551
      }
5552
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5553
    }
5554
}
5555
 
5556
/* Parse an objc-class-declaration.
5557
 
5558
   objc-class-declaration:
5559
     @class identifier-list ;
5560
*/
5561
 
5562
static void
5563
c_parser_objc_class_declaration (c_parser *parser)
5564
{
5565
  tree list = NULL_TREE;
5566
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
5567
  c_parser_consume_token (parser);
5568
  /* Any identifiers, including those declared as type names, are OK
5569
     here.  */
5570
  while (true)
5571
    {
5572
      tree id;
5573
      if (c_parser_next_token_is_not (parser, CPP_NAME))
5574
        {
5575
          c_parser_error (parser, "expected identifier");
5576
          break;
5577
        }
5578
      id = c_parser_peek_token (parser)->value;
5579
      list = chainon (list, build_tree_list (NULL_TREE, id));
5580
      c_parser_consume_token (parser);
5581
      if (c_parser_next_token_is (parser, CPP_COMMA))
5582
        c_parser_consume_token (parser);
5583
      else
5584
        break;
5585
    }
5586
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5587
  objc_declare_class (list);
5588
}
5589
 
5590
/* Parse an objc-alias-declaration.
5591
 
5592
   objc-alias-declaration:
5593
     @compatibility_alias identifier identifier ;
5594
*/
5595
 
5596
static void
5597
c_parser_objc_alias_declaration (c_parser *parser)
5598
{
5599
  tree id1, id2;
5600
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
5601
  c_parser_consume_token (parser);
5602
  if (c_parser_next_token_is_not (parser, CPP_NAME))
5603
    {
5604
      c_parser_error (parser, "expected identifier");
5605
      c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5606
      return;
5607
    }
5608
  id1 = c_parser_peek_token (parser)->value;
5609
  c_parser_consume_token (parser);
5610
  if (c_parser_next_token_is_not (parser, CPP_NAME))
5611
    {
5612
      c_parser_error (parser, "expected identifier");
5613
      c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
5614
      return;
5615
    }
5616
  id2 = c_parser_peek_token (parser)->value;
5617
  c_parser_consume_token (parser);
5618
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5619
  objc_declare_alias (id1, id2);
5620
}
5621
 
5622
/* Parse an objc-protocol-definition.
5623
 
5624
   objc-protocol-definition:
5625
     @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
5626
     @protocol identifier-list ;
5627
 
5628
   "@protocol identifier ;" should be resolved as "@protocol
5629
   identifier-list ;": objc-methodprotolist may not start with a
5630
   semicolon in the first alternative if objc-protocol-refs are
5631
   omitted.  */
5632
 
5633
static void
5634
c_parser_objc_protocol_definition (c_parser *parser)
5635
{
5636
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
5637
  c_parser_consume_token (parser);
5638
  if (c_parser_next_token_is_not (parser, CPP_NAME))
5639
    {
5640
      c_parser_error (parser, "expected identifier");
5641
      return;
5642
    }
5643
  if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
5644
      || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
5645
    {
5646
      tree list = NULL_TREE;
5647
      /* Any identifiers, including those declared as type names, are
5648
         OK here.  */
5649
      while (true)
5650
        {
5651
          tree id;
5652
          if (c_parser_next_token_is_not (parser, CPP_NAME))
5653
            {
5654
              c_parser_error (parser, "expected identifier");
5655
              break;
5656
            }
5657
          id = c_parser_peek_token (parser)->value;
5658
          list = chainon (list, build_tree_list (NULL_TREE, id));
5659
          c_parser_consume_token (parser);
5660
          if (c_parser_next_token_is (parser, CPP_COMMA))
5661
            c_parser_consume_token (parser);
5662
          else
5663
            break;
5664
        }
5665
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5666
      objc_declare_protocols (list);
5667
    }
5668
  else
5669
    {
5670
      tree id = c_parser_peek_token (parser)->value;
5671
      tree proto = NULL_TREE;
5672
      c_parser_consume_token (parser);
5673
      if (c_parser_next_token_is (parser, CPP_LESS))
5674
        proto = c_parser_objc_protocol_refs (parser);
5675
      objc_pq_context = 1;
5676
      objc_start_protocol (id, proto);
5677
      c_parser_objc_methodprotolist (parser);
5678
      c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
5679
      objc_pq_context = 0;
5680
      objc_finish_interface ();
5681
    }
5682
}
5683
 
5684
/* Parse an objc-method-type.
5685
 
5686
   objc-method-type:
5687
     +
5688
     -
5689
*/
5690
 
5691
static enum tree_code
5692
c_parser_objc_method_type (c_parser *parser)
5693
{
5694
  switch (c_parser_peek_token (parser)->type)
5695
    {
5696
    case CPP_PLUS:
5697
      c_parser_consume_token (parser);
5698
      return PLUS_EXPR;
5699
    case CPP_MINUS:
5700
      c_parser_consume_token (parser);
5701
      return MINUS_EXPR;
5702
    default:
5703
      gcc_unreachable ();
5704
    }
5705
}
5706
 
5707
/* Parse an objc-method-definition.
5708
 
5709
   objc-method-definition:
5710
     objc-method-type objc-method-decl ;[opt] compound-statement
5711
*/
5712
 
5713
static void
5714
c_parser_objc_method_definition (c_parser *parser)
5715
{
5716
  enum tree_code type = c_parser_objc_method_type (parser);
5717
  tree decl;
5718
  objc_set_method_type (type);
5719
  objc_pq_context = 1;
5720
  decl = c_parser_objc_method_decl (parser);
5721
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
5722
    {
5723
      c_parser_consume_token (parser);
5724
      if (pedantic)
5725
        pedwarn ("extra semicolon in method definition specified");
5726
    }
5727
  if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5728
    {
5729
      c_parser_error (parser, "expected %<{%>");
5730
      return;
5731
    }
5732
  objc_pq_context = 0;
5733
  objc_start_method_definition (decl);
5734
  add_stmt (c_parser_compound_statement (parser));
5735
  objc_finish_method_definition (current_function_decl);
5736
}
5737
 
5738
/* Parse an objc-methodprotolist.
5739
 
5740
   objc-methodprotolist:
5741
     empty
5742
     objc-methodprotolist objc-methodproto
5743
     objc-methodprotolist declaration
5744
     objc-methodprotolist ;
5745
 
5746
   The declaration is a data definition, which may be missing
5747
   declaration specifiers under the same rules and diagnostics as
5748
   other data definitions outside functions, and the stray semicolon
5749
   is diagnosed the same way as a stray semicolon outside a
5750
   function.  */
5751
 
5752
static void
5753
c_parser_objc_methodprotolist (c_parser *parser)
5754
{
5755
  while (true)
5756
    {
5757
      /* The list is terminated by @end.  */
5758
      switch (c_parser_peek_token (parser)->type)
5759
        {
5760
        case CPP_SEMICOLON:
5761
          if (pedantic)
5762
            pedwarn ("ISO C does not allow extra %<;%> outside of a function");
5763
          c_parser_consume_token (parser);
5764
          break;
5765
        case CPP_PLUS:
5766
        case CPP_MINUS:
5767
          c_parser_objc_methodproto (parser);
5768
          break;
5769
        case CPP_EOF:
5770
          return;
5771
        default:
5772
          if (c_parser_next_token_is_keyword (parser, RID_AT_END))
5773
            return;
5774
          c_parser_declaration_or_fndef (parser, false, true, false, true);
5775
          break;
5776
        }
5777
    }
5778
}
5779
 
5780
/* Parse an objc-methodproto.
5781
 
5782
   objc-methodproto:
5783
     objc-method-type objc-method-decl ;
5784
*/
5785
 
5786
static void
5787
c_parser_objc_methodproto (c_parser *parser)
5788
{
5789
  enum tree_code type = c_parser_objc_method_type (parser);
5790
  tree decl;
5791
  objc_set_method_type (type);
5792
  /* Remember protocol qualifiers in prototypes.  */
5793
  objc_pq_context = 1;
5794
  decl = c_parser_objc_method_decl (parser);
5795
  /* Forget protocol qualifiers here.  */
5796
  objc_pq_context = 0;
5797
  objc_add_method_declaration (decl);
5798
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
5799
}
5800
 
5801
/* Parse an objc-method-decl.
5802
 
5803
   objc-method-decl:
5804
     ( objc-type-name ) objc-selector
5805
     objc-selector
5806
     ( objc-type-name ) objc-keyword-selector objc-optparmlist
5807
     objc-keyword-selector objc-optparmlist
5808
 
5809
   objc-keyword-selector:
5810
     objc-keyword-decl
5811
     objc-keyword-selector objc-keyword-decl
5812
 
5813
   objc-keyword-decl:
5814
     objc-selector : ( objc-type-name ) identifier
5815
     objc-selector : identifier
5816
     : ( objc-type-name ) identifier
5817
     : identifier
5818
 
5819
   objc-optparmlist:
5820
     objc-optparms objc-optellipsis
5821
 
5822
   objc-optparms:
5823
     empty
5824
     objc-opt-parms , parameter-declaration
5825
 
5826
   objc-optellipsis:
5827
     empty
5828
     , ...
5829
*/
5830
 
5831
static tree
5832
c_parser_objc_method_decl (c_parser *parser)
5833
{
5834
  tree type = NULL_TREE;
5835
  tree sel;
5836
  tree parms = NULL_TREE;
5837
  bool ellipsis = false;
5838
 
5839
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5840
    {
5841
      c_parser_consume_token (parser);
5842
      type = c_parser_objc_type_name (parser);
5843
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5844
    }
5845
  sel = c_parser_objc_selector (parser);
5846
  /* If there is no selector, or a colon follows, we have an
5847
     objc-keyword-selector.  If there is a selector, and a colon does
5848
     not follow, that selector ends the objc-method-decl.  */
5849
  if (!sel || c_parser_next_token_is (parser, CPP_COLON))
5850
    {
5851
      tree tsel = sel;
5852
      tree list = NULL_TREE;
5853
      while (true)
5854
        {
5855
          tree atype = NULL_TREE, id, keyworddecl;
5856
          if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
5857
            break;
5858
          if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
5859
            {
5860
              c_parser_consume_token (parser);
5861
              atype = c_parser_objc_type_name (parser);
5862
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5863
                                         "expected %<)%>");
5864
            }
5865
          if (c_parser_next_token_is_not (parser, CPP_NAME))
5866
            {
5867
              c_parser_error (parser, "expected identifier");
5868
              return error_mark_node;
5869
            }
5870
          id = c_parser_peek_token (parser)->value;
5871
          c_parser_consume_token (parser);
5872
          keyworddecl = objc_build_keyword_decl (tsel, atype, id);
5873
          list = chainon (list, keyworddecl);
5874
          tsel = c_parser_objc_selector (parser);
5875
          if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
5876
            break;
5877
        }
5878
      /* Parse the optional parameter list.  Optional Objective-C
5879
         method parameters follow the C syntax, and may include '...'
5880
         to denote a variable number of arguments.  */
5881
      parms = make_node (TREE_LIST);
5882
      while (c_parser_next_token_is (parser, CPP_COMMA))
5883
        {
5884
          struct c_parm *parm;
5885
          c_parser_consume_token (parser);
5886
          if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
5887
            {
5888
              ellipsis = true;
5889
              c_parser_consume_token (parser);
5890
              break;
5891
            }
5892
          parm = c_parser_parameter_declaration (parser, NULL_TREE);
5893
          if (parm == NULL)
5894
            break;
5895
          parms = chainon (parms,
5896
                           build_tree_list (NULL_TREE, grokparm (parm)));
5897
        }
5898
      sel = list;
5899
    }
5900
  return objc_build_method_signature (type, sel, parms, ellipsis);
5901
}
5902
 
5903
/* Parse an objc-type-name.
5904
 
5905
   objc-type-name:
5906
     objc-type-qualifiers[opt] type-name
5907
     objc-type-qualifiers[opt]
5908
 
5909
   objc-type-qualifiers:
5910
     objc-type-qualifier
5911
     objc-type-qualifiers objc-type-qualifier
5912
 
5913
   objc-type-qualifier: one of
5914
     in out inout bycopy byref oneway
5915
*/
5916
 
5917
static tree
5918
c_parser_objc_type_name (c_parser *parser)
5919
{
5920
  tree quals = NULL_TREE;
5921
  struct c_type_name *typename = NULL;
5922
  tree type = NULL_TREE;
5923
  while (true)
5924
    {
5925
      c_token *token = c_parser_peek_token (parser);
5926
      if (token->type == CPP_KEYWORD
5927
          && (token->keyword == RID_IN
5928
              || token->keyword == RID_OUT
5929
              || token->keyword == RID_INOUT
5930
              || token->keyword == RID_BYCOPY
5931
              || token->keyword == RID_BYREF
5932
              || token->keyword == RID_ONEWAY))
5933
        {
5934
          quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
5935
          c_parser_consume_token (parser);
5936
        }
5937
      else
5938
        break;
5939
    }
5940
  if (c_parser_next_token_starts_typename (parser))
5941
    typename = c_parser_type_name (parser);
5942
  if (typename)
5943
    type = groktypename (typename);
5944
  return build_tree_list (quals, type);
5945
}
5946
 
5947
/* Parse objc-protocol-refs.
5948
 
5949
   objc-protocol-refs:
5950
     < identifier-list >
5951
*/
5952
 
5953
static tree
5954
c_parser_objc_protocol_refs (c_parser *parser)
5955
{
5956
  tree list = NULL_TREE;
5957
  gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
5958
  c_parser_consume_token (parser);
5959
  /* Any identifiers, including those declared as type names, are OK
5960
     here.  */
5961
  while (true)
5962
    {
5963
      tree id;
5964
      if (c_parser_next_token_is_not (parser, CPP_NAME))
5965
        {
5966
          c_parser_error (parser, "expected identifier");
5967
          break;
5968
        }
5969
      id = c_parser_peek_token (parser)->value;
5970
      list = chainon (list, build_tree_list (NULL_TREE, id));
5971
      c_parser_consume_token (parser);
5972
      if (c_parser_next_token_is (parser, CPP_COMMA))
5973
        c_parser_consume_token (parser);
5974
      else
5975
        break;
5976
    }
5977
  c_parser_require (parser, CPP_GREATER, "expected %<>%>");
5978
  return list;
5979
}
5980
 
5981
/* Parse an objc-try-catch-statement.
5982
 
5983
   objc-try-catch-statement:
5984
     @try compound-statement objc-catch-list[opt]
5985
     @try compound-statement objc-catch-list[opt] @finally compound-statement
5986
 
5987
   objc-catch-list:
5988
     @catch ( parameter-declaration ) compound-statement
5989
     objc-catch-list @catch ( parameter-declaration ) compound-statement
5990
*/
5991
 
5992
static void
5993
c_parser_objc_try_catch_statement (c_parser *parser)
5994
{
5995
  location_t loc;
5996
  tree stmt;
5997
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
5998
  c_parser_consume_token (parser);
5999
  loc = c_parser_peek_token (parser)->location;
6000
  stmt = c_parser_compound_statement (parser);
6001
  objc_begin_try_stmt (loc, stmt);
6002
  while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
6003
    {
6004
      struct c_parm *parm;
6005
      c_parser_consume_token (parser);
6006
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6007
        break;
6008
      parm = c_parser_parameter_declaration (parser, NULL_TREE);
6009
      if (parm == NULL)
6010
        {
6011
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6012
          break;
6013
        }
6014
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6015
      objc_begin_catch_clause (grokparm (parm));
6016
      if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
6017
        c_parser_compound_statement_nostart (parser);
6018
      objc_finish_catch_clause ();
6019
    }
6020
  if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
6021
    {
6022
      location_t finloc;
6023
      tree finstmt;
6024
      c_parser_consume_token (parser);
6025
      finloc = c_parser_peek_token (parser)->location;
6026
      finstmt = c_parser_compound_statement (parser);
6027
      objc_build_finally_clause (finloc, finstmt);
6028
    }
6029
  objc_finish_try_stmt ();
6030
}
6031
 
6032
/* Parse an objc-synchronized-statement.
6033
 
6034
   objc-synchronized-statement:
6035
     @synchronized ( expression ) compound-statement
6036
*/
6037
 
6038
static void
6039
c_parser_objc_synchronized_statement (c_parser *parser)
6040
{
6041
  location_t loc;
6042
  tree expr, stmt;
6043
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6044
  c_parser_consume_token (parser);
6045
  loc = c_parser_peek_token (parser)->location;
6046
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6047
    {
6048
      expr = c_parser_expression (parser).value;
6049
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6050
    }
6051
  else
6052
    expr = error_mark_node;
6053
  stmt = c_parser_compound_statement (parser);
6054
  objc_build_synchronized (loc, expr, stmt);
6055
}
6056
 
6057
/* Parse an objc-selector; return NULL_TREE without an error if the
6058
   next token is not an objc-selector.
6059
 
6060
   objc-selector:
6061
     identifier
6062
     one of
6063
       enum struct union if else while do for switch case default
6064
       break continue return goto asm sizeof typeof __alignof
6065
       unsigned long const short volatile signed restrict _Complex
6066
       in out inout bycopy byref oneway int char float double void _Bool
6067
 
6068
   ??? Why this selection of keywords but not, for example, storage
6069
   class specifiers?  */
6070
 
6071
static tree
6072
c_parser_objc_selector (c_parser *parser)
6073
{
6074
  c_token *token = c_parser_peek_token (parser);
6075
  tree value = token->value;
6076
  if (token->type == CPP_NAME)
6077
    {
6078
      c_parser_consume_token (parser);
6079
      return value;
6080
    }
6081
  if (token->type != CPP_KEYWORD)
6082
    return NULL_TREE;
6083
  switch (token->keyword)
6084
    {
6085
    case RID_ENUM:
6086
    case RID_STRUCT:
6087
    case RID_UNION:
6088
    case RID_IF:
6089
    case RID_ELSE:
6090
    case RID_WHILE:
6091
    case RID_DO:
6092
    case RID_FOR:
6093
    case RID_SWITCH:
6094
    case RID_CASE:
6095
    case RID_DEFAULT:
6096
    case RID_BREAK:
6097
    case RID_CONTINUE:
6098
    case RID_RETURN:
6099
    case RID_GOTO:
6100
    case RID_ASM:
6101
    case RID_SIZEOF:
6102
    case RID_TYPEOF:
6103
    case RID_ALIGNOF:
6104
    case RID_UNSIGNED:
6105
    case RID_LONG:
6106
    case RID_CONST:
6107
    case RID_SHORT:
6108
    case RID_VOLATILE:
6109
    case RID_SIGNED:
6110
    case RID_RESTRICT:
6111
    case RID_COMPLEX:
6112
    case RID_IN:
6113
    case RID_OUT:
6114
    case RID_INOUT:
6115
    case RID_BYCOPY:
6116
    case RID_BYREF:
6117
    case RID_ONEWAY:
6118
    case RID_INT:
6119
    case RID_CHAR:
6120
    case RID_FLOAT:
6121
    case RID_DOUBLE:
6122
    case RID_VOID:
6123
    case RID_BOOL:
6124
      c_parser_consume_token (parser);
6125
      return value;
6126
    default:
6127
      return NULL_TREE;
6128
    }
6129
}
6130
 
6131
/* Parse an objc-selector-arg.
6132
 
6133
   objc-selector-arg:
6134
     objc-selector
6135
     objc-keywordname-list
6136
 
6137
   objc-keywordname-list:
6138
     objc-keywordname
6139
     objc-keywordname-list objc-keywordname
6140
 
6141
   objc-keywordname:
6142
     objc-selector :
6143
     :
6144
*/
6145
 
6146
static tree
6147
c_parser_objc_selector_arg (c_parser *parser)
6148
{
6149
  tree sel = c_parser_objc_selector (parser);
6150
  tree list = NULL_TREE;
6151
  if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6152
    return sel;
6153
  while (true)
6154
    {
6155
      if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6156
        return list;
6157
      list = chainon (list, build_tree_list (sel, NULL_TREE));
6158
      sel = c_parser_objc_selector (parser);
6159
      if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6160
        break;
6161
    }
6162
  return list;
6163
}
6164
 
6165
/* Parse an objc-receiver.
6166
 
6167
   objc-receiver:
6168
     expression
6169
     class-name
6170
     type-name
6171
*/
6172
 
6173
static tree
6174
c_parser_objc_receiver (c_parser *parser)
6175
{
6176
  if (c_parser_peek_token (parser)->type == CPP_NAME
6177
      && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6178
          || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6179
    {
6180
      tree id = c_parser_peek_token (parser)->value;
6181
      c_parser_consume_token (parser);
6182
      return objc_get_class_reference (id);
6183
    }
6184
  return c_parser_expression (parser).value;
6185
}
6186
 
6187
/* Parse objc-message-args.
6188
 
6189
   objc-message-args:
6190
     objc-selector
6191
     objc-keywordarg-list
6192
 
6193
   objc-keywordarg-list:
6194
     objc-keywordarg
6195
     objc-keywordarg-list objc-keywordarg
6196
 
6197
   objc-keywordarg:
6198
     objc-selector : objc-keywordexpr
6199
     : objc-keywordexpr
6200
*/
6201
 
6202
static tree
6203
c_parser_objc_message_args (c_parser *parser)
6204
{
6205
  tree sel = c_parser_objc_selector (parser);
6206
  tree list = NULL_TREE;
6207
  if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6208
    return sel;
6209
  while (true)
6210
    {
6211
      tree keywordexpr;
6212
      if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6213
        return list;
6214
      keywordexpr = c_parser_objc_keywordexpr (parser);
6215
      list = chainon (list, build_tree_list (sel, keywordexpr));
6216
      sel = c_parser_objc_selector (parser);
6217
      if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6218
        break;
6219
    }
6220
  return list;
6221
}
6222
 
6223
/* Parse an objc-keywordexpr.
6224
 
6225
   objc-keywordexpr:
6226
     nonempty-expr-list
6227
*/
6228
 
6229
static tree
6230
c_parser_objc_keywordexpr (c_parser *parser)
6231
{
6232
  tree list = c_parser_expr_list (parser, true);
6233
  if (TREE_CHAIN (list) == NULL_TREE)
6234
    {
6235
      /* Just return the expression, remove a level of
6236
         indirection.  */
6237
      return TREE_VALUE (list);
6238
    }
6239
  else
6240
    {
6241
      /* We have a comma expression, we will collapse later.  */
6242
      return list;
6243
    }
6244
}
6245
 
6246
 
6247
/* The actual parser and external interface.  ??? Does this need to be
6248
   garbage-collected?  */
6249
 
6250
static GTY (()) c_parser *the_parser;
6251
 
6252
/* Parse a single source file.  */
6253
 
6254
void
6255
c_parse_file (void)
6256
{
6257
  the_parser = c_parser_new ();
6258
  c_parser_translation_unit (the_parser);
6259
  the_parser = NULL;
6260
}
6261
 
6262
#include "gt-c-parser.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.