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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [c-parser.c] - Blame information for rev 309

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

Line No. Rev Author Line
1 280 jeremybenn
/* 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, 2007, 2008, 2009
4
   Free Software Foundation, Inc.
5
 
6
   Parser actions based on the old Bison parser; structure somewhat
7
   influenced by and fragments based on the C++ parser.
8
 
9
This file is part of GCC.
10
 
11
GCC is free software; you can redistribute it and/or modify it under
12
the terms of the GNU General Public License as published by the Free
13
Software Foundation; either version 3, or (at your option) any later
14
version.
15
 
16
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
17
WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19
for more details.
20
 
21
You should have received a copy of the GNU General Public License
22
along with GCC; see the file COPYING3.  If not see
23
<http://www.gnu.org/licenses/>.  */
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 "rtl.h"
46
#include "langhooks.h"
47
#include "input.h"
48
#include "cpplib.h"
49
#include "timevar.h"
50
#include "c-pragma.h"
51
#include "c-tree.h"
52
#include "flags.h"
53
#include "output.h"
54
#include "toplev.h"
55
#include "ggc.h"
56
#include "c-common.h"
57
#include "vec.h"
58
#include "target.h"
59
#include "cgraph.h"
60
#include "plugin.h"
61
#include "except.h"
62
 
63
 
64
/* Initialization routine for this file.  */
65
 
66
void
67
c_parse_init (void)
68
{
69
  /* The only initialization required is of the reserved word
70
     identifiers.  */
71
  unsigned int i;
72
  tree id;
73
  int mask = 0;
74
 
75
  /* Make sure RID_MAX hasn't grown past the 8 bits used to hold the keyword in
76
     the c_token structure.  */
77
  gcc_assert (RID_MAX <= 255);
78
 
79
  mask |= D_CXXONLY;
80
  if (!flag_isoc99)
81
    mask |= D_C99;
82
  if (flag_no_asm)
83
    {
84
      mask |= D_ASM | D_EXT;
85
      if (!flag_isoc99)
86
        mask |= D_EXT89;
87
    }
88
  if (!c_dialect_objc ())
89
    mask |= D_OBJC | D_CXX_OBJC;
90
 
91
  ridpointers = GGC_CNEWVEC (tree, (int) RID_MAX);
92
  for (i = 0; i < num_c_common_reswords; i++)
93
    {
94
      /* If a keyword is disabled, do not enter it into the table
95
         and so create a canonical spelling that isn't a keyword.  */
96
      if (c_common_reswords[i].disable & mask)
97
        {
98
          if (warn_cxx_compat
99
              && (c_common_reswords[i].disable & D_CXXWARN))
100
            {
101
              id = get_identifier (c_common_reswords[i].word);
102
              C_SET_RID_CODE (id, RID_CXX_COMPAT_WARN);
103
              C_IS_RESERVED_WORD (id) = 1;
104
            }
105
          continue;
106
        }
107
 
108
      id = get_identifier (c_common_reswords[i].word);
109
      C_SET_RID_CODE (id, c_common_reswords[i].rid);
110
      C_IS_RESERVED_WORD (id) = 1;
111
      ridpointers [(int) c_common_reswords[i].rid] = id;
112
    }
113
}
114
 
115
/* The C lexer intermediates between the lexer in cpplib and c-lex.c
116
   and the C parser.  Unlike the C++ lexer, the parser structure
117
   stores the lexer information instead of using a separate structure.
118
   Identifiers are separated into ordinary identifiers, type names,
119
   keywords and some other Objective-C types of identifiers, and some
120
   look-ahead is maintained.
121
 
122
   ??? It might be a good idea to lex the whole file up front (as for
123
   C++).  It would then be possible to share more of the C and C++
124
   lexer code, if desired.  */
125
 
126
/* The following local token type is used.  */
127
 
128
/* A keyword.  */
129
#define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
130
 
131
/* More information about the type of a CPP_NAME token.  */
132
typedef enum c_id_kind {
133
  /* An ordinary identifier.  */
134
  C_ID_ID,
135
  /* An identifier declared as a typedef name.  */
136
  C_ID_TYPENAME,
137
  /* An identifier declared as an Objective-C class name.  */
138
  C_ID_CLASSNAME,
139
  /* An address space identifier.  */
140
  C_ID_ADDRSPACE,
141
  /* Not an identifier.  */
142
  C_ID_NONE
143
} c_id_kind;
144
 
145
/* A single C token after string literal concatenation and conversion
146
   of preprocessing tokens to tokens.  */
147
typedef struct GTY (()) c_token {
148
  /* The kind of token.  */
149
  ENUM_BITFIELD (cpp_ttype) type : 8;
150
  /* If this token is a CPP_NAME, this value indicates whether also
151
     declared as some kind of type.  Otherwise, it is C_ID_NONE.  */
152
  ENUM_BITFIELD (c_id_kind) id_kind : 8;
153
  /* If this token is a keyword, this value indicates which keyword.
154
     Otherwise, this value is RID_MAX.  */
155
  ENUM_BITFIELD (rid) keyword : 8;
156
  /* If this token is a CPP_PRAGMA, this indicates the pragma that
157
     was seen.  Otherwise it is PRAGMA_NONE.  */
158
  ENUM_BITFIELD (pragma_kind) pragma_kind : 8;
159
  /* The value associated with this token, if any.  */
160
  tree value;
161
  /* The location at which this token was found.  */
162
  location_t location;
163
} c_token;
164
 
165
/* A parser structure recording information about the state and
166
   context of parsing.  Includes lexer information with up to two
167
   tokens of look-ahead; more are not needed for C.  */
168
typedef struct GTY(()) c_parser {
169
  /* The look-ahead tokens.  */
170
  c_token tokens[2];
171
  /* How many look-ahead tokens are available (0, 1 or 2).  */
172
  short tokens_avail;
173
  /* True if a syntax error is being recovered from; false otherwise.
174
     c_parser_error sets this flag.  It should clear this flag when
175
     enough tokens have been consumed to recover from the error.  */
176
  BOOL_BITFIELD error : 1;
177
  /* True if we're processing a pragma, and shouldn't automatically
178
     consume CPP_PRAGMA_EOL.  */
179
  BOOL_BITFIELD in_pragma : 1;
180
  /* True if we're parsing the outermost block of an if statement.  */
181
  BOOL_BITFIELD in_if_block : 1;
182
  /* True if we want to lex an untranslated string.  */
183
  BOOL_BITFIELD lex_untranslated_string : 1;
184
  /* Objective-C specific parser/lexer information.  */
185
  BOOL_BITFIELD objc_pq_context : 1;
186
  /* The following flag is needed to contextualize Objective-C lexical
187
     analysis.  In some cases (e.g., 'int NSObject;'), it is
188
     undesirable to bind an identifier to an Objective-C class, even
189
     if a class with that name exists.  */
190
  BOOL_BITFIELD objc_need_raw_identifier : 1;
191
} c_parser;
192
 
193
 
194
/* The actual parser and external interface.  ??? Does this need to be
195
   garbage-collected?  */
196
 
197
static GTY (()) c_parser *the_parser;
198
 
199
 
200
/* Read in and lex a single token, storing it in *TOKEN.  */
201
 
202
static void
203
c_lex_one_token (c_parser *parser, c_token *token)
204
{
205
  timevar_push (TV_LEX);
206
 
207
  token->type = c_lex_with_flags (&token->value, &token->location, NULL,
208
                                  (parser->lex_untranslated_string
209
                                   ? C_LEX_STRING_NO_TRANSLATE : 0));
210
  token->id_kind = C_ID_NONE;
211
  token->keyword = RID_MAX;
212
  token->pragma_kind = PRAGMA_NONE;
213
 
214
  switch (token->type)
215
    {
216
    case CPP_NAME:
217
      {
218
        tree decl;
219
 
220
        bool objc_force_identifier = parser->objc_need_raw_identifier;
221
        if (c_dialect_objc ())
222
          parser->objc_need_raw_identifier = false;
223
 
224
        if (C_IS_RESERVED_WORD (token->value))
225
          {
226
            enum rid rid_code = C_RID_CODE (token->value);
227
 
228
            if (rid_code == RID_CXX_COMPAT_WARN)
229
              {
230
                warning_at (token->location,
231
                            OPT_Wc___compat,
232
                            "identifier %qE conflicts with C++ keyword",
233
                            token->value);
234
              }
235
            else if (rid_code >= RID_FIRST_ADDR_SPACE
236
                     && rid_code <= RID_LAST_ADDR_SPACE)
237
              {
238
                token->id_kind = C_ID_ADDRSPACE;
239
                token->keyword = rid_code;
240
                break;
241
              }
242
            else if (c_dialect_objc ())
243
              {
244
                if (!objc_is_reserved_word (token->value)
245
                    && (!OBJC_IS_PQ_KEYWORD (rid_code)
246
                        || parser->objc_pq_context))
247
                  {
248
                    /* Return the canonical spelling for this keyword.  */
249
                    token->value = ridpointers[(int) rid_code];
250
                    token->type = CPP_KEYWORD;
251
                    token->keyword = rid_code;
252
                    break;
253
                  }
254
              }
255
            else
256
              {
257
                token->type = CPP_KEYWORD;
258
                token->keyword = rid_code;
259
                break;
260
              }
261
          }
262
 
263
        decl = lookup_name (token->value);
264
        if (decl)
265
          {
266
            if (TREE_CODE (decl) == TYPE_DECL)
267
              {
268
                token->id_kind = C_ID_TYPENAME;
269
                break;
270
              }
271
          }
272
        else if (c_dialect_objc ())
273
          {
274
            tree objc_interface_decl = objc_is_class_name (token->value);
275
            /* Objective-C class names are in the same namespace as
276
               variables and typedefs, and hence are shadowed by local
277
               declarations.  */
278
            if (objc_interface_decl
279
                && (global_bindings_p ()
280
                    || (!objc_force_identifier && !decl)))
281
              {
282
                token->value = objc_interface_decl;
283
                token->id_kind = C_ID_CLASSNAME;
284
                break;
285
              }
286
          }
287
        token->id_kind = C_ID_ID;
288
      }
289
      break;
290
    case CPP_AT_NAME:
291
      /* This only happens in Objective-C; it must be a keyword.  */
292
      token->type = CPP_KEYWORD;
293
      token->keyword = C_RID_CODE (token->value);
294
      break;
295
    case CPP_COLON:
296
    case CPP_COMMA:
297
    case CPP_CLOSE_PAREN:
298
    case CPP_SEMICOLON:
299
      /* These tokens may affect the interpretation of any identifiers
300
         following, if doing Objective-C.  */
301
      if (c_dialect_objc ())
302
        parser->objc_need_raw_identifier = false;
303
      break;
304
    case CPP_PRAGMA:
305
      /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST.  */
306
      token->pragma_kind = (enum pragma_kind) TREE_INT_CST_LOW (token->value);
307
      token->value = NULL;
308
      break;
309
    default:
310
      break;
311
    }
312
  timevar_pop (TV_LEX);
313
}
314
 
315
/* Return a pointer to the next token from PARSER, reading it in if
316
   necessary.  */
317
 
318
static inline c_token *
319
c_parser_peek_token (c_parser *parser)
320
{
321
  if (parser->tokens_avail == 0)
322
    {
323
      c_lex_one_token (parser, &parser->tokens[0]);
324
      parser->tokens_avail = 1;
325
    }
326
  return &parser->tokens[0];
327
}
328
 
329
/* Return true if the next token from PARSER has the indicated
330
   TYPE.  */
331
 
332
static inline bool
333
c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
334
{
335
  return c_parser_peek_token (parser)->type == type;
336
}
337
 
338
/* Return true if the next token from PARSER does not have the
339
   indicated TYPE.  */
340
 
341
static inline bool
342
c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
343
{
344
  return !c_parser_next_token_is (parser, type);
345
}
346
 
347
/* Return true if the next token from PARSER is the indicated
348
   KEYWORD.  */
349
 
350
static inline bool
351
c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
352
{
353
  return c_parser_peek_token (parser)->keyword == keyword;
354
}
355
 
356
/* Return true if TOKEN can start a type name,
357
   false otherwise.  */
358
static bool
359
c_token_starts_typename (c_token *token)
360
{
361
  switch (token->type)
362
    {
363
    case CPP_NAME:
364
      switch (token->id_kind)
365
        {
366
        case C_ID_ID:
367
          return false;
368
        case C_ID_ADDRSPACE:
369
          return true;
370
        case C_ID_TYPENAME:
371
          return true;
372
        case C_ID_CLASSNAME:
373
          gcc_assert (c_dialect_objc ());
374
          return true;
375
        default:
376
          gcc_unreachable ();
377
        }
378
    case CPP_KEYWORD:
379
      switch (token->keyword)
380
        {
381
        case RID_UNSIGNED:
382
        case RID_LONG:
383
        case RID_SHORT:
384
        case RID_SIGNED:
385
        case RID_COMPLEX:
386
        case RID_INT:
387
        case RID_CHAR:
388
        case RID_FLOAT:
389
        case RID_DOUBLE:
390
        case RID_VOID:
391
        case RID_DFLOAT32:
392
        case RID_DFLOAT64:
393
        case RID_DFLOAT128:
394
        case RID_BOOL:
395
        case RID_ENUM:
396
        case RID_STRUCT:
397
        case RID_UNION:
398
        case RID_TYPEOF:
399
        case RID_CONST:
400
        case RID_VOLATILE:
401
        case RID_RESTRICT:
402
        case RID_ATTRIBUTE:
403
        case RID_FRACT:
404
        case RID_ACCUM:
405
        case RID_SAT:
406
          return true;
407
        default:
408
          return false;
409
        }
410
    case CPP_LESS:
411
      if (c_dialect_objc ())
412
        return true;
413
      return false;
414
    default:
415
      return false;
416
    }
417
}
418
 
419
/* Return true if the next token from PARSER can start a type name,
420
   false otherwise.  */
421
static inline bool
422
c_parser_next_token_starts_typename (c_parser *parser)
423
{
424
  c_token *token = c_parser_peek_token (parser);
425
  return c_token_starts_typename (token);
426
}
427
 
428
/* Return true if TOKEN can start declaration specifiers, false
429
   otherwise.  */
430
static bool
431
c_token_starts_declspecs (c_token *token)
432
{
433
  switch (token->type)
434
    {
435
    case CPP_NAME:
436
      switch (token->id_kind)
437
        {
438
        case C_ID_ID:
439
          return false;
440
        case C_ID_ADDRSPACE:
441
          return true;
442
        case C_ID_TYPENAME:
443
          return true;
444
        case C_ID_CLASSNAME:
445
          gcc_assert (c_dialect_objc ());
446
          return true;
447
        default:
448
          gcc_unreachable ();
449
        }
450
    case CPP_KEYWORD:
451
      switch (token->keyword)
452
        {
453
        case RID_STATIC:
454
        case RID_EXTERN:
455
        case RID_REGISTER:
456
        case RID_TYPEDEF:
457
        case RID_INLINE:
458
        case RID_AUTO:
459
        case RID_THREAD:
460
        case RID_UNSIGNED:
461
        case RID_LONG:
462
        case RID_SHORT:
463
        case RID_SIGNED:
464
        case RID_COMPLEX:
465
        case RID_INT:
466
        case RID_CHAR:
467
        case RID_FLOAT:
468
        case RID_DOUBLE:
469
        case RID_VOID:
470
        case RID_DFLOAT32:
471
        case RID_DFLOAT64:
472
        case RID_DFLOAT128:
473
        case RID_BOOL:
474
        case RID_ENUM:
475
        case RID_STRUCT:
476
        case RID_UNION:
477
        case RID_TYPEOF:
478
        case RID_CONST:
479
        case RID_VOLATILE:
480
        case RID_RESTRICT:
481
        case RID_ATTRIBUTE:
482
        case RID_FRACT:
483
        case RID_ACCUM:
484
        case RID_SAT:
485
          return true;
486
        default:
487
          return false;
488
        }
489
    case CPP_LESS:
490
      if (c_dialect_objc ())
491
        return true;
492
      return false;
493
    default:
494
      return false;
495
    }
496
}
497
 
498
/* Return true if the next token from PARSER can start declaration
499
   specifiers, false otherwise.  */
500
static inline bool
501
c_parser_next_token_starts_declspecs (c_parser *parser)
502
{
503
  c_token *token = c_parser_peek_token (parser);
504
  return c_token_starts_declspecs (token);
505
}
506
 
507
/* Return a pointer to the next-but-one token from PARSER, reading it
508
   in if necessary.  The next token is already read in.  */
509
 
510
static c_token *
511
c_parser_peek_2nd_token (c_parser *parser)
512
{
513
  if (parser->tokens_avail >= 2)
514
    return &parser->tokens[1];
515
  gcc_assert (parser->tokens_avail == 1);
516
  gcc_assert (parser->tokens[0].type != CPP_EOF);
517
  gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
518
  c_lex_one_token (parser, &parser->tokens[1]);
519
  parser->tokens_avail = 2;
520
  return &parser->tokens[1];
521
}
522
 
523
/* Consume the next token from PARSER.  */
524
 
525
static void
526
c_parser_consume_token (c_parser *parser)
527
{
528
  gcc_assert (parser->tokens_avail >= 1);
529
  gcc_assert (parser->tokens[0].type != CPP_EOF);
530
  gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
531
  gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
532
  if (parser->tokens_avail == 2)
533
    parser->tokens[0] = parser->tokens[1];
534
  parser->tokens_avail--;
535
}
536
 
537
/* Expect the current token to be a #pragma.  Consume it and remember
538
   that we've begun parsing a pragma.  */
539
 
540
static void
541
c_parser_consume_pragma (c_parser *parser)
542
{
543
  gcc_assert (!parser->in_pragma);
544
  gcc_assert (parser->tokens_avail >= 1);
545
  gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
546
  if (parser->tokens_avail == 2)
547
    parser->tokens[0] = parser->tokens[1];
548
  parser->tokens_avail--;
549
  parser->in_pragma = true;
550
}
551
 
552
/* Update the globals input_location and in_system_header from
553
   TOKEN.  */
554
static inline void
555
c_parser_set_source_position_from_token (c_token *token)
556
{
557
  if (token->type != CPP_EOF)
558
    {
559
      input_location = token->location;
560
    }
561
}
562
 
563
/* Issue a diagnostic of the form
564
      FILE:LINE: MESSAGE before TOKEN
565
   where TOKEN is the next token in the input stream of PARSER.
566
   MESSAGE (specified by the caller) is usually of the form "expected
567
   OTHER-TOKEN".
568
 
569
   Do not issue a diagnostic if still recovering from an error.
570
 
571
   ??? This is taken from the C++ parser, but building up messages in
572
   this way is not i18n-friendly and some other approach should be
573
   used.  */
574
 
575
static void
576
c_parser_error (c_parser *parser, const char *gmsgid)
577
{
578
  c_token *token = c_parser_peek_token (parser);
579
  if (parser->error)
580
    return;
581
  parser->error = true;
582
  if (!gmsgid)
583
    return;
584
  /* This diagnostic makes more sense if it is tagged to the line of
585
     the token we just peeked at.  */
586
  c_parser_set_source_position_from_token (token);
587
  c_parse_error (gmsgid,
588
                 /* Because c_parse_error does not understand
589
                    CPP_KEYWORD, keywords are treated like
590
                    identifiers.  */
591
                 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
592
                 /* ??? The C parser does not save the cpp flags of a
593
                    token, we need to pass 0 here and we will not get
594
                    the source spelling of some tokens but rather the
595
                    canonical spelling.  */
596
                 token->value, /*flags=*/0);
597
}
598
 
599
/* If the next token is of the indicated TYPE, consume it.  Otherwise,
600
   issue the error MSGID.  If MSGID is NULL then a message has already
601
   been produced and no message will be produced this time.  Returns
602
   true if found, false otherwise.  */
603
 
604
static bool
605
c_parser_require (c_parser *parser,
606
                  enum cpp_ttype type,
607
                  const char *msgid)
608
{
609
  if (c_parser_next_token_is (parser, type))
610
    {
611
      c_parser_consume_token (parser);
612
      return true;
613
    }
614
  else
615
    {
616
      c_parser_error (parser, msgid);
617
      return false;
618
    }
619
}
620
 
621
/* If the next token is the indicated keyword, consume it.  Otherwise,
622
   issue the error MSGID.  Returns true if found, false otherwise.  */
623
 
624
static bool
625
c_parser_require_keyword (c_parser *parser,
626
                          enum rid keyword,
627
                          const char *msgid)
628
{
629
  if (c_parser_next_token_is_keyword (parser, keyword))
630
    {
631
      c_parser_consume_token (parser);
632
      return true;
633
    }
634
  else
635
    {
636
      c_parser_error (parser, msgid);
637
      return false;
638
    }
639
}
640
 
641
/* Like c_parser_require, except that tokens will be skipped until the
642
   desired token is found.  An error message is still produced if the
643
   next token is not as expected.  If MSGID is NULL then a message has
644
   already been produced and no message will be produced this
645
   time.  */
646
 
647
static void
648
c_parser_skip_until_found (c_parser *parser,
649
                           enum cpp_ttype type,
650
                           const char *msgid)
651
{
652
  unsigned nesting_depth = 0;
653
 
654
  if (c_parser_require (parser, type, msgid))
655
    return;
656
 
657
  /* Skip tokens until the desired token is found.  */
658
  while (true)
659
    {
660
      /* Peek at the next token.  */
661
      c_token *token = c_parser_peek_token (parser);
662
      /* If we've reached the token we want, consume it and stop.  */
663
      if (token->type == type && !nesting_depth)
664
        {
665
          c_parser_consume_token (parser);
666
          break;
667
        }
668
 
669
      /* If we've run out of tokens, stop.  */
670
      if (token->type == CPP_EOF)
671
        return;
672
      if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
673
        return;
674
      if (token->type == CPP_OPEN_BRACE
675
          || token->type == CPP_OPEN_PAREN
676
          || token->type == CPP_OPEN_SQUARE)
677
        ++nesting_depth;
678
      else if (token->type == CPP_CLOSE_BRACE
679
               || token->type == CPP_CLOSE_PAREN
680
               || token->type == CPP_CLOSE_SQUARE)
681
        {
682
          if (nesting_depth-- == 0)
683
            break;
684
        }
685
      /* Consume this token.  */
686
      c_parser_consume_token (parser);
687
    }
688
  parser->error = false;
689
}
690
 
691
/* Skip tokens until the end of a parameter is found, but do not
692
   consume the comma, semicolon or closing delimiter.  */
693
 
694
static void
695
c_parser_skip_to_end_of_parameter (c_parser *parser)
696
{
697
  unsigned nesting_depth = 0;
698
 
699
  while (true)
700
    {
701
      c_token *token = c_parser_peek_token (parser);
702
      if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
703
          && !nesting_depth)
704
        break;
705
      /* If we've run out of tokens, stop.  */
706
      if (token->type == CPP_EOF)
707
        return;
708
      if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
709
        return;
710
      if (token->type == CPP_OPEN_BRACE
711
          || token->type == CPP_OPEN_PAREN
712
          || token->type == CPP_OPEN_SQUARE)
713
        ++nesting_depth;
714
      else if (token->type == CPP_CLOSE_BRACE
715
               || token->type == CPP_CLOSE_PAREN
716
               || token->type == CPP_CLOSE_SQUARE)
717
        {
718
          if (nesting_depth-- == 0)
719
            break;
720
        }
721
      /* Consume this token.  */
722
      c_parser_consume_token (parser);
723
    }
724
  parser->error = false;
725
}
726
 
727
/* Expect to be at the end of the pragma directive and consume an
728
   end of line marker.  */
729
 
730
static void
731
c_parser_skip_to_pragma_eol (c_parser *parser)
732
{
733
  gcc_assert (parser->in_pragma);
734
  parser->in_pragma = false;
735
 
736
  if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
737
    while (true)
738
      {
739
        c_token *token = c_parser_peek_token (parser);
740
        if (token->type == CPP_EOF)
741
          break;
742
        if (token->type == CPP_PRAGMA_EOL)
743
          {
744
            c_parser_consume_token (parser);
745
            break;
746
          }
747
        c_parser_consume_token (parser);
748
      }
749
 
750
  parser->error = false;
751
}
752
 
753
/* Skip tokens until we have consumed an entire block, or until we
754
   have consumed a non-nested ';'.  */
755
 
756
static void
757
c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
758
{
759
  unsigned nesting_depth = 0;
760
  bool save_error = parser->error;
761
 
762
  while (true)
763
    {
764
      c_token *token;
765
 
766
      /* Peek at the next token.  */
767
      token = c_parser_peek_token (parser);
768
 
769
      switch (token->type)
770
        {
771
        case CPP_EOF:
772
          return;
773
 
774
        case CPP_PRAGMA_EOL:
775
          if (parser->in_pragma)
776
            return;
777
          break;
778
 
779
        case CPP_SEMICOLON:
780
          /* If the next token is a ';', we have reached the
781
             end of the statement.  */
782
          if (!nesting_depth)
783
            {
784
              /* Consume the ';'.  */
785
              c_parser_consume_token (parser);
786
              goto finished;
787
            }
788
          break;
789
 
790
        case CPP_CLOSE_BRACE:
791
          /* If the next token is a non-nested '}', then we have
792
             reached the end of the current block.  */
793
          if (nesting_depth == 0 || --nesting_depth == 0)
794
            {
795
              c_parser_consume_token (parser);
796
              goto finished;
797
            }
798
          break;
799
 
800
        case CPP_OPEN_BRACE:
801
          /* If it the next token is a '{', then we are entering a new
802
             block.  Consume the entire block.  */
803
          ++nesting_depth;
804
          break;
805
 
806
        case CPP_PRAGMA:
807
          /* If we see a pragma, consume the whole thing at once.  We
808
             have some safeguards against consuming pragmas willy-nilly.
809
             Normally, we'd expect to be here with parser->error set,
810
             which disables these safeguards.  But it's possible to get
811
             here for secondary error recovery, after parser->error has
812
             been cleared.  */
813
          c_parser_consume_pragma (parser);
814
          c_parser_skip_to_pragma_eol (parser);
815
          parser->error = save_error;
816
          continue;
817
 
818
        default:
819
          break;
820
        }
821
 
822
      c_parser_consume_token (parser);
823
    }
824
 
825
 finished:
826
  parser->error = false;
827
}
828
 
829
/* CPP's options (initialized by c-opts.c).  */
830
extern cpp_options *cpp_opts;
831
 
832
/* Save the warning flags which are controlled by __extension__.  */
833
 
834
static inline int
835
disable_extension_diagnostics (void)
836
{
837
  int ret = (pedantic
838
             | (warn_pointer_arith << 1)
839
             | (warn_traditional << 2)
840
             | (flag_iso << 3)
841
             | (warn_long_long << 4)
842
             | (warn_cxx_compat << 5));
843
  cpp_opts->pedantic = pedantic = 0;
844
  warn_pointer_arith = 0;
845
  cpp_opts->warn_traditional = warn_traditional = 0;
846
  flag_iso = 0;
847
  cpp_opts->warn_long_long = warn_long_long = 0;
848
  warn_cxx_compat = 0;
849
  return ret;
850
}
851
 
852
/* Restore the warning flags which are controlled by __extension__.
853
   FLAGS is the return value from disable_extension_diagnostics.  */
854
 
855
static inline void
856
restore_extension_diagnostics (int flags)
857
{
858
  cpp_opts->pedantic = pedantic = flags & 1;
859
  warn_pointer_arith = (flags >> 1) & 1;
860
  cpp_opts->warn_traditional = warn_traditional = (flags >> 2) & 1;
861
  flag_iso = (flags >> 3) & 1;
862
  cpp_opts->warn_long_long = warn_long_long = (flags >> 4) & 1;
863
  warn_cxx_compat = (flags >> 5) & 1;
864
}
865
 
866
/* Possibly kinds of declarator to parse.  */
867
typedef enum c_dtr_syn {
868
  /* A normal declarator with an identifier.  */
869
  C_DTR_NORMAL,
870
  /* An abstract declarator (maybe empty).  */
871
  C_DTR_ABSTRACT,
872
  /* A parameter declarator: may be either, but after a type name does
873
     not redeclare a typedef name as an identifier if it can
874
     alternatively be interpreted as a typedef name; see DR#009,
875
     applied in C90 TC1, omitted from C99 and reapplied in C99 TC2
876
     following DR#249.  For example, given a typedef T, "int T" and
877
     "int *T" are valid parameter declarations redeclaring T, while
878
     "int (T)" and "int * (T)" and "int (T[])" and "int (T (int))" are
879
     abstract declarators rather than involving redundant parentheses;
880
     the same applies with attributes inside the parentheses before
881
     "T".  */
882
  C_DTR_PARM
883
} c_dtr_syn;
884
 
885
static void c_parser_external_declaration (c_parser *);
886
static void c_parser_asm_definition (c_parser *);
887
static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
888
static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
889
                                bool);
890
static struct c_typespec c_parser_enum_specifier (c_parser *);
891
static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
892
static tree c_parser_struct_declaration (c_parser *);
893
static struct c_typespec c_parser_typeof_specifier (c_parser *);
894
static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
895
                                                 bool *);
896
static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
897
                                                        c_dtr_syn, bool *);
898
static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
899
                                                              bool,
900
                                                              struct c_declarator *);
901
static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
902
static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
903
static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
904
static tree c_parser_simple_asm_expr (c_parser *);
905
static tree c_parser_attributes (c_parser *);
906
static struct c_type_name *c_parser_type_name (c_parser *);
907
static struct c_expr c_parser_initializer (c_parser *);
908
static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
909
static void c_parser_initelt (c_parser *);
910
static void c_parser_initval (c_parser *, struct c_expr *);
911
static tree c_parser_compound_statement (c_parser *);
912
static void c_parser_compound_statement_nostart (c_parser *);
913
static void c_parser_label (c_parser *);
914
static void c_parser_statement (c_parser *);
915
static void c_parser_statement_after_labels (c_parser *);
916
static void c_parser_if_statement (c_parser *);
917
static void c_parser_switch_statement (c_parser *);
918
static void c_parser_while_statement (c_parser *);
919
static void c_parser_do_statement (c_parser *);
920
static void c_parser_for_statement (c_parser *);
921
static tree c_parser_asm_statement (c_parser *);
922
static tree c_parser_asm_operands (c_parser *, bool);
923
static tree c_parser_asm_goto_operands (c_parser *);
924
static tree c_parser_asm_clobbers (c_parser *);
925
static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
926
static struct c_expr c_parser_conditional_expression (c_parser *,
927
                                                      struct c_expr *);
928
static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
929
static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
930
static struct c_expr c_parser_unary_expression (c_parser *);
931
static struct c_expr c_parser_sizeof_expression (c_parser *);
932
static struct c_expr c_parser_alignof_expression (c_parser *);
933
static struct c_expr c_parser_postfix_expression (c_parser *);
934
static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
935
                                                                   struct c_type_name *,
936
                                                                   location_t);
937
static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
938
                                                                location_t loc,
939
                                                                struct c_expr);
940
static struct c_expr c_parser_expression (c_parser *);
941
static struct c_expr c_parser_expression_conv (c_parser *);
942
static VEC(tree,gc) *c_parser_expr_list (c_parser *, bool, bool,
943
                                         VEC(tree,gc) **);
944
static void c_parser_omp_construct (c_parser *);
945
static void c_parser_omp_threadprivate (c_parser *);
946
static void c_parser_omp_barrier (c_parser *);
947
static void c_parser_omp_flush (c_parser *);
948
static void c_parser_omp_taskwait (c_parser *);
949
 
950
enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
951
static bool c_parser_pragma (c_parser *, enum pragma_context);
952
 
953
/* These Objective-C parser functions are only ever called when
954
   compiling Objective-C.  */
955
static void c_parser_objc_class_definition (c_parser *);
956
static void c_parser_objc_class_instance_variables (c_parser *);
957
static void c_parser_objc_class_declaration (c_parser *);
958
static void c_parser_objc_alias_declaration (c_parser *);
959
static void c_parser_objc_protocol_definition (c_parser *);
960
static enum tree_code c_parser_objc_method_type (c_parser *);
961
static void c_parser_objc_method_definition (c_parser *);
962
static void c_parser_objc_methodprotolist (c_parser *);
963
static void c_parser_objc_methodproto (c_parser *);
964
static tree c_parser_objc_method_decl (c_parser *);
965
static tree c_parser_objc_type_name (c_parser *);
966
static tree c_parser_objc_protocol_refs (c_parser *);
967
static void c_parser_objc_try_catch_statement (c_parser *);
968
static void c_parser_objc_synchronized_statement (c_parser *);
969
static tree c_parser_objc_selector (c_parser *);
970
static tree c_parser_objc_selector_arg (c_parser *);
971
static tree c_parser_objc_receiver (c_parser *);
972
static tree c_parser_objc_message_args (c_parser *);
973
static tree c_parser_objc_keywordexpr (c_parser *);
974
 
975
/* Parse a translation unit (C90 6.7, C99 6.9).
976
 
977
   translation-unit:
978
     external-declarations
979
 
980
   external-declarations:
981
     external-declaration
982
     external-declarations external-declaration
983
 
984
   GNU extensions:
985
 
986
   translation-unit:
987
     empty
988
*/
989
 
990
static void
991
c_parser_translation_unit (c_parser *parser)
992
{
993
  if (c_parser_next_token_is (parser, CPP_EOF))
994
    {
995
      pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
996
               "ISO C forbids an empty translation unit");
997
    }
998
  else
999
    {
1000
      void *obstack_position = obstack_alloc (&parser_obstack, 0);
1001
      mark_valid_location_for_stdc_pragma (false);
1002
      do
1003
        {
1004
          ggc_collect ();
1005
          c_parser_external_declaration (parser);
1006
          obstack_free (&parser_obstack, obstack_position);
1007
        }
1008
      while (c_parser_next_token_is_not (parser, CPP_EOF));
1009
    }
1010
}
1011
 
1012
/* Parse an external declaration (C90 6.7, C99 6.9).
1013
 
1014
   external-declaration:
1015
     function-definition
1016
     declaration
1017
 
1018
   GNU extensions:
1019
 
1020
   external-declaration:
1021
     asm-definition
1022
     ;
1023
     __extension__ external-declaration
1024
 
1025
   Objective-C:
1026
 
1027
   external-declaration:
1028
     objc-class-definition
1029
     objc-class-declaration
1030
     objc-alias-declaration
1031
     objc-protocol-definition
1032
     objc-method-definition
1033
     @end
1034
*/
1035
 
1036
static void
1037
c_parser_external_declaration (c_parser *parser)
1038
{
1039
  int ext;
1040
  switch (c_parser_peek_token (parser)->type)
1041
    {
1042
    case CPP_KEYWORD:
1043
      switch (c_parser_peek_token (parser)->keyword)
1044
        {
1045
        case RID_EXTENSION:
1046
          ext = disable_extension_diagnostics ();
1047
          c_parser_consume_token (parser);
1048
          c_parser_external_declaration (parser);
1049
          restore_extension_diagnostics (ext);
1050
          break;
1051
        case RID_ASM:
1052
          c_parser_asm_definition (parser);
1053
          break;
1054
        case RID_AT_INTERFACE:
1055
        case RID_AT_IMPLEMENTATION:
1056
          gcc_assert (c_dialect_objc ());
1057
          c_parser_objc_class_definition (parser);
1058
          break;
1059
        case RID_CLASS:
1060
          gcc_assert (c_dialect_objc ());
1061
          c_parser_objc_class_declaration (parser);
1062
          break;
1063
        case RID_AT_ALIAS:
1064
          gcc_assert (c_dialect_objc ());
1065
          c_parser_objc_alias_declaration (parser);
1066
          break;
1067
        case RID_AT_PROTOCOL:
1068
          gcc_assert (c_dialect_objc ());
1069
          c_parser_objc_protocol_definition (parser);
1070
          break;
1071
        case RID_AT_END:
1072
          gcc_assert (c_dialect_objc ());
1073
          c_parser_consume_token (parser);
1074
          objc_finish_implementation ();
1075
          break;
1076
        default:
1077
          goto decl_or_fndef;
1078
        }
1079
      break;
1080
    case CPP_SEMICOLON:
1081
      pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
1082
               "ISO C does not allow extra %<;%> outside of a function");
1083
      c_parser_consume_token (parser);
1084
      break;
1085
    case CPP_PRAGMA:
1086
      mark_valid_location_for_stdc_pragma (true);
1087
      c_parser_pragma (parser, pragma_external);
1088
      mark_valid_location_for_stdc_pragma (false);
1089
      break;
1090
    case CPP_PLUS:
1091
    case CPP_MINUS:
1092
      if (c_dialect_objc ())
1093
        {
1094
          c_parser_objc_method_definition (parser);
1095
          break;
1096
        }
1097
      /* Else fall through, and yield a syntax error trying to parse
1098
         as a declaration or function definition.  */
1099
    default:
1100
    decl_or_fndef:
1101
      /* A declaration or a function definition.  We can only tell
1102
         which after parsing the declaration specifiers, if any, and
1103
         the first declarator.  */
1104
      c_parser_declaration_or_fndef (parser, true, true, false, true);
1105
      break;
1106
    }
1107
}
1108
 
1109
 
