00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "config.h"
00041 #include "system.h"
00042 #include "coretypes.h"
00043 #include "tm.h"
00044 #include "tree.h"
00045 #include "rtl.h"
00046 #include "langhooks.h"
00047 #include "input.h"
00048 #include "cpplib.h"
00049 #include "timevar.h"
00050 #include "c-pragma.h"
00051 #include "c-tree.h"
00052 #include "flags.h"
00053 #include "output.h"
00054 #include "toplev.h"
00055 #include "ggc.h"
00056 #include "c-common.h"
00057 #include "vec.h"
00058 #include "target.h"
00059 #include "cgraph.h"
00060
00061
00062
00063
00064 int yydebug;
00065
00066
00067
00068 static int objc_pq_context = 0;
00069
00070
00071
00072
00073
00074 static int objc_need_raw_identifier = 0;
00075 #define OBJC_NEED_RAW_IDENTIFIER(VAL) \
00076 do { \
00077 if (c_dialect_objc ()) \
00078 objc_need_raw_identifier = VAL; \
00079 } while (0)
00080
00081
00082 struct resword
00083 {
00084 const char *word;
00085 ENUM_BITFIELD(rid) rid : 16;
00086 unsigned int disable : 16;
00087 };
00088
00089
00090
00091 #define D_C89 0x01
00092 #define D_EXT 0x02
00093 #define D_EXT89 0x04
00094 #define D_OBJC 0x08
00095
00096 static const struct resword reswords[] =
00097 {
00098 { "_Bool", RID_BOOL, 0 },
00099 { "_Complex", RID_COMPLEX, 0 },
00100 { "_Decimal32", RID_DFLOAT32, D_EXT },
00101 { "_Decimal64", RID_DFLOAT64, D_EXT },
00102 { "_Decimal128", RID_DFLOAT128, D_EXT },
00103 { "__FUNCTION__", RID_FUNCTION_NAME, 0 },
00104 { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
00105 { "__alignof", RID_ALIGNOF, 0 },
00106 { "__alignof__", RID_ALIGNOF, 0 },
00107 { "__asm", RID_ASM, 0 },
00108 { "__asm__", RID_ASM, 0 },
00109 { "__attribute", RID_ATTRIBUTE, 0 },
00110 { "__attribute__", RID_ATTRIBUTE, 0 },
00111 { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
00112 { "__builtin_offsetof", RID_OFFSETOF, 0 },
00113 { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
00114 { "__builtin_va_arg", RID_VA_ARG, 0 },
00115 { "__complex", RID_COMPLEX, 0 },
00116 { "__complex__", RID_COMPLEX, 0 },
00117 { "__const", RID_CONST, 0 },
00118 { "__const__", RID_CONST, 0 },
00119 { "__extension__", RID_EXTENSION, 0 },
00120 { "__func__", RID_C99_FUNCTION_NAME, 0 },
00121 { "__imag", RID_IMAGPART, 0 },
00122 { "__imag__", RID_IMAGPART, 0 },
00123 { "__inline", RID_INLINE, 0 },
00124 { "__inline__", RID_INLINE, 0 },
00125 { "__label__", RID_LABEL, 0 },
00126 { "__real", RID_REALPART, 0 },
00127 { "__real__", RID_REALPART, 0 },
00128 { "__restrict", RID_RESTRICT, 0 },
00129 { "__restrict__", RID_RESTRICT, 0 },
00130 { "__signed", RID_SIGNED, 0 },
00131 { "__signed__", RID_SIGNED, 0 },
00132 { "__thread", RID_THREAD, 0 },
00133 { "__typeof", RID_TYPEOF, 0 },
00134 { "__typeof__", RID_TYPEOF, 0 },
00135 { "__volatile", RID_VOLATILE, 0 },
00136 { "__volatile__", RID_VOLATILE, 0 },
00137 { "asm", RID_ASM, D_EXT },
00138 { "auto", RID_AUTO, 0 },
00139 { "break", RID_BREAK, 0 },
00140 { "case", RID_CASE, 0 },
00141 { "char", RID_CHAR, 0 },
00142 { "const", RID_CONST, 0 },
00143 { "continue", RID_CONTINUE, 0 },
00144 { "default", RID_DEFAULT, 0 },
00145 { "do", RID_DO, 0 },
00146 { "double", RID_DOUBLE, 0 },
00147 { "else", RID_ELSE, 0 },
00148 { "enum", RID_ENUM, 0 },
00149 { "extern", RID_EXTERN, 0 },
00150 { "float", RID_FLOAT, 0 },
00151 { "for", RID_FOR, 0 },
00152 { "goto", RID_GOTO, 0 },
00153 { "if", RID_IF, 0 },
00154 { "inline", RID_INLINE, D_EXT89 },
00155 { "int", RID_INT, 0 },
00156 { "long", RID_LONG, 0 },
00157 { "register", RID_REGISTER, 0 },
00158 { "restrict", RID_RESTRICT, D_C89 },
00159 { "return", RID_RETURN, 0 },
00160 { "short", RID_SHORT, 0 },
00161 { "signed", RID_SIGNED, 0 },
00162 { "sizeof", RID_SIZEOF, 0 },
00163 { "static", RID_STATIC, 0 },
00164 { "struct", RID_STRUCT, 0 },
00165 { "switch", RID_SWITCH, 0 },
00166 { "typedef", RID_TYPEDEF, 0 },
00167 { "typeof", RID_TYPEOF, D_EXT },
00168 { "union", RID_UNION, 0 },
00169 { "unsigned", RID_UNSIGNED, 0 },
00170 { "void", RID_VOID, 0 },
00171 { "volatile", RID_VOLATILE, 0 },
00172 { "while", RID_WHILE, 0 },
00173
00174
00175 { "class", RID_AT_CLASS, D_OBJC },
00176 { "compatibility_alias", RID_AT_ALIAS, D_OBJC },
00177 { "defs", RID_AT_DEFS, D_OBJC },
00178 { "encode", RID_AT_ENCODE, D_OBJC },
00179 { "end", RID_AT_END, D_OBJC },
00180 { "implementation", RID_AT_IMPLEMENTATION, D_OBJC },
00181 { "interface", RID_AT_INTERFACE, D_OBJC },
00182 { "private", RID_AT_PRIVATE, D_OBJC },
00183 { "protected", RID_AT_PROTECTED, D_OBJC },
00184 { "protocol", RID_AT_PROTOCOL, D_OBJC },
00185 { "public", RID_AT_PUBLIC, D_OBJC },
00186 { "selector", RID_AT_SELECTOR, D_OBJC },
00187 { "throw", RID_AT_THROW, D_OBJC },
00188 { "try", RID_AT_TRY, D_OBJC },
00189 { "catch", RID_AT_CATCH, D_OBJC },
00190 { "finally", RID_AT_FINALLY, D_OBJC },
00191 { "synchronized", RID_AT_SYNCHRONIZED, D_OBJC },
00192
00193
00194 { "bycopy", RID_BYCOPY, D_OBJC },
00195 { "byref", RID_BYREF, D_OBJC },
00196 { "in", RID_IN, D_OBJC },
00197 { "inout", RID_INOUT, D_OBJC },
00198 { "oneway", RID_ONEWAY, D_OBJC },
00199 { "out", RID_OUT, D_OBJC },
00200 };
00201 #define N_reswords (sizeof reswords / sizeof (struct resword))
00202
00203
00204 typedef enum pragma_omp_clause {
00205 PRAGMA_OMP_CLAUSE_NONE = 0,
00206
00207 PRAGMA_OMP_CLAUSE_COPYIN,
00208 PRAGMA_OMP_CLAUSE_COPYPRIVATE,
00209 PRAGMA_OMP_CLAUSE_DEFAULT,
00210 PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
00211 PRAGMA_OMP_CLAUSE_IF,
00212 PRAGMA_OMP_CLAUSE_LASTPRIVATE,
00213 PRAGMA_OMP_CLAUSE_NOWAIT,
00214 PRAGMA_OMP_CLAUSE_NUM_THREADS,
00215 PRAGMA_OMP_CLAUSE_ORDERED,
00216 PRAGMA_OMP_CLAUSE_PRIVATE,
00217 PRAGMA_OMP_CLAUSE_REDUCTION,
00218 PRAGMA_OMP_CLAUSE_SCHEDULE,
00219 PRAGMA_OMP_CLAUSE_SHARED
00220 } pragma_omp_clause;
00221
00222
00223
00224
00225 void
00226 c_parse_init (void)
00227 {
00228
00229
00230 unsigned int i;
00231 tree id;
00232 int mask = (flag_isoc99 ? 0 : D_C89)
00233 | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);
00234
00235 if (!c_dialect_objc ())
00236 mask |= D_OBJC;
00237
00238 ridpointers = GGC_CNEWVEC (tree, (int) RID_MAX);
00239 for (i = 0; i < N_reswords; i++)
00240 {
00241
00242
00243 if (reswords[i].disable & mask)
00244 continue;
00245
00246 id = get_identifier (reswords[i].word);
00247 C_RID_CODE (id) = reswords[i].rid;
00248 C_IS_RESERVED_WORD (id) = 1;
00249 ridpointers [(int) reswords[i].rid] = id;
00250 }
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
00268
00269
00270 typedef enum c_id_kind {
00271
00272 C_ID_ID,
00273
00274 C_ID_TYPENAME,
00275
00276 C_ID_CLASSNAME,
00277
00278 C_ID_NONE
00279 } c_id_kind;
00280
00281
00282
00283 typedef struct c_token GTY (())
00284 {
00285
00286 ENUM_BITFIELD (cpp_ttype) type : 8;
00287
00288
00289 ENUM_BITFIELD (c_id_kind) id_kind : 8;
00290
00291
00292 ENUM_BITFIELD (rid) keyword : 8;
00293
00294
00295 ENUM_BITFIELD (pragma_kind) pragma_kind : 7;
00296
00297 BOOL_BITFIELD in_system_header : 1;
00298
00299 tree value;
00300
00301 location_t location;
00302 } c_token;
00303
00304
00305
00306
00307 typedef struct c_parser GTY(())
00308 {
00309
00310 c_token tokens[2];
00311
00312 short tokens_avail;
00313
00314
00315
00316 BOOL_BITFIELD error : 1;
00317
00318
00319 BOOL_BITFIELD in_pragma : 1;
00320 } c_parser;
00321
00322
00323
00324
00325
00326 static GTY (()) c_parser *the_parser;
00327
00328
00329
00330
00331 static void
00332 c_lex_one_token (c_token *token)
00333 {
00334 timevar_push (TV_LEX);
00335
00336 token->type = c_lex_with_flags (&token->value, &token->location, NULL);
00337 token->id_kind = C_ID_NONE;
00338 token->keyword = RID_MAX;
00339 token->pragma_kind = PRAGMA_NONE;
00340 token->in_system_header = in_system_header;
00341
00342 switch (token->type)
00343 {
00344 case CPP_NAME:
00345 {
00346 tree decl;
00347
00348 int objc_force_identifier = objc_need_raw_identifier;
00349 OBJC_NEED_RAW_IDENTIFIER (0);
00350
00351 if (C_IS_RESERVED_WORD (token->value))
00352 {
00353 enum rid rid_code = C_RID_CODE (token->value);
00354
00355 if (c_dialect_objc ())
00356 {
00357 if (!OBJC_IS_AT_KEYWORD (rid_code)
00358 && (!OBJC_IS_PQ_KEYWORD (rid_code) || objc_pq_context))
00359 {
00360
00361 token->value = ridpointers[(int) rid_code];
00362 token->type = CPP_KEYWORD;
00363 token->keyword = rid_code;
00364 break;
00365 }
00366 }
00367 else
00368 {
00369
00370 token->value = ridpointers[(int) rid_code];
00371 token->type = CPP_KEYWORD;
00372 token->keyword = rid_code;
00373 break;
00374 }
00375 }
00376
00377 decl = lookup_name (token->value);
00378 if (decl)
00379 {
00380 if (TREE_CODE (decl) == TYPE_DECL)
00381 {
00382 token->id_kind = C_ID_TYPENAME;
00383 break;
00384 }
00385 }
00386 else if (c_dialect_objc ())
00387 {
00388 tree objc_interface_decl = objc_is_class_name (token->value);
00389
00390
00391
00392 if (objc_interface_decl
00393 && (global_bindings_p ()
00394 || (!objc_force_identifier && !decl)))
00395 {
00396 token->value = objc_interface_decl;
00397 token->id_kind = C_ID_CLASSNAME;
00398 break;
00399 }
00400 }
00401 token->id_kind = C_ID_ID;
00402 }
00403 break;
00404 case CPP_AT_NAME:
00405
00406 token->type = CPP_KEYWORD;
00407 token->keyword = C_RID_CODE (token->value);
00408 break;
00409 case CPP_COLON:
00410 case CPP_COMMA:
00411 case CPP_CLOSE_PAREN:
00412 case CPP_SEMICOLON:
00413
00414
00415 OBJC_NEED_RAW_IDENTIFIER (0);
00416 break;
00417 case CPP_PRAGMA:
00418
00419 token->pragma_kind = TREE_INT_CST_LOW (token->value);
00420 token->value = NULL;
00421 break;
00422 default:
00423 break;
00424 }
00425 timevar_pop (TV_LEX);
00426 }
00427
00428
00429
00430
00431 static inline c_token *
00432 c_parser_peek_token (c_parser *parser)
00433 {
00434 if (parser->tokens_avail == 0)
00435 {
00436 c_lex_one_token (&parser->tokens[0]);
00437 parser->tokens_avail = 1;
00438 }
00439 return &parser->tokens[0];
00440 }
00441
00442
00443
00444
00445 static inline bool
00446 c_parser_next_token_is (c_parser *parser, enum cpp_ttype type)
00447 {
00448 return c_parser_peek_token (parser)->type == type;
00449 }
00450
00451
00452
00453
00454 static inline bool
00455 c_parser_next_token_is_not (c_parser *parser, enum cpp_ttype type)
00456 {
00457 return !c_parser_next_token_is (parser, type);
00458 }
00459
00460
00461
00462
00463 static inline bool
00464 c_parser_next_token_is_keyword (c_parser *parser, enum rid keyword)
00465 {
00466 c_token *token;
00467
00468
00469 token = c_parser_peek_token (parser);
00470
00471 return token->keyword == keyword;
00472 }
00473
00474
00475
00476 static bool
00477 c_token_starts_typename (c_token *token)
00478 {
00479 switch (token->type)
00480 {
00481 case CPP_NAME:
00482 switch (token->id_kind)
00483 {
00484 case C_ID_ID:
00485 return false;
00486 case C_ID_TYPENAME:
00487 return true;
00488 case C_ID_CLASSNAME:
00489 gcc_assert (c_dialect_objc ());
00490 return true;
00491 default:
00492 gcc_unreachable ();
00493 }
00494 case CPP_KEYWORD:
00495 switch (token->keyword)
00496 {
00497 case RID_UNSIGNED:
00498 case RID_LONG:
00499 case RID_SHORT:
00500 case RID_SIGNED:
00501 case RID_COMPLEX:
00502 case RID_INT:
00503 case RID_CHAR:
00504 case RID_FLOAT:
00505 case RID_DOUBLE:
00506 case RID_VOID:
00507 case RID_DFLOAT32:
00508 case RID_DFLOAT64:
00509 case RID_DFLOAT128:
00510 case RID_BOOL:
00511 case RID_ENUM:
00512 case RID_STRUCT:
00513 case RID_UNION:
00514 case RID_TYPEOF:
00515 case RID_CONST:
00516 case RID_VOLATILE:
00517 case RID_RESTRICT:
00518 case RID_ATTRIBUTE:
00519 return true;
00520 default:
00521 return false;
00522 }
00523 case CPP_LESS:
00524 if (c_dialect_objc ())
00525 return true;
00526 return false;
00527 default:
00528 return false;
00529 }
00530 }
00531
00532
00533
00534 static inline bool
00535 c_parser_next_token_starts_typename (c_parser *parser)
00536 {
00537 c_token *token = c_parser_peek_token (parser);
00538 return c_token_starts_typename (token);
00539 }
00540
00541
00542
00543 static bool
00544 c_token_starts_declspecs (c_token *token)
00545 {
00546 switch (token->type)
00547 {
00548 case CPP_NAME:
00549 switch (token->id_kind)
00550 {
00551 case C_ID_ID:
00552 return false;
00553 case C_ID_TYPENAME:
00554 return true;
00555 case C_ID_CLASSNAME:
00556 gcc_assert (c_dialect_objc ());
00557 return true;
00558 default:
00559 gcc_unreachable ();
00560 }
00561 case CPP_KEYWORD:
00562 switch (token->keyword)
00563 {
00564 case RID_STATIC:
00565 case RID_EXTERN:
00566 case RID_REGISTER:
00567 case RID_TYPEDEF:
00568 case RID_INLINE:
00569 case RID_AUTO:
00570 case RID_THREAD:
00571 case RID_UNSIGNED:
00572 case RID_LONG:
00573 case RID_SHORT:
00574 case RID_SIGNED:
00575 case RID_COMPLEX:
00576 case RID_INT:
00577 case RID_CHAR:
00578 case RID_FLOAT:
00579 case RID_DOUBLE:
00580 case RID_VOID:
00581 case RID_DFLOAT32:
00582 case RID_DFLOAT64:
00583 case RID_DFLOAT128:
00584 case RID_BOOL:
00585 case RID_ENUM:
00586 case RID_STRUCT:
00587 case RID_UNION:
00588 case RID_TYPEOF:
00589 case RID_CONST:
00590 case RID_VOLATILE:
00591 case RID_RESTRICT:
00592 case RID_ATTRIBUTE:
00593 return true;
00594 default:
00595 return false;
00596 }
00597 case CPP_LESS:
00598 if (c_dialect_objc ())
00599 return true;
00600 return false;
00601 default:
00602 return false;
00603 }
00604 }
00605
00606
00607
00608 static inline bool
00609 c_parser_next_token_starts_declspecs (c_parser *parser)
00610 {
00611 c_token *token = c_parser_peek_token (parser);
00612 return c_token_starts_declspecs (token);
00613 }
00614
00615
00616
00617
00618 static c_token *
00619 c_parser_peek_2nd_token (c_parser *parser)
00620 {
00621 if (parser->tokens_avail >= 2)
00622 return &parser->tokens[1];
00623 gcc_assert (parser->tokens_avail == 1);
00624 gcc_assert (parser->tokens[0].type != CPP_EOF);
00625 gcc_assert (parser->tokens[0].type != CPP_PRAGMA_EOL);
00626 c_lex_one_token (&parser->tokens[1]);
00627 parser->tokens_avail = 2;
00628 return &parser->tokens[1];
00629 }
00630
00631
00632
00633 static void
00634 c_parser_consume_token (c_parser *parser)
00635 {
00636 gcc_assert (parser->tokens_avail >= 1);
00637 gcc_assert (parser->tokens[0].type != CPP_EOF);
00638 gcc_assert (!parser->in_pragma || parser->tokens[0].type != CPP_PRAGMA_EOL);
00639 gcc_assert (parser->error || parser->tokens[0].type != CPP_PRAGMA);
00640 if (parser->tokens_avail == 2)
00641 parser->tokens[0] = parser->tokens[1];
00642 parser->tokens_avail--;
00643 }
00644
00645
00646
00647
00648 static void
00649 c_parser_consume_pragma (c_parser *parser)
00650 {
00651 gcc_assert (!parser->in_pragma);
00652 gcc_assert (parser->tokens_avail >= 1);
00653 gcc_assert (parser->tokens[0].type == CPP_PRAGMA);
00654 if (parser->tokens_avail == 2)
00655 parser->tokens[0] = parser->tokens[1];
00656 parser->tokens_avail--;
00657 parser->in_pragma = true;
00658 }
00659
00660
00661
00662 static inline void
00663 c_parser_set_source_position_from_token (c_token *token)
00664 {
00665 if (token->type != CPP_EOF)
00666 {
00667 input_location = token->location;
00668 in_system_header = token->in_system_header;
00669 }
00670 }
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684 static void
00685 c_parser_error (c_parser *parser, const char *gmsgid)
00686 {
00687 c_token *token = c_parser_peek_token (parser);
00688 if (parser->error)
00689 return;
00690 parser->error = true;
00691 if (!gmsgid)
00692 return;
00693
00694
00695 c_parser_set_source_position_from_token (token);
00696 c_parse_error (gmsgid,
00697
00698
00699
00700 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
00701 token->value);
00702 }
00703
00704
00705
00706
00707
00708
00709 static bool
00710 c_parser_require (c_parser *parser,
00711 enum cpp_ttype type,
00712 const char *msgid)
00713 {
00714 if (c_parser_next_token_is (parser, type))
00715 {
00716 c_parser_consume_token (parser);
00717 return true;
00718 }
00719 else
00720 {
00721 c_parser_error (parser, msgid);
00722 return false;
00723 }
00724 }
00725
00726
00727
00728
00729 static bool
00730 c_parser_require_keyword (c_parser *parser,
00731 enum rid keyword,
00732 const char *msgid)
00733 {
00734 if (c_parser_next_token_is_keyword (parser, keyword))
00735 {
00736 c_parser_consume_token (parser);
00737 return true;
00738 }
00739 else
00740 {
00741 c_parser_error (parser, msgid);
00742 return false;
00743 }
00744 }
00745
00746
00747
00748
00749
00750
00751
00752 static void
00753 c_parser_skip_until_found (c_parser *parser,
00754 enum cpp_ttype type,
00755 const char *msgid)
00756 {
00757 unsigned nesting_depth = 0;
00758
00759 if (c_parser_require (parser, type, msgid))
00760 return;
00761
00762
00763 while (true)
00764 {
00765
00766 c_token *token = c_parser_peek_token (parser);
00767
00768 if (token->type == type && !nesting_depth)
00769 {
00770 c_parser_consume_token (parser);
00771 break;
00772 }
00773
00774
00775 if (token->type == CPP_EOF)
00776 return;
00777 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
00778 return;
00779 if (token->type == CPP_OPEN_BRACE
00780 || token->type == CPP_OPEN_PAREN
00781 || token->type == CPP_OPEN_SQUARE)
00782 ++nesting_depth;
00783 else if (token->type == CPP_CLOSE_BRACE
00784 || token->type == CPP_CLOSE_PAREN
00785 || token->type == CPP_CLOSE_SQUARE)
00786 {
00787 if (nesting_depth-- == 0)
00788 break;
00789 }
00790
00791 c_parser_consume_token (parser);
00792 }
00793 parser->error = false;
00794 }
00795
00796
00797
00798
00799 static void
00800 c_parser_skip_to_end_of_parameter (c_parser *parser)
00801 {
00802 unsigned nesting_depth = 0;
00803
00804 while (true)
00805 {
00806 c_token *token = c_parser_peek_token (parser);
00807 if ((token->type == CPP_COMMA || token->type == CPP_SEMICOLON)
00808 && !nesting_depth)
00809 break;
00810
00811 if (token->type == CPP_EOF)
00812 return;
00813 if (token->type == CPP_PRAGMA_EOL && parser->in_pragma)
00814 return;
00815 if (token->type == CPP_OPEN_BRACE
00816 || token->type == CPP_OPEN_PAREN
00817 || token->type == CPP_OPEN_SQUARE)
00818 ++nesting_depth;
00819 else if (token->type == CPP_CLOSE_BRACE
00820 || token->type == CPP_CLOSE_PAREN
00821 || token->type == CPP_CLOSE_SQUARE)
00822 {
00823 if (nesting_depth-- == 0)
00824 break;
00825 }
00826
00827 c_parser_consume_token (parser);
00828 }
00829 parser->error = false;
00830 }
00831
00832
00833
00834
00835 static void
00836 c_parser_skip_to_pragma_eol (c_parser *parser)
00837 {
00838 gcc_assert (parser->in_pragma);
00839 parser->in_pragma = false;
00840
00841 if (!c_parser_require (parser, CPP_PRAGMA_EOL, "expected end of line"))
00842 while (true)
00843 {
00844 c_token *token = c_parser_peek_token (parser);
00845 if (token->type == CPP_EOF)
00846 break;
00847 if (token->type == CPP_PRAGMA_EOL)
00848 {
00849 c_parser_consume_token (parser);
00850 break;
00851 }
00852 c_parser_consume_token (parser);
00853 }
00854
00855 parser->error = false;
00856 }
00857
00858
00859
00860
00861 static void
00862 c_parser_skip_to_end_of_block_or_statement (c_parser *parser)
00863 {
00864 unsigned nesting_depth = 0;
00865 bool save_error = parser->error;
00866
00867 while (true)
00868 {
00869 c_token *token;
00870
00871
00872 token = c_parser_peek_token (parser);
00873
00874 switch (token->type)
00875 {
00876 case CPP_EOF:
00877 return;
00878
00879 case CPP_PRAGMA_EOL:
00880 if (parser->in_pragma)
00881 return;
00882 break;
00883
00884 case CPP_SEMICOLON:
00885
00886
00887 if (!nesting_depth)
00888 {
00889
00890 c_parser_consume_token (parser);
00891 goto finished;
00892 }
00893 break;
00894
00895 case CPP_CLOSE_BRACE:
00896
00897
00898 if (nesting_depth == 0 || --nesting_depth == 0)
00899 {
00900 c_parser_consume_token (parser);
00901 goto finished;
00902 }
00903 break;
00904
00905 case CPP_OPEN_BRACE:
00906
00907
00908 ++nesting_depth;
00909 break;
00910
00911 case CPP_PRAGMA:
00912
00913
00914
00915
00916
00917
00918 c_parser_consume_pragma (parser);
00919 c_parser_skip_to_pragma_eol (parser);
00920 parser->error = save_error;
00921 continue;
00922
00923 default:
00924 break;
00925 }
00926
00927 c_parser_consume_token (parser);
00928 }
00929
00930 finished:
00931 parser->error = false;
00932 }
00933
00934
00935
00936 static inline int
00937 disable_extension_diagnostics (void)
00938 {
00939 int ret = (pedantic
00940 | (warn_pointer_arith << 1)
00941 | (warn_traditional << 2)
00942 | (flag_iso << 3));
00943 pedantic = 0;
00944 warn_pointer_arith = 0;
00945 warn_traditional = 0;
00946 flag_iso = 0;
00947 return ret;
00948 }
00949
00950
00951
00952
00953 static inline void
00954 restore_extension_diagnostics (int flags)
00955 {
00956 pedantic = flags & 1;
00957 warn_pointer_arith = (flags >> 1) & 1;
00958 warn_traditional = (flags >> 2) & 1;
00959 flag_iso = (flags >> 3) & 1;
00960 }
00961
00962
00963 typedef enum c_dtr_syn {
00964
00965 C_DTR_NORMAL,
00966
00967 C_DTR_ABSTRACT,
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978 C_DTR_PARM
00979 } c_dtr_syn;
00980
00981 static void c_parser_external_declaration (c_parser *);
00982 static void c_parser_asm_definition (c_parser *);
00983 static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, bool);
00984 static void c_parser_declspecs (c_parser *, struct c_declspecs *, bool, bool,
00985 bool);
00986 static struct c_typespec c_parser_enum_specifier (c_parser *);
00987 static struct c_typespec c_parser_struct_or_union_specifier (c_parser *);
00988 static tree c_parser_struct_declaration (c_parser *);
00989 static struct c_typespec c_parser_typeof_specifier (c_parser *);
00990 static struct c_declarator *c_parser_declarator (c_parser *, bool, c_dtr_syn,
00991 bool *);
00992 static struct c_declarator *c_parser_direct_declarator (c_parser *, bool,
00993 c_dtr_syn, bool *);
00994 static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
00995 bool,
00996 struct c_declarator *);
00997 static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
00998 static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree);
00999 static struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
01000 static tree c_parser_simple_asm_expr (c_parser *);
01001 static tree c_parser_attributes (c_parser *);
01002 static struct c_type_name *c_parser_type_name (c_parser *);
01003 static struct c_expr c_parser_initializer (c_parser *);
01004 static struct c_expr c_parser_braced_init (c_parser *, tree, bool);
01005 static void c_parser_initelt (c_parser *);
01006 static void c_parser_initval (c_parser *, struct c_expr *);
01007 static tree c_parser_compound_statement (c_parser *);
01008 static void c_parser_compound_statement_nostart (c_parser *);
01009 static void c_parser_label (c_parser *);
01010 static void c_parser_statement (c_parser *);
01011 static void c_parser_statement_after_labels (c_parser *);
01012 static void c_parser_if_statement (c_parser *);
01013 static void c_parser_switch_statement (c_parser *);
01014 static void c_parser_while_statement (c_parser *);
01015 static void c_parser_do_statement (c_parser *);
01016 static void c_parser_for_statement (c_parser *);
01017 static tree c_parser_asm_statement (c_parser *);
01018 static tree c_parser_asm_operands (c_parser *, bool);
01019 static tree c_parser_asm_clobbers (c_parser *);
01020 static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
01021 static struct c_expr c_parser_conditional_expression (c_parser *,
01022 struct c_expr *);
01023 static struct c_expr c_parser_binary_expression (c_parser *, struct c_expr *);
01024 static struct c_expr c_parser_cast_expression (c_parser *, struct c_expr *);
01025 static struct c_expr c_parser_unary_expression (c_parser *);
01026 static struct c_expr c_parser_sizeof_expression (c_parser *);
01027 static struct c_expr c_parser_alignof_expression (c_parser *);
01028 static struct c_expr c_parser_postfix_expression (c_parser *);
01029 static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
01030 struct c_type_name *);
01031 static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
01032 struct c_expr);
01033 static struct c_expr c_parser_expression (c_parser *);
01034 static struct c_expr c_parser_expression_conv (c_parser *);
01035 static tree c_parser_expr_list (c_parser *, bool);
01036 static void c_parser_omp_construct (c_parser *);
01037 static void c_parser_omp_threadprivate (c_parser *);
01038 static void c_parser_omp_barrier (c_parser *);
01039 static void c_parser_omp_flush (c_parser *);
01040
01041 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
01042 static bool c_parser_pragma (c_parser *, enum pragma_context);
01043
01044
01045
01046 static void c_parser_objc_class_definition (c_parser *);
01047 static void c_parser_objc_class_instance_variables (c_parser *);
01048 static void c_parser_objc_class_declaration (c_parser *);
01049 static void c_parser_objc_alias_declaration (c_parser *);
01050 static void c_parser_objc_protocol_definition (c_parser *);
01051 static enum tree_code c_parser_objc_method_type (c_parser *);
01052 static void c_parser_objc_method_definition (c_parser *);
01053 static void c_parser_objc_methodprotolist (c_parser *);
01054 static void c_parser_objc_methodproto (c_parser *);
01055 static tree c_parser_objc_method_decl (c_parser *);
01056 static tree c_parser_objc_type_name (c_parser *);
01057 static tree c_parser_objc_protocol_refs (c_parser *);
01058 static void c_parser_objc_try_catch_statement (c_parser *);
01059 static void c_parser_objc_synchronized_statement (c_parser *);
01060 static tree c_parser_objc_selector (c_parser *);
01061 static tree c_parser_objc_selector_arg (c_parser *);
01062 static tree c_parser_objc_receiver (c_parser *);
01063 static tree c_parser_objc_message_args (c_parser *);
01064 static tree c_parser_objc_keywordexpr (c_parser *);
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081 static void
01082 c_parser_translation_unit (c_parser *parser)
01083 {
01084 if (c_parser_next_token_is (parser, CPP_EOF))
01085 {
01086 if (pedantic)
01087 pedwarn ("ISO C forbids an empty source file");
01088 }
01089 else
01090 {
01091 void *obstack_position = obstack_alloc (&parser_obstack, 0);
01092 do
01093 {
01094 ggc_collect ();
01095 c_parser_external_declaration (parser);
01096 obstack_free (&parser_obstack, obstack_position);
01097 }
01098 while (c_parser_next_token_is_not (parser, CPP_EOF));
01099 }
01100 }
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126 static void
01127 c_parser_external_declaration (c_parser *parser)
01128 {
01129 int ext;
01130 switch (c_parser_peek_token (parser)->type)
01131 {
01132 case CPP_KEYWORD:
01133 switch (c_parser_peek_token (parser)->keyword)
01134 {
01135 case RID_EXTENSION:
01136 ext = disable_extension_diagnostics ();
01137 c_parser_consume_token (parser);
01138 c_parser_external_declaration (parser);
01139 restore_extension_diagnostics (ext);
01140 break;
01141 case RID_ASM:
01142 c_parser_asm_definition (parser);
01143 break;
01144 case RID_AT_INTERFACE:
01145 case RID_AT_IMPLEMENTATION:
01146 gcc_assert (c_dialect_objc ());
01147 c_parser_objc_class_definition (parser);
01148 break;
01149 case RID_AT_CLASS:
01150 gcc_assert (c_dialect_objc ());
01151 c_parser_objc_class_declaration (parser);
01152 break;
01153 case RID_AT_ALIAS:
01154 gcc_assert (c_dialect_objc ());
01155 c_parser_objc_alias_declaration (parser);
01156 break;
01157 case RID_AT_PROTOCOL:
01158 gcc_assert (c_dialect_objc ());
01159 c_parser_objc_protocol_definition (parser);
01160 break;
01161 case RID_AT_END:
01162 gcc_assert (c_dialect_objc ());
01163 c_parser_consume_token (parser);
01164 objc_finish_implementation ();
01165 break;
01166 default:
01167 goto decl_or_fndef;
01168 }
01169 break;
01170 case CPP_SEMICOLON:
01171 if (pedantic)
01172 pedwarn ("ISO C does not allow extra %<;%> outside of a function");
01173 c_parser_consume_token (parser);
01174 break;
01175 case CPP_PRAGMA:
01176 c_parser_pragma (parser, pragma_external);
01177 break;
01178 case CPP_PLUS:
01179 case CPP_MINUS:
01180 if (c_dialect_objc ())
01181 {
01182 c_parser_objc_method_definition (parser);
01183 break;
01184 }
01185
01186
01187 default:
01188 decl_or_fndef:
01189
01190
01191
01192 c_parser_declaration_or_fndef (parser, true, true, false, true);
01193 break;
01194 }
01195 }
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255 static void
01256 c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, bool empty_ok,
01257 bool nested, bool start_attr_ok)
01258 {
01259 struct c_declspecs *specs;
01260 tree prefix_attrs;
01261 tree all_prefix_attrs;
01262 bool diagnosed_no_specs = false;
01263
01264 specs = build_null_declspecs ();
01265 c_parser_declspecs (parser, specs, true, true, start_attr_ok);
01266 if (parser->error)
01267 {
01268 c_parser_skip_to_end_of_block_or_statement (parser);
01269 return;
01270 }
01271 if (nested && !specs->declspecs_seen_p)
01272 {
01273 c_parser_error (parser, "expected declaration specifiers");
01274 c_parser_skip_to_end_of_block_or_statement (parser);
01275 return;
01276 }
01277 finish_declspecs (specs);
01278 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
01279 {
01280 if (empty_ok)
01281 shadow_tag (specs);
01282 else
01283 {
01284 shadow_tag_warned (specs, 1);
01285 pedwarn ("empty declaration");
01286 }
01287 c_parser_consume_token (parser);
01288 return;
01289 }
01290 pending_xref_error ();
01291 prefix_attrs = specs->attrs;
01292 all_prefix_attrs = prefix_attrs;
01293 specs->attrs = NULL_TREE;
01294 while (true)
01295 {
01296 struct c_declarator *declarator;
01297 bool dummy = false;
01298 tree fnbody;
01299
01300
01301
01302
01303 declarator = c_parser_declarator (parser, specs->type_seen_p,
01304 C_DTR_NORMAL, &dummy);
01305 if (declarator == NULL)
01306 {
01307 c_parser_skip_to_end_of_block_or_statement (parser);
01308 return;
01309 }
01310 if (c_parser_next_token_is (parser, CPP_EQ)
01311 || c_parser_next_token_is (parser, CPP_COMMA)
01312 || c_parser_next_token_is (parser, CPP_SEMICOLON)
01313 || c_parser_next_token_is_keyword (parser, RID_ASM)
01314 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
01315 {
01316 tree asm_name = NULL_TREE;
01317 tree postfix_attrs = NULL_TREE;
01318 if (!diagnosed_no_specs && !specs->declspecs_seen_p)
01319 {
01320 diagnosed_no_specs = true;
01321 pedwarn ("data definition has no type or storage class");
01322 }
01323
01324
01325 fndef_ok = false;
01326 if (c_parser_next_token_is_keyword (parser, RID_ASM))
01327 asm_name = c_parser_simple_asm_expr (parser);
01328 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
01329 postfix_attrs = c_parser_attributes (parser);
01330 if (c_parser_next_token_is (parser, CPP_EQ))
01331 {
01332 tree d;
01333 struct c_expr init;
01334 c_parser_consume_token (parser);
01335
01336
01337 d = start_decl (declarator, specs, true,
01338 chainon (postfix_attrs, all_prefix_attrs));
01339 if (!d)
01340 d = error_mark_node;
01341 start_init (d, asm_name, global_bindings_p ());
01342 init = c_parser_initializer (parser);
01343 finish_init ();
01344 if (d != error_mark_node)
01345 {
01346 maybe_warn_string_init (TREE_TYPE (d), init);
01347 finish_decl (d, init.value, asm_name);
01348 }
01349 }
01350 else
01351 {
01352 tree d = start_decl (declarator, specs, false,
01353 chainon (postfix_attrs,
01354 all_prefix_attrs));
01355 if (d)
01356 finish_decl (d, NULL_TREE, asm_name);
01357 }
01358 if (c_parser_next_token_is (parser, CPP_COMMA))
01359 {
01360 c_parser_consume_token (parser);
01361 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
01362 all_prefix_attrs = chainon (c_parser_attributes (parser),
01363 prefix_attrs);
01364 else
01365 all_prefix_attrs = prefix_attrs;
01366 continue;
01367 }
01368 else if (c_parser_next_token_is (parser, CPP_SEMICOLON))
01369 {
01370 c_parser_consume_token (parser);
01371 return;
01372 }
01373 else
01374 {
01375 c_parser_error (parser, "expected %<,%> or %<;%>");
01376 c_parser_skip_to_end_of_block_or_statement (parser);
01377 return;
01378 }
01379 }
01380 else if (!fndef_ok)
01381 {
01382 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, "
01383 "%<asm%> or %<__attribute__%>");
01384 c_parser_skip_to_end_of_block_or_statement (parser);
01385 return;
01386 }
01387
01388 if (nested)
01389 {
01390 if (pedantic)
01391 pedwarn ("ISO C forbids nested functions");
01392 push_function_context ();
01393 }
01394 if (!start_function (specs, declarator, all_prefix_attrs))
01395 {
01396
01397
01398
01399 c_parser_error (parser, "expected %<=%>, %<,%>, %<;%>, %<asm%> "
01400 "or %<__attribute__%>");
01401 if (nested)
01402 pop_function_context ();
01403 break;
01404 }
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417 while (c_parser_next_token_is_not (parser, CPP_EOF)
01418 && c_parser_next_token_is_not (parser, CPP_OPEN_BRACE))
01419 c_parser_declaration_or_fndef (parser, false, false, true, false);
01420 DECL_SOURCE_LOCATION (current_function_decl)
01421 = c_parser_peek_token (parser)->location;
01422 store_parm_decls ();
01423 fnbody = c_parser_compound_statement (parser);
01424 if (nested)
01425 {
01426 tree decl = current_function_decl;
01427 add_stmt (fnbody);
01428 finish_function ();
01429 pop_function_context ();
01430 add_stmt (build_stmt (DECL_EXPR, decl));
01431 }
01432 else
01433 {
01434 add_stmt (fnbody);
01435 finish_function ();
01436 }
01437 break;
01438 }
01439 }
01440
01441
01442
01443
01444
01445
01446
01447
01448 static void
01449 c_parser_asm_definition (c_parser *parser)
01450 {
01451 tree asm_str = c_parser_simple_asm_expr (parser);
01452 if (asm_str)
01453 cgraph_add_asm_node (asm_str);
01454 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
01455 }
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535 static void
01536 c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
01537 bool scspec_ok, bool typespec_ok, bool start_attr_ok)
01538 {
01539 bool attrs_ok = start_attr_ok;
01540 bool seen_type = specs->type_seen_p;
01541 while (c_parser_next_token_is (parser, CPP_NAME)
01542 || c_parser_next_token_is (parser, CPP_KEYWORD)
01543 || (c_dialect_objc () && c_parser_next_token_is (parser, CPP_LESS)))
01544 {
01545 struct c_typespec t;
01546 tree attrs;
01547 if (c_parser_next_token_is (parser, CPP_NAME))
01548 {
01549 tree value = c_parser_peek_token (parser)->value;
01550 c_id_kind kind = c_parser_peek_token (parser)->id_kind;
01551
01552
01553
01554 if (!typespec_ok || seen_type
01555 || (kind != C_ID_TYPENAME && kind != C_ID_CLASSNAME))
01556 break;
01557 c_parser_consume_token (parser);
01558 seen_type = true;
01559 attrs_ok = true;
01560 if (kind == C_ID_TYPENAME
01561 && (!c_dialect_objc ()
01562 || c_parser_next_token_is_not (parser, CPP_LESS)))
01563 {
01564 t.kind = ctsk_typedef;
01565
01566
01567 t.spec = lookup_name (value);
01568 }
01569 else
01570 {
01571 tree proto = NULL_TREE;
01572 gcc_assert (c_dialect_objc ());
01573 t.kind = ctsk_objc;
01574 if (c_parser_next_token_is (parser, CPP_LESS))
01575 proto = c_parser_objc_protocol_refs (parser);
01576 t.spec = objc_get_protocol_qualified_type (value, proto);
01577 }
01578 declspecs_add_type (specs, t);
01579 continue;
01580 }
01581 if (c_parser_next_token_is (parser, CPP_LESS))
01582 {
01583
01584
01585 tree proto;
01586 gcc_assert (c_dialect_objc ());
01587 if (!typespec_ok || seen_type)
01588 break;
01589 proto = c_parser_objc_protocol_refs (parser);
01590 t.kind = ctsk_objc;
01591 t.spec = objc_get_protocol_qualified_type (NULL_TREE, proto);
01592 declspecs_add_type (specs, t);
01593 continue;
01594 }
01595 gcc_assert (c_parser_next_token_is (parser, CPP_KEYWORD));
01596 switch (c_parser_peek_token (parser)->keyword)
01597 {
01598 case RID_STATIC:
01599 case RID_EXTERN:
01600 case RID_REGISTER:
01601 case RID_TYPEDEF:
01602 case RID_INLINE:
01603 case RID_AUTO:
01604 case RID_THREAD:
01605 if (!scspec_ok)
01606 goto out;
01607 attrs_ok = true;
01608
01609
01610
01611 declspecs_add_scspec (specs, c_parser_peek_token (parser)->value);
01612 c_parser_consume_token (parser);
01613 break;
01614 case RID_UNSIGNED:
01615 case RID_LONG:
01616 case RID_SHORT:
01617 case RID_SIGNED:
01618 case RID_COMPLEX:
01619 case RID_INT:
01620 case RID_CHAR:
01621 case RID_FLOAT:
01622 case RID_DOUBLE:
01623 case RID_VOID:
01624 case RID_DFLOAT32:
01625 case RID_DFLOAT64:
01626 case RID_DFLOAT128:
01627 case RID_BOOL:
01628 if (!typespec_ok)
01629 goto out;
01630 attrs_ok = true;
01631 seen_type = true;
01632 OBJC_NEED_RAW_IDENTIFIER (1);
01633 t.kind = ctsk_resword;
01634 t.spec = c_parser_peek_token (parser)->value;
01635 declspecs_add_type (specs, t);
01636 c_parser_consume_token (parser);
01637 break;
01638 case RID_ENUM:
01639 if (!typespec_ok)
01640 goto out;
01641 attrs_ok = true;
01642 seen_type = true;
01643 t = c_parser_enum_specifier (parser);
01644 declspecs_add_type (specs, t);
01645 break;
01646 case RID_STRUCT:
01647 case RID_UNION:
01648 if (!typespec_ok)
01649 goto out;
01650 attrs_ok = true;
01651 seen_type = true;
01652 t = c_parser_struct_or_union_specifier (parser);
01653 declspecs_add_type (specs, t);
01654 break;
01655 case RID_TYPEOF:
01656
01657
01658
01659 if (!typespec_ok || seen_type)
01660 goto out;
01661 attrs_ok = true;
01662 seen_type = true;
01663 t = c_parser_typeof_specifier (parser);
01664 declspecs_add_type (specs, t);
01665 break;
01666 case RID_CONST:
01667 case RID_VOLATILE:
01668 case RID_RESTRICT:
01669 attrs_ok = true;
01670 declspecs_add_qual (specs, c_parser_peek_token (parser)->value);
01671 c_parser_consume_token (parser);
01672 break;
01673 case RID_ATTRIBUTE:
01674 if (!attrs_ok)
01675 goto out;
01676 attrs = c_parser_attributes (parser);
01677 declspecs_add_attrs (specs, attrs);
01678 break;
01679 default:
01680 goto out;
01681 }
01682 }
01683 out: ;
01684 }
01685
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708 static struct c_typespec
01709 c_parser_enum_specifier (c_parser *parser)
01710 {
01711 struct c_typespec ret;
01712 tree attrs;
01713 tree ident = NULL_TREE;
01714 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ENUM));
01715 c_parser_consume_token (parser);
01716 attrs = c_parser_attributes (parser);
01717 if (c_parser_next_token_is (parser, CPP_NAME))
01718 {
01719 ident = c_parser_peek_token (parser)->value;
01720 c_parser_consume_token (parser);
01721 }
01722 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
01723 {
01724
01725 tree type = start_enum (ident);
01726 tree postfix_attrs;
01727
01728
01729 tree values = NULL_TREE;
01730 c_parser_consume_token (parser);
01731 while (true)
01732 {
01733 tree enum_id;
01734 tree enum_value;
01735 tree enum_decl;
01736 bool seen_comma;
01737 if (c_parser_next_token_is_not (parser, CPP_NAME))
01738 {
01739 c_parser_error (parser, "expected identifier");
01740 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
01741 values = error_mark_node;
01742 break;
01743 }
01744 enum_id = c_parser_peek_token (parser)->value;
01745 c_parser_consume_token (parser);
01746 if (c_parser_next_token_is (parser, CPP_EQ))
01747 {
01748 c_parser_consume_token (parser);
01749 enum_value = c_parser_expr_no_commas (parser, NULL).value;
01750 }
01751 else
01752 enum_value = NULL_TREE;
01753 enum_decl = build_enumerator (enum_id, enum_value);
01754 TREE_CHAIN (enum_decl) = values;
01755 values = enum_decl;
01756 seen_comma = false;
01757 if (c_parser_next_token_is (parser, CPP_COMMA))
01758 {
01759 seen_comma = true;
01760 c_parser_consume_token (parser);
01761 }
01762 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
01763 {
01764 if (seen_comma && pedantic && !flag_isoc99)
01765 pedwarn ("comma at end of enumerator list");
01766 c_parser_consume_token (parser);
01767 break;
01768 }
01769 if (!seen_comma)
01770 {
01771 c_parser_error (parser, "expected %<,%> or %<}%>");
01772 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
01773 values = error_mark_node;
01774 break;
01775 }
01776 }
01777 postfix_attrs = c_parser_attributes (parser);
01778 ret.spec = finish_enum (type, nreverse (values),
01779 chainon (attrs, postfix_attrs));
01780 ret.kind = ctsk_tagdef;
01781 return ret;
01782 }
01783 else if (!ident)
01784 {
01785 c_parser_error (parser, "expected %<{%>");
01786 ret.spec = error_mark_node;
01787 ret.kind = ctsk_tagref;
01788 return ret;
01789 }
01790 ret = parser_xref_tag (ENUMERAL_TYPE, ident);
01791
01792
01793 if (pedantic && !COMPLETE_TYPE_P (ret.spec))
01794 pedwarn ("ISO C forbids forward references to %<enum%> types");
01795 return ret;
01796 }
01797
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835
01836
01837 static struct c_typespec
01838 c_parser_struct_or_union_specifier (c_parser *parser)
01839 {
01840 struct c_typespec ret;
01841 tree attrs;
01842 tree ident = NULL_TREE;
01843 enum tree_code code;
01844 switch (c_parser_peek_token (parser)->keyword)
01845 {
01846 case RID_STRUCT:
01847 code = RECORD_TYPE;
01848 break;
01849 case RID_UNION:
01850 code = UNION_TYPE;
01851 break;
01852 default:
01853 gcc_unreachable ();
01854 }
01855 c_parser_consume_token (parser);
01856 attrs = c_parser_attributes (parser);
01857 if (c_parser_next_token_is (parser, CPP_NAME))
01858 {
01859 ident = c_parser_peek_token (parser)->value;
01860 c_parser_consume_token (parser);
01861 }
01862 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
01863 {
01864
01865
01866 tree type = start_struct (code, ident);
01867 tree postfix_attrs;
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877
01878 tree contents = NULL_TREE;
01879 c_parser_consume_token (parser);
01880
01881
01882 if (c_parser_next_token_is_keyword (parser, RID_AT_DEFS))
01883 {
01884 tree name;
01885 gcc_assert (c_dialect_objc ());
01886 c_parser_consume_token (parser);
01887 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
01888 goto end_at_defs;
01889 if (c_parser_next_token_is (parser, CPP_NAME)
01890 && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME)
01891 {
01892 name = c_parser_peek_token (parser)->value;
01893 c_parser_consume_token (parser);
01894 }
01895 else
01896 {
01897 c_parser_error (parser, "expected class name");
01898 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
01899 goto end_at_defs;
01900 }
01901 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
01902 "expected %<)%>");
01903 contents = nreverse (objc_get_class_ivars (name));
01904 }
01905 end_at_defs:
01906
01907
01908
01909 while (true)
01910 {
01911 tree decls;
01912
01913 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
01914 {
01915 if (pedantic)
01916 pedwarn ("extra semicolon in struct or union specified");
01917 c_parser_consume_token (parser);
01918 continue;
01919 }
01920
01921 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
01922 {
01923 c_parser_consume_token (parser);
01924 break;
01925 }
01926
01927 if (c_parser_next_token_is (parser, CPP_PRAGMA))
01928 {
01929 c_parser_pragma (parser, pragma_external);
01930 continue;
01931 }
01932
01933
01934 decls = c_parser_struct_declaration (parser);
01935 contents = chainon (decls, contents);
01936
01937
01938
01939 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
01940 c_parser_consume_token (parser);
01941 else
01942 {
01943 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
01944 pedwarn ("no semicolon at end of struct or union");
01945 else
01946 {
01947 c_parser_error (parser, "expected %<;%>");
01948 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
01949 break;
01950 }
01951 }
01952 }
01953 postfix_attrs = c_parser_attributes (parser);
01954 ret.spec = finish_struct (type, nreverse (contents),
01955 chainon (attrs, postfix_attrs));
01956 ret.kind = ctsk_tagdef;
01957 return ret;
01958 }
01959 else if (!ident)
01960 {
01961 c_parser_error (parser, "expected %<{%>");
01962 ret.spec = error_mark_node;
01963 ret.kind = ctsk_tagref;
01964 return ret;
01965 }
01966 ret = parser_xref_tag (code, ident);
01967 return ret;
01968 }
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001 static tree
02002 c_parser_struct_declaration (c_parser *parser)
02003 {
02004 struct c_declspecs *specs;
02005 tree prefix_attrs;
02006 tree all_prefix_attrs;
02007 tree decls;
02008 if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
02009 {
02010 int ext;
02011 tree decl;
02012 ext = disable_extension_diagnostics ();
02013 c_parser_consume_token (parser);
02014 decl = c_parser_struct_declaration (parser);
02015 restore_extension_diagnostics (ext);
02016 return decl;
02017 }
02018 specs = build_null_declspecs ();
02019 c_parser_declspecs (parser, specs, false, true, true);
02020 if (parser->error)
02021 return NULL_TREE;
02022 if (!specs->declspecs_seen_p)
02023 {
02024 c_parser_error (parser, "expected specifier-qualifier-list");
02025 return NULL_TREE;
02026 }
02027 finish_declspecs (specs);
02028 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
02029 {
02030 tree ret;
02031 if (!specs->type_seen_p)
02032 {
02033 if (pedantic)
02034 pedwarn ("ISO C forbids member declarations with no members");
02035 shadow_tag_warned (specs, pedantic);
02036 ret = NULL_TREE;
02037 }
02038 else
02039 {
02040
02041
02042
02043 ret = grokfield (build_id_declarator (NULL_TREE), specs, NULL_TREE);
02044 }
02045 return ret;
02046 }
02047 pending_xref_error ();
02048 prefix_attrs = specs->attrs;
02049 all_prefix_attrs = prefix_attrs;
02050 specs->attrs = NULL_TREE;
02051 decls = NULL_TREE;
02052 while (true)
02053 {
02054
02055 struct c_declarator *declarator;
02056 bool dummy = false;
02057 if (c_parser_next_token_is (parser, CPP_COLON))
02058 declarator = build_id_declarator (NULL_TREE);
02059 else
02060 declarator = c_parser_declarator (parser, specs->type_seen_p,
02061 C_DTR_NORMAL, &dummy);
02062 if (declarator == NULL)
02063 {
02064 c_parser_skip_to_end_of_block_or_statement (parser);
02065 break;
02066 }
02067 if (c_parser_next_token_is (parser, CPP_COLON)
02068 || c_parser_next_token_is (parser, CPP_COMMA)
02069 || c_parser_next_token_is (parser, CPP_SEMICOLON)
02070 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE)
02071 || c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
02072 {
02073 tree postfix_attrs = NULL_TREE;
02074 tree width = NULL_TREE;
02075 tree d;
02076 if (c_parser_next_token_is (parser, CPP_COLON))
02077 {
02078 c_parser_consume_token (parser);
02079 width = c_parser_expr_no_commas (parser, NULL).value;
02080 }
02081 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
02082 postfix_attrs = c_parser_attributes (parser);
02083 d = grokfield (declarator, specs, width);
02084 decl_attributes (&d, chainon (postfix_attrs,
02085 all_prefix_attrs), 0);
02086 TREE_CHAIN (d) = decls;
02087 decls = d;
02088 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
02089 all_prefix_attrs = chainon (c_parser_attributes (parser),
02090 prefix_attrs);
02091 else
02092 all_prefix_attrs = prefix_attrs;
02093 if (c_parser_next_token_is (parser, CPP_COMMA))
02094 c_parser_consume_token (parser);
02095 else if (c_parser_next_token_is (parser, CPP_SEMICOLON)
02096 || c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
02097 {
02098
02099 break;
02100 }
02101 else
02102 {
02103 c_parser_error (parser, "expected %<,%>, %<;%> or %<}%>");
02104 break;
02105 }
02106 }
02107 else
02108 {
02109 c_parser_error (parser,
02110 "expected %<:%>, %<,%>, %<;%>, %<}%> or "
02111 "%<__attribute__%>");
02112 break;
02113 }
02114 }
02115 return decls;
02116 }
02117
02118
02119
02120
02121
02122
02123
02124
02125 static struct c_typespec
02126 c_parser_typeof_specifier (c_parser *parser)
02127 {
02128 struct c_typespec ret;
02129 ret.kind = ctsk_typeof;
02130 ret.spec = error_mark_node;
02131 gcc_assert (c_parser_next_token_is_keyword (parser, RID_TYPEOF));
02132 c_parser_consume_token (parser);
02133 skip_evaluation++;
02134 in_typeof++;
02135 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
02136 {
02137 skip_evaluation--;
02138 in_typeof--;
02139 return ret;
02140 }
02141 if (c_parser_next_token_starts_typename (parser))
02142 {
02143 struct c_type_name *type = c_parser_type_name (parser);
02144 skip_evaluation--;
02145 in_typeof--;
02146 if (type != NULL)
02147 {
02148 ret.spec = groktypename (type);
02149 pop_maybe_used (variably_modified_type_p (ret.spec, NULL_TREE));
02150 }
02151 }
02152 else
02153 {
02154 bool was_vm;
02155 struct c_expr expr = c_parser_expression (parser);
02156 skip_evaluation--;
02157 in_typeof--;
02158 if (TREE_CODE (expr.value) == COMPONENT_REF
02159 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
02160 error ("%<typeof%> applied to a bit-field");
02161 ret.spec = TREE_TYPE (expr.value);
02162 was_vm = variably_modified_type_p (ret.spec, NULL_TREE);
02163
02164
02165
02166 if (!skip_evaluation && was_vm)
02167 {
02168 tree e = expr.value;
02169
02170
02171
02172 if (DECL_P (e) || CONSTANT_CLASS_P (e))
02173 e = build1 (NOP_EXPR, void_type_node, e);
02174
02175 if (EXPR_P (e))
02176 SET_EXPR_LOCATION (e, input_location);
02177
02178 add_stmt (e);
02179 }
02180 pop_maybe_used (was_vm);
02181 }
02182 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
02183 return ret;
02184 }
02185
02186
02187
02188
02189
02190
02191
02192
02193
02194
02195
02196
02197
02198
02199
02200
02201
02202
02203
02204
02205
02206
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232
02233
02234
02235
02236
02237
02238
02239
02240
02241
02242
02243
02244
02245
02246
02247
02248
02249
02250
02251
02252
02253
02254
02255
02256
02257
02258
02259
02260
02261
02262
02263 static struct c_declarator *
02264 c_parser_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
02265 bool *seen_id)
02266 {
02267
02268 if (c_parser_next_token_is (parser, CPP_MULT))
02269 {
02270 struct c_declspecs *quals_attrs = build_null_declspecs ();
02271 struct c_declarator *inner;
02272 c_parser_consume_token (parser);
02273 c_parser_declspecs (parser, quals_attrs, false, false, true);
02274 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
02275 if (inner == NULL)
02276 return NULL;
02277 else
02278 return make_pointer_declarator (quals_attrs, inner);
02279 }
02280
02281
02282 return c_parser_direct_declarator (parser, type_seen_p, kind, seen_id);
02283 }
02284
02285
02286
02287
02288 static struct c_declarator *
02289 c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
02290 bool *seen_id)
02291 {
02292
02293
02294
02295
02296
02297
02298
02299
02300
02301
02302
02303
02304
02305
02306
02307
02308
02309
02310
02311
02312
02313
02314
02315
02316
02317
02318
02319
02320
02321
02322
02323
02324
02325
02326 if (kind != C_DTR_ABSTRACT
02327 && c_parser_next_token_is (parser, CPP_NAME)
02328 && ((type_seen_p
02329 && c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME)
02330 || c_parser_peek_token (parser)->id_kind == C_ID_ID))
02331 {
02332 struct c_declarator *inner
02333 = build_id_declarator (c_parser_peek_token (parser)->value);
02334 *seen_id = true;
02335 inner->id_loc = c_parser_peek_token (parser)->location;
02336 c_parser_consume_token (parser);
02337 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
02338 }
02339
02340 if (kind != C_DTR_NORMAL
02341 && c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
02342 {
02343 struct c_declarator *inner = build_id_declarator (NULL_TREE);
02344 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
02345 }
02346
02347
02348
02349
02350 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
02351 {
02352 tree attrs;
02353 struct c_declarator *inner;
02354 c_parser_consume_token (parser);
02355 attrs = c_parser_attributes (parser);
02356 if (kind != C_DTR_NORMAL
02357 && (c_parser_next_token_starts_declspecs (parser)
02358 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN)))
02359 {
02360 struct c_arg_info *args
02361 = c_parser_parms_declarator (parser, kind == C_DTR_NORMAL,
02362 attrs);
02363 if (args == NULL)
02364 return NULL;
02365 else
02366 {
02367 inner
02368 = build_function_declarator (args,
02369 build_id_declarator (NULL_TREE));
02370 return c_parser_direct_declarator_inner (parser, *seen_id,
02371 inner);
02372 }
02373 }
02374
02375 inner = c_parser_declarator (parser, type_seen_p, kind, seen_id);
02376 if (inner != NULL && attrs != NULL)
02377 inner = build_attrs_declarator (attrs, inner);
02378 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02379 {
02380 c_parser_consume_token (parser);
02381 if (inner == NULL)
02382 return NULL;
02383 else
02384 return c_parser_direct_declarator_inner (parser, *seen_id, inner);
02385 }
02386 else
02387 {
02388 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02389 "expected %<)%>");
02390 return NULL;
02391 }
02392 }
02393 else
02394 {
02395 if (kind == C_DTR_NORMAL)
02396 {
02397 c_parser_error (parser, "expected identifier or %<(%>");
02398 return NULL;
02399 }
02400 else
02401 return build_id_declarator (NULL_TREE);
02402 }
02403 }
02404
02405
02406
02407
02408
02409
02410 static struct c_declarator *
02411 c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
02412 struct c_declarator *inner)
02413 {
02414
02415 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
02416 {
02417 struct c_declarator *declarator;
02418 struct c_declspecs *quals_attrs = build_null_declspecs ();
02419 bool static_seen;
02420 bool star_seen;
02421 tree dimen;
02422 c_parser_consume_token (parser);
02423 c_parser_declspecs (parser, quals_attrs, false, false, true);
02424 static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
02425 if (static_seen)
02426 c_parser_consume_token (parser);
02427 if (static_seen && !quals_attrs->declspecs_seen_p)
02428 c_parser_declspecs (parser, quals_attrs, false, false, true);
02429 if (!quals_attrs->declspecs_seen_p)
02430 quals_attrs = NULL;
02431
02432
02433
02434 if (static_seen)
02435 {
02436 star_seen = false;
02437 dimen = c_parser_expr_no_commas (parser, NULL).value;
02438 }
02439 else
02440 {
02441 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
02442 {
02443 dimen = NULL_TREE;
02444 star_seen = false;
02445 }
02446 else if (c_parser_next_token_is (parser, CPP_MULT))
02447 {
02448 if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE)
02449 {
02450 dimen = NULL_TREE;
02451 star_seen = true;
02452 c_parser_consume_token (parser);
02453 }
02454 else
02455 {
02456 star_seen = false;
02457 dimen = c_parser_expr_no_commas (parser, NULL).value;
02458 }
02459 }
02460 else
02461 {
02462 star_seen = false;
02463 dimen = c_parser_expr_no_commas (parser, NULL).value;
02464 }
02465 }
02466 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
02467 c_parser_consume_token (parser);
02468 else
02469 {
02470 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
02471 "expected %<]%>");
02472 return NULL;
02473 }
02474 declarator = build_array_declarator (dimen, quals_attrs, static_seen,
02475 star_seen);
02476 if (declarator == NULL)
02477 return NULL;
02478 inner = set_array_declarator_inner (declarator, inner, !id_present);
02479 return c_parser_direct_declarator_inner (parser, id_present, inner);
02480 }
02481 else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
02482 {
02483 tree attrs;
02484 struct c_arg_info *args;
02485 c_parser_consume_token (parser);
02486 attrs = c_parser_attributes (parser);
02487 args = c_parser_parms_declarator (parser, id_present, attrs);
02488 if (args == NULL)
02489 return NULL;
02490 else
02491 {
02492 inner = build_function_declarator (args, inner);
02493 return c_parser_direct_declarator_inner (parser, id_present, inner);
02494 }
02495 }
02496 return inner;
02497 }
02498
02499
02500
02501
02502
02503
02504 static struct c_arg_info *
02505 c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
02506 {
02507 push_scope ();
02508 declare_parm_level ();
02509
02510
02511 if (id_list_ok
02512 && !attrs
02513 && c_parser_next_token_is (parser, CPP_NAME)
02514 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
02515 {
02516 tree list = NULL_TREE, *nextp = &list;
02517 while (c_parser_next_token_is (parser, CPP_NAME)
02518 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
02519 {
02520 *nextp = build_tree_list (NULL_TREE,
02521 c_parser_peek_token (parser)->value);
02522 nextp = & TREE_CHAIN (*nextp);
02523 c_parser_consume_token (parser);
02524 if (c_parser_next_token_is_not (parser, CPP_COMMA))
02525 break;
02526 c_parser_consume_token (parser);
02527 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02528 {
02529 c_parser_error (parser, "expected identifier");
02530 break;
02531 }
02532 }
02533 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02534 {
02535 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
02536 ret->parms = 0;
02537 ret->tags = 0;
02538 ret->types = list;
02539 ret->others = 0;
02540 ret->pending_sizes = 0;
02541 ret->had_vla_unspec = 0;
02542 c_parser_consume_token (parser);
02543 pop_scope ();
02544 return ret;
02545 }
02546 else
02547 {
02548 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02549 "expected %<)%>");
02550 pop_scope ();
02551 return NULL;
02552 }
02553 }
02554 else
02555 {
02556 struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs);
02557 pop_scope ();
02558 return ret;
02559 }
02560 }
02561
02562
02563
02564
02565
02566 static struct c_arg_info *
02567 c_parser_parms_list_declarator (c_parser *parser, tree attrs)
02568 {
02569 bool good_parm = false;
02570
02571
02572
02573
02574
02575
02576 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02577 {
02578 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
02579 ret->parms = 0;
02580 ret->tags = 0;
02581 ret->types = 0;
02582 ret->others = 0;
02583 ret->pending_sizes = 0;
02584 ret->had_vla_unspec = 0;
02585 c_parser_consume_token (parser);
02586 return ret;
02587 }
02588 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
02589 {
02590 struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
02591 ret->parms = 0;
02592 ret->tags = 0;
02593 ret->others = 0;
02594 ret->pending_sizes = 0;
02595 ret->had_vla_unspec = 0;
02596
02597 ret->types = error_mark_node;
02598 error ("ISO C requires a named argument before %<...%>");
02599 c_parser_consume_token (parser);
02600 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02601 {
02602 c_parser_consume_token (parser);
02603 return ret;
02604 }
02605 else
02606 {
02607 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02608 "expected %<)%>");
02609 return NULL;
02610 }
02611 }
02612
02613
02614
02615 while (true)
02616 {
02617
02618 struct c_parm *parm = c_parser_parameter_declaration (parser, attrs);
02619 attrs = NULL_TREE;
02620 if (parm != NULL)
02621 {
02622 good_parm = true;
02623 push_parm_decl (parm);
02624 }
02625 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
02626 {
02627 tree new_attrs;
02628 c_parser_consume_token (parser);
02629 mark_forward_parm_decls ();
02630 new_attrs = c_parser_attributes (parser);
02631 return c_parser_parms_list_declarator (parser, new_attrs);
02632 }
02633 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02634 {
02635 c_parser_consume_token (parser);
02636 if (good_parm)
02637 return get_parm_info (false);
02638 else
02639 {
02640 struct c_arg_info *ret
02641 = XOBNEW (&parser_obstack, struct c_arg_info);
02642 ret->parms = 0;
02643 ret->tags = 0;
02644 ret->types = 0;
02645 ret->others = 0;
02646 ret->pending_sizes = 0;
02647 ret->had_vla_unspec = 0;
02648 return ret;
02649 }
02650 }
02651 if (!c_parser_require (parser, CPP_COMMA,
02652 "expected %<;%>, %<,%> or %<)%>"))
02653 {
02654 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
02655 return NULL;
02656 }
02657 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
02658 {
02659 c_parser_consume_token (parser);
02660 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02661 {
02662 c_parser_consume_token (parser);
02663 if (good_parm)
02664 return get_parm_info (true);
02665 else
02666 {
02667 struct c_arg_info *ret
02668 = XOBNEW (&parser_obstack, struct c_arg_info);
02669 ret->parms = 0;
02670 ret->tags = 0;
02671 ret->types = 0;
02672 ret->others = 0;
02673 ret->pending_sizes = 0;
02674 ret->had_vla_unspec = 0;
02675 return ret;
02676 }
02677 }
02678 else
02679 {
02680 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02681 "expected %<)%>");
02682 return NULL;
02683 }
02684 }
02685 }
02686 }
02687
02688
02689
02690
02691 static struct c_parm *
02692 c_parser_parameter_declaration (c_parser *parser, tree attrs)
02693 {
02694 struct c_declspecs *specs;
02695 struct c_declarator *declarator;
02696 tree prefix_attrs;
02697 tree postfix_attrs = NULL_TREE;
02698 bool dummy = false;
02699 if (!c_parser_next_token_starts_declspecs (parser))
02700 {
02701
02702
02703 c_parser_error (parser,
02704 "expected declaration specifiers or %<...%>");
02705 c_parser_skip_to_end_of_parameter (parser);
02706 return NULL;
02707 }
02708 specs = build_null_declspecs ();
02709 if (attrs)
02710 {
02711 declspecs_add_attrs (specs, attrs);
02712 attrs = NULL_TREE;
02713 }
02714 c_parser_declspecs (parser, specs, true, true, true);
02715 finish_declspecs (specs);
02716 pending_xref_error ();
02717 prefix_attrs = specs->attrs;
02718 specs->attrs = NULL_TREE;
02719 declarator = c_parser_declarator (parser, specs->type_seen_p,
02720 C_DTR_PARM, &dummy);
02721 if (declarator == NULL)
02722 {
02723 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
02724 return NULL;
02725 }
02726 if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
02727 postfix_attrs = c_parser_attributes (parser);
02728 return build_c_parm (specs, chainon (postfix_attrs, prefix_attrs),
02729 declarator);
02730 }
02731
02732
02733
02734
02735
02736
02737
02738
02739
02740
02741
02742
02743 static tree
02744 c_parser_asm_string_literal (c_parser *parser)
02745 {
02746 tree str;
02747 if (c_parser_next_token_is (parser, CPP_STRING))
02748 {
02749 str = c_parser_peek_token (parser)->value;
02750 c_parser_consume_token (parser);
02751 }
02752 else if (c_parser_next_token_is (parser, CPP_WSTRING))
02753 {
02754 error ("wide string literal in %<asm%>");
02755 str = build_string (1, "");
02756 c_parser_consume_token (parser);
02757 }
02758 else
02759 {
02760 c_parser_error (parser, "expected string literal");
02761 str = NULL_TREE;
02762 }
02763 return str;
02764 }
02765
02766
02767
02768
02769
02770
02771
02772
02773
02774 static tree
02775 c_parser_simple_asm_expr (c_parser *parser)
02776 {
02777 tree str;
02778 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
02779
02780
02781 c_lex_string_translate = 0;
02782 c_parser_consume_token (parser);
02783 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
02784 {
02785 c_lex_string_translate = 1;
02786 return NULL_TREE;
02787 }
02788 str = c_parser_asm_string_literal (parser);
02789 c_lex_string_translate = 1;
02790 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
02791 {
02792 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
02793 return NULL_TREE;
02794 }
02795 return str;
02796 }
02797
02798
02799
02800
02801
02802
02803
02804
02805
02806
02807
02808
02809
02810
02811
02812
02813
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823
02824
02825 static tree
02826 c_parser_attributes (c_parser *parser)
02827 {
02828 tree attrs = NULL_TREE;
02829 while (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE))
02830 {
02831
02832
02833 c_lex_string_translate = 0;
02834 c_parser_consume_token (parser);
02835 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
02836 {
02837 c_lex_string_translate = 1;
02838 return attrs;
02839 }
02840 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
02841 {
02842 c_lex_string_translate = 1;
02843 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
02844 return attrs;
02845 }
02846
02847 while (c_parser_next_token_is (parser, CPP_COMMA)
02848 || c_parser_next_token_is (parser, CPP_NAME)
02849 || c_parser_next_token_is (parser, CPP_KEYWORD))
02850 {
02851 tree attr, attr_name, attr_args;
02852 if (c_parser_next_token_is (parser, CPP_COMMA))
02853 {
02854 c_parser_consume_token (parser);
02855 continue;
02856 }
02857 if (c_parser_next_token_is (parser, CPP_KEYWORD))
02858 {
02859
02860
02861 bool ok;
02862 switch (c_parser_peek_token (parser)->keyword)
02863 {
02864 case RID_STATIC:
02865 case RID_UNSIGNED:
02866 case RID_LONG:
02867 case RID_CONST:
02868 case RID_EXTERN:
02869 case RID_REGISTER:
02870 case RID_TYPEDEF:
02871 case RID_SHORT:
02872 case RID_INLINE:
02873 case RID_VOLATILE:
02874 case RID_SIGNED:
02875 case RID_AUTO:
02876 case RID_RESTRICT:
02877 case RID_COMPLEX:
02878 case RID_THREAD:
02879 case RID_INT:
02880 case RID_CHAR:
02881 case RID_FLOAT:
02882 case RID_DOUBLE:
02883 case RID_VOID:
02884 case RID_DFLOAT32:
02885 case RID_DFLOAT64:
02886 case RID_DFLOAT128:
02887 case RID_BOOL:
02888 ok = true;
02889 break;
02890 default:
02891 ok = false;
02892 break;
02893 }
02894 if (!ok)
02895 break;
02896 }
02897 attr_name = c_parser_peek_token (parser)->value;
02898 c_parser_consume_token (parser);
02899 if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
02900 {
02901 attr = build_tree_list (attr_name, NULL_TREE);
02902 attrs = chainon (attrs, attr);
02903 continue;
02904 }
02905 c_parser_consume_token (parser);
02906
02907
02908
02909
02910 if (c_parser_next_token_is (parser, CPP_NAME)
02911 && c_parser_peek_token (parser)->id_kind == C_ID_ID
02912 && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
02913 || (c_parser_peek_2nd_token (parser)->type
02914 == CPP_CLOSE_PAREN)))
02915 {
02916 tree arg1 = c_parser_peek_token (parser)->value;
02917 c_parser_consume_token (parser);
02918 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02919 attr_args = build_tree_list (NULL_TREE, arg1);
02920 else
02921 {
02922 c_parser_consume_token (parser);
02923 attr_args = tree_cons (NULL_TREE, arg1,
02924 c_parser_expr_list (parser, false));
02925 }
02926 }
02927 else
02928 {
02929 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02930 attr_args = NULL_TREE;
02931 else
02932 attr_args = c_parser_expr_list (parser, false);
02933 }
02934 attr = build_tree_list (attr_name, attr_args);
02935 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02936 c_parser_consume_token (parser);
02937 else
02938 {
02939 c_lex_string_translate = 1;
02940 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02941 "expected %<)%>");
02942 return attrs;
02943 }
02944 attrs = chainon (attrs, attr);
02945 }
02946 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02947 c_parser_consume_token (parser);
02948 else
02949 {
02950 c_lex_string_translate = 1;
02951 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02952 "expected %<)%>");
02953 return attrs;
02954 }
02955 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
02956 c_parser_consume_token (parser);
02957 else
02958 {
02959 c_lex_string_translate = 1;
02960 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
02961 "expected %<)%>");
02962 return attrs;
02963 }
02964 c_lex_string_translate = 1;
02965 }
02966 return attrs;
02967 }
02968
02969
02970
02971
02972
02973
02974
02975 static struct c_type_name *
02976 c_parser_type_name (c_parser *parser)
02977 {
02978 struct c_declspecs *specs = build_null_declspecs ();
02979 struct c_declarator *declarator;
02980 struct c_type_name *ret;
02981 bool dummy = false;
02982 c_parser_declspecs (parser, specs, false, true, true);
02983 if (!specs->declspecs_seen_p)
02984 {
02985 c_parser_error (parser, "expected specifier-qualifier-list");
02986 return NULL;
02987 }
02988 pending_xref_error ();
02989 finish_declspecs (specs);
02990 declarator = c_parser_declarator (parser, specs->type_seen_p,
02991 C_DTR_ABSTRACT, &dummy);
02992 if (declarator == NULL)
02993 return NULL;
02994 ret = XOBNEW (&parser_obstack, struct c_type_name);
02995 ret->specs = specs;
02996 ret->declarator = declarator;
02997 return ret;
02998 }
02999
03000
03001
03002
03003
03004
03005
03006
03007
03008
03009
03010
03011
03012
03013
03014
03015
03016
03017
03018
03019
03020
03021
03022
03023
03024
03025
03026
03027
03028
03029
03030
03031
03032
03033
03034
03035
03036
03037
03038
03039
03040
03041
03042
03043 static struct c_expr
03044 c_parser_initializer (c_parser *parser)
03045 {
03046 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
03047 return c_parser_braced_init (parser, NULL_TREE, false);
03048 else
03049 {
03050 struct c_expr ret;
03051 ret = c_parser_expr_no_commas (parser, NULL);
03052 if (TREE_CODE (ret.value) != STRING_CST
03053 && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
03054 ret = default_function_array_conversion (ret);
03055 return ret;
03056 }
03057 }
03058
03059
03060
03061
03062
03063
03064
03065 static struct c_expr
03066 c_parser_braced_init (c_parser *parser, tree type, bool nested_p)
03067 {
03068 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
03069 c_parser_consume_token (parser);
03070 if (nested_p)
03071 push_init_level (0);
03072 else
03073 really_start_incremental_init (type);
03074 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
03075 {
03076 if (pedantic)
03077 pedwarn ("ISO C forbids empty initializer braces");
03078 }
03079 else
03080 {
03081
03082
03083 while (true)
03084 {
03085 c_parser_initelt (parser);
03086 if (parser->error)
03087 break;
03088 if (c_parser_next_token_is (parser, CPP_COMMA))
03089 c_parser_consume_token (parser);
03090 else
03091 break;
03092 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
03093 break;
03094 }
03095 }
03096 if (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
03097 {
03098 struct c_expr ret;
03099 ret.value = error_mark_node;
03100 ret.original_code = ERROR_MARK;
03101 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, "expected %<}%>");
03102 return ret;
03103 }
03104 c_parser_consume_token (parser);
03105 return pop_init_level (0);
03106 }
03107
03108
03109
03110 static void
03111 c_parser_initelt (c_parser *parser)
03112 {
03113
03114
03115
03116 if (c_parser_next_token_is (parser, CPP_NAME)
03117 && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
03118 {
03119
03120 set_init_label (c_parser_peek_token (parser)->value);
03121 if (pedantic)
03122 pedwarn ("obsolete use of designated initializer with %<:%>");
03123 c_parser_consume_token (parser);
03124 c_parser_consume_token (parser);
03125 }
03126 else
03127 {
03128
03129
03130 int des_seen = 0;
03131 while (c_parser_next_token_is (parser, CPP_OPEN_SQUARE)
03132 || c_parser_next_token_is (parser, CPP_DOT))
03133 {
03134 int des_prev = des_seen;
03135 if (des_seen < 2)
03136 des_seen++;
03137 if (c_parser_next_token_is (parser, CPP_DOT))
03138 {
03139 des_seen = 2;
03140 c_parser_consume_token (parser);
03141 if (c_parser_next_token_is (parser, CPP_NAME))
03142 {
03143 set_init_label (c_parser_peek_token (parser)->value);
03144 c_parser_consume_token (parser);
03145 }
03146 else
03147 {
03148 struct c_expr init;
03149 init.value = error_mark_node;
03150 init.original_code = ERROR_MARK;
03151 c_parser_error (parser, "expected identifier");
03152 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
03153 process_init_element (init);
03154 return;
03155 }
03156 }
03157 else
03158 {
03159 tree first, second;
03160
03161
03162
03163
03164
03165
03166
03167
03168
03169
03170
03171 if (des_prev == 1 && c_dialect_objc ())
03172 {
03173 des_seen = des_prev;
03174 break;
03175 }
03176 if (des_prev == 0 && c_dialect_objc ())
03177 {
03178
03179
03180
03181
03182
03183
03184
03185 tree rec, args;
03186 struct c_expr mexpr;
03187 c_parser_consume_token (parser);
03188 if (c_parser_peek_token (parser)->type == CPP_NAME
03189 && ((c_parser_peek_token (parser)->id_kind
03190 == C_ID_TYPENAME)
03191 || (c_parser_peek_token (parser)->id_kind
03192 == C_ID_CLASSNAME)))
03193 {
03194
03195 tree id = c_parser_peek_token (parser)->value;
03196 c_parser_consume_token (parser);
03197 rec = objc_get_class_reference (id);
03198 goto parse_message_args;
03199 }
03200 first = c_parser_expr_no_commas (parser, NULL).value;
03201 if (c_parser_next_token_is (parser, CPP_ELLIPSIS)
03202 || c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
03203 goto array_desig_after_first;
03204
03205
03206
03207 rec = first;
03208 while (c_parser_next_token_is (parser, CPP_COMMA))
03209 {
03210 struct c_expr next;
03211 c_parser_consume_token (parser);
03212 next = c_parser_expr_no_commas (parser, NULL);
03213 next = default_function_array_conversion (next);
03214 rec = build_compound_expr (rec, next.value);
03215 }
03216 parse_message_args:
03217
03218 args = c_parser_objc_message_args (parser);
03219 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
03220 "expected %<]%>");
03221 mexpr.value
03222 = objc_build_message_expr (build_tree_list (rec, args));
03223 mexpr.original_code = ERROR_MARK;
03224
03225
03226
03227 c_parser_initval (parser, &mexpr);
03228 return;
03229 }
03230 c_parser_consume_token (parser);
03231 first = c_parser_expr_no_commas (parser, NULL).value;
03232 array_desig_after_first:
03233 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
03234 {
03235 c_parser_consume_token (parser);
03236 second = c_parser_expr_no_commas (parser, NULL).value;
03237 }
03238 else
03239 second = NULL_TREE;
03240 if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE))
03241 {
03242 c_parser_consume_token (parser);
03243 set_init_index (first, second);
03244 if (pedantic && second)
03245 pedwarn ("ISO C forbids specifying range of "
03246 "elements to initialize");
03247 }
03248 else
03249 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
03250 "expected %<]%>");
03251 }
03252 }
03253 if (des_seen >= 1)
03254 {
03255 if (c_parser_next_token_is (parser, CPP_EQ))
03256 {
03257 if (pedantic && !flag_isoc99)
03258 pedwarn ("ISO C90 forbids specifying subobject to initialize");
03259 c_parser_consume_token (parser);
03260 }
03261 else
03262 {
03263 if (des_seen == 1)
03264 {
03265 if (pedantic)
03266 pedwarn ("obsolete use of designated initializer "
03267 "without %<=%>");
03268 }
03269 else
03270 {
03271 struct c_expr init;
03272 init.value = error_mark_node;
03273 init.original_code = ERROR_MARK;
03274 c_parser_error (parser, "expected %<=%>");
03275 c_parser_skip_until_found (parser, CPP_COMMA, NULL);
03276 process_init_element (init);
03277 return;
03278 }
03279 }
03280 }
03281 }
03282 c_parser_initval (parser, NULL);
03283 }
03284
03285
03286
03287
03288
03289
03290
03291 static void
03292 c_parser_initval (c_parser *parser, struct c_expr *after)
03293 {
03294 struct c_expr init;
03295 gcc_assert (!after || c_dialect_objc ());
03296 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
03297 init = c_parser_braced_init (parser, NULL_TREE, true);
03298 else
03299 {
03300 init = c_parser_expr_no_commas (parser, after);
03301 if (init.value != NULL_TREE
03302 && TREE_CODE (init.value) != STRING_CST
03303 && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
03304 init = default_function_array_conversion (init);
03305 }
03306 process_init_element (init);
03307 }
03308
03309
03310
03311
03312
03313
03314
03315
03316
03317
03318
03319
03320
03321
03322
03323
03324
03325
03326
03327
03328
03329
03330
03331
03332
03333
03334
03335
03336
03337
03338
03339
03340
03341
03342
03343
03344
03345
03346
03347
03348
03349
03350
03351
03352
03353
03354
03355
03356
03357
03358
03359
03360
03361
03362 static tree
03363 c_parser_compound_statement (c_parser *parser)
03364 {
03365 tree stmt;
03366 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
03367 return error_mark_node;
03368 stmt = c_begin_compound_stmt (true);
03369 c_parser_compound_statement_nostart (parser);
03370 return c_end_compound_stmt (stmt, true);
03371 }
03372
03373
03374
03375
03376
03377 static void
03378 c_parser_compound_statement_nostart (c_parser *parser)
03379 {
03380 bool last_stmt = false;
03381 bool last_label = false;
03382 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
03383 {
03384 c_parser_consume_token (parser);
03385 return;
03386 }
03387 if (c_parser_next_token_is_keyword (parser, RID_LABEL))
03388 {
03389
03390
03391 while (c_parser_next_token_is_keyword (parser, RID_LABEL))
03392 {
03393 c_parser_consume_token (parser);
03394
03395
03396 while (true)
03397 {
03398 tree label;
03399 if (c_parser_next_token_is_not (parser, CPP_NAME))
03400 {
03401 c_parser_error (parser, "expected identifier");
03402 break;
03403 }
03404 label
03405 = declare_label (c_parser_peek_token (parser)->value);
03406 C_DECLARED_LABEL_FLAG (label) = 1;
03407 add_stmt (build_stmt (DECL_EXPR, label));
03408 c_parser_consume_token (parser);
03409 if (c_parser_next_token_is (parser, CPP_COMMA))
03410 c_parser_consume_token (parser);
03411 else
03412 break;
03413 }
03414 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
03415 }
03416
03417
03418
03419 if (pedantic)
03420 pedwarn ("ISO C forbids label declarations");
03421 }
03422
03423 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
03424 {
03425 c_parser_error (parser, "expected declaration or statement");
03426 c_parser_consume_token (parser);
03427 return;
03428 }
03429 while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
03430 {
03431 location_t loc = c_parser_peek_token (parser)->location;
03432 if (c_parser_next_token_is_keyword (parser, RID_CASE)
03433 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
03434 || (c_parser_next_token_is (parser, CPP_NAME)
03435 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
03436 {
03437 last_label = true;
03438 last_stmt = false;
03439 c_parser_label (parser);
03440 }
03441 else if (!last_label
03442 && c_parser_next_token_starts_declspecs (parser))
03443 {
03444 last_label = false;
03445 c_parser_declaration_or_fndef (parser, true, true, true, true);
03446 if (last_stmt
03447 && ((pedantic && !flag_isoc99)
03448 || warn_declaration_after_statement))
03449 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
03450 &loc);
03451 last_stmt = false;
03452 }
03453 else if (!last_label
03454 && c_parser_next_token_is_keyword (parser, RID_EXTENSION))
03455 {
03456
03457
03458
03459
03460 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
03461 && (c_parser_peek_2nd_token (parser)->keyword
03462 == RID_EXTENSION))
03463 c_parser_consume_token (parser);
03464 if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
03465 {
03466 int ext;
03467 ext = disable_extension_diagnostics ();
03468 c_parser_consume_token (parser);
03469 last_label = false;
03470 c_parser_declaration_or_fndef (parser, true, true, true, true);
03471
03472
03473 restore_extension_diagnostics (ext);
03474 if (last_stmt
03475 && ((pedantic && !flag_isoc99)
03476 || warn_declaration_after_statement))
03477 pedwarn_c90 ("%HISO C90 forbids mixed declarations and code",
03478 &loc);
03479 last_stmt = false;
03480 }
03481 else
03482 goto statement;
03483 }
03484 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
03485 {
03486
03487
03488
03489
03490
03491 if (c_parser_pragma (parser, pragma_compound))
03492 last_label = false, last_stmt = true;
03493 }
03494 else if (c_parser_next_token_is (parser, CPP_EOF))
03495 {
03496 c_parser_error (parser, "expected declaration or statement");
03497 return;
03498 }
03499 else
03500 {
03501 statement:
03502 last_label = false;
03503 last_stmt = true;
03504 c_parser_statement_after_labels (parser);
03505 }
03506
03507 parser->error = false;
03508 }
03509 if (last_label)
03510 error ("label at end of compound statement");
03511 c_parser_consume_token (parser);
03512 }
03513
03514
03515
03516
03517
03518
03519
03520
03521
03522
03523
03524
03525
03526
03527
03528
03529
03530 static void
03531 c_parser_label (c_parser *parser)
03532 {
03533 location_t loc1 = c_parser_peek_token (parser)->location;
03534 tree label = NULL_TREE;
03535 if (c_parser_next_token_is_keyword (parser, RID_CASE))
03536 {
03537 tree exp1, exp2;
03538 c_parser_consume_token (parser);
03539 exp1 = c_parser_expr_no_commas (parser, NULL).value;
03540 if (c_parser_next_token_is (parser, CPP_COLON))
03541 {
03542 c_parser_consume_token (parser);
03543 label = do_case (exp1, NULL_TREE);
03544 }
03545 else if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
03546 {
03547 c_parser_consume_token (parser);
03548 exp2 = c_parser_expr_no_commas (parser, NULL).value;
03549 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
03550 label = do_case (exp1, exp2);
03551 }
03552 else
03553 c_parser_error (parser, "expected %<:%> or %<...%>");
03554 }
03555 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
03556 {
03557 c_parser_consume_token (parser);
03558 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
03559 label = do_case (NULL_TREE, NULL_TREE);
03560 }
03561 else
03562 {
03563 tree name = c_parser_peek_token (parser)->value;
03564 tree tlab;
03565 location_t loc2;
03566 tree attrs;
03567 gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
03568 c_parser_consume_token (parser);
03569 gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
03570 loc2 = c_parser_peek_token (parser)->location;
03571 c_parser_consume_token (parser);
03572 attrs = c_parser_attributes (parser);
03573 tlab = define_label (loc2, name);
03574 if (tlab)
03575 {
03576 decl_attributes (&tlab, attrs, 0);
03577 label = add_stmt (build_stmt (LABEL_EXPR, tlab));
03578 }
03579 }
03580 if (label)
03581 SET_EXPR_LOCATION (label, loc1);
03582 }
03583
03584
03585
03586
03587
03588
03589
03590
03591
03592
03593
03594
03595
03596
03597
03598
03599
03600
03601
03602
03603
03604
03605
03606
03607
03608
03609
03610
03611
03612
03613
03614
03615
03616
03617
03618
03619
03620
03621
03622
03623
03624
03625
03626
03627
03628
03629
03630
03631
03632
03633
03634
03635
03636
03637
03638
03639
03640
03641
03642
03643
03644
03645
03646
03647
03648
03649
03650
03651
03652
03653
03654
03655
03656
03657
03658
03659
03660
03661
03662
03663
03664
03665
03666
03667
03668
03669
03670
03671
03672
03673
03674
03675
03676
03677
03678
03679
03680
03681 static void
03682 c_parser_statement (c_parser *parser)
03683 {
03684 while (c_parser_next_token_is_keyword (parser, RID_CASE)
03685 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
03686 || (c_parser_next_token_is (parser, CPP_NAME)
03687 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
03688 c_parser_label (parser);
03689 c_parser_statement_after_labels (parser);
03690 }
03691
03692
03693
03694 static void
03695 c_parser_statement_after_labels (c_parser *parser)
03696 {
03697 location_t loc = c_parser_peek_token (parser)->location;
03698 tree stmt = NULL_TREE;
03699 switch (c_parser_peek_token (parser)->type)
03700 {
03701 case CPP_OPEN_BRACE:
03702 add_stmt (c_parser_compound_statement (parser));
03703 break;
03704 case CPP_KEYWORD:
03705 switch (c_parser_peek_token (parser)->keyword)
03706 {
03707 case RID_IF:
03708 c_parser_if_statement (parser);
03709 break;
03710 case RID_SWITCH:
03711 c_parser_switch_statement (parser);
03712 break;
03713 case RID_WHILE:
03714 c_parser_while_statement (parser);
03715 break;
03716 case RID_DO:
03717 c_parser_do_statement (parser);
03718 break;
03719 case RID_FOR:
03720 c_parser_for_statement (parser);
03721 break;
03722 case RID_GOTO:
03723 c_parser_consume_token (parser);
03724 if (c_parser_next_token_is (parser, CPP_NAME))
03725 {
03726 stmt = c_finish_goto_label (c_parser_peek_token (parser)->value);
03727 c_parser_consume_token (parser);
03728 }
03729 else if (c_parser_next_token_is (parser, CPP_MULT))
03730 {
03731 c_parser_consume_token (parser);
03732 stmt = c_finish_goto_ptr (c_parser_expression (parser).value);
03733 }
03734 else
03735 c_parser_error (parser, "expected identifier or %<*%>");
03736 goto expect_semicolon;
03737 case RID_CONTINUE:
03738 c_parser_consume_token (parser);
03739 stmt = c_finish_bc_stmt (&c_cont_label, false);
03740 goto expect_semicolon;
03741 case RID_BREAK:
03742 c_parser_consume_token (parser);
03743 stmt = c_finish_bc_stmt (&c_break_label, true);
03744 goto expect_semicolon;
03745 case RID_RETURN:
03746 c_parser_consume_token (parser);
03747 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
03748 {
03749 stmt = c_finish_return (NULL_TREE);
03750 c_parser_consume_token (parser);
03751 }
03752 else
03753 {
03754 stmt = c_finish_return (c_parser_expression_conv (parser).value);
03755 goto expect_semicolon;
03756 }
03757 break;
03758 case RID_ASM:
03759 stmt = c_parser_asm_statement (parser);
03760 break;
03761 case RID_AT_THROW:
03762 gcc_assert (c_dialect_objc ());
03763 c_parser_consume_token (parser);
03764 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
03765 {
03766 stmt = objc_build_throw_stmt (NULL_TREE);
03767 c_parser_consume_token (parser);
03768 }
03769 else
03770 {
03771 stmt
03772 = objc_build_throw_stmt (c_parser_expression (parser).value);
03773 goto expect_semicolon;
03774 }
03775 break;
03776 case RID_AT_TRY:
03777 gcc_assert (c_dialect_objc ());
03778 c_parser_objc_try_catch_statement (parser);
03779 break;
03780 case RID_AT_SYNCHRONIZED:
03781 gcc_assert (c_dialect_objc ());
03782 c_parser_objc_synchronized_statement (parser);
03783 break;
03784 default:
03785 goto expr_stmt;
03786 }
03787 break;
03788 case CPP_SEMICOLON:
03789 c_parser_consume_token (parser);
03790 break;
03791 case CPP_CLOSE_PAREN:
03792 case CPP_CLOSE_SQUARE:
03793
03794
03795
03796
03797 c_parser_error (parser, "expected statement");
03798 c_parser_consume_token (parser);
03799 break;
03800 case CPP_PRAGMA:
03801 c_parser_pragma (parser, pragma_stmt);
03802 break;
03803 default:
03804 expr_stmt:
03805 stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
03806 expect_semicolon:
03807 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
03808 break;
03809 }
03810
03811
03812
03813
03814
03815
03816
03817
03818
03819
03820 if (stmt && EXPR_P (stmt))
03821 SET_EXPR_LOCATION (stmt, loc);
03822 }
03823
03824
03825
03826
03827
03828
03829 static tree
03830 c_parser_paren_condition (c_parser *parser)
03831 {
03832 location_t loc;
03833 tree cond;
03834 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
03835 return error_mark_node;
03836 loc = c_parser_peek_token (parser)->location;
03837 cond = c_objc_common_truthvalue_conversion
03838 (c_parser_expression_conv (parser).value);
03839 if (EXPR_P (cond))
03840 SET_EXPR_LOCATION (cond, loc);
03841 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
03842 return cond;
03843 }
03844
03845
03846
03847 static tree
03848 c_parser_c99_block_statement (c_parser *parser)
03849 {
03850 tree block = c_begin_compound_stmt (flag_isoc99);
03851 c_parser_statement (parser);
03852 return c_end_compound_stmt (block, flag_isoc99);
03853 }
03854
03855
03856
03857
03858
03859
03860
03861 static tree
03862 c_parser_if_body (c_parser *parser, bool *if_p)
03863 {
03864 tree block = c_begin_compound_stmt (flag_isoc99);
03865 while (c_parser_next_token_is_keyword (parser, RID_CASE)
03866 || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
03867 || (c_parser_next_token_is (parser, CPP_NAME)
03868 && c_parser_peek_2nd_token (parser)->type == CPP_COLON))
03869 c_parser_label (parser);
03870 *if_p = c_parser_next_token_is_keyword (parser, RID_IF);
03871 if (extra_warnings && c_parser_next_token_is (parser, CPP_SEMICOLON))
03872 add_stmt (build_empty_stmt ());
03873 c_parser_statement_after_labels (parser);
03874 return c_end_compound_stmt (block, flag_isoc99);
03875 }
03876
03877
03878
03879
03880
03881
03882
03883
03884 static void
03885 c_parser_if_statement (c_parser *parser)
03886 {
03887 tree block;
03888 location_t loc;
03889 tree cond;
03890 bool first_if = false, second_if = false;
03891 tree first_body, second_body;
03892 gcc_assert (c_parser_next_token_is_keyword (parser, RID_IF));
03893 c_parser_consume_token (parser);
03894 block = c_begin_compound_stmt (flag_isoc99);
03895 loc = c_parser_peek_token (parser)->location;
03896 cond = c_parser_paren_condition (parser);
03897 first_body = c_parser_if_body (parser, &first_if);
03898 if (c_parser_next_token_is_keyword (parser, RID_ELSE))
03899 {
03900 c_parser_consume_token (parser);
03901 second_body = c_parser_if_body (parser, &second_if);
03902 }
03903 else
03904 second_body = NULL_TREE;
03905 c_finish_if_stmt (loc, cond, first_body, second_body, first_if);
03906 add_stmt (c_end_compound_stmt (block, flag_isoc99));
03907 }
03908
03909
03910
03911
03912
03913
03914
03915 static void
03916 c_parser_switch_statement (c_parser *parser)
03917 {
03918 tree block, expr, body, save_break;
03919 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SWITCH));
03920 c_parser_consume_token (parser);
03921 block = c_begin_compound_stmt (flag_isoc99);
03922 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
03923 {
03924 expr = c_parser_expression (parser).value;
03925 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
03926 }
03927 else
03928 expr = error_mark_node;
03929 c_start_case (expr);
03930 save_break = c_break_label;
03931 c_break_label = NULL_TREE;
03932 body = c_parser_c99_block_statement (parser);
03933 c_finish_case (body);
03934 if (c_break_label)
03935 add_stmt (build1 (LABEL_EXPR, void_type_node, c_break_label));
03936 c_break_label = save_break;
03937 add_stmt (c_end_compound_stmt (block, flag_isoc99));
03938 }
03939
03940
03941
03942
03943
03944
03945
03946 static void
03947 c_parser_while_statement (c_parser *parser)
03948 {
03949 tree block, cond, body, save_break, save_cont;
03950 location_t loc;
03951 gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
03952 c_parser_consume_token (parser);
03953 block = c_begin_compound_stmt (flag_isoc99);
03954 loc = c_parser_peek_token (parser)->location;
03955 cond = c_parser_paren_condition (parser);
03956 save_break = c_break_label;
03957 c_break_label = NULL_TREE;
03958 save_cont = c_cont_label;
03959 c_cont_label = NULL_TREE;
03960 body = c_parser_c99_block_statement (parser);
03961 c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
03962 add_stmt (c_end_compound_stmt (block, flag_isoc99));
03963 c_break_label = save_break;
03964 c_cont_label = save_cont;
03965 }
03966
03967
03968
03969
03970
03971
03972
03973 static void
03974 c_parser_do_statement (c_parser *parser)
03975 {
03976 tree block, cond, body, save_break, save_cont, new_break, new_cont;
03977 location_t loc;
03978 gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO));
03979 c_parser_consume_token (parser);
03980 block = c_begin_compound_stmt (flag_isoc99);
03981 loc = c_parser_peek_token (parser)->location;
03982 save_break = c_break_label;
03983 c_break_label = NULL_TREE;
03984 save_cont = c_cont_label;
03985 c_cont_label = NULL_TREE;
03986 body = c_parser_c99_block_statement (parser);
03987 c_parser_require_keyword (parser, RID_WHILE, "expected %<while%>");
03988 new_break = c_break_label;
03989 c_break_label = save_break;
03990 new_cont = c_cont_label;
03991 c_cont_label = save_cont;
03992 cond = c_parser_paren_condition (parser);
03993 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
03994 c_parser_skip_to_end_of_block_or_statement (parser);
03995 c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false);
03996 add_stmt (c_end_compound_stmt (block, flag_isoc99));
03997 }
03998
03999
04000
04001
04002
04003
04004
04005
04006
04007
04008
04009
04010
04011
04012
04013
04014
04015 static void
04016 c_parser_for_statement (c_parser *parser)
04017 {
04018 tree block, cond, incr, save_break, save_cont, body;
04019 location_t loc;
04020 gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR));
04021 loc = c_parser_peek_token (parser)->location;
04022 c_parser_consume_token (parser);
04023 block = c_begin_compound_stmt (flag_isoc99);
04024 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
04025 {
04026
04027 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
04028 {
04029 c_parser_consume_token (parser);
04030 c_finish_expr_stmt (NULL_TREE);
04031 }
04032 else if (c_parser_next_token_starts_declspecs (parser))
04033 {
04034 c_parser_declaration_or_fndef (parser, true, true, true, true);
04035 check_for_loop_decls ();
04036 }
04037 else if (c_parser_next_token_is_keyword (parser, RID_EXTENSION))
04038 {
04039
04040
04041
04042
04043 while (c_parser_peek_2nd_token (parser)->type == CPP_KEYWORD
04044 && (c_parser_peek_2nd_token (parser)->keyword
04045 == RID_EXTENSION))
04046 c_parser_consume_token (parser);
04047 if (c_token_starts_declspecs (c_parser_peek_2nd_token (parser)))
04048 {
04049 int ext;
04050 ext = disable_extension_diagnostics ();
04051 c_parser_consume_token (parser);
04052 c_parser_declaration_or_fndef (parser, true, true, true, true);
04053 restore_extension_diagnostics (ext);
04054 check_for_loop_decls ();
04055 }
04056 else
04057 goto init_expr;
04058 }
04059 else
04060 {
04061 init_expr:
04062 c_finish_expr_stmt (c_parser_expression (parser).value);
04063 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
04064 }
04065
04066 loc = c_parser_peek_token (parser)->location;
04067 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
04068 {
04069 c_parser_consume_token (parser);
04070 cond = NULL_TREE;
04071 }
04072 else
04073 {
04074 tree ocond = c_parser_expression_conv (parser).value;
04075 cond = c_objc_common_truthvalue_conversion (ocond);
04076 if (EXPR_P (cond))
04077 SET_EXPR_LOCATION (cond, loc);
04078 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
04079 }
04080
04081 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
04082 incr = c_process_expr_stmt (NULL_TREE);
04083 else
04084 incr = c_process_expr_stmt (c_parser_expression (parser).value);
04085 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
04086 }
04087 else
04088 {
04089 cond = error_mark_node;
04090 incr = error_mark_node;
04091 }
04092 save_break = c_break_label;
04093 c_break_label = NULL_TREE;
04094 save_cont = c_cont_label;
04095 c_cont_label = NULL_TREE;
04096 body = c_parser_c99_block_statement (parser);
04097 c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true);
04098 add_stmt (c_end_compound_stmt (block, flag_isoc99));
04099 c_break_label = save_break;
04100 c_cont_label = save_cont;
04101 }
04102
04103
04104
04105
04106
04107
04108
04109
04110
04111
04112
04113
04114
04115
04116
04117
04118
04119 static tree
04120 c_parser_asm_statement (c_parser *parser)
04121 {
04122 tree quals, str, outputs, inputs, clobbers, ret;
04123 bool simple;
04124 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM));
04125 c_parser_consume_token (parser);
04126 if (c_parser_next_token_is_keyword (parser, RID_VOLATILE))
04127 {
04128 quals = c_parser_peek_token (parser)->value;
04129 c_parser_consume_token (parser);
04130 }
04131 else if (c_parser_next_token_is_keyword (parser, RID_CONST)
04132 || c_parser_next_token_is_keyword (parser, RID_RESTRICT))
04133 {
04134 warning (0, "%E qualifier ignored on asm",
04135 c_parser_peek_token (parser)->value);
04136 quals = NULL_TREE;
04137 c_parser_consume_token (parser);
04138 }
04139 else
04140 quals = NULL_TREE;
04141
04142
04143 c_lex_string_translate = 0;
04144 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
04145 {
04146 c_lex_string_translate = 1;
04147 return NULL_TREE;
04148 }
04149 str = c_parser_asm_string_literal (parser);
04150 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
04151 {
04152 simple = true;
04153 outputs = NULL_TREE;
04154 inputs = NULL_TREE;
04155 clobbers = NULL_TREE;
04156 goto done_asm;
04157 }
04158 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
04159 {
04160 c_lex_string_translate = 1;
04161 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
04162 return NULL_TREE;
04163 }
04164 simple = false;
04165
04166 if (c_parser_next_token_is (parser, CPP_COLON)
04167 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
04168 outputs = NULL_TREE;
04169 else
04170 outputs = c_parser_asm_operands (parser, false);
04171 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
04172 {
04173 inputs = NULL_TREE;
04174 clobbers = NULL_TREE;
04175 goto done_asm;
04176 }
04177 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
04178 {
04179 c_lex_string_translate = 1;
04180 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
04181 return NULL_TREE;
04182 }
04183
04184 if (c_parser_next_token_is (parser, CPP_COLON)
04185 || c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
04186 inputs = NULL_TREE;
04187 else
04188 inputs = c_parser_asm_operands (parser, true);
04189 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
04190 {
04191 clobbers = NULL_TREE;
04192 goto done_asm;
04193 }
04194 if (!c_parser_require (parser, CPP_COLON, "expected %<:%> or %<)%>"))
04195 {
04196 c_lex_string_translate = 1;
04197 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
04198 return NULL_TREE;
04199 }
04200
04201 clobbers = c_parser_asm_clobbers (parser);
04202 done_asm:
04203 c_lex_string_translate = 1;
04204 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
04205 {
04206 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
04207 return NULL_TREE;
04208 }
04209 if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
04210 c_parser_skip_to_end_of_block_or_statement (parser);
04211 ret = build_asm_stmt (quals, build_asm_expr (str, outputs, inputs,
04212 clobbers, simple));
04213 return ret;
04214 }
04215
04216
04217
04218
04219
04220
04221
04222
04223
04224
04225
04226
04227
04228
04229 static tree
04230 c_parser_asm_operands (c_parser *parser, bool convert_p)
04231 {
04232 tree list = NULL_TREE;
04233 while (true)
04234 {
04235 tree name, str;
04236 struct c_expr expr;
04237 if (c_parser_next_token_is (parser, CPP_OPEN_SQUARE))
04238 {
04239 c_parser_consume_token (parser);
04240 if (c_parser_next_token_is (parser, CPP_NAME))
04241 {
04242 tree id = c_parser_peek_token (parser)->value;
04243 c_parser_consume_token (parser);
04244 name = build_string (IDENTIFIER_LENGTH (id),
04245 IDENTIFIER_POINTER (id));
04246 }
04247 else
04248 {
04249 c_parser_error (parser, "expected identifier");
04250 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
04251 return NULL_TREE;
04252 }
04253 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
04254 "expected %<]%>");
04255 }
04256 else
04257 name = NULL_TREE;
04258 str = c_parser_asm_string_literal (parser);
04259 if (str == NULL_TREE)
04260 return NULL_TREE;
04261 c_lex_string_translate = 1;
04262 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
04263 {
04264 c_lex_string_translate = 0;
04265 return NULL_TREE;
04266 }
04267 expr = c_parser_expression (parser);
04268 if (convert_p)
04269 expr = default_function_array_conversion (expr);
04270 c_lex_string_translate = 0;
04271 if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
04272 {
04273 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
04274 return NULL_TREE;
04275 }
04276 list = chainon (list, build_tree_list (build_tree_list (name, str),
04277 expr.value));
04278 if (c_parser_next_token_is (parser, CPP_COMMA))
04279 c_parser_consume_token (parser);
04280 else
04281 break;
04282 }
04283 return list;
04284 }
04285
04286
04287
04288
04289
04290
04291
04292
04293 static tree
04294 c_parser_asm_clobbers (c_parser *parser)
04295 {
04296 tree list = NULL_TREE;
04297 while (true)
04298 {
04299 tree str = c_parser_asm_string_literal (parser);
04300 if (str)
04301 list = tree_cons (NULL_TREE, str, list);
04302 else
04303 return NULL_TREE;
04304 if (c_parser_next_token_is (parser, CPP_COMMA))
04305 c_parser_consume_token (parser);
04306 else
04307 break;
04308 }
04309 return list;
04310 }
04311
04312
04313
04314
04315
04316
04317
04318
04319
04320
04321
04322
04323
04324
04325
04326
04327
04328 static struct c_expr
04329 c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
04330 {
04331 struct c_expr lhs, rhs, ret;
04332 enum tree_code code;
04333 gcc_assert (!after || c_dialect_objc ());
04334 lhs = c_parser_conditional_expression (parser, after);
04335 switch (c_parser_peek_token (parser)->type)
04336 {
04337 case CPP_EQ:
04338 code = NOP_EXPR;
04339 break;
04340 case CPP_MULT_EQ:
04341 code = MULT_EXPR;
04342 break;
04343 case CPP_DIV_EQ:
04344 code = TRUNC_DIV_EXPR;
04345 break;
04346 case CPP_MOD_EQ:
04347 code = TRUNC_MOD_EXPR;
04348 break;
04349 case CPP_PLUS_EQ:
04350 code = PLUS_EXPR;
04351 break;
04352 case CPP_MINUS_EQ:
04353 code = MINUS_EXPR;
04354 break;
04355 case CPP_LSHIFT_EQ:
04356 code = LSHIFT_EXPR;
04357 break;
04358 case CPP_RSHIFT_EQ:
04359 code = RSHIFT_EXPR;
04360 break;
04361 case CPP_AND_EQ:
04362 code = BIT_AND_EXPR;
04363 break;
04364 case CPP_XOR_EQ:
04365 code = BIT_XOR_EXPR;
04366 break;
04367 case CPP_OR_EQ:
04368 code = BIT_IOR_EXPR;
04369 break;
04370 default:
04371 return lhs;
04372 }
04373 c_parser_consume_token (parser);
04374 rhs = c_parser_expr_no_commas (parser, NULL);
04375 rhs = default_function_array_conversion (rhs);
04376 ret.value = build_modify_expr (lhs.value, code, rhs.value);
04377 if (code == NOP_EXPR)
04378 ret.original_code = MODIFY_EXPR;
04379 else
04380 {
04381 TREE_NO_WARNING (ret.value) = 1;
04382 ret.original_code = ERROR_MARK;
04383 }
04384 return ret;
04385 }
04386
04387
04388
04389
04390
04391
04392
04393
04394
04395
04396
04397
04398
04399
04400
04401 static struct c_expr
04402 c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
04403 {
04404 struct c_expr cond, exp1, exp2, ret;
04405 gcc_assert (!after || c_dialect_objc ());
04406 cond = c_parser_binary_expression (parser, after);
04407 if (c_parser_next_token_is_not (parser, CPP_QUERY))
04408 return cond;
04409 cond = default_function_array_conversion (cond);
04410 c_parser_consume_token (parser);
04411 if (c_parser_next_token_is (parser, CPP_COLON))
04412 {
04413 if (pedantic)
04414 pedwarn ("ISO C forbids omitting the middle term of a ?: expression");
04415
04416 exp1.value = save_expr (default_conversion (cond.value));
04417 cond.value = c_objc_common_truthvalue_conversion (exp1.value);
04418 skip_evaluation += cond.value == truthvalue_true_node;
04419 }
04420 else
04421 {
04422 cond.value
04423 = c_objc_common_truthvalue_conversion
04424 (default_conversion (cond.value));
04425 skip_evaluation += cond.value == truthvalue_false_node;
04426 exp1 = c_parser_expression_conv (parser);
04427 skip_evaluation += ((cond.value == truthvalue_true_node)
04428 - (cond.value == truthvalue_false_node));
04429 }
04430 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
04431 {
04432 skip_evaluation -= cond.value == truthvalue_true_node;
04433 ret.value = error_mark_node;
04434 ret.original_code = ERROR_MARK;
04435 return ret;
04436 }
04437 exp2 = c_parser_conditional_expression (parser, NULL);
04438 exp2 = default_function_array_conversion (exp2);
04439 skip_evaluation -= cond.value == truthvalue_true_node;
04440 ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
04441 ret.original_code = ERROR_MARK;
04442 return ret;
04443 }
04444
04445
04446
04447
04448
04449
04450
04451
04452
04453
04454
04455
04456
04457
04458
04459
04460
04461
04462
04463
04464
04465
04466
04467
04468
04469
04470
04471
04472
04473
04474
04475
04476
04477
04478
04479
04480
04481
04482
04483
04484
04485
04486
04487
04488
04489
04490
04491
04492
04493
04494
04495
04496
04497
04498
04499 static struct c_expr
04500 c_parser_binary_expression (c_parser *parser, struct c_expr *after)
04501 {
04502
04503
04504
04505
04506
04507
04508
04509
04510
04511
04512
04513
04514
04515
04516
04517
04518
04519
04520
04521
04522
04523
04524
04525 enum prec {
04526 PREC_NONE,
04527 PREC_LOGOR,
04528 PREC_LOGAND,
04529 PREC_BITOR,
04530 PREC_BITXOR,
04531 PREC_BITAND,
04532 PREC_EQ,
04533 PREC_REL,
04534 PREC_SHIFT,
04535 PREC_ADD,
04536 PREC_MULT,
04537 NUM_PRECS
04538 };
04539 struct {
04540
04541 struct c_expr expr;
04542
04543
04544 enum prec prec;
04545
04546 enum tree_code op;
04547 } stack[NUM_PRECS];
04548 int sp;
04549 #define POP \
04550 do { \
04551 switch (stack[sp].op) \
04552 { \
04553 case TRUTH_ANDIF_EXPR: \
04554 skip_evaluation -= stack[sp - 1].expr.value == truthvalue_false_node; \
04555 break; \
04556 case TRUTH_ORIF_EXPR: \
04557 skip_evaluation -= stack[sp - 1].expr.value == truthvalue_true_node; \
04558 break; \
04559 default: \
04560 break; \
04561 } \
04562 stack[sp - 1].expr \
04563 = default_function_array_conversion (stack[sp - 1].expr); \
04564 stack[sp].expr \
04565 = default_function_array_conversion (stack[sp].expr); \
04566 stack[sp - 1].expr = parser_build_binary_op (stack[sp].op, \
04567 stack[sp - 1].expr, \
04568 stack[sp].expr); \
04569 sp--; \
04570 } while (0)
04571 gcc_assert (!after || c_dialect_objc ());
04572 stack[0].expr = c_parser_cast_expression (parser, after);
04573 stack[0].prec = PREC_NONE;
04574 sp = 0;
04575 while (true)
04576 {
04577 enum prec oprec;
04578 enum tree_code ocode;
04579 if (parser->error)
04580 goto out;
04581 switch (c_parser_peek_token (parser)->type)
04582 {
04583 case CPP_MULT:
04584 oprec = PREC_MULT;
04585 ocode = MULT_EXPR;
04586 break;
04587 case CPP_DIV:
04588 oprec = PREC_MULT;
04589 ocode = TRUNC_DIV_EXPR;
04590 break;
04591 case CPP_MOD:
04592 oprec = PREC_MULT;
04593 ocode = TRUNC_MOD_EXPR;
04594 break;
04595 case CPP_PLUS:
04596 oprec = PREC_ADD;
04597 ocode = PLUS_EXPR;
04598 break;
04599 case CPP_MINUS:
04600 oprec = PREC_ADD;
04601 ocode = MINUS_EXPR;
04602 break;
04603 case CPP_LSHIFT:
04604 oprec = PREC_SHIFT;
04605 ocode = LSHIFT_EXPR;
04606 break;
04607 case CPP_RSHIFT:
04608 oprec = PREC_SHIFT;
04609 ocode = RSHIFT_EXPR;
04610 break;
04611 case CPP_LESS:
04612 oprec = PREC_REL;
04613 ocode = LT_EXPR;
04614 break;
04615 case CPP_GREATER:
04616 oprec = PREC_REL;
04617 ocode = GT_EXPR;
04618 break;
04619 case CPP_LESS_EQ:
04620 oprec = PREC_REL;
04621 ocode = LE_EXPR;
04622 break;
04623 case CPP_GREATER_EQ:
04624 oprec = PREC_REL;
04625 ocode = GE_EXPR;
04626 break;
04627 case CPP_EQ_EQ:
04628 oprec = PREC_EQ;
04629 ocode = EQ_EXPR;
04630 break;
04631 case CPP_NOT_EQ:
04632 oprec = PREC_EQ;
04633 ocode = NE_EXPR;
04634 break;
04635 case CPP_AND:
04636 oprec = PREC_BITAND;
04637 ocode = BIT_AND_EXPR;
04638 break;
04639 case CPP_XOR:
04640 oprec = PREC_BITXOR;
04641 ocode = BIT_XOR_EXPR;
04642 break;
04643 case CPP_OR:
04644 oprec = PREC_BITOR;
04645 ocode = BIT_IOR_EXPR;
04646 break;
04647 case CPP_AND_AND:
04648 oprec = PREC_LOGAND;
04649 ocode = TRUTH_ANDIF_EXPR;
04650 break;
04651 case CPP_OR_OR:
04652 oprec = PREC_LOGOR;
04653 ocode = TRUTH_ORIF_EXPR;
04654 break;
04655 default:
04656
04657
04658 goto out;
04659 }
04660 c_parser_consume_token (parser);
04661 while (oprec <= stack[sp].prec)
04662 POP;
04663 switch (ocode)
04664 {
04665 case TRUTH_ANDIF_EXPR:
04666 stack[sp].expr
04667 = default_function_array_conversion (stack[sp].expr);
04668 stack[sp].expr.value = c_objc_common_truthvalue_conversion
04669 (default_conversion (stack[sp].expr.value));
04670 skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
04671 break;
04672 case TRUTH_ORIF_EXPR:
04673 stack[sp].expr
04674 = default_function_array_conversion (stack[sp].expr);
04675 stack[sp].expr.value = c_objc_common_truthvalue_conversion
04676 (default_conversion (stack[sp].expr.value));
04677 skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
04678 break;
04679 default:
04680 break;
04681 }
04682 sp++;
04683 stack[sp].expr = c_parser_cast_expression (parser, NULL);
04684 stack[sp].prec = oprec;
04685 stack[sp].op = ocode;
04686 }
04687 out:
04688 while (sp > 0)
04689 POP;
04690 return stack[0].expr;
04691 #undef POP
04692 }
04693
04694
04695
04696
04697
04698
04699
04700
04701
04702
04703 static struct c_expr
04704 c_parser_cast_expression (c_parser *parser, struct c_expr *after)
04705 {
04706 gcc_assert (!after || c_dialect_objc ());
04707 if (after)
04708 return c_parser_postfix_expression_after_primary (parser, *after);
04709
04710
04711
04712
04713 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
04714 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
04715 {
04716 struct c_type_name *type_name;
04717 struct c_expr ret;
04718 struct c_expr expr;
04719 c_parser_consume_token (parser);
04720 type_name = c_parser_type_name (parser);
04721 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
04722 if (type_name == NULL)
04723 {
04724 ret.value = error_mark_node;
04725 ret.original_code = ERROR_MARK;
04726 return ret;
04727 }
04728
04729
04730 used_types_insert (type_name->specs->type);
04731
04732 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
04733 return c_parser_postfix_expression_after_paren_type (parser,
04734 type_name);
04735 expr = c_parser_cast_expression (parser, NULL);
04736 expr = default_function_array_conversion (expr);
04737 ret.value = c_cast_expr (type_name, expr.value);
04738 ret.original_code = ERROR_MARK;
04739 return ret;
04740 }
04741 else
04742 return c_parser_unary_expression (parser);
04743 }
04744
04745
04746
04747
04748
04749
04750
04751
04752
04753
04754
04755
04756
04757
04758
04759
04760
04761
04762
04763
04764
04765
04766
04767
04768
04769
04770
04771
04772 static struct c_expr
04773 c_parser_unary_expression (c_parser *parser)
04774 {
04775 int ext;
04776 struct c_expr ret, op;
04777 switch (c_parser_peek_token (parser)->type)
04778 {
04779 case CPP_PLUS_PLUS:
04780 c_parser_consume_token (parser);
04781 op = c_parser_cast_expression (parser, NULL);
04782 op = default_function_array_conversion (op);
04783 return parser_build_unary_op (PREINCREMENT_EXPR, op);
04784 case CPP_MINUS_MINUS:
04785 c_parser_consume_token (parser);
04786 op = c_parser_cast_expression (parser, NULL);
04787 op = default_function_array_conversion (op);
04788 return parser_build_unary_op (PREDECREMENT_EXPR, op);
04789 case CPP_AND:
04790 c_parser_consume_token (parser);
04791 return parser_build_unary_op (ADDR_EXPR,
04792 c_parser_cast_expression (parser, NULL));
04793 case CPP_MULT:
04794 c_parser_consume_token (parser);
04795 op = c_parser_cast_expression (parser, NULL);
04796 op = default_function_array_conversion (op);
04797 ret.value = build_indirect_ref (op.value, "unary *");
04798 ret.original_code = ERROR_MARK;
04799 return ret;
04800 case CPP_PLUS:
04801 c_parser_consume_token (parser);
04802 if (!c_dialect_objc () && !in_system_header)
04803 warning (OPT_Wtraditional,
04804 "traditional C rejects the unary plus operator");
04805 op = c_parser_cast_expression (parser, NULL);
04806 op = default_function_array_conversion (op);
04807 return parser_build_unary_op (CONVERT_EXPR, op);
04808 case CPP_MINUS:
04809 c_parser_consume_token (parser);
04810 op = c_parser_cast_expression (parser, NULL);
04811 op = default_function_array_conversion (op);
04812 return parser_build_unary_op (NEGATE_EXPR, op);
04813 case CPP_COMPL:
04814 c_parser_consume_token (parser);
04815 op = c_parser_cast_expression (parser, NULL);
04816 op = default_function_array_conversion (op);
04817 return parser_build_unary_op (BIT_NOT_EXPR, op);
04818 case CPP_NOT:
04819 c_parser_consume_token (parser);
04820 op = c_parser_cast_expression (parser, NULL);
04821 op = default_function_array_conversion (op);
04822 return parser_build_unary_op (TRUTH_NOT_EXPR, op);
04823 case CPP_AND_AND:
04824
04825 c_parser_consume_token (parser);
04826 if (c_parser_next_token_is (parser, CPP_NAME))
04827 {
04828 ret.value = finish_label_address_expr
04829 (c_parser_peek_token (parser)->value);
04830 c_parser_consume_token (parser);
04831 }
04832 else
04833 {
04834 c_parser_error (parser, "expected identifier");
04835 ret.value = error_mark_node;
04836 }
04837 ret.original_code = ERROR_MARK;
04838 return ret;
04839 case CPP_KEYWORD:
04840 switch (c_parser_peek_token (parser)->keyword)
04841 {
04842 case RID_SIZEOF:
04843 return c_parser_sizeof_expression (parser);
04844 case RID_ALIGNOF:
04845 return c_parser_alignof_expression (parser);
04846 case RID_EXTENSION:
04847 c_parser_consume_token (parser);
04848 ext = disable_extension_diagnostics ();
04849 ret = c_parser_cast_expression (parser, NULL);
04850 restore_extension_diagnostics (ext);
04851 return ret;
04852 case RID_REALPART:
04853 c_parser_consume_token (parser);
04854 op = c_parser_cast_expression (parser, NULL);
04855 op = default_function_array_conversion (op);
04856 return parser_build_unary_op (REALPART_EXPR, op);
04857 case RID_IMAGPART:
04858 c_parser_consume_token (parser);
04859 op = c_parser_cast_expression (parser, NULL);
04860 op = default_function_array_conversion (op);
04861 return parser_build_unary_op (IMAGPART_EXPR, op);
04862 default:
04863 return c_parser_postfix_expression (parser);
04864 }
04865 default:
04866 return c_parser_postfix_expression (parser);
04867 }
04868 }
04869
04870
04871
04872 static struct c_expr
04873 c_parser_sizeof_expression (c_parser *parser)
04874 {
04875 struct c_expr expr;
04876 gcc_assert (c_parser_next_token_is_keyword (parser, RID_SIZEOF));
04877 c_parser_consume_token (parser);
04878 skip_evaluation++;
04879 in_sizeof++;
04880 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
04881 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
04882 {
04883
04884
04885 struct c_type_name *type_name;
04886 c_parser_consume_token (parser);
04887 type_name = c_parser_type_name (parser);
04888 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
04889 if (type_name == NULL)
04890 {
04891 struct c_expr ret;
04892 skip_evaluation--;
04893 in_sizeof--;
04894 ret.value = error_mark_node;
04895 ret.original_code = ERROR_MARK;
04896 return ret;
04897 }
04898 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
04899 {
04900 expr = c_parser_postfix_expression_after_paren_type (parser,
04901 type_name);
04902 goto sizeof_expr;
04903 }
04904
04905 skip_evaluation--;
04906 in_sizeof--;
04907 if (type_name->declarator->kind == cdk_array
04908 && type_name->declarator->u.array.vla_unspec_p)
04909 {
04910
04911 error ("%<[*]%> not allowed in other than a declaration");
04912 }
04913 return c_expr_sizeof_type (type_name);
04914 }
04915 else
04916 {
04917 expr = c_parser_unary_expression (parser);
04918 sizeof_expr:
04919 skip_evaluation--;
04920 in_sizeof--;
04921 if (TREE_CODE (expr.value) == COMPONENT_REF
04922 && DECL_C_BIT_FIELD (TREE_OPERAND (expr.value, 1)))
04923 error ("%<sizeof%> applied to a bit-field");
04924 return c_expr_sizeof_expr (expr);
04925 }
04926 }
04927
04928
04929
04930 static struct c_expr
04931 c_parser_alignof_expression (c_parser *parser)
04932 {
04933 struct c_expr expr;
04934 gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
04935 c_parser_consume_token (parser);
04936 skip_evaluation++;
04937 in_alignof++;
04938 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
04939 && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
04940 {
04941
04942
04943 struct c_type_name *type_name;
04944 struct c_expr ret;
04945 c_parser_consume_token (parser);
04946 type_name = c_parser_type_name (parser);
04947 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
04948 if (type_name == NULL)
04949 {
04950 struct c_expr ret;
04951 skip_evaluation--;
04952 in_alignof--;
04953 ret.value = error_mark_node;
04954 ret.original_code = ERROR_MARK;
04955 return ret;
04956 }
04957 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
04958 {
04959 expr = c_parser_postfix_expression_after_paren_type (parser,
04960 type_name);
04961 goto alignof_expr;
04962 }
04963
04964 skip_evaluation--;
04965 in_alignof--;
04966 ret.value = c_alignof (groktypename (type_name));
04967 ret.original_code = ERROR_MARK;
04968 return ret;
04969 }
04970 else
04971 {
04972 struct c_expr ret;
04973 expr = c_parser_unary_expression (parser);
04974 alignof_expr:
04975 skip_evaluation--;
04976 in_alignof--;
04977 ret.value = c_alignof_expr (expr.value);
04978 ret.original_code = ERROR_MARK;
04979 return ret;
04980 }
04981 }
04982
04983
04984
04985
04986
04987
04988
04989
04990
04991
04992
04993
04994
04995
04996
04997
04998
04999
05000
05001
05002
05003
05004
05005
05006
05007
05008
05009
05010
05011
05012
05013
05014
05015
05016
05017
05018
05019
05020
05021
05022
05023
05024
05025
05026
05027
05028
05029
05030
05031
05032
05033
05034
05035
05036 static struct c_expr
05037 c_parser_postfix_expression (c_parser *parser)
05038 {
05039 struct c_expr expr, e1, e2, e3;
05040 struct c_type_name *t1, *t2;
05041 switch (c_parser_peek_token (parser)->type)
05042 {
05043 case CPP_NUMBER:
05044 case CPP_CHAR:
05045 case CPP_WCHAR:
05046 expr.value = c_parser_peek_token (parser)->value;
05047 expr.original_code = ERROR_MARK;
05048 c_parser_consume_token (parser);
05049 break;
05050 case CPP_STRING:
05051 case CPP_WSTRING:
05052 expr.value = c_parser_peek_token (parser)->value;
05053 expr.original_code = STRING_CST;
05054 c_parser_consume_token (parser);
05055 break;
05056 case CPP_OBJC_STRING:
05057 gcc_assert (c_dialect_objc ());
05058 expr.value
05059 = objc_build_string_object (c_parser_peek_token (parser)->value);
05060 expr.original_code = ERROR_MARK;
05061 c_parser_consume_token (parser);
05062 break;
05063 case CPP_NAME:
05064 if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
05065 {
05066 c_parser_error (parser, "expected expression");
05067 expr.value = error_mark_node;
05068 expr.original_code = ERROR_MARK;
05069 break;
05070 }
05071 {
05072 tree id = c_parser_peek_token (parser)->value;
05073 location_t loc = c_parser_peek_token (parser)->location;
05074 c_parser_consume_token (parser);
05075 expr.value = build_external_ref (id,
05076 (c_parser_peek_token (parser)->type
05077 == CPP_OPEN_PAREN), loc);
05078 expr.original_code = ERROR_MARK;
05079 }
05080 break;
05081 case CPP_OPEN_PAREN:
05082
05083
05084 if (c_parser_peek_2nd_token (parser)->type == CPP_OPEN_BRACE)
05085 {
05086
05087 tree stmt;
05088 c_parser_consume_token (parser);
05089 c_parser_consume_token (parser);
05090 if (cur_stmt_list == NULL)
05091 {
05092 error ("braced-group within expression allowed "
05093 "only inside a function");
05094 parser->error = true;
05095 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
05096 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05097 expr.value = error_mark_node;
05098 expr.original_code = ERROR_MARK;
05099 break;
05100 }
05101 stmt = c_begin_stmt_expr ();
05102 c_parser_compound_statement_nostart (parser);
05103 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05104 "expected %<)%>");
05105 if (pedantic)
05106 pedwarn ("ISO C forbids braced-groups within expressions");
05107 expr.value = c_finish_stmt_expr (stmt);
05108 expr.original_code = ERROR_MARK;
05109 }
05110 else if (c_token_starts_typename (c_parser_peek_2nd_token (parser)))
05111 {
05112
05113
05114
05115
05116 struct c_type_name *type_name;
05117 c_parser_consume_token (parser);
05118 type_name = c_parser_type_name (parser);
05119 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05120 "expected %<)%>");
05121 if (type_name == NULL)
05122 {
05123 expr.value = error_mark_node;
05124 expr.original_code = ERROR_MARK;
05125 }
05126 else
05127 expr = c_parser_postfix_expression_after_paren_type (parser,
05128 type_name);
05129 }
05130 else
05131 {
05132
05133 c_parser_consume_token (parser);
05134 expr = c_parser_expression (parser);
05135 if (TREE_CODE (expr.value) == MODIFY_EXPR)
05136 TREE_NO_WARNING (expr.value) = 1;
05137 expr.original_code = ERROR_MARK;
05138 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05139 "expected %<)%>");
05140 }
05141 break;
05142 case CPP_KEYWORD:
05143 switch (c_parser_peek_token (parser)->keyword)
05144 {
05145 case RID_FUNCTION_NAME:
05146 case RID_PRETTY_FUNCTION_NAME:
05147 case RID_C99_FUNCTION_NAME:
05148 expr.value = fname_decl (c_parser_peek_token (parser)->keyword,
05149 c_parser_peek_token (parser)->value);
05150 expr.original_code = ERROR_MARK;
05151 c_parser_consume_token (parser);
05152 break;
05153 case RID_VA_ARG:
05154 c_parser_consume_token (parser);
05155 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05156 {
05157 expr.value = error_mark_node;
05158 expr.original_code = ERROR_MARK;
05159 break;
05160 }
05161 e1 = c_parser_expr_no_commas (parser, NULL);
05162 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
05163 {
05164 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05165 expr.value = error_mark_node;
05166 expr.original_code = ERROR_MARK;
05167 break;
05168 }
05169 t1 = c_parser_type_name (parser);
05170 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05171 "expected %<)%>");
05172 if (t1 == NULL)
05173 {
05174 expr.value = error_mark_node;
05175 expr.original_code = ERROR_MARK;
05176 }
05177 else
05178 {
05179 expr.value = build_va_arg (e1.value, groktypename (t1));
05180 expr.original_code = ERROR_MARK;
05181 }
05182 break;
05183 case RID_OFFSETOF:
05184 c_parser_consume_token (parser);
05185 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05186 {
05187 expr.value = error_mark_node;
05188 expr.original_code = ERROR_MARK;
05189 break;
05190 }
05191 t1 = c_parser_type_name (parser);
05192 if (t1 == NULL)
05193 {
05194 expr.value = error_mark_node;
05195 expr.original_code = ERROR_MARK;
05196 break;
05197 }
05198 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
05199 {
05200 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05201 expr.value = error_mark_node;
05202 expr.original_code = ERROR_MARK;
05203 break;
05204 }
05205 {
05206 tree type = groktypename (t1);
05207 tree offsetof_ref;
05208 if (type == error_mark_node)
05209 offsetof_ref = error_mark_node;
05210 else
05211 offsetof_ref = build1 (INDIRECT_REF, type, null_pointer_node);
05212
05213
05214
05215 if (c_parser_next_token_is (parser, CPP_NAME))
05216 {
05217 offsetof_ref = build_component_ref
05218 (offsetof_ref, c_parser_peek_token (parser)->value);
05219 c_parser_consume_token (parser);
05220 while (c_parser_next_token_is (parser, CPP_DOT)
05221 || c_parser_next_token_is (parser,
05222 CPP_OPEN_SQUARE))
05223 {
05224 if (c_parser_next_token_is (parser, CPP_DOT))
05225 {
05226 c_parser_consume_token (parser);
05227 if (c_parser_next_token_is_not (parser,
05228 CPP_NAME))
05229 {
05230 c_parser_error (parser, "expected identifier");
05231 break;
05232 }
05233 offsetof_ref = build_component_ref
05234 (offsetof_ref,
05235 c_parser_peek_token (parser)->value);
05236 c_parser_consume_token (parser);
05237 }
05238 else
05239 {
05240 tree idx;
05241 c_parser_consume_token (parser);
05242 idx = c_parser_expression (parser).value;
05243 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
05244 "expected %<]%>");
05245 offsetof_ref = build_array_ref (offsetof_ref, idx);
05246 }
05247 }
05248 }
05249 else
05250 c_parser_error (parser, "expected identifier");
05251 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05252 "expected %<)%>");
05253 expr.value = fold_offsetof (offsetof_ref, NULL_TREE);
05254 expr.original_code = ERROR_MARK;
05255 }
05256 break;
05257 case RID_CHOOSE_EXPR:
05258 c_parser_consume_token (parser);
05259 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05260 {
05261 expr.value = error_mark_node;
05262 expr.original_code = ERROR_MARK;
05263 break;
05264 }
05265 e1 = c_parser_expr_no_commas (parser, NULL);
05266 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
05267 {
05268 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05269 expr.value = error_mark_node;
05270 expr.original_code = ERROR_MARK;
05271 break;
05272 }
05273 e2 = c_parser_expr_no_commas (parser, NULL);
05274 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
05275 {
05276 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05277 expr.value = error_mark_node;
05278 expr.original_code = ERROR_MARK;
05279 break;
05280 }
05281 e3 = c_parser_expr_no_commas (parser, NULL);
05282 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05283 "expected %<)%>");
05284 {
05285 tree c;
05286
05287 c = fold (e1.value);
05288 if (TREE_CODE (c) != INTEGER_CST)
05289 error ("first argument to %<__builtin_choose_expr%> not"
05290 " a constant");
05291 expr = integer_zerop (c) ? e3 : e2;
05292 }
05293 break;
05294 case RID_TYPES_COMPATIBLE_P:
05295 c_parser_consume_token (parser);
05296 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05297 {
05298 expr.value = error_mark_node;
05299 expr.original_code = ERROR_MARK;
05300 break;
05301 }
05302 t1 = c_parser_type_name (parser);
05303 if (t1 == NULL)
05304 {
05305 expr.value = error_mark_node;
05306 expr.original_code = ERROR_MARK;
05307 break;
05308 }
05309 if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
05310 {
05311 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05312 expr.value = error_mark_node;
05313 expr.original_code = ERROR_MARK;
05314 break;
05315 }
05316 t2 = c_parser_type_name (parser);
05317 if (t2 == NULL)
05318 {
05319 expr.value = error_mark_node;
05320 expr.original_code = ERROR_MARK;
05321 break;
05322 }
05323 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05324 "expected %<)%>");
05325 {
05326 tree e1, e2;
05327
05328 e1 = TYPE_MAIN_VARIANT (groktypename (t1));
05329 e2 = TYPE_MAIN_VARIANT (groktypename (t2));
05330
05331 expr.value = comptypes (e1, e2)
05332 ? build_int_cst (NULL_TREE, 1)
05333 : build_int_cst (NULL_TREE, 0);
05334 expr.original_code = ERROR_MARK;
05335 }
05336 break;
05337 case RID_AT_SELECTOR:
05338 gcc_assert (c_dialect_objc ());
05339 c_parser_consume_token (parser);
05340 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05341 {
05342 expr.value = error_mark_node;
05343 expr.original_code = ERROR_MARK;
05344 break;
05345 }
05346 {
05347 tree sel = c_parser_objc_selector_arg (parser);
05348 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05349 "expected %<)%>");
05350 expr.value = objc_build_selector_expr (sel);
05351 expr.original_code = ERROR_MARK;
05352 }
05353 break;
05354 case RID_AT_PROTOCOL:
05355 gcc_assert (c_dialect_objc ());
05356 c_parser_consume_token (parser);
05357 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05358 {
05359 expr.value = error_mark_node;
05360 expr.original_code = ERROR_MARK;
05361 break;
05362 }
05363 if (c_parser_next_token_is_not (parser, CPP_NAME))
05364 {
05365 c_parser_error (parser, "expected identifier");
05366 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05367 expr.value = error_mark_node;
05368 expr.original_code = ERROR_MARK;
05369 break;
05370 }
05371 {
05372 tree id = c_parser_peek_token (parser)->value;
05373 c_parser_consume_token (parser);
05374 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05375 "expected %<)%>");
05376 expr.value = objc_build_protocol_expr (id);
05377 expr.original_code = ERROR_MARK;
05378 }
05379 break;
05380 case RID_AT_ENCODE:
05381
05382 gcc_assert (c_dialect_objc ());
05383 c_parser_consume_token (parser);
05384 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
05385 {
05386 expr.value = error_mark_node;
05387 expr.original_code = ERROR_MARK;
05388 break;
05389 }
05390 t1 = c_parser_type_name (parser);
05391 if (t1 == NULL)
05392 {
05393 expr.value = error_mark_node;
05394 expr.original_code = ERROR_MARK;
05395 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05396 break;
05397 }
05398 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05399 "expected %<)%>");
05400 {
05401 tree type = groktypename (t1);
05402 expr.value = objc_build_encode_expr (type);
05403 expr.original_code = ERROR_MARK;
05404 }
05405 break;
05406 default:
05407 c_parser_error (parser, "expected expression");
05408 expr.value = error_mark_node;
05409 expr.original_code = ERROR_MARK;
05410 break;
05411 }
05412 break;
05413 case CPP_OPEN_SQUARE:
05414 if (c_dialect_objc ())
05415 {
05416 tree receiver, args;
05417 c_parser_consume_token (parser);
05418 receiver = c_parser_objc_receiver (parser);
05419 args = c_parser_objc_message_args (parser);
05420 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
05421 "expected %<]%>");
05422 expr.value = objc_build_message_expr (build_tree_list (receiver,
05423 args));
05424 expr.original_code = ERROR_MARK;
05425 break;
05426 }
05427
05428 default:
05429 c_parser_error (parser, "expected expression");
05430 expr.value = error_mark_node;
05431 expr.original_code = ERROR_MARK;
05432 break;
05433 }
05434 return c_parser_postfix_expression_after_primary (parser, expr);
05435 }
05436
05437
05438
05439
05440
05441
05442
05443
05444
05445 static struct c_expr
05446 c_parser_postfix_expression_after_paren_type (c_parser *parser,
05447 struct c_type_name *type_name)
05448 {
05449 tree type;
05450 struct c_expr init;
05451 struct c_expr expr;
05452 start_init (NULL_TREE, NULL, 0);
05453 type = groktypename (type_name);
05454 if (type != error_mark_node && C_TYPE_VARIABLE_SIZE (type))
05455 {
05456 error ("compound literal has variable size");
05457 type = error_mark_node;
05458 }
05459 init = c_parser_braced_init (parser, type, false);
05460 finish_init ();
05461 maybe_warn_string_init (type, init);
05462
05463 if (pedantic && !flag_isoc99)
05464 pedwarn ("ISO C90 forbids compound literals");
05465 expr.value = build_compound_literal (type, init.value);
05466 expr.original_code = ERROR_MARK;
05467 return c_parser_postfix_expression_after_primary (parser, expr);
05468 }
05469
05470
05471
05472
05473 static struct c_expr
05474 c_parser_postfix_expression_after_primary (c_parser *parser,
05475 struct c_expr expr)
05476 {
05477 tree ident, idx, exprlist;
05478 while (true)
05479 {
05480 switch (c_parser_peek_token (parser)->type)
05481 {
05482 case CPP_OPEN_SQUARE:
05483
05484 c_parser_consume_token (parser);
05485 idx = c_parser_expression (parser).value;
05486 c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE,
05487 "expected %<]%>");
05488 expr.value = build_array_ref (expr.value, idx);
05489 expr.original_code = ERROR_MARK;
05490 break;
05491 case CPP_OPEN_PAREN:
05492
05493 c_parser_consume_token (parser);
05494 if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
05495 exprlist = NULL_TREE;
05496 else
05497 exprlist = c_parser_expr_list (parser, true);
05498 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
05499 "expected %<)%>");
05500 expr.value = build_function_call (expr.value, exprlist);
05501 expr.original_code = ERROR_MARK;
05502 break;
05503 case CPP_DOT:
05504
05505 c_parser_consume_token (parser);
05506 expr = default_function_array_conversion (expr);
05507 if (c_parser_next_token_is (parser, CPP_NAME))
05508 ident = c_parser_peek_token (parser)->value;
05509 else
05510 {
05511 c_parser_error (parser, "expected identifier");
05512 expr.value = error_mark_node;
05513 expr.original_code = ERROR_MARK;
05514 return expr;
05515 }
05516 c_parser_consume_token (parser);
05517 expr.value = build_component_ref (expr.value, ident);
05518 expr.original_code = ERROR_MARK;
05519 break;
05520 case CPP_DEREF:
05521
05522 c_parser_consume_token (parser);
05523 expr = default_function_array_conversion (expr);
05524 if (c_parser_next_token_is (parser, CPP_NAME))
05525 ident = c_parser_peek_token (parser)->value;
05526 else
05527 {
05528 c_parser_error (parser, "expected identifier");
05529 expr.value = error_mark_node;
05530 expr.original_code = ERROR_MARK;
05531 return expr;
05532 }
05533 c_parser_consume_token (parser);
05534 expr.value = build_component_ref (build_indirect_ref (expr.value,
05535 "->"), ident);
05536 expr.original_code = ERROR_MARK;
05537 break;
05538 case CPP_PLUS_PLUS:
05539
05540 c_parser_consume_token (parser);
05541 expr = default_function_array_conversion (expr);
05542 expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
05543 expr.original_code = ERROR_MARK;
05544 break;
05545 case CPP_MINUS_MINUS:
05546
05547 c_parser_consume_token (parser);
05548 expr = default_function_array_conversion (expr);
05549 expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
05550 expr.original_code = ERROR_MARK;
05551 break;
05552 default:
05553 return expr;
05554 }
05555 }
05556 }
05557
05558
05559
05560
05561
05562
05563
05564
05565 static struct c_expr
05566 c_parser_expression (c_parser *parser)
05567 {
05568 struct c_expr expr;
05569 expr = c_parser_expr_no_commas (parser, NULL);
05570 while (c_parser_next_token_is (parser, CPP_COMMA))
05571 {
05572 struct c_expr next;
05573 c_parser_consume_token (parser);
05574 next = c_parser_expr_no_commas (parser, NULL);
05575 next = default_function_array_conversion (next);
05576 expr.value = build_compound_expr (expr.value, next.value);
05577 expr.original_code = COMPOUND_EXPR;
05578 }
05579 return expr;
05580 }
05581
05582
05583
05584
05585 static struct c_expr
05586 c_parser_expression_conv (c_parser *parser)
05587 {
05588 struct c_expr expr;
05589 expr = c_parser_expression (parser);
05590 expr = default_function_array_conversion (expr);
05591 return expr;
05592 }
05593
05594
05595
05596
05597
05598
05599
05600
05601
05602 static tree
05603 c_parser_expr_list (c_parser *parser, bool convert_p)
05604 {
05605 struct c_expr expr;
05606 tree ret, cur;
05607 expr = c_parser_expr_no_commas (parser, NULL);
05608 if (convert_p)
05609 expr = default_function_array_conversion (expr);
05610 ret = cur = build_tree_list (NULL_TREE, expr.value);
05611 while (c_parser_next_token_is (parser, CPP_COMMA))
05612 {
05613 c_parser_consume_token (parser);
05614 expr = c_parser_expr_no_commas (parser, NULL);
05615 if (convert_p)
05616 expr = default_function_array_conversion (expr);
05617 cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
05618 }
05619 return ret;
05620 }
05621
05622
05623
05624
05625
05626
05627
05628
05629
05630
05631
05632
05633
05634
05635
05636
05637
05638
05639
05640
05641
05642
05643
05644
05645 static void
05646 c_parser_objc_class_definition (c_parser *parser)
05647 {
05648 bool iface_p;
05649 tree id1;
05650 tree superclass;
05651 if (c_parser_next_token_is_keyword (parser, RID_AT_INTERFACE))
05652 iface_p = true;
05653 else if (c_parser_next_token_is_keyword (parser, RID_AT_IMPLEMENTATION))
05654 iface_p = false;
05655 else
05656 gcc_unreachable ();
05657 c_parser_consume_token (parser);
05658 if (c_parser_next_token_is_not (parser, CPP_NAME))
05659 {
05660 c_parser_error (parser, "expected identifier");
05661 return;
05662 }
05663 id1 = c_parser_peek_token (parser)->value;
05664 c_parser_consume_token (parser);
05665 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
05666 {
05667 tree id2;
05668 tree proto = NULL_TREE;
05669 c_parser_consume_token (parser);
05670 if (c_parser_next_token_is_not (parser, CPP_NAME))
05671 {
05672 c_parser_error (parser, "expected identifier");
05673 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
05674 return;
05675 }
05676 id2 = c_parser_peek_token (parser)->value;
05677 c_parser_consume_token (parser);
05678 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
05679 if (!iface_p)
05680 {
05681 objc_start_category_implementation (id1, id2);
05682 return;
05683 }
05684 if (c_parser_next_token_is (parser, CPP_LESS))
05685 proto = c_parser_objc_protocol_refs (parser);
05686 objc_start_category_interface (id1, id2, proto);
05687 c_parser_objc_methodprotolist (parser);
05688 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
05689 objc_finish_interface ();
05690 return;
05691 }
05692 if (c_parser_next_token_is (parser, CPP_COLON))
05693 {
05694 c_parser_consume_token (parser);
05695 if (c_parser_next_token_is_not (parser, CPP_NAME))
05696 {
05697 c_parser_error (parser, "expected identifier");
05698 return;
05699 }
05700 superclass = c_parser_peek_token (parser)->value;
05701 c_parser_consume_token (parser);
05702 }
05703 else
05704 superclass = NULL_TREE;
05705 if (iface_p)
05706 {
05707 tree proto = NULL_TREE;
05708 if (c_parser_next_token_is (parser, CPP_LESS))
05709 proto = c_parser_objc_protocol_refs (parser);
05710 objc_start_class_interface (id1, superclass, proto);
05711 }
05712 else
05713 objc_start_class_implementation (id1, superclass);
05714 if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
05715 c_parser_objc_class_instance_variables (parser);
05716 if (iface_p)
05717 {
05718 objc_continue_interface ();
05719 c_parser_objc_methodprotolist (parser);
05720 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
05721 objc_finish_interface ();
05722 }
05723 else
05724 {
05725 objc_continue_implementation ();
05726 return;
05727 }
05728 }
05729
05730
05731
05732
05733
05734
05735
05736
05737
05738
05739
05740
05741
05742
05743
05744
05745
05746
05747
05748
05749
05750
05751
05752 static void
05753 c_parser_objc_class_instance_variables (c_parser *parser)
05754 {
05755 gcc_assert (c_parser_next_token_is (parser, CPP_OPEN_BRACE));
05756 c_parser_consume_token (parser);
05757 while (c_parser_next_token_is_not (parser, CPP_EOF))
05758 {
05759 tree decls;
05760
05761 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
05762 {
05763 if (pedantic)
05764 pedwarn ("extra semicolon in struct or union specified");
05765 c_parser_consume_token (parser);
05766 continue;
05767 }
05768
05769 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
05770 {
05771 c_parser_consume_token (parser);
05772 break;
05773 }
05774
05775 if (c_parser_next_token_is_keyword (parser, RID_AT_PRIVATE))
05776 {
05777 c_parser_consume_token (parser);
05778 objc_set_visibility (2);
05779 continue;
05780 }
05781 else if (c_parser_next_token_is_keyword (parser, RID_AT_PROTECTED))
05782 {
05783 c_parser_consume_token (parser);
05784 objc_set_visibility (0);
05785 continue;
05786 }
05787 else if (c_parser_next_token_is_keyword (parser, RID_AT_PUBLIC))
05788 {
05789 c_parser_consume_token (parser);
05790 objc_set_visibility (1);
05791 continue;
05792 }
05793 else if (c_parser_next_token_is (parser, CPP_PRAGMA))
05794 {
05795 c_parser_pragma (parser, pragma_external);
05796 continue;
05797 }
05798
05799
05800 decls = c_parser_struct_declaration (parser);
05801 {
05802
05803
05804 tree ivar = nreverse (decls);
05805 for (; ivar; ivar = TREE_CHAIN (ivar))
05806 objc_add_instance_variable (copy_node (ivar));
05807 }
05808 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
05809 }
05810 }
05811
05812
05813
05814
05815
05816
05817
05818 static void
05819 c_parser_objc_class_declaration (c_parser *parser)
05820 {
05821 tree list = NULL_TREE;
05822 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_CLASS));
05823 c_parser_consume_token (parser);
05824
05825
05826 while (true)
05827 {
05828 tree id;
05829 if (c_parser_next_token_is_not (parser, CPP_NAME))
05830 {
05831 c_parser_error (parser, "expected identifier");
05832 break;
05833 }
05834 id = c_parser_peek_token (parser)->value;
05835 list = chainon (list, build_tree_list (NULL_TREE, id));
05836 c_parser_consume_token (parser);
05837 if (c_parser_next_token_is (parser, CPP_COMMA))
05838 c_parser_consume_token (parser);
05839 else
05840 break;
05841 }
05842 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
05843 objc_declare_class (list);
05844 }
05845
05846
05847
05848
05849
05850
05851
05852 static void
05853 c_parser_objc_alias_declaration (c_parser *parser)
05854 {
05855 tree id1, id2;
05856 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_ALIAS));
05857 c_parser_consume_token (parser);
05858 if (c_parser_next_token_is_not (parser, CPP_NAME))
05859 {
05860 c_parser_error (parser, "expected identifier");
05861 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
05862 return;
05863 }
05864 id1 = c_parser_peek_token (parser)->value;
05865 c_parser_consume_token (parser);
05866 if (c_parser_next_token_is_not (parser, CPP_NAME))
05867 {
05868 c_parser_error (parser, "expected identifier");
05869 c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
05870 return;
05871 }
05872 id2 = c_parser_peek_token (parser)->value;
05873 c_parser_consume_token (parser);
05874 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
05875 objc_declare_alias (id1, id2);
05876 }
05877
05878
05879
05880
05881
05882
05883
05884
05885
05886
05887
05888
05889 static void
05890 c_parser_objc_protocol_definition (c_parser *parser)
05891 {
05892 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_PROTOCOL));
05893 c_parser_consume_token (parser);
05894 if (c_parser_next_token_is_not (parser, CPP_NAME))
05895 {
05896 c_parser_error (parser, "expected identifier");
05897 return;
05898 }
05899 if (c_parser_peek_2nd_token (parser)->type == CPP_COMMA
05900 || c_parser_peek_2nd_token (parser)->type == CPP_SEMICOLON)
05901 {
05902 tree list = NULL_TREE;
05903
05904
05905 while (true)
05906 {
05907 tree id;
05908 if (c_parser_next_token_is_not (parser, CPP_NAME))
05909 {
05910 c_parser_error (parser, "expected identifier");
05911 break;
05912 }
05913 id = c_parser_peek_token (parser)->value;
05914 list = chainon (list, build_tree_list (NULL_TREE, id));
05915 c_parser_consume_token (parser);
05916 if (c_parser_next_token_is (parser, CPP_COMMA))
05917 c_parser_consume_token (parser);
05918 else
05919 break;
05920 }
05921 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
05922 objc_declare_protocols (list);
05923 }
05924 else
05925 {
05926 tree id = c_parser_peek_token (parser)->value;
05927 tree proto = NULL_TREE;
05928 c_parser_consume_token (parser);
05929 if (c_parser_next_token_is (parser, CPP_LESS))
05930 proto = c_parser_objc_protocol_refs (parser);
05931 objc_pq_context = 1;
05932 objc_start_protocol (id, proto);
05933 c_parser_objc_methodprotolist (parser);
05934 c_parser_require_keyword (parser, RID_AT_END, "expected %<@end%>");
05935 objc_pq_context = 0;
05936 objc_finish_interface ();
05937 }
05938 }
05939
05940
05941
05942
05943
05944
05945
05946
05947 static enum tree_code
05948 c_parser_objc_method_type (c_parser *parser)
05949 {
05950 switch (c_parser_peek_token (parser)->type)
05951 {
05952 case CPP_PLUS:
05953 c_parser_consume_token (parser);
05954 return PLUS_EXPR;
05955 case CPP_MINUS:
05956 c_parser_consume_token (parser);
05957 return MINUS_EXPR;
05958 default:
05959 gcc_unreachable ();
05960 }
05961 }
05962
05963
05964
05965
05966
05967
05968
05969 static void
05970 c_parser_objc_method_definition (c_parser *parser)
05971 {
05972 enum tree_code type = c_parser_objc_method_type (parser);
05973 tree decl;
05974 objc_set_method_type (type);
05975 objc_pq_context = 1;
05976 decl = c_parser_objc_method_decl (parser);
05977 if (c_parser_next_token_is (parser, CPP_SEMICOLON))
05978 {
05979 c_parser_consume_token (parser);
05980 if (pedantic)
05981 pedwarn ("extra semicolon in method definition specified");
05982 }
05983 if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
05984 {
05985 c_parser_error (parser, "expected %<{%>");
05986 return;
05987 }
05988 objc_pq_context = 0;
05989 objc_start_method_definition (decl);
05990 add_stmt (c_parser_compound_statement (parser));
05991 objc_finish_method_definition (current_function_decl);
05992 }
05993
05994
05995
05996
05997
05998
05999
06000
06001
06002
06003
06004
06005
06006
06007
06008 static void
06009 c_parser_objc_methodprotolist (c_parser *parser)
06010 {
06011 while (true)
06012 {
06013
06014 switch (c_parser_peek_token (parser)->type)
06015 {
06016 case CPP_SEMICOLON:
06017 if (pedantic)
06018 pedwarn ("ISO C does not allow extra %<;%> outside of a function");
06019 c_parser_consume_token (parser);
06020 break;
06021 case CPP_PLUS:
06022 case CPP_MINUS:
06023 c_parser_objc_methodproto (parser);
06024 break;
06025 case CPP_PRAGMA:
06026 c_parser_pragma (parser, pragma_external);
06027 break;
06028 case CPP_EOF:
06029 return;
06030 default:
06031 if (c_parser_next_token_is_keyword (parser, RID_AT_END))
06032 return;
06033 c_parser_declaration_or_fndef (parser, false, true, false, true);
06034 break;
06035 }
06036 }
06037 }
06038
06039
06040
06041
06042
06043
06044
06045 static void
06046 c_parser_objc_methodproto (c_parser *parser)
06047 {
06048 enum tree_code type = c_parser_objc_method_type (parser);
06049 tree decl;
06050 objc_set_method_type (type);
06051
06052 objc_pq_context = 1;
06053 decl = c_parser_objc_method_decl (parser);
06054
06055 objc_pq_context = 0;
06056 objc_add_method_declaration (decl);
06057 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
06058 }
06059
06060
06061
06062
06063
06064
06065
06066
06067
06068
06069
06070
06071
06072
06073
06074
06075
06076
06077
06078
06079
06080
06081
06082
06083
06084
06085
06086
06087
06088
06089
06090 static tree
06091 c_parser_objc_method_decl (c_parser *parser)
06092 {
06093 tree type = NULL_TREE;
06094 tree sel;
06095 tree parms = NULL_TREE;
06096 bool ellipsis = false;
06097
06098 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
06099 {
06100 c_parser_consume_token (parser);
06101 type = c_parser_objc_type_name (parser);
06102 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
06103 }
06104 sel = c_parser_objc_selector (parser);
06105
06106
06107
06108 if (!sel || c_parser_next_token_is (parser, CPP_COLON))
06109 {
06110 tree tsel = sel;
06111 tree list = NULL_TREE;
06112 while (true)
06113 {
06114 tree atype = NULL_TREE, id, keyworddecl;
06115 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
06116 break;
06117 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
06118 {
06119 c_parser_consume_token (parser);
06120 atype = c_parser_objc_type_name (parser);
06121 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
06122 "expected %<)%>");
06123 }
06124 if (c_parser_next_token_is_not (parser, CPP_NAME))
06125 {
06126 c_parser_error (parser, "expected identifier");
06127 return error_mark_node;
06128 }
06129 id = c_parser_peek_token (parser)->value;
06130 c_parser_consume_token (parser);
06131 keyworddecl = objc_build_keyword_decl (tsel, atype, id);
06132 list = chainon (list, keyworddecl);
06133 tsel = c_parser_objc_selector (parser);
06134 if (!tsel && c_parser_next_token_is_not (parser, CPP_COLON))
06135 break;
06136 }
06137
06138
06139
06140 parms = make_node (TREE_LIST);
06141 while (c_parser_next_token_is (parser, CPP_COMMA))
06142 {
06143 struct c_parm *parm;
06144 c_parser_consume_token (parser);
06145 if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
06146 {
06147 ellipsis = true;
06148 c_parser_consume_token (parser);
06149 break;
06150 }
06151 parm = c_parser_parameter_declaration (parser, NULL_TREE);
06152 if (parm == NULL)
06153 break;
06154 parms = chainon (parms,
06155 build_tree_list (NULL_TREE, grokparm (parm)));
06156 }
06157 sel = list;
06158 }
06159 return objc_build_method_signature (type, sel, parms, ellipsis);
06160 }
06161
06162
06163
06164
06165
06166
06167
06168
06169
06170
06171
06172
06173
06174
06175
06176 static tree
06177 c_parser_objc_type_name (c_parser *parser)
06178 {
06179 tree quals = NULL_TREE;
06180 struct c_type_name *typename = NULL;
06181 tree type = NULL_TREE;
06182 while (true)
06183 {
06184 c_token *token = c_parser_peek_token (parser);
06185 if (token->type == CPP_KEYWORD
06186 && (token->keyword == RID_IN
06187 || token->keyword == RID_OUT
06188 || token->keyword == RID_INOUT
06189 || token->keyword == RID_BYCOPY
06190 || token->keyword == RID_BYREF
06191 || token->keyword == RID_ONEWAY))
06192 {
06193 quals = chainon (quals, build_tree_list (NULL_TREE, token->value));
06194 c_parser_consume_token (parser);
06195 }
06196 else
06197 break;
06198 }
06199 if (c_parser_next_token_starts_typename (parser))
06200 typename = c_parser_type_name (parser);
06201 if (typename)
06202 type = groktypename (typename);
06203 return build_tree_list (quals, type);
06204 }
06205
06206
06207
06208
06209
06210
06211
06212 static tree
06213 c_parser_objc_protocol_refs (c_parser *parser)
06214 {
06215 tree list = NULL_TREE;
06216 gcc_assert (c_parser_next_token_is (parser, CPP_LESS));
06217 c_parser_consume_token (parser);
06218
06219
06220 while (true)
06221 {
06222 tree id;
06223 if (c_parser_next_token_is_not (parser, CPP_NAME))
06224 {
06225 c_parser_error (parser, "expected identifier");
06226 break;
06227 }
06228 id = c_parser_peek_token (parser)->value;
06229 list = chainon (list, build_tree_list (NULL_TREE, id));
06230 c_parser_consume_token (parser);
06231 if (c_parser_next_token_is (parser, CPP_COMMA))
06232 c_parser_consume_token (parser);
06233 else
06234 break;
06235 }
06236 c_parser_require (parser, CPP_GREATER, "expected %<>%>");
06237 return list;
06238 }
06239
06240
06241
06242
06243
06244
06245
06246
06247
06248
06249
06250
06251 static void
06252 c_parser_objc_try_catch_statement (c_parser *parser)
06253 {
06254 location_t loc;
06255 tree stmt;
06256 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_TRY));
06257 c_parser_consume_token (parser);
06258 loc = c_parser_peek_token (parser)->location;
06259 stmt = c_parser_compound_statement (parser);
06260 objc_begin_try_stmt (loc, stmt);
06261 while (c_parser_next_token_is_keyword (parser, RID_AT_CATCH))
06262 {
06263 struct c_parm *parm;
06264 c_parser_consume_token (parser);
06265 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
06266 break;
06267 parm = c_parser_parameter_declaration (parser, NULL_TREE);
06268 if (parm == NULL)
06269 {
06270 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
06271 break;
06272 }
06273 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
06274 objc_begin_catch_clause (grokparm (parm));
06275 if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
06276 c_parser_compound_statement_nostart (parser);
06277 objc_finish_catch_clause ();
06278 }
06279 if (c_parser_next_token_is_keyword (parser, RID_AT_FINALLY))
06280 {
06281 location_t finloc;
06282 tree finstmt;
06283 c_parser_consume_token (parser);
06284 finloc = c_parser_peek_token (parser)->location;
06285 finstmt = c_parser_compound_statement (parser);
06286 objc_build_finally_clause (finloc, finstmt);
06287 }
06288 objc_finish_try_stmt ();
06289 }
06290
06291
06292
06293
06294
06295
06296
06297 static void
06298 c_parser_objc_synchronized_statement (c_parser *parser)
06299 {
06300 location_t loc;
06301 tree expr, stmt;
06302 gcc_assert (c_parser_next_token_is_keyword (parser, RID_AT_SYNCHRONIZED));
06303 c_parser_consume_token (parser);
06304 loc = c_parser_peek_token (parser)->location;
06305 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
06306 {
06307 expr = c_parser_expression (parser).value;
06308 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
06309 }
06310 else
06311 expr = error_mark_node;
06312 stmt = c_parser_compound_statement (parser);
06313 objc_build_synchronized (loc, expr, stmt);
06314 }
06315
06316
06317
06318
06319
06320
06321
06322
06323
06324
06325
06326
06327
06328
06329
06330 static tree
06331 c_parser_objc_selector (c_parser *parser)
06332 {
06333 c_token *token = c_parser_peek_token (parser);
06334 tree value = token->value;
06335 if (token->type == CPP_NAME)
06336 {
06337 c_parser_consume_token (parser);
06338 return value;
06339 }
06340 if (token->type != CPP_KEYWORD)
06341 return NULL_TREE;
06342 switch (token->keyword)
06343 {
06344 case RID_ENUM:
06345 case RID_STRUCT:
06346 case RID_UNION:
06347 case RID_IF:
06348 case RID_ELSE:
06349 case RID_WHILE:
06350 case RID_DO:
06351 case RID_FOR:
06352 case RID_SWITCH:
06353 case RID_CASE:
06354 case RID_DEFAULT:
06355 case RID_BREAK:
06356 case RID_CONTINUE:
06357 case RID_RETURN:
06358 case RID_GOTO:
06359 case RID_ASM:
06360 case RID_SIZEOF:
06361 case RID_TYPEOF:
06362 case RID_ALIGNOF:
06363 case RID_UNSIGNED:
06364 case RID_LONG:
06365 case RID_CONST:
06366 case RID_SHORT:
06367 case RID_VOLATILE:
06368 case RID_SIGNED:
06369 case RID_RESTRICT:
06370 case RID_COMPLEX:
06371 case RID_IN:
06372 case RID_OUT:
06373 case RID_INOUT:
06374 case RID_BYCOPY:
06375 case RID_BYREF:
06376 case RID_ONEWAY:
06377 case RID_INT:
06378 case RID_CHAR:
06379 case RID_FLOAT:
06380 case RID_DOUBLE:
06381 case RID_VOID:
06382 case RID_BOOL:
06383 c_parser_consume_token (parser);
06384 return value;
06385 default:
06386 return NULL_TREE;
06387 }
06388 }
06389
06390
06391
06392
06393
06394
06395
06396
06397
06398
06399
06400
06401
06402
06403
06404
06405 static tree
06406 c_parser_objc_selector_arg (c_parser *parser)
06407 {
06408 tree sel = c_parser_objc_selector (parser);
06409 tree list = NULL_TREE;
06410 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
06411 return sel;
06412 while (true)
06413 {
06414 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
06415 return list;
06416 list = chainon (list, build_tree_list (sel, NULL_TREE));
06417 sel = c_parser_objc_selector (parser);
06418 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
06419 break;
06420 }
06421 return list;
06422 }
06423
06424
06425
06426
06427
06428
06429
06430
06431
06432 static tree
06433 c_parser_objc_receiver (c_parser *parser)
06434 {
06435 if (c_parser_peek_token (parser)->type == CPP_NAME
06436 && (c_parser_peek_token (parser)->id_kind == C_ID_TYPENAME
06437 || c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
06438 {
06439 tree id = c_parser_peek_token (parser)->value;
06440 c_parser_consume_token (parser);
06441 return objc_get_class_reference (id);
06442 }
06443 return c_parser_expression (parser).value;
06444 }
06445
06446
06447
06448
06449
06450
06451
06452
06453
06454
06455
06456
06457
06458
06459
06460
06461 static tree
06462 c_parser_objc_message_args (c_parser *parser)
06463 {
06464 tree sel = c_parser_objc_selector (parser);
06465 tree list = NULL_TREE;
06466 if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
06467 return sel;
06468 while (true)
06469 {
06470 tree keywordexpr;
06471 if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
06472 return list;
06473 keywordexpr = c_parser_objc_keywordexpr (parser);
06474 list = chainon (list, build_tree_list (sel, keywordexpr));
06475 sel = c_parser_objc_selector (parser);
06476 if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
06477 break;
06478 }
06479 return list;
06480 }
06481
06482
06483
06484
06485
06486
06487
06488 static tree
06489 c_parser_objc_keywordexpr (c_parser *parser)
06490 {
06491 tree list = c_parser_expr_list (parser, true);
06492 if (TREE_CHAIN (list) == NULL_TREE)
06493 {
06494
06495
06496 return TREE_VALUE (list);
06497 }
06498 else
06499 {
06500
06501 return list;
06502 }
06503 }
06504
06505
06506
06507
06508
06509
06510
06511 static bool
06512 c_parser_pragma (c_parser *parser, enum pragma_context context)
06513 {
06514 unsigned int id;
06515
06516 id = c_parser_peek_token (parser)->pragma_kind;
06517 gcc_assert (id != PRAGMA_NONE);
06518
06519 switch (id)
06520 {
06521 case PRAGMA_OMP_BARRIER:
06522 if (context != pragma_compound)
06523 {
06524 if (context == pragma_stmt)
06525 c_parser_error (parser, "%<#pragma omp barrier%> may only be "
06526 "used in compound statements");
06527 goto bad_stmt;
06528 }
06529 c_parser_omp_barrier (parser);
06530 return false;
06531
06532 case PRAGMA_OMP_FLUSH:
06533 if (context != pragma_compound)
06534 {
06535 if (context == pragma_stmt)
06536 c_parser_error (parser, "%<#pragma omp flush%> may only be "
06537 "used in compound statements");
06538 goto bad_stmt;
06539 }
06540 c_parser_omp_flush (parser);
06541 return false;
06542
06543 case PRAGMA_OMP_THREADPRIVATE:
06544 c_parser_omp_threadprivate (parser);
06545 return false;
06546
06547 case PRAGMA_OMP_SECTION:
06548 error ("%<#pragma omp section%> may only be used in "
06549 "%<#pragma omp sections%> construct");
06550 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
06551 return false;
06552
06553 case PRAGMA_GCC_PCH_PREPROCESS:
06554 c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first");
06555 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
06556 return false;
06557
06558 default:
06559 if (id < PRAGMA_FIRST_EXTERNAL)
06560 {
06561 if (context == pragma_external)
06562 {
06563 bad_stmt:
06564 c_parser_error (parser, "expected declaration specifiers");
06565 c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
06566 return false;
06567 }
06568 c_parser_omp_construct (parser);
06569 return true;
06570 }
06571 break;
06572 }
06573
06574 c_parser_consume_pragma (parser);
06575 c_invoke_pragma_handler (id);
06576
06577
06578
06579
06580 parser->error = true;
06581 c_parser_skip_to_pragma_eol (parser);
06582
06583 return false;
06584 }
06585
06586
06587
06588 enum cpp_ttype
06589 pragma_lex (tree *value)
06590 {
06591 c_token *tok = c_parser_peek_token (the_parser);
06592 enum cpp_ttype ret = tok->type;
06593
06594 *value = tok->value;
06595 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
06596 ret = CPP_EOF;
06597 else
06598 {
06599 if (ret == CPP_KEYWORD)
06600 ret = CPP_NAME;
06601 c_parser_consume_token (the_parser);
06602 }
06603
06604 return ret;
06605 }
06606
06607 static void
06608 c_parser_pragma_pch_preprocess (c_parser *parser)
06609 {
06610 tree name = NULL;
06611
06612 c_parser_consume_pragma (parser);
06613 if (c_parser_next_token_is (parser, CPP_STRING))
06614 {
06615 name = c_parser_peek_token (parser)->value;
06616 c_parser_consume_token (parser);
06617 }
06618 else
06619 c_parser_error (parser, "expected string literal");
06620 c_parser_skip_to_pragma_eol (parser);
06621
06622 if (name)
06623 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
06624 }
06625
06626
06627
06628
06629
06630
06631
06632
06633 static pragma_omp_clause
06634 c_parser_omp_clause_name (c_parser *parser)
06635 {
06636 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
06637
06638 if (c_parser_next_token_is_keyword (parser, RID_IF))
06639 result = PRAGMA_OMP_CLAUSE_IF;
06640 else if (c_parser_next_token_is_keyword (parser, RID_DEFAULT))
06641 result = PRAGMA_OMP_CLAUSE_DEFAULT;
06642 else if (c_parser_next_token_is (parser, CPP_NAME))
06643 {
06644 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
06645
06646 switch (p[0])
06647 {
06648 case 'c':
06649 if (!strcmp ("copyin", p))
06650 result = PRAGMA_OMP_CLAUSE_COPYIN;
06651 else if (!strcmp ("copyprivate", p))
06652 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
06653 break;
06654 case 'f':
06655 if (!strcmp ("firstprivate", p))
06656 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
06657 break;
06658 case 'l':
06659 if (!strcmp ("lastprivate", p))
06660 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
06661 break;
06662 case 'n':
06663 if (!strcmp ("nowait", p))
06664 result = PRAGMA_OMP_CLAUSE_NOWAIT;
06665 else if (!strcmp ("num_threads", p))
06666 result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
06667 break;
06668 case 'o':
06669 if (!strcmp ("ordered", p))
06670 result = PRAGMA_OMP_CLAUSE_ORDERED;
06671 break;
06672 case 'p':
06673 if (!strcmp ("private", p))
06674 result = PRAGMA_OMP_CLAUSE_PRIVATE;
06675 break;
06676 case 'r':
06677 if (!strcmp ("reduction", p))
06678 result = PRAGMA_OMP_CLAUSE_REDUCTION;
06679 break;
06680 case 's':
06681 if (!strcmp ("schedule", p))
06682 result = PRAGMA_OMP_CLAUSE_SCHEDULE;
06683 else if (!strcmp ("shared", p))
06684 result = PRAGMA_OMP_CLAUSE_SHARED;
06685 break;
06686 }
06687 }
06688
06689 if (result != PRAGMA_OMP_CLAUSE_NONE)
06690 c_parser_consume_token (parser);
06691
06692 return result;
06693 }
06694
06695
06696
06697 static void
06698 check_no_duplicate_clause (tree clauses, enum tree_code code, const char *name)
06699 {
06700 tree c;
06701
06702 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
06703 if (OMP_CLAUSE_CODE (c) == code)
06704 {
06705 error ("too many %qs clauses", name);
06706 break;
06707 }
06708 }
06709
06710
06711
06712
06713
06714
06715
06716
06717
06718
06719
06720
06721 static tree
06722 c_parser_omp_variable_list (c_parser *parser, enum omp_clause_code kind,
06723 tree list)
06724 {
06725 if (c_parser_next_token_is_not (parser, CPP_NAME)
06726 || c_parser_peek_token (parser)->id_kind != C_ID_ID)
06727 c_parser_error (parser, "expected identifier");
06728
06729 while (c_parser_next_token_is (parser, CPP_NAME)
06730 && c_parser_peek_token (parser)->id_kind == C_ID_ID)
06731 {
06732 tree t = lookup_name (c_parser_peek_token (parser)->value);
06733
06734 if (t == NULL_TREE)
06735 undeclared_variable (c_parser_peek_token (parser)->value,
06736 c_parser_peek_token (parser)->location);
06737 else if (t == error_mark_node)
06738 ;
06739 else if (kind != 0)
06740 {
06741 tree u = build_omp_clause (kind);
06742 OMP_CLAUSE_DECL (u) = t;
06743 OMP_CLAUSE_CHAIN (u) = list;
06744 list = u;
06745 }
06746 else
06747 list = tree_cons (t, NULL_TREE, list);
06748
06749 c_parser_consume_token (parser);
06750
06751 if (c_parser_next_token_is_not (parser, CPP_COMMA))
06752 break;
06753
06754 c_parser_consume_token (parser);
06755 }
06756
06757 return list;
06758 }
06759
06760
06761
06762
06763 static tree
06764 c_parser_omp_var_list_parens (c_parser *parser, enum tree_code kind, tree list)
06765 {
06766 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
06767 {
06768 list = c_parser_omp_variable_list (parser, kind, list);
06769 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
06770 }
06771 return list;
06772 }
06773
06774
06775
06776
06777 static tree
06778 c_parser_omp_clause_copyin (c_parser *parser, tree list)
06779 {
06780 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYIN, list);
06781 }
06782
06783
06784
06785
06786 static tree
06787 c_parser_omp_clause_copyprivate (c_parser *parser, tree list)
06788 {
06789 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_COPYPRIVATE, list);
06790 }
06791
06792
06793
06794
06795 static tree
06796 c_parser_omp_clause_default (c_parser *parser, tree list)
06797 {
06798 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
06799 tree c;
06800
06801 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
06802 return list;
06803 if (c_parser_next_token_is (parser, CPP_NAME))
06804 {
06805 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
06806
06807 switch (p[0])
06808 {
06809 case 'n':
06810 if (strcmp ("none", p) != 0)
06811 goto invalid_kind;
06812 kind = OMP_CLAUSE_DEFAULT_NONE;
06813 break;
06814
06815 case 's':
06816 if (strcmp ("shared", p) != 0)
06817 goto invalid_kind;
06818 kind = OMP_CLAUSE_DEFAULT_SHARED;
06819 break;
06820
06821 default:
06822 goto invalid_kind;
06823 }
06824
06825 c_parser_consume_token (parser);
06826 }
06827 else
06828 {
06829 invalid_kind:
06830 c_parser_error (parser, "expected %<none%> or %<shared%>");
06831 }
06832 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
06833
06834 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
06835 return list;
06836
06837 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default");
06838 c = build_omp_clause (OMP_CLAUSE_DEFAULT);
06839 OMP_CLAUSE_CHAIN (c) = list;
06840 OMP_CLAUSE_DEFAULT_KIND (c) = kind;
06841
06842 return c;
06843 }
06844
06845
06846
06847
06848 static tree
06849 c_parser_omp_clause_firstprivate (c_parser *parser, tree list)
06850 {
06851 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_FIRSTPRIVATE, list);
06852 }
06853
06854
06855
06856
06857 static tree
06858 c_parser_omp_clause_if (c_parser *parser, tree list)
06859 {
06860 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
06861 {
06862 tree t = c_parser_paren_condition (parser);
06863 tree c;
06864
06865 check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if");
06866
06867 c = build_omp_clause (OMP_CLAUSE_IF);
06868 OMP_CLAUSE_IF_EXPR (c) = t;
06869 OMP_CLAUSE_CHAIN (c) = list;
06870 list = c;
06871 }
06872 else
06873 c_parser_error (parser, "expected %<(%>");
06874
06875 return list;
06876 }
06877
06878
06879
06880
06881 static tree
06882 c_parser_omp_clause_lastprivate (c_parser *parser, tree list)
06883 {
06884 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_LASTPRIVATE, list);
06885 }
06886
06887
06888
06889
06890 static tree
06891 c_parser_omp_clause_nowait (c_parser *parser ATTRIBUTE_UNUSED, tree list)
06892 {
06893 tree c;
06894
06895 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait");
06896
06897 c = build_omp_clause (OMP_CLAUSE_NOWAIT);
06898 OMP_CLAUSE_CHAIN (c) = list;
06899 return c;
06900 }
06901
06902
06903
06904
06905 static tree
06906 c_parser_omp_clause_num_threads (c_parser *parser, tree list)
06907 {
06908 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
06909 {
06910 tree c, t = c_parser_expression (parser).value;
06911
06912 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
06913
06914 if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
06915 {
06916 c_parser_error (parser, "expected integer expression");
06917 return list;
06918 }
06919
06920
06921 c = fold_build2 (LE_EXPR, boolean_type_node, t,
06922 build_int_cst (TREE_TYPE (t), 0));
06923 if (c == boolean_true_node)
06924 {
06925 warning (0, "%<num_threads%> value must be positive");
06926 t = integer_one_node;
06927 }
06928
06929 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS, "num_threads");
06930
06931 c = build_omp_clause (OMP_CLAUSE_NUM_THREADS);
06932 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
06933 OMP_CLAUSE_CHAIN (c) = list;
06934 list = c;
06935 }
06936
06937 return list;
06938 }
06939
06940
06941
06942
06943 static tree
06944 c_parser_omp_clause_ordered (c_parser *parser ATTRIBUTE_UNUSED, tree list)
06945 {
06946 tree c;
06947
06948 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED, "ordered");
06949
06950 c = build_omp_clause (OMP_CLAUSE_ORDERED);
06951 OMP_CLAUSE_CHAIN (c) = list;
06952 return c;
06953 }
06954
06955
06956
06957
06958 static tree
06959 c_parser_omp_clause_private (c_parser *parser, tree list)
06960 {
06961 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_PRIVATE, list);
06962 }
06963
06964
06965
06966
06967
06968
06969
06970 static tree
06971 c_parser_omp_clause_reduction (c_parser *parser, tree list)
06972 {
06973 if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
06974 {
06975 enum tree_code code;
06976
06977 switch (c_parser_peek_token (parser)->type)
06978 {
06979 case CPP_PLUS:
06980 code = PLUS_EXPR;
06981 break;
06982 case CPP_MULT:
06983 code = MULT_EXPR;
06984 break;
06985 case CPP_MINUS:
06986 code = MINUS_EXPR;
06987 break;
06988 case CPP_AND:
06989 code = BIT_AND_EXPR;
06990 break;
06991 case CPP_XOR:
06992 code = BIT_XOR_EXPR;
06993 break;
06994 case CPP_OR:
06995 code = BIT_IOR_EXPR;
06996 break;
06997 case CPP_AND_AND:
06998 code = TRUTH_ANDIF_EXPR;
06999 break;
07000 case CPP_OR_OR:
07001 code = TRUTH_ORIF_EXPR;
07002 break;
07003 default:
07004 c_parser_error (parser,
07005 "expected %<+%>, %<*%>, %<-%>, %<&%>, "
07006 "%<^%>, %<|%>, %<&&%>, or %<||%>");
07007 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
07008 return list;
07009 }
07010 c_parser_consume_token (parser);
07011 if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
07012 {
07013 tree nl, c;
07014
07015 nl = c_parser_omp_variable_list (parser, OMP_CLAUSE_REDUCTION, list);
07016 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
07017 OMP_CLAUSE_REDUCTION_CODE (c) = code;
07018
07019 list = nl;
07020 }
07021 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
07022 }
07023 return list;
07024 }
07025
07026
07027
07028
07029
07030
07031
07032
07033
07034 static tree
07035 c_parser_omp_clause_schedule (c_parser *parser, tree list)
07036 {
07037 tree c, t;
07038
07039 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
07040 return list;
07041
07042 c = build_omp_clause (OMP_CLAUSE_SCHEDULE);
07043
07044 if (c_parser_next_token_is (parser, CPP_NAME))
07045 {
07046 tree kind = c_parser_peek_token (parser)->value;
07047 const char *p = IDENTIFIER_POINTER (kind);
07048
07049 switch (p[0])
07050 {
07051 case 'd':
07052 if (strcmp ("dynamic", p) != 0)
07053 goto invalid_kind;
07054 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
07055 break;
07056
07057 case 'g':
07058 if (strcmp ("guided", p) != 0)
07059 goto invalid_kind;
07060 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
07061 break;
07062
07063 case 'r':
07064 if (strcmp ("runtime", p) != 0)
07065 goto invalid_kind;
07066 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
07067 break;
07068
07069 default:
07070 goto invalid_kind;
07071 }
07072 }
07073 else if (c_parser_next_token_is_keyword (parser, RID_STATIC))
07074 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
07075 else
07076 goto invalid_kind;
07077
07078 c_parser_consume_token (parser);
07079 if (c_parser_next_token_is (parser, CPP_COMMA))
07080 {
07081 c_parser_consume_token (parser);
07082
07083 t = c_parser_expr_no_commas (parser, NULL).value;
07084
07085 if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
07086 error ("schedule %<runtime%> does not take "
07087 "a %<chunk_size%> parameter");
07088 else if (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE)
07089 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
07090 else
07091 c_parser_error (parser, "expected integer expression");
07092
07093 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
07094 }
07095 else
07096 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
07097 "expected %<,%> or %<)%>");
07098
07099 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule");
07100 OMP_CLAUSE_CHAIN (c) = list;
07101 return c;
07102
07103 invalid_kind:
07104 c_parser_error (parser, "invalid schedule kind");
07105 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
07106 return list;
07107 }
07108
07109
07110
07111
07112 static tree
07113 c_parser_omp_clause_shared (c_parser *parser, tree list)
07114 {
07115 return c_parser_omp_var_list_parens (parser, OMP_CLAUSE_SHARED, list);
07116 }
07117
07118
07119
07120
07121
07122 static tree
07123 c_parser_omp_all_clauses (c_parser *parser, unsigned int mask,
07124 const char *where)
07125 {
07126 tree clauses = NULL;
07127
07128 while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
07129 {
07130 const pragma_omp_clause c_kind = c_parser_omp_clause_name (parser);
07131 const char *c_name;
07132 tree prev = clauses;
07133
07134 switch (c_kind)
07135 {
07136 case PRAGMA_OMP_CLAUSE_COPYIN:
07137 clauses = c_parser_omp_clause_copyin (parser, clauses);
07138 c_name = "copyin";
07139 break;
07140 case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
07141 clauses = c_parser_omp_clause_copyprivate (parser, clauses);
07142 c_name = "copyprivate";
07143 break;
07144 case PRAGMA_OMP_CLAUSE_DEFAULT:
07145 clauses = c_parser_omp_clause_default (parser, clauses);
07146 c_name = "default";
07147 break;
07148 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
07149 clauses = c_parser_omp_clause_firstprivate (parser, clauses);
07150 c_name = "firstprivate";
07151 break;
07152 case PRAGMA_OMP_CLAUSE_IF:
07153 clauses = c_parser_omp_clause_if (parser, clauses);
07154 c_name = "if";
07155 break;
07156 case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
07157 clauses = c_parser_omp_clause_lastprivate (parser, clauses);
07158 c_name = "lastprivate";
07159 break;
07160 case PRAGMA_OMP_CLAUSE_NOWAIT:
07161 clauses = c_parser_omp_clause_nowait (parser, clauses);
07162 c_name = "nowait";
07163 break;
07164 case PRAGMA_OMP_CLAUSE_NUM_THREADS:
07165 clauses = c_parser_omp_clause_num_threads (parser, clauses);
07166 c_name = "num_threads";
07167 break;
07168 case PRAGMA_OMP_CLAUSE_ORDERED:
07169 clauses = c_parser_omp_clause_ordered (parser, clauses);
07170 c_name = "ordered";
07171 break;
07172 case PRAGMA_OMP_CLAUSE_PRIVATE:
07173 clauses = c_parser_omp_clause_private (parser, clauses);
07174 c_name = "private";
07175 break;
07176 case PRAGMA_OMP_CLAUSE_REDUCTION:
07177 clauses = c_parser_omp_clause_reduction (parser, clauses);
07178 c_name = "reduction";
07179 break;
07180 case PRAGMA_OMP_CLAUSE_SCHEDULE:
07181 clauses = c_parser_omp_clause_schedule (parser, clauses);
07182 c_name = "schedule";
07183 break;
07184 case PRAGMA_OMP_CLAUSE_SHARED:
07185 clauses = c_parser_omp_clause_shared (parser, clauses);
07186 c_name = "shared";
07187 break;
07188 default:
07189 c_parser_error (parser, "expected %<#pragma omp%> clause");
07190 goto saw_error;
07191 }
07192
07193 if (((mask >> c_kind) & 1) == 0 && !parser->error)
07194 {
07195
07196
07197 clauses = prev;
07198 error ("%qs is not valid for %qs", c_name, where);
07199 }
07200 }
07201
07202 saw_error:
07203 c_parser_skip_to_pragma_eol (parser);
07204
07205 return c_finish_omp_clauses (clauses);
07206 }
07207
07208
07209
07210
07211
07212
07213
07214
07215
07216 static tree
07217 c_parser_omp_structured_block (c_parser *parser)
07218 {
07219 tree stmt = push_stmt_list ();
07220 c_parser_statement (parser);
07221 return pop_stmt_list (stmt);
07222 }
07223
07224
07225
07226
07227
07228
07229
07230
07231
07232
07233
07234
07235 static void
07236 c_parser_omp_atomic (c_parser *parser)
07237 {
07238 tree lhs, rhs;
07239 tree stmt;
07240 enum tree_code code;
07241
07242 c_parser_skip_to_pragma_eol (parser);
07243
07244 lhs = c_parser_unary_expression (parser).value;
07245 switch (TREE_CODE (lhs))
07246 {
07247 case ERROR_MARK:
07248 saw_error:
07249 c_parser_skip_to_end_of_block_or_statement (parser);
07250 return;
07251
07252 case PREINCREMENT_EXPR:
07253 case POSTINCREMENT_EXPR:
07254 lhs = TREE_OPERAND (lhs, 0);
07255 code = PLUS_EXPR;
07256 rhs = integer_one_node;
07257 break;
07258
07259 case PREDECREMENT_EXPR:
07260 case POSTDECREMENT_EXPR:
07261 lhs = TREE_OPERAND (lhs, 0);
07262 code = MINUS_EXPR;
07263 rhs = integer_one_node;
07264 break;
07265
07266 default:
07267 switch (c_parser_peek_token (parser)->type)
07268 {
07269 case CPP_MULT_EQ:
07270 code = MULT_EXPR;
07271 break;
07272 case CPP_DIV_EQ:
07273 code = TRUNC_DIV_EXPR;
07274 break;
07275 case CPP_PLUS_EQ:
07276 code = PLUS_EXPR;
07277 break;
07278 case CPP_MINUS_EQ:
07279 code = MINUS_EXPR;
07280 break;
07281 case CPP_LSHIFT_EQ:
07282 code = LSHIFT_EXPR;
07283 break;
07284 case CPP_RSHIFT_EQ:
07285 code = RSHIFT_EXPR;
07286 break;
07287 case CPP_AND_EQ:
07288 code = BIT_AND_EXPR;
07289 break;
07290 case CPP_OR_EQ:
07291 code = BIT_IOR_EXPR;
07292 break;
07293 case CPP_XOR_EQ:
07294 code = BIT_XOR_EXPR;
07295 break;
07296 default:
07297 c_parser_error (parser,
07298 "invalid operator for %<#pragma omp atomic%>");
07299 goto saw_error;
07300 }
07301
07302 c_parser_consume_token (parser);
07303 rhs = c_parser_expression (parser).value;
07304 break;
07305 }
07306 stmt = c_finish_omp_atomic (code, lhs, rhs);
07307 if (stmt != error_mark_node)
07308 add_stmt (stmt);
07309 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
07310 }
07311
07312
07313
07314
07315
07316
07317 static void
07318 c_parser_omp_barrier (c_parser *parser)
07319 {
07320 c_parser_consume_pragma (parser);
07321 c_parser_skip_to_pragma_eol (parser);
07322
07323 c_finish_omp_barrier ();
07324 }
07325
07326
07327
07328
07329
07330
07331 static tree
07332 c_parser_omp_critical (c_parser *parser)
07333 {
07334 tree stmt, name = NULL;
07335
07336 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
07337 {
07338 c_parser_consume_token (parser);
07339 if (c_parser_next_token_is (parser, CPP_NAME))
07340 {
07341 name = c_parser_peek_token (parser)->value;
07342 c_parser_consume_token (parser);
07343 c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
07344 }
07345 else
07346 c_parser_error (parser, "expected identifier");
07347 }
07348 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
07349 c_parser_error (parser, "expected %<(%> or end of line");
07350 c_parser_skip_to_pragma_eol (parser);
07351
07352 stmt = c_parser_omp_structured_block (parser);
07353 return c_finish_omp_critical (stmt, name);
07354 }
07355
07356
07357
07358
07359
07360
07361
07362 static void
07363 c_parser_omp_flush (c_parser *parser)
07364 {
07365 c_parser_consume_pragma (parser);
07366 if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
07367 c_parser_omp_var_list_parens (parser, 0, NULL);
07368 else if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
07369 c_parser_error (parser, "expected %<(%> or end of line");
07370 c_parser_skip_to_pragma_eol (parser);
07371
07372 c_finish_omp_flush ();
07373 }
07374
07375
07376
07377
07378
07379 static tree
07380 c_parser_omp_for_loop (c_parser *parser)
07381 {
07382 tree decl, cond, incr, save_break, save_cont, body, init;
07383 location_t loc;
07384
07385 if (!c_parser_next_token_is_keyword (parser, RID_FOR))
07386 {
07387 c_parser_error (parser, "for statement expected");
07388 return NULL;
07389 }
07390 loc = c_parser_peek_token (parser)->location;
07391 c_parser_consume_token (parser);
07392
07393 if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
07394 return NULL;
07395
07396
07397 if (c_parser_next_token_starts_declspecs (parser))
07398 {
07399 c_parser_declaration_or_fndef (parser, true, true, true, true);
07400 decl = check_for_loop_decls ();
07401 if (decl == NULL)
07402 goto error_init;
07403 init = decl;
07404 }
07405 else if (c_parser_next_token_is (parser, CPP_NAME)
07406 && c_parser_peek_2nd_token (parser)->type == CPP_EQ)
07407 {
07408 decl = c_parser_postfix_expression (parser).value;
07409
07410 c_parser_require (parser, CPP_EQ, "expected %<=%>");
07411
07412 init = c_parser_expr_no_commas (parser, NULL).value;
07413 init = build_modify_expr (decl, NOP_EXPR, init);
07414 init = c_process_expr_stmt (init);
07415
07416 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
07417 }
07418 else
07419 goto error_init;
07420
07421
07422 cond = NULL_TREE;
07423 if (c_parser_next_token_is_not (parser, CPP_SEMICOLON))
07424 {
07425 cond = c_parser_expression_conv (parser).value;
07426 cond = c_objc_common_truthvalue_conversion (cond);
07427 if (EXPR_P (cond))
07428 SET_EXPR_LOCATION (cond, input_location);
07429 }
07430 c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
07431
07432
07433 incr = NULL_TREE;
07434 if (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
07435 incr = c_process_expr_stmt (c_parser_expression (parser).value);
07436 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
07437
07438 parse_body:
07439 save_break = c_break_label;
07440 c_break_label = size_one_node;
07441 save_cont = c_cont_label;
07442 c_cont_label = NULL_TREE;
07443 body = push_stmt_list ();
07444
07445 add_stmt (c_parser_c99_block_statement (parser));
07446 if (c_cont_label)
07447 add_stmt (build1 (LABEL_EXPR, void_type_node, c_cont_label));
07448
07449 body = pop_stmt_list (body);
07450 c_break_label = save_break;
07451 c_cont_label = save_cont;
07452
07453
07454
07455 if (decl != NULL && decl != error_mark_node && init != error_mark_node)
07456 return c_finish_omp_for (loc, decl, init, cond, incr, body, NULL);
07457 return NULL;
07458
07459 error_init:
07460 c_parser_error (parser, "expected iteration declaration or initialization");
07461 c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
07462 decl = init = cond = incr = NULL_TREE;
07463 goto parse_body;
07464 }
07465
07466
07467
07468
07469
07470
07471 #define OMP_FOR_CLAUSE_MASK \
07472 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
07473 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
07474 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
07475 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
07476 | (1u << PRAGMA_OMP_CLAUSE_ORDERED) \
07477 | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE) \
07478 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
07479
07480 static tree
07481 c_parser_omp_for (c_parser *parser)
07482 {
07483 tree block, clauses, ret;
07484
07485 clauses = c_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
07486 "#pragma omp for");
07487
07488 block = c_begin_compound_stmt (true);
07489 ret = c_parser_omp_for_loop (parser);
07490 if (ret)
07491 OMP_FOR_CLAUSES (ret) = clauses;
07492 block = c_end_compound_stmt (block, true);
07493 add_stmt (block);
07494
07495 return ret;
07496 }
07497
07498
07499
07500
07501
07502
07503 static tree
07504 c_parser_omp_master (c_parser *parser)
07505 {
07506 c_parser_skip_to_pragma_eol (parser);
07507 return c_finish_omp_master (c_parser_omp_structured_block (parser));
07508 }
07509
07510
07511
07512
07513
07514
07515 static tree
07516 c_parser_omp_ordered (c_parser *parser)
07517 {
07518 c_parser_skip_to_pragma_eol (parser);
07519 return c_finish_omp_ordered (c_parser_omp_structured_block (parser));
07520 }
07521
07522
07523
07524
07525
07526
07527
07528
07529
07530
07531 static tree
07532 c_parser_omp_sections_scope (c_parser *parser)
07533 {
07534 tree stmt, substmt;
07535 bool error_suppress = false;
07536 location_t loc;
07537
07538 if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
07539 {
07540
07541 parser->error = false;
07542 return NULL_TREE;
07543 }
07544
07545 stmt = push_stmt_list ();
07546
07547 loc = c_parser_peek_token (parser)->location;
07548 if (c_parser_peek_token (parser)->pragma_kind != PRAGMA_OMP_SECTION)
07549 {
07550 substmt = push_stmt_list ();
07551
07552 while (1)
07553 {
07554 c_parser_statement (parser);
07555
07556 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
07557 break;
07558 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
07559 break;
07560 if (c_parser_next_token_is (parser, CPP_EOF))
07561 break;
07562 }
07563
07564 substmt = pop_stmt_list (substmt);
07565 substmt = build1 (OMP_SECTION, void_type_node, substmt);
07566 SET_EXPR_LOCATION (substmt, loc);
07567 add_stmt (substmt);
07568 }
07569
07570 while (1)
07571 {
07572 if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
07573 break;
07574 if (c_parser_next_token_is (parser, CPP_EOF))
07575 break;
07576
07577 loc = c_parser_peek_token (parser)->location;
07578 if (c_parser_peek_token (parser)->pragma_kind == PRAGMA_OMP_SECTION)
07579 {
07580 c_parser_consume_pragma (parser);
07581 c_parser_skip_to_pragma_eol (parser);
07582 error_suppress = false;
07583 }
07584 else if (!error_suppress)
07585 {
07586 error ("expected %<#pragma omp section%> or %<}%>");
07587 error_suppress = true;
07588 }
07589
07590 substmt = c_parser_omp_structured_block (parser);
07591 substmt = build1 (OMP_SECTION, void_type_node, substmt);
07592 SET_EXPR_LOCATION (substmt, loc);
07593 add_stmt (substmt);
07594 }
07595 c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
07596 "expected %<#pragma omp section%> or %<}%>");
07597
07598 substmt = pop_stmt_list (stmt);
07599
07600 stmt = make_node (OMP_SECTIONS);
07601 TREE_TYPE (stmt) = void_type_node;
07602 OMP_SECTIONS_BODY (stmt) = substmt;
07603
07604 return add_stmt (stmt);
07605 }
07606
07607
07608
07609
07610
07611
07612 #define OMP_SECTIONS_CLAUSE_MASK \
07613 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
07614 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
07615 | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
07616 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
07617 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
07618
07619 static tree
07620 c_parser_omp_sections (c_parser *parser)
07621 {
07622 tree block, clauses, ret;
07623
07624 clauses = c_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
07625 "#pragma omp sections");
07626
07627 block = c_begin_compound_stmt (true);
07628 ret = c_parser_omp_sections_scope (parser);
07629 if (ret)
07630 OMP_SECTIONS_CLAUSES (ret) = clauses;
07631 block = c_end_compound_stmt (block, true);
07632 add_stmt (block);
07633
07634 return ret;
07635 }
07636
07637
07638
07639
07640
07641
07642
07643 #define OMP_PARALLEL_CLAUSE_MASK \
07644 ( (1u << PRAGMA_OMP_CLAUSE_IF) \
07645 | (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
07646 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
07647 | (1u << PRAGMA_OMP_CLAUSE_DEFAULT) \
07648 | (1u << PRAGMA_OMP_CLAUSE_SHARED) \
07649 | (1u << PRAGMA_OMP_CLAUSE_COPYIN) \
07650 | (1u << PRAGMA_OMP_CLAUSE_REDUCTION) \
07651 | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
07652
07653 static tree
07654 c_parser_omp_parallel (c_parser *parser)
07655 {
07656 enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
07657 const char *p_name = "#pragma omp parallel";
07658 tree stmt, clauses, par_clause, ws_clause, block;
07659 unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
07660
07661 if (c_parser_next_token_is_keyword (parser, RID_FOR))
07662 {
07663 c_parser_consume_token (parser);
07664 p_kind = PRAGMA_OMP_PARALLEL_FOR;
07665 p_name = "#pragma omp parallel for";
07666 mask |= OMP_FOR_CLAUSE_MASK;
07667 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
07668 }
07669 else if (c_parser_next_token_is (parser, CPP_NAME))
07670 {
07671 const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
07672 if (strcmp (p, "sections") == 0)
07673 {
07674 c_parser_consume_token (parser);
07675 p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
07676 p_name = "#pragma omp parallel sections";
07677 mask |= OMP_SECTIONS_CLAUSE_MASK;
07678 mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
07679 }
07680 }
07681
07682 clauses = c_parser_omp_all_clauses (parser, mask, p_name);
07683
07684 switch (p_kind)
07685 {
07686 case PRAGMA_OMP_PARALLEL:
07687 block = c_begin_omp_parallel ();
07688 c_parser_statement (parser);
07689 stmt = c_finish_omp_parallel (clauses, block);
07690 break;
07691
07692 case PRAGMA_OMP_PARALLEL_FOR:
07693 block = c_begin_omp_parallel ();
07694 c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
07695 stmt = c_parser_omp_for_loop (parser);
07696 if (stmt)
07697 OMP_FOR_CLAUSES (stmt) = ws_clause;
07698 stmt = c_finish_omp_parallel (par_clause, block);
07699 OMP_PARALLEL_COMBINED (stmt) = 1;
07700 break;
07701
07702 case PRAGMA_OMP_PARALLEL_SECTIONS:
07703 block = c_begin_omp_parallel ();
07704 c_split_parallel_clauses (clauses, &par_clause, &ws_clause);
07705 stmt = c_parser_omp_sections_scope (parser);
07706 if (stmt)
07707 OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
07708 stmt = c_finish_omp_parallel (par_clause, block);
07709 OMP_PARALLEL_COMBINED (stmt) = 1;
07710 break;
07711
07712 default:
07713 gcc_unreachable ();
07714 }
07715
07716 return stmt;
07717 }
07718
07719
07720
07721
07722
07723
07724 #define OMP_SINGLE_CLAUSE_MASK \
07725 ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE) \
07726 | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
07727 | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \
07728 | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
07729
07730 static tree
07731 c_parser_omp_single (c_parser *parser)
07732 {
07733 tree stmt = make_node (OMP_SINGLE);
07734 TREE_TYPE (stmt) = void_type_node;
07735
07736 OMP_SINGLE_CLAUSES (stmt)
07737 = c_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
07738 "#pragma omp single");
07739 OMP_SINGLE_BODY (stmt) = c_parser_omp_structured_block (parser);
07740
07741 return add_stmt (stmt);
07742 }
07743
07744
07745
07746
07747 static void
07748 c_parser_omp_construct (c_parser *parser)
07749 {
07750 enum pragma_kind p_kind;
07751 location_t loc;
07752 tree stmt;
07753
07754 loc = c_parser_peek_token (parser)->location;
07755 p_kind = c_parser_peek_token (parser)->pragma_kind;
07756 c_parser_consume_pragma (parser);
07757
07758
07759
07760
07761 if (p_kind != PRAGMA_OMP_ATOMIC)
07762 c_maybe_initialize_eh ();
07763
07764 switch (p_kind)
07765 {
07766 case PRAGMA_OMP_ATOMIC:
07767 c_parser_omp_atomic (parser);
07768 return;
07769 case PRAGMA_OMP_CRITICAL:
07770 stmt = c_parser_omp_critical (parser);
07771 break;
07772 case PRAGMA_OMP_FOR:
07773 stmt = c_parser_omp_for (parser);
07774 break;
07775 case PRAGMA_OMP_MASTER:
07776 stmt = c_parser_omp_master (parser);
07777 break;
07778 case PRAGMA_OMP_ORDERED:
07779 stmt = c_parser_omp_ordered (parser);
07780 break;
07781 case PRAGMA_OMP_PARALLEL:
07782 stmt = c_parser_omp_parallel (parser);
07783 break;
07784 case PRAGMA_OMP_SECTIONS:
07785 stmt = c_parser_omp_sections (parser);
07786 break;
07787 case PRAGMA_OMP_SINGLE:
07788 stmt = c_parser_omp_single (parser);
07789 break;
07790 default:
07791 gcc_unreachable ();
07792 }
07793
07794 if (stmt)
07795 SET_EXPR_LOCATION (stmt, loc);
07796 }
07797
07798
07799
07800
07801
07802 static void
07803 c_parser_omp_threadprivate (c_parser *parser)
07804 {
07805 tree vars, t;
07806
07807 c_parser_consume_pragma (parser);
07808 vars = c_parser_omp_var_list_parens (parser, 0, NULL);
07809
07810 if (!targetm.have_tls)
07811 sorry ("threadprivate variables not supported in this target");
07812
07813
07814 for (t = vars; t; t = TREE_CHAIN (t))
07815 {
07816 tree v = TREE_PURPOSE (t);
07817
07818
07819
07820 if (TREE_USED (v) && !C_DECL_THREADPRIVATE_P (v))
07821 error ("%qE declared %<threadprivate%> after first use", v);
07822 else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
07823 error ("automatic variable %qE cannot be %<threadprivate%>", v);
07824 else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
07825 error ("%<threadprivate%> %qE has incomplete type", v);
07826 else
07827 {
07828 if (! DECL_THREAD_LOCAL_P (v))
07829 {
07830 DECL_TLS_MODEL (v) = decl_default_tls_model (v);
07831
07832
07833
07834 if (DECL_RTL_SET_P (v))
07835 make_decl_rtl (v);
07836 }
07837 C_DECL_THREADPRIVATE_P (v) = 1;
07838 }
07839 }
07840
07841 c_parser_skip_to_pragma_eol (parser);
07842 }
07843
07844
07845
07846
07847 void
07848 c_parse_file (void)
07849 {
07850
07851
07852
07853 c_parser tparser;
07854
07855 memset (&tparser, 0, sizeof tparser);
07856 the_parser = &tparser;
07857
07858 if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS)
07859 c_parser_pragma_pch_preprocess (&tparser);
07860
07861 the_parser = GGC_NEW (c_parser);
07862 *the_parser = tparser;
07863
07864 c_parser_translation_unit (the_parser);
07865 the_parser = NULL;
07866 }
07867
07868 #include "gt-c-parser.h"