00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024 #include "system.h"
00025 #include "coretypes.h"
00026 #include "tm.h"
00027 #include "dyn-string.h"
00028 #include "varray.h"
00029 #include "cpplib.h"
00030 #include "tree.h"
00031 #include "cp-tree.h"
00032 #include "c-pragma.h"
00033 #include "decl.h"
00034 #include "flags.h"
00035 #include "diagnostic.h"
00036 #include "toplev.h"
00037 #include "output.h"
00038 #include "target.h"
00039 #include "cgraph.h"
00040 #include "c-common.h"
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 struct tree_check GTY(())
00052 {
00053
00054 tree value;
00055
00056 VEC (deferred_access_check, gc)* checks;
00057
00058
00059 tree qualifying_scope;
00060 };
00061
00062
00063
00064 typedef struct cp_token GTY (())
00065 {
00066
00067 ENUM_BITFIELD (cpp_ttype) type : 8;
00068
00069
00070 ENUM_BITFIELD (rid) keyword : 8;
00071
00072 unsigned char flags;
00073
00074 ENUM_BITFIELD (pragma_kind) pragma_kind : 6;
00075
00076 BOOL_BITFIELD in_system_header : 1;
00077
00078 BOOL_BITFIELD implicit_extern_c : 1;
00079
00080
00081
00082 BOOL_BITFIELD ambiguous_p : 1;
00083
00084 unsigned input_file_stack_index : INPUT_FILE_STACK_BITS;
00085
00086 union cp_token_value {
00087
00088 struct tree_check* GTY((tag ("1"))) tree_check_value;
00089
00090 tree GTY((tag ("0"))) value;
00091 } GTY((desc ("(%1.type == CPP_TEMPLATE_ID) || (%1.type == CPP_NESTED_NAME_SPECIFIER)"))) u;
00092
00093 location_t location;
00094 } cp_token;
00095
00096
00097 typedef struct cp_token *cp_token_position;
00098 DEF_VEC_P (cp_token_position);
00099 DEF_VEC_ALLOC_P (cp_token_position,heap);
00100
00101 static const cp_token eof_token =
00102 {
00103 CPP_EOF, RID_MAX, 0, PRAGMA_NONE, 0, 0, false, 0, { NULL },
00104 #if USE_MAPPED_LOCATION
00105 0
00106 #else
00107 {0, 0}
00108 #endif
00109 };
00110
00111
00112
00113
00114
00115
00116 typedef struct cp_lexer GTY (())
00117 {
00118
00119
00120 cp_token * GTY ((length ("%h.buffer_length"))) buffer;
00121
00122
00123 size_t buffer_length;
00124
00125
00126
00127 cp_token_position GTY ((skip)) last_token;
00128
00129
00130
00131 cp_token_position GTY ((skip)) next_token;
00132
00133
00134
00135
00136
00137 VEC(cp_token_position,heap) *GTY ((skip)) saved_tokens;
00138
00139
00140 struct cp_lexer *next;
00141
00142
00143 bool debugging_p;
00144
00145
00146
00147 bool in_pragma;
00148 } cp_lexer;
00149
00150
00151
00152
00153
00154
00155
00156 typedef struct cp_token_cache GTY(())
00157 {
00158
00159 cp_token * GTY((skip)) first;
00160
00161
00162 cp_token * GTY ((skip)) last;
00163 } cp_token_cache;
00164
00165
00166
00167 static cp_lexer *cp_lexer_new_main
00168 (void);
00169 static cp_lexer *cp_lexer_new_from_tokens
00170 (cp_token_cache *tokens);
00171 static void cp_lexer_destroy
00172 (cp_lexer *);
00173 static int cp_lexer_saving_tokens
00174 (const cp_lexer *);
00175 static cp_token_position cp_lexer_token_position
00176 (cp_lexer *, bool);
00177 static cp_token *cp_lexer_token_at
00178 (cp_lexer *, cp_token_position);
00179 static void cp_lexer_get_preprocessor_token
00180 (cp_lexer *, cp_token *);
00181 static inline cp_token *cp_lexer_peek_token
00182 (cp_lexer *);
00183 static cp_token *cp_lexer_peek_nth_token
00184 (cp_lexer *, size_t);
00185 static inline bool cp_lexer_next_token_is
00186 (cp_lexer *, enum cpp_ttype);
00187 static bool cp_lexer_next_token_is_not
00188 (cp_lexer *, enum cpp_ttype);
00189 static bool cp_lexer_next_token_is_keyword
00190 (cp_lexer *, enum rid);
00191 static cp_token *cp_lexer_consume_token
00192 (cp_lexer *);
00193 static void cp_lexer_purge_token
00194 (cp_lexer *);
00195 static void cp_lexer_purge_tokens_after
00196 (cp_lexer *, cp_token_position);
00197 static void cp_lexer_save_tokens
00198 (cp_lexer *);
00199 static void cp_lexer_commit_tokens
00200 (cp_lexer *);
00201 static void cp_lexer_rollback_tokens
00202 (cp_lexer *);
00203 #ifdef ENABLE_CHECKING
00204 static void cp_lexer_print_token
00205 (FILE *, cp_token *);
00206 static inline bool cp_lexer_debugging_p
00207 (cp_lexer *);
00208 static void cp_lexer_start_debugging
00209 (cp_lexer *) ATTRIBUTE_UNUSED;
00210 static void cp_lexer_stop_debugging
00211 (cp_lexer *) ATTRIBUTE_UNUSED;
00212 #else
00213
00214
00215
00216
00217 #define cp_lexer_debug_stream stdout
00218 #define cp_lexer_print_token(str, tok) (void) 0
00219 #define cp_lexer_debugging_p(lexer) 0
00220 #endif
00221
00222 static cp_token_cache *cp_token_cache_new
00223 (cp_token *, cp_token *);
00224
00225 static void cp_parser_initial_pragma
00226 (cp_token *);
00227
00228
00229 #define CP_LEXER_BUFFER_SIZE ((256 * 1024) / sizeof (cp_token))
00230 #define CP_SAVED_TOKEN_STACK 5
00231
00232
00233 #define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
00234
00235
00236
00237
00238
00239 #define CPP_TEMPLATE_ID ((enum cpp_ttype) (CPP_KEYWORD + 1))
00240
00241
00242
00243
00244
00245
00246 #define CPP_NESTED_NAME_SPECIFIER ((enum cpp_ttype) (CPP_TEMPLATE_ID + 1))
00247
00248
00249
00250
00251 #define CPP_PURGED ((enum cpp_ttype) (CPP_NESTED_NAME_SPECIFIER + 1))
00252
00253
00254 #define N_CP_TTYPES ((int) (CPP_PURGED + 1))
00255
00256
00257
00258 #ifdef ENABLE_CHECKING
00259
00260 static FILE *cp_lexer_debug_stream;
00261 #endif
00262
00263
00264
00265
00266 static cp_lexer *
00267 cp_lexer_new_main (void)
00268 {
00269 cp_token first_token;
00270 cp_lexer *lexer;
00271 cp_token *pos;
00272 size_t alloc;
00273 size_t space;
00274 cp_token *buffer;
00275
00276
00277
00278
00279 cp_parser_initial_pragma (&first_token);
00280
00281
00282 c_lex_return_raw_strings = true;
00283
00284 c_common_no_more_pch ();
00285
00286
00287 lexer = GGC_CNEW (cp_lexer);
00288
00289 #ifdef ENABLE_CHECKING
00290
00291 lexer->debugging_p = false;
00292 #endif
00293 lexer->saved_tokens = VEC_alloc (cp_token_position, heap,
00294 CP_SAVED_TOKEN_STACK);
00295
00296
00297 alloc = CP_LEXER_BUFFER_SIZE;
00298 buffer = GGC_NEWVEC (cp_token, alloc);
00299
00300
00301 space = alloc;
00302 pos = buffer;
00303 *pos = first_token;
00304
00305
00306 while (pos->type != CPP_EOF)
00307 {
00308 pos++;
00309 if (!--space)
00310 {
00311 space = alloc;
00312 alloc *= 2;
00313 buffer = GGC_RESIZEVEC (cp_token, buffer, alloc);
00314 pos = buffer + space;
00315 }
00316 cp_lexer_get_preprocessor_token (lexer, pos);
00317 }
00318 lexer->buffer = buffer;
00319 lexer->buffer_length = alloc - space;
00320 lexer->last_token = pos;
00321 lexer->next_token = lexer->buffer_length ? buffer : (cp_token *)&eof_token;
00322
00323
00324
00325 cpp_get_options (parse_in)->client_diagnostic = true;
00326 cpp_get_callbacks (parse_in)->error = cp_cpp_error;
00327
00328 gcc_assert (lexer->next_token->type != CPP_PURGED);
00329 return lexer;
00330 }
00331
00332
00333
00334
00335 static cp_lexer *
00336 cp_lexer_new_from_tokens (cp_token_cache *cache)
00337 {
00338 cp_token *first = cache->first;
00339 cp_token *last = cache->last;
00340 cp_lexer *lexer = GGC_CNEW (cp_lexer);
00341
00342
00343 lexer->buffer = NULL;
00344 lexer->buffer_length = 0;
00345 lexer->next_token = first == last ? (cp_token *)&eof_token : first;
00346 lexer->last_token = last;
00347
00348 lexer->saved_tokens = VEC_alloc (cp_token_position, heap,
00349 CP_SAVED_TOKEN_STACK);
00350
00351 #ifdef ENABLE_CHECKING
00352
00353 lexer->debugging_p = false;
00354 #endif
00355
00356 gcc_assert (lexer->next_token->type != CPP_PURGED);
00357 return lexer;
00358 }
00359
00360
00361
00362 static void
00363 cp_lexer_destroy (cp_lexer *lexer)
00364 {
00365 if (lexer->buffer)
00366 ggc_free (lexer->buffer);
00367 VEC_free (cp_token_position, heap, lexer->saved_tokens);
00368 ggc_free (lexer);
00369 }
00370
00371
00372
00373 #ifdef ENABLE_CHECKING
00374
00375 static inline bool
00376 cp_lexer_debugging_p (cp_lexer *lexer)
00377 {
00378 return lexer->debugging_p;
00379 }
00380
00381 #endif
00382
00383 static inline cp_token_position
00384 cp_lexer_token_position (cp_lexer *lexer, bool previous_p)
00385 {
00386 gcc_assert (!previous_p || lexer->next_token != &eof_token);
00387
00388 return lexer->next_token - previous_p;
00389 }
00390
00391 static inline cp_token *
00392 cp_lexer_token_at (cp_lexer *lexer ATTRIBUTE_UNUSED, cp_token_position pos)
00393 {
00394 return pos;
00395 }
00396
00397
00398
00399 static inline int
00400 cp_lexer_saving_tokens (const cp_lexer* lexer)
00401 {
00402 return VEC_length (cp_token_position, lexer->saved_tokens) != 0;
00403 }
00404
00405
00406
00407
00408 static void
00409 cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
00410 cp_token *token)
00411 {
00412 static int is_extern_c = 0;
00413
00414
00415 token->type
00416 = c_lex_with_flags (&token->u.value, &token->location, &token->flags);
00417 token->input_file_stack_index = input_file_stack_tick;
00418 token->keyword = RID_MAX;
00419 token->pragma_kind = PRAGMA_NONE;
00420 token->in_system_header = in_system_header;
00421
00422
00423
00424
00425 is_extern_c += pending_lang_change;
00426 pending_lang_change = 0;
00427 token->implicit_extern_c = is_extern_c > 0;
00428
00429
00430 if (token->type == CPP_NAME)
00431 {
00432 if (C_IS_RESERVED_WORD (token->u.value))
00433 {
00434
00435 token->type = CPP_KEYWORD;
00436
00437 token->keyword = C_RID_CODE (token->u.value);
00438
00439
00440
00441
00442 token->u.value = ridpointers[token->keyword];
00443 }
00444 else
00445 {
00446 token->ambiguous_p = false;
00447 token->keyword = RID_MAX;
00448 }
00449 }
00450
00451 else if (token->type == CPP_AT_NAME)
00452 {
00453 token->type = CPP_KEYWORD;
00454 switch (C_RID_CODE (token->u.value))
00455 {
00456
00457 case RID_CLASS: token->keyword = RID_AT_CLASS; break;
00458 case RID_PRIVATE: token->keyword = RID_AT_PRIVATE; break;
00459 case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
00460 case RID_PUBLIC: token->keyword = RID_AT_PUBLIC; break;
00461 case RID_THROW: token->keyword = RID_AT_THROW; break;
00462 case RID_TRY: token->keyword = RID_AT_TRY; break;
00463 case RID_CATCH: token->keyword = RID_AT_CATCH; break;
00464 default: token->keyword = C_RID_CODE (token->u.value);
00465 }
00466 }
00467 else if (token->type == CPP_PRAGMA)
00468 {
00469
00470 token->pragma_kind = TREE_INT_CST_LOW (token->u.value);
00471 token->u.value = NULL_TREE;
00472 }
00473 }
00474
00475
00476
00477 static inline void
00478 cp_lexer_set_source_position_from_token (cp_token *token)
00479 {
00480 if (token->type != CPP_EOF)
00481 {
00482 input_location = token->location;
00483 in_system_header = token->in_system_header;
00484 restore_input_file_stack (token->input_file_stack_index);
00485 }
00486 }
00487
00488
00489
00490
00491 static inline cp_token *
00492 cp_lexer_peek_token (cp_lexer *lexer)
00493 {
00494 if (cp_lexer_debugging_p (lexer))
00495 {
00496 fputs ("cp_lexer: peeking at token: ", cp_lexer_debug_stream);
00497 cp_lexer_print_token (cp_lexer_debug_stream, lexer->next_token);
00498 putc ('\n', cp_lexer_debug_stream);
00499 }
00500 return lexer->next_token;
00501 }
00502
00503
00504
00505 static inline bool
00506 cp_lexer_next_token_is (cp_lexer* lexer, enum cpp_ttype type)
00507 {
00508 return cp_lexer_peek_token (lexer)->type == type;
00509 }
00510
00511
00512
00513 static inline bool
00514 cp_lexer_next_token_is_not (cp_lexer* lexer, enum cpp_ttype type)
00515 {
00516 return !cp_lexer_next_token_is (lexer, type);
00517 }
00518
00519
00520
00521 static inline bool
00522 cp_lexer_next_token_is_keyword (cp_lexer* lexer, enum rid keyword)
00523 {
00524 return cp_lexer_peek_token (lexer)->keyword == keyword;
00525 }
00526
00527
00528
00529 static bool
00530 cp_lexer_next_token_is_decl_specifier_keyword (cp_lexer *lexer)
00531 {
00532 cp_token *token;
00533
00534 token = cp_lexer_peek_token (lexer);
00535 switch (token->keyword)
00536 {
00537
00538 case RID_AUTO:
00539 case RID_REGISTER:
00540 case RID_STATIC:
00541 case RID_EXTERN:
00542 case RID_MUTABLE:
00543 case RID_THREAD:
00544
00545 case RID_ENUM:
00546 case RID_CLASS:
00547 case RID_STRUCT:
00548 case RID_UNION:
00549 case RID_TYPENAME:
00550
00551 case RID_CHAR:
00552 case RID_WCHAR:
00553 case RID_BOOL:
00554 case RID_SHORT:
00555 case RID_INT:
00556 case RID_LONG:
00557 case RID_SIGNED:
00558 case RID_UNSIGNED:
00559 case RID_FLOAT:
00560 case RID_DOUBLE:
00561 case RID_VOID:
00562
00563 case RID_ATTRIBUTE:
00564 case RID_TYPEOF:
00565 return true;
00566
00567 default:
00568 return false;
00569 }
00570 }
00571
00572
00573
00574
00575
00576
00577
00578 static cp_token *
00579 cp_lexer_peek_nth_token (cp_lexer* lexer, size_t n)
00580 {
00581 cp_token *token;
00582
00583
00584 gcc_assert (n > 0);
00585
00586 if (cp_lexer_debugging_p (lexer))
00587 fprintf (cp_lexer_debug_stream,
00588 "cp_lexer: peeking ahead %ld at token: ", (long)n);
00589
00590 --n;
00591 token = lexer->next_token;
00592 gcc_assert (!n || token != &eof_token);
00593 while (n != 0)
00594 {
00595 ++token;
00596 if (token == lexer->last_token)
00597 {
00598 token = (cp_token *)&eof_token;
00599 break;
00600 }
00601
00602 if (token->type != CPP_PURGED)
00603 --n;
00604 }
00605
00606 if (cp_lexer_debugging_p (lexer))
00607 {
00608 cp_lexer_print_token (cp_lexer_debug_stream, token);
00609 putc ('\n', cp_lexer_debug_stream);
00610 }
00611
00612 return token;
00613 }
00614
00615
00616
00617
00618 static cp_token *
00619 cp_lexer_consume_token (cp_lexer* lexer)
00620 {
00621 cp_token *token = lexer->next_token;
00622
00623 gcc_assert (token != &eof_token);
00624 gcc_assert (!lexer->in_pragma || token->type != CPP_PRAGMA_EOL);
00625
00626 do
00627 {
00628 lexer->next_token++;
00629 if (lexer->next_token == lexer->last_token)
00630 {
00631 lexer->next_token = (cp_token *)&eof_token;
00632 break;
00633 }
00634
00635 }
00636 while (lexer->next_token->type == CPP_PURGED);
00637
00638 cp_lexer_set_source_position_from_token (token);
00639
00640
00641 if (cp_lexer_debugging_p (lexer))
00642 {
00643 fputs ("cp_lexer: consuming token: ", cp_lexer_debug_stream);
00644 cp_lexer_print_token (cp_lexer_debug_stream, token);
00645 putc ('\n', cp_lexer_debug_stream);
00646 }
00647
00648 return token;
00649 }
00650
00651
00652
00653
00654
00655 static void
00656 cp_lexer_purge_token (cp_lexer *lexer)
00657 {
00658 cp_token *tok = lexer->next_token;
00659
00660 gcc_assert (tok != &eof_token);
00661 tok->type = CPP_PURGED;
00662 tok->location = UNKNOWN_LOCATION;
00663 tok->u.value = NULL_TREE;
00664 tok->keyword = RID_MAX;
00665
00666 do
00667 {
00668 tok++;
00669 if (tok == lexer->last_token)
00670 {
00671 tok = (cp_token *)&eof_token;
00672 break;
00673 }
00674 }
00675 while (tok->type == CPP_PURGED);
00676 lexer->next_token = tok;
00677 }
00678
00679
00680
00681
00682
00683 static void
00684 cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
00685 {
00686 cp_token *peek = lexer->next_token;
00687
00688 if (peek == &eof_token)
00689 peek = lexer->last_token;
00690
00691 gcc_assert (tok < peek);
00692
00693 for ( tok += 1; tok != peek; tok += 1)
00694 {
00695 tok->type = CPP_PURGED;
00696 tok->location = UNKNOWN_LOCATION;
00697 tok->u.value = NULL_TREE;
00698 tok->keyword = RID_MAX;
00699 }
00700 }
00701
00702
00703
00704
00705 static void
00706 cp_lexer_save_tokens (cp_lexer* lexer)
00707 {
00708
00709 if (cp_lexer_debugging_p (lexer))
00710 fprintf (cp_lexer_debug_stream, "cp_lexer: saving tokens\n");
00711
00712 VEC_safe_push (cp_token_position, heap,
00713 lexer->saved_tokens, lexer->next_token);
00714 }
00715
00716
00717
00718 static void
00719 cp_lexer_commit_tokens (cp_lexer* lexer)
00720 {
00721
00722 if (cp_lexer_debugging_p (lexer))
00723 fprintf (cp_lexer_debug_stream, "cp_lexer: committing tokens\n");
00724
00725 VEC_pop (cp_token_position, lexer->saved_tokens);
00726 }
00727
00728
00729
00730
00731 static void
00732 cp_lexer_rollback_tokens (cp_lexer* lexer)
00733 {
00734
00735 if (cp_lexer_debugging_p (lexer))
00736 fprintf (cp_lexer_debug_stream, "cp_lexer: restoring tokens\n");
00737
00738 lexer->next_token = VEC_pop (cp_token_position, lexer->saved_tokens);
00739 }
00740
00741
00742
00743 #ifdef ENABLE_CHECKING
00744
00745 static void
00746 cp_lexer_print_token (FILE * stream, cp_token *token)
00747 {
00748
00749
00750 static const char *const token_names[] = {
00751
00752 #define OP(e, s) #e,
00753 #define TK(e, s) #e,
00754 TTYPE_TABLE
00755 #undef OP
00756 #undef TK
00757
00758 "KEYWORD",
00759 "TEMPLATE_ID",
00760 "NESTED_NAME_SPECIFIER",
00761 "PURGED"
00762 };
00763
00764
00765
00766 gcc_assert (token->type < ARRAY_SIZE(token_names));
00767 fputs (token_names[token->type], stream);
00768
00769
00770 switch (token->type)
00771 {
00772 case CPP_KEYWORD:
00773
00774
00775 if (TREE_CODE (token->u.value) != IDENTIFIER_NODE)
00776 break;
00777
00778 case CPP_NAME:
00779 fputs (IDENTIFIER_POINTER (token->u.value), stream);
00780 break;
00781
00782 case CPP_STRING:
00783 case CPP_WSTRING:
00784 fprintf (stream, " \"%s\"", TREE_STRING_POINTER (token->u.value));
00785 break;
00786
00787 default:
00788 break;
00789 }
00790 }
00791
00792
00793
00794 static void
00795 cp_lexer_start_debugging (cp_lexer* lexer)
00796 {
00797 lexer->debugging_p = true;
00798 }
00799
00800
00801
00802 static void
00803 cp_lexer_stop_debugging (cp_lexer* lexer)
00804 {
00805 lexer->debugging_p = false;
00806 }
00807
00808 #endif
00809
00810
00811
00812 static cp_token_cache *
00813 cp_token_cache_new (cp_token *first, cp_token *last)
00814 {
00815 cp_token_cache *cache = GGC_NEW (cp_token_cache);
00816 cache->first = first;
00817 cache->last = last;
00818 return cache;
00819 }
00820
00821
00822
00823
00824
00825
00826 static void
00827 clear_decl_specs (cp_decl_specifier_seq *decl_specs)
00828 {
00829 memset (decl_specs, 0, sizeof (cp_decl_specifier_seq));
00830 }
00831
00832
00833
00834
00835
00836
00837
00838
00839 static cp_declarator *make_call_declarator
00840 (cp_declarator *, cp_parameter_declarator *, cp_cv_quals, tree);
00841 static cp_declarator *make_array_declarator
00842 (cp_declarator *, tree);
00843 static cp_declarator *make_pointer_declarator
00844 (cp_cv_quals, cp_declarator *);
00845 static cp_declarator *make_reference_declarator
00846 (cp_cv_quals, cp_declarator *);
00847 static cp_parameter_declarator *make_parameter_declarator
00848 (cp_decl_specifier_seq *, cp_declarator *, tree);
00849 static cp_declarator *make_ptrmem_declarator
00850 (cp_cv_quals, tree, cp_declarator *);
00851
00852
00853 static cp_declarator *cp_error_declarator;
00854
00855
00856
00857 static struct obstack declarator_obstack;
00858
00859
00860
00861 static inline void *
00862 alloc_declarator (size_t bytes)
00863 {
00864 return obstack_alloc (&declarator_obstack, bytes);
00865 }
00866
00867
00868
00869
00870 static cp_declarator *
00871 make_declarator (cp_declarator_kind kind)
00872 {
00873 cp_declarator *declarator;
00874
00875 declarator = (cp_declarator *) alloc_declarator (sizeof (cp_declarator));
00876 declarator->kind = kind;
00877 declarator->attributes = NULL_TREE;
00878 declarator->declarator = NULL;
00879
00880 return declarator;
00881 }
00882
00883
00884
00885
00886
00887
00888
00889 static cp_declarator *
00890 make_id_declarator (tree qualifying_scope, tree unqualified_name,
00891 special_function_kind sfk)
00892 {
00893 cp_declarator *declarator;
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905 if (qualifying_scope && TYPE_P (qualifying_scope))
00906 qualifying_scope = TYPE_MAIN_VARIANT (qualifying_scope);
00907
00908 gcc_assert (TREE_CODE (unqualified_name) == IDENTIFIER_NODE
00909 || TREE_CODE (unqualified_name) == BIT_NOT_EXPR
00910 || TREE_CODE (unqualified_name) == TEMPLATE_ID_EXPR);
00911
00912 declarator = make_declarator (cdk_id);
00913 declarator->u.id.qualifying_scope = qualifying_scope;
00914 declarator->u.id.unqualified_name = unqualified_name;
00915 declarator->u.id.sfk = sfk;
00916
00917 return declarator;
00918 }
00919
00920
00921
00922
00923
00924 cp_declarator *
00925 make_pointer_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target)
00926 {
00927 cp_declarator *declarator;
00928
00929 declarator = make_declarator (cdk_pointer);
00930 declarator->declarator = target;
00931 declarator->u.pointer.qualifiers = cv_qualifiers;
00932 declarator->u.pointer.class_type = NULL_TREE;
00933
00934 return declarator;
00935 }
00936
00937
00938
00939 cp_declarator *
00940 make_reference_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target)
00941 {
00942 cp_declarator *declarator;
00943
00944 declarator = make_declarator (cdk_reference);
00945 declarator->declarator = target;
00946 declarator->u.pointer.qualifiers = cv_qualifiers;
00947 declarator->u.pointer.class_type = NULL_TREE;
00948
00949 return declarator;
00950 }
00951
00952
00953
00954
00955 cp_declarator *
00956 make_ptrmem_declarator (cp_cv_quals cv_qualifiers, tree class_type,
00957 cp_declarator *pointee)
00958 {
00959 cp_declarator *declarator;
00960
00961 declarator = make_declarator (cdk_ptrmem);
00962 declarator->declarator = pointee;
00963 declarator->u.pointer.qualifiers = cv_qualifiers;
00964 declarator->u.pointer.class_type = class_type;
00965
00966 return declarator;
00967 }
00968
00969
00970
00971
00972
00973
00974 cp_declarator *
00975 make_call_declarator (cp_declarator *target,
00976 cp_parameter_declarator *parms,
00977 cp_cv_quals cv_qualifiers,
00978 tree exception_specification)
00979 {
00980 cp_declarator *declarator;
00981
00982 declarator = make_declarator (cdk_function);
00983 declarator->declarator = target;
00984 declarator->u.function.parameters = parms;
00985 declarator->u.function.qualifiers = cv_qualifiers;
00986 declarator->u.function.exception_specification = exception_specification;
00987
00988 return declarator;
00989 }
00990
00991
00992
00993
00994 cp_declarator *
00995 make_array_declarator (cp_declarator *element, tree bounds)
00996 {
00997 cp_declarator *declarator;
00998
00999 declarator = make_declarator (cdk_array);
01000 declarator->declarator = element;
01001 declarator->u.array.bounds = bounds;
01002
01003 return declarator;
01004 }
01005
01006 cp_parameter_declarator *no_parameters;
01007
01008
01009
01010
01011 cp_parameter_declarator *
01012 make_parameter_declarator (cp_decl_specifier_seq *decl_specifiers,
01013 cp_declarator *declarator,
01014 tree default_argument)
01015 {
01016 cp_parameter_declarator *parameter;
01017
01018 parameter = ((cp_parameter_declarator *)
01019 alloc_declarator (sizeof (cp_parameter_declarator)));
01020 parameter->next = NULL;
01021 if (decl_specifiers)
01022 parameter->decl_specifiers = *decl_specifiers;
01023 else
01024 clear_decl_specs (¶meter->decl_specifiers);
01025 parameter->declarator = declarator;
01026 parameter->default_argument = default_argument;
01027 parameter->ellipsis_p = false;
01028
01029 return parameter;
01030 }
01031
01032
01033
01034 static bool
01035 function_declarator_p (const cp_declarator *declarator)
01036 {
01037 while (declarator)
01038 {
01039 if (declarator->kind == cdk_function
01040 && declarator->declarator->kind == cdk_id)
01041 return true;
01042 if (declarator->kind == cdk_id
01043 || declarator->kind == cdk_error)
01044 return false;
01045 declarator = declarator->declarator;
01046 }
01047 return false;
01048 }
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108 typedef enum cp_parser_flags
01109 {
01110
01111 CP_PARSER_FLAGS_NONE = 0x0,
01112
01113
01114 CP_PARSER_FLAGS_OPTIONAL = 0x1,
01115
01116 CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES = 0x2
01117 } cp_parser_flags;
01118
01119
01120
01121 typedef enum cp_parser_declarator_kind
01122 {
01123
01124 CP_PARSER_DECLARATOR_ABSTRACT,
01125
01126 CP_PARSER_DECLARATOR_NAMED,
01127
01128 CP_PARSER_DECLARATOR_EITHER
01129 } cp_parser_declarator_kind;
01130
01131
01132
01133
01134
01135 enum cp_parser_prec
01136 {
01137 PREC_NOT_OPERATOR,
01138 PREC_LOGICAL_OR_EXPRESSION,
01139 PREC_LOGICAL_AND_EXPRESSION,
01140 PREC_INCLUSIVE_OR_EXPRESSION,
01141 PREC_EXCLUSIVE_OR_EXPRESSION,
01142 PREC_AND_EXPRESSION,
01143 PREC_EQUALITY_EXPRESSION,
01144 PREC_RELATIONAL_EXPRESSION,
01145 PREC_SHIFT_EXPRESSION,
01146 PREC_ADDITIVE_EXPRESSION,
01147 PREC_MULTIPLICATIVE_EXPRESSION,
01148 PREC_PM_EXPRESSION,
01149 NUM_PREC_VALUES = PREC_PM_EXPRESSION
01150 };
01151
01152
01153
01154
01155 typedef struct cp_parser_binary_operations_map_node
01156 {
01157
01158 enum cpp_ttype token_type;
01159
01160 enum tree_code tree_type;
01161
01162 enum cp_parser_prec prec;
01163 } cp_parser_binary_operations_map_node;
01164
01165
01166
01167 typedef enum cp_parser_status_kind
01168 {
01169
01170 CP_PARSER_STATUS_KIND_NO_ERROR,
01171
01172 CP_PARSER_STATUS_KIND_ERROR,
01173
01174
01175 CP_PARSER_STATUS_KIND_COMMITTED
01176 } cp_parser_status_kind;
01177
01178 typedef struct cp_parser_expression_stack_entry
01179 {
01180 tree lhs;
01181 enum tree_code tree_type;
01182 int prec;
01183 } cp_parser_expression_stack_entry;
01184
01185
01186
01187
01188 typedef struct cp_parser_expression_stack_entry
01189 cp_parser_expression_stack[NUM_PREC_VALUES];
01190
01191
01192 typedef struct cp_parser_context GTY (())
01193 {
01194
01195
01196 enum cp_parser_status_kind status;
01197
01198
01199
01200
01201 tree object_type;
01202
01203
01204 struct cp_parser_context *next;
01205 } cp_parser_context;
01206
01207
01208
01209
01210
01211 static cp_parser_context *cp_parser_context_new
01212 (cp_parser_context *);
01213
01214
01215
01216 static GTY((deletable)) cp_parser_context* cp_parser_context_free_list;
01217
01218
01219
01220
01221
01222 static const cp_parser_binary_operations_map_node binops[] = {
01223 { CPP_DEREF_STAR, MEMBER_REF, PREC_PM_EXPRESSION },
01224 { CPP_DOT_STAR, DOTSTAR_EXPR, PREC_PM_EXPRESSION },
01225
01226 { CPP_MULT, MULT_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
01227 { CPP_DIV, TRUNC_DIV_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
01228 { CPP_MOD, TRUNC_MOD_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
01229
01230 { CPP_PLUS, PLUS_EXPR, PREC_ADDITIVE_EXPRESSION },
01231 { CPP_MINUS, MINUS_EXPR, PREC_ADDITIVE_EXPRESSION },
01232
01233 { CPP_LSHIFT, LSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
01234 { CPP_RSHIFT, RSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
01235
01236 { CPP_LESS, LT_EXPR, PREC_RELATIONAL_EXPRESSION },
01237 { CPP_GREATER, GT_EXPR, PREC_RELATIONAL_EXPRESSION },
01238 { CPP_LESS_EQ, LE_EXPR, PREC_RELATIONAL_EXPRESSION },
01239 { CPP_GREATER_EQ, GE_EXPR, PREC_RELATIONAL_EXPRESSION },
01240
01241 { CPP_EQ_EQ, EQ_EXPR, PREC_EQUALITY_EXPRESSION },
01242 { CPP_NOT_EQ, NE_EXPR, PREC_EQUALITY_EXPRESSION },
01243
01244 { CPP_AND, BIT_AND_EXPR, PREC_AND_EXPRESSION },
01245
01246 { CPP_XOR, BIT_XOR_EXPR, PREC_EXCLUSIVE_OR_EXPRESSION },
01247
01248 { CPP_OR, BIT_IOR_EXPR, PREC_INCLUSIVE_OR_EXPRESSION },
01249
01250 { CPP_AND_AND, TRUTH_ANDIF_EXPR, PREC_LOGICAL_AND_EXPRESSION },
01251
01252 { CPP_OR_OR, TRUTH_ORIF_EXPR, PREC_LOGICAL_OR_EXPRESSION }
01253 };
01254
01255
01256
01257
01258 static cp_parser_binary_operations_map_node binops_by_token[N_CP_TTYPES];
01259
01260
01261
01262
01263
01264
01265 static cp_parser_context *
01266 cp_parser_context_new (cp_parser_context* next)
01267 {
01268 cp_parser_context *context;
01269
01270
01271 if (cp_parser_context_free_list != NULL)
01272 {
01273
01274 context = cp_parser_context_free_list;
01275 cp_parser_context_free_list = context->next;
01276 memset (context, 0, sizeof (*context));
01277 }
01278 else
01279 context = GGC_CNEW (cp_parser_context);
01280
01281
01282 context->status = CP_PARSER_STATUS_KIND_NO_ERROR;
01283
01284
01285 if (next)
01286 {
01287
01288
01289 context->object_type = next->object_type;
01290
01291 context->next = next;
01292 }
01293
01294 return context;
01295 }
01296
01297
01298
01299 typedef struct cp_parser GTY(())
01300 {
01301
01302 cp_lexer *lexer;
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317 tree scope;
01318
01319
01320
01321
01322
01323
01324 tree object_scope;
01325 tree qualifying_scope;
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336 cp_parser_context *context;
01337
01338
01339
01340 bool allow_gnu_extensions_p;
01341
01342
01343
01344
01345 bool greater_than_is_operator_p;
01346
01347
01348
01349
01350 bool default_arg_ok_p;
01351
01352
01353
01354 bool integral_constant_expression_p;
01355
01356
01357
01358
01359
01360 bool allow_non_integral_constant_expression_p;
01361
01362
01363
01364 bool non_integral_constant_expression_p;
01365
01366
01367
01368 bool local_variables_forbidden_p;
01369
01370
01371
01372
01373 bool in_unbraced_linkage_specification_p;
01374
01375
01376
01377 bool in_declarator_p;
01378
01379
01380 bool in_template_argument_list_p;
01381
01382
01383
01384
01385
01386
01387 #define IN_SWITCH_STMT 1
01388 #define IN_ITERATION_STMT 2
01389 #define IN_OMP_BLOCK 4
01390 #define IN_OMP_FOR 8
01391 unsigned char in_statement;
01392
01393
01394
01395
01396
01397 bool in_switch_statement_p;
01398
01399
01400
01401
01402 bool in_type_id_in_expr_p;
01403
01404
01405
01406 bool implicit_extern_c;
01407
01408
01409
01410 bool translate_strings_p;
01411
01412
01413
01414 bool in_function_body;
01415
01416
01417
01418
01419 const char *type_definition_forbidden_message;
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435 tree unparsed_functions_queues;
01436
01437
01438
01439 unsigned num_classes_being_defined;
01440
01441
01442
01443 unsigned num_template_parameter_lists;
01444 } cp_parser;
01445
01446
01447
01448
01449
01450 static cp_parser *cp_parser_new
01451 (void);
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467 static tree cp_parser_identifier
01468 (cp_parser *);
01469 static tree cp_parser_string_literal
01470 (cp_parser *, bool, bool);
01471
01472
01473
01474 static bool cp_parser_translation_unit
01475 (cp_parser *);
01476
01477
01478
01479 static tree cp_parser_primary_expression
01480 (cp_parser *, bool, bool, bool, cp_id_kind *);
01481 static tree cp_parser_id_expression
01482 (cp_parser *, bool, bool, bool *, bool, bool);
01483 static tree cp_parser_unqualified_id
01484 (cp_parser *, bool, bool, bool, bool);
01485 static tree cp_parser_nested_name_specifier_opt
01486 (cp_parser *, bool, bool, bool, bool);
01487 static tree cp_parser_nested_name_specifier
01488 (cp_parser *, bool, bool, bool, bool);
01489 static tree cp_parser_class_or_namespace_name
01490 (cp_parser *, bool, bool, bool, bool, bool);
01491 static tree cp_parser_postfix_expression
01492 (cp_parser *, bool, bool);
01493 static tree cp_parser_postfix_open_square_expression
01494 (cp_parser *, tree, bool);
01495 static tree cp_parser_postfix_dot_deref_expression
01496 (cp_parser *, enum cpp_ttype, tree, bool, cp_id_kind *);
01497 static tree cp_parser_parenthesized_expression_list
01498 (cp_parser *, bool, bool, bool *);
01499 static void cp_parser_pseudo_destructor_name
01500 (cp_parser *, tree *, tree *);
01501 static tree cp_parser_unary_expression
01502 (cp_parser *, bool, bool);
01503 static enum tree_code cp_parser_unary_operator
01504 (cp_token *);
01505 static tree cp_parser_new_expression
01506 (cp_parser *);
01507 static tree cp_parser_new_placement
01508 (cp_parser *);
01509 static tree cp_parser_new_type_id
01510 (cp_parser *, tree *);
01511 static cp_declarator *cp_parser_new_declarator_opt
01512 (cp_parser *);
01513 static cp_declarator *cp_parser_direct_new_declarator
01514 (cp_parser *);
01515 static tree cp_parser_new_initializer
01516 (cp_parser *);
01517 static tree cp_parser_delete_expression
01518 (cp_parser *);
01519 static tree cp_parser_cast_expression
01520 (cp_parser *, bool, bool);
01521 static tree cp_parser_binary_expression
01522 (cp_parser *, bool);
01523 static tree cp_parser_question_colon_clause
01524 (cp_parser *, tree);
01525 static tree cp_parser_assignment_expression
01526 (cp_parser *, bool);
01527 static enum tree_code cp_parser_assignment_operator_opt
01528 (cp_parser *);
01529 static tree cp_parser_expression
01530 (cp_parser *, bool);
01531 static tree cp_parser_constant_expression
01532 (cp_parser *, bool, bool *);
01533 static tree cp_parser_builtin_offsetof
01534 (cp_parser *);
01535
01536
01537
01538 static void cp_parser_statement
01539 (cp_parser *, tree, bool);
01540 static void cp_parser_label_for_labeled_statement
01541 (cp_parser *);
01542 static tree cp_parser_expression_statement
01543 (cp_parser *, tree);
01544 static tree cp_parser_compound_statement
01545 (cp_parser *, tree, bool);
01546 static void cp_parser_statement_seq_opt
01547 (cp_parser *, tree);
01548 static tree cp_parser_selection_statement
01549 (cp_parser *);
01550 static tree cp_parser_condition
01551 (cp_parser *);
01552 static tree cp_parser_iteration_statement
01553 (cp_parser *);
01554 static void cp_parser_for_init_statement
01555 (cp_parser *);
01556 static tree cp_parser_jump_statement
01557 (cp_parser *);
01558 static void cp_parser_declaration_statement
01559 (cp_parser *);
01560
01561 static tree cp_parser_implicitly_scoped_statement
01562 (cp_parser *);
01563 static void cp_parser_already_scoped_statement
01564 (cp_parser *);
01565
01566
01567
01568 static void cp_parser_declaration_seq_opt
01569 (cp_parser *);
01570 static void cp_parser_declaration
01571 (cp_parser *);
01572 static void cp_parser_block_declaration
01573 (cp_parser *, bool);
01574 static void cp_parser_simple_declaration
01575 (cp_parser *, bool);
01576 static void cp_parser_decl_specifier_seq
01577 (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, int *);
01578 static tree cp_parser_storage_class_specifier_opt
01579 (cp_parser *);
01580 static tree cp_parser_function_specifier_opt
01581 (cp_parser *, cp_decl_specifier_seq *);
01582 static tree cp_parser_type_specifier
01583 (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, bool,
01584 int *, bool *);
01585 static tree cp_parser_simple_type_specifier
01586 (cp_parser *, cp_decl_specifier_seq *, cp_parser_flags);
01587 static tree cp_parser_type_name
01588 (cp_parser *);
01589 static tree cp_parser_elaborated_type_specifier
01590 (cp_parser *, bool, bool);
01591 static tree cp_parser_enum_specifier
01592 (cp_parser *);
01593 static void cp_parser_enumerator_list
01594 (cp_parser *, tree);
01595 static void cp_parser_enumerator_definition
01596 (cp_parser *, tree);
01597 static tree cp_parser_namespace_name
01598 (cp_parser *);
01599 static void cp_parser_namespace_definition
01600 (cp_parser *);
01601 static void cp_parser_namespace_body
01602 (cp_parser *);
01603 static tree cp_parser_qualified_namespace_specifier
01604 (cp_parser *);
01605 static void cp_parser_namespace_alias_definition
01606 (cp_parser *);
01607 static bool cp_parser_using_declaration
01608 (cp_parser *, bool);
01609 static void cp_parser_using_directive
01610 (cp_parser *);
01611 static void cp_parser_asm_definition
01612 (cp_parser *);
01613 static void cp_parser_linkage_specification
01614 (cp_parser *);
01615
01616
01617
01618 static tree cp_parser_init_declarator
01619 (cp_parser *, cp_decl_specifier_seq *, VEC (deferred_access_check,gc)*, bool, bool, int, bool *);
01620 static cp_declarator *cp_parser_declarator
01621 (cp_parser *, cp_parser_declarator_kind, int *, bool *, bool);
01622 static cp_declarator *cp_parser_direct_declarator
01623 (cp_parser *, cp_parser_declarator_kind, int *, bool);
01624 static enum tree_code cp_parser_ptr_operator
01625 (cp_parser *, tree *, cp_cv_quals *);
01626 static cp_cv_quals cp_parser_cv_qualifier_seq_opt
01627 (cp_parser *);
01628 static tree cp_parser_declarator_id
01629 (cp_parser *, bool);
01630 static tree cp_parser_type_id
01631 (cp_parser *);
01632 static void cp_parser_type_specifier_seq
01633 (cp_parser *, bool, cp_decl_specifier_seq *);
01634 static cp_parameter_declarator *cp_parser_parameter_declaration_clause
01635 (cp_parser *);
01636 static cp_parameter_declarator *cp_parser_parameter_declaration_list
01637 (cp_parser *, bool *);
01638 static cp_parameter_declarator *cp_parser_parameter_declaration
01639 (cp_parser *, bool, bool *);
01640 static void cp_parser_function_body
01641 (cp_parser *);
01642 static tree cp_parser_initializer
01643 (cp_parser *, bool *, bool *);
01644 static tree cp_parser_initializer_clause
01645 (cp_parser *, bool *);
01646 static VEC(constructor_elt,gc) *cp_parser_initializer_list
01647 (cp_parser *, bool *);
01648
01649 static bool cp_parser_ctor_initializer_opt_and_function_body
01650 (cp_parser *);
01651
01652
01653
01654 static tree cp_parser_class_name
01655 (cp_parser *, bool, bool, enum tag_types, bool, bool, bool);
01656 static tree cp_parser_class_specifier
01657 (cp_parser *);
01658 static tree cp_parser_class_head
01659 (cp_parser *, bool *, tree *, tree *);
01660 static enum tag_types cp_parser_class_key
01661 (cp_parser *);
01662 static void cp_parser_member_specification_opt
01663 (cp_parser *);
01664 static void cp_parser_member_declaration
01665 (cp_parser *);
01666 static tree cp_parser_pure_specifier
01667 (cp_parser *);
01668 static tree cp_parser_constant_initializer
01669 (cp_parser *);
01670
01671
01672
01673 static tree cp_parser_base_clause
01674 (cp_parser *);
01675 static tree cp_parser_base_specifier
01676 (cp_parser *);
01677
01678
01679
01680 static tree cp_parser_conversion_function_id
01681 (cp_parser *);
01682 static tree cp_parser_conversion_type_id
01683 (cp_parser *);
01684 static cp_declarator *cp_parser_conversion_declarator_opt
01685 (cp_parser *);
01686 static bool cp_parser_ctor_initializer_opt
01687 (cp_parser *);
01688 static void cp_parser_mem_initializer_list
01689 (cp_parser *);
01690 static tree cp_parser_mem_initializer
01691 (cp_parser *);
01692 static tree cp_parser_mem_initializer_id
01693 (cp_parser *);
01694
01695
01696
01697 static tree cp_parser_operator_function_id
01698 (cp_parser *);
01699 static tree cp_parser_operator
01700 (cp_parser *);
01701
01702
01703
01704 static void cp_parser_template_declaration
01705 (cp_parser *, bool);
01706 static tree cp_parser_template_parameter_list
01707 (cp_parser *);
01708 static tree cp_parser_template_parameter
01709 (cp_parser *, bool *);
01710 static tree cp_parser_type_parameter
01711 (cp_parser *);
01712 static tree cp_parser_template_id
01713 (cp_parser *, bool, bool, bool);
01714 static tree cp_parser_template_name
01715 (cp_parser *, bool, bool, bool, bool *);
01716 static tree cp_parser_template_argument_list
01717 (cp_parser *);
01718 static tree cp_parser_template_argument
01719 (cp_parser *);
01720 static void cp_parser_explicit_instantiation
01721 (cp_parser *);
01722 static void cp_parser_explicit_specialization
01723 (cp_parser *);
01724
01725
01726
01727 static tree cp_parser_try_block
01728 (cp_parser *);
01729 static bool cp_parser_function_try_block
01730 (cp_parser *);
01731 static void cp_parser_handler_seq
01732 (cp_parser *);
01733 static void cp_parser_handler
01734 (cp_parser *);
01735 static tree cp_parser_exception_declaration
01736 (cp_parser *);
01737 static tree cp_parser_throw_expression
01738 (cp_parser *);
01739 static tree cp_parser_exception_specification_opt
01740 (cp_parser *);
01741 static tree cp_parser_type_id_list
01742 (cp_parser *);
01743
01744
01745
01746 static tree cp_parser_asm_specification_opt
01747 (cp_parser *);
01748 static tree cp_parser_asm_operand_list
01749 (cp_parser *);
01750 static tree cp_parser_asm_clobber_list
01751 (cp_parser *);
01752 static tree cp_parser_attributes_opt
01753 (cp_parser *);
01754 static tree cp_parser_attribute_list
01755 (cp_parser *);
01756 static bool cp_parser_extension_opt
01757 (cp_parser *, int *);
01758 static void cp_parser_label_declaration
01759 (cp_parser *);
01760
01761 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
01762 static bool cp_parser_pragma
01763 (cp_parser *, enum pragma_context);
01764
01765
01766
01767 static tree cp_parser_objc_message_receiver
01768 (cp_parser *);
01769 static tree cp_parser_objc_message_args
01770 (cp_parser *);
01771 static tree cp_parser_objc_message_expression
01772 (cp_parser *);
01773 static tree cp_parser_objc_encode_expression
01774 (cp_parser *);
01775 static tree cp_parser_objc_defs_expression
01776 (cp_parser *);
01777 static tree cp_parser_objc_protocol_expression
01778 (cp_parser *);
01779 static tree cp_parser_objc_selector_expression
01780 (cp_parser *);
01781 static tree cp_parser_objc_expression
01782 (cp_parser *);
01783 static bool cp_parser_objc_selector_p
01784 (enum cpp_ttype);
01785 static tree cp_parser_objc_selector
01786 (cp_parser *);
01787 static tree cp_parser_objc_protocol_refs_opt
01788 (cp_parser *);
01789 static void cp_parser_objc_declaration
01790 (cp_parser *);
01791 static tree cp_parser_objc_statement
01792 (cp_parser *);
01793
01794
01795
01796 static tree cp_parser_lookup_name
01797 (cp_parser *, tree, enum tag_types, bool, bool, bool, tree *);
01798 static tree cp_parser_lookup_name_simple
01799 (cp_parser *, tree);
01800 static tree cp_parser_maybe_treat_template_as_class
01801 (tree, bool);
01802 static bool cp_parser_check_declarator_template_parameters
01803 (cp_parser *, cp_declarator *);
01804 static bool cp_parser_check_template_parameters
01805 (cp_parser *, unsigned);
01806 static tree cp_parser_simple_cast_expression
01807 (cp_parser *);
01808 static tree cp_parser_global_scope_opt
01809 (cp_parser *, bool);
01810 static bool cp_parser_constructor_declarator_p
01811 (cp_parser *, bool);
01812 static tree cp_parser_function_definition_from_specifiers_and_declarator
01813 (cp_parser *, cp_decl_specifier_seq *, tree, const cp_declarator *);
01814 static tree cp_parser_function_definition_after_declarator
01815 (cp_parser *, bool);
01816 static void cp_parser_template_declaration_after_export
01817 (cp_parser *, bool);
01818 static void cp_parser_perform_template_parameter_access_checks
01819 (VEC (deferred_access_check,gc)*);
01820 static tree cp_parser_single_declaration
01821 (cp_parser *, VEC (deferred_access_check,gc)*, bool, bool *);
01822 static tree cp_parser_functional_cast
01823 (cp_parser *, tree);
01824 static tree cp_parser_save_member_function_body
01825 (cp_parser *, cp_decl_specifier_seq *, cp_declarator *, tree);
01826 static tree cp_parser_enclosed_template_argument_list
01827 (cp_parser *);
01828 static void cp_parser_save_default_args
01829 (cp_parser *, tree);
01830 static void cp_parser_late_parsing_for_member
01831 (cp_parser *, tree);
01832 static void cp_parser_late_parsing_default_args
01833 (cp_parser *, tree);
01834 static tree cp_parser_sizeof_operand
01835 (cp_parser *, enum rid);
01836 static bool cp_parser_declares_only_class_p
01837 (cp_parser *);
01838 static void cp_parser_set_storage_class
01839 (cp_parser *, cp_decl_specifier_seq *, enum rid);
01840 static void cp_parser_set_decl_spec_type
01841 (cp_decl_specifier_seq *, tree, bool);
01842 static bool cp_parser_friend_p
01843 (const cp_decl_specifier_seq *);
01844 static cp_token *cp_parser_require
01845 (cp_parser *, enum cpp_ttype, const char *);
01846 static cp_token *cp_parser_require_keyword
01847 (cp_parser *, enum rid, const char *);
01848 static bool cp_parser_token_starts_function_definition_p
01849 (cp_token *);
01850 static bool cp_parser_next_token_starts_class_definition_p
01851 (cp_parser *);
01852 static bool cp_parser_next_token_ends_template_argument_p
01853 (cp_parser *);
01854 static bool cp_parser_nth_token_starts_template_argument_list_p
01855 (cp_parser *, size_t);
01856 static enum tag_types cp_parser_token_is_class_key
01857 (cp_token *);
01858 static void cp_parser_check_class_key
01859 (enum tag_types, tree type);
01860 static void cp_parser_check_access_in_redeclaration
01861 (tree type);
01862 static bool cp_parser_optional_template_keyword
01863 (cp_parser *);
01864 static void cp_parser_pre_parsed_nested_name_specifier
01865 (cp_parser *);
01866 static void cp_parser_cache_group
01867 (cp_parser *, enum cpp_ttype, unsigned);
01868 static void cp_parser_parse_tentatively
01869 (cp_parser *);
01870 static void cp_parser_commit_to_tentative_parse
01871 (cp_parser *);
01872 static void cp_parser_abort_tentative_parse
01873 (cp_parser *);
01874 static bool cp_parser_parse_definitely
01875 (cp_parser *);
01876 static inline bool cp_parser_parsing_tentatively
01877 (cp_parser *);
01878 static bool cp_parser_uncommitted_to_tentative_parse_p
01879 (cp_parser *);
01880 static void cp_parser_error
01881 (cp_parser *, const char *);
01882 static void cp_parser_name_lookup_error
01883 (cp_parser *, tree, tree, const char *);
01884 static bool cp_parser_simulate_error
01885 (cp_parser *);
01886 static bool cp_parser_check_type_definition
01887 (cp_parser *);
01888 static void cp_parser_check_for_definition_in_return_type
01889 (cp_declarator *, tree);
01890 static void cp_parser_check_for_invalid_template_id
01891 (cp_parser *, tree);
01892 static bool cp_parser_non_integral_constant_expression
01893 (cp_parser *, const char *);
01894 static void cp_parser_diagnose_invalid_type_name
01895 (cp_parser *, tree, tree);
01896 static bool cp_parser_parse_and_diagnose_invalid_type_name
01897 (cp_parser *);
01898 static int cp_parser_skip_to_closing_parenthesis
01899 (cp_parser *, bool, bool, bool);
01900 static void cp_parser_skip_to_end_of_statement
01901 (cp_parser *);
01902 static void cp_parser_consume_semicolon_at_end_of_statement
01903 (cp_parser *);
01904 static void cp_parser_skip_to_end_of_block_or_statement
01905 (cp_parser *);
01906 static void cp_parser_skip_to_closing_brace
01907 (cp_parser *);
01908 static void cp_parser_skip_to_end_of_template_parameter_list
01909 (cp_parser *);
01910 static void cp_parser_skip_to_pragma_eol
01911 (cp_parser*, cp_token *);
01912 static bool cp_parser_error_occurred
01913 (cp_parser *);
01914 static bool cp_parser_allow_gnu_extensions_p
01915 (cp_parser *);
01916 static bool cp_parser_is_string_literal
01917 (cp_token *);
01918 static bool cp_parser_is_keyword
01919 (cp_token *, enum rid);
01920 static tree cp_parser_make_typename_type
01921 (cp_parser *, tree, tree);
01922
01923
01924
01925 static inline bool
01926 cp_parser_parsing_tentatively (cp_parser* parser)
01927 {
01928 return parser->context->next != NULL;
01929 }
01930
01931
01932
01933 static bool
01934 cp_parser_is_string_literal (cp_token* token)
01935 {
01936 return (token->type == CPP_STRING || token->type == CPP_WSTRING);
01937 }
01938
01939
01940
01941 static bool
01942 cp_parser_is_keyword (cp_token* token, enum rid keyword)
01943 {
01944 return token->keyword == keyword;
01945 }
01946
01947
01948
01949
01950
01951
01952
01953 static void
01954 cp_parser_error (cp_parser* parser, const char* message)
01955 {
01956 if (!cp_parser_simulate_error (parser))
01957 {
01958 cp_token *token = cp_lexer_peek_token (parser->lexer);
01959
01960
01961 cp_lexer_set_source_position_from_token (token);
01962
01963 if (token->type == CPP_PRAGMA)
01964 {
01965 error ("%<#pragma%> is not allowed here");
01966 cp_parser_skip_to_pragma_eol (parser, token);
01967 return;
01968 }
01969
01970 c_parse_error (message,
01971
01972
01973
01974 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
01975 token->u.value);
01976 }
01977 }
01978
01979
01980
01981
01982
01983
01984 static void
01985 cp_parser_name_lookup_error (cp_parser* parser,
01986 tree name,
01987 tree decl,
01988 const char* desired)
01989 {
01990
01991
01992 if (decl == error_mark_node)
01993 {
01994 if (parser->scope && parser->scope != global_namespace)
01995 error ("%<%D::%D%> has not been declared",
01996 parser->scope, name);
01997 else if (parser->scope == global_namespace)
01998 error ("%<::%D%> has not been declared", name);
01999 else if (parser->object_scope
02000 && !CLASS_TYPE_P (parser->object_scope))
02001 error ("request for member %qD in non-class type %qT",
02002 name, parser->object_scope);
02003 else if (parser->object_scope)
02004 error ("%<%T::%D%> has not been declared",
02005 parser->object_scope, name);
02006 else
02007 error ("%qD has not been declared", name);
02008 }
02009 else if (parser->scope && parser->scope != global_namespace)
02010 error ("%<%D::%D%> %s", parser->scope, name, desired);
02011 else if (parser->scope == global_namespace)
02012 error ("%<::%D%> %s", name, desired);
02013 else
02014 error ("%qD %s", name, desired);
02015 }
02016
02017
02018
02019
02020
02021 static bool
02022 cp_parser_simulate_error (cp_parser* parser)
02023 {
02024 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
02025 {
02026 parser->context->status = CP_PARSER_STATUS_KIND_ERROR;
02027 return true;
02028 }
02029 return false;
02030 }
02031
02032
02033
02034 static void
02035 cp_parser_check_decl_spec (cp_decl_specifier_seq *decl_specs)
02036 {
02037 cp_decl_spec ds;
02038
02039 for (ds = ds_first; ds != ds_last; ++ds)
02040 {
02041 unsigned count = decl_specs->specs[(int)ds];
02042 if (count < 2)
02043 continue;
02044
02045 if (ds == ds_long)
02046 {
02047 if (count > 2)
02048 error ("%<long long long%> is too long for GCC");
02049 else if (pedantic && !in_system_header && warn_long_long)
02050 pedwarn ("ISO C++ does not support %<long long%>");
02051 }
02052 else if (count > 1)
02053 {
02054 static const char *const decl_spec_names[] = {
02055 "signed",
02056 "unsigned",
02057 "short",
02058 "long",
02059 "const",
02060 "volatile",
02061 "restrict",
02062 "inline",
02063 "virtual",
02064 "explicit",
02065 "friend",
02066 "typedef",
02067 "__complex",
02068 "__thread"
02069 };
02070 error ("duplicate %qs", decl_spec_names[(int)ds]);
02071 }
02072 }
02073 }
02074
02075
02076
02077
02078
02079 static bool
02080 cp_parser_check_type_definition (cp_parser* parser)
02081 {
02082
02083 if (parser->type_definition_forbidden_message)
02084 {
02085
02086
02087 error ("%s", parser->type_definition_forbidden_message);
02088 return false;
02089 }
02090 return true;
02091 }
02092
02093
02094
02095
02096
02097
02098 static void
02099 cp_parser_check_for_definition_in_return_type (cp_declarator *declarator,
02100 tree type)
02101 {
02102
02103
02104
02105 while (declarator
02106 && (declarator->kind == cdk_pointer
02107 || declarator->kind == cdk_reference
02108 || declarator->kind == cdk_ptrmem))
02109 declarator = declarator->declarator;
02110 if (declarator
02111 && declarator->kind == cdk_function)
02112 {
02113 error ("new types may not be defined in a return type");
02114 inform ("(perhaps a semicolon is missing after the definition of %qT)",
02115 type);
02116 }
02117 }
02118
02119
02120
02121
02122
02123
02124 static void
02125 cp_parser_check_for_invalid_template_id (cp_parser* parser,
02126 tree type)
02127 {
02128 cp_token_position start = 0;
02129
02130 if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
02131 {
02132 if (TYPE_P (type))
02133 error ("%qT is not a template", type);
02134 else if (TREE_CODE (type) == IDENTIFIER_NODE)
02135 error ("%qE is not a template", type);
02136 else
02137 error ("invalid template-id");
02138
02139 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
02140 start = cp_lexer_token_position (parser->lexer, true);
02141
02142 cp_lexer_consume_token (parser->lexer);
02143
02144 cp_parser_enclosed_template_argument_list (parser);
02145
02146
02147 if (start)
02148 cp_lexer_purge_tokens_after (parser->lexer, start);
02149 }
02150 }
02151
02152
02153
02154
02155
02156
02157 static bool
02158 cp_parser_non_integral_constant_expression (cp_parser *parser,
02159 const char *thing)
02160 {
02161 parser->non_integral_constant_expression_p = true;
02162 if (parser->integral_constant_expression_p)
02163 {
02164 if (!parser->allow_non_integral_constant_expression_p)
02165 {
02166 error ("%s cannot appear in a constant-expression", thing);
02167 return true;
02168 }
02169 }
02170 return false;
02171 }
02172
02173
02174
02175
02176
02177
02178
02179 static void
02180 cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id)
02181 {
02182 tree decl, old_scope;
02183
02184 old_scope = parser->scope;
02185 parser->scope = scope;
02186 decl = cp_parser_lookup_name_simple (parser, id);
02187 parser->scope = old_scope;
02188
02189
02190 if (TREE_CODE (decl) == TEMPLATE_DECL)
02191 error ("invalid use of template-name %qE without an argument list", decl);
02192 else if (TREE_CODE (id) == BIT_NOT_EXPR)
02193 error ("invalid use of destructor %qD as a type", id);
02194 else if (TREE_CODE (decl) == TYPE_DECL)
02195
02196 error ("invalid combination of multiple type-specifiers");
02197 else if (!parser->scope)
02198 {
02199
02200 error ("%qE does not name a type", id);
02201
02202
02203
02204
02205
02206
02207
02208 if (processing_template_decl && current_class_type
02209 && TYPE_BINFO (current_class_type))
02210 {
02211 tree b;
02212
02213 for (b = TREE_CHAIN (TYPE_BINFO (current_class_type));
02214 b;
02215 b = TREE_CHAIN (b))
02216 {
02217 tree base_type = BINFO_TYPE (b);
02218 if (CLASS_TYPE_P (base_type)
02219 && dependent_type_p (base_type))
02220 {
02221 tree field;
02222
02223
02224
02225 base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
02226 for (field = TYPE_FIELDS (base_type);
02227 field;
02228 field = TREE_CHAIN (field))
02229 if (TREE_CODE (field) == TYPE_DECL
02230 && DECL_NAME (field) == id)
02231 {
02232 inform ("(perhaps %<typename %T::%E%> was intended)",
02233 BINFO_TYPE (b), id);
02234 break;
02235 }
02236 if (field)
02237 break;
02238 }
02239 }
02240 }
02241 }
02242
02243
02244 else if (parser->scope != error_mark_node)
02245 {
02246 if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
02247 error ("%qE in namespace %qE does not name a type",
02248 id, parser->scope);
02249 else if (TYPE_P (parser->scope))
02250 error ("%qE in class %qT does not name a type", id, parser->scope);
02251 else
02252 gcc_unreachable ();
02253 }
02254 cp_parser_commit_to_tentative_parse (parser);
02255 }
02256
02257
02258
02259
02260
02261
02262
02263
02264
02265
02266
02267 static bool
02268 cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
02269 {
02270 tree id;
02271
02272 cp_parser_parse_tentatively (parser);
02273 id = cp_parser_id_expression (parser,
02274 false,
02275 true,
02276 NULL,
02277 true,
02278 false);
02279
02280
02281
02282 if (!cp_lexer_next_token_is (parser->lexer, CPP_NAME)
02283 || (parser->scope && TYPE_P (parser->scope)
02284 && dependent_type_p (parser->scope))
02285 || TREE_CODE (id) == TYPE_DECL)
02286 {
02287 cp_parser_abort_tentative_parse (parser);
02288 return false;
02289 }
02290 if (!cp_parser_parse_definitely (parser))
02291 return false;
02292
02293
02294 cp_parser_diagnose_invalid_type_name (parser, parser->scope, id);
02295
02296
02297 cp_parser_skip_to_end_of_block_or_statement (parser);
02298 return true;
02299 }
02300
02301
02302
02303
02304
02305
02306 static int
02307 cp_parser_skip_to_closing_parenthesis (cp_parser *parser,
02308 bool recovering,
02309 bool or_comma,
02310 bool consume_paren)
02311 {
02312 unsigned paren_depth = 0;
02313 unsigned brace_depth = 0;
02314
02315 if (recovering && !or_comma
02316 && cp_parser_uncommitted_to_tentative_parse_p (parser))
02317 return 0;
02318
02319 while (true)
02320 {
02321 cp_token * token = cp_lexer_peek_token (parser->lexer);
02322
02323 switch (token->type)
02324 {
02325 case CPP_EOF:
02326 case CPP_PRAGMA_EOL:
02327
02328 return 0;
02329
02330 case CPP_SEMICOLON:
02331
02332 if (!brace_depth)
02333 return 0;
02334 break;
02335
02336 case CPP_OPEN_BRACE:
02337 ++brace_depth;
02338 break;
02339 case CPP_CLOSE_BRACE:
02340 if (!brace_depth--)
02341 return 0;
02342 break;
02343
02344 case CPP_COMMA:
02345 if (recovering && or_comma && !brace_depth && !paren_depth)
02346 return -1;
02347 break;
02348
02349 case CPP_OPEN_PAREN:
02350 if (!brace_depth)
02351 ++paren_depth;
02352 break;
02353
02354 case CPP_CLOSE_PAREN:
02355 if (!brace_depth && !paren_depth--)
02356 {
02357 if (consume_paren)
02358 cp_lexer_consume_token (parser->lexer);
02359 return 1;
02360 }
02361 break;
02362
02363 default:
02364 break;
02365 }
02366
02367
02368 cp_lexer_consume_token (parser->lexer);
02369 }
02370 }
02371
02372
02373
02374
02375
02376 static void
02377 cp_parser_skip_to_end_of_statement (cp_parser* parser)
02378 {
02379 unsigned nesting_depth = 0;
02380
02381 while (true)
02382 {
02383 cp_token *token = cp_lexer_peek_token (parser->lexer);
02384
02385 switch (token->type)
02386 {
02387 case CPP_EOF:
02388 case CPP_PRAGMA_EOL:
02389
02390 return;
02391
02392 case CPP_SEMICOLON:
02393
02394
02395 if (!nesting_depth)
02396 return;
02397 break;
02398
02399 case CPP_CLOSE_BRACE:
02400
02401
02402
02403
02404
02405
02406
02407 if (nesting_depth == 0)
02408 return;
02409
02410
02411
02412
02413
02414
02415
02416
02417
02418
02419
02420 if (--nesting_depth == 0)
02421 {
02422 cp_lexer_consume_token (parser->lexer);
02423 return;
02424 }
02425
02426 case CPP_OPEN_BRACE:
02427 ++nesting_depth;
02428 break;
02429
02430 default:
02431 break;
02432 }
02433
02434
02435 cp_lexer_consume_token (parser->lexer);
02436 }
02437 }
02438
02439
02440
02441
02442
02443 static void
02444 cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
02445 {
02446
02447 if (!cp_parser_require (parser, CPP_SEMICOLON, "`;'"))
02448 {
02449
02450
02451 cp_parser_skip_to_end_of_statement (parser);
02452
02453 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
02454 cp_lexer_consume_token (parser->lexer);
02455 }
02456 }
02457
02458
02459
02460
02461 static void
02462 cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
02463 {
02464 int nesting_depth = 0;
02465
02466 while (nesting_depth >= 0)
02467 {
02468 cp_token *token = cp_lexer_peek_token (parser->lexer);
02469
02470 switch (token->type)
02471 {
02472 case CPP_EOF:
02473 case CPP_PRAGMA_EOL:
02474
02475 return;
02476
02477 case CPP_SEMICOLON:
02478
02479 if (!nesting_depth)
02480 nesting_depth = -1;
02481 break;
02482
02483 case CPP_CLOSE_BRACE:
02484
02485
02486 nesting_depth--;
02487 if (!nesting_depth)
02488 nesting_depth = -1;
02489 break;
02490
02491 case CPP_OPEN_BRACE:
02492
02493 nesting_depth++;
02494 break;
02495
02496 default:
02497 break;
02498 }
02499
02500
02501 cp_lexer_consume_token (parser->lexer);
02502 }
02503 }
02504
02505
02506
02507
02508 static void
02509 cp_parser_skip_to_closing_brace (cp_parser *parser)
02510 {
02511 unsigned nesting_depth = 0;
02512
02513 while (true)
02514 {
02515 cp_token *token = cp_lexer_peek_token (parser->lexer);
02516
02517 switch (token->type)
02518 {
02519 case CPP_EOF:
02520 case CPP_PRAGMA_EOL:
02521
02522 return;
02523
02524 case CPP_CLOSE_BRACE:
02525
02526
02527 if (nesting_depth-- == 0)
02528 return;
02529 break;
02530
02531 case CPP_OPEN_BRACE:
02532
02533
02534 ++nesting_depth;
02535 break;
02536
02537 default:
02538 break;
02539 }
02540
02541
02542 cp_lexer_consume_token (parser->lexer);
02543 }
02544 }
02545
02546
02547
02548
02549
02550 static void
02551 cp_parser_skip_to_pragma_eol (cp_parser* parser, cp_token *pragma_tok)
02552 {
02553 cp_token *token;
02554
02555 parser->lexer->in_pragma = false;
02556
02557 do
02558 token = cp_lexer_consume_token (parser->lexer);
02559 while (token->type != CPP_PRAGMA_EOL && token->type != CPP_EOF);
02560
02561
02562 cp_lexer_purge_tokens_after (parser->lexer, pragma_tok);
02563 }
02564
02565
02566
02567
02568 static void
02569 cp_parser_require_pragma_eol (cp_parser *parser, cp_token *pragma_tok)
02570 {
02571 parser->lexer->in_pragma = false;
02572 if (!cp_parser_require (parser, CPP_PRAGMA_EOL, "end of line"))
02573 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
02574 }
02575
02576
02577
02578
02579
02580 static tree
02581 cp_parser_make_typename_type (cp_parser *parser, tree scope, tree id)
02582 {
02583 tree result;
02584 if (TREE_CODE (id) == IDENTIFIER_NODE)
02585 {
02586 result = make_typename_type (scope, id, typename_type,
02587 tf_none);
02588 if (result == error_mark_node)
02589 cp_parser_diagnose_invalid_type_name (parser, scope, id);
02590 return result;
02591 }
02592 return make_typename_type (scope, id, typename_type, tf_error);
02593 }
02594
02595
02596
02597
02598 static cp_parser *
02599 cp_parser_new (void)
02600 {
02601 cp_parser *parser;
02602 cp_lexer *lexer;
02603 unsigned i;
02604
02605
02606
02607 lexer = cp_lexer_new_main ();
02608
02609
02610
02611 for (i = 0; i < sizeof (binops) / sizeof (binops[0]); i++)
02612 binops_by_token[binops[i].token_type] = binops[i];
02613
02614 parser = GGC_CNEW (cp_parser);
02615 parser->lexer = lexer;
02616 parser->context = cp_parser_context_new (NULL);
02617
02618
02619 parser->allow_gnu_extensions_p = 1;
02620
02621
02622
02623 parser->greater_than_is_operator_p = true;
02624
02625 parser->default_arg_ok_p = true;
02626
02627
02628 parser->integral_constant_expression_p = false;
02629 parser->allow_non_integral_constant_expression_p = false;
02630 parser->non_integral_constant_expression_p = false;
02631
02632
02633 parser->local_variables_forbidden_p = false;
02634
02635
02636 parser->in_unbraced_linkage_specification_p = false;
02637
02638
02639 parser->in_declarator_p = false;
02640
02641
02642 parser->in_template_argument_list_p = false;
02643
02644
02645 parser->in_statement = 0;
02646
02647
02648 parser->in_switch_statement_p = false;
02649
02650
02651 parser->in_type_id_in_expr_p = false;
02652
02653
02654 parser->implicit_extern_c = false;
02655
02656
02657 parser->translate_strings_p = true;
02658
02659
02660 parser->in_function_body = false;
02661
02662
02663 parser->unparsed_functions_queues = build_tree_list (NULL_TREE, NULL_TREE);
02664
02665
02666 parser->num_classes_being_defined = 0;
02667
02668
02669 parser->num_template_parameter_lists = 0;
02670
02671 return parser;
02672 }
02673
02674
02675
02676
02677
02678 static void
02679 cp_parser_push_lexer_for_tokens (cp_parser *parser, cp_token_cache *cache)
02680 {
02681 cp_lexer *lexer = cp_lexer_new_from_tokens (cache);
02682 lexer->next = parser->lexer;
02683 parser->lexer = lexer;
02684
02685
02686
02687 cp_lexer_set_source_position_from_token (lexer->next_token);
02688 }
02689
02690
02691
02692 static void
02693 cp_parser_pop_lexer (cp_parser *parser)
02694 {
02695 cp_lexer *lexer = parser->lexer;
02696 parser->lexer = lexer->next;
02697 cp_lexer_destroy (lexer);
02698
02699
02700
02701 cp_lexer_set_source_position_from_token (parser->lexer->next_token);
02702 }
02703
02704
02705
02706
02707
02708
02709 static tree
02710 cp_parser_identifier (cp_parser* parser)
02711 {
02712 cp_token *token;
02713
02714
02715 token = cp_parser_require (parser, CPP_NAME, "identifier");
02716
02717 return token ? token->u.value : error_mark_node;
02718 }
02719
02720
02721
02722
02723
02724
02725
02726
02727
02728
02729
02730
02731
02732
02733
02734 static tree
02735 cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok)
02736 {
02737 tree value;
02738 bool wide = false;
02739 size_t count;
02740 struct obstack str_ob;
02741 cpp_string str, istr, *strs;
02742 cp_token *tok;
02743
02744 tok = cp_lexer_peek_token (parser->lexer);
02745 if (!cp_parser_is_string_literal (tok))
02746 {
02747 cp_parser_error (parser, "expected string-literal");
02748 return error_mark_node;
02749 }
02750
02751
02752
02753 if (!cp_parser_is_string_literal
02754 (cp_lexer_peek_nth_token (parser->lexer, 2)))
02755 {
02756 cp_lexer_consume_token (parser->lexer);
02757
02758 str.text = (const unsigned char *)TREE_STRING_POINTER (tok->u.value);
02759 str.len = TREE_STRING_LENGTH (tok->u.value);
02760 count = 1;
02761 if (tok->type == CPP_WSTRING)
02762 wide = true;
02763
02764 strs = &str;
02765 }
02766 else
02767 {
02768 gcc_obstack_init (&str_ob);
02769 count = 0;
02770
02771 do
02772 {
02773 cp_lexer_consume_token (parser->lexer);
02774 count++;
02775 str.text = (unsigned char *)TREE_STRING_POINTER (tok->u.value);
02776 str.len = TREE_STRING_LENGTH (tok->u.value);
02777 if (tok->type == CPP_WSTRING)
02778 wide = true;
02779
02780 obstack_grow (&str_ob, &str, sizeof (cpp_string));
02781
02782 tok = cp_lexer_peek_token (parser->lexer);
02783 }
02784 while (cp_parser_is_string_literal (tok));
02785
02786 strs = (cpp_string *) obstack_finish (&str_ob);
02787 }
02788
02789 if (wide && !wide_ok)
02790 {
02791 cp_parser_error (parser, "a wide string is invalid in this context");
02792 wide = false;
02793 }
02794
02795 if ((translate ? cpp_interpret_string : cpp_interpret_string_notranslate)
02796 (parse_in, strs, count, &istr, wide))
02797 {
02798 value = build_string (istr.len, (char *)istr.text);
02799 free ((void *)istr.text);
02800
02801 TREE_TYPE (value) = wide ? wchar_array_type_node : char_array_type_node;
02802 value = fix_string_type (value);
02803 }
02804 else
02805
02806 value = error_mark_node;
02807
02808 if (count > 1)
02809 obstack_free (&str_ob, 0);
02810
02811 return value;
02812 }
02813
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823
02824 static bool
02825 cp_parser_translation_unit (cp_parser* parser)
02826 {
02827
02828
02829 static void *declarator_obstack_base;
02830
02831 bool success;
02832
02833
02834 if (!cp_error_declarator)
02835 {
02836 gcc_obstack_init (&declarator_obstack);
02837
02838 cp_error_declarator = make_declarator (cdk_error);
02839
02840 no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE);
02841
02842 declarator_obstack_base = obstack_next_free (&declarator_obstack);
02843 }
02844
02845 cp_parser_declaration_seq_opt (parser);
02846
02847
02848 if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
02849 {
02850
02851 cp_lexer_destroy (parser->lexer);
02852 parser->lexer = NULL;
02853
02854
02855
02856 if (parser->implicit_extern_c)
02857 {
02858 pop_lang_context ();
02859 parser->implicit_extern_c = false;
02860 }
02861
02862
02863 finish_translation_unit ();
02864
02865 success = true;
02866 }
02867 else
02868 {
02869 cp_parser_error (parser, "expected declaration");
02870 success = false;
02871 }
02872
02873
02874 gcc_assert (obstack_next_free (&declarator_obstack)
02875 == declarator_obstack_base);
02876
02877
02878 return success;
02879 }
02880
02881
02882
02883
02884
02885
02886
02887
02888
02889
02890
02891
02892
02893
02894
02895
02896
02897
02898
02899
02900
02901
02902
02903
02904
02905
02906
02907
02908
02909
02910
02911
02912
02913
02914 static tree
02915 cp_parser_primary_expression (cp_parser *parser,
02916 bool address_p,
02917 bool cast_p,
02918 bool template_arg_p,
02919 cp_id_kind *idk)
02920 {
02921 cp_token *token;
02922
02923
02924 *idk = CP_ID_KIND_NONE;
02925
02926
02927 token = cp_lexer_peek_token (parser->lexer);
02928 switch (token->type)
02929 {
02930
02931
02932
02933
02934
02935
02936 case CPP_CHAR:
02937 case CPP_WCHAR:
02938 case CPP_NUMBER:
02939 token = cp_lexer_consume_token (parser->lexer);
02940
02941
02942
02943 if (TREE_CODE (token->u.value) == REAL_CST
02944 && parser->integral_constant_expression_p
02945 && pedantic)
02946 {
02947
02948
02949
02950 if (cast_p)
02951 {
02952 cp_token *next_token;
02953
02954 next_token = cp_lexer_peek_token (parser->lexer);
02955 if (
02956
02957 next_token->type != CPP_COMMA
02958
02959 && next_token->type != CPP_CLOSE_BRACE
02960
02961 && next_token->type != CPP_SEMICOLON
02962
02963 && next_token->type != CPP_CLOSE_PAREN
02964
02965 && next_token->type != CPP_CLOSE_SQUARE
02966
02967 && (next_token->type != CPP_GREATER
02968 || parser->greater_than_is_operator_p))
02969 cast_p = false;
02970 }
02971
02972
02973
02974
02975
02976 if (!cast_p)
02977 cp_parser_non_integral_constant_expression
02978 (parser, "floating-point literal");
02979 }
02980 return token->u.value;
02981
02982 case CPP_STRING:
02983 case CPP_WSTRING:
02984
02985
02986
02987 return cp_parser_string_literal (parser,
02988 parser->translate_strings_p,
02989 true);
02990
02991 case CPP_OPEN_PAREN:
02992 {
02993 tree expr;
02994 bool saved_greater_than_is_operator_p;
02995
02996
02997 cp_lexer_consume_token (parser->lexer);
02998
02999
03000 saved_greater_than_is_operator_p
03001 = parser->greater_than_is_operator_p;
03002 parser->greater_than_is_operator_p = true;
03003
03004
03005 if (cp_parser_allow_gnu_extensions_p (parser)
03006 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
03007 {
03008
03009 if (pedantic)
03010 pedwarn ("ISO C++ forbids braced-groups within expressions");
03011
03012
03013
03014
03015
03016
03017
03018 if (!parser->in_function_body)
03019 error ("statement-expressions are allowed only inside functions");
03020
03021 expr = begin_stmt_expr ();
03022
03023 cp_parser_compound_statement (parser, expr, false);
03024
03025 expr = finish_stmt_expr (expr, false);
03026 }
03027 else
03028 {
03029
03030 expr = cp_parser_expression (parser, cast_p);
03031
03032
03033
03034
03035
03036 finish_parenthesized_expr (expr);
03037 }
03038
03039
03040 parser->greater_than_is_operator_p
03041 = saved_greater_than_is_operator_p;
03042
03043 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"))
03044 cp_parser_skip_to_end_of_statement (parser);
03045
03046 return expr;
03047 }
03048
03049 case CPP_KEYWORD:
03050 switch (token->keyword)
03051 {
03052
03053 case RID_TRUE:
03054 cp_lexer_consume_token (parser->lexer);
03055 return boolean_true_node;
03056 case RID_FALSE:
03057 cp_lexer_consume_token (parser->lexer);
03058 return boolean_false_node;
03059
03060
03061 case RID_NULL:
03062 cp_lexer_consume_token (parser->lexer);
03063 return null_node;
03064
03065
03066 case RID_THIS:
03067 cp_lexer_consume_token (parser->lexer);
03068 if (parser->local_variables_forbidden_p)
03069 {
03070 error ("%<this%> may not be used in this context");
03071 return error_mark_node;
03072 }
03073
03074 if (cp_parser_non_integral_constant_expression (parser,
03075 "`this'"))
03076 return error_mark_node;
03077 return finish_this_expr ();
03078
03079
03080
03081 case RID_OPERATOR:
03082 goto id_expression;
03083
03084 case RID_FUNCTION_NAME:
03085 case RID_PRETTY_FUNCTION_NAME:
03086 case RID_C99_FUNCTION_NAME:
03087
03088
03089
03090
03091
03092
03093
03094 token = cp_lexer_consume_token (parser->lexer);
03095
03096 return finish_fname (token->u.value);
03097
03098 case RID_VA_ARG:
03099 {
03100 tree expression;
03101 tree type;
03102
03103
03104
03105 cp_lexer_consume_token (parser->lexer);
03106
03107 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
03108
03109 expression = cp_parser_assignment_expression (parser,
03110 false);
03111
03112 cp_parser_require (parser, CPP_COMMA, "`,'");
03113
03114 type = cp_parser_type_id (parser);
03115
03116 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
03117
03118
03119 if (cp_parser_non_integral_constant_expression (parser,
03120 "`va_arg'"))
03121 return error_mark_node;
03122 return build_x_va_arg (expression, type);
03123 }
03124
03125 case RID_OFFSETOF:
03126 return cp_parser_builtin_offsetof (parser);
03127
03128
03129 case RID_AT_ENCODE:
03130 case RID_AT_PROTOCOL:
03131 case RID_AT_SELECTOR:
03132 return cp_parser_objc_expression (parser);
03133
03134 default:
03135 cp_parser_error (parser, "expected primary-expression");
03136 return error_mark_node;
03137 }
03138
03139
03140
03141
03142 case CPP_NAME:
03143 case CPP_SCOPE:
03144 case CPP_TEMPLATE_ID:
03145 case CPP_NESTED_NAME_SPECIFIER:
03146 {
03147 tree id_expression;
03148 tree decl;
03149 const char *error_msg;
03150 bool template_p;
03151 bool done;
03152
03153 id_expression:
03154
03155 id_expression
03156 = cp_parser_id_expression (parser,
03157 false,
03158 true,
03159 &template_p,
03160 false,
03161 false);
03162 if (id_expression == error_mark_node)
03163 return error_mark_node;
03164 token = cp_lexer_peek_token (parser->lexer);
03165 done = (token->type != CPP_OPEN_SQUARE
03166 && token->type != CPP_OPEN_PAREN
03167 && token->type != CPP_DOT
03168 && token->type != CPP_DEREF
03169 && token->type != CPP_PLUS_PLUS
03170 && token->type != CPP_MINUS_MINUS);
03171
03172
03173
03174 if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR
03175 || TREE_CODE (id_expression) == TYPE_DECL)
03176 decl = id_expression;
03177
03178 else
03179 {
03180 tree ambiguous_decls;
03181
03182 decl = cp_parser_lookup_name (parser, id_expression,
03183 none_type,
03184 template_p,
03185 false,
03186 true,
03187 &ambiguous_decls);
03188
03189
03190 if (ambiguous_decls)
03191 return error_mark_node;
03192
03193
03194
03195 decl = objc_lookup_ivar (decl, id_expression);
03196
03197
03198
03199 if (TREE_CODE (decl) == SCOPE_REF)
03200 return decl;
03201
03202
03203 if (parser->local_variables_forbidden_p
03204 && local_variable_p (decl))
03205 {
03206
03207
03208
03209
03210
03211
03212
03213
03214
03215
03216
03217
03218
03219 decl = check_for_out_of_scope_variable (decl);
03220 if (local_variable_p (decl))
03221 {
03222 error ("local variable %qD may not appear in this context",
03223 decl);
03224 return error_mark_node;
03225 }
03226 }
03227 }
03228
03229 decl = (finish_id_expression
03230 (id_expression, decl, parser->scope,
03231 idk,
03232 parser->integral_constant_expression_p,
03233 parser->allow_non_integral_constant_expression_p,
03234 &parser->non_integral_constant_expression_p,
03235 template_p, done, address_p,
03236 template_arg_p,
03237 &error_msg));
03238 if (error_msg)
03239 cp_parser_error (parser, error_msg);
03240 return decl;
03241 }
03242
03243
03244 default:
03245
03246 if (c_dialect_objc ()
03247 && (token->type == CPP_OPEN_SQUARE || token->type == CPP_OBJC_STRING))
03248 return cp_parser_objc_expression (parser);
03249
03250 cp_parser_error (parser, "expected primary-expression");
03251 return error_mark_node;
03252 }
03253 }
03254
03255
03256
03257
03258
03259
03260
03261
03262
03263
03264
03265
03266
03267
03268
03269
03270
03271
03272
03273
03274
03275
03276
03277
03278
03279
03280
03281
03282
03283
03284
03285
03286
03287
03288
03289 static tree
03290 cp_parser_id_expression (cp_parser *parser,
03291 bool template_keyword_p,
03292 bool check_dependency_p,
03293 bool *template_p,
03294 bool declarator_p,
03295 bool optional_p)
03296 {
03297 bool global_scope_p;
03298 bool nested_name_specifier_p;
03299
03300
03301 if (template_p)
03302 *template_p = template_keyword_p;
03303
03304
03305 global_scope_p
03306 = (cp_parser_global_scope_opt (parser, false)
03307 != NULL_TREE);
03308
03309 nested_name_specifier_p
03310 = (cp_parser_nested_name_specifier_opt (parser,
03311 false,
03312 check_dependency_p,
03313 false,
03314 declarator_p)
03315 != NULL_TREE);
03316
03317
03318 if (nested_name_specifier_p)
03319 {
03320 tree saved_scope;
03321 tree saved_object_scope;
03322 tree saved_qualifying_scope;
03323 tree unqualified_id;
03324 bool is_template;
03325
03326
03327 if (!template_p)
03328 template_p = &is_template;
03329 *template_p = cp_parser_optional_template_keyword (parser);
03330
03331
03332 saved_scope = parser->scope;
03333 saved_object_scope = parser->object_scope;
03334 saved_qualifying_scope = parser->qualifying_scope;
03335
03336 unqualified_id = cp_parser_unqualified_id (parser, *template_p,
03337 check_dependency_p,
03338 declarator_p,
03339 false);
03340
03341 parser->scope = saved_scope;
03342 parser->object_scope = saved_object_scope;
03343 parser->qualifying_scope = saved_qualifying_scope;
03344
03345 return unqualified_id;
03346 }
03347
03348
03349 else if (global_scope_p)
03350 {
03351 cp_token *token;
03352 tree id;
03353
03354
03355 token = cp_lexer_peek_token (parser->lexer);
03356
03357
03358
03359
03360 if (token->type == CPP_NAME
03361 && !cp_parser_nth_token_starts_template_argument_list_p
03362 (parser, 2))
03363 return cp_parser_identifier (parser);
03364
03365 cp_parser_parse_tentatively (parser);
03366
03367 id = cp_parser_template_id (parser,
03368 false,
03369 true,
03370 declarator_p);
03371
03372 if (cp_parser_parse_definitely (parser))
03373 return id;
03374
03375
03376
03377 token = cp_lexer_peek_token (parser->lexer);
03378
03379 switch (token->type)
03380 {
03381 case CPP_NAME:
03382 return cp_parser_identifier (parser);
03383
03384 case CPP_KEYWORD:
03385 if (token->keyword == RID_OPERATOR)
03386 return cp_parser_operator_function_id (parser);
03387
03388
03389 default:
03390 cp_parser_error (parser, "expected id-expression");
03391 return error_mark_node;
03392 }
03393 }
03394 else
03395 return cp_parser_unqualified_id (parser, template_keyword_p,
03396 true,
03397 declarator_p,
03398 optional_p);
03399 }
03400
03401
03402
03403
03404
03405
03406
03407
03408
03409
03410
03411
03412
03413
03414
03415
03416
03417
03418
03419
03420
03421
03422
03423 static tree
03424 cp_parser_unqualified_id (cp_parser* parser,
03425 bool template_keyword_p,
03426 bool check_dependency_p,
03427 bool declarator_p,
03428 bool optional_p)
03429 {
03430 cp_token *token;
03431
03432
03433 token = cp_lexer_peek_token (parser->lexer);
03434
03435 switch (token->type)
03436 {
03437 case CPP_NAME:
03438 {
03439 tree id;
03440
03441
03442
03443 cp_parser_parse_tentatively (parser);
03444
03445 id = cp_parser_template_id (parser, template_keyword_p,
03446 check_dependency_p,
03447 declarator_p);
03448
03449 if (cp_parser_parse_definitely (parser))
03450 return id;
03451
03452 return cp_parser_identifier (parser);
03453 }
03454
03455 case CPP_TEMPLATE_ID:
03456 return cp_parser_template_id (parser, template_keyword_p,
03457 check_dependency_p,
03458 declarator_p);
03459
03460 case CPP_COMPL:
03461 {
03462 tree type_decl;
03463 tree qualifying_scope;
03464 tree object_scope;
03465 tree scope;
03466 bool done;
03467
03468
03469 cp_lexer_consume_token (parser->lexer);
03470
03471
03472
03473
03474
03475
03476
03477
03478
03479
03480
03481
03482
03483
03484
03485
03486
03487
03488
03489
03490
03491
03492
03493
03494
03495
03496
03497
03498
03499
03500
03501
03502
03503
03504
03505 scope = parser->scope;
03506 object_scope = parser->object_scope;
03507 qualifying_scope = parser->qualifying_scope;
03508
03509
03510 if (scope == error_mark_node)
03511 {
03512 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
03513 cp_lexer_consume_token (parser->lexer);
03514 return error_mark_node;
03515 }
03516 if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
03517 {
03518 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
03519 error ("scope %qT before %<~%> is not a class-name", scope);
03520 cp_parser_simulate_error (parser);
03521 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
03522 cp_lexer_consume_token (parser->lexer);
03523 return error_mark_node;
03524 }
03525 gcc_assert (!scope || TYPE_P (scope));
03526
03527
03528 token = cp_lexer_peek_token (parser->lexer);
03529 if (scope
03530 && token->type == CPP_NAME
03531 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
03532 == CPP_OPEN_PAREN)
03533 && constructor_name_p (token->u.value, scope))
03534 {
03535 cp_lexer_consume_token (parser->lexer);
03536 return build_nt (BIT_NOT_EXPR, scope);
03537 }
03538
03539
03540
03541 done = false;
03542 type_decl = NULL_TREE;
03543 if (scope)
03544 {
03545 cp_parser_parse_tentatively (parser);
03546 type_decl = cp_parser_class_name (parser,
03547 false,
03548 false,
03549 none_type,
03550 false,
03551 false,
03552 declarator_p);
03553 if (cp_parser_parse_definitely (parser))
03554 done = true;
03555 }
03556
03557 if (!done && scope && qualifying_scope)
03558 {
03559 cp_parser_parse_tentatively (parser);
03560 parser->scope = qualifying_scope;
03561 parser->object_scope = NULL_TREE;
03562 parser->qualifying_scope = NULL_TREE;
03563 type_decl
03564 = cp_parser_class_name (parser,
03565 false,
03566 false,
03567 none_type,
03568 false,
03569 false,
03570 declarator_p);
03571 if (cp_parser_parse_definitely (parser))
03572 done = true;
03573 }
03574
03575 else if (!done && object_scope)
03576 {
03577 cp_parser_parse_tentatively (parser);
03578 parser->scope = object_scope;
03579 parser->object_scope = NULL_TREE;
03580 parser->qualifying_scope = NULL_TREE;
03581 type_decl
03582 = cp_parser_class_name (parser,
03583 false,
03584 false,
03585 none_type,
03586 false,
03587 false,
03588 declarator_p);
03589 if (cp_parser_parse_definitely (parser))
03590 done = true;
03591 }
03592
03593 if (!done)
03594 {
03595 parser->scope = NULL_TREE;
03596 parser->object_scope = NULL_TREE;
03597 parser->qualifying_scope = NULL_TREE;
03598 type_decl
03599 = cp_parser_class_name (parser,
03600 false,
03601 false,
03602 none_type,
03603 false,
03604 false,
03605 declarator_p);
03606 }
03607
03608
03609
03610
03611 if (type_decl == error_mark_node && scope)
03612 return build_nt (BIT_NOT_EXPR, scope);
03613 else if (type_decl == error_mark_node)
03614 return error_mark_node;
03615
03616
03617 if (declarator_p && scope && !check_dtor_name (scope, type_decl))
03618 {
03619 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
03620 error ("declaration of %<~%T%> as member of %qT",
03621 type_decl, scope);
03622 cp_parser_simulate_error (parser);
03623 return error_mark_node;
03624 }
03625
03626
03627
03628
03629
03630 if (declarator_p
03631 && !DECL_IMPLICIT_TYPEDEF_P (type_decl)
03632 && !DECL_SELF_REFERENCE_P (type_decl)
03633 && !cp_parser_uncommitted_to_tentative_parse_p (parser))
03634 error ("typedef-name %qD used as destructor declarator",
03635 type_decl);
03636
03637 return build_nt (BIT_NOT_EXPR, TREE_TYPE (type_decl));
03638 }
03639
03640 case CPP_KEYWORD:
03641 if (token->keyword == RID_OPERATOR)
03642 {
03643 tree id;
03644
03645
03646 cp_parser_parse_tentatively (parser);
03647
03648 id = cp_parser_template_id (parser, template_keyword_p,
03649 true,
03650 declarator_p);
03651
03652 if (cp_parser_parse_definitely (parser))
03653 return id;
03654
03655
03656 cp_parser_parse_tentatively (parser);
03657
03658 id = cp_parser_operator_function_id (parser);
03659
03660 if (!cp_parser_parse_definitely (parser))
03661 id = cp_parser_conversion_function_id (parser);
03662
03663 return id;
03664 }
03665
03666
03667 default:
03668 if (optional_p)
03669 return NULL_TREE;
03670 cp_parser_error (parser, "expected unqualified-id");
03671 return error_mark_node;
03672 }
03673 }
03674
03675
03676
03677
03678
03679
03680
03681
03682
03683
03684
03685
03686
03687
03688
03689
03690
03691
03692
03693
03694 static tree
03695 cp_parser_nested_name_specifier_opt (cp_parser *parser,
03696 bool typename_keyword_p,
03697 bool check_dependency_p,
03698 bool type_p,
03699 bool is_declaration)
03700 {
03701 bool success = false;
03702 cp_token_position start = 0;
03703 cp_token *token;
03704
03705
03706 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
03707 {
03708 start = cp_lexer_token_position (parser->lexer, false);
03709 push_deferring_access_checks (dk_deferred);
03710 }
03711
03712 while (true)
03713 {
03714 tree new_scope;
03715 tree old_scope;
03716 tree saved_qualifying_scope;
03717 bool template_keyword_p;
03718
03719
03720
03721 token = cp_lexer_peek_token (parser->lexer);
03722
03723
03724
03725 if (token->type == CPP_NESTED_NAME_SPECIFIER)
03726 {
03727
03728 cp_parser_pre_parsed_nested_name_specifier (parser);
03729
03730
03731
03732 if (is_declaration
03733 && TREE_CODE (parser->scope) == TYPENAME_TYPE)
03734 {
03735 new_scope = resolve_typename_type (parser->scope,
03736 false);
03737 if (new_scope != error_mark_node)
03738 parser->scope = new_scope;
03739 }
03740 success = true;
03741 continue;
03742 }
03743
03744
03745
03746
03747 if (success && token->keyword == RID_TEMPLATE)
03748 ;
03749
03750 else if (token->type == CPP_TEMPLATE_ID)
03751 ;
03752 else
03753 {
03754
03755
03756 if (token->type != CPP_NAME)
03757 break;
03758
03759
03760
03761 token = cp_lexer_peek_nth_token (parser->lexer, 2);
03762 if (token->type != CPP_SCOPE
03763 && !cp_parser_nth_token_starts_template_argument_list_p
03764 (parser, 2))
03765 break;
03766 }
03767
03768
03769
03770 cp_parser_parse_tentatively (parser);
03771
03772
03773
03774 if (success)
03775 template_keyword_p = cp_parser_optional_template_keyword (parser);
03776 else
03777 template_keyword_p = false;
03778
03779
03780
03781 old_scope = parser->scope;
03782 saved_qualifying_scope = parser->qualifying_scope;
03783
03784
03785
03786
03787 if (is_declaration
03788 && !typename_keyword_p
03789 && parser->scope
03790 && TREE_CODE (parser->scope) == TYPENAME_TYPE)
03791 parser->scope = resolve_typename_type (parser->scope,
03792 false);
03793
03794 new_scope
03795 = cp_parser_class_or_namespace_name (parser,
03796 typename_keyword_p,
03797 template_keyword_p,
03798 check_dependency_p,
03799 type_p,
03800 is_declaration);
03801
03802 cp_parser_require (parser, CPP_SCOPE, "`::'");
03803
03804
03805
03806 if (!cp_parser_parse_definitely (parser))
03807 {
03808 bool error_p = false;
03809
03810
03811
03812
03813 parser->scope = old_scope;
03814 parser->qualifying_scope = saved_qualifying_scope;
03815 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
03816 break;
03817
03818
03819
03820 while (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
03821 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
03822 == CPP_SCOPE)
03823 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
03824 != CPP_COMPL))
03825 {
03826 token = cp_lexer_consume_token (parser->lexer);
03827 if (!error_p)
03828 {
03829 if (!token->ambiguous_p)
03830 {
03831 tree decl;
03832 tree ambiguous_decls;
03833
03834 decl = cp_parser_lookup_name (parser, token->u.value,
03835 none_type,
03836 false,
03837 false,
03838 true,
03839 &ambiguous_decls);
03840 if (TREE_CODE (decl) == TEMPLATE_DECL)
03841 error ("%qD used without template parameters", decl);
03842 else if (ambiguous_decls)
03843 {
03844 error ("reference to %qD is ambiguous",
03845 token->u.value);
03846 print_candidates (ambiguous_decls);
03847 decl = error_mark_node;
03848 }
03849 else
03850 cp_parser_name_lookup_error
03851 (parser, token->u.value, decl,
03852 "is not a class or namespace");
03853 }
03854 parser->scope = error_mark_node;
03855 error_p = true;
03856
03857
03858
03859
03860
03861
03862
03863
03864 success = true;
03865 }
03866 cp_lexer_consume_token (parser->lexer);
03867 }
03868 break;
03869 }
03870
03871 success = true;
03872
03873 if (TREE_CODE (new_scope) == TYPE_DECL)
03874 new_scope = TREE_TYPE (new_scope);
03875
03876 if (template_keyword_p
03877 && !(CLASS_TYPE_P (new_scope)
03878 && ((CLASSTYPE_USE_TEMPLATE (new_scope)
03879 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (new_scope)))
03880 || CLASSTYPE_IS_TEMPLATE (new_scope)))
03881 && !(TREE_CODE (new_scope) == TYPENAME_TYPE
03882 && (TREE_CODE (TYPENAME_TYPE_FULLNAME (new_scope))
03883 == TEMPLATE_ID_EXPR)))
03884 pedwarn (TYPE_P (new_scope)
03885 ? "%qT is not a template"
03886 : "%qD is not a template",
03887 new_scope);
03888
03889
03890 if (TYPE_P (new_scope)
03891
03892
03893 && !COMPLETE_TYPE_P (new_scope)
03894
03895 && !dependent_type_p (new_scope))
03896 new_scope = complete_type (new_scope);
03897
03898
03899 parser->scope = new_scope;
03900 }
03901
03902
03903
03904
03905
03906
03907 if (success && start)
03908 {
03909 cp_token *token;
03910
03911 token = cp_lexer_token_at (parser->lexer, start);
03912
03913 token->type = CPP_NESTED_NAME_SPECIFIER;
03914
03915
03916 token->u.tree_check_value = GGC_CNEW (struct tree_check);
03917 token->u.tree_check_value->value = parser->scope;
03918 token->u.tree_check_value->checks = get_deferred_access_checks ();
03919 token->u.tree_check_value->qualifying_scope =
03920 parser->qualifying_scope;
03921 token->keyword = RID_MAX;
03922
03923
03924 cp_lexer_purge_tokens_after (parser->lexer, start);
03925 }
03926
03927 if (start)
03928 pop_to_parent_deferring_access_checks ();
03929
03930 return success ? parser->scope : NULL_TREE;
03931 }
03932
03933
03934
03935
03936
03937
03938 static tree
03939 cp_parser_nested_name_specifier (cp_parser *parser,
03940 bool typename_keyword_p,
03941 bool check_dependency_p,
03942 bool type_p,
03943 bool is_declaration)
03944 {
03945 tree scope;
03946
03947
03948 scope = cp_parser_nested_name_specifier_opt (parser,
03949 typename_keyword_p,
03950 check_dependency_p,
03951 type_p,
03952 is_declaration);
03953
03954 if (!scope)
03955 {
03956 cp_parser_error (parser, "expected nested-name-specifier");
03957 parser->scope = NULL_TREE;
03958 }
03959
03960 return scope;
03961 }
03962
03963
03964
03965
03966
03967
03968
03969
03970
03971
03972
03973
03974
03975
03976
03977
03978
03979
03980 static tree
03981 cp_parser_class_or_namespace_name (cp_parser *parser,
03982 bool typename_keyword_p,
03983 bool template_keyword_p,
03984 bool check_dependency_p,
03985 bool type_p,
03986 bool is_declaration)
03987 {
03988 tree saved_scope;
03989 tree saved_qualifying_scope;
03990 tree saved_object_scope;
03991 tree scope;
03992 bool only_class_p;
03993
03994
03995
03996
03997 saved_scope = parser->scope;
03998 saved_qualifying_scope = parser->qualifying_scope;
03999 saved_object_scope = parser->object_scope;
04000
04001
04002 only_class_p = template_keyword_p || (saved_scope && TYPE_P (saved_scope));
04003 if (!only_class_p)
04004 cp_parser_parse_tentatively (parser);
04005 scope = cp_parser_class_name (parser,
04006 typename_keyword_p,
04007 template_keyword_p,
04008 type_p ? class_type : none_type,
04009 check_dependency_p,
04010 false,
04011 is_declaration);
04012
04013 if (!only_class_p && !cp_parser_parse_definitely (parser))
04014 {
04015
04016 parser->scope = saved_scope;
04017 parser->qualifying_scope = saved_qualifying_scope;
04018 parser->object_scope = saved_object_scope;
04019
04020
04021
04022
04023 if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME)
04024 || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
04025 return error_mark_node;
04026 scope = cp_parser_namespace_name (parser);
04027 }
04028
04029 return scope;
04030 }
04031
04032
04033
04034
04035
04036
04037
04038
04039
04040
04041
04042
04043
04044
04045
04046
04047
04048
04049
04050
04051
04052
04053
04054
04055
04056
04057
04058
04059
04060
04061
04062
04063
04064
04065
04066
04067
04068
04069
04070
04071 static tree
04072 cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p)
04073 {
04074 cp_token *token;
04075 enum rid keyword;
04076 cp_id_kind idk = CP_ID_KIND_NONE;
04077 tree postfix_expression = NULL_TREE;
04078
04079
04080 token = cp_lexer_peek_token (parser->lexer);
04081
04082 keyword = token->keyword;
04083 switch (keyword)
04084 {
04085 case RID_DYNCAST:
04086 case RID_STATCAST:
04087 case RID_REINTCAST:
04088 case RID_CONSTCAST:
04089 {
04090 tree type;
04091 tree expression;
04092 const char *saved_message;
04093
04094
04095
04096
04097 cp_lexer_consume_token (parser->lexer);
04098
04099
04100 saved_message = parser->type_definition_forbidden_message;
04101 parser->type_definition_forbidden_message
04102 = "types may not be defined in casts";
04103
04104
04105 cp_parser_require (parser, CPP_LESS, "`<'");
04106
04107 type = cp_parser_type_id (parser);
04108
04109 cp_parser_require (parser, CPP_GREATER, "`>'");
04110
04111 parser->type_definition_forbidden_message = saved_message;
04112
04113
04114 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
04115 expression = cp_parser_expression (parser, true);
04116 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
04117
04118
04119
04120 if (!cast_valid_in_integral_constant_expression_p (type)
04121 && (cp_parser_non_integral_constant_expression
04122 (parser,
04123 "a cast to a type other than an integral or "
04124 "enumeration type")))
04125 return error_mark_node;
04126
04127 switch (keyword)
04128 {
04129 case RID_DYNCAST:
04130 postfix_expression
04131 = build_dynamic_cast (type, expression);
04132 break;
04133 case RID_STATCAST:
04134 postfix_expression
04135 = build_static_cast (type, expression);
04136 break;
04137 case RID_REINTCAST:
04138 postfix_expression
04139 = build_reinterpret_cast (type, expression);
04140 break;
04141 case RID_CONSTCAST:
04142 postfix_expression
04143 = build_const_cast (type, expression);
04144 break;
04145 default:
04146 gcc_unreachable ();
04147 }
04148 }
04149 break;
04150
04151 case RID_TYPEID:
04152 {
04153 tree type;
04154 const char *saved_message;
04155 bool saved_in_type_id_in_expr_p;
04156
04157
04158 cp_lexer_consume_token (parser->lexer);
04159
04160 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
04161
04162 saved_message = parser->type_definition_forbidden_message;
04163 parser->type_definition_forbidden_message
04164 = "types may not be defined in a `typeid\' expression";
04165
04166
04167 cp_parser_parse_tentatively (parser);
04168
04169 saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
04170 parser->in_type_id_in_expr_p = true;
04171 type = cp_parser_type_id (parser);
04172 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
04173
04174
04175
04176 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
04177
04178 if (cp_parser_parse_definitely (parser))
04179 postfix_expression = get_typeid (type);
04180
04181 else
04182 {
04183 tree expression;
04184
04185
04186 expression = cp_parser_expression (parser, false);
04187
04188 postfix_expression = build_typeid (expression);
04189
04190 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
04191 }
04192
04193 parser->type_definition_forbidden_message = saved_message;
04194
04195 if (cp_parser_non_integral_constant_expression(parser,
04196 "`typeid' operator"))
04197 return error_mark_node;
04198 }
04199 break;
04200
04201 case RID_TYPENAME:
04202 {
04203 tree type;
04204
04205
04206 type = cp_parser_elaborated_type_specifier (parser,
04207 false,
04208 false);
04209 postfix_expression = cp_parser_functional_cast (parser, type);
04210 }
04211 break;
04212
04213 default:
04214 {
04215 tree type;
04216
04217
04218
04219
04220
04221 cp_parser_parse_tentatively (parser);
04222
04223 type = cp_parser_simple_type_specifier (parser,
04224 NULL,
04225 CP_PARSER_FLAGS_NONE);
04226
04227 if (!cp_parser_error_occurred (parser))
04228 postfix_expression
04229 = cp_parser_functional_cast (parser, type);
04230
04231 if (cp_parser_parse_definitely (parser))
04232 break;
04233
04234
04235
04236 if (cp_parser_allow_gnu_extensions_p (parser)
04237 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
04238 {
04239 VEC(constructor_elt,gc) *initializer_list = NULL;
04240 bool saved_in_type_id_in_expr_p;
04241
04242 cp_parser_parse_tentatively (parser);
04243
04244 cp_lexer_consume_token (parser->lexer);
04245
04246 saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
04247 parser->in_type_id_in_expr_p = true;
04248 type = cp_parser_type_id (parser);
04249 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
04250
04251 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
04252
04253 cp_parser_require (parser, CPP_OPEN_BRACE, "`{'");
04254
04255
04256 if (!cp_parser_error_occurred (parser))
04257 {
04258 bool non_constant_p;
04259
04260 initializer_list
04261 = cp_parser_initializer_list (parser, &non_constant_p);
04262
04263 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
04264 cp_lexer_consume_token (parser->lexer);
04265
04266 cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'");
04267 }
04268
04269
04270 if (cp_parser_parse_definitely (parser))
04271 {
04272
04273
04274 if (pedantic)
04275 pedwarn ("ISO C++ forbids compound-literals");
04276
04277
04278
04279
04280
04281
04282
04283
04284
04285 if (cp_parser_non_integral_constant_expression
04286 (parser, "non-constant compound literals"))
04287 {
04288 postfix_expression = error_mark_node;
04289 break;
04290 }
04291
04292 postfix_expression
04293 = finish_compound_literal (type, initializer_list);
04294 break;
04295 }
04296 }
04297
04298
04299 postfix_expression
04300 = cp_parser_primary_expression (parser, address_p, cast_p,
04301 false,
04302 &idk);
04303 }
04304 break;
04305 }
04306
04307
04308 while (true)
04309 {
04310 if (idk == CP_ID_KIND_UNQUALIFIED
04311 && TREE_CODE (postfix_expression) == IDENTIFIER_NODE
04312 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
04313
04314 postfix_expression
04315 = unqualified_name_lookup_error (postfix_expression);
04316
04317
04318 token = cp_lexer_peek_token (parser->lexer);
04319
04320 switch (token->type)
04321 {
04322 case CPP_OPEN_SQUARE:
04323 postfix_expression
04324 = cp_parser_postfix_open_square_expression (parser,
04325 postfix_expression,
04326 false);
04327 idk = CP_ID_KIND_NONE;
04328 break;
04329
04330 case CPP_OPEN_PAREN:
04331
04332 {
04333 bool koenig_p;
04334 bool is_builtin_constant_p;
04335 bool saved_integral_constant_expression_p = false;
04336 bool saved_non_integral_constant_expression_p = false;
04337 tree args;
04338
04339 is_builtin_constant_p
04340 = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
04341 if (is_builtin_constant_p)
04342 {
04343
04344
04345 saved_integral_constant_expression_p
04346 = parser->integral_constant_expression_p;
04347 saved_non_integral_constant_expression_p
04348 = parser->non_integral_constant_expression_p;
04349 parser->integral_constant_expression_p = false;
04350 }
04351 args = (cp_parser_parenthesized_expression_list
04352 (parser, false,
04353 false,
04354 NULL));
04355 if (is_builtin_constant_p)
04356 {
04357 parser->integral_constant_expression_p
04358 = saved_integral_constant_expression_p;
04359 parser->non_integral_constant_expression_p
04360 = saved_non_integral_constant_expression_p;
04361 }
04362
04363 if (args == error_mark_node)
04364 {
04365 postfix_expression = error_mark_node;
04366 break;
04367 }
04368
04369
04370
04371 if (! builtin_valid_in_constant_expr_p (postfix_expression)
04372 && cp_parser_non_integral_constant_expression (parser,
04373 "a function call"))
04374 {
04375 postfix_expression = error_mark_node;
04376 break;
04377 }
04378
04379 koenig_p = false;
04380 if (idk == CP_ID_KIND_UNQUALIFIED)
04381 {
04382 if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE)
04383 {
04384 if (args)
04385 {
04386 koenig_p = true;
04387 postfix_expression
04388 = perform_koenig_lookup (postfix_expression, args);
04389 }
04390 else
04391 postfix_expression
04392 = unqualified_fn_lookup_error (postfix_expression);
04393 }
04394
04395
04396
04397 else if (args && is_overloaded_fn (postfix_expression))
04398 {
04399 tree fn = get_first_fn (postfix_expression);
04400
04401 if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
04402 fn = OVL_CURRENT (TREE_OPERAND (fn, 0));
04403
04404
04405
04406
04407 if (!DECL_FUNCTION_MEMBER_P (fn))
04408 {
04409 koenig_p = true;
04410 postfix_expression
04411 = perform_koenig_lookup (postfix_expression, args);
04412 }
04413 }
04414 }
04415
04416 if (TREE_CODE (postfix_expression) == COMPONENT_REF)
04417 {
04418 tree instance = TREE_OPERAND (postfix_expression, 0);
04419 tree fn = TREE_OPERAND (postfix_expression, 1);
04420
04421 if (processing_template_decl
04422 && (type_dependent_expression_p (instance)
04423 || (!BASELINK_P (fn)
04424 && TREE_CODE (fn) != FIELD_DECL)
04425 || type_dependent_expression_p (fn)
04426 || any_type_dependent_arguments_p (args)))
04427 {
04428 postfix_expression
04429 = build_min_nt (CALL_EXPR, postfix_expression,
04430 args, NULL_TREE);
04431 break;
04432 }
04433
04434 if (BASELINK_P (fn))
04435 postfix_expression
04436 = (build_new_method_call
04437 (instance, fn, args, NULL_TREE,
04438 (idk == CP_ID_KIND_QUALIFIED
04439 ? LOOKUP_NONVIRTUAL : LOOKUP_NORMAL),
04440 NULL));
04441 else
04442 postfix_expression
04443 = finish_call_expr (postfix_expression, args,
04444 false,
04445 false);
04446 }
04447 else if (TREE_CODE (postfix_expression) == OFFSET_REF
04448 || TREE_CODE (postfix_expression) == MEMBER_REF
04449 || TREE_CODE (postfix_expression) == DOTSTAR_EXPR)
04450 postfix_expression = (build_offset_ref_call_from_tree
04451 (postfix_expression, args));
04452 else if (idk == CP_ID_KIND_QUALIFIED)
04453
04454
04455 postfix_expression
04456 = finish_call_expr (postfix_expression, args,
04457 true,
04458 koenig_p);
04459 else
04460
04461 postfix_expression
04462 = finish_call_expr (postfix_expression, args,
04463 false,
04464 koenig_p);
04465
04466
04467 idk = CP_ID_KIND_NONE;
04468 }
04469 break;
04470
04471 case CPP_DOT:
04472 case CPP_DEREF:
04473
04474
04475
04476
04477
04478
04479 cp_lexer_consume_token (parser->lexer);
04480
04481 postfix_expression
04482 = cp_parser_postfix_dot_deref_expression (parser, token->type,
04483 postfix_expression,
04484 false, &idk);
04485 break;
04486
04487 case CPP_PLUS_PLUS:
04488
04489
04490 cp_lexer_consume_token (parser->lexer);
04491
04492 postfix_expression
04493 = finish_increment_expr (postfix_expression,
04494 POSTINCREMENT_EXPR);
04495
04496 if (cp_parser_non_integral_constant_expression (parser,
04497 "an increment"))
04498 postfix_expression = error_mark_node;
04499 idk = CP_ID_KIND_NONE;
04500 break;
04501
04502 case CPP_MINUS_MINUS:
04503
04504
04505 cp_lexer_consume_token (parser->lexer);
04506
04507 postfix_expression
04508 = finish_increment_expr (postfix_expression,
04509 POSTDECREMENT_EXPR);
04510
04511 if (cp_parser_non_integral_constant_expression (parser,
04512 "a decrement"))
04513 postfix_expression = error_mark_node;
04514 idk = CP_ID_KIND_NONE;
04515 break;
04516
04517 default:
04518 return postfix_expression;
04519 }
04520 }
04521
04522
04523 gcc_unreachable ();
04524 return error_mark_node;
04525 }
04526
04527
04528
04529
04530
04531
04532
04533
04534
04535 static tree
04536 cp_parser_postfix_open_square_expression (cp_parser *parser,
04537 tree postfix_expression,
04538 bool for_offsetof)
04539 {
04540 tree index;
04541
04542
04543 cp_lexer_consume_token (parser->lexer);
04544
04545
04546
04547
04548
04549
04550
04551
04552
04553 if (for_offsetof)
04554 index = cp_parser_constant_expression (parser, false, NULL);
04555 else
04556 index = cp_parser_expression (parser, false);
04557
04558
04559 cp_parser_require (parser, CPP_CLOSE_SQUARE, "`]'");
04560
04561
04562 postfix_expression = grok_array_decl (postfix_expression, index);
04563
04564
04565
04566 if (!for_offsetof
04567 && (cp_parser_non_integral_constant_expression
04568 (parser, "an array reference")))
04569 postfix_expression = error_mark_node;
04570
04571 return postfix_expression;
04572 }
04573
04574
04575
04576
04577
04578
04579
04580
04581
04582
04583
04584
04585
04586
04587 static tree
04588 cp_parser_postfix_dot_deref_expression (cp_parser *parser,
04589 enum cpp_ttype token_type,
04590 tree postfix_expression,
04591 bool for_offsetof, cp_id_kind *idk)
04592 {
04593 tree name;
04594 bool dependent_p;
04595 bool pseudo_destructor_p;
04596 tree scope = NULL_TREE;
04597
04598
04599 if (token_type == CPP_DEREF)
04600 postfix_expression = build_x_arrow (postfix_expression);
04601
04602 dependent_p = type_dependent_expression_p (postfix_expression);
04603
04604 parser->scope = NULL_TREE;
04605 parser->qualifying_scope = NULL_TREE;
04606 parser->object_scope = NULL_TREE;
04607 *idk = CP_ID_KIND_NONE;
04608
04609
04610 if (!dependent_p && TREE_TYPE (postfix_expression) != NULL_TREE)
04611 {
04612 scope = TREE_TYPE (postfix_expression);
04613
04614
04615
04616
04617
04618
04619 scope = non_reference (scope);
04620
04621 if (scope == unknown_type_node)
04622 {
04623 error ("%qE does not have class type", postfix_expression);
04624 scope = NULL_TREE;
04625 }
04626 else
04627 scope = complete_type_or_else (scope, NULL_TREE);
04628
04629
04630 parser->context->object_type = scope;
04631
04632
04633
04634 if (!scope)
04635 scope = error_mark_node;
04636
04637
04638
04639 if (scope == error_mark_node)
04640 postfix_expression = error_mark_node;
04641 }
04642
04643
04644 pseudo_destructor_p = false;
04645
04646
04647
04648 if (scope && SCALAR_TYPE_P (scope))
04649 {
04650 tree s;
04651 tree type;
04652
04653 cp_parser_parse_tentatively (parser);
04654
04655 s = NULL_TREE;
04656 cp_parser_pseudo_destructor_name (parser, &s, &type);
04657 if (cp_parser_parse_definitely (parser))
04658 {
04659 pseudo_destructor_p = true;
04660 postfix_expression
04661 = finish_pseudo_destructor_expr (postfix_expression,
04662 s, TREE_TYPE (type));
04663 }
04664 }
04665
04666 if (!pseudo_destructor_p)
04667 {
04668
04669
04670
04671 bool template_p;
04672
04673 name = (cp_parser_id_expression
04674 (parser,
04675 cp_parser_optional_template_keyword (parser),
04676 true,
04677 &template_p,
04678 false,
04679 false));
04680
04681
04682
04683
04684
04685
04686
04687
04688
04689
04690
04691
04692 if (parser->scope)
04693 *idk = CP_ID_KIND_QUALIFIED;
04694
04695
04696
04697 if (TREE_CODE (name) == TYPE_DECL)
04698 {
04699 error ("invalid use of %qD", name);
04700 postfix_expression = error_mark_node;
04701 }
04702 else
04703 {
04704 if (name != error_mark_node && !BASELINK_P (name) && parser->scope)
04705 {
04706 name = build_qualified_name (NULL_TREE,
04707 parser->scope,
04708 name,
04709 template_p);
04710 parser->scope = NULL_TREE;
04711 parser->qualifying_scope = NULL_TREE;
04712 parser->object_scope = NULL_TREE;
04713 }
04714 if (scope && name && BASELINK_P (name))
04715 adjust_result_of_qualified_name_lookup
04716 (name, BINFO_TYPE (BASELINK_ACCESS_BINFO (name)), scope);
04717 postfix_expression
04718 = finish_class_member_access_expr (postfix_expression, name,
04719 template_p);
04720 }
04721 }
04722
04723
04724
04725 parser->context->object_type = NULL_TREE;
04726
04727
04728
04729 if (!for_offsetof
04730 && (cp_parser_non_integral_constant_expression
04731 (parser, token_type == CPP_DEREF ? "'->'" : "`.'")))
04732 postfix_expression = error_mark_node;
04733
04734 return postfix_expression;
04735 }
04736
04737
04738
04739
04740
04741
04742
04743
04744
04745
04746
04747
04748
04749
04750
04751
04752
04753
04754
04755
04756
04757
04758
04759
04760 static tree
04761 cp_parser_parenthesized_expression_list (cp_parser* parser,
04762 bool is_attribute_list,
04763 bool cast_p,
04764 bool *non_constant_p)
04765 {
04766 tree expression_list = NULL_TREE;
04767 bool fold_expr_p = is_attribute_list;
04768 tree identifier = NULL_TREE;
04769
04770
04771 if (non_constant_p)
04772 *non_constant_p = false;
04773
04774 if (!cp_parser_require (parser, CPP_OPEN_PAREN, "`('"))
04775 return error_mark_node;
04776
04777
04778 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
04779 while (true)
04780 {
04781 tree expr;
04782
04783
04784
04785 if (is_attribute_list
04786 && cp_lexer_peek_token (parser->lexer)->type == CPP_NAME)
04787 {
04788 cp_token *token;
04789
04790
04791 token = cp_lexer_consume_token (parser->lexer);
04792
04793 identifier = token->u.value;
04794 }
04795 else
04796 {
04797
04798 if (non_constant_p)
04799 {
04800 bool expr_non_constant_p;
04801 expr = (cp_parser_constant_expression
04802 (parser, true,
04803 &expr_non_constant_p));
04804 if (expr_non_constant_p)
04805 *non_constant_p = true;
04806 }
04807 else
04808 expr = cp_parser_assignment_expression (parser, cast_p);
04809
04810 if (fold_expr_p)
04811 expr = fold_non_dependent_expr (expr);
04812
04813
04814
04815
04816
04817 expression_list = tree_cons (NULL_TREE, expr, expression_list);
04818
04819 if (expr == error_mark_node)
04820 goto skip_comma;
04821 }
04822
04823
04824
04825 is_attribute_list = false;
04826
04827 get_comma:;
04828
04829 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
04830 break;
04831
04832
04833 cp_lexer_consume_token (parser->lexer);
04834 }
04835
04836 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"))
04837 {
04838 int ending;
04839
04840 skip_comma:;
04841
04842
04843 ending = cp_parser_skip_to_closing_parenthesis (parser,
04844 true,
04845 true,
04846 true);
04847 if (ending < 0)
04848 goto get_comma;
04849 if (!ending)
04850 return error_mark_node;
04851 }
04852
04853
04854 expression_list = nreverse (expression_list);
04855 if (identifier)
04856 expression_list = tree_cons (NULL_TREE, identifier, expression_list);
04857
04858 return expression_list;
04859 }
04860
04861
04862
04863
04864
04865
04866
04867
04868
04869
04870
04871
04872
04873 static void
04874 cp_parser_pseudo_destructor_name (cp_parser* parser,
04875 tree* scope,
04876 tree* type)
04877 {
04878 bool nested_name_specifier_p;
04879
04880
04881 *type = error_mark_node;
04882
04883
04884 cp_parser_global_scope_opt (parser, true);
04885
04886 nested_name_specifier_p
04887 = (cp_parser_nested_name_specifier_opt (parser,
04888 false,
04889 true,
04890 false,
04891 true)
04892 != NULL_TREE);
04893
04894
04895 if (nested_name_specifier_p
04896 && cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
04897 {
04898
04899 cp_lexer_consume_token (parser->lexer);
04900
04901 cp_parser_template_id (parser,
04902 true,
04903 false,
04904 true);
04905
04906 cp_parser_require (parser, CPP_SCOPE, "`::'");
04907 }
04908
04909
04910 else if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMPL))
04911 {
04912
04913 *scope = TREE_TYPE (cp_parser_type_name (parser));
04914
04915 if (*scope == error_mark_node)
04916 return;
04917
04918
04919
04920
04921
04922
04923 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE)
04924 || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_COMPL)
04925 {
04926 cp_parser_error (parser, "request for member of non-aggregate type");
04927 return;
04928 }
04929
04930
04931 cp_parser_require (parser, CPP_SCOPE, "`::'");
04932 }
04933 else
04934 *scope = NULL_TREE;
04935
04936
04937 cp_parser_require (parser, CPP_COMPL, "`~'");
04938
04939
04940 *type = cp_parser_type_name (parser);
04941 }
04942
04943
04944
04945
04946
04947
04948
04949
04950
04951
04952
04953
04954
04955
04956
04957
04958
04959
04960
04961
04962
04963
04964
04965
04966
04967
04968
04969
04970
04971 static tree
04972 cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p)
04973 {
04974 cp_token *token;
04975 enum tree_code unary_operator;
04976
04977
04978 token = cp_lexer_peek_token (parser->lexer);
04979
04980 if (token->type == CPP_KEYWORD)
04981 {
04982 enum rid keyword = token->keyword;
04983
04984 switch (keyword)
04985 {
04986 case RID_ALIGNOF:
04987 case RID_SIZEOF:
04988 {
04989 tree operand;
04990 enum tree_code op;
04991
04992 op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR;
04993
04994 cp_lexer_consume_token (parser->lexer);
04995
04996 operand = cp_parser_sizeof_operand (parser, keyword);
04997
04998 if (TYPE_P (operand))
04999 return cxx_sizeof_or_alignof_type (operand, op, true);
05000 else
05001 return cxx_sizeof_or_alignof_expr (operand, op);
05002 }
05003
05004 case RID_NEW:
05005 return cp_parser_new_expression (parser);
05006
05007 case RID_DELETE:
05008 return cp_parser_delete_expression (parser);
05009
05010 case RID_EXTENSION:
05011 {
05012
05013 int saved_pedantic;
05014 tree expr;
05015
05016
05017 cp_parser_extension_opt (parser, &saved_pedantic);
05018
05019 expr = cp_parser_simple_cast_expression (parser);
05020
05021 pedantic = saved_pedantic;
05022
05023 return expr;
05024 }
05025
05026 case RID_REALPART:
05027 case RID_IMAGPART:
05028 {
05029 tree expression;
05030
05031
05032 cp_lexer_consume_token (parser->lexer);
05033
05034 expression = cp_parser_simple_cast_expression (parser);
05035
05036 return build_x_unary_op ((keyword == RID_REALPART
05037 ? REALPART_EXPR : IMAGPART_EXPR),
05038 expression);
05039 }
05040 break;
05041
05042 default:
05043 break;
05044 }
05045 }
05046
05047
05048
05049
05050
05051 if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
05052 {
05053 enum rid keyword;
05054
05055
05056
05057 keyword = cp_lexer_peek_nth_token (parser->lexer, 2)->keyword;
05058
05059 if (keyword == RID_NEW)
05060 return cp_parser_new_expression (parser);
05061
05062 else if (keyword == RID_DELETE)
05063 return cp_parser_delete_expression (parser);
05064 }
05065
05066
05067 unary_operator = cp_parser_unary_operator (token);
05068
05069
05070 if (unary_operator == ERROR_MARK)
05071 {
05072 if (token->type == CPP_PLUS_PLUS)
05073 unary_operator = PREINCREMENT_EXPR;
05074 else if (token->type == CPP_MINUS_MINUS)
05075 unary_operator = PREDECREMENT_EXPR;
05076
05077 else if (cp_parser_allow_gnu_extensions_p (parser)
05078 && token->type == CPP_AND_AND)
05079 {
05080 tree identifier;
05081
05082
05083 cp_lexer_consume_token (parser->lexer);
05084
05085 identifier = cp_parser_identifier (parser);
05086
05087 return finish_label_address_expr (identifier);
05088 }
05089 }
05090 if (unary_operator != ERROR_MARK)
05091 {
05092 tree cast_expression;
05093 tree expression = error_mark_node;
05094 const char *non_constant_p = NULL;
05095
05096
05097 token = cp_lexer_consume_token (parser->lexer);
05098
05099 cast_expression
05100 = cp_parser_cast_expression (parser,
05101 unary_operator == ADDR_EXPR,
05102 false);
05103
05104 switch (unary_operator)
05105 {
05106 case INDIRECT_REF:
05107 non_constant_p = "`*'";
05108 expression = build_x_indirect_ref (cast_expression, "unary *");
05109 break;
05110
05111 case ADDR_EXPR:
05112 non_constant_p = "`&'";
05113
05114 case BIT_NOT_EXPR:
05115 expression = build_x_unary_op (unary_operator, cast_expression);
05116 break;
05117
05118 case PREINCREMENT_EXPR:
05119 case PREDECREMENT_EXPR:
05120 non_constant_p = (unary_operator == PREINCREMENT_EXPR
05121 ? "`++'" : "`--'");
05122
05123 case UNARY_PLUS_EXPR:
05124 case NEGATE_EXPR:
05125 case TRUTH_NOT_EXPR:
05126 expression = finish_unary_op_expr (unary_operator, cast_expression);
05127 break;
05128
05129 default:
05130 gcc_unreachable ();
05131 }
05132
05133 if (non_constant_p
05134 && cp_parser_non_integral_constant_expression (parser,
05135 non_constant_p))
05136 expression = error_mark_node;
05137
05138 return expression;
05139 }
05140
05141 return cp_parser_postfix_expression (parser, address_p, cast_p);
05142 }
05143
05144
05145
05146
05147 static enum tree_code
05148 cp_parser_unary_operator (cp_token* token)
05149 {
05150 switch (token->type)
05151 {
05152 case CPP_MULT:
05153 return INDIRECT_REF;
05154
05155 case CPP_AND:
05156 return ADDR_EXPR;
05157
05158 case CPP_PLUS:
05159 return UNARY_PLUS_EXPR;
05160
05161 case CPP_MINUS:
05162 return NEGATE_EXPR;
05163
05164 case CPP_NOT:
05165 return TRUTH_NOT_EXPR;
05166
05167 case CPP_COMPL:
05168 return BIT_NOT_EXPR;
05169
05170 default:
05171 return ERROR_MARK;
05172 }
05173 }
05174
05175
05176
05177
05178
05179
05180
05181
05182
05183 static tree
05184 cp_parser_new_expression (cp_parser* parser)
05185 {
05186 bool global_scope_p;
05187 tree placement;
05188 tree type;
05189 tree initializer;
05190 tree nelts;
05191
05192
05193 global_scope_p
05194 = (cp_parser_global_scope_opt (parser,
05195 false)
05196 != NULL_TREE);
05197
05198 cp_parser_require_keyword (parser, RID_NEW, "`new'");
05199
05200
05201 cp_parser_parse_tentatively (parser);
05202
05203 placement = cp_parser_new_placement (parser);
05204
05205 if (!cp_parser_parse_definitely (parser))
05206 placement = NULL_TREE;
05207
05208
05209
05210 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
05211 {
05212
05213 cp_lexer_consume_token (parser->lexer);
05214
05215 type = cp_parser_type_id (parser);
05216
05217 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
05218
05219
05220
05221 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
05222 {
05223 error ("array bound forbidden after parenthesized type-id");
05224 inform ("try removing the parentheses around the type-id");
05225 cp_parser_direct_new_declarator (parser);
05226 }
05227 nelts = NULL_TREE;
05228 }
05229
05230 else
05231 type = cp_parser_new_type_id (parser, &nelts);
05232
05233
05234 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
05235 initializer = cp_parser_new_initializer (parser);
05236 else
05237 initializer = NULL_TREE;
05238
05239
05240
05241 if (cp_parser_non_integral_constant_expression (parser, "`new'"))
05242 return error_mark_node;
05243
05244
05245 return build_new (placement, type, nelts, initializer, global_scope_p);
05246 }
05247
05248
05249
05250
05251
05252
05253
05254
05255 static tree
05256 cp_parser_new_placement (cp_parser* parser)
05257 {
05258 tree expression_list;
05259
05260
05261 expression_list = (cp_parser_parenthesized_expression_list
05262 (parser, false, false,
05263 NULL));
05264
05265 return expression_list;
05266 }
05267
05268
05269
05270
05271
05272
05273
05274
05275
05276
05277 static tree
05278 cp_parser_new_type_id (cp_parser* parser, tree *nelts)
05279 {
05280 cp_decl_specifier_seq type_specifier_seq;
05281 cp_declarator *new_declarator;
05282 cp_declarator *declarator;
05283 cp_declarator *outer_declarator;
05284 const char *saved_message;
05285 tree type;
05286
05287
05288
05289
05290
05291 saved_message = parser->type_definition_forbidden_message;
05292 parser->type_definition_forbidden_message
05293 = "types may not be defined in a new-type-id";
05294
05295 cp_parser_type_specifier_seq (parser, false,
05296 &type_specifier_seq);
05297
05298 parser->type_definition_forbidden_message = saved_message;
05299
05300 new_declarator = cp_parser_new_declarator_opt (parser);
05301
05302
05303
05304 *nelts = NULL_TREE;
05305
05306 declarator = new_declarator;
05307 outer_declarator = NULL;
05308 while (declarator && (declarator->kind == cdk_pointer
05309 || declarator->kind == cdk_ptrmem))
05310 {
05311 outer_declarator = declarator;
05312 declarator = declarator->declarator;
05313 }
05314 while (declarator
05315 && declarator->kind == cdk_array
05316 && declarator->declarator
05317 && declarator->declarator->kind == cdk_array)
05318 {
05319 outer_declarator = declarator;
05320 declarator = declarator->declarator;
05321 }
05322
05323 if (declarator && declarator->kind == cdk_array)
05324 {
05325 *nelts = declarator->u.array.bounds;
05326 if (*nelts == error_mark_node)
05327 *nelts = integer_one_node;
05328
05329 if (outer_declarator)
05330 outer_declarator->declarator = declarator->declarator;
05331 else
05332 new_declarator = NULL;
05333 }
05334
05335 type = groktypename (&type_specifier_seq, new_declarator);
05336 if (TREE_CODE (type) == ARRAY_TYPE && *nelts == NULL_TREE)
05337 {
05338 *nelts = array_type_nelts_top (type);
05339 type = TREE_TYPE (type);
05340 }
05341 return type;
05342 }
05343
05344
05345
05346
05347
05348
05349
05350
05351
05352 static cp_declarator *
05353 cp_parser_new_declarator_opt (cp_parser* parser)
05354 {
05355 enum tree_code code;
05356 tree type;
05357 cp_cv_quals cv_quals;
05358
05359
05360 cp_parser_parse_tentatively (parser);
05361
05362 code = cp_parser_ptr_operator (parser, &type, &cv_quals);
05363
05364 if (cp_parser_parse_definitely (parser))
05365 {
05366 cp_declarator *declarator;
05367
05368
05369 declarator = cp_parser_new_declarator_opt (parser);
05370
05371
05372 if (type)
05373 declarator = make_ptrmem_declarator (cv_quals, type, declarator);
05374 else if (code == INDIRECT_REF)
05375 declarator = make_pointer_declarator (cv_quals, declarator);
05376 else
05377 declarator = make_reference_declarator (cv_quals, declarator);
05378
05379 return declarator;
05380 }
05381
05382
05383 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
05384 return cp_parser_direct_new_declarator (parser);
05385
05386 return NULL;
05387 }
05388
05389
05390
05391
05392
05393
05394
05395
05396
05397 static cp_declarator *
05398 cp_parser_direct_new_declarator (cp_parser* parser)
05399 {
05400 cp_declarator *declarator = NULL;
05401
05402 while (true)
05403 {
05404 tree expression;
05405
05406
05407 cp_parser_require (parser, CPP_OPEN_SQUARE, "`['");
05408
05409 if (!declarator)
05410 {
05411 expression = cp_parser_expression (parser, false);
05412
05413
05414
05415
05416
05417
05418 if (!processing_template_decl)
05419 {
05420 expression
05421 = build_expr_type_conversion (WANT_INT | WANT_ENUM,
05422 expression,
05423 true);
05424 if (!expression)
05425 {
05426 error ("expression in new-declarator must have integral "
05427 "or enumeration type");
05428 expression = error_mark_node;
05429 }
05430 }
05431 }
05432
05433 else
05434 expression
05435 = cp_parser_constant_expression (parser,
05436 false,
05437 NULL);
05438
05439 cp_parser_require (parser, CPP_CLOSE_SQUARE, "`]'");
05440
05441
05442 declarator = make_array_declarator (declarator, expression);
05443
05444
05445
05446 if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
05447 break;
05448 }
05449
05450 return declarator;
05451 }
05452
05453
05454
05455
05456
05457
05458
05459
05460
05461 static tree
05462 cp_parser_new_initializer (cp_parser* parser)
05463 {
05464 tree expression_list;
05465
05466 expression_list = (cp_parser_parenthesized_expression_list
05467 (parser, false, false,
05468 NULL));
05469 if (!expression_list)
05470 expression_list = void_zero_node;
05471
05472 return expression_list;
05473 }
05474
05475
05476
05477
05478
05479
05480
05481
05482
05483 static tree
05484 cp_parser_delete_expression (cp_parser* parser)
05485 {
05486 bool global_scope_p;
05487 bool array_p;
05488 tree expression;
05489
05490
05491 global_scope_p
05492 = (cp_parser_global_scope_opt (parser,
05493 false)
05494 != NULL_TREE);
05495
05496 cp_parser_require_keyword (parser, RID_DELETE, "`delete'");
05497
05498 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
05499 {
05500
05501 cp_lexer_consume_token (parser->lexer);
05502
05503 cp_parser_require (parser, CPP_CLOSE_SQUARE, "`]'");
05504
05505 array_p = true;
05506 }
05507 else
05508 array_p = false;
05509
05510
05511 expression = cp_parser_simple_cast_expression (parser);
05512
05513
05514
05515 if (cp_parser_non_integral_constant_expression (parser, "`delete'"))
05516 return error_mark_node;
05517
05518 return delete_sanity (expression, NULL_TREE, array_p, global_scope_p);
05519 }
05520
05521
05522
05523
05524
05525
05526
05527
05528
05529
05530
05531
05532
05533 static tree
05534 cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p)
05535 {
05536
05537 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
05538 {
05539 tree type = NULL_TREE;
05540 tree expr = NULL_TREE;
05541 bool compound_literal_p;
05542 const char *saved_message;
05543
05544
05545
05546
05547 cp_parser_parse_tentatively (parser);
05548
05549 saved_message = parser->type_definition_forbidden_message;
05550 parser->type_definition_forbidden_message
05551 = "types may not be defined in casts";
05552
05553 cp_lexer_consume_token (parser->lexer);
05554
05555
05556
05557
05558
05559
05560
05561
05562
05563
05564
05565
05566
05567
05568
05569
05570 cp_lexer_save_tokens (parser->lexer);
05571
05572
05573
05574 compound_literal_p
05575 = (cp_parser_skip_to_closing_parenthesis (parser, false, false,
05576 true)
05577 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE));
05578
05579 cp_lexer_rollback_tokens (parser->lexer);
05580
05581
05582
05583 if (compound_literal_p)
05584 cp_parser_simulate_error (parser);
05585 else
05586 {
05587 bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
05588 parser->in_type_id_in_expr_p = true;
05589
05590 type = cp_parser_type_id (parser);
05591
05592 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
05593 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
05594 }
05595
05596
05597 parser->type_definition_forbidden_message = saved_message;
05598
05599
05600
05601
05602
05603 if (!cp_parser_error_occurred (parser))
05604 expr = cp_parser_cast_expression (parser,
05605 false,
05606 true);
05607
05608 if (cp_parser_parse_definitely (parser))
05609 {
05610
05611 if (warn_old_style_cast
05612 && !in_system_header
05613 && !VOID_TYPE_P (type)
05614 && current_lang_name != lang_name_c)
05615 warning (OPT_Wold_style_cast, "use of old-style cast");
05616
05617
05618
05619 if (!cast_valid_in_integral_constant_expression_p (type)
05620 && (cp_parser_non_integral_constant_expression
05621 (parser,
05622 "a cast to a type other than an integral or "
05623 "enumeration type")))
05624 return error_mark_node;
05625
05626
05627 expr = build_c_cast (type, expr);
05628 return expr;
05629 }
05630 }
05631
05632
05633
05634 return cp_parser_unary_expression (parser, address_p, cast_p);
05635 }
05636
05637
05638
05639
05640
05641
05642
05643
05644
05645
05646
05647
05648
05649
05650
05651
05652
05653
05654
05655
05656
05657
05658
05659
05660
05661
05662
05663
05664
05665
05666
05667
05668
05669
05670
05671
05672
05673
05674
05675
05676
05677
05678
05679
05680
05681
05682
05683
05684
05685
05686
05687
05688
05689
05690
05691
05692
05693
05694
05695
05696
05697
05698
05699
05700
05701
05702
05703
05704
05705
05706
05707
05708
05709 #define TOKEN_PRECEDENCE(token) \
05710 ((token->type == CPP_GREATER && !parser->greater_than_is_operator_p) \
05711 ? PREC_NOT_OPERATOR \
05712 : binops_by_token[token->type].prec)
05713
05714 static tree
05715 cp_parser_binary_expression (cp_parser* parser, bool cast_p)
05716 {
05717 cp_parser_expression_stack stack;
05718 cp_parser_expression_stack_entry *sp = &stack[0];
05719 tree lhs, rhs;
05720 cp_token *token;
05721 enum tree_code tree_type;
05722 enum cp_parser_prec prec = PREC_NOT_OPERATOR, new_prec, lookahead_prec;
05723 bool overloaded_p;
05724
05725
05726 lhs = cp_parser_cast_expression (parser, false, cast_p);
05727
05728 for (;;)
05729 {
05730
05731 token = cp_lexer_peek_token (parser->lexer);
05732
05733 new_prec = TOKEN_PRECEDENCE (token);
05734
05735
05736
05737
05738
05739
05740
05741
05742 if (new_prec <= prec)
05743 {
05744 if (sp == stack)
05745 break;
05746 else
05747 goto pop;
05748 }
05749
05750 get_rhs:
05751 tree_type = binops_by_token[token->type].tree_type;
05752
05753
05754 cp_lexer_consume_token (parser->lexer);
05755
05756
05757
05758 rhs = cp_parser_simple_cast_expression (parser);
05759
05760
05761
05762
05763 token = cp_lexer_peek_token (parser->lexer);
05764 lookahead_prec = TOKEN_PRECEDENCE (token);
05765 if (lookahead_prec > new_prec)
05766 {
05767
05768
05769
05770
05771 sp->prec = prec;
05772 sp->tree_type = tree_type;
05773 sp->lhs = lhs;
05774 sp++;
05775 lhs = rhs;
05776 prec = new_prec;
05777 new_prec = lookahead_prec;
05778 goto get_rhs;
05779
05780 pop:
05781
05782
05783
05784
05785
05786
05787
05788 --sp;
05789 prec = sp->prec;
05790 tree_type = sp->tree_type;
05791 rhs = lhs;
05792 lhs = sp->lhs;
05793 }
05794
05795 overloaded_p = false;
05796 lhs = build_x_binary_op (tree_type, lhs, rhs, &overloaded_p);
05797
05798
05799
05800
05801
05802
05803
05804 if (overloaded_p
05805 && (cp_parser_non_integral_constant_expression
05806 (parser, "calls to overloaded operators")))
05807 return error_mark_node;
05808 }
05809
05810 return lhs;
05811 }
05812
05813
05814
05815
05816
05817
05818
05819
05820
05821
05822
05823
05824
05825
05826
05827 static tree
05828 cp_parser_question_colon_clause (cp_parser* parser, tree logical_or_expr)
05829 {
05830 tree expr;
05831 tree assignment_expr;
05832
05833
05834 cp_lexer_consume_token (parser->lexer);
05835 if (cp_parser_allow_gnu_extensions_p (parser)
05836 && cp_lexer_next_token_is (parser->lexer, CPP_COLON))
05837
05838 expr = NULL_TREE;
05839 else
05840
05841 expr = cp_parser_expression (parser, false);
05842
05843
05844 cp_parser_require (parser, CPP_COLON, "`:'");
05845
05846 assignment_expr = cp_parser_assignment_expression (parser, false);
05847
05848
05849 return build_x_conditional_expr (logical_or_expr,
05850 expr,
05851 assignment_expr);
05852 }
05853
05854
05855
05856
05857
05858
05859
05860
05861
05862
05863
05864
05865 static tree
05866 cp_parser_assignment_expression (cp_parser* parser, bool cast_p)
05867 {
05868 tree expr;
05869
05870
05871
05872 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THROW))
05873 expr = cp_parser_throw_expression (parser);
05874
05875
05876 else
05877 {
05878
05879 expr = cp_parser_binary_expression (parser, cast_p);
05880
05881
05882 if (cp_lexer_next_token_is (parser->lexer, CPP_QUERY))
05883 return cp_parser_question_colon_clause (parser, expr);
05884 else
05885 {
05886 enum tree_code assignment_operator;
05887
05888
05889
05890 assignment_operator
05891 = cp_parser_assignment_operator_opt (parser);
05892 if (assignment_operator != ERROR_MARK)
05893 {
05894 tree rhs;
05895
05896
05897 rhs = cp_parser_assignment_expression (parser, cast_p);
05898
05899
05900 if (cp_parser_non_integral_constant_expression (parser,
05901 "an assignment"))
05902 return error_mark_node;
05903
05904 expr = build_x_modify_expr (expr,
05905 assignment_operator,
05906 rhs);
05907 }
05908 }
05909 }
05910
05911 return expr;
05912 }
05913
05914
05915
05916
05917
05918
05919
05920
05921
05922
05923
05924
05925
05926
05927
05928
05929
05930
05931 static enum tree_code
05932 cp_parser_assignment_operator_opt (cp_parser* parser)
05933 {
05934 enum tree_code op;
05935 cp_token *token;
05936
05937
05938 token = cp_lexer_peek_token (parser->lexer);
05939
05940 switch (token->type)
05941 {
05942 case CPP_EQ:
05943 op = NOP_EXPR;
05944 break;
05945
05946 case CPP_MULT_EQ:
05947 op = MULT_EXPR;
05948 break;
05949
05950 case CPP_DIV_EQ:
05951 op = TRUNC_DIV_EXPR;
05952 break;
05953
05954 case CPP_MOD_EQ:
05955 op = TRUNC_MOD_EXPR;
05956 break;
05957
05958 case CPP_PLUS_EQ:
05959 op = PLUS_EXPR;
05960 break;
05961
05962 case CPP_MINUS_EQ:
05963 op = MINUS_EXPR;
05964 break;
05965
05966 case CPP_RSHIFT_EQ:
05967 op = RSHIFT_EXPR;
05968 break;
05969
05970 case CPP_LSHIFT_EQ:
05971 op = LSHIFT_EXPR;
05972 break;
05973
05974 case CPP_AND_EQ:
05975 op = BIT_AND_EXPR;
05976 break;
05977
05978 case CPP_XOR_EQ:
05979 op = BIT_XOR_EXPR;
05980 break;
05981
05982 case CPP_OR_EQ:
05983 op = BIT_IOR_EXPR;
05984 break;
05985
05986 default:
05987
05988 op = ERROR_MARK;
05989 }
05990
05991
05992 if (op != ERROR_MARK)
05993 cp_lexer_consume_token (parser->lexer);
05994
05995 return op;
05996 }
05997
05998
05999
06000
06001
06002
06003
06004
06005
06006
06007
06008 static tree
06009 cp_parser_expression (cp_parser* parser, bool cast_p)
06010 {
06011 tree expression = NULL_TREE;
06012
06013 while (true)
06014 {
06015 tree assignment_expression;
06016
06017
06018 assignment_expression
06019 = cp_parser_assignment_expression (parser, cast_p);
06020
06021
06022 if (!expression)
06023 expression = assignment_expression;
06024 else
06025 expression = build_x_compound_expr (expression,
06026 assignment_expression);
06027
06028
06029 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
06030 break;
06031
06032 cp_lexer_consume_token (parser->lexer);
06033
06034 if (cp_parser_non_integral_constant_expression (parser,
06035 "a comma operator"))
06036 expression = error_mark_node;
06037 }
06038
06039 return expression;
06040 }
06041
06042
06043
06044
06045
06046
06047
06048
06049
06050
06051
06052 static tree
06053 cp_parser_constant_expression (cp_parser* parser,
06054 bool allow_non_constant_p,
06055 bool *non_constant_p)
06056 {
06057 bool saved_integral_constant_expression_p;
06058 bool saved_allow_non_integral_constant_expression_p;
06059 bool saved_non_integral_constant_expression_p;
06060 tree expression;
06061
06062
06063
06064
06065
06066
06067
06068
06069
06070
06071
06072
06073
06074
06075
06076
06077
06078
06079
06080 saved_integral_constant_expression_p = parser->integral_constant_expression_p;
06081 saved_allow_non_integral_constant_expression_p
06082 = parser->allow_non_integral_constant_expression_p;
06083 saved_non_integral_constant_expression_p = parser->non_integral_constant_expression_p;
06084
06085 parser->integral_constant_expression_p = true;
06086 parser->allow_non_integral_constant_expression_p = allow_non_constant_p;
06087 parser->non_integral_constant_expression_p = false;
06088
06089
06090
06091
06092
06093
06094
06095
06096
06097 expression = cp_parser_assignment_expression (parser, false);
06098
06099 parser->integral_constant_expression_p
06100 = saved_integral_constant_expression_p;
06101 parser->allow_non_integral_constant_expression_p
06102 = saved_allow_non_integral_constant_expression_p;
06103 if (allow_non_constant_p)
06104 *non_constant_p = parser->non_integral_constant_expression_p;
06105 else if (parser->non_integral_constant_expression_p)
06106 expression = error_mark_node;
06107 parser->non_integral_constant_expression_p
06108 = saved_non_integral_constant_expression_p;
06109
06110 return expression;
06111 }
06112
06113
06114
06115
06116
06117
06118
06119
06120
06121
06122
06123 static tree
06124 cp_parser_builtin_offsetof (cp_parser *parser)
06125 {
06126 int save_ice_p, save_non_ice_p;
06127 tree type, expr;
06128 cp_id_kind dummy;
06129
06130
06131
06132
06133 save_ice_p = parser->integral_constant_expression_p;
06134 save_non_ice_p = parser->non_integral_constant_expression_p;
06135
06136
06137 cp_lexer_consume_token (parser->lexer);
06138
06139 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
06140
06141 type = cp_parser_type_id (parser);
06142
06143 cp_parser_require (parser, CPP_COMMA, "`,'");
06144
06145
06146 expr = build_static_cast (build_pointer_type (type), null_pointer_node);
06147
06148
06149 expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DEREF, expr,
06150 true, &dummy);
06151 while (true)
06152 {
06153 cp_token *token = cp_lexer_peek_token (parser->lexer);
06154 switch (token->type)
06155 {
06156 case CPP_OPEN_SQUARE:
06157
06158 expr = cp_parser_postfix_open_square_expression (parser, expr, true);
06159 break;
06160
06161 case CPP_DOT:
06162
06163 cp_lexer_consume_token (parser->lexer);
06164 expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT, expr,
06165 true, &dummy);
06166 break;
06167
06168 case CPP_CLOSE_PAREN:
06169
06170 cp_lexer_consume_token (parser->lexer);
06171 goto success;
06172
06173 default:
06174
06175
06176 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
06177 cp_parser_skip_to_closing_parenthesis (parser, true, false, true);
06178 expr = error_mark_node;
06179 goto failure;
06180 }
06181 }
06182
06183 success:
06184
06185
06186 if (processing_template_decl)
06187 expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
06188 else
06189 expr = finish_offsetof (expr);
06190
06191 failure:
06192 parser->integral_constant_expression_p = save_ice_p;
06193 parser->non_integral_constant_expression_p = save_non_ice_p;
06194
06195 return expr;
06196 }
06197
06198
06199
06200
06201
06202
06203
06204
06205
06206
06207
06208
06209
06210
06211
06212
06213
06214
06215 static void
06216 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
06217 bool in_compound)
06218 {
06219 tree statement;
06220 cp_token *token;
06221 location_t statement_location;
06222
06223 restart:
06224
06225 statement = NULL_TREE;
06226
06227 token = cp_lexer_peek_token (parser->lexer);
06228
06229 statement_location = token->location;
06230
06231
06232 if (token->type == CPP_KEYWORD)
06233 {
06234 enum rid keyword = token->keyword;
06235
06236 switch (keyword)
06237 {
06238 case RID_CASE:
06239 case RID_DEFAULT:
06240
06241
06242
06243 cp_parser_label_for_labeled_statement (parser);
06244 goto restart;
06245
06246 case RID_IF:
06247 case RID_SWITCH:
06248 statement = cp_parser_selection_statement (parser);
06249 break;
06250
06251 case RID_WHILE:
06252 case RID_DO:
06253 case RID_FOR:
06254 statement = cp_parser_iteration_statement (parser);
06255 break;
06256
06257 case RID_BREAK:
06258 case RID_CONTINUE:
06259 case RID_RETURN:
06260 case RID_GOTO:
06261 statement = cp_parser_jump_statement (parser);
06262 break;
06263
06264
06265 case RID_AT_TRY:
06266 case RID_AT_CATCH:
06267 case RID_AT_FINALLY:
06268 case RID_AT_SYNCHRONIZED:
06269 case RID_AT_THROW:
06270 statement = cp_parser_objc_statement (parser);
06271 break;
06272
06273 case RID_TRY:
06274 statement = cp_parser_try_block (parser);
06275 break;
06276
06277 default:
06278
06279
06280 break;
06281 }
06282 }
06283 else if (token->type == CPP_NAME)
06284 {
06285
06286
06287 token = cp_lexer_peek_nth_token (parser->lexer, 2);
06288 if (token->type == CPP_COLON)
06289 {
06290
06291
06292
06293 cp_parser_label_for_labeled_statement (parser);
06294 goto restart;
06295 }
06296 }
06297
06298 else if (token->type == CPP_OPEN_BRACE)
06299 statement = cp_parser_compound_statement (parser, NULL, false);
06300
06301
06302 else if (token->type == CPP_PRAGMA)
06303 {
06304
06305
06306
06307
06308
06309 if (in_compound)
06310 cp_parser_pragma (parser, pragma_compound);
06311 else if (!cp_parser_pragma (parser, pragma_stmt))
06312 goto restart;
06313 return;
06314 }
06315 else if (token->type == CPP_EOF)
06316 {
06317 cp_parser_error (parser, "expected statement");
06318 return;
06319 }
06320
06321
06322
06323
06324
06325 if (!statement)
06326 {
06327 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
06328 {
06329 cp_parser_parse_tentatively (parser);
06330
06331 cp_parser_declaration_statement (parser);
06332
06333 if (cp_parser_parse_definitely (parser))
06334 return;
06335 }
06336
06337 statement = cp_parser_expression_statement (parser, in_statement_expr);
06338 }
06339
06340
06341 if (statement && STATEMENT_CODE_P (TREE_CODE (statement)))
06342 SET_EXPR_LOCATION (statement, statement_location);
06343 }
06344
06345
06346
06347
06348
06349
06350
06351
06352
06353
06354
06355
06356
06357
06358 static void
06359 cp_parser_label_for_labeled_statement (cp_parser* parser)
06360 {
06361 cp_token *token;
06362
06363
06364 token = cp_lexer_peek_token (parser->lexer);
06365 if (token->type != CPP_NAME
06366 && token->type != CPP_KEYWORD)
06367 {
06368 cp_parser_error (parser, "expected labeled-statement");
06369 return;
06370 }
06371
06372 switch (token->keyword)
06373 {
06374 case RID_CASE:
06375 {
06376 tree expr, expr_hi;
06377 cp_token *ellipsis;
06378
06379
06380 cp_lexer_consume_token (parser->lexer);
06381
06382 expr = cp_parser_constant_expression (parser,
06383 false,
06384 NULL);
06385
06386 ellipsis = cp_lexer_peek_token (parser->lexer);
06387 if (ellipsis->type == CPP_ELLIPSIS)
06388 {
06389
06390 cp_lexer_consume_token (parser->lexer);
06391 expr_hi =
06392 cp_parser_constant_expression (parser,
06393 false,
06394 NULL);
06395
06396
06397 }
06398 else
06399 expr_hi = NULL_TREE;
06400
06401 if (parser->in_switch_statement_p)
06402 finish_case_label (expr, expr_hi);
06403 else
06404 error ("case label %qE not within a switch statement", expr);
06405 }
06406 break;
06407
06408 case RID_DEFAULT:
06409
06410 cp_lexer_consume_token (parser->lexer);
06411
06412 if (parser->in_switch_statement_p)
06413 finish_case_label (NULL_TREE, NULL_TREE);
06414 else
06415 error ("case label not within a switch statement");
06416 break;
06417
06418 default:
06419
06420 finish_label_stmt (cp_parser_identifier (parser));
06421 break;
06422 }
06423
06424
06425 cp_parser_require (parser, CPP_COLON, "`:'");
06426 }
06427
06428
06429
06430
06431
06432
06433
06434
06435
06436
06437
06438 static tree
06439 cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
06440 {
06441 tree statement = NULL_TREE;
06442
06443
06444
06445 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
06446 statement = cp_parser_expression (parser, false);
06447
06448
06449 cp_parser_consume_semicolon_at_end_of_statement (parser);
06450
06451 if (in_statement_expr
06452 && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
06453
06454
06455 statement = finish_stmt_expr_expr (statement, in_statement_expr);
06456 else if (statement)
06457 statement = finish_expr_stmt (statement);
06458 else
06459 finish_stmt ();
06460
06461 return statement;
06462 }
06463
06464
06465
06466
06467
06468
06469
06470
06471 static tree
06472 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
06473 bool in_try)
06474 {
06475 tree compound_stmt;
06476
06477
06478 if (!cp_parser_require (parser, CPP_OPEN_BRACE, "`{'"))
06479 return error_mark_node;
06480
06481 compound_stmt = begin_compound_stmt (in_try ? BCS_TRY_BLOCK : 0);
06482
06483 cp_parser_statement_seq_opt (parser, in_statement_expr);
06484
06485 finish_compound_stmt (compound_stmt);
06486
06487 cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'");
06488
06489 return compound_stmt;
06490 }
06491
06492
06493
06494
06495
06496
06497
06498 static void
06499 cp_parser_statement_seq_opt (cp_parser* parser, tree in_statement_expr)
06500 {
06501
06502 while (true)
06503 {
06504 cp_token *token = cp_lexer_peek_token (parser->lexer);
06505
06506
06507 if (token->type == CPP_CLOSE_BRACE
06508 || token->type == CPP_EOF
06509 || token->type == CPP_PRAGMA_EOL)
06510 break;
06511
06512
06513 cp_parser_statement (parser, in_statement_expr, true);
06514 }
06515 }
06516
06517
06518
06519
06520
06521
06522
06523
06524
06525
06526 static tree
06527 cp_parser_selection_statement (cp_parser* parser)
06528 {
06529 cp_token *token;
06530 enum rid keyword;
06531
06532
06533 token = cp_parser_require (parser, CPP_KEYWORD, "selection-statement");
06534
06535
06536 keyword = token->keyword;
06537 switch (keyword)
06538 {
06539 case RID_IF:
06540 case RID_SWITCH:
06541 {
06542 tree statement;
06543 tree condition;
06544
06545
06546 if (!cp_parser_require (parser, CPP_OPEN_PAREN, "`('"))
06547 {
06548 cp_parser_skip_to_end_of_statement (parser);
06549 return error_mark_node;
06550 }
06551
06552
06553 if (keyword == RID_IF)
06554 statement = begin_if_stmt ();
06555 else
06556 statement = begin_switch_stmt ();
06557
06558
06559 condition = cp_parser_condition (parser);
06560
06561 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"))
06562 cp_parser_skip_to_closing_parenthesis (parser, true, false,
06563 true);
06564
06565 if (keyword == RID_IF)
06566 {
06567
06568 finish_if_stmt_cond (condition, statement);
06569
06570
06571 cp_parser_implicitly_scoped_statement (parser);
06572 finish_then_clause (statement);
06573
06574
06575 if (cp_lexer_next_token_is_keyword (parser->lexer,
06576 RID_ELSE))
06577 {
06578
06579 cp_lexer_consume_token (parser->lexer);
06580 begin_else_clause (statement);
06581
06582 cp_parser_implicitly_scoped_statement (parser);
06583 finish_else_clause (statement);
06584 }
06585
06586
06587 finish_if_stmt (statement);
06588 }
06589 else
06590 {
06591 bool in_switch_statement_p;
06592 unsigned char in_statement;
06593
06594
06595 finish_switch_cond (condition, statement);
06596
06597
06598 in_switch_statement_p = parser->in_switch_statement_p;
06599 in_statement = parser->in_statement;
06600 parser->in_switch_statement_p = true;
06601 parser->in_statement |= IN_SWITCH_STMT;
06602 cp_parser_implicitly_scoped_statement (parser);
06603 parser->in_switch_statement_p = in_switch_statement_p;
06604 parser->in_statement = in_statement;
06605
06606
06607 finish_switch_stmt (statement);
06608 }
06609
06610 return statement;
06611 }
06612 break;
06613
06614 default:
06615 cp_parser_error (parser, "expected selection-statement");
06616 return error_mark_node;
06617 }
06618 }
06619
06620
06621
06622
06623
06624
06625
06626
06627
06628
06629
06630
06631
06632
06633
06634 static tree
06635 cp_parser_condition (cp_parser* parser)
06636 {
06637 cp_decl_specifier_seq type_specifiers;
06638 const char *saved_message;
06639
06640
06641 cp_parser_parse_tentatively (parser);
06642
06643
06644 saved_message = parser->type_definition_forbidden_message;
06645 parser->type_definition_forbidden_message
06646 = "types may not be defined in conditions";
06647
06648 cp_parser_type_specifier_seq (parser, true,
06649 &type_specifiers);
06650
06651 parser->type_definition_forbidden_message = saved_message;
06652
06653 if (!cp_parser_error_occurred (parser))
06654 {
06655 tree decl;
06656 tree asm_specification;
06657 tree attributes;
06658 cp_declarator *declarator;
06659 tree initializer = NULL_TREE;
06660
06661
06662 declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
06663 NULL,
06664 NULL,
06665 false);
06666
06667 attributes = cp_parser_attributes_opt (parser);
06668
06669 asm_specification = cp_parser_asm_specification_opt (parser);
06670
06671
06672
06673
06674
06675
06676
06677 cp_parser_require (parser, CPP_EQ, "`='");
06678
06679
06680 if (cp_parser_parse_definitely (parser))
06681 {
06682 tree pushed_scope;
06683 bool non_constant_p;
06684
06685
06686 decl = start_decl (declarator, &type_specifiers,
06687 true,
06688 attributes, NULL_TREE,
06689 &pushed_scope);
06690
06691 initializer
06692 = cp_parser_constant_expression (parser,
06693 true,
06694 &non_constant_p);
06695 if (!non_constant_p)
06696 initializer = fold_non_dependent_expr (initializer);
06697
06698
06699 cp_finish_decl (decl,
06700 initializer, !non_constant_p,
06701 asm_specification,
06702 LOOKUP_ONLYCONVERTING);
06703
06704 if (pushed_scope)
06705 pop_scope (pushed_scope);
06706
06707 return convert_from_reference (decl);
06708 }
06709 }
06710
06711
06712 else
06713 cp_parser_abort_tentative_parse (parser);
06714
06715
06716 return cp_parser_expression (parser, false);
06717 }
06718
06719
06720
06721
06722
06723
06724
06725
06726
06727
06728
06729 static tree
06730 cp_parser_iteration_statement (cp_parser* parser)
06731 {
06732 cp_token *token;
06733 enum rid keyword;
06734 tree statement;
06735 unsigned char in_statement;
06736
06737
06738 token = cp_parser_require (parser, CPP_KEYWORD, "iteration-statement");
06739 if (!token)
06740 return error_mark_node;
06741
06742
06743
06744 in_statement = parser->in_statement;
06745
06746
06747 keyword = token->keyword;
06748 switch (keyword)
06749 {
06750 case RID_WHILE:
06751 {
06752 tree condition;
06753
06754
06755 statement = begin_while_stmt ();
06756
06757 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
06758
06759 condition = cp_parser_condition (parser);
06760 finish_while_stmt_cond (condition, statement);
06761
06762 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
06763
06764 parser->in_statement = IN_ITERATION_STMT;
06765 cp_parser_already_scoped_statement (parser);
06766 parser->in_statement = in_statement;
06767
06768 finish_while_stmt (statement);
06769 }
06770 break;
06771
06772 case RID_DO:
06773 {
06774 tree expression;
06775
06776
06777 statement = begin_do_stmt ();
06778
06779 parser->in_statement = IN_ITERATION_STMT;
06780 cp_parser_implicitly_scoped_statement (parser);
06781 parser->in_statement = in_statement;
06782 finish_do_body (statement);
06783
06784 cp_parser_require_keyword (parser, RID_WHILE, "`while'");
06785
06786 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
06787
06788 expression = cp_parser_expression (parser, false);
06789
06790 finish_do_stmt (expression, statement);
06791
06792 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
06793
06794 cp_parser_require (parser, CPP_SEMICOLON, "`;'");
06795 }
06796 break;
06797
06798 case RID_FOR:
06799 {
06800 tree condition = NULL_TREE;
06801 tree expression = NULL_TREE;
06802
06803
06804 statement = begin_for_stmt ();
06805
06806 cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
06807
06808 cp_parser_for_init_statement (parser);
06809 finish_for_init_stmt (statement);
06810
06811
06812 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
06813 condition = cp_parser_condition (parser);
06814 finish_for_cond (condition, statement);
06815
06816 cp_parser_require (parser, CPP_SEMICOLON, "`;'");
06817
06818
06819 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
06820 expression = cp_parser_expression (parser, false);
06821 finish_for_expr (expression, statement);
06822
06823 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
06824
06825
06826 parser->in_statement = IN_ITERATION_STMT;
06827 cp_parser_already_scoped_statement (parser);
06828 parser->in_statement = in_statement;
06829
06830
06831 finish_for_stmt (statement);
06832 }
06833 break;
06834
06835 default:
06836 cp_parser_error (parser, "expected iteration-statement");
06837 statement = error_mark_node;
06838 break;
06839 }
06840
06841 return statement;
06842 }
06843
06844
06845
06846
06847
06848
06849
06850 static void
06851 cp_parser_for_init_statement (cp_parser* parser)
06852 {
06853
06854
06855
06856
06857
06858
06859 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
06860 {
06861
06862
06863 cp_parser_parse_tentatively (parser);
06864
06865 cp_parser_simple_declaration (parser,
06866 false);
06867
06868
06869 if (cp_parser_parse_definitely (parser))
06870 return;
06871 }
06872
06873 cp_parser_expression_statement (parser, false);
06874 }
06875
06876
06877
06878
06879
06880
06881
06882
06883
06884
06885
06886
06887
06888
06889
06890
06891 static tree
06892 cp_parser_jump_statement (cp_parser* parser)
06893 {
06894 tree statement = error_mark_node;
06895 cp_token *token;
06896 enum rid keyword;
06897
06898
06899 token = cp_parser_require (parser, CPP_KEYWORD, "jump-statement");
06900 if (!token)
06901 return error_mark_node;
06902
06903
06904 keyword = token->keyword;
06905 switch (keyword)
06906 {
06907 case RID_BREAK:
06908 switch (parser->in_statement)
06909 {
06910 case 0:
06911 error ("break statement not within loop or switch");
06912 break;
06913 default:
06914 gcc_assert ((parser->in_statement & IN_SWITCH_STMT)
06915 || parser->in_statement == IN_ITERATION_STMT);
06916 statement = finish_break_stmt ();
06917 break;
06918 case IN_OMP_BLOCK:
06919 error ("invalid exit from OpenMP structured block");
06920 break;
06921 case IN_OMP_FOR:
06922 error ("break statement used with OpenMP for loop");
06923 break;
06924 }
06925 cp_parser_require (parser, CPP_SEMICOLON, "%<;%>");
06926 break;
06927
06928 case RID_CONTINUE:
06929 switch (parser->in_statement & ~IN_SWITCH_STMT)
06930 {
06931 case 0:
06932 error ("continue statement not within a loop");
06933 break;
06934 case IN_ITERATION_STMT:
06935 case IN_OMP_FOR:
06936 statement = finish_continue_stmt ();
06937 break;
06938 case IN_OMP_BLOCK:
06939 error ("invalid exit from OpenMP structured block");
06940 break;
06941 default:
06942 gcc_unreachable ();
06943 }
06944 cp_parser_require (parser, CPP_SEMICOLON, "%<;%>");
06945 break;
06946
06947 case RID_RETURN:
06948 {
06949 tree expr;
06950
06951
06952
06953 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
06954 expr = cp_parser_expression (parser, false);
06955 else
06956 expr = NULL_TREE;
06957
06958 statement = finish_return_stmt (expr);
06959
06960 cp_parser_require (parser, CPP_SEMICOLON, "%<;%>");
06961 }
06962 break;
06963
06964 case RID_GOTO:
06965
06966 if (cp_lexer_next_token_is (parser->lexer, CPP_MULT))
06967 {
06968
06969 if (pedantic)
06970 pedwarn ("ISO C++ forbids computed gotos");
06971
06972 cp_lexer_consume_token (parser->lexer);
06973
06974 finish_goto_stmt (cp_parser_expression (parser, false));
06975 }
06976 else
06977 finish_goto_stmt (cp_parser_identifier (parser));
06978
06979 cp_parser_require (parser, CPP_SEMICOLON, "%<;%>");
06980 break;
06981
06982 default:
06983 cp_parser_error (parser, "expected jump-statement");
06984 break;
06985 }
06986
06987 return statement;
06988 }
06989
06990
06991
06992
06993
06994
06995 static void
06996 cp_parser_declaration_statement (cp_parser* parser)
06997 {
06998 void *p;
06999
07000
07001 p = obstack_alloc (&declarator_obstack, 0);
07002
07003
07004 cp_parser_block_declaration (parser, true);
07005
07006
07007 obstack_free (&declarator_obstack, p);
07008
07009
07010 finish_stmt ();
07011 }
07012
07013
07014
07015
07016
07017
07018
07019
07020
07021
07022
07023
07024 static tree
07025 cp_parser_implicitly_scoped_statement (cp_parser* parser)
07026 {
07027 tree statement;
07028
07029
07030 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
07031 {
07032 cp_lexer_consume_token (parser->lexer);
07033 statement = add_stmt (build_empty_stmt ());
07034 }
07035
07036 else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
07037 statement = cp_parser_compound_statement (parser, NULL, false);
07038
07039 else
07040 {
07041
07042 statement = begin_compound_stmt (0);
07043
07044 cp_parser_statement (parser, NULL_TREE, false);
07045
07046 finish_compound_stmt (statement);
07047 }
07048
07049
07050 return statement;
07051 }
07052
07053
07054
07055
07056
07057
07058 static void
07059 cp_parser_already_scoped_statement (cp_parser* parser)
07060 {
07061
07062 if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
07063 cp_parser_statement (parser, NULL_TREE, false);
07064 else
07065 {
07066
07067
07068 cp_parser_require (parser, CPP_OPEN_BRACE, "`{'");
07069 cp_parser_statement_seq_opt (parser, NULL_TREE);
07070 cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'");
07071 }
07072 }
07073
07074
07075
07076
07077
07078
07079
07080
07081
07082 static void
07083 cp_parser_declaration_seq_opt (cp_parser* parser)
07084 {
07085 while (true)
07086 {
07087 cp_token *token;
07088
07089 token = cp_lexer_peek_token (parser->lexer);
07090
07091 if (token->type == CPP_CLOSE_BRACE
07092 || token->type == CPP_EOF
07093 || token->type == CPP_PRAGMA_EOL)
07094 break;
07095
07096 if (token->type == CPP_SEMICOLON)
07097 {
07098
07099
07100 cp_lexer_consume_token (parser->lexer);
07101 if (pedantic && !in_system_header)
07102 pedwarn ("extra %<;%>");
07103 continue;
07104 }
07105
07106
07107
07108 if (!parser->implicit_extern_c && token->implicit_extern_c)
07109 {
07110 push_lang_context (lang_name_c);
07111 parser->implicit_extern_c = true;
07112 }
07113 else if (parser->implicit_extern_c && !token->implicit_extern_c)
07114 {
07115 pop_lang_context ();
07116 parser->implicit_extern_c = false;
07117 }
07118
07119 if (token->type == CPP_PRAGMA)
07120 {
07121
07122
07123
07124
07125 cp_parser_pragma (parser, pragma_external);
07126 continue;
07127 }
07128
07129
07130 cp_parser_declaration (parser);
07131 }
07132 }
07133
07134
07135
07136
07137
07138
07139
07140
07141
07142
07143
07144
07145
07146
07147
07148
07149
07150 static void
07151 cp_parser_declaration (cp_parser* parser)
07152 {
07153 cp_token token1;
07154 cp_token token2;
07155 int saved_pedantic;
07156 void *p;
07157
07158
07159 if (cp_parser_extension_opt (parser, &saved_pedantic))
07160 {
07161
07162 cp_parser_declaration (parser);
07163
07164 pedantic = saved_pedantic;
07165
07166 return;
07167 }
07168
07169
07170 token1 = *cp_lexer_peek_token (parser->lexer);
07171
07172 if (token1.type != CPP_EOF)
07173 token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
07174 else
07175 {
07176 token2.type = CPP_EOF;
07177 token2.keyword = RID_MAX;
07178 }
07179
07180
07181 p = obstack_alloc (&declarator_obstack, 0);
07182
07183
07184
07185 if (token1.keyword == RID_EXTERN
07186 && cp_parser_is_string_literal (&token2))
07187 cp_parser_linkage_specification (parser);
07188
07189
07190
07191 else if (token1.keyword == RID_TEMPLATE)
07192 {
07193
07194 if (token2.type == CPP_LESS
07195 && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
07196 cp_parser_explicit_specialization (parser);
07197
07198 else if (token2.type == CPP_LESS)
07199 cp_parser_template_declaration (parser, false);
07200
07201 else
07202 cp_parser_explicit_instantiation (parser);
07203 }
07204
07205
07206 else if (token1.keyword == RID_EXPORT)
07207 cp_parser_template_declaration (parser, false);
07208
07209
07210
07211 else if (cp_parser_allow_gnu_extensions_p (parser)
07212 && (token1.keyword == RID_EXTERN
07213 || token1.keyword == RID_STATIC
07214 || token1.keyword == RID_INLINE)
07215 && token2.keyword == RID_TEMPLATE)
07216 cp_parser_explicit_instantiation (parser);
07217
07218
07219 else if (token1.keyword == RID_NAMESPACE
07220 && (
07221 (token2.type == CPP_NAME
07222 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
07223 != CPP_EQ))
07224
07225 || token2.type == CPP_OPEN_BRACE
07226 || token2.keyword == RID_ATTRIBUTE))
07227 cp_parser_namespace_definition (parser);
07228
07229 else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
07230 cp_parser_objc_declaration (parser);
07231
07232
07233 else
07234
07235 cp_parser_block_declaration (parser, false);
07236
07237
07238 obstack_free (&declarator_obstack, p);
07239 }
07240
07241
07242
07243
07244
07245
07246
07247
07248
07249
07250
07251
07252
07253
07254
07255
07256
07257
07258
07259 static void
07260 cp_parser_block_declaration (cp_parser *parser,
07261 bool statement_p)
07262 {
07263 cp_token *token1;
07264 int saved_pedantic;
07265
07266
07267 if (cp_parser_extension_opt (parser, &saved_pedantic))
07268 {
07269
07270 cp_parser_block_declaration (parser, statement_p);
07271
07272 pedantic = saved_pedantic;
07273
07274 return;
07275 }
07276
07277
07278
07279 token1 = cp_lexer_peek_token (parser->lexer);
07280
07281
07282 if (token1->keyword == RID_ASM)
07283 {
07284 if (statement_p)
07285 cp_parser_commit_to_tentative_parse (parser);
07286 cp_parser_asm_definition (parser);
07287 }
07288
07289
07290 else if (token1->keyword == RID_NAMESPACE)
07291 cp_parser_namespace_alias_definition (parser);
07292
07293
07294 else if (token1->keyword == RID_USING)
07295 {
07296 cp_token *token2;
07297
07298 if (statement_p)
07299 cp_parser_commit_to_tentative_parse (parser);
07300
07301
07302 token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
07303 if (token2->keyword == RID_NAMESPACE)
07304 cp_parser_using_directive (parser);
07305
07306 else
07307 cp_parser_using_declaration (parser,
07308 false);
07309 }
07310
07311 else if (token1->keyword == RID_LABEL)
07312 {
07313 if (statement_p)
07314 cp_parser_commit_to_tentative_parse (parser);
07315 cp_parser_label_declaration (parser);
07316 }
07317
07318 else
07319 cp_parser_simple_declaration (parser, !statement_p);
07320 }
07321
07322
07323
07324
07325
07326
07327
07328
07329
07330
07331
07332
07333
07334 static void
07335 cp_parser_simple_declaration (cp_parser* parser,
07336 bool function_definition_allowed_p)
07337 {
07338 cp_decl_specifier_seq decl_specifiers;
07339 int declares_class_or_enum;
07340 bool saw_declarator;
07341
07342
07343
07344
07345 push_deferring_access_checks (dk_deferred);
07346
07347
07348
07349
07350
07351
07352
07353
07354
07355
07356
07357
07358 cp_parser_decl_specifier_seq (parser,
07359 CP_PARSER_FLAGS_OPTIONAL,
07360 &decl_specifiers,
07361 &declares_class_or_enum);
07362
07363 stop_deferring_access_checks ();
07364
07365
07366
07367
07368 if (!function_definition_allowed_p
07369 && !decl_specifiers.any_specifiers_p)
07370 {
07371 cp_parser_error (parser, "expected declaration");
07372 goto done;
07373 }
07374
07375
07376
07377
07378
07379
07380
07381 if (!decl_specifiers.type
07382 && cp_parser_parse_and_diagnose_invalid_type_name (parser))
07383 {
07384
07385
07386 cp_parser_commit_to_tentative_parse (parser);
07387
07388 goto done;
07389 }
07390
07391
07392
07393
07394 if (decl_specifiers.any_specifiers_p
07395 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
07396 cp_parser_commit_to_tentative_parse (parser);
07397
07398
07399
07400 saw_declarator = false;
07401 while (cp_lexer_next_token_is_not (parser->lexer,
07402 CPP_SEMICOLON))
07403 {
07404 cp_token *token;
07405 bool function_definition_p;
07406 tree decl;
07407
07408 if (saw_declarator)
07409 {
07410
07411 token = cp_lexer_peek_token (parser->lexer);
07412 gcc_assert (token->type == CPP_COMMA);
07413 cp_lexer_consume_token (parser->lexer);
07414 }
07415 else
07416 saw_declarator = true;
07417
07418
07419 decl = cp_parser_init_declarator (parser, &decl_specifiers,
07420 NULL,
07421 function_definition_allowed_p,
07422 false,
07423 declares_class_or_enum,
07424 &function_definition_p);
07425
07426
07427
07428
07429 if (cp_parser_error_occurred (parser))
07430 goto done;
07431
07432 if (function_definition_p)
07433 {
07434
07435
07436
07437
07438
07439
07440 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
07441 error ("mixing declarations and function-definitions is forbidden");
07442
07443 else
07444 {
07445 pop_deferring_access_checks ();
07446 return;
07447 }
07448 }
07449
07450 token = cp_lexer_peek_token (parser->lexer);
07451
07452 if (token->type == CPP_COMMA)
07453 ;
07454
07455 else if (token->type == CPP_SEMICOLON)
07456 break;
07457
07458 else
07459 {
07460
07461
07462 if (decl != error_mark_node
07463 || cp_parser_uncommitted_to_tentative_parse_p (parser))
07464 cp_parser_error (parser, "expected %<,%> or %<;%>");
07465
07466 cp_parser_skip_to_end_of_statement (parser);
07467
07468 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
07469 cp_lexer_consume_token (parser->lexer);
07470 goto done;
07471 }
07472
07473
07474
07475
07476
07477
07478 function_definition_allowed_p = false;
07479 }
07480
07481
07482
07483
07484 if (!saw_declarator)
07485 {
07486 if (cp_parser_declares_only_class_p (parser))
07487 shadow_tag (&decl_specifiers);
07488
07489 perform_deferred_access_checks ();
07490 }
07491
07492
07493 cp_parser_require (parser, CPP_SEMICOLON, "`;'");
07494
07495 done:
07496 pop_deferring_access_checks ();
07497 }
07498
07499
07500
07501
07502
07503
07504
07505
07506
07507
07508
07509
07510
07511
07512
07513
07514
07515
07516
07517
07518
07519
07520
07521
07522
07523
07524
07525
07526
07527
07528
07529
07530 static void
07531 cp_parser_decl_specifier_seq (cp_parser* parser,
07532 cp_parser_flags flags,
07533 cp_decl_specifier_seq *decl_specs,
07534 int* declares_class_or_enum)
07535 {
07536 bool constructor_possible_p = !parser->in_declarator_p;
07537
07538
07539 clear_decl_specs (decl_specs);
07540
07541
07542 *declares_class_or_enum = 0;
07543
07544
07545 while (true)
07546 {
07547 bool constructor_p;
07548 bool found_decl_spec;
07549 cp_token *token;
07550
07551
07552 token = cp_lexer_peek_token (parser->lexer);
07553
07554 if (token->keyword == RID_ATTRIBUTE)
07555 {
07556
07557 decl_specs->attributes
07558 = chainon (decl_specs->attributes,
07559 cp_parser_attributes_opt (parser));
07560 continue;
07561 }
07562
07563 found_decl_spec = true;
07564
07565
07566 switch (token->keyword)
07567 {
07568
07569
07570 case RID_FRIEND:
07571 if (!at_class_scope_p ())
07572 {
07573 error ("%<friend%> used outside of class");
07574 cp_lexer_purge_token (parser->lexer);
07575 }
07576 else
07577 {
07578 ++decl_specs->specs[(int) ds_friend];
07579
07580 cp_lexer_consume_token (parser->lexer);
07581 }
07582 break;
07583
07584
07585
07586
07587
07588 case RID_INLINE:
07589 case RID_VIRTUAL:
07590 case RID_EXPLICIT:
07591 cp_parser_function_specifier_opt (parser, decl_specs);
07592 break;
07593
07594
07595
07596 case RID_TYPEDEF:
07597 ++decl_specs->specs[(int) ds_typedef];
07598
07599 cp_lexer_consume_token (parser->lexer);
07600
07601 constructor_possible_p = false;
07602
07603
07604 cp_parser_commit_to_tentative_parse (parser);
07605
07606 if (decl_specs->storage_class != sc_none)
07607 decl_specs->conflicting_specifiers_p = true;
07608 break;
07609
07610
07611
07612
07613
07614
07615
07616
07617
07618
07619 case RID_AUTO:
07620 case RID_REGISTER:
07621 case RID_STATIC:
07622 case RID_EXTERN:
07623 case RID_MUTABLE:
07624
07625 cp_lexer_consume_token (parser->lexer);
07626 cp_parser_set_storage_class (parser, decl_specs, token->keyword);
07627 break;
07628 case RID_THREAD:
07629
07630 cp_lexer_consume_token (parser->lexer);
07631 ++decl_specs->specs[(int) ds_thread];
07632 break;
07633
07634 default:
07635
07636 found_decl_spec = false;
07637 break;
07638 }
07639
07640
07641
07642 constructor_p
07643 = (!found_decl_spec
07644 && constructor_possible_p
07645 && (cp_parser_constructor_declarator_p
07646 (parser, decl_specs->specs[(int) ds_friend] != 0)));
07647
07648
07649
07650 if (!found_decl_spec && !constructor_p)
07651 {
07652 int decl_spec_declares_class_or_enum;
07653 bool is_cv_qualifier;
07654 tree type_spec;
07655
07656 type_spec
07657 = cp_parser_type_specifier (parser, flags,
07658 decl_specs,
07659 true,
07660 &decl_spec_declares_class_or_enum,
07661 &is_cv_qualifier);
07662
07663 *declares_class_or_enum |= decl_spec_declares_class_or_enum;
07664
07665
07666
07667
07668
07669
07670
07671
07672
07673
07674
07675
07676
07677
07678
07679
07680
07681
07682
07683
07684
07685
07686
07687
07688
07689
07690
07691
07692
07693
07694
07695
07696
07697
07698
07699
07700
07701 if (type_spec && !is_cv_qualifier)
07702 flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
07703
07704 if (type_spec)
07705 {
07706 constructor_possible_p = false;
07707 found_decl_spec = true;
07708 }
07709 }
07710
07711
07712
07713 if (!found_decl_spec)
07714 break;
07715
07716 decl_specs->any_specifiers_p = true;
07717
07718
07719 flags |= CP_PARSER_FLAGS_OPTIONAL;
07720 }
07721
07722 cp_parser_check_decl_spec (decl_specs);
07723
07724
07725 if (decl_specs->specs[(int) ds_friend] != 0
07726 && (*declares_class_or_enum & 2))
07727 error ("class definition may not be declared a friend");
07728 }
07729
07730
07731
07732
07733
07734
07735
07736
07737
07738
07739
07740
07741
07742
07743
07744
07745
07746 static tree
07747 cp_parser_storage_class_specifier_opt (cp_parser* parser)
07748 {
07749 switch (cp_lexer_peek_token (parser->lexer)->keyword)
07750 {
07751 case RID_AUTO:
07752 case RID_REGISTER:
07753 case RID_STATIC:
07754 case RID_EXTERN:
07755 case RID_MUTABLE:
07756 case RID_THREAD:
07757
07758 return cp_lexer_consume_token (parser->lexer)->u.value;
07759
07760 default:
07761 return NULL_TREE;
07762 }
07763 }
07764
07765
07766
07767
07768
07769
07770
07771
07772
07773
07774
07775 static tree
07776 cp_parser_function_specifier_opt (cp_parser* parser,
07777 cp_decl_specifier_seq *decl_specs)
07778 {
07779 switch (cp_lexer_peek_token (parser->lexer)->keyword)
07780 {
07781 case RID_INLINE:
07782 if (decl_specs)
07783 ++decl_specs->specs[(int) ds_inline];
07784 break;
07785
07786 case RID_VIRTUAL:
07787
07788
07789
07790 if (PROCESSING_REAL_TEMPLATE_DECL_P ())
07791 error ("templates may not be %<virtual%>");
07792 else if (decl_specs)
07793 ++decl_specs->specs[(int) ds_virtual];
07794 break;
07795
07796 case RID_EXPLICIT:
07797 if (decl_specs)
07798 ++decl_specs->specs[(int) ds_explicit];
07799 break;
07800
07801 default:
07802 return NULL_TREE;
07803 }
07804
07805
07806 return cp_lexer_consume_token (parser->lexer)->u.value;
07807 }
07808
07809
07810
07811
07812
07813
07814
07815 static void
07816 cp_parser_linkage_specification (cp_parser* parser)
07817 {
07818 tree linkage;
07819
07820
07821 cp_parser_require_keyword (parser, RID_EXTERN, "`extern'");
07822
07823
07824 linkage = cp_parser_string_literal (parser, false, false);
07825
07826
07827
07828
07829 if (strlen (TREE_STRING_POINTER (linkage))
07830 != (size_t) (TREE_STRING_LENGTH (linkage) - 1))
07831 {
07832 cp_parser_error (parser, "invalid linkage-specification");
07833
07834 linkage = lang_name_cplusplus;
07835 }
07836 else
07837 linkage = get_identifier (TREE_STRING_POINTER (linkage));
07838
07839
07840 push_lang_context (linkage);
07841
07842
07843
07844 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
07845 {
07846
07847 cp_lexer_consume_token (parser->lexer);
07848
07849 cp_parser_declaration_seq_opt (parser);
07850
07851 cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'");
07852 }
07853
07854 else
07855 {
07856 bool saved_in_unbraced_linkage_specification_p;
07857
07858 saved_in_unbraced_linkage_specification_p
07859 = parser->in_unbraced_linkage_specification_p;
07860 parser->in_unbraced_linkage_specification_p = true;
07861 cp_parser_declaration (parser);
07862 parser->in_unbraced_linkage_specification_p
07863 = saved_in_unbraced_linkage_specification_p;
07864 }
07865
07866
07867 pop_lang_context ();
07868 }
07869
07870
07871
07872
07873
07874
07875
07876
07877
07878
07879 static tree
07880 cp_parser_conversion_function_id (cp_parser* parser)
07881 {
07882 tree type;
07883 tree saved_scope;
07884 tree saved_qualifying_scope;
07885 tree saved_object_scope;
07886 tree pushed_scope = NULL_TREE;
07887
07888
07889 if (!cp_parser_require_keyword (parser, RID_OPERATOR, "`operator'"))
07890 return error_mark_node;
07891
07892
07893
07894 saved_scope = parser->scope;
07895 saved_qualifying_scope = parser->qualifying_scope;
07896 saved_object_scope = parser->object_scope;
07897
07898
07899
07900
07901
07902
07903
07904
07905
07906
07907
07908
07909
07910 if (saved_scope)
07911 pushed_scope = push_scope (saved_scope);
07912
07913 type = cp_parser_conversion_type_id (parser);
07914
07915 if (pushed_scope)
07916 pop_scope (pushed_scope);
07917
07918 parser->scope = saved_scope;
07919 parser->qualifying_scope = saved_qualifying_scope;
07920 parser->object_scope = saved_object_scope;
07921
07922 if (type == error_mark_node)
07923 return error_mark_node;
07924 return mangle_conv_op_name_for_type (type);
07925 }
07926
07927
07928
07929
07930
07931
07932
07933
07934 static tree
07935 cp_parser_conversion_type_id (cp_parser* parser)
07936 {
07937 tree attributes;
07938 cp_decl_specifier_seq type_specifiers;
07939 cp_declarator *declarator;
07940 tree type_specified;
07941
07942
07943 attributes = cp_parser_attributes_opt (parser);
07944
07945 cp_parser_type_specifier_seq (parser, false,
07946 &type_specifiers);
07947
07948 if (type_specifiers.type == error_mark_node)
07949 return error_mark_node;
07950
07951 declarator = cp_parser_conversion_declarator_opt (parser);
07952
07953 type_specified = grokdeclarator (declarator, &type_specifiers, TYPENAME,
07954 0, &attributes);
07955 if (attributes)
07956 cplus_decl_attributes (&type_specified, attributes, 0);
07957 return type_specified;
07958 }
07959
07960
07961
07962
07963
07964
07965
07966
07967 static cp_declarator *
07968 cp_parser_conversion_declarator_opt (cp_parser* parser)
07969 {
07970 enum tree_code code;
07971 tree class_type;
07972 cp_cv_quals cv_quals;
07973
07974
07975 cp_parser_parse_tentatively (parser);
07976
07977 code = cp_parser_ptr_operator (parser, &class_type, &cv_quals);
07978
07979 if (cp_parser_parse_definitely (parser))
07980 {
07981 cp_declarator *declarator;
07982
07983
07984 declarator = cp_parser_conversion_declarator_opt (parser);
07985
07986
07987 if (class_type)
07988 declarator = make_ptrmem_declarator (cv_quals, class_type,
07989 declarator);
07990 else if (code == INDIRECT_REF)
07991 declarator = make_pointer_declarator (cv_quals, declarator);
07992 else
07993 declarator = make_reference_declarator (cv_quals, declarator);
07994
07995 return declarator;
07996 }
07997
07998 return NULL;
07999 }
08000
08001
08002
08003
08004
08005
08006
08007
08008 static bool
08009 cp_parser_ctor_initializer_opt (cp_parser* parser)
08010 {
08011
08012
08013 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
08014 {
08015
08016 if (DECL_CONSTRUCTOR_P (current_function_decl))
08017 finish_mem_initializers (NULL_TREE);
08018
08019 return false;
08020 }
08021
08022
08023 cp_lexer_consume_token (parser->lexer);
08024
08025 cp_parser_mem_initializer_list (parser);
08026
08027 return true;
08028 }
08029
08030
08031
08032
08033
08034
08035
08036 static void
08037 cp_parser_mem_initializer_list (cp_parser* parser)
08038 {
08039 tree mem_initializer_list = NULL_TREE;
08040
08041
08042
08043 if (!DECL_CONSTRUCTOR_P (current_function_decl))
08044 error ("only constructors take base initializers");
08045
08046
08047 while (true)
08048 {
08049 tree mem_initializer;
08050
08051
08052 mem_initializer = cp_parser_mem_initializer (parser);
08053
08054 if (mem_initializer != error_mark_node)
08055 {
08056 TREE_CHAIN (mem_initializer) = mem_initializer_list;
08057 mem_initializer_list = mem_initializer;
08058 }
08059
08060 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
08061 break;
08062
08063 cp_lexer_consume_token (parser->lexer);
08064 }
08065
08066
08067 if (DECL_CONSTRUCTOR_P (current_function_decl))
08068 finish_mem_initializers (mem_initializer_list);
08069 }
08070
08071
08072
08073
08074
08075
08076
08077
08078
08079
08080
08081
08082
08083
08084
08085
08086 static tree
08087 cp_parser_mem_initializer (cp_parser* parser)
08088 {
08089 tree mem_initializer_id;
08090 tree expression_list;
08091 tree member;
08092
08093
08094 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
08095 {
08096 pedwarn ("anachronistic old-style base class initializer");
08097 mem_initializer_id = NULL_TREE;
08098 }
08099 else
08100 mem_initializer_id = cp_parser_mem_initializer_id (parser);
08101 member = expand_member_init (mem_initializer_id);
08102 if (member && !DECL_P (member))
08103 in_base_initializer = 1;
08104
08105 expression_list
08106 = cp_parser_parenthesized_expression_list (parser, false,
08107 false,
08108 NULL);
08109 if (expression_list == error_mark_node)
08110 return error_mark_node;
08111 if (!expression_list)
08112 expression_list = void_type_node;
08113
08114 in_base_initializer = 0;
08115
08116 return member ? build_tree_list (member, expression_list) : error_mark_node;
08117 }
08118
08119
08120
08121
08122
08123
08124
08125
08126
08127
08128
08129 static tree
08130 cp_parser_mem_initializer_id (cp_parser* parser)
08131 {
08132 bool global_scope_p;
08133 bool nested_name_specifier_p;
08134 bool template_p = false;
08135 tree id;
08136
08137
08138 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
08139 {
08140 error ("keyword %<typename%> not allowed in this context (a qualified "
08141 "member initializer is implicitly a type)");
08142 cp_lexer_consume_token (parser->lexer);
08143 }
08144
08145 global_scope_p
08146 = (cp_parser_global_scope_opt (parser,
08147 false)
08148 != NULL_TREE);
08149
08150
08151
08152
08153
08154
08155
08156
08157
08158
08159
08160
08161 nested_name_specifier_p
08162 = (cp_parser_nested_name_specifier_opt (parser,
08163 true,
08164 true,
08165 true,
08166 true)
08167 != NULL_TREE);
08168 if (nested_name_specifier_p)
08169 template_p = cp_parser_optional_template_keyword (parser);
08170
08171
08172 if (global_scope_p || nested_name_specifier_p)
08173 return cp_parser_class_name (parser,
08174 true,
08175 template_p,
08176 none_type,
08177 true,
08178 false,
08179 true);
08180
08181 cp_parser_parse_tentatively (parser);
08182
08183 id = cp_parser_class_name (parser,
08184 true,
08185 false,
08186 none_type,
08187 true,
08188 false,
08189 true);
08190
08191 if (cp_parser_parse_definitely (parser))
08192 return id;
08193
08194 return cp_parser_identifier (parser);
08195 }
08196
08197
08198
08199
08200
08201
08202
08203
08204
08205
08206
08207 static tree
08208 cp_parser_operator_function_id (cp_parser* parser)
08209 {
08210
08211 if (!cp_parser_require_keyword (parser, RID_OPERATOR, "`operator'"))
08212 return error_mark_node;
08213
08214 return cp_parser_operator (parser);
08215 }
08216
08217
08218
08219
08220
08221
08222
08223
08224
08225
08226
08227
08228
08229
08230
08231
08232 static tree
08233 cp_parser_operator (cp_parser* parser)
08234 {
08235 tree id = NULL_TREE;
08236 cp_token *token;
08237
08238
08239 token = cp_lexer_peek_token (parser->lexer);
08240
08241 switch (token->type)
08242 {
08243 case CPP_KEYWORD:
08244 {
08245 enum tree_code op;
08246
08247
08248 if (token->keyword == RID_NEW)
08249 op = NEW_EXPR;
08250 else if (token->keyword == RID_DELETE)
08251 op = DELETE_EXPR;
08252 else
08253 break;
08254
08255
08256 cp_lexer_consume_token (parser->lexer);
08257
08258
08259 token = cp_lexer_peek_token (parser->lexer);
08260
08261
08262 if (token->type == CPP_OPEN_SQUARE)
08263 {
08264
08265 cp_lexer_consume_token (parser->lexer);
08266
08267 cp_parser_require (parser, CPP_CLOSE_SQUARE, "`]'");
08268 id = ansi_opname (op == NEW_EXPR
08269 ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
08270 }
08271
08272 else
08273 id = ansi_opname (op);
08274
08275 return id;
08276 }
08277
08278 case CPP_PLUS:
08279 id = ansi_opname (PLUS_EXPR);
08280 break;
08281
08282 case CPP_MINUS:
08283 id = ansi_opname (MINUS_EXPR);
08284 break;
08285
08286 case CPP_MULT:
08287 id = ansi_opname (MULT_EXPR);
08288 break;
08289
08290 case CPP_DIV:
08291 id = ansi_opname (TRUNC_DIV_EXPR);
08292 break;
08293
08294 case CPP_MOD:
08295 id = ansi_opname (TRUNC_MOD_EXPR);
08296 break;
08297
08298 case CPP_XOR:
08299 id = ansi_opname (BIT_XOR_EXPR);
08300 break;
08301
08302 case CPP_AND:
08303 id = ansi_opname (BIT_AND_EXPR);
08304 break;
08305
08306 case CPP_OR:
08307 id = ansi_opname (BIT_IOR_EXPR);
08308 break;
08309
08310 case CPP_COMPL:
08311 id = ansi_opname (BIT_NOT_EXPR);
08312 break;
08313
08314 case CPP_NOT:
08315 id = ansi_opname (TRUTH_NOT_EXPR);
08316 break;
08317
08318 case CPP_EQ:
08319 id = ansi_assopname (NOP_EXPR);
08320 break;
08321
08322 case CPP_LESS:
08323 id = ansi_opname (LT_EXPR);
08324 break;
08325
08326 case CPP_GREATER:
08327 id = ansi_opname (GT_EXPR);
08328 break;
08329
08330 case CPP_PLUS_EQ:
08331 id = ansi_assopname (PLUS_EXPR);
08332 break;
08333
08334 case CPP_MINUS_EQ:
08335 id = ansi_assopname (MINUS_EXPR);
08336 break;
08337
08338 case CPP_MULT_EQ:
08339 id = ansi_assopname (MULT_EXPR);
08340 break;
08341
08342 case CPP_DIV_EQ:
08343 id = ansi_assopname (TRUNC_DIV_EXPR);
08344 break;
08345
08346 case CPP_MOD_EQ:
08347 id = ansi_assopname (TRUNC_MOD_EXPR);
08348 break;
08349
08350 case CPP_XOR_EQ:
08351 id = ansi_assopname (BIT_XOR_EXPR);
08352 break;
08353
08354 case CPP_AND_EQ:
08355 id = ansi_assopname (BIT_AND_EXPR);
08356 break;
08357
08358 case CPP_OR_EQ:
08359 id = ansi_assopname (BIT_IOR_EXPR);
08360 break;
08361
08362 case CPP_LSHIFT:
08363 id = ansi_opname (LSHIFT_EXPR);
08364 break;
08365
08366 case CPP_RSHIFT:
08367 id = ansi_opname (RSHIFT_EXPR);
08368 break;
08369
08370 case CPP_LSHIFT_EQ:
08371 id = ansi_assopname (LSHIFT_EXPR);
08372 break;
08373
08374 case CPP_RSHIFT_EQ:
08375 id = ansi_assopname (RSHIFT_EXPR);
08376 break;
08377
08378 case CPP_EQ_EQ:
08379 id = ansi_opname (EQ_EXPR);
08380 break;
08381
08382 case CPP_NOT_EQ:
08383 id = ansi_opname (NE_EXPR);
08384 break;
08385
08386 case CPP_LESS_EQ:
08387 id = ansi_opname (LE_EXPR);
08388 break;
08389
08390 case CPP_GREATER_EQ:
08391 id = ansi_opname (GE_EXPR);
08392 break;
08393
08394 case CPP_AND_AND:
08395 id = ansi_opname (TRUTH_ANDIF_EXPR);
08396 break;
08397
08398 case CPP_OR_OR:
08399 id = ansi_opname (TRUTH_ORIF_EXPR);
08400 break;
08401
08402 case CPP_PLUS_PLUS:
08403 id = ansi_opname (POSTINCREMENT_EXPR);
08404 break;
08405
08406 case CPP_MINUS_MINUS:
08407 id = ansi_opname (PREDECREMENT_EXPR);
08408 break;
08409
08410 case CPP_COMMA:
08411 id = ansi_opname (COMPOUND_EXPR);
08412 break;
08413
08414 case CPP_DEREF_STAR:
08415 id = ansi_opname (MEMBER_REF);
08416 break;
08417
08418 case CPP_DEREF:
08419 id = ansi_opname (COMPONENT_REF);
08420 break;
08421
08422 case CPP_OPEN_PAREN:
08423
08424 cp_lexer_consume_token (parser->lexer);
08425
08426 cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
08427 return ansi_opname (CALL_EXPR);
08428
08429 case CPP_OPEN_SQUARE:
08430
08431 cp_lexer_consume_token (parser->lexer);
08432
08433 cp_parser_require (parser, CPP_CLOSE_SQUARE, "`]'");
08434 return ansi_opname (ARRAY_REF);
08435
08436 default:
08437
08438 break;
08439 }
08440
08441
08442
08443 if (id)
08444 cp_lexer_consume_token (parser->lexer);
08445
08446 else
08447 {
08448 cp_parser_error (parser, "expected operator");
08449 id = error_mark_node;
08450 }
08451
08452 return id;
08453 }
08454
08455
08456
08457
08458
08459
08460
08461
08462
08463
08464
08465
08466
08467
08468
08469
08470
08471
08472
08473
08474
08475
08476 static void
08477 cp_parser_template_declaration (cp_parser* parser, bool member_p)
08478 {
08479
08480 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXPORT))
08481 {
08482
08483 cp_lexer_consume_token (parser->lexer);
08484
08485 warning (0, "keyword %<export%> not implemented, and will be ignored");
08486 }
08487
08488 cp_parser_template_declaration_after_export (parser, member_p);
08489 }
08490
08491
08492
08493
08494
08495
08496
08497
08498
08499
08500 static tree
08501 cp_parser_template_parameter_list (cp_parser* parser)
08502 {
08503 tree parameter_list = NULL_TREE;
08504
08505 begin_template_parm_list ();
08506 while (true)
08507 {
08508 tree parameter;
08509 cp_token *token;
08510 bool is_non_type;
08511
08512
08513 parameter = cp_parser_template_parameter (parser, &is_non_type);
08514
08515 if (parameter != error_mark_node)
08516 parameter_list = process_template_parm (parameter_list,
08517 parameter,
08518 is_non_type);
08519 else
08520 {
08521 tree err_parm = build_tree_list (parameter, parameter);
08522 TREE_VALUE (err_parm) = error_mark_node;
08523 parameter_list = chainon (parameter_list, err_parm);
08524 }
08525
08526
08527 token = cp_lexer_peek_token (parser->lexer);
08528
08529 if (token->type != CPP_COMMA)
08530 break;
08531
08532 cp_lexer_consume_token (parser->lexer);
08533 }
08534
08535 return end_template_parm_list (parameter_list);
08536 }
08537
08538
08539
08540
08541
08542
08543
08544
08545
08546
08547
08548
08549 static tree
08550 cp_parser_template_parameter (cp_parser* parser, bool *is_non_type)
08551 {
08552 cp_token *token;
08553 cp_parameter_declarator *parameter_declarator;
08554 tree parm;
08555
08556
08557 *is_non_type = false;
08558
08559 token = cp_lexer_peek_token (parser->lexer);
08560
08561 if (token->keyword == RID_TEMPLATE)
08562 return cp_parser_type_parameter (parser);
08563
08564
08565
08566
08567
08568
08569
08570
08571
08572
08573
08574
08575
08576 if (token->keyword == RID_TYPENAME || token->keyword == RID_CLASS)
08577 {
08578
08579 token = cp_lexer_peek_nth_token (parser->lexer, 2);
08580
08581 if (token->type == CPP_NAME)
08582 token = cp_lexer_peek_nth_token (parser->lexer, 3);
08583
08584
08585 if (token->type == CPP_COMMA
08586 || token->type == CPP_EQ
08587 || token->type == CPP_GREATER)
08588 return cp_parser_type_parameter (parser);
08589 }
08590
08591
08592
08593
08594
08595
08596
08597
08598
08599 *is_non_type = true;
08600 parameter_declarator
08601 = cp_parser_parameter_declaration (parser, true,
08602 NULL);
08603 parm = grokdeclarator (parameter_declarator->declarator,
08604 ¶meter_declarator->decl_specifiers,
08605 PARM, 0,
08606 NULL);
08607 if (parm == error_mark_node)
08608 return error_mark_node;
08609 return build_tree_list (parameter_declarator->default_argument, parm);
08610 }
08611
08612
08613
08614
08615
08616
08617
08618
08619
08620
08621
08622
08623
08624
08625
08626
08627 static tree
08628 cp_parser_type_parameter (cp_parser* parser)
08629 {
08630 cp_token *token;
08631 tree parameter;
08632
08633
08634 token = cp_parser_require (parser, CPP_KEYWORD,
08635 "`class', `typename', or `template'");
08636 if (!token)
08637 return error_mark_node;
08638
08639 switch (token->keyword)
08640 {
08641 case RID_CLASS:
08642 case RID_TYPENAME:
08643 {
08644 tree identifier;
08645 tree default_argument;
08646
08647
08648
08649 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
08650 identifier = cp_parser_identifier (parser);
08651 else
08652 identifier = NULL_TREE;
08653
08654
08655 parameter = finish_template_type_parm (class_type_node, identifier);
08656
08657
08658 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
08659 {
08660
08661 cp_lexer_consume_token (parser->lexer);
08662
08663 push_deferring_access_checks (dk_no_deferred);
08664 default_argument = cp_parser_type_id (parser);
08665 pop_deferring_access_checks ();
08666 }
08667 else
08668 default_argument = NULL_TREE;
08669
08670
08671
08672 parameter = build_tree_list (default_argument, parameter);
08673 }
08674 break;
08675
08676 case RID_TEMPLATE:
08677 {
08678 tree parameter_list;
08679 tree identifier;
08680 tree default_argument;
08681
08682
08683 cp_parser_require (parser, CPP_LESS, "`<'");
08684
08685 parameter_list = cp_parser_template_parameter_list (parser);
08686
08687 cp_parser_require (parser, CPP_GREATER, "`>'");
08688
08689 cp_parser_require_keyword (parser, RID_CLASS, "`class'");
08690
08691
08692
08693
08694 if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
08695 && cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
08696 && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
08697 {
08698 identifier = cp_parser_identifier (parser);
08699
08700 if (identifier == error_mark_node)
08701 identifier = NULL_TREE;
08702 }
08703 else
08704 identifier = NULL_TREE;
08705
08706
08707 parameter = finish_template_template_parm (class_type_node,
08708 identifier);
08709
08710
08711
08712 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
08713 {
08714 bool is_template;
08715
08716
08717 cp_lexer_consume_token (parser->lexer);
08718
08719 push_deferring_access_checks (dk_no_deferred);
08720 default_argument
08721 = cp_parser_id_expression (parser,
08722 false,
08723 true,
08724 &is_template,
08725 false,
08726 false);
08727 if (TREE_CODE (default_argument) == TYPE_DECL)
08728
08729
08730
08731 ;
08732 else
08733
08734 default_argument
08735 = cp_parser_lookup_name (parser, default_argument,
08736 none_type,
08737 is_template,
08738 false,
08739 true,
08740