1110
/* Parse a declaration or function definition (C90 6.5, 6.7.1, C99
1111
   6.7, 6.9.1).  If FNDEF_OK is true, a function definition is
1112
   accepted; otherwise (old-style parameter declarations) only other
1113
   declarations are accepted.  If NESTED is true, we are inside a
1114
   function or parsing old-style parameter declarations; any functions
1115
   encountered are nested functions and declaration specifiers are
1116
   required; otherwise we are at top level and functions are normal
1117
   functions and declaration specifiers may be optional.  If EMPTY_OK
1118
   is true, empty declarations are OK (subject to all other
1119
   constraints); otherwise (old-style parameter declarations) they are
1120
   diagnosed.  If START_ATTR_OK is true, the declaration specifiers
1121
   may start with attributes; otherwise they may not.
1122
 
1123
   declaration:
1124
     declaration-specifiers init-declarator-list[opt] ;
1125
 
1126
   function-definition:
1127
     declaration-specifiers[opt] declarator declaration-list[opt]
1128
       compound-statement
1129
 
1130
   declaration-list:
1131
     declaration
1132
     declaration-list declaration
1133
 
1134
   init-declarator-list:
1135
     init-declarator
1136
     init-declarator-list , init-declarator
1137
 
1138
   init-declarator:
1139
     declarator simple-asm-expr[opt] attributes[opt]
1140
     declarator simple-asm-expr[opt] attributes[opt] = initializer
1141
 
1142
   GNU extensions:
1143
 
1144
   nested-function-definition:
1145
     declaration-specifiers declarator declaration-list[opt]
1146
       compound-statement
1147
 
1148
   The simple-asm-expr and attributes are GNU extensions.
1149
 
1150
   This function does not handle __extension__; that is handled in its
1151
   callers.  ??? Following the old parser, __extension__ may start
1152
   external declarations, declarations in functions and declarations
1153
   at the start of "for" loops, but not old-style parameter
1154
   declarations.
1155
 
1156
   C99 requires declaration specifiers in a function definition; the
1157
   absence is diagnosed through the diagnosis of implicit int.  In GNU
1158
   C we also allow but diagnose declarations without declaration
1159
   specifiers, but only at top level (elsewhere they conflict with
1160
   other syntax).
1161
 
1162
   OpenMP:
1163
 
1164
   declaration:
1165
     threadprivate-directive  */
1166
 
1167
static void
1168
c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
1169
                               bool nested, bool start_attr_ok)
1170
{
1171
  struct c_declspecs *specs;
1172
  tree prefix_attrs;
1173
  tree all_prefix_attrs;
1174
  bool diagnosed_no_specs = false;
1175
  location_t here = c_parser_peek_token (parser)->location;
1176
 
1177
  specs = build_null_declspecs ();
1178
  c_parser_declspecs (parser, specs, true, true, start_attr_ok);
1179
  if (parser->error)
1180
    {
1181
      c_parser_skip_to_end_of_block_or_statement (parser);
1182
      return;
1183
    }
1184
  if (nested && !specs->declspecs_seen_p)
1185
    {
1186
      c_parser_error (parser, "expected declaration specifiers");
1187
      c_parser_skip_to_end_of_block_or_statement (parser);
1188
      return;
1189
    }
1190
  finish_declspecs (specs);
1191
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1192
    {
1193
      if (empty_ok)
1194
        shadow_tag (specs);
1195
      else
1196
        {
1197
          shadow_tag_warned (specs, 1);
1198
          pedwarn (here, 0, "empty declaration");
1199
        }
1200
      c_parser_consume_token (parser);
1201
      return;
1202
    }
1203
  pending_xref_error ();
1204
  prefix_attrs = specs->attrs;
1205
  all_prefix_attrs = prefix_attrs;
1206
  specs->attrs = NULL_TREE;
1207
  while (true)
1208
    {
1209
      struct c_declarator *declarator;
1210
      bool dummy = false;
1211
      tree fnbody;
1212
      /* Declaring either one or more declarators (in which case we
1213
         should diagnose if there were no declaration specifiers) or a
1214
         function definition (in which case the diagnostic for
1215
         implicit int suffices).  */
1216
      declarator = c_parser_declarator (parser, specs->type_seen_p,
1217
                                        C_DTR_NORMAL, &dummy);
1218
      if (declarator == NULL)
1219
        {
1220
          c_parser_skip_to_end_of_block_or_statement (parser);
1221
          return;
1222
        }
1223
      if (c_parser_next_token_is (parser, CPP_EQ)
1224
          || c_parser_next_token_is (parser, CPP_COMMA)
1225
          || c_parser_next_token_is (parser, CPP_SEMICOLON)
1226
          || c_parser_next_token_is_keyword (parser, RID_ASM)
1227
          || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1228
        {
1229
          tree asm_name = NULL_TREE;
1230
          tree postfix_attrs = NULL_TREE;
1231
          if (!diagnosed_no_specs && !specs->declspecs_seen_p)
1232
            {
1233
              diagnosed_no_specs = true;
1234
              pedwarn (here, 0, "data definition has no type or storage class");
1235
            }
1236
          /* Having seen a data definition, there cannot now be a
1237
             function definition.  */
1238
          fndef_ok = false;
1239
          if (c_parser_next_token_is_keyword (parser, RID_ASM))
1240
            asm_name = c_parser_simple_asm_expr (parser);
1241
          if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1242
            postfix_attrs = c_parser_attributes (parser);
1243
          if (c_parser_next_token_is (parser, CPP_EQ))
1244
            {
1245
              tree d;
1246
              struct c_expr init;
1247
              location_t init_loc;
1248
              c_parser_consume_token (parser);
1249
              /* The declaration of the variable is in effect while
1250
                 its initializer is parsed.  */
1251
              d = start_decl (declarator, specs, true,
1252
                              chainon (postfix_attrs, all_prefix_attrs));
1253
              if (!d)
1254
                d = error_mark_node;
1255
              start_init (d, asm_name, global_bindings_p ());
1256
              init_loc = c_parser_peek_token (parser)->location;
1257
              init = c_parser_initializer (parser);
1258
              finish_init ();
1259
              if (d != error_mark_node)
1260
                {
1261
                  maybe_warn_string_init (TREE_TYPE (d), init);
1262
                  finish_decl (d, init_loc, init.value,
1263
                               init.original_type, asm_name);
1264
                }
1265
            }
1266
          else
1267
            {
1268
              tree d = start_decl (declarator, specs, false,
1269
                                   chainon (postfix_attrs,
1270
                                            all_prefix_attrs));
1271
              if (d)
1272
                finish_decl (d, UNKNOWN_LOCATION, NULL_TREE,
1273
                             NULL_TREE, asm_name);
1274
            }
1275
          if (c_parser_next_token_is (parser, CPP_COMMA))
1276
            {
1277
              c_parser_consume_token (parser);
1278
              if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
1279
                all_prefix_attrs = chainon (c_parser_attributes (parser),
1280
                                            prefix_attrs);
1281
              else
1282
                all_prefix_attrs = prefix_attrs;
1283
              continue;
1284
            }
1285
          else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1286
            {
1287
              c_parser_consume_token (parser);
1288
              return;
1289
            }
1290
          else
1291
            {
1292
              c_parser_error (parser, "expected %<,%> or %<;%>");
1293
              c_parser_skip_to_end_of_block_or_statement (parser);
1294
              return;
1295
            }
1296
        }
1297
      else if (!fndef_ok)
1298
        {
1299
          c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
1300
                          "%<asm%> or %<__attribute__%>");
1301
          c_parser_skip_to_end_of_block_or_statement (parser);
1302
          return;
1303
        }
1304
      /* Function definition (nested or otherwise).  */
1305
      if (nested)
1306
        {
1307
          pedwarn (here, OPT_pedantic, "ISO C forbids nested functions");
1308
          c_push_function_context ();
1309
        }
1310
      if (!start_function (specs, declarator, all_prefix_attrs))
1311
        {
1312
          /* This can appear in many cases looking nothing like a
1313
             function definition, so we don't give a more specific
1314
             error suggesting there was one.  */
1315
          c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
1316
                          "or %<__attribute__%>");
1317
          if (nested)
1318
            c_pop_function_context ();
1319
          break;
1320
        }
1321
      /* Parse old-style parameter declarations.  ??? Attributes are
1322
         not allowed to start declaration specifiers here because of a
1323
         syntax conflict between a function declaration with attribute
1324
         suffix and a function definition with an attribute prefix on
1325
         first old-style parameter declaration.  Following the old
1326
         parser, they are not accepted on subsequent old-style
1327
         parameter declarations either.  However, there is no
1328
         ambiguity after the first declaration, nor indeed on the
1329
         first as long as we don't allow postfix attributes after a
1330
         declarator with a nonempty identifier list in a definition;
1331
         and postfix attributes have never been accepted here in
1332
         function definitions either.  */
1333
      while (c_parser_next_token_is_not (parser, CPP_EOF)
1334
             && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
1335
        c_parser_declaration_or_fndef (parser, false, false, true, false);
1336
      store_parm_decls ();
1337
      DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus
1338
        = c_parser_peek_token (parser)->location;
1339
      fnbody = c_parser_compound_statement (parser);
1340
      if (nested)
1341
        {
1342
          tree decl = current_function_decl;
1343
          /* Mark nested functions as needing static-chain initially.
1344
             lower_nested_functions will recompute it but the
1345
             DECL_STATIC_CHAIN flag is also used before that happens,
1346
             by initializer_constant_valid_p.  See gcc.dg/nested-fn-2.c.  */
1347
          DECL_STATIC_CHAIN (decl) = 1;
1348
          add_stmt (fnbody);
1349
          finish_function ();
1350
          c_pop_function_context ();
1351
          add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl));
1352
        }
1353
      else
1354
        {
1355
          add_stmt (fnbody);
1356
          finish_function ();
1357
        }
1358
      break;
1359
    }
1360
}
1361
 
1362
/* Parse an asm-definition (asm() outside a function body).  This is a
1363
   GNU extension.
1364
 
1365
   asm-definition:
1366
     simple-asm-expr ;
1367
*/
1368
 
1369
static void
1370
c_parser_asm_definition (c_parser *parser)
1371
{
1372
  tree asm_str = c_parser_simple_asm_expr (parser);
1373
  if (asm_str)
1374
    cgraph_add_asm_node (asm_str);
1375
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
1376
}
1377
 
1378
/* Parse some declaration specifiers (possibly none) (C90 6.5, C99
1379
   6.7), adding them to SPECS (which may already include some).
1380
   Storage class specifiers are accepted iff SCSPEC_OK; type
1381
   specifiers are accepted iff TYPESPEC_OK; attributes are accepted at
1382
   the start iff START_ATTR_OK.
1383
 
1384
   declaration-specifiers:
1385
     storage-class-specifier declaration-specifiers[opt]
1386
     type-specifier declaration-specifiers[opt]
1387
     type-qualifier declaration-specifiers[opt]
1388
     function-specifier declaration-specifiers[opt]
1389
 
1390
   Function specifiers (inline) are from C99, and are currently
1391
   handled as storage class specifiers, as is __thread.
1392
 
1393
   C90 6.5.1, C99 6.7.1:
1394
   storage-class-specifier:
1395
     typedef
1396
     extern
1397
     static
1398
     auto
1399
     register
1400
 
1401
   C99 6.7.4:
1402
   function-specifier:
1403
     inline
1404
 
1405
   C90 6.5.2, C99 6.7.2:
1406
   type-specifier:
1407
     void
1408
     char
1409
     short
1410
     int
1411
     long
1412
     float
1413
     double
1414
     signed
1415
     unsigned
1416
     _Bool
1417
     _Complex
1418
     [_Imaginary removed in C99 TC2]
1419
     struct-or-union-specifier
1420
     enum-specifier
1421
     typedef-name
1422
 
1423
   (_Bool and _Complex are new in C99.)
1424
 
1425
   C90 6.5.3, C99 6.7.3:
1426
 
1427
   type-qualifier:
1428
     const
1429
     restrict
1430
     volatile
1431
     address-space-qualifier
1432
 
1433
   (restrict is new in C99.)
1434
 
1435
   GNU extensions:
1436
 
1437
   declaration-specifiers:
1438
     attributes declaration-specifiers[opt]
1439
 
1440
   type-qualifier:
1441
     address-space
1442
 
1443
   address-space:
1444
     identifier recognized by the target
1445
 
1446
   storage-class-specifier:
1447
     __thread
1448
 
1449
   type-specifier:
1450
     typeof-specifier
1451
     _Decimal32
1452
     _Decimal64
1453
     _Decimal128
1454
     _Fract
1455
     _Accum
1456
     _Sat
1457
 
1458
  (_Fract, _Accum, and _Sat are new from ISO/IEC DTR 18037:
1459
   http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1169.pdf)
1460
 
1461
   Objective-C:
1462
 
1463
   type-specifier:
1464
     class-name objc-protocol-refs[opt]
1465
     typedef-name objc-protocol-refs
1466
     objc-protocol-refs
1467
*/
1468
 
1469
static void
1470
c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
1471
                    bool scspec_ok, bool typespec_ok, bool start_attr_ok)
1472
{
1473
  bool attrs_ok = start_attr_ok;
1474
  bool seen_type = specs->type_seen_p;
1475
  while (c_parser_next_token_is (parser, CPP_NAME)
1476
         || c_parser_next_token_is (parser, CPP_KEYWORD)
1477
         || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
1478
    {
1479
      struct c_typespec t;
1480
      tree attrs;
1481
      location_t loc = c_parser_peek_token (parser)->location;
1482
      if (c_parser_next_token_is (parser, CPP_NAME))
1483
        {
1484
          tree value = c_parser_peek_token (parser)->value;
1485
          c_id_kind kind = c_parser_peek_token (parser)->id_kind;
1486
 
1487
          if (kind == C_ID_ADDRSPACE)
1488
            {
1489
              addr_space_t as
1490
                = c_parser_peek_token (parser)->keyword - RID_FIRST_ADDR_SPACE;
1491
              declspecs_add_addrspace (specs, as);
1492
              c_parser_consume_token (parser);
1493
              attrs_ok = true;
1494
              continue;
1495
            }
1496
 
1497
          /* This finishes the specifiers unless a type name is OK, it
1498
             is declared as a type name and a type name hasn't yet
1499
             been seen.  */
1500
          if (!typespec_ok || seen_type
1501
              || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
1502
            break;
1503
          c_parser_consume_token (parser);
1504
          seen_type = true;
1505
          attrs_ok = true;
1506
          if (kind == C_ID_TYPENAME
1507
              && (!c_dialect_objc ()
1508
                  || c_parser_next_token_is_not (parser, CPP_LESS)))
1509
            {
1510
              t.kind = ctsk_typedef;
1511
              /* For a typedef name, record the meaning, not the name.
1512
                 In case of 'foo foo, bar;'.  */
1513
              t.spec = lookup_name (value);
1514
              t.expr = NULL_TREE;
1515
              t.expr_const_operands = true;
1516
            }
1517
          else
1518
            {
1519
              tree proto = NULL_TREE;
1520
              gcc_assert (c_dialect_objc ());
1521
              t.kind = ctsk_objc;
1522
              if (c_parser_next_token_is (parser, CPP_LESS))
1523
                proto = c_parser_objc_protocol_refs (parser);
1524
              t.spec = objc_get_protocol_qualified_type (value, proto);
1525
              t.expr = NULL_TREE;
1526
              t.expr_const_operands = true;
1527
            }
1528
          declspecs_add_type (loc, specs, t);
1529
          continue;
1530
        }
1531
      if (c_parser_next_token_is (parser, CPP_LESS))
1532
        {
1533
          /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" -
1534
             nisse@lysator.liu.se.  */
1535
          tree proto;
1536
          gcc_assert (c_dialect_objc ());
1537
          if (!typespec_ok || seen_type)
1538
            break;
1539
          proto = c_parser_objc_protocol_refs (parser);
1540
          t.kind = ctsk_objc;
1541
          t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
1542
          t.expr = NULL_TREE;
1543
          t.expr_const_operands = true;
1544
          declspecs_add_type (loc, specs, t);
1545
          continue;
1546
        }
1547
      gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
1548
      switch (c_parser_peek_token (parser)->keyword)
1549
        {
1550
        case RID_STATIC:
1551
        case RID_EXTERN:
1552
        case RID_REGISTER:
1553
        case RID_TYPEDEF:
1554
        case RID_INLINE:
1555
        case RID_AUTO:
1556
        case RID_THREAD:
1557
          if (!scspec_ok)
1558
            goto out;
1559
          attrs_ok = true;
1560
          /* TODO: Distinguish between function specifiers (inline)
1561
             and storage class specifiers, either here or in
1562
             declspecs_add_scspec.  */
1563
          declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
1564
          c_parser_consume_token (parser);
1565
          break;
1566
        case RID_UNSIGNED:
1567
        case RID_LONG:
1568
        case RID_SHORT:
1569
        case RID_SIGNED:
1570
        case RID_COMPLEX:
1571
        case RID_INT:
1572
        case RID_CHAR:
1573
        case RID_FLOAT:
1574
        case RID_DOUBLE:
1575
        case RID_VOID:
1576
        case RID_DFLOAT32:
1577
        case RID_DFLOAT64:
1578
        case RID_DFLOAT128:
1579
        case RID_BOOL:
1580
        case RID_FRACT:
1581
        case RID_ACCUM:
1582
        case RID_SAT:
1583
          if (!typespec_ok)
1584
            goto out;
1585
          attrs_ok = true;
1586
          seen_type = true;
1587
          if (c_dialect_objc ())
1588
            parser->objc_need_raw_identifier = true;
1589
          t.kind = ctsk_resword;
1590
          t.spec = c_parser_peek_token (parser)->value;
1591
          t.expr = NULL_TREE;
1592
          t.expr_const_operands = true;
1593
          declspecs_add_type (loc, specs, t);
1594
          c_parser_consume_token (parser);
1595
          break;
1596
        case RID_ENUM:
1597
          if (!typespec_ok)
1598
            goto out;
1599
          attrs_ok = true;
1600
          seen_type = true;
1601
          t = c_parser_enum_specifier (parser);
1602
          declspecs_add_type (loc, specs, t);
1603
          break;
1604
        case RID_STRUCT:
1605
        case RID_UNION:
1606
          if (!typespec_ok)
1607
            goto out;
1608
          attrs_ok = true;
1609
          seen_type = true;
1610
          t = c_parser_struct_or_union_specifier (parser);
1611
          invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, t.spec);
1612
          declspecs_add_type (loc, specs, t);
1613
          break;
1614
        case RID_TYPEOF:
1615
          /* ??? The old parser rejected typeof after other type
1616
             specifiers, but is a syntax error the best way of
1617
             handling this?  */
1618
          if (!typespec_ok || seen_type)
1619
            goto out;
1620
          attrs_ok = true;
1621
          seen_type = true;
1622
          t = c_parser_typeof_specifier (parser);
1623
          declspecs_add_type (loc, specs, t);
1624
          break;
1625
        case RID_CONST:
1626
        case RID_VOLATILE:
1627
        case RID_RESTRICT:
1628
          attrs_ok = true;
1629
          declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
1630
          c_parser_consume_token (parser);
1631
          break;
1632
        case RID_ATTRIBUTE:
1633
          if (!attrs_ok)
1634
            goto out;
1635
          attrs = c_parser_attributes (parser);
1636
          declspecs_add_attrs (specs, attrs);
1637
          break;
1638
        default:
1639
          goto out;
1640
        }
1641
    }
1642
 out: ;
1643
}
1644
 
1645
/* Parse an enum specifier (C90 6.5.2.2, C99 6.7.2.2).
1646
 
1647
   enum-specifier:
1648
     enum attributes[opt] identifier[opt] { enumerator-list } attributes[opt]
1649
     enum attributes[opt] identifier[opt] { enumerator-list , } attributes[opt]
1650
     enum attributes[opt] identifier
1651
 
1652
   The form with trailing comma is new in C99.  The forms with
1653
   attributes are GNU extensions.  In GNU C, we accept any expression
1654
   without commas in the syntax (assignment expressions, not just
1655
   conditional expressions); assignment expressions will be diagnosed
1656
   as non-constant.
1657
 
1658
   enumerator-list:
1659
     enumerator
1660
     enumerator-list , enumerator
1661
 
1662
   enumerator:
1663
     enumeration-constant
1664
     enumeration-constant = constant-expression
1665
*/
1666
 
1667
static struct c_typespec
1668
c_parser_enum_specifier (c_parser *parser)
1669
{
1670
  struct c_typespec ret;
1671
  tree attrs;
1672
  tree ident = NULL_TREE;
1673
  location_t enum_loc;
1674
  location_t ident_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
1675
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
1676
  enum_loc = c_parser_peek_token (parser)->location;
1677
  c_parser_consume_token (parser);
1678
  attrs = c_parser_attributes (parser);
1679
  enum_loc = c_parser_peek_token (parser)->location;
1680
  /* Set the location in case we create a decl now.  */
1681
  c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1682
  if (c_parser_next_token_is (parser, CPP_NAME))
1683
    {
1684
      ident = c_parser_peek_token (parser)->value;
1685
      ident_loc = c_parser_peek_token (parser)->location;
1686
      enum_loc = ident_loc;
1687
      c_parser_consume_token (parser);
1688
    }
1689
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1690
    {
1691
      /* Parse an enum definition.  */
1692
      struct c_enum_contents the_enum;
1693
      tree type = start_enum (enum_loc, &the_enum, ident);
1694
      tree postfix_attrs;
1695
      /* We chain the enumerators in reverse order, then put them in
1696
         forward order at the end.  */
1697
      tree values = NULL_TREE;
1698
      c_parser_consume_token (parser);
1699
      while (true)
1700
        {
1701
          tree enum_id;
1702
          tree enum_value;
1703
          tree enum_decl;
1704
          bool seen_comma;
1705
          c_token *token;
1706
          location_t comma_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
1707
          location_t value_loc;
1708
          if (c_parser_next_token_is_not (parser, CPP_NAME))
1709
            {
1710
              c_parser_error (parser, "expected identifier");
1711
              c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1712
              values = error_mark_node;
1713
              break;
1714
            }
1715
          token = c_parser_peek_token (parser);
1716
          enum_id = token->value;
1717
          /* Set the location in case we create a decl now.  */
1718
          c_parser_set_source_position_from_token (token);
1719
          value_loc = token->location;
1720
          c_parser_consume_token (parser);
1721
          if (c_parser_next_token_is (parser, CPP_EQ))
1722
            {
1723
              c_parser_consume_token (parser);
1724
              value_loc = c_parser_peek_token (parser)->location;
1725
              enum_value = c_parser_expr_no_commas (parser, NULL).value;
1726
            }
1727
          else
1728
            enum_value = NULL_TREE;
1729
          enum_decl = build_enumerator (value_loc,
1730
                                        &the_enum, enum_id, enum_value);
1731
          TREE_CHAIN (enum_decl) = values;
1732
          values = enum_decl;
1733
          seen_comma = false;
1734
          if (c_parser_next_token_is (parser, CPP_COMMA))
1735
            {
1736
              comma_loc = c_parser_peek_token (parser)->location;
1737
              seen_comma = true;
1738
              c_parser_consume_token (parser);
1739
            }
1740
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1741
            {
1742
              if (seen_comma && !flag_isoc99)
1743
                pedwarn (comma_loc, OPT_pedantic, "comma at end of enumerator list");
1744
              c_parser_consume_token (parser);
1745
              break;
1746
            }
1747
          if (!seen_comma)
1748
            {
1749
              c_parser_error (parser, "expected %<,%> or %<}%>");
1750
              c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1751
              values = error_mark_node;
1752
              break;
1753
            }
1754
        }
1755
      postfix_attrs = c_parser_attributes (parser);
1756
      ret.spec = finish_enum (type, nreverse (values),
1757
                              chainon (attrs, postfix_attrs));
1758
      ret.kind = ctsk_tagdef;
1759
      ret.expr = NULL_TREE;
1760
      ret.expr_const_operands = true;
1761
      return ret;
1762
    }
1763
  else if (!ident)
1764
    {
1765
      c_parser_error (parser, "expected %<{%>");
1766
      ret.spec = error_mark_node;
1767
      ret.kind = ctsk_tagref;
1768
      ret.expr = NULL_TREE;
1769
      ret.expr_const_operands = true;
1770
      return ret;
1771
    }
1772
  ret = parser_xref_tag (ident_loc, ENUMERAL_TYPE, ident);
1773
  /* In ISO C, enumerated types can be referred to only if already
1774
     defined.  */
1775
  if (pedantic && !COMPLETE_TYPE_P (ret.spec))
1776
    {
1777
      gcc_assert (ident);
1778
      pedwarn (enum_loc, OPT_pedantic,
1779
               "ISO C forbids forward references to %<enum%> types");
1780
    }
1781
  return ret;
1782
}
1783
 
1784
/* Parse a struct or union specifier (C90 6.5.2.1, C99 6.7.2.1).
1785
 
1786
   struct-or-union-specifier:
1787
     struct-or-union attributes[opt] identifier[opt]
1788
       { struct-contents } attributes[opt]
1789
     struct-or-union attributes[opt] identifier
1790
 
1791
   struct-contents:
1792
     struct-declaration-list
1793
 
1794
   struct-declaration-list:
1795
     struct-declaration ;
1796
     struct-declaration-list struct-declaration ;
1797
 
1798
   GNU extensions:
1799
 
1800
   struct-contents:
1801
     empty
1802
     struct-declaration
1803
     struct-declaration-list struct-declaration
1804
 
1805
   struct-declaration-list:
1806
     struct-declaration-list ;
1807
     ;
1808
 
1809
   (Note that in the syntax here, unlike that in ISO C, the semicolons
1810
   are included here rather than in struct-declaration, in order to
1811
   describe the syntax with extra semicolons and missing semicolon at
1812
   end.)
1813
 
1814
   Objective-C:
1815
 
1816
   struct-declaration-list:
1817
     @defs ( class-name )
1818
 
1819
   (Note this does not include a trailing semicolon, but can be
1820
   followed by further declarations, and gets a pedwarn-if-pedantic
1821
   when followed by a semicolon.)  */
1822
 
1823
static struct c_typespec
1824
c_parser_struct_or_union_specifier (c_parser *parser)
1825
{
1826
  struct c_typespec ret;
1827
  tree attrs;
1828
  tree ident = NULL_TREE;
1829
  location_t struct_loc;
1830
  location_t ident_loc = UNKNOWN_LOCATION;
1831
  enum tree_code code;
1832
  switch (c_parser_peek_token (parser)->keyword)
1833
    {
1834
    case RID_STRUCT:
1835
      code = RECORD_TYPE;
1836
      break;
1837
    case RID_UNION:
1838
      code = UNION_TYPE;
1839
      break;
1840
    default:
1841
      gcc_unreachable ();
1842
    }
1843
  struct_loc = c_parser_peek_token (parser)->location;
1844
  c_parser_consume_token (parser);
1845
  attrs = c_parser_attributes (parser);
1846
 
1847
  /* Set the location in case we create a decl now.  */
1848
  c_parser_set_source_position_from_token (c_parser_peek_token (parser));
1849
 
1850
  if (c_parser_next_token_is (parser, CPP_NAME))
1851
    {
1852
      ident = c_parser_peek_token (parser)->value;
1853
      ident_loc = c_parser_peek_token (parser)->location;
1854
      struct_loc = ident_loc;
1855
      c_parser_consume_token (parser);
1856
    }
1857
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
1858
    {
1859
      /* Parse a struct or union definition.  Start the scope of the
1860
         tag before parsing components.  */
1861
      struct c_struct_parse_info *struct_info;
1862
      tree type = start_struct (struct_loc, code, ident, &struct_info);
1863
      tree postfix_attrs;
1864
      /* We chain the components in reverse order, then put them in
1865
         forward order at the end.  Each struct-declaration may
1866
         declare multiple components (comma-separated), so we must use
1867
         chainon to join them, although when parsing each
1868
         struct-declaration we can use TREE_CHAIN directly.
1869
 
1870
         The theory behind all this is that there will be more
1871
         semicolon separated fields than comma separated fields, and
1872
         so we'll be minimizing the number of node traversals required
1873
         by chainon.  */
1874
      tree contents = NULL_TREE;
1875
      c_parser_consume_token (parser);
1876
      /* Handle the Objective-C @defs construct,
1877
         e.g. foo(sizeof(struct{ @defs(ClassName) }));.  */
1878
      if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
1879
        {
1880
          tree name;
1881
          gcc_assert (c_dialect_objc ());
1882
          c_parser_consume_token (parser);
1883
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
1884
            goto end_at_defs;
1885
          if (c_parser_next_token_is (parser, CPP_NAME)
1886
              && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
1887
            {
1888
              name = c_parser_peek_token (parser)->value;
1889
              c_parser_consume_token (parser);
1890
            }
1891
          else
1892
            {
1893
              c_parser_error (parser, "expected class name");
1894
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
1895
              goto end_at_defs;
1896
            }
1897
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
1898
                                     "expected %<)%>");
1899
          contents = nreverse (objc_get_class_ivars (name));
1900
        }
1901
    end_at_defs:
1902
      /* Parse the struct-declarations and semicolons.  Problems with
1903
         semicolons are diagnosed here; empty structures are diagnosed
1904
         elsewhere.  */
1905
      while (true)
1906
        {
1907
          tree decls;
1908
          /* Parse any stray semicolon.  */
1909
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1910
            {
1911
              pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
1912
                       "extra semicolon in struct or union specified");
1913
              c_parser_consume_token (parser);
1914
              continue;
1915
            }
1916
          /* Stop if at the end of the struct or union contents.  */
1917
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1918
            {
1919
              c_parser_consume_token (parser);
1920
              break;
1921
            }
1922
          /* Accept #pragmas at struct scope.  */
1923
          if (c_parser_next_token_is (parser, CPP_PRAGMA))
1924
            {
1925
              c_parser_pragma (parser, pragma_external);
1926
              continue;
1927
            }
1928
          /* Parse some comma-separated declarations, but not the
1929
             trailing semicolon if any.  */
1930
          decls = c_parser_struct_declaration (parser);
1931
          contents = chainon (decls, contents);
1932
          /* If no semicolon follows, either we have a parse error or
1933
             are at the end of the struct or union and should
1934
             pedwarn.  */
1935
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
1936
            c_parser_consume_token (parser);
1937
          else
1938
            {
1939
              if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
1940
                pedwarn (c_parser_peek_token (parser)->location, 0,
1941
                         "no semicolon at end of struct or union");
1942
              else
1943
                {
1944
                  c_parser_error (parser, "expected %<;%>");
1945
                  c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
1946
                  break;
1947
                }
1948
            }
1949
        }
1950
      postfix_attrs = c_parser_attributes (parser);
1951
      ret.spec = finish_struct (struct_loc, type, nreverse (contents),
1952
                                chainon (attrs, postfix_attrs), struct_info);
1953
      ret.kind = ctsk_tagdef;
1954
      ret.expr = NULL_TREE;
1955
      ret.expr_const_operands = true;
1956
      return ret;
1957
    }
1958
  else if (!ident)
1959
    {
1960
      c_parser_error (parser, "expected %<{%>");
1961
      ret.spec = error_mark_node;
1962
      ret.kind = ctsk_tagref;
1963
      ret.expr = NULL_TREE;
1964
      ret.expr_const_operands = true;
1965
      return ret;
1966
    }
1967
  ret = parser_xref_tag (ident_loc, code, ident);
1968
  return ret;
1969
}
1970
 
1971
/* Parse a struct-declaration (C90 6.5.2.1, C99 6.7.2.1), *without*
1972
   the trailing semicolon.
1973
 
1974
   struct-declaration:
1975
     specifier-qualifier-list struct-declarator-list
1976
 
1977
   specifier-qualifier-list:
1978
     type-specifier specifier-qualifier-list[opt]
1979
     type-qualifier specifier-qualifier-list[opt]
1980
     attributes specifier-qualifier-list[opt]
1981
 
1982
   struct-declarator-list:
1983
     struct-declarator
1984
     struct-declarator-list , attributes[opt] struct-declarator
1985
 
1986
   struct-declarator:
1987
     declarator attributes[opt]
1988
     declarator[opt] : constant-expression attributes[opt]
1989
 
1990
   GNU extensions:
1991
 
1992
   struct-declaration:
1993
     __extension__ struct-declaration
1994
     specifier-qualifier-list
1995
 
1996
   Unlike the ISO C syntax, semicolons are handled elsewhere.  The use
1997
   of attributes where shown is a GNU extension.  In GNU C, we accept
1998
   any expression without commas in the syntax (assignment
1999
   expressions, not just conditional expressions); assignment
2000
   expressions will be diagnosed as non-constant.  */
2001
 
2002
static tree
2003
c_parser_struct_declaration (c_parser *parser)
2004
{
2005
  struct c_declspecs *specs;
2006
  tree prefix_attrs;
2007
  tree all_prefix_attrs;
2008
  tree decls;
2009
  location_t decl_loc;
2010
  if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
2011
    {
2012
      int ext;
2013
      tree decl;
2014
      ext = disable_extension_diagnostics ();
2015
      c_parser_consume_token (parser);
2016
      decl = c_parser_struct_declaration (parser);
2017
      restore_extension_diagnostics (ext);
2018
      return decl;
2019
    }
2020
  specs = build_null_declspecs ();
2021
  decl_loc = c_parser_peek_token (parser)->location;
2022
  c_parser_declspecs (parser, specs, false, true, true);
2023
  if (parser->error)
2024
    return NULL_TREE;
2025
  if (!specs->declspecs_seen_p)
2026
    {
2027
      c_parser_error (parser, "expected specifier-qualifier-list");
2028
      return NULL_TREE;
2029
    }
2030
  finish_declspecs (specs);
2031
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2032
    {
2033
      tree ret;
2034
      if (!specs->type_seen_p)
2035
        {
2036
          pedwarn (decl_loc, OPT_pedantic,
2037
                   "ISO C forbids member declarations with no members");
2038
          shadow_tag_warned (specs, pedantic);
2039
          ret = NULL_TREE;
2040
        }
2041
      else
2042
        {
2043
          /* Support for unnamed structs or unions as members of
2044
             structs or unions (which is [a] useful and [b] supports
2045
             MS P-SDK).  */
2046
          tree attrs = NULL;
2047
 
2048
          ret = grokfield (c_parser_peek_token (parser)->location,
2049
                           build_id_declarator (NULL_TREE), specs,
2050
                           NULL_TREE, &attrs);
2051
          if (ret)
2052
            decl_attributes (&ret, attrs, 0);
2053
        }
2054
      return ret;
2055
    }
2056
  pending_xref_error ();
2057
  prefix_attrs = specs->attrs;
2058
  all_prefix_attrs = prefix_attrs;
2059
  specs->attrs = NULL_TREE;
2060
  decls = NULL_TREE;
2061
  while (true)
2062
    {
2063
      /* Declaring one or more declarators or un-named bit-fields.  */
2064
      struct c_declarator *declarator;
2065
      bool dummy = false;
2066
      if (c_parser_next_token_is (parser, CPP_COLON))
2067
        declarator = build_id_declarator (NULL_TREE);
2068
      else
2069
        declarator = c_parser_declarator (parser, specs->type_seen_p,
2070
                                          C_DTR_NORMAL, &dummy);
2071
      if (declarator == NULL)
2072
        {
2073
          c_parser_skip_to_end_of_block_or_statement (parser);
2074
          break;
2075
        }
2076
      if (c_parser_next_token_is (parser, CPP_COLON)
2077
          || c_parser_next_token_is (parser, CPP_COMMA)
2078
          || c_parser_next_token_is (parser, CPP_SEMICOLON)
2079
          || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
2080
          || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2081
        {
2082
          tree postfix_attrs = NULL_TREE;
2083
          tree width = NULL_TREE;
2084
          tree d;
2085
          if (c_parser_next_token_is (parser, CPP_COLON))
2086
            {
2087
              c_parser_consume_token (parser);
2088
              width = c_parser_expr_no_commas (parser, NULL).value;
2089
            }
2090
          if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2091
            postfix_attrs = c_parser_attributes (parser);
2092
          d = grokfield (c_parser_peek_token (parser)->location,
2093
                         declarator, specs, width, &all_prefix_attrs);
2094
          decl_attributes (&d, chainon (postfix_attrs,
2095
                                        all_prefix_attrs), 0);
2096
          TREE_CHAIN (d) = decls;
2097
          decls = d;
2098
          if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2099
            all_prefix_attrs = chainon (c_parser_attributes (parser),
2100
                                        prefix_attrs);
2101
          else
2102
            all_prefix_attrs = prefix_attrs;
2103
          if (c_parser_next_token_is (parser, CPP_COMMA))
2104
            c_parser_consume_token (parser);
2105
          else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
2106
                   || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
2107
            {
2108
              /* Semicolon consumed in caller.  */
2109
              break;
2110
            }
2111
          else
2112
            {
2113
              c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
2114
              break;
2115
            }
2116
        }
2117
      else
2118
        {
2119
          c_parser_error (parser,
2120
                          "expected %<:%>, %<,%>, %<;%>, %<}%> or "
2121
                          "%<__attribute__%>");
2122
          break;
2123
        }
2124
    }
2125
  return decls;
2126
}
2127
 
2128
/* Parse a typeof specifier (a GNU extension).
2129
 
2130
   typeof-specifier:
2131
     typeof ( expression )
2132
     typeof ( type-name )
2133
*/
2134
 
2135
static struct c_typespec
2136
c_parser_typeof_specifier (c_parser *parser)
2137
{
2138
  struct c_typespec ret;
2139
  ret.kind = ctsk_typeof;
2140
  ret.spec = error_mark_node;
2141
  ret.expr = NULL_TREE;
2142
  ret.expr_const_operands = true;
2143
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
2144
  c_parser_consume_token (parser);
2145
  c_inhibit_evaluation_warnings++;
2146
  in_typeof++;
2147
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2148
    {
2149
      c_inhibit_evaluation_warnings--;
2150
      in_typeof--;
2151
      return ret;
2152
    }
2153
  if (c_parser_next_token_starts_typename (parser))
2154
    {
2155
      struct c_type_name *type = c_parser_type_name (parser);
2156
      c_inhibit_evaluation_warnings--;
2157
      in_typeof--;
2158
      if (type != NULL)
2159
        {
2160
          ret.spec = groktypename (type, &ret.expr, &ret.expr_const_operands);
2161
          pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
2162
        }
2163
    }
2164
  else
2165
    {
2166
      bool was_vm;
2167
      location_t here = c_parser_peek_token (parser)->location;
2168
      struct c_expr expr = c_parser_expression (parser);
2169
      c_inhibit_evaluation_warnings--;
2170
      in_typeof--;
2171
      if (TREE_CODE (expr.value) == COMPONENT_REF
2172
          && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
2173
        error_at (here, "%<typeof%> applied to a bit-field");
2174
      ret.spec = TREE_TYPE (expr.value);
2175
      was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
2176
      /* This is returned with the type so that when the type is
2177
         evaluated, this can be evaluated.  */
2178
      if (was_vm)
2179
        ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands);
2180
      pop_maybe_used (was_vm);
2181
    }
2182
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
2183
  return ret;
2184
}
2185
 
2186
/* Parse a declarator, possibly an abstract declarator (C90 6.5.4,
2187
   6.5.5, C99 6.7.5, 6.7.6).  If TYPE_SEEN_P then a typedef name may
2188
   be redeclared; otherwise it may not.  KIND indicates which kind of
2189
   declarator is wanted.  Returns a valid declarator except in the
2190
   case of a syntax error in which case NULL is returned.  *SEEN_ID is
2191
   set to true if an identifier being declared is seen; this is used
2192
   to diagnose bad forms of abstract array declarators and to
2193
   determine whether an identifier list is syntactically permitted.
2194
 
2195
   declarator:
2196
     pointer[opt] direct-declarator
2197
 
2198
   direct-declarator:
2199
     identifier
2200
     ( attributes[opt] declarator )
2201
     direct-declarator array-declarator
2202
     direct-declarator ( parameter-type-list )
2203
     direct-declarator ( identifier-list[opt] )
2204
 
2205
   pointer:
2206
     * type-qualifier-list[opt]
2207
     * type-qualifier-list[opt] pointer
2208
 
2209
   type-qualifier-list:
2210
     type-qualifier
2211
     attributes
2212
     type-qualifier-list type-qualifier
2213
     type-qualifier-list attributes
2214
 
2215
   parameter-type-list:
2216
     parameter-list
2217
     parameter-list , ...
2218
 
2219
   parameter-list:
2220
     parameter-declaration
2221
     parameter-list , parameter-declaration
2222
 
2223
   parameter-declaration:
2224
     declaration-specifiers declarator attributes[opt]
2225
     declaration-specifiers abstract-declarator[opt] attributes[opt]
2226
 
2227
   identifier-list:
2228
     identifier
2229
     identifier-list , identifier
2230
 
2231
   abstract-declarator:
2232
     pointer
2233
     pointer[opt] direct-abstract-declarator
2234
 
2235
   direct-abstract-declarator:
2236
     ( attributes[opt] abstract-declarator )
2237
     direct-abstract-declarator[opt] array-declarator
2238
     direct-abstract-declarator[opt] ( parameter-type-list[opt] )
2239
 
2240
   GNU extensions:
2241
 
2242
   direct-declarator:
2243
     direct-declarator ( parameter-forward-declarations
2244
                         parameter-type-list[opt] )
2245
 
2246
   direct-abstract-declarator:
2247
     direct-abstract-declarator[opt] ( parameter-forward-declarations
2248
                                       parameter-type-list[opt] )
2249
 
2250
   parameter-forward-declarations:
2251
     parameter-list ;
2252
     parameter-forward-declarations parameter-list ;
2253
 
2254
   The uses of attributes shown above are GNU extensions.
2255
 
2256
   Some forms of array declarator are not included in C99 in the
2257
   syntax for abstract declarators; these are disallowed elsewhere.
2258
   This may be a defect (DR#289).
2259
 
2260
   This function also accepts an omitted abstract declarator as being
2261
   an abstract declarator, although not part of the formal syntax.  */
2262
 
2263
static struct c_declarator *
2264
c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2265
                     bool *seen_id)
2266
{
2267
  /* Parse any initial pointer part.  */
2268
  if (c_parser_next_token_is (parser, CPP_MULT))
2269
    {
2270
      struct c_declspecs *quals_attrs = build_null_declspecs ();
2271
      struct c_declarator *inner;
2272
      c_parser_consume_token (parser);
2273
      c_parser_declspecs (parser, quals_attrs, false, false, true);
2274
      inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2275
      if (inner == NULL)
2276
        return NULL;
2277
      else
2278
        return make_pointer_declarator (quals_attrs, inner);
2279
    }
2280
  /* Now we have a direct declarator, direct abstract declarator or
2281
     nothing (which counts as a direct abstract declarator here).  */
2282
  return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
2283
}
2284
 
2285
/* Parse a direct declarator or direct abstract declarator; arguments
2286
   as c_parser_declarator.  */
2287
 
2288
static struct c_declarator *
2289
c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
2290
                            bool *seen_id)
2291
{
2292
  /* The direct declarator must start with an identifier (possibly
2293
     omitted) or a parenthesized declarator (possibly abstract).  In
2294
     an ordinary declarator, initial parentheses must start a
2295
     parenthesized declarator.  In an abstract declarator or parameter
2296
     declarator, they could start a parenthesized declarator or a
2297
     parameter list.  To tell which, the open parenthesis and any
2298
     following attributes must be read.  If a declaration specifier
2299
     follows, then it is a parameter list; if the specifier is a
2300
     typedef name, there might be an ambiguity about redeclaring it,
2301
     which is resolved in the direction of treating it as a typedef
2302
     name.  If a close parenthesis follows, it is also an empty
2303
     parameter list, as the syntax does not permit empty abstract
2304
     declarators.  Otherwise, it is a parenthesized declarator (in
2305
     which case the analysis may be repeated inside it, recursively).
2306
 
2307
     ??? There is an ambiguity in a parameter declaration "int
2308
     (__attribute__((foo)) x)", where x is not a typedef name: it
2309
     could be an abstract declarator for a function, or declare x with
2310
     parentheses.  The proper resolution of this ambiguity needs
2311
     documenting.  At present we follow an accident of the old
2312
     parser's implementation, whereby the first parameter must have
2313
     some declaration specifiers other than just attributes.  Thus as
2314
     a parameter declaration it is treated as a parenthesized
2315
     parameter named x, and as an abstract declarator it is
2316
     rejected.
2317
 
2318
     ??? Also following the old parser, attributes inside an empty
2319
     parameter list are ignored, making it a list not yielding a
2320
     prototype, rather than giving an error or making it have one
2321
     parameter with implicit type int.
2322
 
2323
     ??? Also following the old parser, typedef names may be
2324
     redeclared in declarators, but not Objective-C class names.  */
2325
 
2326
  if (kind != C_DTR_ABSTRACT
2327
      && c_parser_next_token_is (parser, CPP_NAME)
2328
      && ((type_seen_p
2329
           && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
2330
          || c_parser_peek_token (parser)->id_kind == C_ID_ID))
2331
    {
2332
      struct c_declarator *inner
2333
        = build_id_declarator (c_parser_peek_token (parser)->value);
2334
      *seen_id = true;
2335
      inner->id_loc = c_parser_peek_token (parser)->location;
2336
      c_parser_consume_token (parser);
2337
      return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2338
    }
2339
 
2340
  if (kind != C_DTR_NORMAL
2341
      && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2342
    {
2343
      struct c_declarator *inner = build_id_declarator (NULL_TREE);
2344
      return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2345
    }
2346
 
2347
  /* Either we are at the end of an abstract declarator, or we have
2348
     parentheses.  */
2349
 
2350
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2351
    {
2352
      tree attrs;
2353
      struct c_declarator *inner;
2354
      c_parser_consume_token (parser);
2355
      attrs = c_parser_attributes (parser);
2356
      if (kind != C_DTR_NORMAL
2357
          && (c_parser_next_token_starts_declspecs (parser)
2358
              || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
2359
        {
2360
          struct c_arg_info *args
2361
            = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
2362
                                         attrs);
2363
          if (args == NULL)
2364
            return NULL;
2365
          else
2366
            {
2367
              inner
2368
                = build_function_declarator (args,
2369
                                             build_id_declarator (NULL_TREE));
2370
              return c_parser_direct_declarator_inner (parser, *seen_id,
2371
                                                       inner);
2372
            }
2373
        }
2374
      /* A parenthesized declarator.  */
2375
      inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
2376
      if (inner != NULL && attrs != NULL)
2377
        inner = build_attrs_declarator (attrs, inner);
2378
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2379
        {
2380
          c_parser_consume_token (parser);
2381
          if (inner == NULL)
2382
            return NULL;
2383
          else
2384
            return c_parser_direct_declarator_inner (parser, *seen_id, inner);
2385
        }
2386
      else
2387
        {
2388
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2389
                                     "expected %<)%>");
2390
          return NULL;
2391
        }
2392
    }
2393
  else
2394
    {
2395
      if (kind == C_DTR_NORMAL)
2396
        {
2397
          c_parser_error (parser, "expected identifier or %<(%>");
2398
          return NULL;
2399
        }
2400
      else
2401
        return build_id_declarator (NULL_TREE);
2402
    }
2403
}
2404
 
2405
/* Parse part of a direct declarator or direct abstract declarator,
2406
   given that some (in INNER) has already been parsed; ID_PRESENT is
2407
   true if an identifier is present, false for an abstract
2408
   declarator.  */
2409
 
2410
static struct c_declarator *
2411
c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
2412
                                  struct c_declarator *inner)
2413
{
2414
  /* Parse a sequence of array declarators and parameter lists.  */
2415
  if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
2416
    {
2417
      location_t brace_loc = c_parser_peek_token (parser)->location;
2418
      struct c_declarator *declarator;
2419
      struct c_declspecs *quals_attrs = build_null_declspecs ();
2420
      bool static_seen;
2421
      bool star_seen;
2422
      tree dimen;
2423
      c_parser_consume_token (parser);
2424
      c_parser_declspecs (parser, quals_attrs, false, false, true);
2425
      static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
2426
      if (static_seen)
2427
        c_parser_consume_token (parser);
2428
      if (static_seen && !quals_attrs->declspecs_seen_p)
2429
        c_parser_declspecs (parser, quals_attrs, false, false, true);
2430
      if (!quals_attrs->declspecs_seen_p)
2431
        quals_attrs = NULL;
2432
      /* If "static" is present, there must be an array dimension.
2433
         Otherwise, there may be a dimension, "*", or no
2434
         dimension.  */
2435
      if (static_seen)
2436
        {
2437
          star_seen = false;
2438
          dimen = c_parser_expr_no_commas (parser, NULL).value;
2439
        }
2440
      else
2441
        {
2442
          if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2443
            {
2444
              dimen = NULL_TREE;
2445
              star_seen = false;
2446
            }
2447
          else if (c_parser_next_token_is (parser, CPP_MULT))
2448
            {
2449
              if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
2450
                {
2451
                  dimen = NULL_TREE;
2452
                  star_seen = true;
2453
                  c_parser_consume_token (parser);
2454
                }
2455
              else
2456
                {
2457
                  star_seen = false;
2458
                  dimen = c_parser_expr_no_commas (parser, NULL).value;
2459
                }
2460
            }
2461
          else
2462
            {
2463
              star_seen = false;
2464
              dimen = c_parser_expr_no_commas (parser, NULL).value;
2465
            }
2466
        }
2467
      if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
2468
        c_parser_consume_token (parser);
2469
      else
2470
        {
2471
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
2472
                                     "expected %<]%>");
2473
          return NULL;
2474
        }
2475
      declarator = build_array_declarator (brace_loc, dimen, quals_attrs,
2476
                                           static_seen, star_seen);
2477
      if (declarator == NULL)
2478
        return NULL;
2479
      inner = set_array_declarator_inner (declarator, inner);
2480
      return c_parser_direct_declarator_inner (parser, id_present, inner);
2481
    }
2482
  else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
2483
    {
2484
      tree attrs;
2485
      struct c_arg_info *args;
2486
      c_parser_consume_token (parser);
2487
      attrs = c_parser_attributes (parser);
2488
      args = c_parser_parms_declarator (parser, id_present, attrs);
2489
      if (args == NULL)
2490
        return NULL;
2491
      else
2492
        {
2493
          inner = build_function_declarator (args, inner);
2494
          return c_parser_direct_declarator_inner (parser, id_present, inner);
2495
        }
2496
    }
2497
  return inner;
2498
}
2499
 
2500
/* Parse a parameter list or identifier list, including the closing
2501
   parenthesis but not the opening one.  ATTRS are the attributes at
2502
   the start of the list.  ID_LIST_OK is true if an identifier list is
2503
   acceptable; such a list must not have attributes at the start.  */
2504
 
2505
static struct c_arg_info *
2506
c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
2507
{
2508
  push_scope ();
2509
  declare_parm_level ();
2510
  /* If the list starts with an identifier, it is an identifier list.
2511
     Otherwise, it is either a prototype list or an empty list.  */
2512
  if (id_list_ok
2513
      && !attrs
2514
      && c_parser_next_token_is (parser, CPP_NAME)
2515
      && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2516
    {
2517
      tree list = NULL_TREE, *nextp = &list;
2518
      while (c_parser_next_token_is (parser, CPP_NAME)
2519
             && c_parser_peek_token (parser)->id_kind == C_ID_ID)
2520
        {
2521
          *nextp = build_tree_list (NULL_TREE,
2522
                                    c_parser_peek_token (parser)->value);
2523
          nextp = & TREE_CHAIN (*nextp);
2524
          c_parser_consume_token (parser);
2525
          if (c_parser_next_token_is_not (parser, CPP_COMMA))
2526
            break;
2527
          c_parser_consume_token (parser);
2528
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2529
            {
2530
              c_parser_error (parser, "expected identifier");
2531
              break;
2532
            }
2533
        }
2534
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2535
        {
2536
          struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2537
          ret->parms = 0;
2538
          ret->tags = 0;
2539
          ret->types = list;
2540
          ret->others = 0;
2541
          ret->pending_sizes = 0;
2542
          ret->had_vla_unspec = 0;
2543
          c_parser_consume_token (parser);
2544
          pop_scope ();
2545
          return ret;
2546
        }
2547
      else
2548
        {
2549
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2550
                                     "expected %<)%>");
2551
          pop_scope ();
2552
          return NULL;
2553
        }
2554
    }
2555
  else
2556
    {
2557
      struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
2558
      pop_scope ();
2559
      return ret;
2560
    }
2561
}
2562
 
2563
/* Parse a parameter list (possibly empty), including the closing
2564
   parenthesis but not the opening one.  ATTRS are the attributes at
2565
   the start of the list.  */
2566
 
2567
static struct c_arg_info *
2568
c_parser_parms_list_declarator (c_parser *parser, tree attrs)
2569
{
2570
  bool good_parm = false;
2571
  /* ??? Following the old parser, forward parameter declarations may
2572
     use abstract declarators, and if no real parameter declarations
2573
     follow the forward declarations then this is not diagnosed.  Also
2574
     note as above that attributes are ignored as the only contents of
2575
     the parentheses, or as the only contents after forward
2576
     declarations.  */
2577
  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2578
    {
2579
      struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2580
      ret->parms = 0;
2581
      ret->tags = 0;
2582
      ret->types = 0;
2583
      ret->others = 0;
2584
      ret->pending_sizes = 0;
2585
      ret->had_vla_unspec = 0;
2586
      c_parser_consume_token (parser);
2587
      return ret;
2588
    }
2589
  if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2590
    {
2591
      struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
2592
      ret->parms = 0;
2593
      ret->tags = 0;
2594
      ret->others = 0;
2595
      ret->pending_sizes = 0;
2596
      ret->had_vla_unspec = 0;
2597
      /* Suppress -Wold-style-definition for this case.  */
2598
      ret->types = error_mark_node;
2599
      error_at (c_parser_peek_token (parser)->location,
2600
                "ISO C requires a named argument before %<...%>");
2601
      c_parser_consume_token (parser);
2602
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2603
        {
2604
          c_parser_consume_token (parser);
2605
          return ret;
2606
        }
2607
      else
2608
        {
2609
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2610
                                     "expected %<)%>");
2611
          return NULL;
2612
        }
2613
    }
2614
  /* Nonempty list of parameters, either terminated with semicolon
2615
     (forward declarations; recurse) or with close parenthesis (normal
2616
     function) or with ", ... )" (variadic function).  */
2617
  while (true)
2618
    {
2619
      /* Parse a parameter.  */
2620
      struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
2621
      attrs = NULL_TREE;
2622
      if (parm != NULL)
2623
        {
2624
          good_parm = true;
2625
          push_parm_decl (parm);
2626
        }
2627
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
2628
        {
2629
          tree new_attrs;
2630
          c_parser_consume_token (parser);
2631
          mark_forward_parm_decls ();
2632
          new_attrs = c_parser_attributes (parser);
2633
          return c_parser_parms_list_declarator (parser, new_attrs);
2634
        }
2635
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2636
        {
2637
          c_parser_consume_token (parser);
2638
          if (good_parm)
2639
            return get_parm_info (false);
2640
          else
2641
            {
2642
              struct c_arg_info *ret
2643
                = XOBNEW (&parser_obstack, struct c_arg_info);
2644
              ret->parms = 0;
2645
              ret->tags = 0;
2646
              ret->types = 0;
2647
              ret->others = 0;
2648
              ret->pending_sizes = 0;
2649
              ret->had_vla_unspec = 0;
2650
              return ret;
2651
            }
2652
        }
2653
      if (!c_parser_require (parser, CPP_COMMA,
2654
                             "expected %<;%>, %<,%> or %<)%>"))
2655
        {
2656
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2657
          get_pending_sizes ();
2658
          return NULL;
2659
        }
2660
      if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
2661
        {
2662
          c_parser_consume_token (parser);
2663
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2664
            {
2665
              c_parser_consume_token (parser);
2666
              if (good_parm)
2667
                return get_parm_info (true);
2668
              else
2669
                {
2670
                  struct c_arg_info *ret
2671
                    = XOBNEW (&parser_obstack, struct c_arg_info);
2672
                  ret->parms = 0;
2673
                  ret->tags = 0;
2674
                  ret->types = 0;
2675
                  ret->others = 0;
2676
                  ret->pending_sizes = 0;
2677
                  ret->had_vla_unspec = 0;
2678
                  return ret;
2679
                }
2680
            }
2681
          else
2682
            {
2683
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2684
                                         "expected %<)%>");
2685
              get_pending_sizes ();
2686
              return NULL;
2687
            }
2688
        }
2689
    }
2690
}
2691
 
2692
/* Parse a parameter declaration.  ATTRS are the attributes at the
2693
   start of the declaration if it is the first parameter.  */
2694
 
2695
static struct c_parm *
2696
c_parser_parameter_declaration (c_parser *parser, tree attrs)
2697
{
2698
  struct c_declspecs *specs;
2699
  struct c_declarator *declarator;
2700
  tree prefix_attrs;
2701
  tree postfix_attrs = NULL_TREE;
2702
  bool dummy = false;
2703
  if (!c_parser_next_token_starts_declspecs (parser))
2704
    {
2705
      /* ??? In some Objective-C cases '...' isn't applicable so there
2706
         should be a different message.  */
2707
      c_parser_error (parser,
2708
                      "expected declaration specifiers or %<...%>");
2709
      c_parser_skip_to_end_of_parameter (parser);
2710
      return NULL;
2711
    }
2712
  specs = build_null_declspecs ();
2713
  if (attrs)
2714
    {
2715
      declspecs_add_attrs (specs, attrs);
2716
      attrs = NULL_TREE;
2717
    }
2718
  c_parser_declspecs (parser, specs, true, true, true);
2719
  finish_declspecs (specs);
2720
  pending_xref_error ();
2721
  prefix_attrs = specs->attrs;
2722
  specs->attrs = NULL_TREE;
2723
  declarator = c_parser_declarator (parser, specs->type_seen_p,
2724
                                    C_DTR_PARM, &dummy);
2725
  if (declarator == NULL)
2726
    {
2727
      c_parser_skip_until_found (parser, CPP_COMMA, NULL);
2728
      return NULL;
2729
    }
2730
  if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2731
    postfix_attrs = c_parser_attributes (parser);
2732
  return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
2733
                       declarator);
2734
}
2735
 
2736
/* Parse a string literal in an asm expression.  It should not be
2737
   translated, and wide string literals are an error although
2738
   permitted by the syntax.  This is a GNU extension.
2739
 
2740
   asm-string-literal:
2741
     string-literal
2742
 
2743
   ??? At present, following the old parser, the caller needs to have
2744
   set lex_untranslated_string to 1.  It would be better to follow the
2745
   C++ parser rather than using this kludge.  */
2746
 
2747
static tree
2748
c_parser_asm_string_literal (c_parser *parser)
2749
{
2750
  tree str;
2751
  if (c_parser_next_token_is (parser, CPP_STRING))
2752
    {
2753
      str = c_parser_peek_token (parser)->value;
2754
      c_parser_consume_token (parser);
2755
    }
2756
  else if (c_parser_next_token_is (parser, CPP_WSTRING))
2757
    {
2758
      error_at (c_parser_peek_token (parser)->location,
2759
                "wide string literal in %<asm%>");
2760
      str = build_string (1, "");
2761
      c_parser_consume_token (parser);
2762
    }
2763
  else
2764
    {
2765
      c_parser_error (parser, "expected string literal");
2766
      str = NULL_TREE;
2767
    }
2768
  return str;
2769
}
2770
 
2771
/* Parse a simple asm expression.  This is used in restricted
2772
   contexts, where a full expression with inputs and outputs does not
2773
   make sense.  This is a GNU extension.
2774
 
2775
   simple-asm-expr:
2776
     asm ( asm-string-literal )
2777
*/
2778
 
2779
static tree
2780
c_parser_simple_asm_expr (c_parser *parser)
2781
{
2782
  tree str;
2783
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
2784
  /* ??? Follow the C++ parser rather than using the
2785
     lex_untranslated_string kludge.  */
2786
  parser->lex_untranslated_string = true;
2787
  c_parser_consume_token (parser);
2788
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2789
    {
2790
      parser->lex_untranslated_string = false;
2791
      return NULL_TREE;
2792
    }
2793
  str = c_parser_asm_string_literal (parser);
2794
  parser->lex_untranslated_string = false;
2795
  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
2796
    {
2797
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2798
      return NULL_TREE;
2799
    }
2800
  return str;
2801
}
2802
 
2803
/* Parse (possibly empty) attributes.  This is a GNU extension.
2804
 
2805
   attributes:
2806
     empty
2807
     attributes attribute
2808
 
2809
   attribute:
2810
     __attribute__ ( ( attribute-list ) )
2811
 
2812
   attribute-list:
2813
     attrib
2814
     attribute_list , attrib
2815
 
2816
   attrib:
2817
     empty
2818
     any-word
2819
     any-word ( identifier )
2820
     any-word ( identifier , nonempty-expr-list )
2821
     any-word ( expr-list )
2822
 
2823
   where the "identifier" must not be declared as a type, and
2824
   "any-word" may be any identifier (including one declared as a
2825
   type), a reserved word storage class specifier, type specifier or
2826
   type qualifier.  ??? This still leaves out most reserved keywords
2827
   (following the old parser), shouldn't we include them, and why not
2828
   allow identifiers declared as types to start the arguments?  */
2829
 
2830
static tree
2831
c_parser_attributes (c_parser *parser)
2832
{
2833
  tree attrs = NULL_TREE;
2834
  while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
2835
    {
2836
      /* ??? Follow the C++ parser rather than using the
2837
         lex_untranslated_string kludge.  */
2838
      parser->lex_untranslated_string = true;
2839
      c_parser_consume_token (parser);
2840
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2841
        {
2842
          parser->lex_untranslated_string = false;
2843
          return attrs;
2844
        }
2845
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
2846
        {
2847
          parser->lex_untranslated_string = false;
2848
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
2849
          return attrs;
2850
        }
2851
      /* Parse the attribute list.  */
2852
      while (c_parser_next_token_is (parser, CPP_COMMA)
2853
             || c_parser_next_token_is (parser, CPP_NAME)
2854
             || c_parser_next_token_is (parser, CPP_KEYWORD))
2855
        {
2856
          tree attr, attr_name, attr_args;
2857
          VEC(tree,gc) *expr_list;
2858
          if (c_parser_next_token_is (parser, CPP_COMMA))
2859
            {
2860
              c_parser_consume_token (parser);
2861
              continue;
2862
            }
2863
          if (c_parser_next_token_is (parser, CPP_KEYWORD))
2864
            {
2865
              /* ??? See comment above about what keywords are
2866
                 accepted here.  */
2867
              bool ok;
2868
              switch (c_parser_peek_token (parser)->keyword)
2869
                {
2870
                case RID_STATIC:
2871
                case RID_UNSIGNED:
2872
                case RID_LONG:
2873
                case RID_CONST:
2874
                case RID_EXTERN:
2875
                case RID_REGISTER:
2876
                case RID_TYPEDEF:
2877
                case RID_SHORT:
2878
                case RID_INLINE:
2879
                case RID_VOLATILE:
2880
                case RID_SIGNED:
2881
                case RID_AUTO:
2882
                case RID_RESTRICT:
2883
                case RID_COMPLEX:
2884
                case RID_THREAD:
2885
                case RID_INT:
2886
                case RID_CHAR:
2887
                case RID_FLOAT:
2888
                case RID_DOUBLE:
2889
                case RID_VOID:
2890
                case RID_DFLOAT32:
2891
                case RID_DFLOAT64:
2892
                case RID_DFLOAT128:
2893
                case RID_BOOL:
2894
                case RID_FRACT:
2895
                case RID_ACCUM:
2896
                case RID_SAT:
2897
                  ok = true;
2898
                  break;
2899
                default:
2900
                  ok = false;
2901
                  break;
2902
                }
2903
              if (!ok)
2904
                break;
2905
              /* Accept __attribute__((__const)) as __attribute__((const))
2906
                 etc.  */
2907
              attr_name
2908
                = ridpointers[(int) c_parser_peek_token (parser)->keyword];
2909
            }
2910
          else
2911
            attr_name = c_parser_peek_token (parser)->value;
2912
          c_parser_consume_token (parser);
2913
          if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
2914
            {
2915
              attr = build_tree_list (attr_name, NULL_TREE);
2916
              attrs = chainon (attrs, attr);
2917
              continue;
2918
            }
2919
          c_parser_consume_token (parser);
2920
          /* Parse the attribute contents.  If they start with an
2921
             identifier which is followed by a comma or close
2922
             parenthesis, then the arguments start with that
2923
             identifier; otherwise they are an expression list.  */
2924
          if (c_parser_next_token_is (parser, CPP_NAME)
2925
              && c_parser_peek_token (parser)->id_kind == C_ID_ID
2926
              && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
2927
                  || (c_parser_peek_2nd_token (parser)->type
2928
                      == CPP_CLOSE_PAREN)))
2929
            {
2930
              tree arg1 = c_parser_peek_token (parser)->value;
2931
              c_parser_consume_token (parser);
2932
              if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2933
                attr_args = build_tree_list (NULL_TREE, arg1);
2934
              else
2935
                {
2936
                  tree tree_list;
2937
                  c_parser_consume_token (parser);
2938
                  expr_list = c_parser_expr_list (parser, false, true, NULL);
2939
                  tree_list = build_tree_list_vec (expr_list);
2940
                  attr_args = tree_cons (NULL_TREE, arg1, tree_list);
2941
                  release_tree_vector (expr_list);
2942
                }
2943
            }
2944
          else
2945
            {
2946
              if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2947
                attr_args = NULL_TREE;
2948
              else
2949
                {
2950
                  expr_list = c_parser_expr_list (parser, false, true, NULL);
2951
                  attr_args = build_tree_list_vec (expr_list);
2952
                  release_tree_vector (expr_list);
2953
                }
2954
            }
2955
          attr = build_tree_list (attr_name, attr_args);
2956
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2957
            c_parser_consume_token (parser);
2958
          else
2959
            {
2960
              parser->lex_untranslated_string = false;
2961
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2962
                                         "expected %<)%>");
2963
              return attrs;
2964
            }
2965
          attrs = chainon (attrs, attr);
2966
        }
2967
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2968
        c_parser_consume_token (parser);
2969
      else
2970
        {
2971
          parser->lex_untranslated_string = false;
2972
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2973
                                     "expected %<)%>");
2974
          return attrs;
2975
        }
2976
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
2977
        c_parser_consume_token (parser);
2978
      else
2979
        {
2980
          parser->lex_untranslated_string = false;
2981
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
2982
                                     "expected %<)%>");
2983
          return attrs;
2984
        }
2985
      parser->lex_untranslated_string = false;
2986
    }
2987
  return attrs;
2988
}
2989
 
2990
/* Parse a type name (C90 6.5.5, C99 6.7.6).
2991
 
2992
   type-name:
2993
     specifier-qualifier-list abstract-declarator[opt]
2994
*/
2995
 
2996
static struct c_type_name *
2997
c_parser_type_name (c_parser *parser)
2998
{
2999
  struct c_declspecs *specs = build_null_declspecs ();
3000
  struct c_declarator *declarator;
3001
  struct c_type_name *ret;
3002
  bool dummy = false;
3003
  c_parser_declspecs (parser, specs, false, true, true);
3004
  if (!specs->declspecs_seen_p)
3005
    {
3006
      c_parser_error (parser, "expected specifier-qualifier-list");
3007
      return NULL;
3008
    }
3009
  pending_xref_error ();
3010
  finish_declspecs (specs);
3011
  declarator = c_parser_declarator (parser, specs->type_seen_p,
3012
                                    C_DTR_ABSTRACT, &dummy);
3013
  if (declarator == NULL)
3014
    return NULL;
3015
  ret = XOBNEW (&parser_obstack, struct c_type_name);
3016
  ret->specs = specs;
3017
  ret->declarator = declarator;
3018
  return ret;
3019
}
3020
 
3021
/* Parse an initializer (C90 6.5.7, C99 6.7.8).
3022
 
3023
   initializer:
3024
     assignment-expression
3025
     { initializer-list }
3026
     { initializer-list , }
3027
 
3028
   initializer-list:
3029
     designation[opt] initializer
3030
     initializer-list , designation[opt] initializer
3031
 
3032
   designation:
3033
     designator-list =
3034
 
3035
   designator-list:
3036
     designator
3037
     designator-list designator
3038
 
3039
   designator:
3040
     array-designator
3041
     . identifier
3042
 
3043
   array-designator:
3044
     [ constant-expression ]
3045
 
3046
   GNU extensions:
3047
 
3048
   initializer:
3049
     { }
3050
 
3051
   designation:
3052
     array-designator
3053
     identifier :
3054
 
3055
   array-designator:
3056
     [ constant-expression ... constant-expression ]
3057
 
3058
   Any expression without commas is accepted in the syntax for the
3059
   constant-expressions, with non-constant expressions rejected later.
3060
 
3061
   This function is only used for top-level initializers; for nested
3062
   ones, see c_parser_initval.  */
3063
 
3064
static struct c_expr
3065
c_parser_initializer (c_parser *parser)
3066
{
3067
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3068
    return c_parser_braced_init (parser, NULL_TREE, false);
3069
  else
3070
    {
3071
      struct c_expr ret;
3072
      location_t loc = c_parser_peek_token (parser)->location;
3073
      ret = c_parser_expr_no_commas (parser, NULL);
3074
      if (TREE_CODE (ret.value) != STRING_CST
3075
          && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
3076
        ret = default_function_array_conversion (loc, ret);
3077
      return ret;
3078
    }
3079
}
3080
 
3081
/* Parse a braced initializer list.  TYPE is the type specified for a
3082
   compound literal, and NULL_TREE for other initializers and for
3083
   nested braced lists.  NESTED_P is true for nested braced lists,
3084
   false for the list of a compound literal or the list that is the
3085
   top-level initializer in a declaration.  */
3086
 
3087
static struct c_expr
3088
c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
3089
{
3090
  location_t brace_loc = c_parser_peek_token (parser)->location;
3091
  gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
3092
  c_parser_consume_token (parser);
3093
  if (nested_p)
3094
    push_init_level (0);
3095
  else
3096
    really_start_incremental_init (type);
3097
  if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3098
    {
3099
      pedwarn (brace_loc, OPT_pedantic, "ISO C forbids empty initializer braces");
3100
    }
3101
  else
3102
    {
3103
      /* Parse a non-empty initializer list, possibly with a trailing
3104
         comma.  */
3105
      while (true)
3106
        {
3107
          c_parser_initelt (parser);
3108
          if (parser->error)
3109
            break;
3110
          if (c_parser_next_token_is (parser, CPP_COMMA))
3111
            c_parser_consume_token (parser);
3112
          else
3113
            break;
3114
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3115
            break;
3116
        }
3117
    }
3118
  if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3119
    {
3120
      struct c_expr ret;
3121
      ret.value = error_mark_node;
3122
      ret.original_code = ERROR_MARK;
3123
      ret.original_type = NULL;
3124
      c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
3125
      pop_init_level (0);
3126
      return ret;
3127
    }
3128
  c_parser_consume_token (parser);
3129
  return pop_init_level (0);
3130
}
3131
 
3132
/* Parse a nested initializer, including designators.  */
3133
 
3134
static void
3135
c_parser_initelt (c_parser *parser)
3136
{
3137
  /* Parse any designator or designator list.  A single array
3138
     designator may have the subsequent "=" omitted in GNU C, but a
3139
     longer list or a structure member designator may not.  */
3140
  if (c_parser_next_token_is (parser, CPP_NAME)
3141
      && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
3142
    {
3143
      /* Old-style structure member designator.  */
3144
      set_init_label (c_parser_peek_token (parser)->value);
3145
      /* Use the colon as the error location.  */
3146
      pedwarn (c_parser_peek_2nd_token (parser)->location, OPT_pedantic,
3147
               "obsolete use of designated initializer with %<:%>");
3148
      c_parser_consume_token (parser);
3149
      c_parser_consume_token (parser);
3150
    }
3151
  else
3152
    {
3153
      /* des_seen is 0 if there have been no designators, 1 if there
3154
         has been a single array designator and 2 otherwise.  */
3155
      int des_seen = 0;
3156
      /* Location of a designator.  */
3157
      location_t des_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
3158
      while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
3159
             || c_parser_next_token_is (parser, CPP_DOT))
3160
        {
3161
          int des_prev = des_seen;
3162
          if (!des_seen)
3163
            des_loc = c_parser_peek_token (parser)->location;
3164
          if (des_seen < 2)
3165
            des_seen++;
3166
          if (c_parser_next_token_is (parser, CPP_DOT))
3167
            {
3168
              des_seen = 2;
3169
              c_parser_consume_token (parser);
3170
              if (c_parser_next_token_is (parser, CPP_NAME))
3171
                {
3172
                  set_init_label (c_parser_peek_token (parser)->value);
3173
                  c_parser_consume_token (parser);
3174
                }
3175
              else
3176
                {
3177
                  struct c_expr init;
3178
                  init.value = error_mark_node;
3179
                  init.original_code = ERROR_MARK;
3180
                  init.original_type = NULL;
3181
                  c_parser_error (parser, "expected identifier");
3182
                  c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3183
                  process_init_element (init, false);
3184
                  return;
3185
                }
3186
            }
3187
          else
3188
            {
3189
              tree first, second;
3190
              location_t ellipsis_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
3191
              /* ??? Following the old parser, [ objc-receiver
3192
                 objc-message-args ] is accepted as an initializer,
3193
                 being distinguished from a designator by what follows
3194
                 the first assignment expression inside the square
3195
                 brackets, but after a first array designator a
3196
                 subsequent square bracket is for Objective-C taken to
3197
                 start an expression, using the obsolete form of
3198
                 designated initializer without '=', rather than
3199
                 possibly being a second level of designation: in LALR
3200
                 terms, the '[' is shifted rather than reducing
3201
                 designator to designator-list.  */
3202
              if (des_prev == 1 && c_dialect_objc ())
3203
                {
3204
                  des_seen = des_prev;
3205
                  break;
3206
                }
3207
              if (des_prev == 0 && c_dialect_objc ())
3208
                {
3209
                  /* This might be an array designator or an
3210
                     Objective-C message expression.  If the former,
3211
                     continue parsing here; if the latter, parse the
3212
                     remainder of the initializer given the starting
3213
                     primary-expression.  ??? It might make sense to
3214
                     distinguish when des_prev == 1 as well; see
3215
                     previous comment.  */
3216
                  tree rec, args;
3217
                  struct c_expr mexpr;
3218
                  c_parser_consume_token (parser);
3219
                  if (c_parser_peek_token (parser)->type == CPP_NAME
3220
                      && ((c_parser_peek_token (parser)->id_kind
3221
                           == C_ID_TYPENAME)
3222
                          || (c_parser_peek_token (parser)->id_kind
3223
                              == C_ID_CLASSNAME)))
3224
                    {
3225
                      /* Type name receiver.  */
3226
                      tree id = c_parser_peek_token (parser)->value;
3227
                      c_parser_consume_token (parser);
3228
                      rec = objc_get_class_reference (id);
3229
                      goto parse_message_args;
3230
                    }
3231
                  first = c_parser_expr_no_commas (parser, NULL).value;
3232
                  if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
3233
                      || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3234
                    goto array_desig_after_first;
3235
                  /* Expression receiver.  So far only one part
3236
                     without commas has been parsed; there might be
3237
                     more of the expression.  */
3238
                  rec = first;
3239
                  while (c_parser_next_token_is (parser, CPP_COMMA))
3240
                    {
3241
                      struct c_expr next;
3242
                      location_t comma_loc, exp_loc;
3243
                      comma_loc = c_parser_peek_token (parser)->location;
3244
                      c_parser_consume_token (parser);
3245
                      exp_loc = c_parser_peek_token (parser)->location;
3246
                      next = c_parser_expr_no_commas (parser, NULL);
3247
                      next = default_function_array_conversion (exp_loc, next);
3248
                      rec = build_compound_expr (comma_loc, rec, next.value);
3249
                    }
3250
                parse_message_args:
3251
                  /* Now parse the objc-message-args.  */
3252
                  args = c_parser_objc_message_args (parser);
3253
                  c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3254
                                             "expected %<]%>");
3255
                  mexpr.value
3256
                    = objc_build_message_expr (build_tree_list (rec, args));
3257
                  mexpr.original_code = ERROR_MARK;
3258
                  mexpr.original_type = NULL;
3259
                  /* Now parse and process the remainder of the
3260
                     initializer, starting with this message
3261
                     expression as a primary-expression.  */
3262
                  c_parser_initval (parser, &mexpr);
3263
                  return;
3264
                }
3265
              c_parser_consume_token (parser);
3266
              first = c_parser_expr_no_commas (parser, NULL).value;
3267
            array_desig_after_first:
3268
              if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3269
                {
3270
                  ellipsis_loc = c_parser_peek_token (parser)->location;
3271
                  c_parser_consume_token (parser);
3272
                  second = c_parser_expr_no_commas (parser, NULL).value;
3273
                }
3274
              else
3275
                second = NULL_TREE;
3276
              if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
3277
                {
3278
                  c_parser_consume_token (parser);
3279
                  set_init_index (first, second);
3280
                  if (second)
3281
                    pedwarn (ellipsis_loc, OPT_pedantic,
3282
                             "ISO C forbids specifying range of elements to initialize");
3283
                }
3284
              else
3285
                c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
3286
                                           "expected %<]%>");
3287
            }
3288
        }
3289
      if (des_seen >= 1)
3290
        {
3291
          if (c_parser_next_token_is (parser, CPP_EQ))
3292
            {
3293
              if (!flag_isoc99)
3294
                pedwarn (des_loc, OPT_pedantic,
3295
                         "ISO C90 forbids specifying subobject to initialize");
3296
              c_parser_consume_token (parser);
3297
            }
3298
          else
3299
            {
3300
              if (des_seen == 1)
3301
                pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
3302
                         "obsolete use of designated initializer without %<=%>");
3303
              else
3304
                {
3305
                  struct c_expr init;
3306
                  init.value = error_mark_node;
3307
                  init.original_code = ERROR_MARK;
3308
                  init.original_type = NULL;
3309
                  c_parser_error (parser, "expected %<=%>");
3310
                  c_parser_skip_until_found (parser, CPP_COMMA, NULL);
3311
                  process_init_element (init, false);
3312
                  return;
3313
                }
3314
            }
3315
        }
3316
    }
3317
  c_parser_initval (parser, NULL);
3318
}
3319
 
3320
/* Parse a nested initializer; as c_parser_initializer but parses
3321
   initializers within braced lists, after any designators have been
3322
   applied.  If AFTER is not NULL then it is an Objective-C message
3323
   expression which is the primary-expression starting the
3324
   initializer.  */
3325
 
3326
static void
3327
c_parser_initval (c_parser *parser, struct c_expr *after)
3328
{
3329
  struct c_expr init;
3330
  gcc_assert (!after || c_dialect_objc ());
3331
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
3332
    init = c_parser_braced_init (parser, NULL_TREE, true);
3333
  else
3334
    {
3335
      location_t loc = c_parser_peek_token (parser)->location;
3336
      init = c_parser_expr_no_commas (parser, after);
3337
      if (init.value != NULL_TREE
3338
          && TREE_CODE (init.value) != STRING_CST
3339
          && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
3340
        init = default_function_array_conversion (loc, init);
3341
    }
3342
  process_init_element (init, false);
3343
}
3344
 
3345
/* Parse a compound statement (possibly a function body) (C90 6.6.2,
3346
   C99 6.8.2).
3347
 
3348
   compound-statement:
3349
     { block-item-list[opt] }
3350
     { label-declarations block-item-list }
3351
 
3352
   block-item-list:
3353
     block-item
3354
     block-item-list block-item
3355
 
3356
   block-item:
3357
     nested-declaration
3358
     statement
3359
 
3360
   nested-declaration:
3361
     declaration
3362
 
3363
   GNU extensions:
3364
 
3365
   compound-statement:
3366
     { label-declarations block-item-list }
3367
 
3368
   nested-declaration:
3369
     __extension__ nested-declaration
3370
     nested-function-definition
3371
 
3372
   label-declarations:
3373
     label-declaration
3374
     label-declarations label-declaration
3375
 
3376
   label-declaration:
3377
     __label__ identifier-list ;
3378
 
3379
   Allowing the mixing of declarations and code is new in C99.  The
3380
   GNU syntax also permits (not shown above) labels at the end of
3381
   compound statements, which yield an error.  We don't allow labels
3382
   on declarations; this might seem like a natural extension, but
3383
   there would be a conflict between attributes on the label and
3384
   prefix attributes on the declaration.  ??? The syntax follows the
3385
   old parser in requiring something after label declarations.
3386
   Although they are erroneous if the labels declared aren't defined,
3387
   is it useful for the syntax to be this way?
3388
 
3389
   OpenMP:
3390
 
3391
   block-item:
3392
     openmp-directive
3393
 
3394
   openmp-directive:
3395
     barrier-directive
3396
     flush-directive  */
3397
 
3398
static tree
3399
c_parser_compound_statement (c_parser *parser)
3400
{
3401
  tree stmt;
3402
  location_t brace_loc;
3403
  brace_loc = c_parser_peek_token (parser)->location;
3404
  if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
3405
    {
3406
      /* Ensure a scope is entered and left anyway to avoid confusion
3407
         if we have just prepared to enter a function body.  */
3408
      stmt = c_begin_compound_stmt (true);
3409
      c_end_compound_stmt (brace_loc, stmt, true);
3410
      return error_mark_node;
3411
    }
3412
  stmt = c_begin_compound_stmt (true);
3413
  c_parser_compound_statement_nostart (parser);
3414
  return c_end_compound_stmt (brace_loc, stmt, true);
3415
}
3416
 
3417
/* Parse a compound statement except for the opening brace.  This is
3418
   used for parsing both compound statements and statement expressions
3419
   (which follow different paths to handling the opening).  */
3420
 
3421
static void
3422
c_parser_compound_statement_nostart (c_parser *parser)
3423
{
3424
  bool last_stmt = false;
3425
  bool last_label = false;
3426
  bool save_valid_for_pragma = valid_location_for_stdc_pragma_p ();
3427
  location_t label_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
3428
  if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3429
    {
3430
      c_parser_consume_token (parser);
3431
      return;
3432
    }
3433
  mark_valid_location_for_stdc_pragma (true);
3434
  if (c_parser_next_token_is_keyword (parser, RID_LABEL))
3435
    {
3436
      /* Read zero or more forward-declarations for labels that nested
3437
         functions can jump to.  */
3438
      mark_valid_location_for_stdc_pragma (false);
3439
      while (c_parser_next_token_is_keyword (parser, RID_LABEL))
3440
        {
3441
          label_loc = c_parser_peek_token (parser)->location;
3442
          c_parser_consume_token (parser);
3443
          /* Any identifiers, including those declared as type names,
3444
             are OK here.  */
3445
          while (true)
3446
            {
3447
              tree label;
3448
              if (c_parser_next_token_is_not (parser, CPP_NAME))
3449
                {
3450
                  c_parser_error (parser, "expected identifier");
3451
                  break;
3452
                }
3453
              label
3454
                = declare_label (c_parser_peek_token (parser)->value);
3455
              C_DECLARED_LABEL_FLAG (label) = 1;
3456
              add_stmt (build_stmt (label_loc, DECL_EXPR, label));
3457
              c_parser_consume_token (parser);
3458
              if (c_parser_next_token_is (parser, CPP_COMMA))
3459
                c_parser_consume_token (parser);
3460
              else
3461
                break;
3462
            }
3463
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3464
        }
3465
      pedwarn (label_loc, OPT_pedantic, "ISO C forbids label declarations");
3466
    }
3467
  /* We must now have at least one statement, label or declaration.  */
3468
  if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
3469
    {
3470
      mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
3471
      c_parser_error (parser, "expected declaration or statement");
3472
      c_parser_consume_token (parser);
3473
      return;
3474
    }
3475
  while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
3476
    {
3477
      location_t loc = c_parser_peek_token (parser)->location;
3478
      if (c_parser_next_token_is_keyword (parser, RID_CASE)
3479
          || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3480
          || (c_parser_next_token_is (parser, CPP_NAME)
3481
              && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3482
        {
3483
          if (c_parser_next_token_is_keyword (parser, RID_CASE))
3484
            label_loc = c_parser_peek_2nd_token (parser)->location;
3485
          else
3486
            label_loc = c_parser_peek_token (parser)->location;
3487
          last_label = true;
3488
          last_stmt = false;
3489
          mark_valid_location_for_stdc_pragma (false);
3490
          c_parser_label (parser);
3491
        }
3492
      else if (!last_label
3493
               && c_parser_next_token_starts_declspecs (parser))
3494
        {
3495
          last_label = false;
3496
          mark_valid_location_for_stdc_pragma (false);
3497
          c_parser_declaration_or_fndef (parser, true, true, true, true);
3498
          if (last_stmt)
3499
            pedwarn_c90 (loc,
3500
                         (pedantic && !flag_isoc99)
3501
                         ? OPT_pedantic
3502
                         : OPT_Wdeclaration_after_statement,
3503
                         "ISO C90 forbids mixed declarations and code");
3504
          last_stmt = false;
3505
        }
3506
      else if (!last_label
3507
               && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
3508
        {
3509
          /* __extension__ can start a declaration, but is also an
3510
             unary operator that can start an expression.  Consume all
3511
             but the last of a possible series of __extension__ to
3512
             determine which.  */
3513
          while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
3514
                 && (c_parser_peek_2nd_token (parser)->keyword
3515
                     == RID_EXTENSION))
3516
            c_parser_consume_token (parser);
3517
          if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
3518
            {
3519
              int ext;
3520
              ext = disable_extension_diagnostics ();
3521
              c_parser_consume_token (parser);
3522
              last_label = false;
3523
              mark_valid_location_for_stdc_pragma (false);
3524
              c_parser_declaration_or_fndef (parser, true, true, true, true);
3525
              /* Following the old parser, __extension__ does not
3526
                 disable this diagnostic.  */
3527
              restore_extension_diagnostics (ext);
3528
              if (last_stmt)
3529
                pedwarn_c90 (loc, (pedantic && !flag_isoc99)
3530
                             ? OPT_pedantic
3531
                             : OPT_Wdeclaration_after_statement,
3532
                             "ISO C90 forbids mixed declarations and code");
3533
              last_stmt = false;
3534
            }
3535
          else
3536
            goto statement;
3537
        }
3538
      else if (c_parser_next_token_is (parser, CPP_PRAGMA))
3539
        {
3540
          /* External pragmas, and some omp pragmas, are not associated
3541
             with regular c code, and so are not to be considered statements
3542
             syntactically.  This ensures that the user doesn't put them
3543
             places that would turn into syntax errors if the directive
3544
             were ignored.  */
3545
          if (c_parser_pragma (parser, pragma_compound))
3546
            last_label = false, last_stmt = true;
3547
        }
3548
      else if (c_parser_next_token_is (parser, CPP_EOF))
3549
        {
3550
          mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
3551
          c_parser_error (parser, "expected declaration or statement");
3552
          return;
3553
        }
3554
      else if (c_parser_next_token_is_keyword (parser, RID_ELSE))
3555
        {
3556
          if (parser->in_if_block)
3557
            {
3558
              mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
3559
              error_at (loc, """expected %<}%> before %<else%>");
3560
              return;
3561
            }
3562
          else
3563
            {
3564
              error_at (loc, "%<else%> without a previous %<if%>");
3565
              c_parser_consume_token (parser);
3566
              continue;
3567
            }
3568
        }
3569
      else
3570
        {
3571
        statement:
3572
          last_label = false;
3573
          last_stmt = true;
3574
          mark_valid_location_for_stdc_pragma (false);
3575
          c_parser_statement_after_labels (parser);
3576
        }
3577
 
3578
      parser->error = false;
3579
    }
3580
  if (last_label)
3581
    error_at (label_loc, "label at end of compound statement");
3582
  c_parser_consume_token (parser);
3583
  /* Restore the value we started with.  */
3584
  mark_valid_location_for_stdc_pragma (save_valid_for_pragma);
3585
}
3586
 
3587
/* Parse a label (C90 6.6.1, C99 6.8.1).
3588
 
3589
   label:
3590
     identifier : attributes[opt]
3591
     case constant-expression :
3592
     default :
3593
 
3594
   GNU extensions:
3595
 
3596
   label:
3597
     case constant-expression ... constant-expression :
3598
 
3599
   The use of attributes on labels is a GNU extension.  The syntax in
3600
   GNU C accepts any expressions without commas, non-constant
3601
   expressions being rejected later.  */
3602
 
3603
static void
3604
c_parser_label (c_parser *parser)
3605
{
3606
  location_t loc1 = c_parser_peek_token (parser)->location;
3607
  tree label = NULL_TREE;
3608
  if (c_parser_next_token_is_keyword (parser, RID_CASE))
3609
    {
3610
      tree exp1, exp2;
3611
      c_parser_consume_token (parser);
3612
      exp1 = c_parser_expr_no_commas (parser, NULL).value;
3613
      if (c_parser_next_token_is (parser, CPP_COLON))
3614
        {
3615
          c_parser_consume_token (parser);
3616
          label = do_case (loc1, exp1, NULL_TREE);
3617
        }
3618
      else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
3619
        {
3620
          c_parser_consume_token (parser);
3621
          exp2 = c_parser_expr_no_commas (parser, NULL).value;
3622
          if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3623
            label = do_case (loc1, exp1, exp2);
3624
        }
3625
      else
3626
        c_parser_error (parser, "expected %<:%> or %<...%>");
3627
    }
3628
  else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
3629
    {
3630
      c_parser_consume_token (parser);
3631
      if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
3632
        label = do_case (loc1, NULL_TREE, NULL_TREE);
3633
    }
3634
  else
3635
    {
3636
      tree name = c_parser_peek_token (parser)->value;
3637
      tree tlab;
3638
      tree attrs;
3639
      location_t loc2 = c_parser_peek_token (parser)->location;
3640
      gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
3641
      c_parser_consume_token (parser);
3642
      gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
3643
      c_parser_consume_token (parser);
3644
      attrs = c_parser_attributes (parser);
3645
      tlab = define_label (loc2, name);
3646
      if (tlab)
3647
        {
3648
          decl_attributes (&tlab, attrs, 0);
3649
          label = add_stmt (build_stmt (loc1, LABEL_EXPR, tlab));
3650
        }
3651
    }
3652
  if (label)
3653
    {
3654
      if (c_parser_next_token_starts_declspecs (parser)
3655
          && !(c_parser_next_token_is (parser, CPP_NAME)
3656
               && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3657
        {
3658
          error_at (c_parser_peek_token (parser)->location,
3659
                    "a label can only be part of a statement and "
3660
                    "a declaration is not a statement");
3661
          c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false,
3662
                                         /*nested*/ true, /*empty_ok*/ false,
3663
                                         /*start_attr_ok*/ true);
3664
        }
3665
    }
3666
}
3667
 
3668
/* Parse a statement (C90 6.6, C99 6.8).
3669
 
3670
   statement:
3671
     labeled-statement
3672
     compound-statement
3673
     expression-statement
3674
     selection-statement
3675
     iteration-statement
3676
     jump-statement
3677
 
3678
   labeled-statement:
3679
     label statement
3680
 
3681
   expression-statement:
3682
     expression[opt] ;
3683
 
3684
   selection-statement:
3685
     if-statement
3686
     switch-statement
3687
 
3688
   iteration-statement:
3689
     while-statement
3690
     do-statement
3691
     for-statement
3692
 
3693
   jump-statement:
3694
     goto identifier ;
3695
     continue ;
3696
     break ;
3697
     return expression[opt] ;
3698
 
3699
   GNU extensions:
3700
 
3701
   statement:
3702
     asm-statement
3703
 
3704
   jump-statement:
3705
     goto * expression ;
3706
 
3707
   Objective-C:
3708
 
3709
   statement:
3710
     objc-throw-statement
3711
     objc-try-catch-statement
3712
     objc-synchronized-statement
3713
 
3714
   objc-throw-statement:
3715
     @throw expression ;
3716
     @throw ;
3717
 
3718
   OpenMP:
3719
 
3720
   statement:
3721
     openmp-construct
3722
 
3723
   openmp-construct:
3724
     parallel-construct
3725
     for-construct
3726
     sections-construct
3727
     single-construct
3728
     parallel-for-construct
3729
     parallel-sections-construct
3730
     master-construct
3731
     critical-construct
3732
     atomic-construct
3733
     ordered-construct
3734
 
3735
   parallel-construct:
3736
     parallel-directive structured-block
3737
 
3738
   for-construct:
3739
     for-directive iteration-statement
3740
 
3741
   sections-construct:
3742
     sections-directive section-scope
3743
 
3744
   single-construct:
3745
     single-directive structured-block
3746
 
3747
   parallel-for-construct:
3748
     parallel-for-directive iteration-statement
3749
 
3750
   parallel-sections-construct:
3751
     parallel-sections-directive section-scope
3752
 
3753
   master-construct:
3754
     master-directive structured-block
3755
 
3756
   critical-construct:
3757
     critical-directive structured-block
3758
 
3759
   atomic-construct:
3760
     atomic-directive expression-statement
3761
 
3762
   ordered-construct:
3763
     ordered-directive structured-block  */
3764
 
3765
static void
3766
c_parser_statement (c_parser *parser)
3767
{
3768
  while (c_parser_next_token_is_keyword (parser, RID_CASE)
3769
         || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3770
         || (c_parser_next_token_is (parser, CPP_NAME)
3771
             && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3772
    c_parser_label (parser);
3773
  c_parser_statement_after_labels (parser);
3774
}
3775
 
3776
/* Parse a statement, other than a labeled statement.  */
3777
 
3778
static void
3779
c_parser_statement_after_labels (c_parser *parser)
3780
{
3781
  location_t loc = c_parser_peek_token (parser)->location;
3782
  tree stmt = NULL_TREE;
3783
  bool in_if_block = parser->in_if_block;
3784
  parser->in_if_block = false;
3785
  switch (c_parser_peek_token (parser)->type)
3786
    {
3787
    case CPP_OPEN_BRACE:
3788
      add_stmt (c_parser_compound_statement (parser));
3789
      break;
3790
    case CPP_KEYWORD:
3791
      switch (c_parser_peek_token (parser)->keyword)
3792
        {
3793
        case RID_IF:
3794
          c_parser_if_statement (parser);
3795
          break;
3796
        case RID_SWITCH:
3797
          c_parser_switch_statement (parser);
3798
          break;
3799
        case RID_WHILE:
3800
          c_parser_while_statement (parser);
3801
          break;
3802
        case RID_DO:
3803
          c_parser_do_statement (parser);
3804
          break;
3805
        case RID_FOR:
3806
          c_parser_for_statement (parser);
3807
          break;
3808
        case RID_GOTO:
3809
          c_parser_consume_token (parser);
3810
          if (c_parser_next_token_is (parser, CPP_NAME))
3811
            {
3812
              stmt = c_finish_goto_label (loc,
3813
                                          c_parser_peek_token (parser)->value);
3814
              c_parser_consume_token (parser);
3815
            }
3816
          else if (c_parser_next_token_is (parser, CPP_MULT))
3817
            {
3818
              c_parser_consume_token (parser);
3819
              stmt = c_finish_goto_ptr (loc,
3820
                                        c_parser_expression (parser).value);
3821
            }
3822
          else
3823
            c_parser_error (parser, "expected identifier or %<*%>");
3824
          goto expect_semicolon;
3825
        case RID_CONTINUE:
3826
          c_parser_consume_token (parser);
3827
          stmt = c_finish_bc_stmt (loc, &c_cont_label, false);
3828
          goto expect_semicolon;
3829
        case RID_BREAK:
3830
          c_parser_consume_token (parser);
3831
          stmt = c_finish_bc_stmt (loc, &c_break_label, true);
3832
          goto expect_semicolon;
3833
        case RID_RETURN:
3834
          c_parser_consume_token (parser);
3835
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3836
            {
3837
              stmt = c_finish_return (loc, NULL_TREE, NULL_TREE);
3838
              c_parser_consume_token (parser);
3839
            }
3840
          else
3841
            {
3842
              struct c_expr expr = c_parser_expression_conv (parser);
3843
              stmt = c_finish_return (loc, expr.value, expr.original_type);
3844
              goto expect_semicolon;
3845
            }
3846
          break;
3847
        case RID_ASM:
3848
          stmt = c_parser_asm_statement (parser);
3849
          break;
3850
        case RID_THROW:
3851
          gcc_assert (c_dialect_objc ());
3852
          c_parser_consume_token (parser);
3853
          if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3854
            {
3855
              stmt = objc_build_throw_stmt (loc, NULL_TREE);
3856
              c_parser_consume_token (parser);
3857
            }
3858
          else
3859
            {
3860
              tree expr = c_parser_expression (parser).value;
3861
              expr = c_fully_fold (expr, false, NULL);
3862
              stmt = objc_build_throw_stmt (loc, expr);
3863
              goto expect_semicolon;
3864
            }
3865
          break;
3866
        case RID_TRY:
3867
          gcc_assert (c_dialect_objc ());
3868
          c_parser_objc_try_catch_statement (parser);
3869
          break;
3870
        case RID_AT_SYNCHRONIZED:
3871
          gcc_assert (c_dialect_objc ());
3872
          c_parser_objc_synchronized_statement (parser);
3873
          break;
3874
        default:
3875
          goto expr_stmt;
3876
        }
3877
      break;
3878
    case CPP_SEMICOLON:
3879
      c_parser_consume_token (parser);
3880
      break;
3881
    case CPP_CLOSE_PAREN:
3882
    case CPP_CLOSE_SQUARE:
3883
      /* Avoid infinite loop in error recovery:
3884
         c_parser_skip_until_found stops at a closing nesting
3885
         delimiter without consuming it, but here we need to consume
3886
         it to proceed further.  */
3887
      c_parser_error (parser, "expected statement");
3888
      c_parser_consume_token (parser);
3889
      break;
3890
    case CPP_PRAGMA:
3891
      c_parser_pragma (parser, pragma_stmt);
3892
      break;
3893
    default:
3894
    expr_stmt:
3895
      stmt = c_finish_expr_stmt (loc, c_parser_expression_conv (parser).value);
3896
    expect_semicolon:
3897
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
3898
      break;
3899
    }
3900
  /* Two cases cannot and do not have line numbers associated: If stmt
3901
     is degenerate, such as "2;", then stmt is an INTEGER_CST, which
3902
     cannot hold line numbers.  But that's OK because the statement
3903
     will either be changed to a MODIFY_EXPR during gimplification of
3904
     the statement expr, or discarded.  If stmt was compound, but
3905
     without new variables, we will have skipped the creation of a
3906
     BIND and will have a bare STATEMENT_LIST.  But that's OK because
3907
     (recursively) all of the component statements should already have
3908
     line numbers assigned.  ??? Can we discard no-op statements
3909
     earlier?  */
3910
  if (CAN_HAVE_LOCATION_P (stmt)
3911
      && EXPR_LOCATION (stmt) == UNKNOWN_LOCATION)
3912
    SET_EXPR_LOCATION (stmt, loc);
3913
 
3914
  parser->in_if_block = in_if_block;
3915
}
3916
 
3917
/* Parse the condition from an if, do, while or for statements.  */
3918
 
3919
static tree
3920
c_parser_condition (c_parser *parser)
3921
{
3922
  location_t loc = c_parser_peek_token (parser)->location;
3923
  tree cond;
3924
  cond = c_parser_expression_conv (parser).value;
3925
  cond = c_objc_common_truthvalue_conversion (loc, cond);
3926
  cond = c_fully_fold (cond, false, NULL);
3927
  if (warn_sequence_point)
3928
    verify_sequence_points (cond);
3929
  return cond;
3930
}
3931
 
3932
/* Parse a parenthesized condition from an if, do or while statement.
3933
 
3934
   condition:
3935
     ( expression )
3936
*/
3937
static tree
3938
c_parser_paren_condition (c_parser *parser)
3939
{
3940
  tree cond;
3941
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
3942
    return error_mark_node;
3943
  cond = c_parser_condition (parser);
3944
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
3945
  return cond;
3946
}
3947
 
3948
/* Parse a statement which is a block in C99.  */
3949
 
3950
static tree
3951
c_parser_c99_block_statement (c_parser *parser)
3952
{
3953
  tree block = c_begin_compound_stmt (flag_isoc99);
3954
  location_t loc = c_parser_peek_token (parser)->location;
3955
  c_parser_statement (parser);
3956
  return c_end_compound_stmt (loc, block, flag_isoc99);
3957
}
3958
 
3959
/* Parse the body of an if statement.  This is just parsing a
3960
   statement but (a) it is a block in C99, (b) we track whether the
3961
   body is an if statement for the sake of -Wparentheses warnings, (c)
3962
   we handle an empty body specially for the sake of -Wempty-body
3963
   warnings, and (d) we call parser_compound_statement directly
3964
   because c_parser_statement_after_labels resets
3965
   parser->in_if_block.  */
3966
 
3967
static tree
3968
c_parser_if_body (c_parser *parser, bool *if_p)
3969
{
3970
  tree block = c_begin_compound_stmt (flag_isoc99);
3971
  location_t body_loc = c_parser_peek_token (parser)->location;
3972
  while (c_parser_next_token_is_keyword (parser, RID_CASE)
3973
         || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
3974
         || (c_parser_next_token_is (parser, CPP_NAME)
3975
             && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
3976
    c_parser_label (parser);
3977
  *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
3978
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
3979
    {
3980
      location_t loc = c_parser_peek_token (parser)->location;
3981
      add_stmt (build_empty_stmt (loc));
3982
      c_parser_consume_token (parser);
3983
      if (!c_parser_next_token_is_keyword (parser, RID_ELSE))
3984
        warning_at (loc, OPT_Wempty_body,
3985
                    "suggest braces around empty body in an %<if%> statement");
3986
    }
3987
  else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
3988
    add_stmt (c_parser_compound_statement (parser));
3989
  else
3990
    c_parser_statement_after_labels (parser);
3991
  return c_end_compound_stmt (body_loc, block, flag_isoc99);
3992
}
3993
 
3994
/* Parse the else body of an if statement.  This is just parsing a
3995
   statement but (a) it is a block in C99, (b) we handle an empty body
3996
   specially for the sake of -Wempty-body warnings.  */
3997
 
3998
static tree
3999
c_parser_else_body (c_parser *parser)
4000
{
4001
  location_t else_loc = c_parser_peek_token (parser)->location;
4002
  tree block = c_begin_compound_stmt (flag_isoc99);
4003
  while (c_parser_next_token_is_keyword (parser, RID_CASE)
4004
         || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
4005
         || (c_parser_next_token_is (parser, CPP_NAME)
4006
             && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
4007
    c_parser_label (parser);
4008
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4009
    {
4010
      location_t loc = c_parser_peek_token (parser)->location;
4011
      warning_at (loc,
4012
                  OPT_Wempty_body,
4013
                 "suggest braces around empty body in an %<else%> statement");
4014
      add_stmt (build_empty_stmt (loc));
4015
      c_parser_consume_token (parser);
4016
    }
4017
  else
4018
    c_parser_statement_after_labels (parser);
4019
  return c_end_compound_stmt (else_loc, block, flag_isoc99);
4020
}
4021
 
4022
/* Parse an if statement (C90 6.6.4, C99 6.8.4).
4023
 
4024
   if-statement:
4025
     if ( expression ) statement
4026
     if ( expression ) statement else statement
4027
*/
4028
 
4029
static void
4030
c_parser_if_statement (c_parser *parser)
4031
{
4032
  tree block;
4033
  location_t loc;
4034
  tree cond;
4035
  bool first_if = false;
4036
  tree first_body, second_body;
4037
  bool in_if_block;
4038
 
4039
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
4040
  c_parser_consume_token (parser);
4041
  block = c_begin_compound_stmt (flag_isoc99);
4042
  loc = c_parser_peek_token (parser)->location;
4043
  cond = c_parser_paren_condition (parser);
4044
  in_if_block = parser->in_if_block;
4045
  parser->in_if_block = true;
4046
  first_body = c_parser_if_body (parser, &first_if);
4047
  parser->in_if_block = in_if_block;
4048
  if (c_parser_next_token_is_keyword (parser, RID_ELSE))
4049
    {
4050
      c_parser_consume_token (parser);
4051
      second_body = c_parser_else_body (parser);
4052
    }
4053
  else
4054
    second_body = NULL_TREE;
4055
  c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
4056
  add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4057
}
4058
 
4059
/* Parse a switch statement (C90 6.6.4, C99 6.8.4).
4060
 
4061
   switch-statement:
4062
     switch (expression) statement
4063
*/
4064
 
4065
static void
4066
c_parser_switch_statement (c_parser *parser)
4067
{
4068
  tree block, expr, body, save_break;
4069
  location_t switch_loc = c_parser_peek_token (parser)->location;
4070
  location_t switch_cond_loc;
4071
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
4072
  c_parser_consume_token (parser);
4073
  block = c_begin_compound_stmt (flag_isoc99);
4074
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4075
    {
4076
      switch_cond_loc = c_parser_peek_token (parser)->location;
4077
      expr = c_parser_expression (parser).value;
4078
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4079
    }
4080
  else
4081
    {
4082
      switch_cond_loc = UNKNOWN_LOCATION;
4083
      expr = error_mark_node;
4084
    }
4085
  c_start_case (switch_loc, switch_cond_loc, expr);
4086
  save_break = c_break_label;
4087
  c_break_label = NULL_TREE;
4088
  body = c_parser_c99_block_statement (parser);
4089
  c_finish_case (body);
4090
  if (c_break_label)
4091
    {
4092
      location_t here = c_parser_peek_token (parser)->location;
4093
      tree t = build1 (LABEL_EXPR, void_type_node, c_break_label);
4094
      SET_EXPR_LOCATION (t, here);
4095
      add_stmt (t);
4096
    }
4097
  c_break_label = save_break;
4098
  add_stmt (c_end_compound_stmt (switch_loc, block, flag_isoc99));
4099
}
4100
 
4101
/* Parse a while statement (C90 6.6.5, C99 6.8.5).
4102
 
4103
   while-statement:
4104
      while (expression) statement
4105
*/
4106
 
4107
static void
4108
c_parser_while_statement (c_parser *parser)
4109
{
4110
  tree block, cond, body, save_break, save_cont;
4111
  location_t loc;
4112
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
4113
  c_parser_consume_token (parser);
4114
  block = c_begin_compound_stmt (flag_isoc99);
4115
  loc = c_parser_peek_token (parser)->location;
4116
  cond = c_parser_paren_condition (parser);
4117
  save_break = c_break_label;
4118
  c_break_label = NULL_TREE;
4119
  save_cont = c_cont_label;
4120
  c_cont_label = NULL_TREE;
4121
  body = c_parser_c99_block_statement (parser);
4122
  c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
4123
  add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4124
  c_break_label = save_break;
4125
  c_cont_label = save_cont;
4126
}
4127
 
4128
/* Parse a do statement (C90 6.6.5, C99 6.8.5).
4129
 
4130
   do-statement:
4131
     do statement while ( expression ) ;
4132
*/
4133
 
4134
static void
4135
c_parser_do_statement (c_parser *parser)
4136
{
4137
  tree block, cond, body, save_break, save_cont, new_break, new_cont;
4138
  location_t loc;
4139
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
4140
  c_parser_consume_token (parser);
4141
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4142
    warning_at (c_parser_peek_token (parser)->location,
4143
                OPT_Wempty_body,
4144
                "suggest braces around empty body in %<do%> statement");
4145
  block = c_begin_compound_stmt (flag_isoc99);
4146
  loc = c_parser_peek_token (parser)->location;
4147
  save_break = c_break_label;
4148
  c_break_label = NULL_TREE;
4149
  save_cont = c_cont_label;
4150
  c_cont_label = NULL_TREE;
4151
  body = c_parser_c99_block_statement (parser);
4152
  c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
4153
  new_break = c_break_label;
4154
  c_break_label = save_break;
4155
  new_cont = c_cont_label;
4156
  c_cont_label = save_cont;
4157
  cond = c_parser_paren_condition (parser);
4158
  if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4159
    c_parser_skip_to_end_of_block_or_statement (parser);
4160
  c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
4161
  add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4162
}
4163
 
4164
/* Parse a for statement (C90 6.6.5, C99 6.8.5).
4165
 
4166
   for-statement:
4167
     for ( expression[opt] ; expression[opt] ; expression[opt] ) statement
4168
     for ( nested-declaration expression[opt] ; expression[opt] ) statement
4169
 
4170
   The form with a declaration is new in C99.
4171
 
4172
   ??? In accordance with the old parser, the declaration may be a
4173
   nested function, which is then rejected in check_for_loop_decls,
4174
   but does it make any sense for this to be included in the grammar?
4175
   Note in particular that the nested function does not include a
4176
   trailing ';', whereas the "declaration" production includes one.
4177
   Also, can we reject bad declarations earlier and cheaper than
4178
   check_for_loop_decls?  */
4179
 
4180
static void
4181
c_parser_for_statement (c_parser *parser)
4182
{
4183
  tree block, cond, incr, save_break, save_cont, body;
4184
  location_t loc = c_parser_peek_token (parser)->location;
4185
  location_t for_loc = c_parser_peek_token (parser)->location;
4186
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
4187
  c_parser_consume_token (parser);
4188
  block = c_begin_compound_stmt (flag_isoc99);
4189
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4190
    {
4191
      /* Parse the initialization declaration or expression.  */
4192
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4193
        {
4194
          c_parser_consume_token (parser);
4195
          c_finish_expr_stmt (loc, NULL_TREE);
4196
        }
4197
      else if (c_parser_next_token_starts_declspecs (parser))
4198
        {
4199
          c_parser_declaration_or_fndef (parser, true, true, true, true);
4200
          check_for_loop_decls (for_loc);
4201
        }
4202
      else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
4203
        {
4204
          /* __extension__ can start a declaration, but is also an
4205
             unary operator that can start an expression.  Consume all
4206
             but the last of a possible series of __extension__ to
4207
             determine which.  */
4208
          while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
4209
                 && (c_parser_peek_2nd_token (parser)->keyword
4210
                     == RID_EXTENSION))
4211
            c_parser_consume_token (parser);
4212
          if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
4213
            {
4214
              int ext;
4215
              ext = disable_extension_diagnostics ();
4216
              c_parser_consume_token (parser);
4217
              c_parser_declaration_or_fndef (parser, true, true, true, true);
4218
              restore_extension_diagnostics (ext);
4219
              check_for_loop_decls (for_loc);
4220
            }
4221
          else
4222
            goto init_expr;
4223
        }
4224
      else
4225
        {
4226
        init_expr:
4227
          c_finish_expr_stmt (loc, c_parser_expression (parser).value);
4228
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4229
        }
4230
      /* Parse the loop condition.  */
4231
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
4232
        {
4233
          c_parser_consume_token (parser);
4234
          cond = NULL_TREE;
4235
        }
4236
      else
4237
        {
4238
          cond = c_parser_condition (parser);
4239
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
4240
        }
4241
      /* Parse the increment expression.  */
4242
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4243
        incr = c_process_expr_stmt (loc, NULL_TREE);
4244
      else
4245
        incr = c_process_expr_stmt (loc, c_parser_expression (parser).value);
4246
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
4247
    }
4248
  else
4249
    {
4250
      cond = error_mark_node;
4251
      incr = error_mark_node;
4252
    }
4253
  save_break = c_break_label;
4254
  c_break_label = NULL_TREE;
4255
  save_cont = c_cont_label;
4256
  c_cont_label = NULL_TREE;
4257
  body = c_parser_c99_block_statement (parser);
4258
  c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
4259
  add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
4260
  c_break_label = save_break;
4261
  c_cont_label = save_cont;
4262
}
4263
 
4264
/* Parse an asm statement, a GNU extension.  This is a full-blown asm
4265
   statement with inputs, outputs, clobbers, and volatile tag
4266
   allowed.
4267
 
4268
   asm-statement:
4269
     asm type-qualifier[opt] ( asm-argument ) ;
4270
     asm type-qualifier[opt] goto ( asm-goto-argument ) ;
4271
 
4272
   asm-argument:
4273
     asm-string-literal
4274
     asm-string-literal : asm-operands[opt]
4275
     asm-string-literal : asm-operands[opt] : asm-operands[opt]
4276
     asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers[opt]
4277
 
4278
   asm-goto-argument:
4279
     asm-string-literal : : asm-operands[opt] : asm-clobbers[opt] \
4280
       : asm-goto-operands
4281
 
4282
   Qualifiers other than volatile are accepted in the syntax but
4283
   warned for.  */
4284
 
4285
static tree
4286
c_parser_asm_statement (c_parser *parser)
4287
{
4288
  tree quals, str, outputs, inputs, clobbers, labels, ret;
4289
  bool simple, is_goto;
4290
  location_t asm_loc = c_parser_peek_token (parser)->location;
4291
  int section, nsections;
4292
 
4293
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
4294
  c_parser_consume_token (parser);
4295
  if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
4296
    {
4297
      quals = c_parser_peek_token (parser)->value;
4298
      c_parser_consume_token (parser);
4299
    }
4300
  else if (c_parser_next_token_is_keyword (parser, RID_CONST)
4301
           || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
4302
    {
4303
      warning_at (c_parser_peek_token (parser)->location,
4304
                  0,
4305
                  "%E qualifier ignored on asm",
4306
                  c_parser_peek_token (parser)->value);
4307
      quals = NULL_TREE;
4308
      c_parser_consume_token (parser);
4309
    }
4310
  else
4311
    quals = NULL_TREE;
4312
 
4313
  is_goto = false;
4314
  if (c_parser_next_token_is_keyword (parser, RID_GOTO))
4315
    {
4316
      c_parser_consume_token (parser);
4317
      is_goto = true;
4318
    }
4319
 
4320
  /* ??? Follow the C++ parser rather than using the
4321
     lex_untranslated_string kludge.  */
4322
  parser->lex_untranslated_string = true;
4323
  ret = NULL;
4324
 
4325
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4326
    goto error;
4327
 
4328
  str = c_parser_asm_string_literal (parser);
4329
  if (str == NULL_TREE)
4330
    goto error_close_paren;
4331
 
4332
  simple = true;
4333
  outputs = NULL_TREE;
4334
  inputs = NULL_TREE;
4335
  clobbers = NULL_TREE;
4336
  labels = NULL_TREE;
4337
 
4338
  if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
4339
    goto done_asm;
4340
 
4341
  /* Parse each colon-delimited section of operands.  */
4342
  nsections = 3 + is_goto;
4343
  for (section = 0; section < nsections; ++section)
4344
    {
4345
      if (!c_parser_require (parser, CPP_COLON,
4346
                             is_goto
4347
                             ? "expected %<:%>"
4348
                             : "expected %<:%> or %<)%>"))
4349
        goto error_close_paren;
4350
 
4351
      /* Once past any colon, we're no longer a simple asm.  */
4352
      simple = false;
4353
 
4354
      if ((!c_parser_next_token_is (parser, CPP_COLON)
4355
           && !c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
4356
          || section == 3)
4357
        switch (section)
4358
          {
4359
          case 0:
4360
            /* For asm goto, we don't allow output operands, but reserve
4361
               the slot for a future extension that does allow them.  */
4362
            if (!is_goto)
4363
              outputs = c_parser_asm_operands (parser, false);
4364
            break;
4365
          case 1:
4366
            inputs = c_parser_asm_operands (parser, true);
4367
            break;
4368
          case 2:
4369
            clobbers = c_parser_asm_clobbers (parser);
4370
            break;
4371
          case 3:
4372
            labels = c_parser_asm_goto_operands (parser);
4373
            break;
4374
          default:
4375
            gcc_unreachable ();
4376
          }
4377
 
4378
      if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN) && !is_goto)
4379
        goto done_asm;
4380
    }
4381
 
4382
 done_asm:
4383
  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4384
    {
4385
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4386
      goto error;
4387
    }
4388
 
4389
  if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
4390
    c_parser_skip_to_end_of_block_or_statement (parser);
4391
 
4392
  ret = build_asm_stmt (quals, build_asm_expr (asm_loc, str, outputs, inputs,
4393
                                               clobbers, labels, simple));
4394
 
4395
 error:
4396
  parser->lex_untranslated_string = false;
4397
  return ret;
4398
 
4399
 error_close_paren:
4400
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4401
  goto error;
4402
}
4403
 
4404
/* Parse asm operands, a GNU extension.  If CONVERT_P (for inputs but
4405
   not outputs), apply the default conversion of functions and arrays
4406
   to pointers.
4407
 
4408
   asm-operands:
4409
     asm-operand
4410
     asm-operands , asm-operand
4411
 
4412
   asm-operand:
4413
     asm-string-literal ( expression )
4414
     [ identifier ] asm-string-literal ( expression )
4415
*/
4416
 
4417
static tree
4418
c_parser_asm_operands (c_parser *parser, bool convert_p)
4419
{
4420
  tree list = NULL_TREE;
4421
  location_t loc;
4422
  while (true)
4423
    {
4424
      tree name, str;
4425
      struct c_expr expr;
4426
      if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
4427
        {
4428
          c_parser_consume_token (parser);
4429
          if (c_parser_next_token_is (parser, CPP_NAME))
4430
            {
4431
              tree id = c_parser_peek_token (parser)->value;
4432
              c_parser_consume_token (parser);
4433
              name = build_string (IDENTIFIER_LENGTH (id),
4434
                                   IDENTIFIER_POINTER (id));
4435
            }
4436
          else
4437
            {
4438
              c_parser_error (parser, "expected identifier");
4439
              c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
4440
              return NULL_TREE;
4441
            }
4442
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
4443
                                     "expected %<]%>");
4444
        }
4445
      else
4446
        name = NULL_TREE;
4447
      str = c_parser_asm_string_literal (parser);
4448
      if (str == NULL_TREE)
4449
        return NULL_TREE;
4450
      parser->lex_untranslated_string = false;
4451
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
4452
        {
4453
          parser->lex_untranslated_string = true;
4454
          return NULL_TREE;
4455
        }
4456
      loc = c_parser_peek_token (parser)->location;
4457
      expr = c_parser_expression (parser);
4458
      if (convert_p)
4459
        expr = default_function_array_conversion (loc, expr);
4460
      expr.value = c_fully_fold (expr.value, false, NULL);
4461
      parser->lex_untranslated_string = true;
4462
      if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
4463
        {
4464
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
4465
          return NULL_TREE;
4466
        }
4467
      list = chainon (list, build_tree_list (build_tree_list (name, str),
4468
                                             expr.value));
4469
      if (c_parser_next_token_is (parser, CPP_COMMA))
4470
        c_parser_consume_token (parser);
4471
      else
4472
        break;
4473
    }
4474
  return list;
4475
}
4476
 
4477
/* Parse asm clobbers, a GNU extension.
4478
 
4479
   asm-clobbers:
4480
     asm-string-literal
4481
     asm-clobbers , asm-string-literal
4482
*/
4483
 
4484
static tree
4485
c_parser_asm_clobbers (c_parser *parser)
4486
{
4487
  tree list = NULL_TREE;
4488
  while (true)
4489
    {
4490
      tree str = c_parser_asm_string_literal (parser);
4491
      if (str)
4492
        list = tree_cons (NULL_TREE, str, list);
4493
      else
4494
        return NULL_TREE;
4495
      if (c_parser_next_token_is (parser, CPP_COMMA))
4496
        c_parser_consume_token (parser);
4497
      else
4498
        break;
4499
    }
4500
  return list;
4501
}
4502
 
4503
/* Parse asm goto labels, a GNU extension.
4504
 
4505
   asm-goto-operands:
4506
     identifier
4507
     asm-goto-operands , identifier
4508
*/
4509
 
4510
static tree
4511
c_parser_asm_goto_operands (c_parser *parser)
4512
{
4513
  tree list = NULL_TREE;
4514
  while (true)
4515
    {
4516
      tree name, label;
4517
 
4518
      if (c_parser_next_token_is (parser, CPP_NAME))
4519
        {
4520
          c_token *tok = c_parser_peek_token (parser);
4521
          name = tok->value;
4522
          label = lookup_label_for_goto (tok->location, name);
4523
          c_parser_consume_token (parser);
4524
          TREE_USED (label) = 1;
4525
        }
4526
      else
4527
        {
4528
          c_parser_error (parser, "expected identifier");
4529
          return NULL_TREE;
4530
        }
4531
 
4532
      name = build_string (IDENTIFIER_LENGTH (name),
4533
                           IDENTIFIER_POINTER (name));
4534
      list = tree_cons (name, label, list);
4535
      if (c_parser_next_token_is (parser, CPP_COMMA))
4536
        c_parser_consume_token (parser);
4537
      else
4538
        return nreverse (list);
4539
    }
4540
}
4541
 
4542
/* Parse an expression other than a compound expression; that is, an
4543
   assignment expression (C90 6.3.16, C99 6.5.16).  If AFTER is not
4544
   NULL then it is an Objective-C message expression which is the
4545
   primary-expression starting the expression as an initializer.
4546
 
4547
   assignment-expression:
4548
     conditional-expression
4549
     unary-expression assignment-operator assignment-expression
4550
 
4551
   assignment-operator: one of
4552
     = *= /= %= += -= <<= >>= &= ^= |=
4553
 
4554
   In GNU C we accept any conditional expression on the LHS and
4555
   diagnose the invalid lvalue rather than producing a syntax
4556
   error.  */
4557
 
4558
static struct c_expr
4559
c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
4560
{
4561
  struct c_expr lhs, rhs, ret;
4562
  enum tree_code code;
4563
  location_t op_location, exp_location;
4564
  gcc_assert (!after || c_dialect_objc ());
4565
  lhs = c_parser_conditional_expression (parser, after);
4566
  op_location = c_parser_peek_token (parser)->location;
4567
  switch (c_parser_peek_token (parser)->type)
4568
    {
4569
    case CPP_EQ:
4570
      code = NOP_EXPR;
4571
      break;
4572
    case CPP_MULT_EQ:
4573
      code = MULT_EXPR;
4574
      break;
4575
    case CPP_DIV_EQ:
4576
      code = TRUNC_DIV_EXPR;
4577
      break;
4578
    case CPP_MOD_EQ:
4579
      code = TRUNC_MOD_EXPR;
4580
      break;
4581
    case CPP_PLUS_EQ:
4582
      code = PLUS_EXPR;
4583
      break;
4584
    case CPP_MINUS_EQ:
4585
      code = MINUS_EXPR;
4586
      break;
4587
    case CPP_LSHIFT_EQ:
4588
      code = LSHIFT_EXPR;
4589
      break;
4590
    case CPP_RSHIFT_EQ:
4591
      code = RSHIFT_EXPR;
4592
      break;
4593
    case CPP_AND_EQ:
4594
      code = BIT_AND_EXPR;
4595
      break;
4596
    case CPP_XOR_EQ:
4597
      code = BIT_XOR_EXPR;
4598
      break;
4599
    case CPP_OR_EQ:
4600
      code = BIT_IOR_EXPR;
4601
      break;
4602
    default:
4603
      return lhs;
4604
    }
4605
  c_parser_consume_token (parser);
4606
  exp_location = c_parser_peek_token (parser)->location;
4607
  rhs = c_parser_expr_no_commas (parser, NULL);
4608
  rhs = default_function_array_conversion (exp_location, rhs);
4609
  ret.value = build_modify_expr (op_location, lhs.value, lhs.original_type,
4610
                                 code, exp_location, rhs.value,
4611
                                 rhs.original_type);
4612
  if (code == NOP_EXPR)
4613
    ret.original_code = MODIFY_EXPR;
4614
  else
4615
    {
4616
      TREE_NO_WARNING (ret.value) = 1;
4617
      ret.original_code = ERROR_MARK;
4618
    }
4619
  ret.original_type = NULL;
4620
  return ret;
4621
}
4622
 
4623
/* Parse a conditional expression (C90 6.3.15, C99 6.5.15).  If AFTER
4624
   is not NULL then it is an Objective-C message expression which is
4625
   the primary-expression starting the expression as an initializer.
4626
 
4627
   conditional-expression:
4628
     logical-OR-expression
4629
     logical-OR-expression ? expression : conditional-expression
4630
 
4631
   GNU extensions:
4632
 
4633
   conditional-expression:
4634
     logical-OR-expression ? : conditional-expression
4635
*/
4636
 
4637
static struct c_expr
4638
c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
4639
{
4640
  struct c_expr cond, exp1, exp2, ret;
4641
  location_t cond_loc, colon_loc;
4642
 
4643
  gcc_assert (!after || c_dialect_objc ());
4644
 
4645
  cond = c_parser_binary_expression (parser, after);
4646
 
4647
  if (c_parser_next_token_is_not (parser, CPP_QUERY))
4648
    return cond;
4649
  cond_loc = c_parser_peek_token (parser)->location;
4650
  cond = default_function_array_conversion (cond_loc, cond);
4651
  c_parser_consume_token (parser);
4652
  if (c_parser_next_token_is (parser, CPP_COLON))
4653
    {
4654
      tree eptype = NULL_TREE;
4655
      pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
4656
               "ISO C forbids omitting the middle term of a ?: expression");
4657
      if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR)
4658
        {
4659
          eptype = TREE_TYPE (cond.value);
4660
          cond.value = TREE_OPERAND (cond.value, 0);
4661
        }
4662
      /* Make sure first operand is calculated only once.  */
4663
      exp1.value = c_save_expr (default_conversion (cond.value));
4664
      if (eptype)
4665
        exp1.value = build1 (EXCESS_PRECISION_EXPR, eptype, exp1.value);
4666
      exp1.original_type = NULL;
4667
      cond.value = c_objc_common_truthvalue_conversion (cond_loc, exp1.value);
4668
      c_inhibit_evaluation_warnings += cond.value == truthvalue_true_node;
4669
    }
4670
  else
4671
    {
4672
      cond.value
4673
        = c_objc_common_truthvalue_conversion
4674
        (cond_loc, default_conversion (cond.value));
4675
      c_inhibit_evaluation_warnings += cond.value == truthvalue_false_node;
4676
      exp1 = c_parser_expression_conv (parser);
4677
      c_inhibit_evaluation_warnings +=
4678
        ((cond.value == truthvalue_true_node)
4679
         - (cond.value == truthvalue_false_node));
4680
    }
4681
 
4682
  colon_loc = c_parser_peek_token (parser)->location;
4683
  if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
4684
    {
4685
      c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
4686
      ret.value = error_mark_node;
4687
      ret.original_code = ERROR_MARK;
4688
      ret.original_type = NULL;
4689
      return ret;
4690
    }
4691
  {
4692
    location_t exp2_loc = c_parser_peek_token (parser)->location;
4693
    exp2 = c_parser_conditional_expression (parser, NULL);
4694
    exp2 = default_function_array_conversion (exp2_loc, exp2);
4695
  }
4696
  c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
4697
  ret.value = build_conditional_expr (colon_loc, cond.value,
4698
                                      cond.original_code == C_MAYBE_CONST_EXPR,
4699
                                      exp1.value, exp1.original_type,
4700
                                      exp2.value, exp2.original_type);
4701
  ret.original_code = ERROR_MARK;
4702
  if (exp1.value == error_mark_node || exp2.value == error_mark_node)
4703
    ret.original_type = NULL;
4704
  else
4705
    {
4706
      tree t1, t2;
4707
 
4708
      /* If both sides are enum type, the default conversion will have
4709
         made the type of the result be an integer type.  We want to
4710
         remember the enum types we started with.  */
4711
      t1 = exp1.original_type ? exp1.original_type : TREE_TYPE (exp1.value);
4712
      t2 = exp2.original_type ? exp2.original_type : TREE_TYPE (exp2.value);
4713
      ret.original_type = ((t1 != error_mark_node
4714
                            && t2 != error_mark_node
4715
                            && (TYPE_MAIN_VARIANT (t1)
4716
                                == TYPE_MAIN_VARIANT (t2)))
4717
                           ? t1
4718
                           : NULL);
4719
    }
4720
  return ret;
4721
}
4722
 
4723
/* Parse a binary expression; that is, a logical-OR-expression (C90
4724
   6.3.5-6.3.14, C99 6.5.5-6.5.14).  If AFTER is not NULL then it is
4725
   an Objective-C message expression which is the primary-expression
4726
   starting the expression as an initializer.
4727
 
4728
   multiplicative-expression:
4729
     cast-expression
4730
     multiplicative-expression * cast-expression
4731
     multiplicative-expression / cast-expression
4732
     multiplicative-expression % cast-expression
4733
 
4734
   additive-expression:
4735
     multiplicative-expression
4736
     additive-expression + multiplicative-expression
4737
     additive-expression - multiplicative-expression
4738
 
4739
   shift-expression:
4740
     additive-expression
4741
     shift-expression << additive-expression
4742
     shift-expression >> additive-expression
4743
 
4744
   relational-expression:
4745
     shift-expression
4746
     relational-expression < shift-expression
4747
     relational-expression > shift-expression
4748
     relational-expression <= shift-expression
4749
     relational-expression >= shift-expression
4750
 
4751
   equality-expression:
4752
     relational-expression
4753
     equality-expression == relational-expression
4754
     equality-expression != relational-expression
4755
 
4756
   AND-expression:
4757
     equality-expression
4758
     AND-expression & equality-expression
4759
 
4760
   exclusive-OR-expression:
4761
     AND-expression
4762
     exclusive-OR-expression ^ AND-expression
4763
 
4764
   inclusive-OR-expression:
4765
     exclusive-OR-expression
4766
     inclusive-OR-expression | exclusive-OR-expression
4767
 
4768
   logical-AND-expression:
4769
     inclusive-OR-expression
4770
     logical-AND-expression && inclusive-OR-expression
4771
 
4772
   logical-OR-expression:
4773
     logical-AND-expression
4774
     logical-OR-expression || logical-AND-expression
4775
*/
4776
 
4777
static struct c_expr
4778
c_parser_binary_expression (c_parser *parser, struct c_expr *after)
4779
{
4780
  /* A binary expression is parsed using operator-precedence parsing,
4781
     with the operands being cast expressions.  All the binary
4782
     operators are left-associative.  Thus a binary expression is of
4783
     form:
4784
 
4785
     E0 op1 E1 op2 E2 ...
4786
 
4787
     which we represent on a stack.  On the stack, the precedence
4788
     levels are strictly increasing.  When a new operator is
4789
     encountered of higher precedence than that at the top of the
4790
     stack, it is pushed; its LHS is the top expression, and its RHS
4791
     is everything parsed until it is popped.  When a new operator is
4792
     encountered with precedence less than or equal to that at the top
4793
     of the stack, triples E[i-1] op[i] E[i] are popped and replaced
4794
     by the result of the operation until the operator at the top of
4795
     the stack has lower precedence than the new operator or there is
4796
     only one element on the stack; then the top expression is the LHS
4797
     of the new operator.  In the case of logical AND and OR
4798
     expressions, we also need to adjust c_inhibit_evaluation_warnings
4799
     as appropriate when the operators are pushed and popped.  */
4800
 
4801
  /* The precedence levels, where 0 is a dummy lowest level used for
4802
     the bottom of the stack.  */
4803
  enum prec {
4804
    PREC_NONE,
4805
    PREC_LOGOR,
4806
    PREC_LOGAND,
4807
    PREC_BITOR,
4808
    PREC_BITXOR,
4809
    PREC_BITAND,
4810
    PREC_EQ,
4811
    PREC_REL,
4812
    PREC_SHIFT,
4813
    PREC_ADD,
4814
    PREC_MULT,
4815
    NUM_PRECS
4816
  };
4817
  struct {
4818
    /* The expression at this stack level.  */
4819
    struct c_expr expr;
4820
    /* The precedence of the operator on its left, PREC_NONE at the
4821
       bottom of the stack.  */
4822
    enum prec prec;
4823
    /* The operation on its left.  */
4824
    enum tree_code op;
4825
    /* The source location of this operation.  */
4826
    location_t loc;
4827
  } stack[NUM_PRECS];
4828
  int sp;
4829
  /* Location of the binary operator.  */
4830
  location_t binary_loc = UNKNOWN_LOCATION;  /* Quiet warning.  */
4831
#define POP                                                                   \
4832
  do {                                                                        \
4833
    switch (stack[sp].op)                                                     \
4834
      {                                                                       \
4835
      case TRUTH_ANDIF_EXPR:                                                  \
4836
        c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value            \
4837
                                          == truthvalue_false_node);          \
4838
        break;                                                                \
4839
      case TRUTH_ORIF_EXPR:                                                   \
4840
        c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value            \
4841
                                          == truthvalue_true_node);           \
4842
        break;                                                                \
4843
      default:                                                                \
4844
        break;                                                                \
4845
      }                                                                       \
4846
    stack[sp - 1].expr                                                        \
4847
      = default_function_array_conversion (stack[sp - 1].loc,                 \
4848
                                           stack[sp - 1].expr);               \
4849
    stack[sp].expr                                                            \
4850
      = default_function_array_conversion (stack[sp].loc, stack[sp].expr);    \
4851
    stack[sp - 1].expr = parser_build_binary_op (stack[sp].loc,               \
4852
                                                 stack[sp].op,                \
4853
                                                 stack[sp - 1].expr,          \
4854
                                                 stack[sp].expr);             \
4855
    sp--;                                                                     \
4856
  } while (0)
4857
  gcc_assert (!after || c_dialect_objc ());
4858
  stack[0].loc = c_parser_peek_token (parser)->location;
4859
  stack[0].expr = c_parser_cast_expression (parser, after);
4860
  stack[0].prec = PREC_NONE;
4861
  sp = 0;
4862
  while (true)
4863
    {
4864
      enum prec oprec;
4865
      enum tree_code ocode;
4866
      if (parser->error)
4867
        goto out;
4868
      switch (c_parser_peek_token (parser)->type)
4869
        {
4870
        case CPP_MULT:
4871
          oprec = PREC_MULT;
4872
          ocode = MULT_EXPR;
4873
          break;
4874
        case CPP_DIV:
4875
          oprec = PREC_MULT;
4876
          ocode = TRUNC_DIV_EXPR;
4877
          break;
4878
        case CPP_MOD:
4879
          oprec = PREC_MULT;
4880
          ocode = TRUNC_MOD_EXPR;
4881
          break;
4882
        case CPP_PLUS:
4883
          oprec = PREC_ADD;
4884
          ocode = PLUS_EXPR;
4885
          break;
4886
        case CPP_MINUS:
4887
          oprec = PREC_ADD;
4888
          ocode = MINUS_EXPR;
4889
          break;
4890
        case CPP_LSHIFT:
4891
          oprec = PREC_SHIFT;
4892
          ocode = LSHIFT_EXPR;
4893
          break;
4894
        case CPP_RSHIFT:
4895
          oprec = PREC_SHIFT;
4896
          ocode = RSHIFT_EXPR;
4897
          break;
4898
        case CPP_LESS:
4899
          oprec = PREC_REL;
4900
          ocode = LT_EXPR;
4901
          break;
4902
        case CPP_GREATER:
4903
          oprec = PREC_REL;
4904
          ocode = GT_EXPR;
4905
          break;
4906
        case CPP_LESS_EQ:
4907
          oprec = PREC_REL;
4908
          ocode = LE_EXPR;
4909
          break;
4910
        case CPP_GREATER_EQ:
4911
          oprec = PREC_REL;
4912
          ocode = GE_EXPR;
4913
          break;
4914
        case CPP_EQ_EQ:
4915
          oprec = PREC_EQ;
4916
          ocode = EQ_EXPR;
4917
          break;
4918
        case CPP_NOT_EQ:
4919
          oprec = PREC_EQ;
4920
          ocode = NE_EXPR;
4921
          break;
4922
        case CPP_AND:
4923
          oprec = PREC_BITAND;
4924
          ocode = BIT_AND_EXPR;
4925
          break;
4926
        case CPP_XOR:
4927
          oprec = PREC_BITXOR;
4928
          ocode = BIT_XOR_EXPR;
4929
          break;
4930
        case CPP_OR:
4931
          oprec = PREC_BITOR;
4932
          ocode = BIT_IOR_EXPR;
4933
          break;
4934
        case CPP_AND_AND:
4935
          oprec = PREC_LOGAND;
4936
          ocode = TRUTH_ANDIF_EXPR;
4937
          break;
4938
        case CPP_OR_OR:
4939
          oprec = PREC_LOGOR;
4940
          ocode = TRUTH_ORIF_EXPR;
4941
          break;
4942
        default:
4943
          /* Not a binary operator, so end of the binary
4944
             expression.  */
4945
          goto out;
4946
        }
4947
      binary_loc = c_parser_peek_token (parser)->location;
4948
      c_parser_consume_token (parser);
4949
      while (oprec <= stack[sp].prec)
4950
        POP;
4951
      switch (ocode)
4952
        {
4953
        case TRUTH_ANDIF_EXPR:
4954
          stack[sp].expr
4955
            = default_function_array_conversion (stack[sp].loc,
4956
                                                 stack[sp].expr);
4957
          stack[sp].expr.value = c_objc_common_truthvalue_conversion
4958
            (stack[sp].loc, default_conversion (stack[sp].expr.value));
4959
          c_inhibit_evaluation_warnings += (stack[sp].expr.value
4960
                                            == truthvalue_false_node);
4961
          break;
4962
        case TRUTH_ORIF_EXPR:
4963
          stack[sp].expr
4964
            = default_function_array_conversion (stack[sp].loc,
4965
                                                 stack[sp].expr);
4966
          stack[sp].expr.value = c_objc_common_truthvalue_conversion
4967
            (stack[sp].loc, default_conversion (stack[sp].expr.value));
4968
          c_inhibit_evaluation_warnings += (stack[sp].expr.value
4969
                                            == truthvalue_true_node);
4970
          break;
4971
        default:
4972
          break;
4973
        }
4974
      sp++;
4975
      stack[sp].loc = binary_loc;
4976
      stack[sp].expr = c_parser_cast_expression (parser, NULL);
4977
      stack[sp].prec = oprec;
4978
      stack[sp].op = ocode;
4979
      stack[sp].loc = binary_loc;
4980
    }
4981
 out:
4982
  while (sp > 0)
4983
    POP;
4984
  return stack[0].expr;
4985
#undef POP
4986
}
4987
 
4988
/* Parse a cast expression (C90 6.3.4, C99 6.5.4).  If AFTER is not
4989
   NULL then it is an Objective-C message expression which is the
4990
   primary-expression starting the expression as an initializer.
4991
 
4992
   cast-expression:
4993
     unary-expression
4994
     ( type-name ) unary-expression
4995
*/
4996
 
4997
static struct c_expr
4998
c_parser_cast_expression (c_parser *parser, struct c_expr *after)
4999
{
5000
  location_t cast_loc = c_parser_peek_token (parser)->location;
5001
  gcc_assert (!after || c_dialect_objc ());
5002
  if (after)
5003
    return c_parser_postfix_expression_after_primary (parser,
5004
                                                      cast_loc, *after);
5005
  /* If the expression begins with a parenthesized type name, it may
5006
     be either a cast or a compound literal; we need to see whether
5007
     the next character is '{' to tell the difference.  If not, it is
5008
     an unary expression.  */
5009
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5010
      && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5011
    {
5012
      struct c_type_name *type_name;
5013
      struct c_expr ret;
5014
      struct c_expr expr;
5015
      c_parser_consume_token (parser);
5016
      type_name = c_parser_type_name (parser);
5017
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5018
      if (type_name == NULL)
5019
        {
5020
          ret.value = error_mark_node;
5021
          ret.original_code = ERROR_MARK;
5022
          ret.original_type = NULL;
5023
          return ret;
5024
        }
5025
 
5026
      /* Save casted types in the function's used types hash table.  */
5027
      used_types_insert (type_name->specs->type);
5028
 
5029
      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5030
        return c_parser_postfix_expression_after_paren_type (parser, type_name,
5031
                                                             cast_loc);
5032
      {
5033
        location_t expr_loc = c_parser_peek_token (parser)->location;
5034
        expr = c_parser_cast_expression (parser, NULL);
5035
        expr = default_function_array_conversion (expr_loc, expr);
5036
      }
5037
      ret.value = c_cast_expr (cast_loc, type_name, expr.value);
5038
      ret.original_code = ERROR_MARK;
5039
      ret.original_type = NULL;
5040
      return ret;
5041
    }
5042
  else
5043
    return c_parser_unary_expression (parser);
5044
}
5045
 
5046
/* Parse an unary expression (C90 6.3.3, C99 6.5.3).
5047
 
5048
   unary-expression:
5049
     postfix-expression
5050
     ++ unary-expression
5051
     -- unary-expression
5052
     unary-operator cast-expression
5053
     sizeof unary-expression
5054
     sizeof ( type-name )
5055
 
5056
   unary-operator: one of
5057
     & * + - ~ !
5058
 
5059
   GNU extensions:
5060
 
5061
   unary-expression:
5062
     __alignof__ unary-expression
5063
     __alignof__ ( type-name )
5064
     && identifier
5065
 
5066
   unary-operator: one of
5067
     __extension__ __real__ __imag__
5068
 
5069
   In addition, the GNU syntax treats ++ and -- as unary operators, so
5070
   they may be applied to cast expressions with errors for non-lvalues
5071
   given later.  */
5072
 
5073
static struct c_expr
5074
c_parser_unary_expression (c_parser *parser)
5075
{
5076
  int ext;
5077
  struct c_expr ret, op;
5078
  location_t op_loc = c_parser_peek_token (parser)->location;
5079
  location_t exp_loc;
5080
  ret.original_code = ERROR_MARK;
5081
  ret.original_type = NULL;
5082
  switch (c_parser_peek_token (parser)->type)
5083
    {
5084
    case CPP_PLUS_PLUS:
5085
      c_parser_consume_token (parser);
5086
      exp_loc = c_parser_peek_token (parser)->location;
5087
      op = c_parser_cast_expression (parser, NULL);
5088
      op = default_function_array_conversion (exp_loc, op);
5089
      return parser_build_unary_op (op_loc, PREINCREMENT_EXPR, op);
5090
    case CPP_MINUS_MINUS:
5091
      c_parser_consume_token (parser);
5092
      exp_loc = c_parser_peek_token (parser)->location;
5093
      op = c_parser_cast_expression (parser, NULL);
5094
      op = default_function_array_conversion (exp_loc, op);
5095
      return parser_build_unary_op (op_loc, PREDECREMENT_EXPR, op);
5096
    case CPP_AND:
5097
      c_parser_consume_token (parser);
5098
      return parser_build_unary_op (op_loc, ADDR_EXPR,
5099
                                    c_parser_cast_expression (parser, NULL));
5100
    case CPP_MULT:
5101
      c_parser_consume_token (parser);
5102
      exp_loc = c_parser_peek_token (parser)->location;
5103
      op = c_parser_cast_expression (parser, NULL);
5104
      op = default_function_array_conversion (exp_loc, op);
5105
      ret.value = build_indirect_ref (op_loc, op.value, RO_UNARY_STAR);
5106
      return ret;
5107
    case CPP_PLUS:
5108
      if (!c_dialect_objc () && !in_system_header)
5109
        warning_at (op_loc,
5110
                    OPT_Wtraditional,
5111
                    "traditional C rejects the unary plus operator");
5112
      c_parser_consume_token (parser);
5113
      exp_loc = c_parser_peek_token (parser)->location;
5114
      op = c_parser_cast_expression (parser, NULL);
5115
      op = default_function_array_conversion (exp_loc, op);
5116
      return parser_build_unary_op (op_loc, CONVERT_EXPR, op);
5117
    case CPP_MINUS:
5118
      c_parser_consume_token (parser);
5119
      exp_loc = c_parser_peek_token (parser)->location;
5120
      op = c_parser_cast_expression (parser, NULL);
5121
      op = default_function_array_conversion (exp_loc, op);
5122
      return parser_build_unary_op (op_loc, NEGATE_EXPR, op);
5123
    case CPP_COMPL:
5124
      c_parser_consume_token (parser);
5125
      exp_loc = c_parser_peek_token (parser)->location;
5126
      op = c_parser_cast_expression (parser, NULL);
5127
      op = default_function_array_conversion (exp_loc, op);
5128
      return parser_build_unary_op (op_loc, BIT_NOT_EXPR, op);
5129
    case CPP_NOT:
5130
      c_parser_consume_token (parser);
5131
      exp_loc = c_parser_peek_token (parser)->location;
5132
      op = c_parser_cast_expression (parser, NULL);
5133
      op = default_function_array_conversion (exp_loc, op);
5134
      return parser_build_unary_op (op_loc, TRUTH_NOT_EXPR, op);
5135
    case CPP_AND_AND:
5136
      /* Refer to the address of a label as a pointer.  */
5137
      c_parser_consume_token (parser);
5138
      if (c_parser_next_token_is (parser, CPP_NAME))
5139
        {
5140
          ret.value = finish_label_address_expr
5141
            (c_parser_peek_token (parser)->value, op_loc);
5142
          c_parser_consume_token (parser);
5143
        }
5144
      else
5145
        {
5146
          c_parser_error (parser, "expected identifier");
5147
          ret.value = error_mark_node;
5148
        }
5149
        return ret;
5150
    case CPP_KEYWORD:
5151
      switch (c_parser_peek_token (parser)->keyword)
5152
        {
5153
        case RID_SIZEOF:
5154
          return c_parser_sizeof_expression (parser);
5155
        case RID_ALIGNOF:
5156
          return c_parser_alignof_expression (parser);
5157
        case RID_EXTENSION:
5158
          c_parser_consume_token (parser);
5159
          ext = disable_extension_diagnostics ();
5160
          ret = c_parser_cast_expression (parser, NULL);
5161
          restore_extension_diagnostics (ext);
5162
          return ret;
5163
        case RID_REALPART:
5164
          c_parser_consume_token (parser);
5165
          exp_loc = c_parser_peek_token (parser)->location;
5166
          op = c_parser_cast_expression (parser, NULL);
5167
          op = default_function_array_conversion (exp_loc, op);
5168
          return parser_build_unary_op (op_loc, REALPART_EXPR, op);
5169
        case RID_IMAGPART:
5170
          c_parser_consume_token (parser);
5171
          exp_loc = c_parser_peek_token (parser)->location;
5172
          op = c_parser_cast_expression (parser, NULL);
5173
          op = default_function_array_conversion (exp_loc, op);
5174
          return parser_build_unary_op (op_loc, IMAGPART_EXPR, op);
5175
        default:
5176
          return c_parser_postfix_expression (parser);
5177
        }
5178
    default:
5179
      return c_parser_postfix_expression (parser);
5180
    }
5181
}
5182
 
5183
/* Parse a sizeof expression.  */
5184
 
5185
static struct c_expr
5186
c_parser_sizeof_expression (c_parser *parser)
5187
{
5188
  struct c_expr expr;
5189
  location_t expr_loc;
5190
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
5191
  c_parser_consume_token (parser);
5192
  c_inhibit_evaluation_warnings++;
5193
  in_sizeof++;
5194
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5195
      && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5196
    {
5197
      /* Either sizeof ( type-name ) or sizeof unary-expression
5198
         starting with a compound literal.  */
5199
      struct c_type_name *type_name;
5200
      c_parser_consume_token (parser);
5201
      expr_loc = c_parser_peek_token (parser)->location;
5202
      type_name = c_parser_type_name (parser);
5203
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5204
      if (type_name == NULL)
5205
        {
5206
          struct c_expr ret;
5207
          c_inhibit_evaluation_warnings--;
5208
          in_sizeof--;
5209
          ret.value = error_mark_node;
5210
          ret.original_code = ERROR_MARK;
5211
          ret.original_type = NULL;
5212
          return ret;
5213
        }
5214
      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5215
        {
5216
          expr = c_parser_postfix_expression_after_paren_type (parser,
5217
                                                               type_name,
5218
                                                               expr_loc);
5219
          goto sizeof_expr;
5220
        }
5221
      /* sizeof ( type-name ).  */
5222
      c_inhibit_evaluation_warnings--;
5223
      in_sizeof--;
5224
      return c_expr_sizeof_type (expr_loc, type_name);
5225
    }
5226
  else
5227
    {
5228
      expr_loc = c_parser_peek_token (parser)->location;
5229
      expr = c_parser_unary_expression (parser);
5230
    sizeof_expr:
5231
      c_inhibit_evaluation_warnings--;
5232
      in_sizeof--;
5233
      if (TREE_CODE (expr.value) == COMPONENT_REF
5234
          && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
5235
        error_at (expr_loc, "%<sizeof%> applied to a bit-field");
5236
      return c_expr_sizeof_expr (expr_loc, expr);
5237
    }
5238
}
5239
 
5240
/* Parse an alignof expression.  */
5241
 
5242
static struct c_expr
5243
c_parser_alignof_expression (c_parser *parser)
5244
{
5245
  struct c_expr expr;
5246
  location_t loc = c_parser_peek_token (parser)->location;
5247
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
5248
  c_parser_consume_token (parser);
5249
  c_inhibit_evaluation_warnings++;
5250
  in_alignof++;
5251
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
5252
      && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5253
    {
5254
      /* Either __alignof__ ( type-name ) or __alignof__
5255
         unary-expression starting with a compound literal.  */
5256
      location_t loc;
5257
      struct c_type_name *type_name;
5258
      struct c_expr ret;
5259
      c_parser_consume_token (parser);
5260
      loc = c_parser_peek_token (parser)->location;
5261
      type_name = c_parser_type_name (parser);
5262
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
5263
      if (type_name == NULL)
5264
        {
5265
          struct c_expr ret;
5266
          c_inhibit_evaluation_warnings--;
5267
          in_alignof--;
5268
          ret.value = error_mark_node;
5269
          ret.original_code = ERROR_MARK;
5270
          ret.original_type = NULL;
5271
          return ret;
5272
        }
5273
      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
5274
        {
5275
          expr = c_parser_postfix_expression_after_paren_type (parser,
5276
                                                               type_name,
5277
                                                               loc);
5278
          goto alignof_expr;
5279
        }
5280
      /* alignof ( type-name ).  */
5281
      c_inhibit_evaluation_warnings--;
5282
      in_alignof--;
5283
      ret.value = c_alignof (loc, groktypename (type_name, NULL, NULL));
5284
      ret.original_code = ERROR_MARK;
5285
      ret.original_type = NULL;
5286
      return ret;
5287
    }
5288
  else
5289
    {
5290
      struct c_expr ret;
5291
      expr = c_parser_unary_expression (parser);
5292
    alignof_expr:
5293
      c_inhibit_evaluation_warnings--;
5294
      in_alignof--;
5295
      ret.value = c_alignof_expr (loc, expr.value);
5296
      ret.original_code = ERROR_MARK;
5297
      ret.original_type = NULL;
5298
      return ret;
5299
    }
5300
}
5301
 
5302
/* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2).
5303
 
5304
   postfix-expression:
5305
     primary-expression
5306
     postfix-expression [ expression ]
5307
     postfix-expression ( argument-expression-list[opt] )
5308
     postfix-expression . identifier
5309
     postfix-expression -> identifier
5310
     postfix-expression ++
5311
     postfix-expression --
5312
     ( type-name ) { initializer-list }
5313
     ( type-name ) { initializer-list , }
5314
 
5315
   argument-expression-list:
5316
     argument-expression
5317
     argument-expression-list , argument-expression
5318
 
5319
   primary-expression:
5320
     identifier
5321
     constant
5322
     string-literal
5323
     ( expression )
5324
 
5325
   GNU extensions:
5326
 
5327
   primary-expression:
5328
     __func__
5329
       (treated as a keyword in GNU C)
5330
     __FUNCTION__
5331
     __PRETTY_FUNCTION__
5332
     ( compound-statement )
5333
     __builtin_va_arg ( assignment-expression , type-name )
5334
     __builtin_offsetof ( type-name , offsetof-member-designator )
5335
     __builtin_choose_expr ( assignment-expression ,
5336
                             assignment-expression ,
5337
                             assignment-expression )
5338
     __builtin_types_compatible_p ( type-name , type-name )
5339
 
5340
   offsetof-member-designator:
5341
     identifier
5342
     offsetof-member-designator . identifier
5343
     offsetof-member-designator [ expression ]
5344
 
5345
   Objective-C:
5346
 
5347
   primary-expression:
5348
     [ objc-receiver objc-message-args ]
5349
     @selector ( objc-selector-arg )
5350
     @protocol ( identifier )
5351
     @encode ( type-name )
5352
     objc-string-literal
5353
*/
5354
 
5355
static struct c_expr
5356
c_parser_postfix_expression (c_parser *parser)
5357
{
5358
  struct c_expr expr, e1, e2, e3;
5359
  struct c_type_name *t1, *t2;
5360
  location_t loc = c_parser_peek_token (parser)->location;;
5361
  expr.original_code = ERROR_MARK;
5362
  expr.original_type = NULL;
5363
  switch (c_parser_peek_token (parser)->type)
5364
    {
5365
    case CPP_NUMBER:
5366
      expr.value = c_parser_peek_token (parser)->value;
5367
      loc = c_parser_peek_token (parser)->location;
5368
      c_parser_consume_token (parser);
5369
      if (TREE_CODE (expr.value) == FIXED_CST
5370
          && !targetm.fixed_point_supported_p ())
5371
        {
5372
          error_at (loc, "fixed-point types not supported for this target");
5373
          expr.value = error_mark_node;
5374
        }
5375
      break;
5376
    case CPP_CHAR:
5377
    case CPP_CHAR16:
5378
    case CPP_CHAR32:
5379
    case CPP_WCHAR:
5380
      expr.value = c_parser_peek_token (parser)->value;
5381
      c_parser_consume_token (parser);
5382
      break;
5383
    case CPP_STRING:
5384
    case CPP_STRING16:
5385
    case CPP_STRING32:
5386
    case CPP_WSTRING:
5387
    case CPP_UTF8STRING:
5388
      expr.value = c_parser_peek_token (parser)->value;
5389
      expr.original_code = STRING_CST;
5390
      c_parser_consume_token (parser);
5391
      break;
5392
    case CPP_OBJC_STRING:
5393
      gcc_assert (c_dialect_objc ());
5394
      expr.value
5395
        = objc_build_string_object (c_parser_peek_token (parser)->value);
5396
      c_parser_consume_token (parser);
5397
      break;
5398
    case CPP_NAME:
5399
      if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
5400
        {
5401
          c_parser_error (parser, "expected expression");
5402
          expr.value = error_mark_node;
5403
          break;
5404
        }
5405
      {
5406
        tree id = c_parser_peek_token (parser)->value;
5407
        c_parser_consume_token (parser);
5408
        expr.value = build_external_ref (loc, id,
5409
                                         (c_parser_peek_token (parser)->type
5410
                                          == CPP_OPEN_PAREN),
5411
                                         &expr.original_type);
5412
      }
5413
      break;
5414
    case CPP_OPEN_PAREN:
5415
      /* A parenthesized expression, statement expression or compound
5416
         literal.  */
5417
      if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
5418
        {
5419
          /* A statement expression.  */
5420
          tree stmt;
5421
          location_t brace_loc;
5422
          c_parser_consume_token (parser);
5423
          brace_loc = c_parser_peek_token (parser)->location;
5424
          c_parser_consume_token (parser);
5425
          if (cur_stmt_list == NULL)
5426
            {
5427
              error_at (loc, "braced-group within expression allowed "
5428
                        "only inside a function");
5429
              parser->error = true;
5430
              c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
5431
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5432
              expr.value = error_mark_node;
5433
              break;
5434
            }
5435
          stmt = c_begin_stmt_expr ();
5436
          c_parser_compound_statement_nostart (parser);
5437
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5438
                                     "expected %<)%>");
5439
          pedwarn (loc, OPT_pedantic,
5440
                   "ISO C forbids braced-groups within expressions");
5441
          expr.value = c_finish_stmt_expr (brace_loc, stmt);
5442
        }
5443
      else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
5444
        {
5445
          /* A compound literal.  ??? Can we actually get here rather
5446
             than going directly to
5447
             c_parser_postfix_expression_after_paren_type from
5448
             elsewhere?  */
5449
          location_t loc;
5450
          struct c_type_name *type_name;
5451
          c_parser_consume_token (parser);
5452
          loc = c_parser_peek_token (parser)->location;
5453
          type_name = c_parser_type_name (parser);
5454
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5455
                                     "expected %<)%>");
5456
          if (type_name == NULL)
5457
            {
5458
              expr.value = error_mark_node;
5459
            }
5460
          else
5461
            expr = c_parser_postfix_expression_after_paren_type (parser,
5462
                                                                 type_name,
5463
                                                                 loc);
5464
        }
5465
      else
5466
        {
5467
          /* A parenthesized expression.  */
5468
          c_parser_consume_token (parser);
5469
          expr = c_parser_expression (parser);
5470
          if (TREE_CODE (expr.value) == MODIFY_EXPR)
5471
            TREE_NO_WARNING (expr.value) = 1;
5472
          if (expr.original_code != C_MAYBE_CONST_EXPR)
5473
            expr.original_code = ERROR_MARK;
5474
          /* Don't change EXPR.ORIGINAL_TYPE.  */
5475
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5476
                                     "expected %<)%>");
5477
        }
5478
      break;
5479
    case CPP_KEYWORD:
5480
      switch (c_parser_peek_token (parser)->keyword)
5481
        {
5482
        case RID_FUNCTION_NAME:
5483
        case RID_PRETTY_FUNCTION_NAME:
5484
        case RID_C99_FUNCTION_NAME:
5485
          expr.value = fname_decl (loc,
5486
                                   c_parser_peek_token (parser)->keyword,
5487
                                   c_parser_peek_token (parser)->value);
5488
          c_parser_consume_token (parser);
5489
          break;
5490
        case RID_VA_ARG:
5491
          c_parser_consume_token (parser);
5492
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5493
            {
5494
              expr.value = error_mark_node;
5495
              break;
5496
            }
5497
          e1 = c_parser_expr_no_commas (parser, NULL);
5498
          e1.value = c_fully_fold (e1.value, false, NULL);
5499
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5500
            {
5501
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5502
              expr.value = error_mark_node;
5503
              break;
5504
            }
5505
          loc = c_parser_peek_token (parser)->location;
5506
          t1 = c_parser_type_name (parser);
5507
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5508
                                     "expected %<)%>");
5509
          if (t1 == NULL)
5510
            {
5511
              expr.value = error_mark_node;
5512
            }
5513
          else
5514
            {
5515
              tree type_expr = NULL_TREE;
5516
              expr.value = c_build_va_arg (loc, e1.value,
5517
                                           groktypename (t1, &type_expr, NULL));
5518
              if (type_expr)
5519
                {
5520
                  expr.value = build2 (C_MAYBE_CONST_EXPR,
5521
                                       TREE_TYPE (expr.value), type_expr,
5522
                                       expr.value);
5523
                  C_MAYBE_CONST_EXPR_NON_CONST (expr.value) = true;
5524
                }
5525
            }
5526
          break;
5527
        case RID_OFFSETOF:
5528
          c_parser_consume_token (parser);
5529
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5530
            {
5531
              expr.value = error_mark_node;
5532
              break;
5533
            }
5534
          t1 = c_parser_type_name (parser);
5535
          if (t1 == NULL)
5536
            {
5537
              expr.value = error_mark_node;
5538
              break;
5539
            }
5540
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5541
            {
5542
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5543
              expr.value = error_mark_node;
5544
              break;
5545
            }
5546
          {
5547
            tree type = groktypename (t1, NULL, NULL);
5548
            tree offsetof_ref;
5549
            if (type == error_mark_node)
5550
              offsetof_ref = error_mark_node;
5551
            else
5552
              {
5553
                offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
5554
                SET_EXPR_LOCATION (offsetof_ref, loc);
5555
              }
5556
            /* Parse the second argument to __builtin_offsetof.  We
5557
               must have one identifier, and beyond that we want to
5558
               accept sub structure and sub array references.  */
5559
            if (c_parser_next_token_is (parser, CPP_NAME))
5560
              {
5561
                offsetof_ref = build_component_ref
5562
                  (loc, offsetof_ref, c_parser_peek_token (parser)->value);
5563
                c_parser_consume_token (parser);
5564
                while (c_parser_next_token_is (parser, CPP_DOT)
5565
                       || c_parser_next_token_is (parser,
5566
                                                  CPP_OPEN_SQUARE)
5567
                       || c_parser_next_token_is (parser,
5568
                                                  CPP_DEREF))
5569
                  {
5570
                    if (c_parser_next_token_is (parser, CPP_DEREF))
5571
                      {
5572
                        loc = c_parser_peek_token (parser)->location;
5573
                        offsetof_ref = build_array_ref (loc,
5574
                                                        offsetof_ref,
5575
                                                        integer_zero_node);
5576
                        goto do_dot;
5577
                      }
5578
                    else if (c_parser_next_token_is (parser, CPP_DOT))
5579
                      {
5580
                      do_dot:
5581
                        c_parser_consume_token (parser);
5582
                        if (c_parser_next_token_is_not (parser,
5583
                                                        CPP_NAME))
5584
                          {
5585
                            c_parser_error (parser, "expected identifier");
5586
                            break;
5587
                          }
5588
                        offsetof_ref = build_component_ref
5589
                          (loc, offsetof_ref,
5590
                           c_parser_peek_token (parser)->value);
5591
                        c_parser_consume_token (parser);
5592
                      }
5593
                    else
5594
                      {
5595
                        tree idx;
5596
                        loc = c_parser_peek_token (parser)->location;
5597
                        c_parser_consume_token (parser);
5598
                        idx = c_parser_expression (parser).value;
5599
                        idx = c_fully_fold (idx, false, NULL);
5600
                        c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5601
                                                   "expected %<]%>");
5602
                        offsetof_ref = build_array_ref (loc, offsetof_ref, idx);
5603
                      }
5604
                  }
5605
              }
5606
            else
5607
              c_parser_error (parser, "expected identifier");
5608
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5609
                                       "expected %<)%>");
5610
            expr.value = fold_offsetof (offsetof_ref, NULL_TREE);
5611
          }
5612
          break;
5613
        case RID_CHOOSE_EXPR:
5614
          c_parser_consume_token (parser);
5615
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5616
            {
5617
              expr.value = error_mark_node;
5618
              break;
5619
            }
5620
          loc = c_parser_peek_token (parser)->location;
5621
          e1 = c_parser_expr_no_commas (parser, NULL);
5622
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5623
            {
5624
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5625
              expr.value = error_mark_node;
5626
              break;
5627
            }
5628
          e2 = c_parser_expr_no_commas (parser, NULL);
5629
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5630
            {
5631
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5632
              expr.value = error_mark_node;
5633
              break;
5634
            }
5635
          e3 = c_parser_expr_no_commas (parser, NULL);
5636
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5637
                                     "expected %<)%>");
5638
          {
5639
            tree c;
5640
 
5641
            c = e1.value;
5642
            if (TREE_CODE (c) != INTEGER_CST
5643
                || !INTEGRAL_TYPE_P (TREE_TYPE (c)))
5644
              error_at (loc,
5645
                        "first argument to %<__builtin_choose_expr%> not"
5646
                        " a constant");
5647
            constant_expression_warning (c);
5648
            expr = integer_zerop (c) ? e3 : e2;
5649
          }
5650
          break;
5651
        case RID_TYPES_COMPATIBLE_P:
5652
          c_parser_consume_token (parser);
5653
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5654
            {
5655
              expr.value = error_mark_node;
5656
              break;
5657
            }
5658
          t1 = c_parser_type_name (parser);
5659
          if (t1 == NULL)
5660
            {
5661
              expr.value = error_mark_node;
5662
              break;
5663
            }
5664
          if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
5665
            {
5666
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5667
              expr.value = error_mark_node;
5668
              break;
5669
            }
5670
          t2 = c_parser_type_name (parser);
5671
          if (t2 == NULL)
5672
            {
5673
              expr.value = error_mark_node;
5674
              break;
5675
            }
5676
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5677
                                     "expected %<)%>");
5678
          {
5679
            tree e1, e2;
5680
 
5681
            e1 = TYPE_MAIN_VARIANT (groktypename (t1, NULL, NULL));
5682
            e2 = TYPE_MAIN_VARIANT (groktypename (t2, NULL, NULL));
5683
 
5684
            expr.value = comptypes (e1, e2)
5685
              ? build_int_cst (NULL_TREE, 1)
5686
              : build_int_cst (NULL_TREE, 0);
5687
          }
5688
          break;
5689
        case RID_AT_SELECTOR:
5690
          gcc_assert (c_dialect_objc ());
5691
          c_parser_consume_token (parser);
5692
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5693
            {
5694
              expr.value = error_mark_node;
5695
              break;
5696
            }
5697
          {
5698
            tree sel = c_parser_objc_selector_arg (parser);
5699
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5700
                                       "expected %<)%>");
5701
            expr.value = objc_build_selector_expr (loc, sel);
5702
          }
5703
          break;
5704
        case RID_AT_PROTOCOL:
5705
          gcc_assert (c_dialect_objc ());
5706
          c_parser_consume_token (parser);
5707
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5708
            {
5709
              expr.value = error_mark_node;
5710
              break;
5711
            }
5712
          if (c_parser_next_token_is_not (parser, CPP_NAME))
5713
            {
5714
              c_parser_error (parser, "expected identifier");
5715
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5716
              expr.value = error_mark_node;
5717
              break;
5718
            }
5719
          {
5720
            tree id = c_parser_peek_token (parser)->value;
5721
            c_parser_consume_token (parser);
5722
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5723
                                       "expected %<)%>");
5724
            expr.value = objc_build_protocol_expr (id);
5725
          }
5726
          break;
5727
        case RID_AT_ENCODE:
5728
          /* Extension to support C-structures in the archiver.  */
5729
          gcc_assert (c_dialect_objc ());
5730
          c_parser_consume_token (parser);
5731
          if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
5732
            {
5733
              expr.value = error_mark_node;
5734
              break;
5735
            }
5736
          t1 = c_parser_type_name (parser);
5737
          if (t1 == NULL)
5738
            {
5739
              expr.value = error_mark_node;
5740
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
5741
              break;
5742
            }
5743
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5744
                                     "expected %<)%>");
5745
          {
5746
            tree type = groktypename (t1, NULL, NULL);
5747
            expr.value = objc_build_encode_expr (type);
5748
          }
5749
          break;
5750
        default:
5751
          c_parser_error (parser, "expected expression");
5752
          expr.value = error_mark_node;
5753
          break;
5754
        }
5755
      break;
5756
    case CPP_OPEN_SQUARE:
5757
      if (c_dialect_objc ())
5758
        {
5759
          tree receiver, args;
5760
          c_parser_consume_token (parser);
5761
          receiver = c_parser_objc_receiver (parser);
5762
          args = c_parser_objc_message_args (parser);
5763
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5764
                                     "expected %<]%>");
5765
          expr.value = objc_build_message_expr (build_tree_list (receiver,
5766
                                                                 args));
5767
          break;
5768
        }
5769
      /* Else fall through to report error.  */
5770
    default:
5771
      c_parser_error (parser, "expected expression");
5772
      expr.value = error_mark_node;
5773
      break;
5774
    }
5775
  return c_parser_postfix_expression_after_primary (parser, loc, expr);
5776
}
5777
 
5778
/* Parse a postfix expression after a parenthesized type name: the
5779
   brace-enclosed initializer of a compound literal, possibly followed
5780
   by some postfix operators.  This is separate because it is not
5781
   possible to tell until after the type name whether a cast
5782
   expression has a cast or a compound literal, or whether the operand
5783
   of sizeof is a parenthesized type name or starts with a compound
5784
   literal.  TYPE_LOC is the location where TYPE_NAME starts--the
5785
   location of the first token after the parentheses around the type
5786
   name.  */
5787
 
5788
static struct c_expr
5789
c_parser_postfix_expression_after_paren_type (c_parser *parser,
5790
                                              struct c_type_name *type_name,
5791
                                              location_t type_loc)
5792
{
5793
  tree type;
5794
  struct c_expr init;
5795
  bool non_const;
5796
  struct c_expr expr;
5797
  location_t start_loc;
5798
  tree type_expr = NULL_TREE;
5799
  bool type_expr_const = true;
5800
  check_compound_literal_type (type_loc, type_name);
5801
  start_init (NULL_TREE, NULL, 0);
5802
  type = groktypename (type_name, &type_expr, &type_expr_const);
5803
  start_loc = c_parser_peek_token (parser)->location;
5804
  if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
5805
    {
5806
      error_at (type_loc, "compound literal has variable size");
5807
      type = error_mark_node;
5808
    }
5809
  init = c_parser_braced_init (parser, type, false);
5810
  finish_init ();
5811
  maybe_warn_string_init (type, init);
5812
 
5813
  if (type != error_mark_node
5814
      && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type))
5815
      && current_function_decl)
5816
    {
5817
      error ("compound literal qualified by address-space qualifier");
5818
      type = error_mark_node;
5819
    }
5820
 
5821
  if (!flag_isoc99)
5822
    pedwarn (start_loc, OPT_pedantic, "ISO C90 forbids compound literals");
5823
  non_const = ((init.value && TREE_CODE (init.value) == CONSTRUCTOR)
5824
               ? CONSTRUCTOR_NON_CONST (init.value)
5825
               : init.original_code == C_MAYBE_CONST_EXPR);
5826
  non_const |= !type_expr_const;
5827
  expr.value = build_compound_literal (start_loc, type, init.value, non_const);
5828
  expr.original_code = ERROR_MARK;
5829
  expr.original_type = NULL;
5830
  if (type_expr)
5831
    {
5832
      if (TREE_CODE (expr.value) == C_MAYBE_CONST_EXPR)
5833
        {
5834
          gcc_assert (C_MAYBE_CONST_EXPR_PRE (expr.value) == NULL_TREE);
5835
          C_MAYBE_CONST_EXPR_PRE (expr.value) = type_expr;
5836
        }
5837
      else
5838
        {
5839
          gcc_assert (!non_const);
5840
          expr.value = build2 (C_MAYBE_CONST_EXPR, type,
5841
                               type_expr, expr.value);
5842
        }
5843
    }
5844
  return c_parser_postfix_expression_after_primary (parser, start_loc, expr);
5845
}
5846
 
5847
/* Parse a postfix expression after the initial primary or compound
5848
   literal; that is, parse a series of postfix operators.
5849
 
5850
   EXPR_LOC is the location of the primary expression.  */
5851
 
5852
static struct c_expr
5853
c_parser_postfix_expression_after_primary (c_parser *parser,
5854
                                           location_t expr_loc,
5855
                                           struct c_expr expr)
5856
{
5857
  struct c_expr orig_expr;
5858
  tree ident, idx;
5859
  VEC(tree,gc) *exprlist;
5860
  VEC(tree,gc) *origtypes;
5861
  while (true)
5862
    {
5863
      location_t op_loc = c_parser_peek_token (parser)->location;
5864
      switch (c_parser_peek_token (parser)->type)
5865
        {
5866
        case CPP_OPEN_SQUARE:
5867
          /* Array reference.  */
5868
          c_parser_consume_token (parser);
5869
          idx = c_parser_expression (parser).value;
5870
          c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
5871
                                     "expected %<]%>");
5872
          expr.value = build_array_ref (op_loc, expr.value, idx);
5873
          expr.original_code = ERROR_MARK;
5874
          expr.original_type = NULL;
5875
          break;
5876
        case CPP_OPEN_PAREN:
5877
          /* Function call.  */
5878
          c_parser_consume_token (parser);
5879
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
5880
            exprlist = NULL;
5881
          else
5882
            exprlist = c_parser_expr_list (parser, true, false, &origtypes);
5883
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
5884
                                     "expected %<)%>");
5885
          orig_expr = expr;
5886
          /* FIXME diagnostics: Ideally we want the FUNCNAME, not the
5887
             "(" after the FUNCNAME, which is what we have now.    */
5888
          expr.value = build_function_call_vec (op_loc, expr.value, exprlist,
5889
                                                origtypes);
5890
          expr.original_code = ERROR_MARK;
5891
          if (TREE_CODE (expr.value) == INTEGER_CST
5892
              && TREE_CODE (orig_expr.value) == FUNCTION_DECL
5893
              && DECL_BUILT_IN_CLASS (orig_expr.value) == BUILT_IN_NORMAL
5894
              && DECL_FUNCTION_CODE (orig_expr.value) == BUILT_IN_CONSTANT_P)
5895
            expr.original_code = C_MAYBE_CONST_EXPR;
5896
          expr.original_type = NULL;
5897
          if (exprlist != NULL)
5898
            {
5899
              release_tree_vector (exprlist);
5900
              release_tree_vector (origtypes);
5901
            }
5902
          break;
5903
        case CPP_DOT:
5904
          /* Structure element reference.  */
5905
          c_parser_consume_token (parser);
5906
          expr = default_function_array_conversion (expr_loc, expr);
5907
          if (c_parser_next_token_is (parser, CPP_NAME))
5908
            ident = c_parser_peek_token (parser)->value;
5909
          else
5910
            {
5911
              c_parser_error (parser, "expected identifier");
5912
              expr.value = error_mark_node;
5913
              expr.original_code = ERROR_MARK;
5914
              expr.original_type = NULL;
5915
              return expr;
5916
            }
5917
          c_parser_consume_token (parser);
5918
          expr.value = build_component_ref (op_loc, expr.value, ident);
5919
          expr.original_code = ERROR_MARK;
5920
          if (TREE_CODE (expr.value) != COMPONENT_REF)
5921
            expr.original_type = NULL;
5922
          else
5923
            {
5924
              /* Remember the original type of a bitfield.  */
5925
              tree field = TREE_OPERAND (expr.value, 1);
5926
              if (TREE_CODE (field) != FIELD_DECL)
5927
                expr.original_type = NULL;
5928
              else
5929
                expr.original_type = DECL_BIT_FIELD_TYPE (field);
5930
            }
5931
          break;
5932
        case CPP_DEREF:
5933
          /* Structure element reference.  */
5934
          c_parser_consume_token (parser);
5935
          expr = default_function_array_conversion (expr_loc, expr);
5936
          if (c_parser_next_token_is (parser, CPP_NAME))
5937
            ident = c_parser_peek_token (parser)->value;
5938
          else
5939
            {
5940
              c_parser_error (parser, "expected identifier");
5941
              expr.value = error_mark_node;
5942
              expr.original_code = ERROR_MARK;
5943
              expr.original_type = NULL;
5944
              return expr;
5945
            }
5946
          c_parser_consume_token (parser);
5947
          expr.value = build_component_ref (op_loc,
5948
                                            build_indirect_ref (op_loc,
5949
                                                                expr.value,
5950
                                                                RO_ARROW),
5951
                                            ident);
5952
          expr.original_code = ERROR_MARK;
5953
          if (TREE_CODE (expr.value) != COMPONENT_REF)
5954
            expr.original_type = NULL;
5955
          else
5956
            {
5957
              /* Remember the original type of a bitfield.  */
5958
              tree field = TREE_OPERAND (expr.value, 1);
5959
              if (TREE_CODE (field) != FIELD_DECL)
5960
                expr.original_type = NULL;
5961
              else
5962
                expr.original_type = DECL_BIT_FIELD_TYPE (field);
5963
            }
5964
          break;
5965
        case CPP_PLUS_PLUS:
5966
          /* Postincrement.  */
5967
          c_parser_consume_token (parser);
5968
          expr = default_function_array_conversion (expr_loc, expr);
5969
          expr.value = build_unary_op (op_loc,
5970
                                       POSTINCREMENT_EXPR, expr.value, 0);
5971
          expr.original_code = ERROR_MARK;
5972
          expr.original_type = NULL;
5973
          break;
5974
        case CPP_MINUS_MINUS:
5975
          /* Postdecrement.  */
5976
          c_parser_consume_token (parser);
5977
          expr = default_function_array_conversion (expr_loc, expr);
5978
          expr.value = build_unary_op (op_loc,
5979
                                       POSTDECREMENT_EXPR, expr.value, 0);
5980
          expr.original_code = ERROR_MARK;
5981
          expr.original_type = NULL;
5982
          break;
5983
        default:
5984
          return expr;
5985
        }
5986
    }
5987
}
5988
 
5989
/* Parse an expression (C90 6.3.17, C99 6.5.17).
5990
 
5991
   expression:
5992
     assignment-expression
5993
     expression , assignment-expression
5994
*/
5995
 
5996
static struct c_expr
5997
c_parser_expression (c_parser *parser)
5998
{
5999
  struct c_expr expr;
6000
  expr = c_parser_expr_no_commas (parser, NULL);
6001
  while (c_parser_next_token_is (parser, CPP_COMMA))
6002
    {
6003
      struct c_expr next;
6004
      location_t loc = c_parser_peek_token (parser)->location;
6005
      location_t expr_loc;
6006
      c_parser_consume_token (parser);
6007
      expr_loc = c_parser_peek_token (parser)->location;
6008
      next = c_parser_expr_no_commas (parser, NULL);
6009
      next = default_function_array_conversion (expr_loc, next);
6010
      expr.value = build_compound_expr (loc, expr.value, next.value);
6011
      expr.original_code = COMPOUND_EXPR;
6012
      expr.original_type = next.original_type;
6013
    }
6014
  return expr;
6015
}
6016
 
6017
/* Parse an expression and convert functions or arrays to
6018
   pointers.  */
6019
 
6020
static struct c_expr
6021
c_parser_expression_conv (c_parser *parser)
6022
{
6023
  struct c_expr expr;
6024
  location_t loc = c_parser_peek_token (parser)->location;
6025
  expr = c_parser_expression (parser);
6026
  expr = default_function_array_conversion (loc, expr);
6027
  return expr;
6028
}
6029
 
6030
/* Parse a non-empty list of expressions.  If CONVERT_P, convert
6031
   functions and arrays to pointers.  If FOLD_P, fold the expressions.
6032
 
6033
   nonempty-expr-list:
6034
     assignment-expression
6035
     nonempty-expr-list , assignment-expression
6036
*/
6037
 
6038
static VEC(tree,gc) *
6039
c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p,
6040
                    VEC(tree,gc) **p_orig_types)
6041
{
6042
  VEC(tree,gc) *ret;
6043
  VEC(tree,gc) *orig_types;
6044
  struct c_expr expr;
6045
  location_t loc = c_parser_peek_token (parser)->location;
6046
 
6047
  ret = make_tree_vector ();
6048
  if (p_orig_types == NULL)
6049
    orig_types = NULL;
6050
  else
6051
    orig_types = make_tree_vector ();
6052
 
6053
  expr = c_parser_expr_no_commas (parser, NULL);
6054
  if (convert_p)
6055
    expr = default_function_array_conversion (loc, expr);
6056
  if (fold_p)
6057
    expr.value = c_fully_fold (expr.value, false, NULL);
6058
  VEC_quick_push (tree, ret, expr.value);
6059
  if (orig_types != NULL)
6060
    VEC_quick_push (tree, orig_types, expr.original_type);
6061
  while (c_parser_next_token_is (parser, CPP_COMMA))
6062
    {
6063
      c_parser_consume_token (parser);
6064
      loc = c_parser_peek_token (parser)->location;
6065
      expr = c_parser_expr_no_commas (parser, NULL);
6066
      if (convert_p)
6067
        expr = default_function_array_conversion (loc, expr);
6068
      if (fold_p)
6069
        expr.value = c_fully_fold (expr.value, false, NULL);
6070
      VEC_safe_push (tree, gc, ret, expr.value);
6071
      if (orig_types != NULL)
6072
        VEC_safe_push (tree, gc, orig_types, expr.original_type);
6073
    }
6074
  if (orig_types != NULL)
6075
    *p_orig_types = orig_types;
6076
  return ret;
6077
}
6078
 
6079
/* Parse Objective-C-specific constructs.  */
6080
 
6081
/* Parse an objc-class-definition.
6082
 
6083
   objc-class-definition:
6084
     @interface identifier objc-superclass[opt] objc-protocol-refs[opt]
6085
       objc-class-instance-variables[opt] objc-methodprotolist @end
6086
     @implementation identifier objc-superclass[opt]
6087
       objc-class-instance-variables[opt]
6088
     @interface identifier ( identifier ) objc-protocol-refs[opt]
6089
       objc-methodprotolist @end
6090
     @implementation identifier ( identifier )
6091
 
6092
   objc-superclass:
6093
     : identifier
6094
 
6095
   "@interface identifier (" must start "@interface identifier (
6096
   identifier ) ...": objc-methodprotolist in the first production may
6097
   not start with a parenthesized identifier as a declarator of a data
6098
   definition with no declaration specifiers if the objc-superclass,
6099
   objc-protocol-refs and objc-class-instance-variables are omitted.  */
6100
 
6101
static void
6102
c_parser_objc_class_definition (c_parser *parser)
6103
{
6104
  bool iface_p;
6105
  tree id1;
6106
  tree superclass;
6107
  if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
6108
    iface_p = true;
6109
  else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
6110
    iface_p = false;
6111
  else
6112
    gcc_unreachable ();
6113
  c_parser_consume_token (parser);
6114
  if (c_parser_next_token_is_not (parser, CPP_NAME))
6115
    {
6116
      c_parser_error (parser, "expected identifier");
6117
      return;
6118
    }
6119
  id1 = c_parser_peek_token (parser)->value;
6120
  c_parser_consume_token (parser);
6121
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6122
    {
6123
      tree id2;
6124
      tree proto = NULL_TREE;
6125
      c_parser_consume_token (parser);
6126
      if (c_parser_next_token_is_not (parser, CPP_NAME))
6127
        {
6128
          c_parser_error (parser, "expected identifier");
6129
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6130
          return;
6131
        }
6132
      id2 = c_parser_peek_token (parser)->value;
6133
      c_parser_consume_token (parser);
6134
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6135
      if (!iface_p)
6136
        {
6137
          objc_start_category_implementation (id1, id2);
6138
          return;
6139
        }
6140
      if (c_parser_next_token_is (parser, CPP_LESS))
6141
        proto = c_parser_objc_protocol_refs (parser);
6142
      objc_start_category_interface (id1, id2, proto);
6143
      c_parser_objc_methodprotolist (parser);
6144
      c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6145
      objc_finish_interface ();
6146
      return;
6147
    }
6148
  if (c_parser_next_token_is (parser, CPP_COLON))
6149
    {
6150
      c_parser_consume_token (parser);
6151
      if (c_parser_next_token_is_not (parser, CPP_NAME))
6152
        {
6153
          c_parser_error (parser, "expected identifier");
6154
          return;
6155
        }
6156
      superclass = c_parser_peek_token (parser)->value;
6157
      c_parser_consume_token (parser);
6158
    }
6159
  else
6160
    superclass = NULL_TREE;
6161
  if (iface_p)
6162
    {
6163
      tree proto = NULL_TREE;
6164
      if (c_parser_next_token_is (parser, CPP_LESS))
6165
        proto = c_parser_objc_protocol_refs (parser);
6166
      objc_start_class_interface (id1, superclass, proto);
6167
    }
6168
  else
6169
    objc_start_class_implementation (id1, superclass);
6170
  if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6171
    c_parser_objc_class_instance_variables (parser);
6172
  if (iface_p)
6173
    {
6174
      objc_continue_interface ();
6175
      c_parser_objc_methodprotolist (parser);
6176
      c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6177
      objc_finish_interface ();
6178
    }
6179
  else
6180
    {
6181
      objc_continue_implementation ();
6182
      return;
6183
    }
6184
}
6185
 
6186
/* Parse objc-class-instance-variables.
6187
 
6188
   objc-class-instance-variables:
6189
     { objc-instance-variable-decl-list[opt] }
6190
 
6191
   objc-instance-variable-decl-list:
6192
     objc-visibility-spec
6193
     objc-instance-variable-decl ;
6194
     ;
6195
     objc-instance-variable-decl-list objc-visibility-spec
6196
     objc-instance-variable-decl-list objc-instance-variable-decl ;
6197
     objc-instance-variable-decl-list ;
6198
 
6199
   objc-visibility-spec:
6200
     @private
6201
     @protected
6202
     @public
6203
 
6204
   objc-instance-variable-decl:
6205
     struct-declaration
6206
*/
6207
 
6208
static void
6209
c_parser_objc_class_instance_variables (c_parser *parser)
6210
{
6211
  gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
6212
  c_parser_consume_token (parser);
6213
  while (c_parser_next_token_is_not (parser, CPP_EOF))
6214
    {
6215
      tree decls;
6216
      /* Parse any stray semicolon.  */
6217
      if (c_parser_next_token_is (parser, CPP_SEMICOLON))
6218
        {
6219
          pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
6220
                   "extra semicolon in struct or union specified");
6221
          c_parser_consume_token (parser);
6222
          continue;
6223
        }
6224
      /* Stop if at the end of the instance variables.  */
6225
      if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
6226
        {
6227
          c_parser_consume_token (parser);
6228
          break;
6229
        }
6230
      /* Parse any objc-visibility-spec.  */
6231
      if (c_parser_next_token_is_keyword (parser, RID_PRIVATE))
6232
        {
6233
          c_parser_consume_token (parser);
6234
          objc_set_visibility (2);
6235
          continue;
6236
        }
6237
      else if (c_parser_next_token_is_keyword (parser, RID_PROTECTED))
6238
        {
6239
          c_parser_consume_token (parser);
6240
          objc_set_visibility (0);
6241
          continue;
6242
        }
6243
      else if (c_parser_next_token_is_keyword (parser, RID_PUBLIC))
6244
        {
6245
          c_parser_consume_token (parser);
6246
          objc_set_visibility (1);
6247
          continue;
6248
        }
6249
      else if (c_parser_next_token_is (parser, CPP_PRAGMA))
6250
        {
6251
          c_parser_pragma (parser, pragma_external);
6252
          continue;
6253
        }
6254
 
6255
      /* Parse some comma-separated declarations.  */
6256
      decls = c_parser_struct_declaration (parser);
6257
      {
6258
        /* Comma-separated instance variables are chained together in
6259
           reverse order; add them one by one.  */
6260
        tree ivar = nreverse (decls);
6261
        for (; ivar; ivar = TREE_CHAIN (ivar))
6262
          objc_add_instance_variable (copy_node (ivar));
6263
      }
6264
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6265
    }
6266
}
6267
 
6268
/* Parse an objc-class-declaration.
6269
 
6270
   objc-class-declaration:
6271
     @class identifier-list ;
6272
*/
6273
 
6274
static void
6275
c_parser_objc_class_declaration (c_parser *parser)
6276
{
6277
  tree list = NULL_TREE;
6278
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_CLASS));
6279
  c_parser_consume_token (parser);
6280
  /* Any identifiers, including those declared as type names, are OK
6281
     here.  */
6282
  while (true)
6283
    {
6284
      tree id;
6285
      if (c_parser_next_token_is_not (parser, CPP_NAME))
6286
        {
6287
          c_parser_error (parser, "expected identifier");
6288
          break;
6289
        }
6290
      id = c_parser_peek_token (parser)->value;
6291
      list = chainon (list, build_tree_list (NULL_TREE, id));
6292
      c_parser_consume_token (parser);
6293
      if (c_parser_next_token_is (parser, CPP_COMMA))
6294
        c_parser_consume_token (parser);
6295
      else
6296
        break;
6297
    }
6298
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6299
  objc_declare_class (list);
6300
}
6301
 
6302
/* Parse an objc-alias-declaration.
6303
 
6304
   objc-alias-declaration:
6305
     @compatibility_alias identifier identifier ;
6306
*/
6307
 
6308
static void
6309
c_parser_objc_alias_declaration (c_parser *parser)
6310
{
6311
  tree id1, id2;
6312
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
6313
  c_parser_consume_token (parser);
6314
  if (c_parser_next_token_is_not (parser, CPP_NAME))
6315
    {
6316
      c_parser_error (parser, "expected identifier");
6317
      c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6318
      return;
6319
    }
6320
  id1 = c_parser_peek_token (parser)->value;
6321
  c_parser_consume_token (parser);
6322
  if (c_parser_next_token_is_not (parser, CPP_NAME))
6323
    {
6324
      c_parser_error (parser, "expected identifier");
6325
      c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
6326
      return;
6327
    }
6328
  id2 = c_parser_peek_token (parser)->value;
6329
  c_parser_consume_token (parser);
6330
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6331
  objc_declare_alias (id1, id2);
6332
}
6333
 
6334
/* Parse an objc-protocol-definition.
6335
 
6336
   objc-protocol-definition:
6337
     @protocol identifier objc-protocol-refs[opt] objc-methodprotolist @end
6338
     @protocol identifier-list ;
6339
 
6340
   "@protocol identifier ;" should be resolved as "@protocol
6341
   identifier-list ;": objc-methodprotolist may not start with a
6342
   semicolon in the first alternative if objc-protocol-refs are
6343
   omitted.  */
6344
 
6345
static void
6346
c_parser_objc_protocol_definition (c_parser *parser)
6347
{
6348
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
6349
  c_parser_consume_token (parser);
6350
  if (c_parser_next_token_is_not (parser, CPP_NAME))
6351
    {
6352
      c_parser_error (parser, "expected identifier");
6353
      return;
6354
    }
6355
  if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
6356
      || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
6357
    {
6358
      tree list = NULL_TREE;
6359
      /* Any identifiers, including those declared as type names, are
6360
         OK here.  */
6361
      while (true)
6362
        {
6363
          tree id;
6364
          if (c_parser_next_token_is_not (parser, CPP_NAME))
6365
            {
6366
              c_parser_error (parser, "expected identifier");
6367
              break;
6368
            }
6369
          id = c_parser_peek_token (parser)->value;
6370
          list = chainon (list, build_tree_list (NULL_TREE, id));
6371
          c_parser_consume_token (parser);
6372
          if (c_parser_next_token_is (parser, CPP_COMMA))
6373
            c_parser_consume_token (parser);
6374
          else
6375
            break;
6376
        }
6377
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6378
      objc_declare_protocols (list);
6379
    }
6380
  else
6381
    {
6382
      tree id = c_parser_peek_token (parser)->value;
6383
      tree proto = NULL_TREE;
6384
      c_parser_consume_token (parser);
6385
      if (c_parser_next_token_is (parser, CPP_LESS))
6386
        proto = c_parser_objc_protocol_refs (parser);
6387
      parser->objc_pq_context = true;
6388
      objc_start_protocol (id, proto);
6389
      c_parser_objc_methodprotolist (parser);
6390
      c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
6391
      parser->objc_pq_context = false;
6392
      objc_finish_interface ();
6393
    }
6394
}
6395
 
6396
/* Parse an objc-method-type.
6397
 
6398
   objc-method-type:
6399
     +
6400
     -
6401
*/
6402
 
6403
static enum tree_code
6404
c_parser_objc_method_type (c_parser *parser)
6405
{
6406
  switch (c_parser_peek_token (parser)->type)
6407
    {
6408
    case CPP_PLUS:
6409
      c_parser_consume_token (parser);
6410
      return PLUS_EXPR;
6411
    case CPP_MINUS:
6412
      c_parser_consume_token (parser);
6413
      return MINUS_EXPR;
6414
    default:
6415
      gcc_unreachable ();
6416
    }
6417
}
6418
 
6419
/* Parse an objc-method-definition.
6420
 
6421
   objc-method-definition:
6422
     objc-method-type objc-method-decl ;[opt] compound-statement
6423
*/
6424
 
6425
static void
6426
c_parser_objc_method_definition (c_parser *parser)
6427
{
6428
  enum tree_code type = c_parser_objc_method_type (parser);
6429
  tree decl;
6430
  objc_set_method_type (type);
6431
  parser->objc_pq_context = true;
6432
  decl = c_parser_objc_method_decl (parser);
6433
  if (c_parser_next_token_is (parser, CPP_SEMICOLON))
6434
    {
6435
      c_parser_consume_token (parser);
6436
      pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
6437
               "extra semicolon in method definition specified");
6438
    }
6439
  if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
6440
    {
6441
      c_parser_error (parser, "expected %<{%>");
6442
      return;
6443
    }
6444
  parser->objc_pq_context = false;
6445
  objc_start_method_definition (decl);
6446
  add_stmt (c_parser_compound_statement (parser));
6447
  objc_finish_method_definition (current_function_decl);
6448
}
6449
 
6450
/* Parse an objc-methodprotolist.
6451
 
6452
   objc-methodprotolist:
6453
     empty
6454
     objc-methodprotolist objc-methodproto
6455
     objc-methodprotolist declaration
6456
     objc-methodprotolist ;
6457
 
6458
   The declaration is a data definition, which may be missing
6459
   declaration specifiers under the same rules and diagnostics as
6460
   other data definitions outside functions, and the stray semicolon
6461
   is diagnosed the same way as a stray semicolon outside a
6462
   function.  */
6463
 
6464
static void
6465
c_parser_objc_methodprotolist (c_parser *parser)
6466
{
6467
  while (true)
6468
    {
6469
      /* The list is terminated by @end.  */
6470
      switch (c_parser_peek_token (parser)->type)
6471
        {
6472
        case CPP_SEMICOLON:
6473
          pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic,
6474
                   "ISO C does not allow extra %<;%> outside of a function");
6475
          c_parser_consume_token (parser);
6476
          break;
6477
        case CPP_PLUS:
6478
        case CPP_MINUS:
6479
          c_parser_objc_methodproto (parser);
6480
          break;
6481
        case CPP_PRAGMA:
6482
          c_parser_pragma (parser, pragma_external);
6483
          break;
6484
        case CPP_EOF:
6485
          return;
6486
        default:
6487
          if (c_parser_next_token_is_keyword (parser, RID_AT_END))
6488
            return;
6489
          c_parser_declaration_or_fndef (parser, false, true, false, true);
6490
          break;
6491
        }
6492
    }
6493
}
6494
 
6495
/* Parse an objc-methodproto.
6496
 
6497
   objc-methodproto:
6498
     objc-method-type objc-method-decl ;
6499
*/
6500
 
6501
static void
6502
c_parser_objc_methodproto (c_parser *parser)
6503
{
6504
  enum tree_code type = c_parser_objc_method_type (parser);
6505
  tree decl;
6506
  objc_set_method_type (type);
6507
  /* Remember protocol qualifiers in prototypes.  */
6508
  parser->objc_pq_context = true;
6509
  decl = c_parser_objc_method_decl (parser);
6510
  /* Forget protocol qualifiers here.  */
6511
  parser->objc_pq_context = false;
6512
  objc_add_method_declaration (decl);
6513
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
6514
}
6515
 
6516
/* Parse an objc-method-decl.
6517
 
6518
   objc-method-decl:
6519
     ( objc-type-name ) objc-selector
6520
     objc-selector
6521
     ( objc-type-name ) objc-keyword-selector objc-optparmlist
6522
     objc-keyword-selector objc-optparmlist
6523
 
6524
   objc-keyword-selector:
6525
     objc-keyword-decl
6526
     objc-keyword-selector objc-keyword-decl
6527
 
6528
   objc-keyword-decl:
6529
     objc-selector : ( objc-type-name ) identifier
6530
     objc-selector : identifier
6531
     : ( objc-type-name ) identifier
6532
     : identifier
6533
 
6534
   objc-optparmlist:
6535
     objc-optparms objc-optellipsis
6536
 
6537
   objc-optparms:
6538
     empty
6539
     objc-opt-parms , parameter-declaration
6540
 
6541
   objc-optellipsis:
6542
     empty
6543
     , ...
6544
*/
6545
 
6546
static tree
6547
c_parser_objc_method_decl (c_parser *parser)
6548
{
6549
  tree type = NULL_TREE;
6550
  tree sel;
6551
  tree parms = NULL_TREE;
6552
  bool ellipsis = false;
6553
 
6554
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6555
    {
6556
      c_parser_consume_token (parser);
6557
      type = c_parser_objc_type_name (parser);
6558
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6559
    }
6560
  sel = c_parser_objc_selector (parser);
6561
  /* If there is no selector, or a colon follows, we have an
6562
     objc-keyword-selector.  If there is a selector, and a colon does
6563
     not follow, that selector ends the objc-method-decl.  */
6564
  if (!sel || c_parser_next_token_is (parser, CPP_COLON))
6565
    {
6566
      tree tsel = sel;
6567
      tree list = NULL_TREE;
6568
      while (true)
6569
        {
6570
          tree atype = NULL_TREE, id, keyworddecl;
6571
          if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6572
            break;
6573
          if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
6574
            {
6575
              c_parser_consume_token (parser);
6576
              atype = c_parser_objc_type_name (parser);
6577
              c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
6578
                                         "expected %<)%>");
6579
            }
6580
          if (c_parser_next_token_is_not (parser, CPP_NAME))
6581
            {
6582
              c_parser_error (parser, "expected identifier");
6583
              return error_mark_node;
6584
            }
6585
          id = c_parser_peek_token (parser)->value;
6586
          c_parser_consume_token (parser);
6587
          keyworddecl = objc_build_keyword_decl (tsel, atype, id);
6588
          list = chainon (list, keyworddecl);
6589
          tsel = c_parser_objc_selector (parser);
6590
          if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
6591
            break;
6592
        }
6593
      /* Parse the optional parameter list.  Optional Objective-C
6594
         method parameters follow the C syntax, and may include '...'
6595
         to denote a variable number of arguments.  */
6596
      parms = make_node (TREE_LIST);
6597
      while (c_parser_next_token_is (parser, CPP_COMMA))
6598
        {
6599
          struct c_parm *parm;
6600
          c_parser_consume_token (parser);
6601
          if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
6602
            {
6603
              ellipsis = true;
6604
              c_parser_consume_token (parser);
6605
              break;
6606
            }
6607
          parm = c_parser_parameter_declaration (parser, NULL_TREE);
6608
          if (parm == NULL)
6609
            break;
6610
          parms = chainon (parms,
6611
                           build_tree_list (NULL_TREE, grokparm (parm)));
6612
        }
6613
      sel = list;
6614
    }
6615
  return objc_build_method_signature (type, sel, parms, ellipsis);
6616
}
6617
 
6618
/* Parse an objc-type-name.
6619
 
6620
   objc-type-name:
6621
     objc-type-qualifiers[opt] type-name
6622
     objc-type-qualifiers[opt]
6623
 
6624
   objc-type-qualifiers:
6625
     objc-type-qualifier
6626
     objc-type-qualifiers objc-type-qualifier
6627
 
6628
   objc-type-qualifier: one of
6629
     in out inout bycopy byref oneway
6630
*/
6631
 
6632
static tree
6633
c_parser_objc_type_name (c_parser *parser)
6634
{
6635
  tree quals = NULL_TREE;
6636
  struct c_type_name *type_name = NULL;
6637
  tree type = NULL_TREE;
6638
  while (true)
6639
    {
6640
      c_token *token = c_parser_peek_token (parser);
6641
      if (token->type == CPP_KEYWORD
6642
          && (token->keyword == RID_IN
6643
              || token->keyword == RID_OUT
6644
              || token->keyword == RID_INOUT
6645
              || token->keyword == RID_BYCOPY
6646
              || token->keyword == RID_BYREF
6647
              || token->keyword == RID_ONEWAY))
6648
        {
6649
          quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
6650
          c_parser_consume_token (parser);
6651
        }
6652
      else
6653
        break;
6654
    }
6655
  if (c_parser_next_token_starts_typename (parser))
6656
    type_name = c_parser_type_name (parser);
6657
  if (type_name)
6658
    type = groktypename (type_name, NULL, NULL);
6659
  return build_tree_list (quals, type);
6660
}
6661
 
6662
/* Parse objc-protocol-refs.
6663
 
6664
   objc-protocol-refs:
6665
     < identifier-list >
6666
*/
6667
 
6668
static tree
6669
c_parser_objc_protocol_refs (c_parser *parser)
6670
{
6671
  tree list = NULL_TREE;
6672
  gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
6673
  c_parser_consume_token (parser);
6674
  /* Any identifiers, including those declared as type names, are OK
6675
     here.  */
6676
  while (true)
6677
    {
6678
      tree id;
6679
      if (c_parser_next_token_is_not (parser, CPP_NAME))
6680
        {
6681
          c_parser_error (parser, "expected identifier");
6682
          break;
6683
        }
6684
      id = c_parser_peek_token (parser)->value;
6685
      list = chainon (list, build_tree_list (NULL_TREE, id));
6686
      c_parser_consume_token (parser);
6687
      if (c_parser_next_token_is (parser, CPP_COMMA))
6688
        c_parser_consume_token (parser);
6689
      else
6690
        break;
6691
    }
6692
  c_parser_require (parser, CPP_GREATER, "expected %<>%>");
6693
  return list;
6694
}
6695
 
6696
/* Parse an objc-try-catch-statement.
6697
 
6698
   objc-try-catch-statement:
6699
     @try compound-statement objc-catch-list[opt]
6700
     @try compound-statement objc-catch-list[opt] @finally compound-statement
6701
 
6702
   objc-catch-list:
6703
     @catch ( parameter-declaration ) compound-statement
6704
     objc-catch-list @catch ( parameter-declaration ) compound-statement
6705
*/
6706
 
6707
static void
6708
c_parser_objc_try_catch_statement (c_parser *parser)
6709
{
6710
  location_t loc;
6711
  tree stmt;
6712
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_TRY));
6713
  c_parser_consume_token (parser);
6714
  loc = c_parser_peek_token (parser)->location;
6715
  stmt = c_parser_compound_statement (parser);
6716
  objc_begin_try_stmt (loc, stmt);
6717
  while (c_parser_next_token_is_keyword (parser, RID_CATCH))
6718
    {
6719
      struct c_parm *parm;
6720
      c_parser_consume_token (parser);
6721
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6722
        break;
6723
      parm = c_parser_parameter_declaration (parser, NULL_TREE);
6724
      if (parm == NULL)
6725
        {
6726
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
6727
          break;
6728
        }
6729
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6730
      objc_begin_catch_clause (grokparm (parm));
6731
      if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
6732
        c_parser_compound_statement_nostart (parser);
6733
      objc_finish_catch_clause ();
6734
    }
6735
  if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
6736
    {
6737
      location_t finloc;
6738
      tree finstmt;
6739
      c_parser_consume_token (parser);
6740
      finloc = c_parser_peek_token (parser)->location;
6741
      finstmt = c_parser_compound_statement (parser);
6742
      objc_build_finally_clause (finloc, finstmt);
6743
    }
6744
  objc_finish_try_stmt ();
6745
}
6746
 
6747
/* Parse an objc-synchronized-statement.
6748
 
6749
   objc-synchronized-statement:
6750
     @synchronized ( expression ) compound-statement
6751
*/
6752
 
6753
static void
6754
c_parser_objc_synchronized_statement (c_parser *parser)
6755
{
6756
  location_t loc;
6757
  tree expr, stmt;
6758
  gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
6759
  c_parser_consume_token (parser);
6760
  loc = c_parser_peek_token (parser)->location;
6761
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
6762
    {
6763
      expr = c_parser_expression (parser).value;
6764
      expr = c_fully_fold (expr, false, NULL);
6765
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
6766
    }
6767
  else
6768
    expr = error_mark_node;
6769
  stmt = c_parser_compound_statement (parser);
6770
  objc_build_synchronized (loc, expr, stmt);
6771
}
6772
 
6773
/* Parse an objc-selector; return NULL_TREE without an error if the
6774
   next token is not an objc-selector.
6775
 
6776
   objc-selector:
6777
     identifier
6778
     one of
6779
       enum struct union if else while do for switch case default
6780
       break continue return goto asm sizeof typeof __alignof
6781
       unsigned long const short volatile signed restrict _Complex
6782
       in out inout bycopy byref oneway int char float double void _Bool
6783
 
6784
   ??? Why this selection of keywords but not, for example, storage
6785
   class specifiers?  */
6786
 
6787
static tree
6788
c_parser_objc_selector (c_parser *parser)
6789
{
6790
  c_token *token = c_parser_peek_token (parser);
6791
  tree value = token->value;
6792
  if (token->type == CPP_NAME)
6793
    {
6794
      c_parser_consume_token (parser);
6795
      return value;
6796
    }
6797
  if (token->type != CPP_KEYWORD)
6798
    return NULL_TREE;
6799
  switch (token->keyword)
6800
    {
6801
    case RID_ENUM:
6802
    case RID_STRUCT:
6803
    case RID_UNION:
6804
    case RID_IF:
6805
    case RID_ELSE:
6806
    case RID_WHILE:
6807
    case RID_DO:
6808
    case RID_FOR:
6809
    case RID_SWITCH:
6810
    case RID_CASE:
6811
    case RID_DEFAULT:
6812
    case RID_BREAK:
6813
    case RID_CONTINUE:
6814
    case RID_RETURN:
6815
    case RID_GOTO:
6816
    case RID_ASM:
6817
    case RID_SIZEOF:
6818
    case RID_TYPEOF:
6819
    case RID_ALIGNOF:
6820
    case RID_UNSIGNED:
6821
    case RID_LONG:
6822
    case RID_CONST:
6823
    case RID_SHORT:
6824
    case RID_VOLATILE:
6825
    case RID_SIGNED:
6826
    case RID_RESTRICT:
6827
    case RID_COMPLEX:
6828
    case RID_IN:
6829
    case RID_OUT:
6830
    case RID_INOUT:
6831
    case RID_BYCOPY:
6832
    case RID_BYREF:
6833
    case RID_ONEWAY:
6834
    case RID_INT:
6835
    case RID_CHAR:
6836
    case RID_FLOAT:
6837
    case RID_DOUBLE:
6838
    case RID_VOID:
6839
    case RID_BOOL:
6840
      c_parser_consume_token (parser);
6841
      return value;
6842
    default:
6843
      return NULL_TREE;
6844
    }
6845
}
6846
 
6847
/* Parse an objc-selector-arg.
6848
 
6849
   objc-selector-arg:
6850
     objc-selector
6851
     objc-keywordname-list
6852
 
6853
   objc-keywordname-list:
6854
     objc-keywordname
6855
     objc-keywordname-list objc-keywordname
6856
 
6857
   objc-keywordname:
6858
     objc-selector :
6859
     :
6860
*/
6861
 
6862
static tree
6863
c_parser_objc_selector_arg (c_parser *parser)
6864
{
6865
  tree sel = c_parser_objc_selector (parser);
6866
  tree list = NULL_TREE;
6867
  if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6868
    return sel;
6869
  while (true)
6870
    {
6871
      if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6872
        return list;
6873
      list = chainon (list, build_tree_list (sel, NULL_TREE));
6874
      sel = c_parser_objc_selector (parser);
6875
      if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6876
        break;
6877
    }
6878
  return list;
6879
}
6880
 
6881
/* Parse an objc-receiver.
6882
 
6883
   objc-receiver:
6884
     expression
6885
     class-name
6886
     type-name
6887
*/
6888
 
6889
static tree
6890
c_parser_objc_receiver (c_parser *parser)
6891
{
6892
  if (c_parser_peek_token (parser)->type == CPP_NAME
6893
      && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
6894
          || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
6895
    {
6896
      tree id = c_parser_peek_token (parser)->value;
6897
      c_parser_consume_token (parser);
6898
      return objc_get_class_reference (id);
6899
    }
6900
  return c_fully_fold (c_parser_expression (parser).value, false, NULL);
6901
}
6902
 
6903
/* Parse objc-message-args.
6904
 
6905
   objc-message-args:
6906
     objc-selector
6907
     objc-keywordarg-list
6908
 
6909
   objc-keywordarg-list:
6910
     objc-keywordarg
6911
     objc-keywordarg-list objc-keywordarg
6912
 
6913
   objc-keywordarg:
6914
     objc-selector : objc-keywordexpr
6915
     : objc-keywordexpr
6916
*/
6917
 
6918
static tree
6919
c_parser_objc_message_args (c_parser *parser)
6920
{
6921
  tree sel = c_parser_objc_selector (parser);
6922
  tree list = NULL_TREE;
6923
  if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
6924
    return sel;
6925
  while (true)
6926
    {
6927
      tree keywordexpr;
6928
      if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
6929
        return error_mark_node;
6930
      keywordexpr = c_parser_objc_keywordexpr (parser);
6931
      list = chainon (list, build_tree_list (sel, keywordexpr));
6932
      sel = c_parser_objc_selector (parser);
6933
      if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
6934
        break;
6935
    }
6936
  return list;
6937
}
6938
 
6939
/* Parse an objc-keywordexpr.
6940
 
6941
   objc-keywordexpr:
6942
     nonempty-expr-list
6943
*/
6944
 
6945
static tree
6946
c_parser_objc_keywordexpr (c_parser *parser)
6947
{
6948
  tree ret;
6949
  VEC(tree,gc) *expr_list = c_parser_expr_list (parser, true, true, NULL);
6950
  if (VEC_length (tree, expr_list) == 1)
6951
    {
6952
      /* Just return the expression, remove a level of
6953
         indirection.  */
6954
      ret = VEC_index (tree, expr_list, 0);
6955
    }
6956
  else
6957
    {
6958
      /* We have a comma expression, we will collapse later.  */
6959
      ret = build_tree_list_vec (expr_list);
6960
    }
6961
  release_tree_vector (expr_list);
6962
  return ret;
6963
}
6964
 
6965
 
6966
/* Handle pragmas.  Some OpenMP pragmas are associated with, and therefore
6967
   should be considered, statements.  ALLOW_STMT is true if we're within
6968
   the context of a function and such pragmas are to be allowed.  Returns
6969
   true if we actually parsed such a pragma.  */
6970
 
6971
static bool
6972
c_parser_pragma (c_parser *parser, enum pragma_context context)
6973
{
6974
  unsigned int id;
6975
 
6976
  id = c_parser_peek_token (parser)->pragma_kind;
6977
  gcc_assert (id != PRAGMA_NONE);
6978
 
6979
  switch (id)
6980
    {
6981
    case PRAGMA_OMP_BARRIER:
6982
      if (context != pragma_compound)
6983
        {
6984
          if (context == pragma_stmt)
6985
            c_parser_error (parser, "%<#pragma omp barrier%> may only be "
6986
                            "used in compound statements");
6987
          goto bad_stmt;
6988
        }
6989
      c_parser_omp_barrier (parser);
6990
      return false;
6991
 
6992
    case PRAGMA_OMP_FLUSH:
6993
      if (context != pragma_compound)
6994
        {
6995
          if (context == pragma_stmt)
6996
            c_parser_error (parser, "%<#pragma omp flush%> may only be "
6997
                            "used in compound statements");
6998
          goto bad_stmt;
6999
        }
7000
      c_parser_omp_flush (parser);
7001
      return false;
7002
 
7003
    case PRAGMA_OMP_TASKWAIT:
7004
      if (context != pragma_compound)
7005
        {
7006
          if (context == pragma_stmt)
7007
            c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
7008
                            "used in compound statements");
7009
          goto bad_stmt;
7010
        }
7011
      c_parser_omp_taskwait (parser);
7012
      return false;
7013
 
7014
    case PRAGMA_OMP_THREADPRIVATE:
7015
      c_parser_omp_threadprivate (parser);
7016
      return false;
7017
 
7018
    case PRAGMA_OMP_SECTION:
7019
      error_at (c_parser_peek_token (parser)->location,
7020
                "%<#pragma omp section%> may only be used in "
7021
                "%<#pragma omp sections%> construct");
7022
      c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
7023
      return false;
7024
 
7025
    case PRAGMA_GCC_PCH_PREPROCESS:
7026
      c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
7027
      c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
7028
      return false;
7029
 
7030
    default:
7031
      if (id < PRAGMA_FIRST_EXTERNAL)
7032
        {
7033
          if (context == pragma_external)
7034
            {
7035
            bad_stmt:
7036
              c_parser_error (parser, "expected declaration specifiers");
7037
              c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
7038
              return false;
7039
            }
7040
          c_parser_omp_construct (parser);
7041
          return true;
7042
        }
7043
      break;
7044
    }
7045
 
7046
  c_parser_consume_pragma (parser);
7047
  c_invoke_pragma_handler (id);
7048
 
7049
  /* Skip to EOL, but suppress any error message.  Those will have been
7050
     generated by the handler routine through calling error, as opposed
7051
     to calling c_parser_error.  */
7052
  parser->error = true;
7053
  c_parser_skip_to_pragma_eol (parser);
7054
 
7055
  return false;
7056
}
7057
 
7058
/* The interface the pragma parsers have to the lexer.  */
7059
 
7060
enum cpp_ttype
7061
pragma_lex (tree *value)
7062
{
7063
  c_token *tok = c_parser_peek_token (the_parser);
7064
  enum cpp_ttype ret = tok->type;
7065
 
7066
  *value = tok->value;
7067
  if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
7068
    ret = CPP_EOF;
7069
  else
7070
    {
7071
      if (ret == CPP_KEYWORD)
7072
        ret = CPP_NAME;
7073
      c_parser_consume_token (the_parser);
7074
    }
7075
 
7076
  return ret;
7077
}
7078
 
7079
static void
7080
c_parser_pragma_pch_preprocess (c_parser *parser)
7081
{
7082
  tree name = NULL;
7083
 
7084
  c_parser_consume_pragma (parser);
7085
  if (c_parser_next_token_is (parser, CPP_STRING))
7086
    {
7087
      name = c_parser_peek_token (parser)->value;
7088
      c_parser_consume_token (parser);
7089
    }
7090
  else
7091
    c_parser_error (parser, "expected string literal");
7092
  c_parser_skip_to_pragma_eol (parser);
7093
 
7094
  if (name)
7095
    c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
7096
}
7097
 
7098
/* OpenMP 2.5 parsing routines.  */
7099
 
7100
/* Returns name of the next clause.
7101
   If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
7102
   the token is not consumed.  Otherwise appropriate pragma_omp_clause is
7103
   returned and the token is consumed.  */
7104
 
7105
static pragma_omp_clause
7106
c_parser_omp_clause_name (c_parser *parser)
7107
{
7108
  pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
7109
 
7110
  if (c_parser_next_token_is_keyword (parser, RID_IF))
7111
    result = PRAGMA_OMP_CLAUSE_IF;
7112
  else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
7113
    result = PRAGMA_OMP_CLAUSE_DEFAULT;
7114
  else if (c_parser_next_token_is (parser, CPP_NAME))
7115
    {
7116
      const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
7117
 
7118
      switch (p[0])
7119
        {
7120
        case 'c':
7121
          if (!strcmp ("collapse", p))
7122
            result = PRAGMA_OMP_CLAUSE_COLLAPSE;
7123
          else if (!strcmp ("copyin", p))
7124
            result = PRAGMA_OMP_CLAUSE_COPYIN;
7125
          else if (!strcmp ("copyprivate", p))
7126
            result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
7127
          break;
7128
        case 'f':
7129
          if (!strcmp ("firstprivate", p))
7130
            result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
7131
          break;
7132
        case 'l':
7133
          if (!strcmp ("lastprivate", p))
7134
            result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
7135
          break;
7136
        case 'n':
7137
          if (!strcmp ("nowait", p))
7138
            result = PRAGMA_OMP_CLAUSE_NOWAIT;
7139
          else if (!strcmp ("num_threads", p))
7140
            result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
7141
          break;
7142
        case 'o':
7143
          if (!strcmp ("ordered", p))
7144
            result = PRAGMA_OMP_CLAUSE_ORDERED;
7145
          break;
7146
        case 'p':
7147
          if (!strcmp ("private", p))
7148
            result = PRAGMA_OMP_CLAUSE_PRIVATE;
7149
          break;
7150
        case 'r':
7151
          if (!strcmp ("reduction", p))
7152
            result = PRAGMA_OMP_CLAUSE_REDUCTION;
7153
          break;
7154
        case 's':
7155
          if (!strcmp ("schedule", p))
7156
            result = PRAGMA_OMP_CLAUSE_SCHEDULE;
7157
          else if (!strcmp ("shared", p))
7158
            result = PRAGMA_OMP_CLAUSE_SHARED;
7159
          break;
7160
        case 'u':
7161
          if (!strcmp ("untied", p))
7162
            result = PRAGMA_OMP_CLAUSE_UNTIED;
7163
          break;
7164
        }
7165
    }
7166
 
7167
  if (result != PRAGMA_OMP_CLAUSE_NONE)
7168
    c_parser_consume_token (parser);
7169
 
7170
  return result;
7171
}
7172
 
7173
/* Validate that a clause of the given type does not already exist.  */
7174
 
7175
static void
7176
check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
7177
                           const char *name)
7178
{
7179
  tree c;
7180
 
7181
  for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
7182
    if (OMP_CLAUSE_CODE (c) == code)
7183
      {
7184
        location_t loc = OMP_CLAUSE_LOCATION (c);
7185
        error_at (loc, "too many %qs clauses", name);
7186
        break;
7187
      }
7188
}
7189
 
7190
/* OpenMP 2.5:
7191
   variable-list:
7192
     identifier
7193
     variable-list , identifier
7194
 
7195
   If KIND is nonzero, create the appropriate node and install the
7196
   decl in OMP_CLAUSE_DECL and add the node to the head of the list.
7197
   If KIND is nonzero, CLAUSE_LOC is the location of the clause.
7198
 
7199
   If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
7200
   return the list created.  */
7201
 
7202
static tree
7203
c_parser_omp_variable_list (c_parser *parser,
7204
                            location_t clause_loc,
7205
                            enum omp_clause_code kind,
7206
                            tree list)
7207
{
7208
  if (c_parser_next_token_is_not (parser, CPP_NAME)
7209
      || c_parser_peek_token (parser)->id_kind != C_ID_ID)
7210
    c_parser_error (parser, "expected identifier");
7211
 
7212
  while (c_parser_next_token_is (parser, CPP_NAME)
7213
         && c_parser_peek_token (parser)->id_kind == C_ID_ID)
7214
    {
7215
      tree t = lookup_name (c_parser_peek_token (parser)->value);
7216
 
7217
      if (t == NULL_TREE)
7218
        undeclared_variable (c_parser_peek_token (parser)->location,
7219
                             c_parser_peek_token (parser)->value);
7220
      else if (t == error_mark_node)
7221
        ;
7222
      else if (kind != 0)
7223
        {
7224
          tree u = build_omp_clause (clause_loc, kind);
7225
          OMP_CLAUSE_DECL (u) = t;
7226
          OMP_CLAUSE_CHAIN (u) = list;
7227
          list = u;
7228
        }
7229
      else
7230
        list = tree_cons (t, NULL_TREE, list);
7231
 
7232
      c_parser_consume_token (parser);
7233
 
7234
      if (c_parser_next_token_is_not (parser, CPP_COMMA))
7235
        break;
7236
 
7237
      c_parser_consume_token (parser);
7238
    }
7239
 
7240
  return list;
7241
}
7242
 
7243
/* Similarly, but expect leading and trailing parenthesis.  This is a very
7244
   common case for omp clauses.  */
7245
 
7246
static tree
7247
c_parser_omp_var_list_parens (c_parser *parser, enum omp_clause_code kind,
7248
                              tree list)
7249
{
7250
  /* The clauses location.  */
7251
  location_t loc = c_parser_peek_token (parser)->location;
7252
 
7253
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7254
    {
7255
      list = c_parser_omp_variable_list (parser, loc, kind, list);
7256
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7257
    }
7258
  return list;
7259
}
7260
 
7261
/* OpenMP 3.0:
7262
   collapse ( constant-expression ) */
7263
 
7264
static tree
7265
c_parser_omp_clause_collapse (c_parser *parser, tree list)
7266
{
7267
  tree c, num = error_mark_node;
7268
  HOST_WIDE_INT n;
7269
  location_t loc;
7270
 
7271
  check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse");
7272
 
7273
  loc = c_parser_peek_token (parser)->location;
7274
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7275
    {
7276
      num = c_parser_expr_no_commas (parser, NULL).value;
7277
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7278
    }
7279
  if (num == error_mark_node)
7280
    return list;
7281
  if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
7282
      || !host_integerp (num, 0)
7283
      || (n = tree_low_cst (num, 0)) <= 0
7284
      || (int) n != n)
7285
    {
7286
      error_at (loc,
7287
                "collapse argument needs positive constant integer expression");
7288
      return list;
7289
    }
7290
  c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
7291
  OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
7292
  OMP_CLAUSE_CHAIN (c) = list;
7293
  return c;
7294
}
7295
 
7296
/* OpenMP 2.5:
7297
   copyin ( variable-list ) */
7298
 
7299
static tree
7300
c_parser_omp_clause_copyin (c_parser *parser, tree list)
7301
{
7302
  return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
7303
}
7304
 
7305
/* OpenMP 2.5:
7306
   copyprivate ( variable-list ) */
7307
 
7308
static tree
7309
c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
7310
{
7311
  return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
7312
}
7313
 
7314
/* OpenMP 2.5:
7315
   default ( shared | none ) */
7316
 
7317
static tree
7318
c_parser_omp_clause_default (c_parser *parser, tree list)
7319
{
7320
  enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
7321
  location_t loc = c_parser_peek_token (parser)->location;
7322
  tree c;
7323
 
7324
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7325
    return list;
7326
  if (c_parser_next_token_is (parser, CPP_NAME))
7327
    {
7328
      const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
7329
 
7330
      switch (p[0])
7331
        {
7332
        case 'n':
7333
          if (strcmp ("none", p) != 0)
7334
            goto invalid_kind;
7335
          kind = OMP_CLAUSE_DEFAULT_NONE;
7336
          break;
7337
 
7338
        case 's':
7339
          if (strcmp ("shared", p) != 0)
7340
            goto invalid_kind;
7341
          kind = OMP_CLAUSE_DEFAULT_SHARED;
7342
          break;
7343
 
7344
        default:
7345
          goto invalid_kind;
7346
        }
7347
 
7348
      c_parser_consume_token (parser);
7349
    }
7350
  else
7351
    {
7352
    invalid_kind:
7353
      c_parser_error (parser, "expected %<none%> or %<shared%>");
7354
    }
7355
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7356
 
7357
  if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
7358
    return list;
7359
 
7360
  check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
7361
  c = build_omp_clause (loc, OMP_CLAUSE_DEFAULT);
7362
  OMP_CLAUSE_CHAIN (c) = list;
7363
  OMP_CLAUSE_DEFAULT_KIND (c) = kind;
7364
 
7365
  return c;
7366
}
7367
 
7368
/* OpenMP 2.5:
7369
   firstprivate ( variable-list ) */
7370
 
7371
static tree
7372
c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
7373
{
7374
  return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
7375
}
7376
 
7377
/* OpenMP 2.5:
7378
   if ( expression ) */
7379
 
7380
static tree
7381
c_parser_omp_clause_if (c_parser *parser, tree list)
7382
{
7383
  location_t loc = c_parser_peek_token (parser)->location;
7384
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7385
    {
7386
      tree t = c_parser_paren_condition (parser);
7387
      tree c;
7388
 
7389
      check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
7390
 
7391
      c = build_omp_clause (loc, OMP_CLAUSE_IF);
7392
      OMP_CLAUSE_IF_EXPR (c) = t;
7393
      OMP_CLAUSE_CHAIN (c) = list;
7394
      list = c;
7395
    }
7396
  else
7397
    c_parser_error (parser, "expected %<(%>");
7398
 
7399
  return list;
7400
}
7401
 
7402
/* OpenMP 2.5:
7403
   lastprivate ( variable-list ) */
7404
 
7405
static tree
7406
c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
7407
{
7408
  return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
7409
}
7410
 
7411
/* OpenMP 2.5:
7412
   nowait */
7413
 
7414
static tree
7415
c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7416
{
7417
  tree c;
7418
  location_t loc = c_parser_peek_token (parser)->location;
7419
 
7420
  check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
7421
 
7422
  c = build_omp_clause (loc, OMP_CLAUSE_NOWAIT);
7423
  OMP_CLAUSE_CHAIN (c) = list;
7424
  return c;
7425
}
7426
 
7427
/* OpenMP 2.5:
7428
   num_threads ( expression ) */
7429
 
7430
static tree
7431
c_parser_omp_clause_num_threads (c_parser *parser, tree list)
7432
{
7433
  location_t num_threads_loc = c_parser_peek_token (parser)->location;
7434
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7435
    {
7436
      location_t expr_loc = c_parser_peek_token (parser)->location;
7437
      tree c, t = c_parser_expression (parser).value;
7438
      t = c_fully_fold (t, false, NULL);
7439
 
7440
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7441
 
7442
      if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
7443
        {
7444
          c_parser_error (parser, "expected integer expression");
7445
          return list;
7446
        }
7447
 
7448
      /* Attempt to statically determine when the number isn't positive.  */
7449
      c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
7450
                       build_int_cst (TREE_TYPE (t), 0));
7451
      if (CAN_HAVE_LOCATION_P (c))
7452
        SET_EXPR_LOCATION (c, expr_loc);
7453
      if (c == boolean_true_node)
7454
        {
7455
          warning_at (expr_loc, 0,
7456
                      "%<num_threads%> value must be positive");
7457
          t = integer_one_node;
7458
        }
7459
 
7460
      check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
7461
 
7462
      c = build_omp_clause (num_threads_loc, OMP_CLAUSE_NUM_THREADS);
7463
      OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
7464
      OMP_CLAUSE_CHAIN (c) = list;
7465
      list = c;
7466
    }
7467
 
7468
  return list;
7469
}
7470
 
7471
/* OpenMP 2.5:
7472
   ordered */
7473
 
7474
static tree
7475
c_parser_omp_clause_ordered (c_parser *parser, tree list)
7476
{
7477
  tree c;
7478
 
7479
  check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
7480
 
7481
  c = build_omp_clause (c_parser_peek_token (parser)->location,
7482
                        OMP_CLAUSE_ORDERED);
7483
  OMP_CLAUSE_CHAIN (c) = list;
7484
 
7485
  return c;
7486
}
7487
 
7488
/* OpenMP 2.5:
7489
   private ( variable-list ) */
7490
 
7491
static tree
7492
c_parser_omp_clause_private (c_parser *parser, tree list)
7493
{
7494
  return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
7495
}
7496
 
7497
/* OpenMP 2.5:
7498
   reduction ( reduction-operator : variable-list )
7499
 
7500
   reduction-operator:
7501
     One of: + * - & ^ | && || */
7502
 
7503
static tree
7504
c_parser_omp_clause_reduction (c_parser *parser, tree list)
7505
{
7506
  location_t clause_loc = c_parser_peek_token (parser)->location;
7507
  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7508
    {
7509
      enum tree_code code;
7510
 
7511
      switch (c_parser_peek_token (parser)->type)
7512
        {
7513
        case CPP_PLUS:
7514
          code = PLUS_EXPR;
7515
          break;
7516
        case CPP_MULT:
7517
          code = MULT_EXPR;
7518
          break;
7519
        case CPP_MINUS:
7520
          code = MINUS_EXPR;
7521
          break;
7522
        case CPP_AND:
7523
          code = BIT_AND_EXPR;
7524
          break;
7525
        case CPP_XOR:
7526
          code = BIT_XOR_EXPR;
7527
          break;
7528
        case CPP_OR:
7529
          code = BIT_IOR_EXPR;
7530
          break;
7531
        case CPP_AND_AND:
7532
          code = TRUTH_ANDIF_EXPR;
7533
          break;
7534
        case CPP_OR_OR:
7535
          code = TRUTH_ORIF_EXPR;
7536
          break;
7537
        default:
7538
          c_parser_error (parser,
7539
                          "expected %<+%>, %<*%>, %<-%>, %<&%>, "
7540
                          "%<^%>, %<|%>, %<&&%>, or %<||%>");
7541
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7542
          return list;
7543
        }
7544
      c_parser_consume_token (parser);
7545
      if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
7546
        {
7547
          tree nl, c;
7548
 
7549
          nl = c_parser_omp_variable_list (parser, clause_loc,
7550
                                           OMP_CLAUSE_REDUCTION, list);
7551
          for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
7552
            OMP_CLAUSE_REDUCTION_CODE (c) = code;
7553
 
7554
          list = nl;
7555
        }
7556
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7557
    }
7558
  return list;
7559
}
7560
 
7561
/* OpenMP 2.5:
7562
   schedule ( schedule-kind )
7563
   schedule ( schedule-kind , expression )
7564
 
7565
   schedule-kind:
7566
     static | dynamic | guided | runtime | auto
7567
*/
7568
 
7569
static tree
7570
c_parser_omp_clause_schedule (c_parser *parser, tree list)
7571
{
7572
  tree c, t;
7573
  location_t loc = c_parser_peek_token (parser)->location;
7574
 
7575
  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
7576
    return list;
7577
 
7578
  c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE);
7579
 
7580
  if (c_parser_next_token_is (parser, CPP_NAME))
7581
    {
7582
      tree kind = c_parser_peek_token (parser)->value;
7583
      const char *p = IDENTIFIER_POINTER (kind);
7584
 
7585
      switch (p[0])
7586
        {
7587
        case 'd':
7588
          if (strcmp ("dynamic", p) != 0)
7589
            goto invalid_kind;
7590
          OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
7591
          break;
7592
 
7593
        case 'g':
7594
          if (strcmp ("guided", p) != 0)
7595
            goto invalid_kind;
7596
          OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
7597
          break;
7598
 
7599
        case 'r':
7600
          if (strcmp ("runtime", p) != 0)
7601
            goto invalid_kind;
7602
          OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
7603
          break;
7604
 
7605
        default:
7606
          goto invalid_kind;
7607
        }
7608
    }
7609
  else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
7610
    OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
7611
  else if (c_parser_next_token_is_keyword (parser, RID_AUTO))
7612
    OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
7613
  else
7614
    goto invalid_kind;
7615
 
7616
  c_parser_consume_token (parser);
7617
  if (c_parser_next_token_is (parser, CPP_COMMA))
7618
    {
7619
      location_t here;
7620
      c_parser_consume_token (parser);
7621
 
7622
      here = c_parser_peek_token (parser)->location;
7623
      t = c_parser_expr_no_commas (parser, NULL).value;
7624
      t = c_fully_fold (t, false, NULL);
7625
 
7626
      if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
7627
        error_at (here, "schedule %<runtime%> does not take "
7628
                  "a %<chunk_size%> parameter");
7629
      else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
7630
        error_at (here,
7631
                  "schedule %<auto%> does not take "
7632
                  "a %<chunk_size%> parameter");
7633
      else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
7634
        OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
7635
      else
7636
        c_parser_error (parser, "expected integer expression");
7637
 
7638
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7639
    }
7640
  else
7641
    c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
7642
                               "expected %<,%> or %<)%>");
7643
 
7644
  check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
7645
  OMP_CLAUSE_CHAIN (c) = list;
7646
  return c;
7647
 
7648
 invalid_kind:
7649
  c_parser_error (parser, "invalid schedule kind");
7650
  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
7651
  return list;
7652
}
7653
 
7654
/* OpenMP 2.5:
7655
   shared ( variable-list ) */
7656
 
7657
static tree
7658
c_parser_omp_clause_shared (c_parser *parser, tree list)
7659
{
7660
  return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
7661
}
7662
 
7663
/* OpenMP 3.0:
7664
   untied */
7665
 
7666
static tree
7667
c_parser_omp_clause_untied (c_parser *parser ATTRIBUTE_UNUSED, tree list)
7668
{
7669
  tree c;
7670
 
7671
  /* FIXME: Should we allow duplicates?  */
7672
  check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied");
7673
 
7674
  c = build_omp_clause (c_parser_peek_token (parser)->location,
7675
                        OMP_CLAUSE_UNTIED);
7676
  OMP_CLAUSE_CHAIN (c) = list;
7677
 
7678
  return c;
7679
}
7680
 
7681
/* Parse all OpenMP clauses.  The set clauses allowed by the directive
7682
   is a bitmask in MASK.  Return the list of clauses found; the result
7683
   of clause default goes in *pdefault.  */
7684
 
7685
static tree
7686
c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
7687
                          const char *where)
7688
{
7689
  tree clauses = NULL;
7690
  bool first = true;
7691
 
7692
  while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7693
    {
7694
      location_t here;
7695
      pragma_omp_clause c_kind;
7696
      const char *c_name;
7697
      tree prev = clauses;
7698
 
7699
      if (!first && c_parser_next_token_is (parser, CPP_COMMA))
7700
        c_parser_consume_token (parser);
7701
 
7702
      first = false;
7703
      here = c_parser_peek_token (parser)->location;
7704
      c_kind = c_parser_omp_clause_name (parser);
7705
 
7706
      switch (c_kind)
7707
        {
7708
        case PRAGMA_OMP_CLAUSE_COLLAPSE:
7709
          clauses = c_parser_omp_clause_collapse (parser, clauses);
7710
          c_name = "collapse";
7711
          break;
7712
        case PRAGMA_OMP_CLAUSE_COPYIN:
7713
          clauses = c_parser_omp_clause_copyin (parser, clauses);
7714
          c_name = "copyin";
7715
          break;
7716
        case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
7717
          clauses = c_parser_omp_clause_copyprivate (parser, clauses);
7718
          c_name = "copyprivate";
7719
          break;
7720
        case PRAGMA_OMP_CLAUSE_DEFAULT:
7721
          clauses = c_parser_omp_clause_default (parser, clauses);
7722
          c_name = "default";
7723
          break;
7724
        case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
7725
          clauses = c_parser_omp_clause_firstprivate (parser, clauses);
7726
          c_name = "firstprivate";
7727
          break;
7728
        case PRAGMA_OMP_CLAUSE_IF:
7729
          clauses = c_parser_omp_clause_if (parser, clauses);
7730
          c_name = "if";
7731
          break;
7732
        case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
7733
          clauses = c_parser_omp_clause_lastprivate (parser, clauses);
7734
          c_name = "lastprivate";
7735
          break;
7736
        case PRAGMA_OMP_CLAUSE_NOWAIT:
7737
          clauses = c_parser_omp_clause_nowait (parser, clauses);
7738
          c_name = "nowait";
7739
          break;
7740
        case PRAGMA_OMP_CLAUSE_NUM_THREADS:
7741
          clauses = c_parser_omp_clause_num_threads (parser, clauses);
7742
          c_name = "num_threads";
7743
          break;
7744
        case PRAGMA_OMP_CLAUSE_ORDERED:
7745
          clauses = c_parser_omp_clause_ordered (parser, clauses);
7746
          c_name = "ordered";
7747
          break;
7748
        case PRAGMA_OMP_CLAUSE_PRIVATE:
7749
          clauses = c_parser_omp_clause_private (parser, clauses);
7750
          c_name = "private";
7751
          break;
7752
        case PRAGMA_OMP_CLAUSE_REDUCTION:
7753
          clauses = c_parser_omp_clause_reduction (parser, clauses);
7754
          c_name = "reduction";
7755
          break;
7756
        case PRAGMA_OMP_CLAUSE_SCHEDULE:
7757
          clauses = c_parser_omp_clause_schedule (parser, clauses);
7758
          c_name = "schedule";
7759
          break;
7760
        case PRAGMA_OMP_CLAUSE_SHARED:
7761
          clauses = c_parser_omp_clause_shared (parser, clauses);
7762
          c_name = "shared";
7763
          break;
7764
        case PRAGMA_OMP_CLAUSE_UNTIED:
7765
          clauses = c_parser_omp_clause_untied (parser, clauses);
7766
          c_name = "untied";
7767
          break;
7768
        default:
7769
          c_parser_error (parser, "expected %<#pragma omp%> clause");
7770
          goto saw_error;
7771
        }
7772
 
7773
      if (((mask >> c_kind) & 1) == 0 && !parser->error)
7774
        {
7775
          /* Remove the invalid clause(s) from the list to avoid
7776
             confusing the rest of the compiler.  */
7777
          clauses = prev;
7778
          error_at (here, "%qs is not valid for %qs", c_name, where);
7779
        }
7780
    }
7781
 
7782
 saw_error:
7783
  c_parser_skip_to_pragma_eol (parser);
7784
 
7785
  return c_finish_omp_clauses (clauses);
7786
}
7787
 
7788
/* OpenMP 2.5:
7789
   structured-block:
7790
     statement
7791
 
7792
   In practice, we're also interested in adding the statement to an
7793
   outer node.  So it is convenient if we work around the fact that
7794
   c_parser_statement calls add_stmt.  */
7795
 
7796
static tree
7797
c_parser_omp_structured_block (c_parser *parser)
7798
{
7799
  tree stmt = push_stmt_list ();
7800
  c_parser_statement (parser);
7801
  return pop_stmt_list (stmt);
7802
}
7803
 
7804
/* OpenMP 2.5:
7805
   # pragma omp atomic new-line
7806
     expression-stmt
7807
 
7808
   expression-stmt:
7809
     x binop= expr | x++ | ++x | x-- | --x
7810
   binop:
7811
     +, *, -, /, &, ^, |, <<, >>
7812
 
7813
  where x is an lvalue expression with scalar type.
7814
 
7815
  LOC is the location of the #pragma token.  */
7816
 
7817
static void
7818
c_parser_omp_atomic (location_t loc, c_parser *parser)
7819
{
7820
  tree lhs, rhs;
7821
  tree stmt;
7822
  enum tree_code code;
7823
  struct c_expr rhs_expr;
7824
 
7825
  c_parser_skip_to_pragma_eol (parser);
7826
 
7827
  lhs = c_parser_unary_expression (parser).value;
7828
  lhs = c_fully_fold (lhs, false, NULL);
7829
  switch (TREE_CODE (lhs))
7830
    {
7831
    case ERROR_MARK:
7832
    saw_error:
7833
      c_parser_skip_to_end_of_block_or_statement (parser);
7834
      return;
7835
 
7836
    case PREINCREMENT_EXPR:
7837
    case POSTINCREMENT_EXPR:
7838
      lhs = TREE_OPERAND (lhs, 0);
7839
      code = PLUS_EXPR;
7840
      rhs = integer_one_node;
7841
      break;
7842
 
7843
    case PREDECREMENT_EXPR:
7844
    case POSTDECREMENT_EXPR:
7845
      lhs = TREE_OPERAND (lhs, 0);
7846
      code = MINUS_EXPR;
7847
      rhs = integer_one_node;
7848
      break;
7849
 
7850
    default:
7851
      switch (c_parser_peek_token (parser)->type)
7852
        {
7853
        case CPP_MULT_EQ:
7854
          code = MULT_EXPR;
7855
          break;
7856
        case CPP_DIV_EQ:
7857
          code = TRUNC_DIV_EXPR;
7858
          break;
7859
        case CPP_PLUS_EQ:
7860
          code = PLUS_EXPR;
7861
          break;
7862
        case CPP_MINUS_EQ:
7863
          code = MINUS_EXPR;
7864
          break;
7865
        case CPP_LSHIFT_EQ:
7866
          code = LSHIFT_EXPR;
7867
          break;
7868
        case CPP_RSHIFT_EQ:
7869
          code = RSHIFT_EXPR;
7870
          break;
7871
        case CPP_AND_EQ:
7872
          code = BIT_AND_EXPR;
7873
          break;
7874
        case CPP_OR_EQ:
7875
          code = BIT_IOR_EXPR;
7876
          break;
7877
        case CPP_XOR_EQ:
7878
          code = BIT_XOR_EXPR;
7879
          break;
7880
        default:
7881
          c_parser_error (parser,
7882
                          "invalid operator for %<#pragma omp atomic%>");
7883
          goto saw_error;
7884
        }
7885
 
7886
      c_parser_consume_token (parser);
7887
      {
7888
        location_t rhs_loc = c_parser_peek_token (parser)->location;
7889
        rhs_expr = c_parser_expression (parser);
7890
        rhs_expr = default_function_array_conversion (rhs_loc, rhs_expr);
7891
      }
7892
      rhs = rhs_expr.value;
7893
      rhs = c_fully_fold (rhs, false, NULL);
7894
      break;
7895
    }
7896
  stmt = c_finish_omp_atomic (loc, code, lhs, rhs);
7897
  if (stmt != error_mark_node)
7898
    add_stmt (stmt);
7899
  c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
7900
}
7901
 
7902
 
7903
/* OpenMP 2.5:
7904
   # pragma omp barrier new-line
7905
*/
7906
 
7907
static void
7908
c_parser_omp_barrier (c_parser *parser)
7909
{
7910
  location_t loc = c_parser_peek_token (parser)->location;
7911
  c_parser_consume_pragma (parser);
7912
  c_parser_skip_to_pragma_eol (parser);
7913
 
7914
  c_finish_omp_barrier (loc);
7915
}
7916
 
7917
/* OpenMP 2.5:
7918
   # pragma omp critical [(name)] new-line
7919
     structured-block
7920
 
7921
  LOC is the location of the #pragma itself.  */
7922
 
7923
static tree
7924
c_parser_omp_critical (location_t loc, c_parser *parser)
7925
{
7926
  tree stmt, name = NULL;
7927
 
7928
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7929
    {
7930
      c_parser_consume_token (parser);
7931
      if (c_parser_next_token_is (parser, CPP_NAME))
7932
        {
7933
          name = c_parser_peek_token (parser)->value;
7934
          c_parser_consume_token (parser);
7935
          c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
7936
        }
7937
      else
7938
        c_parser_error (parser, "expected identifier");
7939
    }
7940
  else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7941
    c_parser_error (parser, "expected %<(%> or end of line");
7942
  c_parser_skip_to_pragma_eol (parser);
7943
 
7944
  stmt = c_parser_omp_structured_block (parser);
7945
  return c_finish_omp_critical (loc, stmt, name);
7946
}
7947
 
7948
/* OpenMP 2.5:
7949
   # pragma omp flush flush-vars[opt] new-line
7950
 
7951
   flush-vars:
7952
     ( variable-list ) */
7953
 
7954
static void
7955
c_parser_omp_flush (c_parser *parser)
7956
{
7957
  location_t loc = c_parser_peek_token (parser)->location;
7958
  c_parser_consume_pragma (parser);
7959
  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
7960
    c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
7961
  else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
7962
    c_parser_error (parser, "expected %<(%> or end of line");
7963
  c_parser_skip_to_pragma_eol (parser);
7964
 
7965
  c_finish_omp_flush (loc);
7966
}
7967
 
7968
/* Parse the restricted form of the for statement allowed by OpenMP.
7969
   The real trick here is to determine the loop control variable early
7970
   so that we can push a new decl if necessary to make it private.
7971
   LOC is the location of the OMP in "#pragma omp".  */
7972
 
7973
static tree
7974
c_parser_omp_for_loop (location_t loc,
7975
                       c_parser *parser, tree clauses, tree *par_clauses)
7976
{
7977
  tree decl, cond, incr, save_break, save_cont, body, init, stmt, cl;
7978
  tree declv, condv, incrv, initv, for_block = NULL, ret = NULL;
7979
  bool fail = false, open_brace_parsed = false;
7980
  int i, collapse = 1, nbraces = 0;
7981
  location_t for_loc;
7982
 
7983
  for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
7984
    if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
7985
      collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
7986
 
7987
  gcc_assert (collapse >= 1);
7988
 
7989
  declv = make_tree_vec (collapse);
7990
  initv = make_tree_vec (collapse);
7991
  condv = make_tree_vec (collapse);
7992
  incrv = make_tree_vec (collapse);
7993
 
7994
  if (!c_parser_next_token_is_keyword (parser, RID_FOR))
7995
    {
7996
      c_parser_error (parser, "for statement expected");
7997
      return NULL;
7998
    }
7999
  for_loc = c_parser_peek_token (parser)->location;
8000
  c_parser_consume_token (parser);
8001
 
8002
  for (i = 0; i < collapse; i++)
8003
    {
8004
      int bracecount = 0;
8005
 
8006
      if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
8007
        goto pop_scopes;
8008
 
8009
      /* Parse the initialization declaration or expression.  */
8010
      if (c_parser_next_token_starts_declspecs (parser))
8011
        {
8012
          if (i > 0)
8013
            for_block
8014
              = tree_cons (NULL, c_begin_compound_stmt (true), for_block);
8015
          c_parser_declaration_or_fndef (parser, true, true, true, true);
8016
          decl = check_for_loop_decls (for_loc);
8017
          if (decl == NULL)
8018
            goto error_init;
8019
          if (DECL_INITIAL (decl) == error_mark_node)
8020
            decl = error_mark_node;
8021
          init = decl;
8022
        }
8023
      else if (c_parser_next_token_is (parser, CPP_NAME)
8024
               && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
8025
        {
8026
          struct c_expr decl_exp;
8027
          struct c_expr init_exp;
8028
          location_t init_loc;
8029
 
8030
          decl_exp = c_parser_postfix_expression (parser);
8031
          decl = decl_exp.value;
8032
 
8033
          c_parser_require (parser, CPP_EQ, "expected %<=%>");
8034
 
8035
          init_loc = c_parser_peek_token (parser)->location;
8036
          init_exp = c_parser_expr_no_commas (parser, NULL);
8037
          init_exp = default_function_array_conversion (init_loc, init_exp);
8038
          init = build_modify_expr (init_loc, decl, decl_exp.original_type,
8039
                                    NOP_EXPR, init_loc, init_exp.value,
8040
                                    init_exp.original_type);
8041
          init = c_process_expr_stmt (init_loc, init);
8042
 
8043
          c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8044
        }
8045
      else
8046
        {
8047
        error_init:
8048
          c_parser_error (parser,
8049
                          "expected iteration declaration or initialization");
8050
          c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
8051
                                     "expected %<)%>");
8052
          fail = true;
8053
          goto parse_next;
8054
        }
8055
 
8056
      /* Parse the loop condition.  */
8057
      cond = NULL_TREE;
8058
      if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
8059
        {
8060
          location_t cond_loc = c_parser_peek_token (parser)->location;
8061
          struct c_expr cond_expr = c_parser_binary_expression (parser, NULL);
8062
 
8063
          cond = cond_expr.value;
8064
          cond = c_objc_common_truthvalue_conversion (cond_loc, cond);
8065
          cond = c_fully_fold (cond, false, NULL);
8066
          switch (cond_expr.original_code)
8067
            {
8068
            case GT_EXPR:
8069
            case GE_EXPR:
8070
            case LT_EXPR:
8071
            case LE_EXPR:
8072
              break;
8073
            default:
8074
              /* Can't be cond = error_mark_node, because we want to preserve
8075
                 the location until c_finish_omp_for.  */
8076
              cond = build1 (NOP_EXPR, boolean_type_node, error_mark_node);
8077
              break;
8078
            }
8079
          protected_set_expr_location (cond, cond_loc);
8080
        }
8081
      c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
8082
 
8083
      /* Parse the increment expression.  */
8084
      incr = NULL_TREE;
8085
      if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
8086
        {
8087
          location_t incr_loc = c_parser_peek_token (parser)->location;
8088
 
8089
          incr = c_process_expr_stmt (incr_loc,
8090
                                      c_parser_expression (parser).value);
8091
        }
8092
      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
8093
 
8094
      if (decl == NULL || decl == error_mark_node || init == error_mark_node)
8095
        fail = true;
8096
      else
8097
        {
8098
          TREE_VEC_ELT (declv, i) = decl;
8099
          TREE_VEC_ELT (initv, i) = init;
8100
          TREE_VEC_ELT (condv, i) = cond;
8101
          TREE_VEC_ELT (incrv, i) = incr;
8102
        }
8103
 
8104
    parse_next:
8105
      if (i == collapse - 1)
8106
        break;
8107
 
8108
      /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
8109
         in between the collapsed for loops to be still considered perfectly
8110
         nested.  Hopefully the final version clarifies this.
8111
         For now handle (multiple) {'s and empty statements.  */
8112
      do
8113
        {
8114
          if (c_parser_next_token_is_keyword (parser, RID_FOR))
8115
            {
8116
              c_parser_consume_token (parser);
8117
              break;
8118
            }
8119
          else if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
8120
            {
8121
              c_parser_consume_token (parser);
8122
              bracecount++;
8123
            }
8124
          else if (bracecount
8125
                   && c_parser_next_token_is (parser, CPP_SEMICOLON))
8126
            c_parser_consume_token (parser);
8127
          else
8128
            {
8129
              c_parser_error (parser, "not enough perfectly nested loops");
8130
              if (bracecount)
8131
                {
8132
                  open_brace_parsed = true;
8133
                  bracecount--;
8134
                }
8135
              fail = true;
8136
              collapse = 0;
8137
              break;
8138
            }
8139
        }
8140
      while (1);
8141
 
8142
      nbraces += bracecount;
8143
    }
8144
 
8145
  save_break = c_break_label;
8146
  c_break_label = size_one_node;
8147
  save_cont = c_cont_label;
8148
  c_cont_label = NULL_TREE;
8149
  body = push_stmt_list ();
8150
 
8151
  if (open_brace_parsed)
8152
    {
8153
      location_t here = c_parser_peek_token (parser)->location;
8154
      stmt = c_begin_compound_stmt (true);
8155
      c_parser_compound_statement_nostart (parser);
8156
      add_stmt (c_end_compound_stmt (here, stmt, true));
8157
    }
8158
  else
8159
    add_stmt (c_parser_c99_block_statement (parser));
8160
  if (c_cont_label)
8161
    {
8162
      tree t = build1 (LABEL_EXPR, void_type_node, c_cont_label);
8163
      SET_EXPR_LOCATION (t, loc);
8164
      add_stmt (t);
8165
    }
8166
 
8167
  body = pop_stmt_list (body);
8168
  c_break_label = save_break;
8169
  c_cont_label = save_cont;
8170
 
8171
  while (nbraces)
8172
    {
8173
      if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
8174
        {
8175
          c_parser_consume_token (parser);
8176
          nbraces--;
8177
        }
8178
      else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
8179
        c_parser_consume_token (parser);
8180
      else
8181
        {
8182
          c_parser_error (parser, "collapsed loops not perfectly nested");
8183
          while (nbraces)
8184
            {
8185
              location_t here = c_parser_peek_token (parser)->location;
8186
              stmt = c_begin_compound_stmt (true);
8187
              add_stmt (body);
8188
              c_parser_compound_statement_nostart (parser);
8189
              body = c_end_compound_stmt (here, stmt, true);
8190
              nbraces--;
8191
            }
8192
          goto pop_scopes;
8193
        }
8194
    }
8195
 
8196
  /* Only bother calling c_finish_omp_for if we haven't already generated
8197
     an error from the initialization parsing.  */
8198
  if (!fail)
8199
    {
8200
      stmt = c_finish_omp_for (loc, declv, initv, condv, incrv, body, NULL);
8201
      if (stmt)
8202
        {
8203
          if (par_clauses != NULL)
8204
            {
8205
              tree *c;
8206
              for (c = par_clauses; *c ; )
8207
                if (OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_FIRSTPRIVATE
8208
                    && OMP_CLAUSE_CODE (*c) != OMP_CLAUSE_LASTPRIVATE)
8209
                  c = &OMP_CLAUSE_CHAIN (*c);
8210
                else
8211
                  {
8212
                    for (i = 0; i < collapse; i++)
8213
                      if (TREE_VEC_ELT (declv, i) == OMP_CLAUSE_DECL (*c))
8214
                        break;
8215
                    if (i == collapse)
8216
                      c = &OMP_CLAUSE_CHAIN (*c);
8217
                    else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE)
8218
                      {
8219
                        error_at (loc,
8220
                                  "iteration variable %qD should not be firstprivate",
8221
                                  OMP_CLAUSE_DECL (*c));
8222
                        *c = OMP_CLAUSE_CHAIN (*c);
8223
                      }
8224
                    else
8225
                      {
8226
                        /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES,
8227
                           change it to shared (decl) in
8228
                           OMP_PARALLEL_CLAUSES.  */
8229
                        tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
8230
                                                   OMP_CLAUSE_LASTPRIVATE);
8231
                        OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
8232
                        OMP_CLAUSE_CHAIN (l) = clauses;
8233
                        clauses = l;
8234
                        OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
8235
                      }
8236
                  }
8237
            }
8238
          OMP_FOR_CLAUSES (stmt) = clauses;
8239
        }
8240
      ret = stmt;
8241
    }
8242
pop_scopes:
8243
  while (for_block)
8244
    {
8245
      /* FIXME diagnostics: LOC below should be the actual location of
8246
         this particular for block.  We need to build a list of
8247
         locations to go along with FOR_BLOCK.  */
8248
      stmt = c_end_compound_stmt (loc, TREE_VALUE (for_block), true);
8249
      add_stmt (stmt);
8250
      for_block = TREE_CHAIN (for_block);
8251
    }
8252
  return ret;
8253
}
8254
 
8255
/* OpenMP 2.5:
8256
   #pragma omp for for-clause[optseq] new-line
8257
     for-loop
8258
 
8259
   LOC is the location of the #pragma token.
8260
*/
8261
 
8262
#define OMP_FOR_CLAUSE_MASK                             \
8263
        ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
8264
        | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
8265
        | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
8266
        | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
8267
        | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
8268
        | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
8269
        | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE)            \
8270
        | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
8271
 
8272
static tree
8273
c_parser_omp_for (location_t loc, c_parser *parser)
8274
{
8275
  tree block, clauses, ret;
8276
 
8277
  clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
8278
                                      "#pragma omp for");
8279
 
8280
  block = c_begin_compound_stmt (true);
8281
  ret = c_parser_omp_for_loop (loc, parser, clauses, NULL);
8282
  block = c_end_compound_stmt (loc, block, true);
8283
  add_stmt (block);
8284
 
8285
  return ret;
8286
}
8287
 
8288
/* OpenMP 2.5:
8289
   # pragma omp master new-line
8290
     structured-block
8291
 
8292
   LOC is the location of the #pragma token.
8293
*/
8294
 
8295
static tree
8296
c_parser_omp_master (location_t loc, c_parser *parser)
8297
{
8298
  c_parser_skip_to_pragma_eol (parser);
8299
  return c_finish_omp_master (loc, c_parser_omp_structured_block (parser));
8300
}
8301
 
8302
/* OpenMP 2.5:
8303
   # pragma omp ordered new-line
8304
     structured-block
8305
 
8306
   LOC is the location of the #pragma itself.
8307
*/
8308
 
8309
static tree
8310
c_parser_omp_ordered (location_t loc, c_parser *parser)
8311
{
8312
  c_parser_skip_to_pragma_eol (parser);
8313
  return c_finish_omp_ordered (loc, c_parser_omp_structured_block (parser));
8314
}
8315
 
8316
/* OpenMP 2.5:
8317
 
8318
   section-scope:
8319
     { section-sequence }
8320
 
8321
   section-sequence:
8322
     section-directive[opt] structured-block
8323
     section-sequence section-directive structured-block
8324
 
8325
    SECTIONS_LOC is the location of the #pragma omp sections.  */
8326
 
8327
static tree
8328
c_parser_omp_sections_scope (location_t sections_loc, c_parser *parser)
8329
{
8330
  tree stmt, substmt;
8331
  bool error_suppress = false;
8332
  location_t loc;
8333
 
8334
  loc = c_parser_peek_token (parser)->location;
8335
  if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
8336
    {
8337
      /* Avoid skipping until the end of the block.  */
8338
      parser->error = false;
8339
      return NULL_TREE;
8340
    }
8341
 
8342
  stmt = push_stmt_list ();
8343
 
8344
  if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
8345
    {
8346
      substmt = push_stmt_list ();
8347
 
8348
      while (1)
8349
        {
8350
          c_parser_statement (parser);
8351
 
8352
          if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
8353
            break;
8354
          if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
8355
            break;
8356
          if (c_parser_next_token_is (parser, CPP_EOF))
8357
            break;
8358
        }
8359
 
8360
      substmt = pop_stmt_list (substmt);
8361
      substmt = build1 (OMP_SECTION, void_type_node, substmt);
8362
      SET_EXPR_LOCATION (substmt, loc);
8363
      add_stmt (substmt);
8364
    }
8365
 
8366
  while (1)
8367
    {
8368
      if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
8369
        break;
8370
      if (c_parser_next_token_is (parser, CPP_EOF))
8371
        break;
8372
 
8373
      loc = c_parser_peek_token (parser)->location;
8374
      if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
8375
        {
8376
          c_parser_consume_pragma (parser);
8377
          c_parser_skip_to_pragma_eol (parser);
8378
          error_suppress = false;
8379
        }
8380
      else if (!error_suppress)
8381
        {
8382
          error_at (loc, "expected %<#pragma omp section%> or %<}%>");
8383
          error_suppress = true;
8384
        }
8385
 
8386
      substmt = c_parser_omp_structured_block (parser);
8387
      substmt = build1 (OMP_SECTION, void_type_node, substmt);
8388
      SET_EXPR_LOCATION (substmt, loc);
8389
      add_stmt (substmt);
8390
    }
8391
  c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
8392
                             "expected %<#pragma omp section%> or %<}%>");
8393
 
8394
  substmt = pop_stmt_list (stmt);
8395
 
8396
  stmt = make_node (OMP_SECTIONS);
8397
  SET_EXPR_LOCATION (stmt, sections_loc);
8398
  TREE_TYPE (stmt) = void_type_node;
8399
  OMP_SECTIONS_BODY (stmt) = substmt;
8400
 
8401
  return add_stmt (stmt);
8402
}
8403
 
8404
/* OpenMP 2.5:
8405
   # pragma omp sections sections-clause[optseq] newline
8406
     sections-scope
8407
 
8408
   LOC is the location of the #pragma token.
8409
*/
8410
 
8411
#define OMP_SECTIONS_CLAUSE_MASK                        \
8412
        ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
8413
        | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
8414
        | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
8415
        | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
8416
        | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
8417
 
8418
static tree
8419
c_parser_omp_sections (location_t loc, c_parser *parser)
8420
{
8421
  tree block, clauses, ret;
8422
 
8423
  clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
8424
                                      "#pragma omp sections");
8425
 
8426
  block = c_begin_compound_stmt (true);
8427
  ret = c_parser_omp_sections_scope (loc, parser);
8428
  if (ret)
8429
    OMP_SECTIONS_CLAUSES (ret) = clauses;
8430
  block = c_end_compound_stmt (loc, block, true);
8431
  add_stmt (block);
8432
 
8433
  return ret;
8434
}
8435
 
8436
/* OpenMP 2.5:
8437
   # pragma parallel parallel-clause new-line
8438
   # pragma parallel for parallel-for-clause new-line
8439
   # pragma parallel sections parallel-sections-clause new-line
8440
 
8441
   LOC is the location of the #pragma token.
8442
*/
8443
 
8444
#define OMP_PARALLEL_CLAUSE_MASK                        \
8445
        ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
8446
        | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
8447
        | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
8448
        | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
8449
        | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
8450
        | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
8451
        | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
8452
        | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
8453
 
8454
static tree
8455
c_parser_omp_parallel (location_t loc, c_parser *parser)
8456
{
8457
  enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
8458
  const char *p_name = "#pragma omp parallel";
8459
  tree stmt, clauses, par_clause, ws_clause, block;
8460
  unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
8461
 
8462
  if (c_parser_next_token_is_keyword (parser, RID_FOR))
8463
    {
8464
      c_parser_consume_token (parser);
8465
      p_kind = PRAGMA_OMP_PARALLEL_FOR;
8466
      p_name = "#pragma omp parallel for";
8467
      mask |= OMP_FOR_CLAUSE_MASK;
8468
      mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
8469
    }
8470
  else if (c_parser_next_token_is (parser, CPP_NAME))
8471
    {
8472
      const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
8473
      if (strcmp (p, "sections") == 0)
8474
        {
8475
          c_parser_consume_token (parser);
8476
          p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
8477
          p_name = "#pragma omp parallel sections";
8478
          mask |= OMP_SECTIONS_CLAUSE_MASK;
8479
          mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
8480
        }
8481
    }
8482
 
8483
  clauses = c_parser_omp_all_clauses (parser, mask, p_name);
8484
 
8485
  switch (p_kind)
8486
    {
8487
    case PRAGMA_OMP_PARALLEL:
8488
      block = c_begin_omp_parallel ();
8489
      c_parser_statement (parser);
8490
      stmt = c_finish_omp_parallel (loc, clauses, block);
8491
      break;
8492
 
8493
    case PRAGMA_OMP_PARALLEL_FOR:
8494
      block = c_begin_omp_parallel ();
8495
      c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
8496
      c_parser_omp_for_loop (loc, parser, ws_clause, &par_clause);
8497
      stmt = c_finish_omp_parallel (loc, par_clause, block);
8498
      OMP_PARALLEL_COMBINED (stmt) = 1;
8499
      break;
8500
 
8501
    case PRAGMA_OMP_PARALLEL_SECTIONS:
8502
      block = c_begin_omp_parallel ();
8503
      c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
8504
      stmt = c_parser_omp_sections_scope (loc, parser);
8505
      if (stmt)
8506
        OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
8507
      stmt = c_finish_omp_parallel (loc, par_clause, block);
8508
      OMP_PARALLEL_COMBINED (stmt) = 1;
8509
      break;
8510
 
8511
    default:
8512
      gcc_unreachable ();
8513
    }
8514
 
8515
  return stmt;
8516
}
8517
 
8518
/* OpenMP 2.5:
8519
   # pragma omp single single-clause[optseq] new-line
8520
     structured-block
8521
 
8522
   LOC is the location of the #pragma.
8523
*/
8524
 
8525
#define OMP_SINGLE_CLAUSE_MASK                          \
8526
        ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
8527
        | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
8528
        | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
8529
        | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
8530
 
8531
static tree
8532
c_parser_omp_single (location_t loc, c_parser *parser)
8533
{
8534
  tree stmt = make_node (OMP_SINGLE);
8535
  SET_EXPR_LOCATION (stmt, loc);
8536
  TREE_TYPE (stmt) = void_type_node;
8537
 
8538
  OMP_SINGLE_CLAUSES (stmt)
8539
    = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
8540
                                "#pragma omp single");
8541
  OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
8542
 
8543
  return add_stmt (stmt);
8544
}
8545
 
8546
/* OpenMP 3.0:
8547
   # pragma omp task task-clause[optseq] new-line
8548
 
8549
   LOC is the location of the #pragma.
8550
*/
8551
 
8552
#define OMP_TASK_CLAUSE_MASK                            \
8553
        ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
8554
        | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
8555
        | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
8556
        | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
8557
        | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
8558
        | (1u << PRAGMA_OMP_CLAUSE_SHARED))
8559
 
8560
static tree
8561
c_parser_omp_task (location_t loc, c_parser *parser)
8562
{
8563
  tree clauses, block;
8564
 
8565
  clauses = c_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
8566
                                      "#pragma omp task");
8567
 
8568
  block = c_begin_omp_task ();
8569
  c_parser_statement (parser);
8570
  return c_finish_omp_task (loc, clauses, block);
8571
}
8572
 
8573
/* OpenMP 3.0:
8574
   # pragma omp taskwait new-line
8575
*/
8576
 
8577
static void
8578
c_parser_omp_taskwait (c_parser *parser)
8579
{
8580
  location_t loc = c_parser_peek_token (parser)->location;
8581
  c_parser_consume_pragma (parser);
8582
  c_parser_skip_to_pragma_eol (parser);
8583
 
8584
  c_finish_omp_taskwait (loc);
8585
}
8586
 
8587
/* Main entry point to parsing most OpenMP pragmas.  */
8588
 
8589
static void
8590
c_parser_omp_construct (c_parser *parser)
8591
{
8592
  enum pragma_kind p_kind;
8593
  location_t loc;
8594
  tree stmt;
8595
 
8596
  loc = c_parser_peek_token (parser)->location;
8597
  p_kind = c_parser_peek_token (parser)->pragma_kind;
8598
  c_parser_consume_pragma (parser);
8599
 
8600
  switch (p_kind)
8601
    {
8602
    case PRAGMA_OMP_ATOMIC:
8603
      c_parser_omp_atomic (loc, parser);
8604
      return;
8605
    case PRAGMA_OMP_CRITICAL:
8606
      stmt = c_parser_omp_critical (loc, parser);
8607
      break;
8608
    case PRAGMA_OMP_FOR:
8609
      stmt = c_parser_omp_for (loc, parser);
8610
      break;
8611
    case PRAGMA_OMP_MASTER:
8612
      stmt = c_parser_omp_master (loc, parser);
8613
      break;
8614
    case PRAGMA_OMP_ORDERED:
8615
      stmt = c_parser_omp_ordered (loc, parser);
8616
      break;
8617
    case PRAGMA_OMP_PARALLEL:
8618
      stmt = c_parser_omp_parallel (loc, parser);
8619
      break;
8620
    case PRAGMA_OMP_SECTIONS:
8621
      stmt = c_parser_omp_sections (loc, parser);
8622
      break;
8623
    case PRAGMA_OMP_SINGLE:
8624
      stmt = c_parser_omp_single (loc, parser);
8625
      break;
8626
    case PRAGMA_OMP_TASK:
8627
      stmt = c_parser_omp_task (loc, parser);
8628
      break;
8629
    default:
8630
      gcc_unreachable ();
8631
    }
8632
 
8633
  if (stmt)
8634
    gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
8635
}
8636
 
8637
 
8638
/* OpenMP 2.5:
8639
   # pragma omp threadprivate (variable-list) */
8640
 
8641
static void
8642
c_parser_omp_threadprivate (c_parser *parser)
8643
{
8644
  tree vars, t;
8645
  location_t loc;
8646
 
8647
  c_parser_consume_pragma (parser);
8648
  loc = c_parser_peek_token (parser)->location;
8649
  vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
8650
 
8651
  /* Mark every variable in VARS to be assigned thread local storage.  */
8652
  for (t = vars; t; t = TREE_CHAIN (t))
8653
    {
8654
      tree v = TREE_PURPOSE (t);
8655
 
8656
      /* FIXME diagnostics: Ideally we should keep individual
8657
         locations for all the variables in the var list to make the
8658
         following errors more precise.  Perhaps
8659
         c_parser_omp_var_list_parens() should construct a list of
8660
         locations to go along with the var list.  */
8661
 
8662
      /* If V had already been marked threadprivate, it doesn't matter
8663
         whether it had been used prior to this point.  */
8664
      if (TREE_CODE (v) != VAR_DECL)
8665
        error_at (loc, "%qD is not a variable", v);
8666
      else if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
8667
        error_at (loc, "%qE declared %<threadprivate%> after first use", v);
8668
      else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
8669
        error_at (loc, "automatic variable %qE cannot be %<threadprivate%>", v);
8670
      else if (TREE_TYPE (v) == error_mark_node)
8671
        ;
8672
      else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
8673
        error_at (loc, "%<threadprivate%> %qE has incomplete type", v);
8674
      else
8675
        {
8676
          if (! DECL_THREAD_LOCAL_P (v))
8677
            {
8678
              DECL_TLS_MODEL (v) = decl_default_tls_model (v);
8679
              /* If rtl has been already set for this var, call
8680
                 make_decl_rtl once again, so that encode_section_info
8681
                 has a chance to look at the new decl flags.  */
8682
              if (DECL_RTL_SET_P (v))
8683
                make_decl_rtl (v);
8684
            }
8685
          C_DECL_THREADPRIVATE_P (v) = 1;
8686
        }
8687
    }
8688
 
8689
  c_parser_skip_to_pragma_eol (parser);
8690
}
8691
 
8692
 
8693
/* Parse a single source file.  */
8694
 
8695
void
8696
c_parse_file (void)
8697
{
8698
  /* Use local storage to begin.  If the first token is a pragma, parse it.
8699
     If it is #pragma GCC pch_preprocess, then this will load a PCH file
8700
     which will cause garbage collection.  */
8701
  c_parser tparser;
8702
 
8703
  memset (&tparser, 0, sizeof tparser);
8704
  the_parser = &tparser;
8705
 
8706
  if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
8707
    c_parser_pragma_pch_preprocess (&tparser);
8708
 
8709
  the_parser = GGC_NEW (c_parser);
8710
  *the_parser = tparser;
8711
 
8712
  /* Initialize EH, if we've been told to do so.  */
8713
  if (flag_exceptions)
8714
    using_eh_for_cleanups ();
8715
 
8716
  c_parser_translation_unit (the_parser);
8717
  the_parser = NULL;
8718
}
8719
 
8720
#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.