svn merge -r 217500:218679 svn+ssh://gcc.gnu.org/svn/gcc/trunk
[official-gcc.git] / gcc / cp / parser.c
blob176eec72dbe0c468e1346e5be1938d0361f803da
1 /* -*- C++ -*- Parser.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Written by Mark Mitchell <mark@codesourcery.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "timevar.h"
26 #include "cpplib.h"
27 #include "tree.h"
28 #include "print-tree.h"
29 #include "stringpool.h"
30 #include "attribs.h"
31 #include "trans-mem.h"
32 #include "cp-tree.h"
33 #include "intl.h"
34 #include "c-family/c-pragma.h"
35 #include "decl.h"
36 #include "flags.h"
37 #include "diagnostic-core.h"
38 #include "target.h"
39 #include "hash-map.h"
40 #include "is-a.h"
41 #include "plugin-api.h"
42 #include "vec.h"
43 #include "hashtab.h"
44 #include "hash-set.h"
45 #include "machmode.h"
46 #include "hard-reg-set.h"
47 #include "input.h"
48 #include "function.h"
49 #include "ipa-ref.h"
50 #include "cgraph.h"
51 #include "c-family/c-common.h"
52 #include "c-family/c-objc.h"
53 #include "plugin.h"
54 #include "tree-pretty-print.h"
55 #include "parser.h"
56 #include "type-utils.h"
57 #include "omp-low.h"
60 /* The lexer. */
62 /* The cp_lexer_* routines mediate between the lexer proper (in libcpp
63 and c-lex.c) and the C++ parser. */
65 static cp_token eof_token =
67 CPP_EOF, RID_MAX, 0, PRAGMA_NONE, false, false, false, 0, { NULL }
70 /* The various kinds of non integral constant we encounter. */
71 typedef enum non_integral_constant {
72 NIC_NONE,
73 /* floating-point literal */
74 NIC_FLOAT,
75 /* %<this%> */
76 NIC_THIS,
77 /* %<__FUNCTION__%> */
78 NIC_FUNC_NAME,
79 /* %<__PRETTY_FUNCTION__%> */
80 NIC_PRETTY_FUNC,
81 /* %<__func__%> */
82 NIC_C99_FUNC,
83 /* "%<va_arg%> */
84 NIC_VA_ARG,
85 /* a cast */
86 NIC_CAST,
87 /* %<typeid%> operator */
88 NIC_TYPEID,
89 /* non-constant compound literals */
90 NIC_NCC,
91 /* a function call */
92 NIC_FUNC_CALL,
93 /* an increment */
94 NIC_INC,
95 /* an decrement */
96 NIC_DEC,
97 /* an array reference */
98 NIC_ARRAY_REF,
99 /* %<->%> */
100 NIC_ARROW,
101 /* %<.%> */
102 NIC_POINT,
103 /* the address of a label */
104 NIC_ADDR_LABEL,
105 /* %<*%> */
106 NIC_STAR,
107 /* %<&%> */
108 NIC_ADDR,
109 /* %<++%> */
110 NIC_PREINCREMENT,
111 /* %<--%> */
112 NIC_PREDECREMENT,
113 /* %<new%> */
114 NIC_NEW,
115 /* %<delete%> */
116 NIC_DEL,
117 /* calls to overloaded operators */
118 NIC_OVERLOADED,
119 /* an assignment */
120 NIC_ASSIGNMENT,
121 /* a comma operator */
122 NIC_COMMA,
123 /* a call to a constructor */
124 NIC_CONSTRUCTOR,
125 /* a transaction expression */
126 NIC_TRANSACTION
127 } non_integral_constant;
129 /* The various kinds of errors about name-lookup failing. */
130 typedef enum name_lookup_error {
131 /* NULL */
132 NLE_NULL,
133 /* is not a type */
134 NLE_TYPE,
135 /* is not a class or namespace */
136 NLE_CXX98,
137 /* is not a class, namespace, or enumeration */
138 NLE_NOT_CXX98
139 } name_lookup_error;
141 /* The various kinds of required token */
142 typedef enum required_token {
143 RT_NONE,
144 RT_SEMICOLON, /* ';' */
145 RT_OPEN_PAREN, /* '(' */
146 RT_CLOSE_BRACE, /* '}' */
147 RT_OPEN_BRACE, /* '{' */
148 RT_CLOSE_SQUARE, /* ']' */
149 RT_OPEN_SQUARE, /* '[' */
150 RT_COMMA, /* ',' */
151 RT_SCOPE, /* '::' */
152 RT_LESS, /* '<' */
153 RT_GREATER, /* '>' */
154 RT_EQ, /* '=' */
155 RT_ELLIPSIS, /* '...' */
156 RT_MULT, /* '*' */
157 RT_COMPL, /* '~' */
158 RT_COLON, /* ':' */
159 RT_COLON_SCOPE, /* ':' or '::' */
160 RT_CLOSE_PAREN, /* ')' */
161 RT_COMMA_CLOSE_PAREN, /* ',' or ')' */
162 RT_PRAGMA_EOL, /* end of line */
163 RT_NAME, /* identifier */
165 /* The type is CPP_KEYWORD */
166 RT_NEW, /* new */
167 RT_DELETE, /* delete */
168 RT_RETURN, /* return */
169 RT_WHILE, /* while */
170 RT_EXTERN, /* extern */
171 RT_STATIC_ASSERT, /* static_assert */
172 RT_DECLTYPE, /* decltype */
173 RT_OPERATOR, /* operator */
174 RT_CLASS, /* class */
175 RT_TEMPLATE, /* template */
176 RT_NAMESPACE, /* namespace */
177 RT_USING, /* using */
178 RT_ASM, /* asm */
179 RT_TRY, /* try */
180 RT_CATCH, /* catch */
181 RT_THROW, /* throw */
182 RT_LABEL, /* __label__ */
183 RT_AT_TRY, /* @try */
184 RT_AT_SYNCHRONIZED, /* @synchronized */
185 RT_AT_THROW, /* @throw */
187 RT_SELECT, /* selection-statement */
188 RT_INTERATION, /* iteration-statement */
189 RT_JUMP, /* jump-statement */
190 RT_CLASS_KEY, /* class-key */
191 RT_CLASS_TYPENAME_TEMPLATE, /* class, typename, or template */
192 RT_TRANSACTION_ATOMIC, /* __transaction_atomic */
193 RT_TRANSACTION_RELAXED, /* __transaction_relaxed */
194 RT_TRANSACTION_CANCEL /* __transaction_cancel */
195 } required_token;
197 /* Prototypes. */
199 static cp_lexer *cp_lexer_new_main
200 (void);
201 static cp_lexer *cp_lexer_new_from_tokens
202 (cp_token_cache *tokens);
203 static void cp_lexer_destroy
204 (cp_lexer *);
205 static int cp_lexer_saving_tokens
206 (const cp_lexer *);
207 static cp_token *cp_lexer_token_at
208 (cp_lexer *, cp_token_position);
209 static void cp_lexer_get_preprocessor_token
210 (cp_lexer *, cp_token *);
211 static inline cp_token *cp_lexer_peek_token
212 (cp_lexer *);
213 static cp_token *cp_lexer_peek_nth_token
214 (cp_lexer *, size_t);
215 static inline bool cp_lexer_next_token_is
216 (cp_lexer *, enum cpp_ttype);
217 static bool cp_lexer_next_token_is_not
218 (cp_lexer *, enum cpp_ttype);
219 static bool cp_lexer_next_token_is_keyword
220 (cp_lexer *, enum rid);
221 static cp_token *cp_lexer_consume_token
222 (cp_lexer *);
223 static void cp_lexer_purge_token
224 (cp_lexer *);
225 static void cp_lexer_purge_tokens_after
226 (cp_lexer *, cp_token_position);
227 static void cp_lexer_save_tokens
228 (cp_lexer *);
229 static void cp_lexer_commit_tokens
230 (cp_lexer *);
231 static void cp_lexer_rollback_tokens
232 (cp_lexer *);
233 static void cp_lexer_print_token
234 (FILE *, cp_token *);
235 static inline bool cp_lexer_debugging_p
236 (cp_lexer *);
237 static void cp_lexer_start_debugging
238 (cp_lexer *) ATTRIBUTE_UNUSED;
239 static void cp_lexer_stop_debugging
240 (cp_lexer *) ATTRIBUTE_UNUSED;
242 static cp_token_cache *cp_token_cache_new
243 (cp_token *, cp_token *);
245 static void cp_parser_initial_pragma
246 (cp_token *);
248 static tree cp_literal_operator_id
249 (const char *);
251 static void cp_parser_cilk_simd
252 (cp_parser *, cp_token *);
253 static tree cp_parser_cilk_for
254 (cp_parser *, tree);
255 static bool cp_parser_omp_declare_reduction_exprs
256 (tree, cp_parser *);
257 static tree cp_parser_cilk_simd_vectorlength
258 (cp_parser *, tree, bool);
260 /* Manifest constants. */
261 #define CP_LEXER_BUFFER_SIZE ((256 * 1024) / sizeof (cp_token))
262 #define CP_SAVED_TOKEN_STACK 5
264 /* Variables. */
266 /* The stream to which debugging output should be written. */
267 static FILE *cp_lexer_debug_stream;
269 /* Nonzero if we are parsing an unevaluated operand: an operand to
270 sizeof, typeof, or alignof. */
271 int cp_unevaluated_operand;
273 /* Dump up to NUM tokens in BUFFER to FILE starting with token
274 START_TOKEN. If START_TOKEN is NULL, the dump starts with the
275 first token in BUFFER. If NUM is 0, dump all the tokens. If
276 CURR_TOKEN is set and it is one of the tokens in BUFFER, it will be
277 highlighted by surrounding it in [[ ]]. */
279 static void
280 cp_lexer_dump_tokens (FILE *file, vec<cp_token, va_gc> *buffer,
281 cp_token *start_token, unsigned num,
282 cp_token *curr_token)
284 unsigned i, nprinted;
285 cp_token *token;
286 bool do_print;
288 fprintf (file, "%u tokens\n", vec_safe_length (buffer));
290 if (buffer == NULL)
291 return;
293 if (num == 0)
294 num = buffer->length ();
296 if (start_token == NULL)
297 start_token = buffer->address ();
299 if (start_token > buffer->address ())
301 cp_lexer_print_token (file, &(*buffer)[0]);
302 fprintf (file, " ... ");
305 do_print = false;
306 nprinted = 0;
307 for (i = 0; buffer->iterate (i, &token) && nprinted < num; i++)
309 if (token == start_token)
310 do_print = true;
312 if (!do_print)
313 continue;
315 nprinted++;
316 if (token == curr_token)
317 fprintf (file, "[[");
319 cp_lexer_print_token (file, token);
321 if (token == curr_token)
322 fprintf (file, "]]");
324 switch (token->type)
326 case CPP_SEMICOLON:
327 case CPP_OPEN_BRACE:
328 case CPP_CLOSE_BRACE:
329 case CPP_EOF:
330 fputc ('\n', file);
331 break;
333 default:
334 fputc (' ', file);
338 if (i == num && i < buffer->length ())
340 fprintf (file, " ... ");
341 cp_lexer_print_token (file, &buffer->last ());
344 fprintf (file, "\n");
348 /* Dump all tokens in BUFFER to stderr. */
350 void
351 cp_lexer_debug_tokens (vec<cp_token, va_gc> *buffer)
353 cp_lexer_dump_tokens (stderr, buffer, NULL, 0, NULL);
356 DEBUG_FUNCTION void
357 debug (vec<cp_token, va_gc> &ref)
359 cp_lexer_dump_tokens (stderr, &ref, NULL, 0, NULL);
362 DEBUG_FUNCTION void
363 debug (vec<cp_token, va_gc> *ptr)
365 if (ptr)
366 debug (*ptr);
367 else
368 fprintf (stderr, "<nil>\n");
372 /* Dump the cp_parser tree field T to FILE if T is non-NULL. DESC is the
373 description for T. */
375 static void
376 cp_debug_print_tree_if_set (FILE *file, const char *desc, tree t)
378 if (t)
380 fprintf (file, "%s: ", desc);
381 print_node_brief (file, "", t, 0);
386 /* Dump parser context C to FILE. */
388 static void
389 cp_debug_print_context (FILE *file, cp_parser_context *c)
391 const char *status_s[] = { "OK", "ERROR", "COMMITTED" };
392 fprintf (file, "{ status = %s, scope = ", status_s[c->status]);
393 print_node_brief (file, "", c->object_type, 0);
394 fprintf (file, "}\n");
398 /* Print the stack of parsing contexts to FILE starting with FIRST. */
400 static void
401 cp_debug_print_context_stack (FILE *file, cp_parser_context *first)
403 unsigned i;
404 cp_parser_context *c;
406 fprintf (file, "Parsing context stack:\n");
407 for (i = 0, c = first; c; c = c->next, i++)
409 fprintf (file, "\t#%u: ", i);
410 cp_debug_print_context (file, c);
415 /* Print the value of FLAG to FILE. DESC is a string describing the flag. */
417 static void
418 cp_debug_print_flag (FILE *file, const char *desc, bool flag)
420 if (flag)
421 fprintf (file, "%s: true\n", desc);
425 /* Print an unparsed function entry UF to FILE. */
427 static void
428 cp_debug_print_unparsed_function (FILE *file, cp_unparsed_functions_entry *uf)
430 unsigned i;
431 cp_default_arg_entry *default_arg_fn;
432 tree fn;
434 fprintf (file, "\tFunctions with default args:\n");
435 for (i = 0;
436 vec_safe_iterate (uf->funs_with_default_args, i, &default_arg_fn);
437 i++)
439 fprintf (file, "\t\tClass type: ");
440 print_node_brief (file, "", default_arg_fn->class_type, 0);
441 fprintf (file, "\t\tDeclaration: ");
442 print_node_brief (file, "", default_arg_fn->decl, 0);
443 fprintf (file, "\n");
446 fprintf (file, "\n\tFunctions with definitions that require "
447 "post-processing\n\t\t");
448 for (i = 0; vec_safe_iterate (uf->funs_with_definitions, i, &fn); i++)
450 print_node_brief (file, "", fn, 0);
451 fprintf (file, " ");
453 fprintf (file, "\n");
455 fprintf (file, "\n\tNon-static data members with initializers that require "
456 "post-processing\n\t\t");
457 for (i = 0; vec_safe_iterate (uf->nsdmis, i, &fn); i++)
459 print_node_brief (file, "", fn, 0);
460 fprintf (file, " ");
462 fprintf (file, "\n");
466 /* Print the stack of unparsed member functions S to FILE. */
468 static void
469 cp_debug_print_unparsed_queues (FILE *file,
470 vec<cp_unparsed_functions_entry, va_gc> *s)
472 unsigned i;
473 cp_unparsed_functions_entry *uf;
475 fprintf (file, "Unparsed functions\n");
476 for (i = 0; vec_safe_iterate (s, i, &uf); i++)
478 fprintf (file, "#%u:\n", i);
479 cp_debug_print_unparsed_function (file, uf);
484 /* Dump the tokens in a window of size WINDOW_SIZE around the next_token for
485 the given PARSER. If FILE is NULL, the output is printed on stderr. */
487 static void
488 cp_debug_parser_tokens (FILE *file, cp_parser *parser, int window_size)
490 cp_token *next_token, *first_token, *start_token;
492 if (file == NULL)
493 file = stderr;
495 next_token = parser->lexer->next_token;
496 first_token = parser->lexer->buffer->address ();
497 start_token = (next_token > first_token + window_size / 2)
498 ? next_token - window_size / 2
499 : first_token;
500 cp_lexer_dump_tokens (file, parser->lexer->buffer, start_token, window_size,
501 next_token);
505 /* Dump debugging information for the given PARSER. If FILE is NULL,
506 the output is printed on stderr. */
508 void
509 cp_debug_parser (FILE *file, cp_parser *parser)
511 const size_t window_size = 20;
512 cp_token *token;
513 expanded_location eloc;
515 if (file == NULL)
516 file = stderr;
518 fprintf (file, "Parser state\n\n");
519 fprintf (file, "Number of tokens: %u\n",
520 vec_safe_length (parser->lexer->buffer));
521 cp_debug_print_tree_if_set (file, "Lookup scope", parser->scope);
522 cp_debug_print_tree_if_set (file, "Object scope",
523 parser->object_scope);
524 cp_debug_print_tree_if_set (file, "Qualifying scope",
525 parser->qualifying_scope);
526 cp_debug_print_context_stack (file, parser->context);
527 cp_debug_print_flag (file, "Allow GNU extensions",
528 parser->allow_gnu_extensions_p);
529 cp_debug_print_flag (file, "'>' token is greater-than",
530 parser->greater_than_is_operator_p);
531 cp_debug_print_flag (file, "Default args allowed in current "
532 "parameter list", parser->default_arg_ok_p);
533 cp_debug_print_flag (file, "Parsing integral constant-expression",
534 parser->integral_constant_expression_p);
535 cp_debug_print_flag (file, "Allow non-constant expression in current "
536 "constant-expression",
537 parser->allow_non_integral_constant_expression_p);
538 cp_debug_print_flag (file, "Seen non-constant expression",
539 parser->non_integral_constant_expression_p);
540 cp_debug_print_flag (file, "Local names and 'this' forbidden in "
541 "current context",
542 parser->local_variables_forbidden_p);
543 cp_debug_print_flag (file, "In unbraced linkage specification",
544 parser->in_unbraced_linkage_specification_p);
545 cp_debug_print_flag (file, "Parsing a declarator",
546 parser->in_declarator_p);
547 cp_debug_print_flag (file, "In template argument list",
548 parser->in_template_argument_list_p);
549 cp_debug_print_flag (file, "Parsing an iteration statement",
550 parser->in_statement & IN_ITERATION_STMT);
551 cp_debug_print_flag (file, "Parsing a switch statement",
552 parser->in_statement & IN_SWITCH_STMT);
553 cp_debug_print_flag (file, "Parsing a structured OpenMP block",
554 parser->in_statement & IN_OMP_BLOCK);
555 cp_debug_print_flag (file, "Parsing a Cilk Plus for loop",
556 parser->in_statement & IN_CILK_SIMD_FOR);
557 cp_debug_print_flag (file, "Parsing a an OpenMP loop",
558 parser->in_statement & IN_OMP_FOR);
559 cp_debug_print_flag (file, "Parsing an if statement",
560 parser->in_statement & IN_IF_STMT);
561 cp_debug_print_flag (file, "Parsing a type-id in an expression "
562 "context", parser->in_type_id_in_expr_p);
563 cp_debug_print_flag (file, "Declarations are implicitly extern \"C\"",
564 parser->implicit_extern_c);
565 cp_debug_print_flag (file, "String expressions should be translated "
566 "to execution character set",
567 parser->translate_strings_p);
568 cp_debug_print_flag (file, "Parsing function body outside of a "
569 "local class", parser->in_function_body);
570 cp_debug_print_flag (file, "Auto correct a colon to a scope operator",
571 parser->colon_corrects_to_scope_p);
572 cp_debug_print_flag (file, "Colon doesn't start a class definition",
573 parser->colon_doesnt_start_class_def_p);
574 if (parser->type_definition_forbidden_message)
575 fprintf (file, "Error message for forbidden type definitions: %s\n",
576 parser->type_definition_forbidden_message);
577 cp_debug_print_unparsed_queues (file, parser->unparsed_queues);
578 fprintf (file, "Number of class definitions in progress: %u\n",
579 parser->num_classes_being_defined);
580 fprintf (file, "Number of template parameter lists for the current "
581 "declaration: %u\n", parser->num_template_parameter_lists);
582 cp_debug_parser_tokens (file, parser, window_size);
583 token = parser->lexer->next_token;
584 fprintf (file, "Next token to parse:\n");
585 fprintf (file, "\tToken: ");
586 cp_lexer_print_token (file, token);
587 eloc = expand_location (token->location);
588 fprintf (file, "\n\tFile: %s\n", eloc.file);
589 fprintf (file, "\tLine: %d\n", eloc.line);
590 fprintf (file, "\tColumn: %d\n", eloc.column);
593 DEBUG_FUNCTION void
594 debug (cp_parser &ref)
596 cp_debug_parser (stderr, &ref);
599 DEBUG_FUNCTION void
600 debug (cp_parser *ptr)
602 if (ptr)
603 debug (*ptr);
604 else
605 fprintf (stderr, "<nil>\n");
608 /* Allocate memory for a new lexer object and return it. */
610 static cp_lexer *
611 cp_lexer_alloc (void)
613 cp_lexer *lexer;
615 c_common_no_more_pch ();
617 /* Allocate the memory. */
618 lexer = ggc_cleared_alloc<cp_lexer> ();
620 /* Initially we are not debugging. */
621 lexer->debugging_p = false;
623 lexer->saved_tokens.create (CP_SAVED_TOKEN_STACK);
625 /* Create the buffer. */
626 vec_alloc (lexer->buffer, CP_LEXER_BUFFER_SIZE);
628 return lexer;
632 /* Create a new main C++ lexer, the lexer that gets tokens from the
633 preprocessor. */
635 static cp_lexer *
636 cp_lexer_new_main (void)
638 cp_lexer *lexer;
639 cp_token token;
641 /* It's possible that parsing the first pragma will load a PCH file,
642 which is a GC collection point. So we have to do that before
643 allocating any memory. */
644 cp_parser_initial_pragma (&token);
646 lexer = cp_lexer_alloc ();
648 /* Put the first token in the buffer. */
649 lexer->buffer->quick_push (token);
651 /* Get the remaining tokens from the preprocessor. */
652 while (token.type != CPP_EOF)
654 cp_lexer_get_preprocessor_token (lexer, &token);
655 vec_safe_push (lexer->buffer, token);
658 lexer->last_token = lexer->buffer->address ()
659 + lexer->buffer->length ()
660 - 1;
661 lexer->next_token = lexer->buffer->length ()
662 ? lexer->buffer->address ()
663 : &eof_token;
665 /* Subsequent preprocessor diagnostics should use compiler
666 diagnostic functions to get the compiler source location. */
667 done_lexing = true;
669 gcc_assert (!lexer->next_token->purged_p);
670 return lexer;
673 /* Create a new lexer whose token stream is primed with the tokens in
674 CACHE. When these tokens are exhausted, no new tokens will be read. */
676 static cp_lexer *
677 cp_lexer_new_from_tokens (cp_token_cache *cache)
679 cp_token *first = cache->first;
680 cp_token *last = cache->last;
681 cp_lexer *lexer = ggc_cleared_alloc<cp_lexer> ();
683 /* We do not own the buffer. */
684 lexer->buffer = NULL;
685 lexer->next_token = first == last ? &eof_token : first;
686 lexer->last_token = last;
688 lexer->saved_tokens.create (CP_SAVED_TOKEN_STACK);
690 /* Initially we are not debugging. */
691 lexer->debugging_p = false;
693 gcc_assert (!lexer->next_token->purged_p);
694 return lexer;
697 /* Frees all resources associated with LEXER. */
699 static void
700 cp_lexer_destroy (cp_lexer *lexer)
702 vec_free (lexer->buffer);
703 lexer->saved_tokens.release ();
704 ggc_free (lexer);
707 /* Returns nonzero if debugging information should be output. */
709 static inline bool
710 cp_lexer_debugging_p (cp_lexer *lexer)
712 return lexer->debugging_p;
716 static inline cp_token_position
717 cp_lexer_token_position (cp_lexer *lexer, bool previous_p)
719 gcc_assert (!previous_p || lexer->next_token != &eof_token);
721 return lexer->next_token - previous_p;
724 static inline cp_token *
725 cp_lexer_token_at (cp_lexer * /*lexer*/, cp_token_position pos)
727 return pos;
730 static inline void
731 cp_lexer_set_token_position (cp_lexer *lexer, cp_token_position pos)
733 lexer->next_token = cp_lexer_token_at (lexer, pos);
736 static inline cp_token_position
737 cp_lexer_previous_token_position (cp_lexer *lexer)
739 if (lexer->next_token == &eof_token)
740 return lexer->last_token - 1;
741 else
742 return cp_lexer_token_position (lexer, true);
745 static inline cp_token *
746 cp_lexer_previous_token (cp_lexer *lexer)
748 cp_token_position tp = cp_lexer_previous_token_position (lexer);
750 return cp_lexer_token_at (lexer, tp);
753 /* nonzero if we are presently saving tokens. */
755 static inline int
756 cp_lexer_saving_tokens (const cp_lexer* lexer)
758 return lexer->saved_tokens.length () != 0;
761 /* Store the next token from the preprocessor in *TOKEN. Return true
762 if we reach EOF. If LEXER is NULL, assume we are handling an
763 initial #pragma pch_preprocess, and thus want the lexer to return
764 processed strings. */
766 static void
767 cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token)
769 static int is_extern_c = 0;
771 /* Get a new token from the preprocessor. */
772 token->type
773 = c_lex_with_flags (&token->u.value, &token->location, &token->flags,
774 lexer == NULL ? 0 : C_LEX_STRING_NO_JOIN);
775 token->keyword = RID_MAX;
776 token->pragma_kind = PRAGMA_NONE;
777 token->purged_p = false;
778 token->error_reported = false;
780 /* On some systems, some header files are surrounded by an
781 implicit extern "C" block. Set a flag in the token if it
782 comes from such a header. */
783 is_extern_c += pending_lang_change;
784 pending_lang_change = 0;
785 token->implicit_extern_c = is_extern_c > 0;
787 /* Check to see if this token is a keyword. */
788 if (token->type == CPP_NAME)
790 if (C_IS_RESERVED_WORD (token->u.value))
792 /* Mark this token as a keyword. */
793 token->type = CPP_KEYWORD;
794 /* Record which keyword. */
795 token->keyword = C_RID_CODE (token->u.value);
797 else
799 if (warn_cxx0x_compat
800 && C_RID_CODE (token->u.value) >= RID_FIRST_CXX0X
801 && C_RID_CODE (token->u.value) <= RID_LAST_CXX0X)
803 /* Warn about the C++0x keyword (but still treat it as
804 an identifier). */
805 warning (OPT_Wc__0x_compat,
806 "identifier %qE is a keyword in C++11",
807 token->u.value);
809 /* Clear out the C_RID_CODE so we don't warn about this
810 particular identifier-turned-keyword again. */
811 C_SET_RID_CODE (token->u.value, RID_MAX);
814 token->keyword = RID_MAX;
817 else if (token->type == CPP_AT_NAME)
819 /* This only happens in Objective-C++; it must be a keyword. */
820 token->type = CPP_KEYWORD;
821 switch (C_RID_CODE (token->u.value))
823 /* Replace 'class' with '@class', 'private' with '@private',
824 etc. This prevents confusion with the C++ keyword
825 'class', and makes the tokens consistent with other
826 Objective-C 'AT' keywords. For example '@class' is
827 reported as RID_AT_CLASS which is consistent with
828 '@synchronized', which is reported as
829 RID_AT_SYNCHRONIZED.
831 case RID_CLASS: token->keyword = RID_AT_CLASS; break;
832 case RID_PRIVATE: token->keyword = RID_AT_PRIVATE; break;
833 case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
834 case RID_PUBLIC: token->keyword = RID_AT_PUBLIC; break;
835 case RID_THROW: token->keyword = RID_AT_THROW; break;
836 case RID_TRY: token->keyword = RID_AT_TRY; break;
837 case RID_CATCH: token->keyword = RID_AT_CATCH; break;
838 default: token->keyword = C_RID_CODE (token->u.value);
841 else if (token->type == CPP_PRAGMA)
843 /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */
844 token->pragma_kind = ((enum pragma_kind)
845 TREE_INT_CST_LOW (token->u.value));
846 token->u.value = NULL_TREE;
850 /* Update the globals input_location and the input file stack from TOKEN. */
851 static inline void
852 cp_lexer_set_source_position_from_token (cp_token *token)
854 if (token->type != CPP_EOF)
856 input_location = token->location;
860 /* Update the globals input_location and the input file stack from LEXER. */
861 static inline void
862 cp_lexer_set_source_position (cp_lexer *lexer)
864 cp_token *token = cp_lexer_peek_token (lexer);
865 cp_lexer_set_source_position_from_token (token);
868 /* Return a pointer to the next token in the token stream, but do not
869 consume it. */
871 static inline cp_token *
872 cp_lexer_peek_token (cp_lexer *lexer)
874 if (cp_lexer_debugging_p (lexer))
876 fputs ("cp_lexer: peeking at token: ", cp_lexer_debug_stream);
877 cp_lexer_print_token (cp_lexer_debug_stream, lexer->next_token);
878 putc ('\n', cp_lexer_debug_stream);
880 return lexer->next_token;
883 /* Return true if the next token has the indicated TYPE. */
885 static inline bool
886 cp_lexer_next_token_is (cp_lexer* lexer, enum cpp_ttype type)
888 return cp_lexer_peek_token (lexer)->type == type;
891 /* Return true if the next token does not have the indicated TYPE. */
893 static inline bool
894 cp_lexer_next_token_is_not (cp_lexer* lexer, enum cpp_ttype type)
896 return !cp_lexer_next_token_is (lexer, type);
899 /* Return true if the next token is the indicated KEYWORD. */
901 static inline bool
902 cp_lexer_next_token_is_keyword (cp_lexer* lexer, enum rid keyword)
904 return cp_lexer_peek_token (lexer)->keyword == keyword;
907 static inline bool
908 cp_lexer_nth_token_is (cp_lexer* lexer, size_t n, enum cpp_ttype type)
910 return cp_lexer_peek_nth_token (lexer, n)->type == type;
913 static inline bool
914 cp_lexer_nth_token_is_keyword (cp_lexer* lexer, size_t n, enum rid keyword)
916 return cp_lexer_peek_nth_token (lexer, n)->keyword == keyword;
919 /* Return true if the next token is not the indicated KEYWORD. */
921 static inline bool
922 cp_lexer_next_token_is_not_keyword (cp_lexer* lexer, enum rid keyword)
924 return cp_lexer_peek_token (lexer)->keyword != keyword;
927 /* Return true if the next token is a keyword for a decl-specifier. */
929 static bool
930 cp_lexer_next_token_is_decl_specifier_keyword (cp_lexer *lexer)
932 cp_token *token;
934 token = cp_lexer_peek_token (lexer);
935 switch (token->keyword)
937 /* auto specifier: storage-class-specifier in C++,
938 simple-type-specifier in C++0x. */
939 case RID_AUTO:
940 /* Storage classes. */
941 case RID_REGISTER:
942 case RID_STATIC:
943 case RID_EXTERN:
944 case RID_MUTABLE:
945 case RID_THREAD:
946 /* Elaborated type specifiers. */
947 case RID_ENUM:
948 case RID_CLASS:
949 case RID_STRUCT:
950 case RID_UNION:
951 case RID_TYPENAME:
952 /* Simple type specifiers. */
953 case RID_CHAR:
954 case RID_CHAR16:
955 case RID_CHAR32:
956 case RID_WCHAR:
957 case RID_BOOL:
958 case RID_SHORT:
959 case RID_INT:
960 case RID_LONG:
961 case RID_SIGNED:
962 case RID_UNSIGNED:
963 case RID_FLOAT:
964 case RID_DOUBLE:
965 case RID_VOID:
966 /* GNU extensions. */
967 case RID_ATTRIBUTE:
968 case RID_TYPEOF:
969 /* C++0x extensions. */
970 case RID_DECLTYPE:
971 case RID_UNDERLYING_TYPE:
972 return true;
974 default:
975 if (token->keyword >= RID_FIRST_INT_N
976 && token->keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS
977 && int_n_enabled_p[token->keyword - RID_FIRST_INT_N])
978 return true;
979 return false;
983 /* Returns TRUE iff the token T begins a decltype type. */
985 static bool
986 token_is_decltype (cp_token *t)
988 return (t->keyword == RID_DECLTYPE
989 || t->type == CPP_DECLTYPE);
992 /* Returns TRUE iff the next token begins a decltype type. */
994 static bool
995 cp_lexer_next_token_is_decltype (cp_lexer *lexer)
997 cp_token *t = cp_lexer_peek_token (lexer);
998 return token_is_decltype (t);
1001 /* Return a pointer to the Nth token in the token stream. If N is 1,
1002 then this is precisely equivalent to cp_lexer_peek_token (except
1003 that it is not inline). One would like to disallow that case, but
1004 there is one case (cp_parser_nth_token_starts_template_id) where
1005 the caller passes a variable for N and it might be 1. */
1007 static cp_token *
1008 cp_lexer_peek_nth_token (cp_lexer* lexer, size_t n)
1010 cp_token *token;
1012 /* N is 1-based, not zero-based. */
1013 gcc_assert (n > 0);
1015 if (cp_lexer_debugging_p (lexer))
1016 fprintf (cp_lexer_debug_stream,
1017 "cp_lexer: peeking ahead %ld at token: ", (long)n);
1019 --n;
1020 token = lexer->next_token;
1021 gcc_assert (!n || token != &eof_token);
1022 while (n != 0)
1024 ++token;
1025 if (token == lexer->last_token)
1027 token = &eof_token;
1028 break;
1031 if (!token->purged_p)
1032 --n;
1035 if (cp_lexer_debugging_p (lexer))
1037 cp_lexer_print_token (cp_lexer_debug_stream, token);
1038 putc ('\n', cp_lexer_debug_stream);
1041 return token;
1044 /* Return the next token, and advance the lexer's next_token pointer
1045 to point to the next non-purged token. */
1047 static cp_token *
1048 cp_lexer_consume_token (cp_lexer* lexer)
1050 cp_token *token = lexer->next_token;
1052 gcc_assert (token != &eof_token);
1053 gcc_assert (!lexer->in_pragma || token->type != CPP_PRAGMA_EOL);
1057 lexer->next_token++;
1058 if (lexer->next_token == lexer->last_token)
1060 lexer->next_token = &eof_token;
1061 break;
1065 while (lexer->next_token->purged_p);
1067 cp_lexer_set_source_position_from_token (token);
1069 /* Provide debugging output. */
1070 if (cp_lexer_debugging_p (lexer))
1072 fputs ("cp_lexer: consuming token: ", cp_lexer_debug_stream);
1073 cp_lexer_print_token (cp_lexer_debug_stream, token);
1074 putc ('\n', cp_lexer_debug_stream);
1077 return token;
1080 /* Permanently remove the next token from the token stream, and
1081 advance the next_token pointer to refer to the next non-purged
1082 token. */
1084 static void
1085 cp_lexer_purge_token (cp_lexer *lexer)
1087 cp_token *tok = lexer->next_token;
1089 gcc_assert (tok != &eof_token);
1090 tok->purged_p = true;
1091 tok->location = UNKNOWN_LOCATION;
1092 tok->u.value = NULL_TREE;
1093 tok->keyword = RID_MAX;
1097 tok++;
1098 if (tok == lexer->last_token)
1100 tok = &eof_token;
1101 break;
1104 while (tok->purged_p);
1105 lexer->next_token = tok;
1108 /* Permanently remove all tokens after TOK, up to, but not
1109 including, the token that will be returned next by
1110 cp_lexer_peek_token. */
1112 static void
1113 cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
1115 cp_token *peek = lexer->next_token;
1117 if (peek == &eof_token)
1118 peek = lexer->last_token;
1120 gcc_assert (tok < peek);
1122 for ( tok += 1; tok != peek; tok += 1)
1124 tok->purged_p = true;
1125 tok->location = UNKNOWN_LOCATION;
1126 tok->u.value = NULL_TREE;
1127 tok->keyword = RID_MAX;
1131 /* Begin saving tokens. All tokens consumed after this point will be
1132 preserved. */
1134 static void
1135 cp_lexer_save_tokens (cp_lexer* lexer)
1137 /* Provide debugging output. */
1138 if (cp_lexer_debugging_p (lexer))
1139 fprintf (cp_lexer_debug_stream, "cp_lexer: saving tokens\n");
1141 lexer->saved_tokens.safe_push (lexer->next_token);
1144 /* Commit to the portion of the token stream most recently saved. */
1146 static void
1147 cp_lexer_commit_tokens (cp_lexer* lexer)
1149 /* Provide debugging output. */
1150 if (cp_lexer_debugging_p (lexer))
1151 fprintf (cp_lexer_debug_stream, "cp_lexer: committing tokens\n");
1153 lexer->saved_tokens.pop ();
1156 /* Return all tokens saved since the last call to cp_lexer_save_tokens
1157 to the token stream. Stop saving tokens. */
1159 static void
1160 cp_lexer_rollback_tokens (cp_lexer* lexer)
1162 /* Provide debugging output. */
1163 if (cp_lexer_debugging_p (lexer))
1164 fprintf (cp_lexer_debug_stream, "cp_lexer: restoring tokens\n");
1166 lexer->next_token = lexer->saved_tokens.pop ();
1169 /* RAII wrapper around the above functions, with sanity checking. Creating
1170 a variable saves tokens, which are committed when the variable is
1171 destroyed unless they are explicitly rolled back by calling the rollback
1172 member function. */
1174 struct saved_token_sentinel
1176 cp_lexer *lexer;
1177 unsigned len;
1178 bool commit;
1179 saved_token_sentinel(cp_lexer *lexer): lexer(lexer), commit(true)
1181 len = lexer->saved_tokens.length ();
1182 cp_lexer_save_tokens (lexer);
1184 void rollback ()
1186 cp_lexer_rollback_tokens (lexer);
1187 commit = false;
1189 ~saved_token_sentinel()
1191 if (commit)
1192 cp_lexer_commit_tokens (lexer);
1193 gcc_assert (lexer->saved_tokens.length () == len);
1197 /* Print a representation of the TOKEN on the STREAM. */
1199 static void
1200 cp_lexer_print_token (FILE * stream, cp_token *token)
1202 /* We don't use cpp_type2name here because the parser defines
1203 a few tokens of its own. */
1204 static const char *const token_names[] = {
1205 /* cpplib-defined token types */
1206 #define OP(e, s) #e,
1207 #define TK(e, s) #e,
1208 TTYPE_TABLE
1209 #undef OP
1210 #undef TK
1211 /* C++ parser token types - see "Manifest constants", above. */
1212 "KEYWORD",
1213 "TEMPLATE_ID",
1214 "NESTED_NAME_SPECIFIER",
1217 /* For some tokens, print the associated data. */
1218 switch (token->type)
1220 case CPP_KEYWORD:
1221 /* Some keywords have a value that is not an IDENTIFIER_NODE.
1222 For example, `struct' is mapped to an INTEGER_CST. */
1223 if (!identifier_p (token->u.value))
1224 break;
1225 /* else fall through */
1226 case CPP_NAME:
1227 fputs (IDENTIFIER_POINTER (token->u.value), stream);
1228 break;
1230 case CPP_STRING:
1231 case CPP_STRING16:
1232 case CPP_STRING32:
1233 case CPP_WSTRING:
1234 case CPP_UTF8STRING:
1235 fprintf (stream, " \"%s\"", TREE_STRING_POINTER (token->u.value));
1236 break;
1238 case CPP_NUMBER:
1239 print_generic_expr (stream, token->u.value, 0);
1240 break;
1242 default:
1243 /* If we have a name for the token, print it out. Otherwise, we
1244 simply give the numeric code. */
1245 if (token->type < ARRAY_SIZE(token_names))
1246 fputs (token_names[token->type], stream);
1247 else
1248 fprintf (stream, "[%d]", token->type);
1249 break;
1253 DEBUG_FUNCTION void
1254 debug (cp_token &ref)
1256 cp_lexer_print_token (stderr, &ref);
1257 fprintf (stderr, "\n");
1260 DEBUG_FUNCTION void
1261 debug (cp_token *ptr)
1263 if (ptr)
1264 debug (*ptr);
1265 else
1266 fprintf (stderr, "<nil>\n");
1270 /* Start emitting debugging information. */
1272 static void
1273 cp_lexer_start_debugging (cp_lexer* lexer)
1275 lexer->debugging_p = true;
1276 cp_lexer_debug_stream = stderr;
1279 /* Stop emitting debugging information. */
1281 static void
1282 cp_lexer_stop_debugging (cp_lexer* lexer)
1284 lexer->debugging_p = false;
1285 cp_lexer_debug_stream = NULL;
1288 /* Create a new cp_token_cache, representing a range of tokens. */
1290 static cp_token_cache *
1291 cp_token_cache_new (cp_token *first, cp_token *last)
1293 cp_token_cache *cache = ggc_alloc<cp_token_cache> ();
1294 cache->first = first;
1295 cache->last = last;
1296 return cache;
1299 /* Diagnose if #pragma omp declare simd isn't followed immediately
1300 by function declaration or definition. */
1302 static inline void
1303 cp_ensure_no_omp_declare_simd (cp_parser *parser)
1305 if (parser->omp_declare_simd && !parser->omp_declare_simd->error_seen)
1307 error ("%<#pragma omp declare simd%> not immediately followed by "
1308 "function declaration or definition");
1309 parser->omp_declare_simd = NULL;
1313 /* Finalize #pragma omp declare simd clauses after FNDECL has been parsed,
1314 and put that into "omp declare simd" attribute. */
1316 static inline void
1317 cp_finalize_omp_declare_simd (cp_parser *parser, tree fndecl)
1319 if (__builtin_expect (parser->omp_declare_simd != NULL, 0))
1321 if (fndecl == error_mark_node)
1323 parser->omp_declare_simd = NULL;
1324 return;
1326 if (TREE_CODE (fndecl) != FUNCTION_DECL)
1328 cp_ensure_no_omp_declare_simd (parser);
1329 return;
1334 /* Decl-specifiers. */
1336 /* Set *DECL_SPECS to represent an empty decl-specifier-seq. */
1338 static void
1339 clear_decl_specs (cp_decl_specifier_seq *decl_specs)
1341 memset (decl_specs, 0, sizeof (cp_decl_specifier_seq));
1344 /* Declarators. */
1346 /* Nothing other than the parser should be creating declarators;
1347 declarators are a semi-syntactic representation of C++ entities.
1348 Other parts of the front end that need to create entities (like
1349 VAR_DECLs or FUNCTION_DECLs) should do that directly. */
1351 static cp_declarator *make_call_declarator
1352 (cp_declarator *, tree, cp_cv_quals, cp_virt_specifiers, cp_ref_qualifier, tree, tree);
1353 static cp_declarator *make_array_declarator
1354 (cp_declarator *, tree);
1355 static cp_declarator *make_pointer_declarator
1356 (cp_cv_quals, cp_declarator *, tree);
1357 static cp_declarator *make_reference_declarator
1358 (cp_cv_quals, cp_declarator *, bool, tree);
1359 static cp_parameter_declarator *make_parameter_declarator
1360 (cp_decl_specifier_seq *, cp_declarator *, tree);
1361 static cp_declarator *make_ptrmem_declarator
1362 (cp_cv_quals, tree, cp_declarator *, tree);
1364 /* An erroneous declarator. */
1365 static cp_declarator *cp_error_declarator;
1367 /* The obstack on which declarators and related data structures are
1368 allocated. */
1369 static struct obstack declarator_obstack;
1371 /* Alloc BYTES from the declarator memory pool. */
1373 static inline void *
1374 alloc_declarator (size_t bytes)
1376 return obstack_alloc (&declarator_obstack, bytes);
1379 /* Allocate a declarator of the indicated KIND. Clear fields that are
1380 common to all declarators. */
1382 static cp_declarator *
1383 make_declarator (cp_declarator_kind kind)
1385 cp_declarator *declarator;
1387 declarator = (cp_declarator *) alloc_declarator (sizeof (cp_declarator));
1388 declarator->kind = kind;
1389 declarator->attributes = NULL_TREE;
1390 declarator->std_attributes = NULL_TREE;
1391 declarator->declarator = NULL;
1392 declarator->parameter_pack_p = false;
1393 declarator->id_loc = UNKNOWN_LOCATION;
1395 return declarator;
1398 /* Make a declarator for a generalized identifier. If
1399 QUALIFYING_SCOPE is non-NULL, the identifier is
1400 QUALIFYING_SCOPE::UNQUALIFIED_NAME; otherwise, it is just
1401 UNQUALIFIED_NAME. SFK indicates the kind of special function this
1402 is, if any. */
1404 static cp_declarator *
1405 make_id_declarator (tree qualifying_scope, tree unqualified_name,
1406 special_function_kind sfk)
1408 cp_declarator *declarator;
1410 /* It is valid to write:
1412 class C { void f(); };
1413 typedef C D;
1414 void D::f();
1416 The standard is not clear about whether `typedef const C D' is
1417 legal; as of 2002-09-15 the committee is considering that
1418 question. EDG 3.0 allows that syntax. Therefore, we do as
1419 well. */
1420 if (qualifying_scope && TYPE_P (qualifying_scope))
1421 qualifying_scope = TYPE_MAIN_VARIANT (qualifying_scope);
1423 gcc_assert (identifier_p (unqualified_name)
1424 || TREE_CODE (unqualified_name) == BIT_NOT_EXPR
1425 || TREE_CODE (unqualified_name) == TEMPLATE_ID_EXPR);
1427 declarator = make_declarator (cdk_id);
1428 declarator->u.id.qualifying_scope = qualifying_scope;
1429 declarator->u.id.unqualified_name = unqualified_name;
1430 declarator->u.id.sfk = sfk;
1432 return declarator;
1435 /* Make a declarator for a pointer to TARGET. CV_QUALIFIERS is a list
1436 of modifiers such as const or volatile to apply to the pointer
1437 type, represented as identifiers. ATTRIBUTES represent the attributes that
1438 appertain to the pointer or reference. */
1440 cp_declarator *
1441 make_pointer_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target,
1442 tree attributes)
1444 cp_declarator *declarator;
1446 declarator = make_declarator (cdk_pointer);
1447 declarator->declarator = target;
1448 declarator->u.pointer.qualifiers = cv_qualifiers;
1449 declarator->u.pointer.class_type = NULL_TREE;
1450 if (target)
1452 declarator->id_loc = target->id_loc;
1453 declarator->parameter_pack_p = target->parameter_pack_p;
1454 target->parameter_pack_p = false;
1456 else
1457 declarator->parameter_pack_p = false;
1459 declarator->std_attributes = attributes;
1461 return declarator;
1464 /* Like make_pointer_declarator -- but for references. ATTRIBUTES
1465 represent the attributes that appertain to the pointer or
1466 reference. */
1468 cp_declarator *
1469 make_reference_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target,
1470 bool rvalue_ref, tree attributes)
1472 cp_declarator *declarator;
1474 declarator = make_declarator (cdk_reference);
1475 declarator->declarator = target;
1476 declarator->u.reference.qualifiers = cv_qualifiers;
1477 declarator->u.reference.rvalue_ref = rvalue_ref;
1478 if (target)
1480 declarator->id_loc = target->id_loc;
1481 declarator->parameter_pack_p = target->parameter_pack_p;
1482 target->parameter_pack_p = false;
1484 else
1485 declarator->parameter_pack_p = false;
1487 declarator->std_attributes = attributes;
1489 return declarator;
1492 /* Like make_pointer_declarator -- but for a pointer to a non-static
1493 member of CLASS_TYPE. ATTRIBUTES represent the attributes that
1494 appertain to the pointer or reference. */
1496 cp_declarator *
1497 make_ptrmem_declarator (cp_cv_quals cv_qualifiers, tree class_type,
1498 cp_declarator *pointee,
1499 tree attributes)
1501 cp_declarator *declarator;
1503 declarator = make_declarator (cdk_ptrmem);
1504 declarator->declarator = pointee;
1505 declarator->u.pointer.qualifiers = cv_qualifiers;
1506 declarator->u.pointer.class_type = class_type;
1508 if (pointee)
1510 declarator->parameter_pack_p = pointee->parameter_pack_p;
1511 pointee->parameter_pack_p = false;
1513 else
1514 declarator->parameter_pack_p = false;
1516 declarator->std_attributes = attributes;
1518 return declarator;
1521 /* Make a declarator for the function given by TARGET, with the
1522 indicated PARMS. The CV_QUALIFIERS aply to the function, as in
1523 "const"-qualified member function. The EXCEPTION_SPECIFICATION
1524 indicates what exceptions can be thrown. */
1526 cp_declarator *
1527 make_call_declarator (cp_declarator *target,
1528 tree parms,
1529 cp_cv_quals cv_qualifiers,
1530 cp_virt_specifiers virt_specifiers,
1531 cp_ref_qualifier ref_qualifier,
1532 tree exception_specification,
1533 tree late_return_type)
1535 cp_declarator *declarator;
1537 declarator = make_declarator (cdk_function);
1538 declarator->declarator = target;
1539 declarator->u.function.parameters = parms;
1540 declarator->u.function.qualifiers = cv_qualifiers;
1541 declarator->u.function.virt_specifiers = virt_specifiers;
1542 declarator->u.function.ref_qualifier = ref_qualifier;
1543 declarator->u.function.exception_specification = exception_specification;
1544 declarator->u.function.late_return_type = late_return_type;
1545 if (target)
1547 declarator->id_loc = target->id_loc;
1548 declarator->parameter_pack_p = target->parameter_pack_p;
1549 target->parameter_pack_p = false;
1551 else
1552 declarator->parameter_pack_p = false;
1554 return declarator;
1557 /* Make a declarator for an array of BOUNDS elements, each of which is
1558 defined by ELEMENT. */
1560 cp_declarator *
1561 make_array_declarator (cp_declarator *element, tree bounds)
1563 cp_declarator *declarator;
1565 declarator = make_declarator (cdk_array);
1566 declarator->declarator = element;
1567 declarator->u.array.bounds = bounds;
1568 if (element)
1570 declarator->id_loc = element->id_loc;
1571 declarator->parameter_pack_p = element->parameter_pack_p;
1572 element->parameter_pack_p = false;
1574 else
1575 declarator->parameter_pack_p = false;
1577 return declarator;
1580 /* Determine whether the declarator we've seen so far can be a
1581 parameter pack, when followed by an ellipsis. */
1582 static bool
1583 declarator_can_be_parameter_pack (cp_declarator *declarator)
1585 /* Search for a declarator name, or any other declarator that goes
1586 after the point where the ellipsis could appear in a parameter
1587 pack. If we find any of these, then this declarator can not be
1588 made into a parameter pack. */
1589 bool found = false;
1590 while (declarator && !found)
1592 switch ((int)declarator->kind)
1594 case cdk_id:
1595 case cdk_array:
1596 found = true;
1597 break;
1599 case cdk_error:
1600 return true;
1602 default:
1603 declarator = declarator->declarator;
1604 break;
1608 return !found;
1611 cp_parameter_declarator *no_parameters;
1613 /* Create a parameter declarator with the indicated DECL_SPECIFIERS,
1614 DECLARATOR and DEFAULT_ARGUMENT. */
1616 cp_parameter_declarator *
1617 make_parameter_declarator (cp_decl_specifier_seq *decl_specifiers,
1618 cp_declarator *declarator,
1619 tree default_argument)
1621 cp_parameter_declarator *parameter;
1623 parameter = ((cp_parameter_declarator *)
1624 alloc_declarator (sizeof (cp_parameter_declarator)));
1625 parameter->next = NULL;
1626 if (decl_specifiers)
1627 parameter->decl_specifiers = *decl_specifiers;
1628 else
1629 clear_decl_specs (&parameter->decl_specifiers);
1630 parameter->declarator = declarator;
1631 parameter->default_argument = default_argument;
1632 parameter->ellipsis_p = false;
1634 return parameter;
1637 /* Returns true iff DECLARATOR is a declaration for a function. */
1639 static bool
1640 function_declarator_p (const cp_declarator *declarator)
1642 while (declarator)
1644 if (declarator->kind == cdk_function
1645 && declarator->declarator->kind == cdk_id)
1646 return true;
1647 if (declarator->kind == cdk_id
1648 || declarator->kind == cdk_error)
1649 return false;
1650 declarator = declarator->declarator;
1652 return false;
1655 /* The parser. */
1657 /* Overview
1658 --------
1660 A cp_parser parses the token stream as specified by the C++
1661 grammar. Its job is purely parsing, not semantic analysis. For
1662 example, the parser breaks the token stream into declarators,
1663 expressions, statements, and other similar syntactic constructs.
1664 It does not check that the types of the expressions on either side
1665 of an assignment-statement are compatible, or that a function is
1666 not declared with a parameter of type `void'.
1668 The parser invokes routines elsewhere in the compiler to perform
1669 semantic analysis and to build up the abstract syntax tree for the
1670 code processed.
1672 The parser (and the template instantiation code, which is, in a
1673 way, a close relative of parsing) are the only parts of the
1674 compiler that should be calling push_scope and pop_scope, or
1675 related functions. The parser (and template instantiation code)
1676 keeps track of what scope is presently active; everything else
1677 should simply honor that. (The code that generates static
1678 initializers may also need to set the scope, in order to check
1679 access control correctly when emitting the initializers.)
1681 Methodology
1682 -----------
1684 The parser is of the standard recursive-descent variety. Upcoming
1685 tokens in the token stream are examined in order to determine which
1686 production to use when parsing a non-terminal. Some C++ constructs
1687 require arbitrary look ahead to disambiguate. For example, it is
1688 impossible, in the general case, to tell whether a statement is an
1689 expression or declaration without scanning the entire statement.
1690 Therefore, the parser is capable of "parsing tentatively." When the
1691 parser is not sure what construct comes next, it enters this mode.
1692 Then, while we attempt to parse the construct, the parser queues up
1693 error messages, rather than issuing them immediately, and saves the
1694 tokens it consumes. If the construct is parsed successfully, the
1695 parser "commits", i.e., it issues any queued error messages and
1696 the tokens that were being preserved are permanently discarded.
1697 If, however, the construct is not parsed successfully, the parser
1698 rolls back its state completely so that it can resume parsing using
1699 a different alternative.
1701 Future Improvements
1702 -------------------
1704 The performance of the parser could probably be improved substantially.
1705 We could often eliminate the need to parse tentatively by looking ahead
1706 a little bit. In some places, this approach might not entirely eliminate
1707 the need to parse tentatively, but it might still speed up the average
1708 case. */
1710 /* Flags that are passed to some parsing functions. These values can
1711 be bitwise-ored together. */
1713 enum
1715 /* No flags. */
1716 CP_PARSER_FLAGS_NONE = 0x0,
1717 /* The construct is optional. If it is not present, then no error
1718 should be issued. */
1719 CP_PARSER_FLAGS_OPTIONAL = 0x1,
1720 /* When parsing a type-specifier, treat user-defined type-names
1721 as non-type identifiers. */
1722 CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES = 0x2,
1723 /* When parsing a type-specifier, do not try to parse a class-specifier
1724 or enum-specifier. */
1725 CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS = 0x4,
1726 /* When parsing a decl-specifier-seq, only allow type-specifier or
1727 constexpr. */
1728 CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR = 0x8
1731 /* This type is used for parameters and variables which hold
1732 combinations of the above flags. */
1733 typedef int cp_parser_flags;
1735 /* The different kinds of declarators we want to parse. */
1737 typedef enum cp_parser_declarator_kind
1739 /* We want an abstract declarator. */
1740 CP_PARSER_DECLARATOR_ABSTRACT,
1741 /* We want a named declarator. */
1742 CP_PARSER_DECLARATOR_NAMED,
1743 /* We don't mind, but the name must be an unqualified-id. */
1744 CP_PARSER_DECLARATOR_EITHER
1745 } cp_parser_declarator_kind;
1747 /* The precedence values used to parse binary expressions. The minimum value
1748 of PREC must be 1, because zero is reserved to quickly discriminate
1749 binary operators from other tokens. */
1751 enum cp_parser_prec
1753 PREC_NOT_OPERATOR,
1754 PREC_LOGICAL_OR_EXPRESSION,
1755 PREC_LOGICAL_AND_EXPRESSION,
1756 PREC_INCLUSIVE_OR_EXPRESSION,
1757 PREC_EXCLUSIVE_OR_EXPRESSION,
1758 PREC_AND_EXPRESSION,
1759 PREC_EQUALITY_EXPRESSION,
1760 PREC_RELATIONAL_EXPRESSION,
1761 PREC_SHIFT_EXPRESSION,
1762 PREC_ADDITIVE_EXPRESSION,
1763 PREC_MULTIPLICATIVE_EXPRESSION,
1764 PREC_PM_EXPRESSION,
1765 NUM_PREC_VALUES = PREC_PM_EXPRESSION
1768 /* A mapping from a token type to a corresponding tree node type, with a
1769 precedence value. */
1771 typedef struct cp_parser_binary_operations_map_node
1773 /* The token type. */
1774 enum cpp_ttype token_type;
1775 /* The corresponding tree code. */
1776 enum tree_code tree_type;
1777 /* The precedence of this operator. */
1778 enum cp_parser_prec prec;
1779 } cp_parser_binary_operations_map_node;
1781 typedef struct cp_parser_expression_stack_entry
1783 /* Left hand side of the binary operation we are currently
1784 parsing. */
1785 tree lhs;
1786 /* Original tree code for left hand side, if it was a binary
1787 expression itself (used for -Wparentheses). */
1788 enum tree_code lhs_type;
1789 /* Tree code for the binary operation we are parsing. */
1790 enum tree_code tree_type;
1791 /* Precedence of the binary operation we are parsing. */
1792 enum cp_parser_prec prec;
1793 /* Location of the binary operation we are parsing. */
1794 location_t loc;
1795 } cp_parser_expression_stack_entry;
1797 /* The stack for storing partial expressions. We only need NUM_PREC_VALUES
1798 entries because precedence levels on the stack are monotonically
1799 increasing. */
1800 typedef struct cp_parser_expression_stack_entry
1801 cp_parser_expression_stack[NUM_PREC_VALUES];
1803 /* Prototypes. */
1805 /* Constructors and destructors. */
1807 static cp_parser_context *cp_parser_context_new
1808 (cp_parser_context *);
1810 /* Class variables. */
1812 static GTY((deletable)) cp_parser_context* cp_parser_context_free_list;
1814 /* The operator-precedence table used by cp_parser_binary_expression.
1815 Transformed into an associative array (binops_by_token) by
1816 cp_parser_new. */
1818 static const cp_parser_binary_operations_map_node binops[] = {
1819 { CPP_DEREF_STAR, MEMBER_REF, PREC_PM_EXPRESSION },
1820 { CPP_DOT_STAR, DOTSTAR_EXPR, PREC_PM_EXPRESSION },
1822 { CPP_MULT, MULT_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1823 { CPP_DIV, TRUNC_DIV_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1824 { CPP_MOD, TRUNC_MOD_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1826 { CPP_PLUS, PLUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1827 { CPP_MINUS, MINUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1829 { CPP_LSHIFT, LSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1830 { CPP_RSHIFT, RSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1832 { CPP_LESS, LT_EXPR, PREC_RELATIONAL_EXPRESSION },
1833 { CPP_GREATER, GT_EXPR, PREC_RELATIONAL_EXPRESSION },
1834 { CPP_LESS_EQ, LE_EXPR, PREC_RELATIONAL_EXPRESSION },
1835 { CPP_GREATER_EQ, GE_EXPR, PREC_RELATIONAL_EXPRESSION },
1837 { CPP_EQ_EQ, EQ_EXPR, PREC_EQUALITY_EXPRESSION },
1838 { CPP_NOT_EQ, NE_EXPR, PREC_EQUALITY_EXPRESSION },
1840 { CPP_AND, BIT_AND_EXPR, PREC_AND_EXPRESSION },
1842 { CPP_XOR, BIT_XOR_EXPR, PREC_EXCLUSIVE_OR_EXPRESSION },
1844 { CPP_OR, BIT_IOR_EXPR, PREC_INCLUSIVE_OR_EXPRESSION },
1846 { CPP_AND_AND, TRUTH_ANDIF_EXPR, PREC_LOGICAL_AND_EXPRESSION },
1848 { CPP_OR_OR, TRUTH_ORIF_EXPR, PREC_LOGICAL_OR_EXPRESSION }
1851 /* The same as binops, but initialized by cp_parser_new so that
1852 binops_by_token[N].token_type == N. Used in cp_parser_binary_expression
1853 for speed. */
1854 static cp_parser_binary_operations_map_node binops_by_token[N_CP_TTYPES];
1856 /* Constructors and destructors. */
1858 /* Construct a new context. The context below this one on the stack
1859 is given by NEXT. */
1861 static cp_parser_context *
1862 cp_parser_context_new (cp_parser_context* next)
1864 cp_parser_context *context;
1866 /* Allocate the storage. */
1867 if (cp_parser_context_free_list != NULL)
1869 /* Pull the first entry from the free list. */
1870 context = cp_parser_context_free_list;
1871 cp_parser_context_free_list = context->next;
1872 memset (context, 0, sizeof (*context));
1874 else
1875 context = ggc_cleared_alloc<cp_parser_context> ();
1877 /* No errors have occurred yet in this context. */
1878 context->status = CP_PARSER_STATUS_KIND_NO_ERROR;
1879 /* If this is not the bottommost context, copy information that we
1880 need from the previous context. */
1881 if (next)
1883 /* If, in the NEXT context, we are parsing an `x->' or `x.'
1884 expression, then we are parsing one in this context, too. */
1885 context->object_type = next->object_type;
1886 /* Thread the stack. */
1887 context->next = next;
1890 return context;
1893 /* Managing the unparsed function queues. */
1895 #define unparsed_funs_with_default_args \
1896 parser->unparsed_queues->last ().funs_with_default_args
1897 #define unparsed_funs_with_definitions \
1898 parser->unparsed_queues->last ().funs_with_definitions
1899 #define unparsed_nsdmis \
1900 parser->unparsed_queues->last ().nsdmis
1901 #define unparsed_classes \
1902 parser->unparsed_queues->last ().classes
1904 static void
1905 push_unparsed_function_queues (cp_parser *parser)
1907 cp_unparsed_functions_entry e = {NULL, make_tree_vector (), NULL, NULL};
1908 vec_safe_push (parser->unparsed_queues, e);
1911 static void
1912 pop_unparsed_function_queues (cp_parser *parser)
1914 release_tree_vector (unparsed_funs_with_definitions);
1915 parser->unparsed_queues->pop ();
1918 /* Prototypes. */
1920 /* Constructors and destructors. */
1922 static cp_parser *cp_parser_new
1923 (void);
1925 /* Routines to parse various constructs.
1927 Those that return `tree' will return the error_mark_node (rather
1928 than NULL_TREE) if a parse error occurs, unless otherwise noted.
1929 Sometimes, they will return an ordinary node if error-recovery was
1930 attempted, even though a parse error occurred. So, to check
1931 whether or not a parse error occurred, you should always use
1932 cp_parser_error_occurred. If the construct is optional (indicated
1933 either by an `_opt' in the name of the function that does the
1934 parsing or via a FLAGS parameter), then NULL_TREE is returned if
1935 the construct is not present. */
1937 /* Lexical conventions [gram.lex] */
1939 static tree cp_parser_identifier
1940 (cp_parser *);
1941 static tree cp_parser_string_literal
1942 (cp_parser *, bool, bool, bool);
1943 static tree cp_parser_userdef_char_literal
1944 (cp_parser *);
1945 static tree cp_parser_userdef_string_literal
1946 (tree);
1947 static tree cp_parser_userdef_numeric_literal
1948 (cp_parser *);
1950 /* Basic concepts [gram.basic] */
1952 static bool cp_parser_translation_unit
1953 (cp_parser *);
1955 /* Expressions [gram.expr] */
1957 static tree cp_parser_primary_expression
1958 (cp_parser *, bool, bool, bool, cp_id_kind *);
1959 static tree cp_parser_id_expression
1960 (cp_parser *, bool, bool, bool *, bool, bool);
1961 static tree cp_parser_unqualified_id
1962 (cp_parser *, bool, bool, bool, bool);
1963 static tree cp_parser_nested_name_specifier_opt
1964 (cp_parser *, bool, bool, bool, bool);
1965 static tree cp_parser_nested_name_specifier
1966 (cp_parser *, bool, bool, bool, bool);
1967 static tree cp_parser_qualifying_entity
1968 (cp_parser *, bool, bool, bool, bool, bool);
1969 static tree cp_parser_postfix_expression
1970 (cp_parser *, bool, bool, bool, bool, cp_id_kind *);
1971 static tree cp_parser_postfix_open_square_expression
1972 (cp_parser *, tree, bool, bool);
1973 static tree cp_parser_postfix_dot_deref_expression
1974 (cp_parser *, enum cpp_ttype, tree, bool, cp_id_kind *, location_t);
1975 static vec<tree, va_gc> *cp_parser_parenthesized_expression_list
1976 (cp_parser *, int, bool, bool, bool *, bool = false);
1977 /* Values for the second parameter of cp_parser_parenthesized_expression_list. */
1978 enum { non_attr = 0, normal_attr = 1, id_attr = 2 };
1979 static void cp_parser_pseudo_destructor_name
1980 (cp_parser *, tree, tree *, tree *);
1981 static tree cp_parser_unary_expression
1982 (cp_parser *, cp_id_kind * = NULL, bool = false, bool = false, bool = false);
1983 static enum tree_code cp_parser_unary_operator
1984 (cp_token *);
1985 static tree cp_parser_new_expression
1986 (cp_parser *);
1987 static vec<tree, va_gc> *cp_parser_new_placement
1988 (cp_parser *);
1989 static tree cp_parser_new_type_id
1990 (cp_parser *, tree *);
1991 static cp_declarator *cp_parser_new_declarator_opt
1992 (cp_parser *);
1993 static cp_declarator *cp_parser_direct_new_declarator
1994 (cp_parser *);
1995 static vec<tree, va_gc> *cp_parser_new_initializer
1996 (cp_parser *);
1997 static tree cp_parser_delete_expression
1998 (cp_parser *);
1999 static tree cp_parser_cast_expression
2000 (cp_parser *, bool, bool, bool, cp_id_kind *);
2001 static tree cp_parser_binary_expression
2002 (cp_parser *, bool, bool, enum cp_parser_prec, cp_id_kind *);
2003 static tree cp_parser_question_colon_clause
2004 (cp_parser *, tree);
2005 static tree cp_parser_assignment_expression
2006 (cp_parser *, cp_id_kind * = NULL, bool = false, bool = false);
2007 static enum tree_code cp_parser_assignment_operator_opt
2008 (cp_parser *);
2009 static tree cp_parser_expression
2010 (cp_parser *, cp_id_kind * = NULL, bool = false, bool = false);
2011 static tree cp_parser_constant_expression
2012 (cp_parser *, bool = false, bool * = NULL);
2013 static tree cp_parser_builtin_offsetof
2014 (cp_parser *);
2015 static tree cp_parser_lambda_expression
2016 (cp_parser *);
2017 static void cp_parser_lambda_introducer
2018 (cp_parser *, tree);
2019 static bool cp_parser_lambda_declarator_opt
2020 (cp_parser *, tree);
2021 static void cp_parser_lambda_body
2022 (cp_parser *, tree);
2024 /* Statements [gram.stmt.stmt] */
2026 static void cp_parser_statement
2027 (cp_parser *, tree, bool, bool *);
2028 static void cp_parser_label_for_labeled_statement
2029 (cp_parser *, tree);
2030 static tree cp_parser_expression_statement
2031 (cp_parser *, tree);
2032 static tree cp_parser_compound_statement
2033 (cp_parser *, tree, bool, bool);
2034 static void cp_parser_statement_seq_opt
2035 (cp_parser *, tree);
2036 static tree cp_parser_selection_statement
2037 (cp_parser *, bool *);
2038 static tree cp_parser_condition
2039 (cp_parser *);
2040 static tree cp_parser_iteration_statement
2041 (cp_parser *, bool);
2042 static bool cp_parser_for_init_statement
2043 (cp_parser *, tree *decl);
2044 static tree cp_parser_for
2045 (cp_parser *, bool);
2046 static tree cp_parser_c_for
2047 (cp_parser *, tree, tree, bool);
2048 static tree cp_parser_range_for
2049 (cp_parser *, tree, tree, tree, bool);
2050 static void do_range_for_auto_deduction
2051 (tree, tree);
2052 static tree cp_parser_perform_range_for_lookup
2053 (tree, tree *, tree *);
2054 static tree cp_parser_range_for_member_function
2055 (tree, tree);
2056 static tree cp_parser_jump_statement
2057 (cp_parser *);
2058 static void cp_parser_declaration_statement
2059 (cp_parser *);
2061 static tree cp_parser_implicitly_scoped_statement
2062 (cp_parser *, bool *);
2063 static void cp_parser_already_scoped_statement
2064 (cp_parser *);
2066 /* Declarations [gram.dcl.dcl] */
2068 static void cp_parser_declaration_seq_opt
2069 (cp_parser *);
2070 static void cp_parser_declaration
2071 (cp_parser *);
2072 static void cp_parser_block_declaration
2073 (cp_parser *, bool);
2074 static void cp_parser_simple_declaration
2075 (cp_parser *, bool, tree *);
2076 static void cp_parser_decl_specifier_seq
2077 (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, int *);
2078 static tree cp_parser_storage_class_specifier_opt
2079 (cp_parser *);
2080 static tree cp_parser_function_specifier_opt
2081 (cp_parser *, cp_decl_specifier_seq *);
2082 static tree cp_parser_type_specifier
2083 (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, bool,
2084 int *, bool *);
2085 static tree cp_parser_simple_type_specifier
2086 (cp_parser *, cp_decl_specifier_seq *, cp_parser_flags);
2087 static tree cp_parser_type_name
2088 (cp_parser *);
2089 static tree cp_parser_nonclass_name
2090 (cp_parser* parser);
2091 static tree cp_parser_elaborated_type_specifier
2092 (cp_parser *, bool, bool);
2093 static tree cp_parser_enum_specifier
2094 (cp_parser *);
2095 static void cp_parser_enumerator_list
2096 (cp_parser *, tree);
2097 static void cp_parser_enumerator_definition
2098 (cp_parser *, tree);
2099 static tree cp_parser_namespace_name
2100 (cp_parser *);
2101 static void cp_parser_namespace_definition
2102 (cp_parser *);
2103 static void cp_parser_namespace_body
2104 (cp_parser *);
2105 static tree cp_parser_qualified_namespace_specifier
2106 (cp_parser *);
2107 static void cp_parser_namespace_alias_definition
2108 (cp_parser *);
2109 static bool cp_parser_using_declaration
2110 (cp_parser *, bool);
2111 static void cp_parser_using_directive
2112 (cp_parser *);
2113 static tree cp_parser_alias_declaration
2114 (cp_parser *);
2115 static void cp_parser_asm_definition
2116 (cp_parser *);
2117 static void cp_parser_linkage_specification
2118 (cp_parser *);
2119 static void cp_parser_static_assert
2120 (cp_parser *, bool);
2121 static tree cp_parser_decltype
2122 (cp_parser *);
2124 /* Declarators [gram.dcl.decl] */
2126 static tree cp_parser_init_declarator
2127 (cp_parser *, cp_decl_specifier_seq *, vec<deferred_access_check, va_gc> *, bool, bool, int, bool *, tree *);
2128 static cp_declarator *cp_parser_declarator
2129 (cp_parser *, cp_parser_declarator_kind, int *, bool *, bool, bool);
2130 static cp_declarator *cp_parser_direct_declarator
2131 (cp_parser *, cp_parser_declarator_kind, int *, bool, bool);
2132 static enum tree_code cp_parser_ptr_operator
2133 (cp_parser *, tree *, cp_cv_quals *, tree *);
2134 static cp_cv_quals cp_parser_cv_qualifier_seq_opt
2135 (cp_parser *);
2136 static cp_virt_specifiers cp_parser_virt_specifier_seq_opt
2137 (cp_parser *);
2138 static cp_ref_qualifier cp_parser_ref_qualifier_opt
2139 (cp_parser *);
2140 static tree cp_parser_late_return_type_opt
2141 (cp_parser *, cp_declarator *, cp_cv_quals);
2142 static tree cp_parser_declarator_id
2143 (cp_parser *, bool);
2144 static tree cp_parser_type_id
2145 (cp_parser *);
2146 static tree cp_parser_template_type_arg
2147 (cp_parser *);
2148 static tree cp_parser_trailing_type_id (cp_parser *);
2149 static tree cp_parser_type_id_1
2150 (cp_parser *, bool, bool);
2151 static void cp_parser_type_specifier_seq
2152 (cp_parser *, bool, bool, cp_decl_specifier_seq *);
2153 static tree cp_parser_parameter_declaration_clause
2154 (cp_parser *);
2155 static tree cp_parser_parameter_declaration_list
2156 (cp_parser *, bool *);
2157 static cp_parameter_declarator *cp_parser_parameter_declaration
2158 (cp_parser *, bool, bool *);
2159 static tree cp_parser_default_argument
2160 (cp_parser *, bool);
2161 static void cp_parser_function_body
2162 (cp_parser *, bool);
2163 static tree cp_parser_initializer
2164 (cp_parser *, bool *, bool *);
2165 static tree cp_parser_initializer_clause
2166 (cp_parser *, bool *);
2167 static tree cp_parser_braced_list
2168 (cp_parser*, bool*);
2169 static vec<constructor_elt, va_gc> *cp_parser_initializer_list
2170 (cp_parser *, bool *);
2172 static bool cp_parser_ctor_initializer_opt_and_function_body
2173 (cp_parser *, bool);
2175 static tree cp_parser_late_parsing_omp_declare_simd
2176 (cp_parser *, tree);
2178 static tree cp_parser_late_parsing_cilk_simd_fn_info
2179 (cp_parser *, tree);
2181 static tree synthesize_implicit_template_parm
2182 (cp_parser *);
2183 static tree finish_fully_implicit_template
2184 (cp_parser *, tree);
2186 /* Classes [gram.class] */
2188 static tree cp_parser_class_name
2189 (cp_parser *, bool, bool, enum tag_types, bool, bool, bool);
2190 static tree cp_parser_class_specifier
2191 (cp_parser *);
2192 static tree cp_parser_class_head
2193 (cp_parser *, bool *);
2194 static enum tag_types cp_parser_class_key
2195 (cp_parser *);
2196 static void cp_parser_type_parameter_key
2197 (cp_parser* parser);
2198 static void cp_parser_member_specification_opt
2199 (cp_parser *);
2200 static void cp_parser_member_declaration
2201 (cp_parser *);
2202 static tree cp_parser_pure_specifier
2203 (cp_parser *);
2204 static tree cp_parser_constant_initializer
2205 (cp_parser *);
2207 /* Derived classes [gram.class.derived] */
2209 static tree cp_parser_base_clause
2210 (cp_parser *);
2211 static tree cp_parser_base_specifier
2212 (cp_parser *);
2214 /* Special member functions [gram.special] */
2216 static tree cp_parser_conversion_function_id
2217 (cp_parser *);
2218 static tree cp_parser_conversion_type_id
2219 (cp_parser *);
2220 static cp_declarator *cp_parser_conversion_declarator_opt
2221 (cp_parser *);
2222 static bool cp_parser_ctor_initializer_opt
2223 (cp_parser *);
2224 static void cp_parser_mem_initializer_list
2225 (cp_parser *);
2226 static tree cp_parser_mem_initializer
2227 (cp_parser *);
2228 static tree cp_parser_mem_initializer_id
2229 (cp_parser *);
2231 /* Overloading [gram.over] */
2233 static tree cp_parser_operator_function_id
2234 (cp_parser *);
2235 static tree cp_parser_operator
2236 (cp_parser *);
2238 /* Templates [gram.temp] */
2240 static void cp_parser_template_declaration
2241 (cp_parser *, bool);
2242 static tree cp_parser_template_parameter_list
2243 (cp_parser *);
2244 static tree cp_parser_template_parameter
2245 (cp_parser *, bool *, bool *);
2246 static tree cp_parser_type_parameter
2247 (cp_parser *, bool *);
2248 static tree cp_parser_template_id
2249 (cp_parser *, bool, bool, enum tag_types, bool);
2250 static tree cp_parser_template_name
2251 (cp_parser *, bool, bool, bool, enum tag_types, bool *);
2252 static tree cp_parser_template_argument_list
2253 (cp_parser *);
2254 static tree cp_parser_template_argument
2255 (cp_parser *);
2256 static void cp_parser_explicit_instantiation
2257 (cp_parser *);
2258 static void cp_parser_explicit_specialization
2259 (cp_parser *);
2261 /* Exception handling [gram.exception] */
2263 static tree cp_parser_try_block
2264 (cp_parser *);
2265 static bool cp_parser_function_try_block
2266 (cp_parser *);
2267 static void cp_parser_handler_seq
2268 (cp_parser *);
2269 static void cp_parser_handler
2270 (cp_parser *);
2271 static tree cp_parser_exception_declaration
2272 (cp_parser *);
2273 static tree cp_parser_throw_expression
2274 (cp_parser *);
2275 static tree cp_parser_exception_specification_opt
2276 (cp_parser *);
2277 static tree cp_parser_type_id_list
2278 (cp_parser *);
2280 /* GNU Extensions */
2282 static tree cp_parser_asm_specification_opt
2283 (cp_parser *);
2284 static tree cp_parser_asm_operand_list
2285 (cp_parser *);
2286 static tree cp_parser_asm_clobber_list
2287 (cp_parser *);
2288 static tree cp_parser_asm_label_list
2289 (cp_parser *);
2290 static bool cp_next_tokens_can_be_attribute_p
2291 (cp_parser *);
2292 static bool cp_next_tokens_can_be_gnu_attribute_p
2293 (cp_parser *);
2294 static bool cp_next_tokens_can_be_std_attribute_p
2295 (cp_parser *);
2296 static bool cp_nth_tokens_can_be_std_attribute_p
2297 (cp_parser *, size_t);
2298 static bool cp_nth_tokens_can_be_gnu_attribute_p
2299 (cp_parser *, size_t);
2300 static bool cp_nth_tokens_can_be_attribute_p
2301 (cp_parser *, size_t);
2302 static tree cp_parser_attributes_opt
2303 (cp_parser *);
2304 static tree cp_parser_gnu_attributes_opt
2305 (cp_parser *);
2306 static tree cp_parser_gnu_attribute_list
2307 (cp_parser *);
2308 static tree cp_parser_std_attribute
2309 (cp_parser *);
2310 static tree cp_parser_std_attribute_spec
2311 (cp_parser *);
2312 static tree cp_parser_std_attribute_spec_seq
2313 (cp_parser *);
2314 static bool cp_parser_extension_opt
2315 (cp_parser *, int *);
2316 static void cp_parser_label_declaration
2317 (cp_parser *);
2319 /* Transactional Memory Extensions */
2321 static tree cp_parser_transaction
2322 (cp_parser *, enum rid);
2323 static tree cp_parser_transaction_expression
2324 (cp_parser *, enum rid);
2325 static bool cp_parser_function_transaction
2326 (cp_parser *, enum rid);
2327 static tree cp_parser_transaction_cancel
2328 (cp_parser *);
2330 enum pragma_context {
2331 pragma_external,
2332 pragma_member,
2333 pragma_objc_icode,
2334 pragma_stmt,
2335 pragma_compound
2337 static bool cp_parser_pragma
2338 (cp_parser *, enum pragma_context);
2340 /* Objective-C++ Productions */
2342 static tree cp_parser_objc_message_receiver
2343 (cp_parser *);
2344 static tree cp_parser_objc_message_args
2345 (cp_parser *);
2346 static tree cp_parser_objc_message_expression
2347 (cp_parser *);
2348 static tree cp_parser_objc_encode_expression
2349 (cp_parser *);
2350 static tree cp_parser_objc_defs_expression
2351 (cp_parser *);
2352 static tree cp_parser_objc_protocol_expression
2353 (cp_parser *);
2354 static tree cp_parser_objc_selector_expression
2355 (cp_parser *);
2356 static tree cp_parser_objc_expression
2357 (cp_parser *);
2358 static bool cp_parser_objc_selector_p
2359 (enum cpp_ttype);
2360 static tree cp_parser_objc_selector
2361 (cp_parser *);
2362 static tree cp_parser_objc_protocol_refs_opt
2363 (cp_parser *);
2364 static void cp_parser_objc_declaration
2365 (cp_parser *, tree);
2366 static tree cp_parser_objc_statement
2367 (cp_parser *);
2368 static bool cp_parser_objc_valid_prefix_attributes
2369 (cp_parser *, tree *);
2370 static void cp_parser_objc_at_property_declaration
2371 (cp_parser *) ;
2372 static void cp_parser_objc_at_synthesize_declaration
2373 (cp_parser *) ;
2374 static void cp_parser_objc_at_dynamic_declaration
2375 (cp_parser *) ;
2376 static tree cp_parser_objc_struct_declaration
2377 (cp_parser *) ;
2379 /* Utility Routines */
2381 static tree cp_parser_lookup_name
2382 (cp_parser *, tree, enum tag_types, bool, bool, bool, tree *, location_t);
2383 static tree cp_parser_lookup_name_simple
2384 (cp_parser *, tree, location_t);
2385 static tree cp_parser_maybe_treat_template_as_class
2386 (tree, bool);
2387 static bool cp_parser_check_declarator_template_parameters
2388 (cp_parser *, cp_declarator *, location_t);
2389 static bool cp_parser_check_template_parameters
2390 (cp_parser *, unsigned, location_t, cp_declarator *);
2391 static tree cp_parser_simple_cast_expression
2392 (cp_parser *);
2393 static tree cp_parser_global_scope_opt
2394 (cp_parser *, bool);
2395 static bool cp_parser_constructor_declarator_p
2396 (cp_parser *, bool);
2397 static tree cp_parser_function_definition_from_specifiers_and_declarator
2398 (cp_parser *, cp_decl_specifier_seq *, tree, const cp_declarator *);
2399 static tree cp_parser_function_definition_after_declarator
2400 (cp_parser *, bool);
2401 static void cp_parser_template_declaration_after_export
2402 (cp_parser *, bool);
2403 static void cp_parser_perform_template_parameter_access_checks
2404 (vec<deferred_access_check, va_gc> *);
2405 static tree cp_parser_single_declaration
2406 (cp_parser *, vec<deferred_access_check, va_gc> *, bool, bool, bool *);
2407 static tree cp_parser_functional_cast
2408 (cp_parser *, tree);
2409 static tree cp_parser_save_member_function_body
2410 (cp_parser *, cp_decl_specifier_seq *, cp_declarator *, tree);
2411 static tree cp_parser_save_nsdmi
2412 (cp_parser *);
2413 static tree cp_parser_enclosed_template_argument_list
2414 (cp_parser *);
2415 static void cp_parser_save_default_args
2416 (cp_parser *, tree);
2417 static void cp_parser_late_parsing_for_member
2418 (cp_parser *, tree);
2419 static tree cp_parser_late_parse_one_default_arg
2420 (cp_parser *, tree, tree, tree);
2421 static void cp_parser_late_parsing_nsdmi
2422 (cp_parser *, tree);
2423 static void cp_parser_late_parsing_default_args
2424 (cp_parser *, tree);
2425 static tree cp_parser_sizeof_operand
2426 (cp_parser *, enum rid);
2427 static tree cp_parser_trait_expr
2428 (cp_parser *, enum rid);
2429 static bool cp_parser_declares_only_class_p
2430 (cp_parser *);
2431 static void cp_parser_set_storage_class
2432 (cp_parser *, cp_decl_specifier_seq *, enum rid, cp_token *);
2433 static void cp_parser_set_decl_spec_type
2434 (cp_decl_specifier_seq *, tree, cp_token *, bool);
2435 static void set_and_check_decl_spec_loc
2436 (cp_decl_specifier_seq *decl_specs,
2437 cp_decl_spec ds, cp_token *);
2438 static bool cp_parser_friend_p
2439 (const cp_decl_specifier_seq *);
2440 static void cp_parser_required_error
2441 (cp_parser *, required_token, bool);
2442 static cp_token *cp_parser_require
2443 (cp_parser *, enum cpp_ttype, required_token);
2444 static cp_token *cp_parser_require_keyword
2445 (cp_parser *, enum rid, required_token);
2446 static bool cp_parser_token_starts_function_definition_p
2447 (cp_token *);
2448 static bool cp_parser_next_token_starts_class_definition_p
2449 (cp_parser *);
2450 static bool cp_parser_next_token_ends_template_argument_p
2451 (cp_parser *);
2452 static bool cp_parser_nth_token_starts_template_argument_list_p
2453 (cp_parser *, size_t);
2454 static enum tag_types cp_parser_token_is_class_key
2455 (cp_token *);
2456 static enum tag_types cp_parser_token_is_type_parameter_key
2457 (cp_token *);
2458 static void cp_parser_check_class_key
2459 (enum tag_types, tree type);
2460 static void cp_parser_check_access_in_redeclaration
2461 (tree type, location_t location);
2462 static bool cp_parser_optional_template_keyword
2463 (cp_parser *);
2464 static void cp_parser_pre_parsed_nested_name_specifier
2465 (cp_parser *);
2466 static bool cp_parser_cache_group
2467 (cp_parser *, enum cpp_ttype, unsigned);
2468 static tree cp_parser_cache_defarg
2469 (cp_parser *parser, bool nsdmi);
2470 static void cp_parser_parse_tentatively
2471 (cp_parser *);
2472 static void cp_parser_commit_to_tentative_parse
2473 (cp_parser *);
2474 static void cp_parser_commit_to_topmost_tentative_parse
2475 (cp_parser *);
2476 static void cp_parser_abort_tentative_parse
2477 (cp_parser *);
2478 static bool cp_parser_parse_definitely
2479 (cp_parser *);
2480 static inline bool cp_parser_parsing_tentatively
2481 (cp_parser *);
2482 static bool cp_parser_uncommitted_to_tentative_parse_p
2483 (cp_parser *);
2484 static void cp_parser_error
2485 (cp_parser *, const char *);
2486 static void cp_parser_name_lookup_error
2487 (cp_parser *, tree, tree, name_lookup_error, location_t);
2488 static bool cp_parser_simulate_error
2489 (cp_parser *);
2490 static bool cp_parser_check_type_definition
2491 (cp_parser *);
2492 static void cp_parser_check_for_definition_in_return_type
2493 (cp_declarator *, tree, location_t type_location);
2494 static void cp_parser_check_for_invalid_template_id
2495 (cp_parser *, tree, enum tag_types, location_t location);
2496 static bool cp_parser_non_integral_constant_expression
2497 (cp_parser *, non_integral_constant);
2498 static void cp_parser_diagnose_invalid_type_name
2499 (cp_parser *, tree, location_t);
2500 static bool cp_parser_parse_and_diagnose_invalid_type_name
2501 (cp_parser *);
2502 static int cp_parser_skip_to_closing_parenthesis
2503 (cp_parser *, bool, bool, bool);
2504 static void cp_parser_skip_to_end_of_statement
2505 (cp_parser *);
2506 static void cp_parser_consume_semicolon_at_end_of_statement
2507 (cp_parser *);
2508 static void cp_parser_skip_to_end_of_block_or_statement
2509 (cp_parser *);
2510 static bool cp_parser_skip_to_closing_brace
2511 (cp_parser *);
2512 static void cp_parser_skip_to_end_of_template_parameter_list
2513 (cp_parser *);
2514 static void cp_parser_skip_to_pragma_eol
2515 (cp_parser*, cp_token *);
2516 static bool cp_parser_error_occurred
2517 (cp_parser *);
2518 static bool cp_parser_allow_gnu_extensions_p
2519 (cp_parser *);
2520 static bool cp_parser_is_pure_string_literal
2521 (cp_token *);
2522 static bool cp_parser_is_string_literal
2523 (cp_token *);
2524 static bool cp_parser_is_keyword
2525 (cp_token *, enum rid);
2526 static tree cp_parser_make_typename_type
2527 (cp_parser *, tree, location_t location);
2528 static cp_declarator * cp_parser_make_indirect_declarator
2529 (enum tree_code, tree, cp_cv_quals, cp_declarator *, tree);
2530 static bool cp_parser_compound_literal_p
2531 (cp_parser *);
2532 static bool cp_parser_array_designator_p
2533 (cp_parser *);
2534 static bool cp_parser_skip_to_closing_square_bracket
2535 (cp_parser *);
2537 /* Returns nonzero if we are parsing tentatively. */
2539 static inline bool
2540 cp_parser_parsing_tentatively (cp_parser* parser)
2542 return parser->context->next != NULL;
2545 /* Returns nonzero if TOKEN is a string literal. */
2547 static bool
2548 cp_parser_is_pure_string_literal (cp_token* token)
2550 return (token->type == CPP_STRING ||
2551 token->type == CPP_STRING16 ||
2552 token->type == CPP_STRING32 ||
2553 token->type == CPP_WSTRING ||
2554 token->type == CPP_UTF8STRING);
2557 /* Returns nonzero if TOKEN is a string literal
2558 of a user-defined string literal. */
2560 static bool
2561 cp_parser_is_string_literal (cp_token* token)
2563 return (cp_parser_is_pure_string_literal (token) ||
2564 token->type == CPP_STRING_USERDEF ||
2565 token->type == CPP_STRING16_USERDEF ||
2566 token->type == CPP_STRING32_USERDEF ||
2567 token->type == CPP_WSTRING_USERDEF ||
2568 token->type == CPP_UTF8STRING_USERDEF);
2571 /* Returns nonzero if TOKEN is the indicated KEYWORD. */
2573 static bool
2574 cp_parser_is_keyword (cp_token* token, enum rid keyword)
2576 return token->keyword == keyword;
2579 /* If not parsing tentatively, issue a diagnostic of the form
2580 FILE:LINE: MESSAGE before TOKEN
2581 where TOKEN is the next token in the input stream. MESSAGE
2582 (specified by the caller) is usually of the form "expected
2583 OTHER-TOKEN". */
2585 static void
2586 cp_parser_error (cp_parser* parser, const char* gmsgid)
2588 if (!cp_parser_simulate_error (parser))
2590 cp_token *token = cp_lexer_peek_token (parser->lexer);
2591 /* This diagnostic makes more sense if it is tagged to the line
2592 of the token we just peeked at. */
2593 cp_lexer_set_source_position_from_token (token);
2595 if (token->type == CPP_PRAGMA)
2597 error_at (token->location,
2598 "%<#pragma%> is not allowed here");
2599 cp_parser_skip_to_pragma_eol (parser, token);
2600 return;
2603 c_parse_error (gmsgid,
2604 /* Because c_parser_error does not understand
2605 CPP_KEYWORD, keywords are treated like
2606 identifiers. */
2607 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
2608 token->u.value, token->flags);
2612 /* Issue an error about name-lookup failing. NAME is the
2613 IDENTIFIER_NODE DECL is the result of
2614 the lookup (as returned from cp_parser_lookup_name). DESIRED is
2615 the thing that we hoped to find. */
2617 static void
2618 cp_parser_name_lookup_error (cp_parser* parser,
2619 tree name,
2620 tree decl,
2621 name_lookup_error desired,
2622 location_t location)
2624 /* If name lookup completely failed, tell the user that NAME was not
2625 declared. */
2626 if (decl == error_mark_node)
2628 if (parser->scope && parser->scope != global_namespace)
2629 error_at (location, "%<%E::%E%> has not been declared",
2630 parser->scope, name);
2631 else if (parser->scope == global_namespace)
2632 error_at (location, "%<::%E%> has not been declared", name);
2633 else if (parser->object_scope
2634 && !CLASS_TYPE_P (parser->object_scope))
2635 error_at (location, "request for member %qE in non-class type %qT",
2636 name, parser->object_scope);
2637 else if (parser->object_scope)
2638 error_at (location, "%<%T::%E%> has not been declared",
2639 parser->object_scope, name);
2640 else
2641 error_at (location, "%qE has not been declared", name);
2643 else if (parser->scope && parser->scope != global_namespace)
2645 switch (desired)
2647 case NLE_TYPE:
2648 error_at (location, "%<%E::%E%> is not a type",
2649 parser->scope, name);
2650 break;
2651 case NLE_CXX98:
2652 error_at (location, "%<%E::%E%> is not a class or namespace",
2653 parser->scope, name);
2654 break;
2655 case NLE_NOT_CXX98:
2656 error_at (location,
2657 "%<%E::%E%> is not a class, namespace, or enumeration",
2658 parser->scope, name);
2659 break;
2660 default:
2661 gcc_unreachable ();
2665 else if (parser->scope == global_namespace)
2667 switch (desired)
2669 case NLE_TYPE:
2670 error_at (location, "%<::%E%> is not a type", name);
2671 break;
2672 case NLE_CXX98:
2673 error_at (location, "%<::%E%> is not a class or namespace", name);
2674 break;
2675 case NLE_NOT_CXX98:
2676 error_at (location,
2677 "%<::%E%> is not a class, namespace, or enumeration",
2678 name);
2679 break;
2680 default:
2681 gcc_unreachable ();
2684 else
2686 switch (desired)
2688 case NLE_TYPE:
2689 error_at (location, "%qE is not a type", name);
2690 break;
2691 case NLE_CXX98:
2692 error_at (location, "%qE is not a class or namespace", name);
2693 break;
2694 case NLE_NOT_CXX98:
2695 error_at (location,
2696 "%qE is not a class, namespace, or enumeration", name);
2697 break;
2698 default:
2699 gcc_unreachable ();
2704 /* If we are parsing tentatively, remember that an error has occurred
2705 during this tentative parse. Returns true if the error was
2706 simulated; false if a message should be issued by the caller. */
2708 static bool
2709 cp_parser_simulate_error (cp_parser* parser)
2711 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
2713 parser->context->status = CP_PARSER_STATUS_KIND_ERROR;
2714 return true;
2716 return false;
2719 /* This function is called when a type is defined. If type
2720 definitions are forbidden at this point, an error message is
2721 issued. */
2723 static bool
2724 cp_parser_check_type_definition (cp_parser* parser)
2726 /* If types are forbidden here, issue a message. */
2727 if (parser->type_definition_forbidden_message)
2729 /* Don't use `%s' to print the string, because quotations (`%<', `%>')
2730 in the message need to be interpreted. */
2731 error (parser->type_definition_forbidden_message);
2732 return false;
2734 return true;
2737 /* This function is called when the DECLARATOR is processed. The TYPE
2738 was a type defined in the decl-specifiers. If it is invalid to
2739 define a type in the decl-specifiers for DECLARATOR, an error is
2740 issued. TYPE_LOCATION is the location of TYPE and is used
2741 for error reporting. */
2743 static void
2744 cp_parser_check_for_definition_in_return_type (cp_declarator *declarator,
2745 tree type, location_t type_location)
2747 /* [dcl.fct] forbids type definitions in return types.
2748 Unfortunately, it's not easy to know whether or not we are
2749 processing a return type until after the fact. */
2750 while (declarator
2751 && (declarator->kind == cdk_pointer
2752 || declarator->kind == cdk_reference
2753 || declarator->kind == cdk_ptrmem))
2754 declarator = declarator->declarator;
2755 if (declarator
2756 && declarator->kind == cdk_function)
2758 error_at (type_location,
2759 "new types may not be defined in a return type");
2760 inform (type_location,
2761 "(perhaps a semicolon is missing after the definition of %qT)",
2762 type);
2766 /* A type-specifier (TYPE) has been parsed which cannot be followed by
2767 "<" in any valid C++ program. If the next token is indeed "<",
2768 issue a message warning the user about what appears to be an
2769 invalid attempt to form a template-id. LOCATION is the location
2770 of the type-specifier (TYPE) */
2772 static void
2773 cp_parser_check_for_invalid_template_id (cp_parser* parser,
2774 tree type,
2775 enum tag_types tag_type,
2776 location_t location)
2778 cp_token_position start = 0;
2780 if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
2782 if (TYPE_P (type))
2783 error_at (location, "%qT is not a template", type);
2784 else if (identifier_p (type))
2786 if (tag_type != none_type)
2787 error_at (location, "%qE is not a class template", type);
2788 else
2789 error_at (location, "%qE is not a template", type);
2791 else
2792 error_at (location, "invalid template-id");
2793 /* Remember the location of the invalid "<". */
2794 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
2795 start = cp_lexer_token_position (parser->lexer, true);
2796 /* Consume the "<". */
2797 cp_lexer_consume_token (parser->lexer);
2798 /* Parse the template arguments. */
2799 cp_parser_enclosed_template_argument_list (parser);
2800 /* Permanently remove the invalid template arguments so that
2801 this error message is not issued again. */
2802 if (start)
2803 cp_lexer_purge_tokens_after (parser->lexer, start);
2807 /* If parsing an integral constant-expression, issue an error message
2808 about the fact that THING appeared and return true. Otherwise,
2809 return false. In either case, set
2810 PARSER->NON_INTEGRAL_CONSTANT_EXPRESSION_P. */
2812 static bool
2813 cp_parser_non_integral_constant_expression (cp_parser *parser,
2814 non_integral_constant thing)
2816 parser->non_integral_constant_expression_p = true;
2817 if (parser->integral_constant_expression_p)
2819 if (!parser->allow_non_integral_constant_expression_p)
2821 const char *msg = NULL;
2822 switch (thing)
2824 case NIC_FLOAT:
2825 error ("floating-point literal "
2826 "cannot appear in a constant-expression");
2827 return true;
2828 case NIC_CAST:
2829 error ("a cast to a type other than an integral or "
2830 "enumeration type cannot appear in a "
2831 "constant-expression");
2832 return true;
2833 case NIC_TYPEID:
2834 error ("%<typeid%> operator "
2835 "cannot appear in a constant-expression");
2836 return true;
2837 case NIC_NCC:
2838 error ("non-constant compound literals "
2839 "cannot appear in a constant-expression");
2840 return true;
2841 case NIC_FUNC_CALL:
2842 error ("a function call "
2843 "cannot appear in a constant-expression");
2844 return true;
2845 case NIC_INC:
2846 error ("an increment "
2847 "cannot appear in a constant-expression");
2848 return true;
2849 case NIC_DEC:
2850 error ("an decrement "
2851 "cannot appear in a constant-expression");
2852 return true;
2853 case NIC_ARRAY_REF:
2854 error ("an array reference "
2855 "cannot appear in a constant-expression");
2856 return true;
2857 case NIC_ADDR_LABEL:
2858 error ("the address of a label "
2859 "cannot appear in a constant-expression");
2860 return true;
2861 case NIC_OVERLOADED:
2862 error ("calls to overloaded operators "
2863 "cannot appear in a constant-expression");
2864 return true;
2865 case NIC_ASSIGNMENT:
2866 error ("an assignment cannot appear in a constant-expression");
2867 return true;
2868 case NIC_COMMA:
2869 error ("a comma operator "
2870 "cannot appear in a constant-expression");
2871 return true;
2872 case NIC_CONSTRUCTOR:
2873 error ("a call to a constructor "
2874 "cannot appear in a constant-expression");
2875 return true;
2876 case NIC_TRANSACTION:
2877 error ("a transaction expression "
2878 "cannot appear in a constant-expression");
2879 return true;
2880 case NIC_THIS:
2881 msg = "this";
2882 break;
2883 case NIC_FUNC_NAME:
2884 msg = "__FUNCTION__";
2885 break;
2886 case NIC_PRETTY_FUNC:
2887 msg = "__PRETTY_FUNCTION__";
2888 break;
2889 case NIC_C99_FUNC:
2890 msg = "__func__";
2891 break;
2892 case NIC_VA_ARG:
2893 msg = "va_arg";
2894 break;
2895 case NIC_ARROW:
2896 msg = "->";
2897 break;
2898 case NIC_POINT:
2899 msg = ".";
2900 break;
2901 case NIC_STAR:
2902 msg = "*";
2903 break;
2904 case NIC_ADDR:
2905 msg = "&";
2906 break;
2907 case NIC_PREINCREMENT:
2908 msg = "++";
2909 break;
2910 case NIC_PREDECREMENT:
2911 msg = "--";
2912 break;
2913 case NIC_NEW:
2914 msg = "new";
2915 break;
2916 case NIC_DEL:
2917 msg = "delete";
2918 break;
2919 default:
2920 gcc_unreachable ();
2922 if (msg)
2923 error ("%qs cannot appear in a constant-expression", msg);
2924 return true;
2927 return false;
2930 /* Emit a diagnostic for an invalid type name. This function commits
2931 to the current active tentative parse, if any. (Otherwise, the
2932 problematic construct might be encountered again later, resulting
2933 in duplicate error messages.) LOCATION is the location of ID. */
2935 static void
2936 cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree id,
2937 location_t location)
2939 tree decl, ambiguous_decls;
2940 cp_parser_commit_to_tentative_parse (parser);
2941 /* Try to lookup the identifier. */
2942 decl = cp_parser_lookup_name (parser, id, none_type,
2943 /*is_template=*/false,
2944 /*is_namespace=*/false,
2945 /*check_dependency=*/true,
2946 &ambiguous_decls, location);
2947 if (ambiguous_decls)
2948 /* If the lookup was ambiguous, an error will already have
2949 been issued. */
2950 return;
2951 /* If the lookup found a template-name, it means that the user forgot
2952 to specify an argument list. Emit a useful error message. */
2953 if (TREE_CODE (decl) == TEMPLATE_DECL)
2954 error_at (location,
2955 "invalid use of template-name %qE without an argument list",
2956 decl);
2957 else if (TREE_CODE (id) == BIT_NOT_EXPR)
2958 error_at (location, "invalid use of destructor %qD as a type", id);
2959 else if (TREE_CODE (decl) == TYPE_DECL)
2960 /* Something like 'unsigned A a;' */
2961 error_at (location, "invalid combination of multiple type-specifiers");
2962 else if (!parser->scope)
2964 /* Issue an error message. */
2965 error_at (location, "%qE does not name a type", id);
2966 /* If we're in a template class, it's possible that the user was
2967 referring to a type from a base class. For example:
2969 template <typename T> struct A { typedef T X; };
2970 template <typename T> struct B : public A<T> { X x; };
2972 The user should have said "typename A<T>::X". */
2973 if (cxx_dialect < cxx11 && id == ridpointers[(int)RID_CONSTEXPR])
2974 inform (location, "C++11 %<constexpr%> only available with "
2975 "-std=c++11 or -std=gnu++11");
2976 else if (cxx_dialect < cxx11 && id == ridpointers[(int)RID_NOEXCEPT])
2977 inform (location, "C++11 %<noexcept%> only available with "
2978 "-std=c++11 or -std=gnu++11");
2979 else if (cxx_dialect < cxx11
2980 && TREE_CODE (id) == IDENTIFIER_NODE
2981 && !strcmp (IDENTIFIER_POINTER (id), "thread_local"))
2982 inform (location, "C++11 %<thread_local%> only available with "
2983 "-std=c++11 or -std=gnu++11");
2984 else if (processing_template_decl && current_class_type
2985 && TYPE_BINFO (current_class_type))
2987 tree b;
2989 for (b = TREE_CHAIN (TYPE_BINFO (current_class_type));
2991 b = TREE_CHAIN (b))
2993 tree base_type = BINFO_TYPE (b);
2994 if (CLASS_TYPE_P (base_type)
2995 && dependent_type_p (base_type))
2997 tree field;
2998 /* Go from a particular instantiation of the
2999 template (which will have an empty TYPE_FIELDs),
3000 to the main version. */
3001 base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
3002 for (field = TYPE_FIELDS (base_type);
3003 field;
3004 field = DECL_CHAIN (field))
3005 if (TREE_CODE (field) == TYPE_DECL
3006 && DECL_NAME (field) == id)
3008 inform (location,
3009 "(perhaps %<typename %T::%E%> was intended)",
3010 BINFO_TYPE (b), id);
3011 break;
3013 if (field)
3014 break;
3019 /* Here we diagnose qualified-ids where the scope is actually correct,
3020 but the identifier does not resolve to a valid type name. */
3021 else if (parser->scope != error_mark_node)
3023 if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
3025 if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3026 error_at (location_of (id),
3027 "%qE in namespace %qE does not name a template type",
3028 id, parser->scope);
3029 else
3030 error_at (location_of (id),
3031 "%qE in namespace %qE does not name a type",
3032 id, parser->scope);
3034 else if (CLASS_TYPE_P (parser->scope)
3035 && constructor_name_p (id, parser->scope))
3037 /* A<T>::A<T>() */
3038 error_at (location, "%<%T::%E%> names the constructor, not"
3039 " the type", parser->scope, id);
3040 if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3041 error_at (location, "and %qT has no template constructors",
3042 parser->scope);
3044 else if (TYPE_P (parser->scope)
3045 && dependent_scope_p (parser->scope))
3046 error_at (location, "need %<typename%> before %<%T::%E%> because "
3047 "%qT is a dependent scope",
3048 parser->scope, id, parser->scope);
3049 else if (TYPE_P (parser->scope))
3051 if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3052 error_at (location_of (id),
3053 "%qE in %q#T does not name a template type",
3054 id, parser->scope);
3055 else
3056 error_at (location_of (id),
3057 "%qE in %q#T does not name a type",
3058 id, parser->scope);
3060 else
3061 gcc_unreachable ();
3065 /* Check for a common situation where a type-name should be present,
3066 but is not, and issue a sensible error message. Returns true if an
3067 invalid type-name was detected.
3069 The situation handled by this function are variable declarations of the
3070 form `ID a', where `ID' is an id-expression and `a' is a plain identifier.
3071 Usually, `ID' should name a type, but if we got here it means that it
3072 does not. We try to emit the best possible error message depending on
3073 how exactly the id-expression looks like. */
3075 static bool
3076 cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
3078 tree id;
3079 cp_token *token = cp_lexer_peek_token (parser->lexer);
3081 /* Avoid duplicate error about ambiguous lookup. */
3082 if (token->type == CPP_NESTED_NAME_SPECIFIER)
3084 cp_token *next = cp_lexer_peek_nth_token (parser->lexer, 2);
3085 if (next->type == CPP_NAME && next->error_reported)
3086 goto out;
3089 cp_parser_parse_tentatively (parser);
3090 id = cp_parser_id_expression (parser,
3091 /*template_keyword_p=*/false,
3092 /*check_dependency_p=*/true,
3093 /*template_p=*/NULL,
3094 /*declarator_p=*/true,
3095 /*optional_p=*/false);
3096 /* If the next token is a (, this is a function with no explicit return
3097 type, i.e. constructor, destructor or conversion op. */
3098 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
3099 || TREE_CODE (id) == TYPE_DECL)
3101 cp_parser_abort_tentative_parse (parser);
3102 return false;
3104 if (!cp_parser_parse_definitely (parser))
3105 return false;
3107 /* Emit a diagnostic for the invalid type. */
3108 cp_parser_diagnose_invalid_type_name (parser, id, token->location);
3109 out:
3110 /* If we aren't in the middle of a declarator (i.e. in a
3111 parameter-declaration-clause), skip to the end of the declaration;
3112 there's no point in trying to process it. */
3113 if (!parser->in_declarator_p)
3114 cp_parser_skip_to_end_of_block_or_statement (parser);
3115 return true;
3118 /* Consume tokens up to, and including, the next non-nested closing `)'.
3119 Returns 1 iff we found a closing `)'. RECOVERING is true, if we
3120 are doing error recovery. Returns -1 if OR_COMMA is true and we
3121 found an unnested comma. */
3123 static int
3124 cp_parser_skip_to_closing_parenthesis (cp_parser *parser,
3125 bool recovering,
3126 bool or_comma,
3127 bool consume_paren)
3129 unsigned paren_depth = 0;
3130 unsigned brace_depth = 0;
3131 unsigned square_depth = 0;
3133 if (recovering && !or_comma
3134 && cp_parser_uncommitted_to_tentative_parse_p (parser))
3135 return 0;
3137 while (true)
3139 cp_token * token = cp_lexer_peek_token (parser->lexer);
3141 switch (token->type)
3143 case CPP_EOF:
3144 case CPP_PRAGMA_EOL:
3145 /* If we've run out of tokens, then there is no closing `)'. */
3146 return 0;
3148 /* This is good for lambda expression capture-lists. */
3149 case CPP_OPEN_SQUARE:
3150 ++square_depth;
3151 break;
3152 case CPP_CLOSE_SQUARE:
3153 if (!square_depth--)
3154 return 0;
3155 break;
3157 case CPP_SEMICOLON:
3158 /* This matches the processing in skip_to_end_of_statement. */
3159 if (!brace_depth)
3160 return 0;
3161 break;
3163 case CPP_OPEN_BRACE:
3164 ++brace_depth;
3165 break;
3166 case CPP_CLOSE_BRACE:
3167 if (!brace_depth--)
3168 return 0;
3169 break;
3171 case CPP_COMMA:
3172 if (recovering && or_comma && !brace_depth && !paren_depth
3173 && !square_depth)
3174 return -1;
3175 break;
3177 case CPP_OPEN_PAREN:
3178 if (!brace_depth)
3179 ++paren_depth;
3180 break;
3182 case CPP_CLOSE_PAREN:
3183 if (!brace_depth && !paren_depth--)
3185 if (consume_paren)
3186 cp_lexer_consume_token (parser->lexer);
3187 return 1;
3189 break;
3191 default:
3192 break;
3195 /* Consume the token. */
3196 cp_lexer_consume_token (parser->lexer);
3200 /* Consume tokens until we reach the end of the current statement.
3201 Normally, that will be just before consuming a `;'. However, if a
3202 non-nested `}' comes first, then we stop before consuming that. */
3204 static void
3205 cp_parser_skip_to_end_of_statement (cp_parser* parser)
3207 unsigned nesting_depth = 0;
3209 /* Unwind generic function template scope if necessary. */
3210 if (parser->fully_implicit_function_template_p)
3211 finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
3213 while (true)
3215 cp_token *token = cp_lexer_peek_token (parser->lexer);
3217 switch (token->type)
3219 case CPP_EOF:
3220 case CPP_PRAGMA_EOL:
3221 /* If we've run out of tokens, stop. */
3222 return;
3224 case CPP_SEMICOLON:
3225 /* If the next token is a `;', we have reached the end of the
3226 statement. */
3227 if (!nesting_depth)
3228 return;
3229 break;
3231 case CPP_CLOSE_BRACE:
3232 /* If this is a non-nested '}', stop before consuming it.
3233 That way, when confronted with something like:
3235 { 3 + }
3237 we stop before consuming the closing '}', even though we
3238 have not yet reached a `;'. */
3239 if (nesting_depth == 0)
3240 return;
3242 /* If it is the closing '}' for a block that we have
3243 scanned, stop -- but only after consuming the token.
3244 That way given:
3246 void f g () { ... }
3247 typedef int I;
3249 we will stop after the body of the erroneously declared
3250 function, but before consuming the following `typedef'
3251 declaration. */
3252 if (--nesting_depth == 0)
3254 cp_lexer_consume_token (parser->lexer);
3255 return;
3258 case CPP_OPEN_BRACE:
3259 ++nesting_depth;
3260 break;
3262 default:
3263 break;
3266 /* Consume the token. */
3267 cp_lexer_consume_token (parser->lexer);
3271 /* This function is called at the end of a statement or declaration.
3272 If the next token is a semicolon, it is consumed; otherwise, error
3273 recovery is attempted. */
3275 static void
3276 cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
3278 /* Look for the trailing `;'. */
3279 if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
3281 /* If there is additional (erroneous) input, skip to the end of
3282 the statement. */
3283 cp_parser_skip_to_end_of_statement (parser);
3284 /* If the next token is now a `;', consume it. */
3285 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
3286 cp_lexer_consume_token (parser->lexer);
3290 /* Skip tokens until we have consumed an entire block, or until we
3291 have consumed a non-nested `;'. */
3293 static void
3294 cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
3296 int nesting_depth = 0;
3298 /* Unwind generic function template scope if necessary. */
3299 if (parser->fully_implicit_function_template_p)
3300 finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
3302 while (nesting_depth >= 0)
3304 cp_token *token = cp_lexer_peek_token (parser->lexer);
3306 switch (token->type)
3308 case CPP_EOF:
3309 case CPP_PRAGMA_EOL:
3310 /* If we've run out of tokens, stop. */
3311 return;
3313 case CPP_SEMICOLON:
3314 /* Stop if this is an unnested ';'. */
3315 if (!nesting_depth)
3316 nesting_depth = -1;
3317 break;
3319 case CPP_CLOSE_BRACE:
3320 /* Stop if this is an unnested '}', or closes the outermost
3321 nesting level. */
3322 nesting_depth--;
3323 if (nesting_depth < 0)
3324 return;
3325 if (!nesting_depth)
3326 nesting_depth = -1;
3327 break;
3329 case CPP_OPEN_BRACE:
3330 /* Nest. */
3331 nesting_depth++;
3332 break;
3334 default:
3335 break;
3338 /* Consume the token. */
3339 cp_lexer_consume_token (parser->lexer);
3343 /* Skip tokens until a non-nested closing curly brace is the next
3344 token, or there are no more tokens. Return true in the first case,
3345 false otherwise. */
3347 static bool
3348 cp_parser_skip_to_closing_brace (cp_parser *parser)
3350 unsigned nesting_depth = 0;
3352 while (true)
3354 cp_token *token = cp_lexer_peek_token (parser->lexer);
3356 switch (token->type)
3358 case CPP_EOF:
3359 case CPP_PRAGMA_EOL:
3360 /* If we've run out of tokens, stop. */
3361 return false;
3363 case CPP_CLOSE_BRACE:
3364 /* If the next token is a non-nested `}', then we have reached
3365 the end of the current block. */
3366 if (nesting_depth-- == 0)
3367 return true;
3368 break;
3370 case CPP_OPEN_BRACE:
3371 /* If it the next token is a `{', then we are entering a new
3372 block. Consume the entire block. */
3373 ++nesting_depth;
3374 break;
3376 default:
3377 break;
3380 /* Consume the token. */
3381 cp_lexer_consume_token (parser->lexer);
3385 /* Consume tokens until we reach the end of the pragma. The PRAGMA_TOK
3386 parameter is the PRAGMA token, allowing us to purge the entire pragma
3387 sequence. */
3389 static void
3390 cp_parser_skip_to_pragma_eol (cp_parser* parser, cp_token *pragma_tok)
3392 cp_token *token;
3394 parser->lexer->in_pragma = false;
3397 token = cp_lexer_consume_token (parser->lexer);
3398 while (token->type != CPP_PRAGMA_EOL && token->type != CPP_EOF);
3400 /* Ensure that the pragma is not parsed again. */
3401 cp_lexer_purge_tokens_after (parser->lexer, pragma_tok);
3404 /* Require pragma end of line, resyncing with it as necessary. The
3405 arguments are as for cp_parser_skip_to_pragma_eol. */
3407 static void
3408 cp_parser_require_pragma_eol (cp_parser *parser, cp_token *pragma_tok)
3410 parser->lexer->in_pragma = false;
3411 if (!cp_parser_require (parser, CPP_PRAGMA_EOL, RT_PRAGMA_EOL))
3412 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
3415 /* This is a simple wrapper around make_typename_type. When the id is
3416 an unresolved identifier node, we can provide a superior diagnostic
3417 using cp_parser_diagnose_invalid_type_name. */
3419 static tree
3420 cp_parser_make_typename_type (cp_parser *parser, tree id,
3421 location_t id_location)
3423 tree result;
3424 if (identifier_p (id))
3426 result = make_typename_type (parser->scope, id, typename_type,
3427 /*complain=*/tf_none);
3428 if (result == error_mark_node)
3429 cp_parser_diagnose_invalid_type_name (parser, id, id_location);
3430 return result;
3432 return make_typename_type (parser->scope, id, typename_type, tf_error);
3435 /* This is a wrapper around the
3436 make_{pointer,ptrmem,reference}_declarator functions that decides
3437 which one to call based on the CODE and CLASS_TYPE arguments. The
3438 CODE argument should be one of the values returned by
3439 cp_parser_ptr_operator. ATTRIBUTES represent the attributes that
3440 appertain to the pointer or reference. */
3442 static cp_declarator *
3443 cp_parser_make_indirect_declarator (enum tree_code code, tree class_type,
3444 cp_cv_quals cv_qualifiers,
3445 cp_declarator *target,
3446 tree attributes)
3448 if (code == ERROR_MARK)
3449 return cp_error_declarator;
3451 if (code == INDIRECT_REF)
3452 if (class_type == NULL_TREE)
3453 return make_pointer_declarator (cv_qualifiers, target, attributes);
3454 else
3455 return make_ptrmem_declarator (cv_qualifiers, class_type,
3456 target, attributes);
3457 else if (code == ADDR_EXPR && class_type == NULL_TREE)
3458 return make_reference_declarator (cv_qualifiers, target,
3459 false, attributes);
3460 else if (code == NON_LVALUE_EXPR && class_type == NULL_TREE)
3461 return make_reference_declarator (cv_qualifiers, target,
3462 true, attributes);
3463 gcc_unreachable ();
3466 /* Create a new C++ parser. */
3468 static cp_parser *
3469 cp_parser_new (void)
3471 cp_parser *parser;
3472 cp_lexer *lexer;
3473 unsigned i;
3475 /* cp_lexer_new_main is called before doing GC allocation because
3476 cp_lexer_new_main might load a PCH file. */
3477 lexer = cp_lexer_new_main ();
3479 /* Initialize the binops_by_token so that we can get the tree
3480 directly from the token. */
3481 for (i = 0; i < sizeof (binops) / sizeof (binops[0]); i++)
3482 binops_by_token[binops[i].token_type] = binops[i];
3484 parser = ggc_cleared_alloc<cp_parser> ();
3485 parser->lexer = lexer;
3486 parser->context = cp_parser_context_new (NULL);
3488 /* For now, we always accept GNU extensions. */
3489 parser->allow_gnu_extensions_p = 1;
3491 /* The `>' token is a greater-than operator, not the end of a
3492 template-id. */
3493 parser->greater_than_is_operator_p = true;
3495 parser->default_arg_ok_p = true;
3497 /* We are not parsing a constant-expression. */
3498 parser->integral_constant_expression_p = false;
3499 parser->allow_non_integral_constant_expression_p = false;
3500 parser->non_integral_constant_expression_p = false;
3502 /* Local variable names are not forbidden. */
3503 parser->local_variables_forbidden_p = false;
3505 /* We are not processing an `extern "C"' declaration. */
3506 parser->in_unbraced_linkage_specification_p = false;
3508 /* We are not processing a declarator. */
3509 parser->in_declarator_p = false;
3511 /* We are not processing a template-argument-list. */
3512 parser->in_template_argument_list_p = false;
3514 /* We are not in an iteration statement. */
3515 parser->in_statement = 0;
3517 /* We are not in a switch statement. */
3518 parser->in_switch_statement_p = false;
3520 /* We are not parsing a type-id inside an expression. */
3521 parser->in_type_id_in_expr_p = false;
3523 /* Declarations aren't implicitly extern "C". */
3524 parser->implicit_extern_c = false;
3526 /* String literals should be translated to the execution character set. */
3527 parser->translate_strings_p = true;
3529 /* We are not parsing a function body. */
3530 parser->in_function_body = false;
3532 /* We can correct until told otherwise. */
3533 parser->colon_corrects_to_scope_p = true;
3535 /* The unparsed function queue is empty. */
3536 push_unparsed_function_queues (parser);
3538 /* There are no classes being defined. */
3539 parser->num_classes_being_defined = 0;
3541 /* No template parameters apply. */
3542 parser->num_template_parameter_lists = 0;
3544 /* Not declaring an implicit function template. */
3545 parser->auto_is_implicit_function_template_parm_p = false;
3546 parser->fully_implicit_function_template_p = false;
3547 parser->implicit_template_parms = 0;
3548 parser->implicit_template_scope = 0;
3550 return parser;
3553 /* Create a cp_lexer structure which will emit the tokens in CACHE
3554 and push it onto the parser's lexer stack. This is used for delayed
3555 parsing of in-class method bodies and default arguments, and should
3556 not be confused with tentative parsing. */
3557 static void
3558 cp_parser_push_lexer_for_tokens (cp_parser *parser, cp_token_cache *cache)
3560 cp_lexer *lexer = cp_lexer_new_from_tokens (cache);
3561 lexer->next = parser->lexer;
3562 parser->lexer = lexer;
3564 /* Move the current source position to that of the first token in the
3565 new lexer. */
3566 cp_lexer_set_source_position_from_token (lexer->next_token);
3569 /* Pop the top lexer off the parser stack. This is never used for the
3570 "main" lexer, only for those pushed by cp_parser_push_lexer_for_tokens. */
3571 static void
3572 cp_parser_pop_lexer (cp_parser *parser)
3574 cp_lexer *lexer = parser->lexer;
3575 parser->lexer = lexer->next;
3576 cp_lexer_destroy (lexer);
3578 /* Put the current source position back where it was before this
3579 lexer was pushed. */
3580 cp_lexer_set_source_position_from_token (parser->lexer->next_token);
3583 /* Lexical conventions [gram.lex] */
3585 /* Parse an identifier. Returns an IDENTIFIER_NODE representing the
3586 identifier. */
3588 static tree
3589 cp_parser_identifier (cp_parser* parser)
3591 cp_token *token;
3593 /* Look for the identifier. */
3594 token = cp_parser_require (parser, CPP_NAME, RT_NAME);
3595 /* Return the value. */
3596 return token ? token->u.value : error_mark_node;
3599 /* Parse a sequence of adjacent string constants. Returns a
3600 TREE_STRING representing the combined, nul-terminated string
3601 constant. If TRANSLATE is true, translate the string to the
3602 execution character set. If WIDE_OK is true, a wide string is
3603 invalid here.
3605 C++98 [lex.string] says that if a narrow string literal token is
3606 adjacent to a wide string literal token, the behavior is undefined.
3607 However, C99 6.4.5p4 says that this results in a wide string literal.
3608 We follow C99 here, for consistency with the C front end.
3610 This code is largely lifted from lex_string() in c-lex.c.
3612 FUTURE: ObjC++ will need to handle @-strings here. */
3613 static tree
3614 cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok,
3615 bool lookup_udlit = true)
3617 tree value;
3618 size_t count;
3619 struct obstack str_ob;
3620 cpp_string str, istr, *strs;
3621 cp_token *tok;
3622 enum cpp_ttype type, curr_type;
3623 int have_suffix_p = 0;
3624 tree string_tree;
3625 tree suffix_id = NULL_TREE;
3626 bool curr_tok_is_userdef_p = false;
3628 tok = cp_lexer_peek_token (parser->lexer);
3629 if (!cp_parser_is_string_literal (tok))
3631 cp_parser_error (parser, "expected string-literal");
3632 return error_mark_node;
3635 if (cpp_userdef_string_p (tok->type))
3637 string_tree = USERDEF_LITERAL_VALUE (tok->u.value);
3638 curr_type = cpp_userdef_string_remove_type (tok->type);
3639 curr_tok_is_userdef_p = true;
3641 else
3643 string_tree = tok->u.value;
3644 curr_type = tok->type;
3646 type = curr_type;
3648 /* Try to avoid the overhead of creating and destroying an obstack
3649 for the common case of just one string. */
3650 if (!cp_parser_is_string_literal
3651 (cp_lexer_peek_nth_token (parser->lexer, 2)))
3653 cp_lexer_consume_token (parser->lexer);
3655 str.text = (const unsigned char *)TREE_STRING_POINTER (string_tree);
3656 str.len = TREE_STRING_LENGTH (string_tree);
3657 count = 1;
3659 if (curr_tok_is_userdef_p)
3661 suffix_id = USERDEF_LITERAL_SUFFIX_ID (tok->u.value);
3662 have_suffix_p = 1;
3663 curr_type = cpp_userdef_string_remove_type (tok->type);
3665 else
3666 curr_type = tok->type;
3668 strs = &str;
3670 else
3672 gcc_obstack_init (&str_ob);
3673 count = 0;
3677 cp_lexer_consume_token (parser->lexer);
3678 count++;
3679 str.text = (const unsigned char *)TREE_STRING_POINTER (string_tree);
3680 str.len = TREE_STRING_LENGTH (string_tree);
3682 if (curr_tok_is_userdef_p)
3684 tree curr_suffix_id = USERDEF_LITERAL_SUFFIX_ID (tok->u.value);
3685 if (have_suffix_p == 0)
3687 suffix_id = curr_suffix_id;
3688 have_suffix_p = 1;
3690 else if (have_suffix_p == 1
3691 && curr_suffix_id != suffix_id)
3693 error ("inconsistent user-defined literal suffixes"
3694 " %qD and %qD in string literal",
3695 suffix_id, curr_suffix_id);
3696 have_suffix_p = -1;
3698 curr_type = cpp_userdef_string_remove_type (tok->type);
3700 else
3701 curr_type = tok->type;
3703 if (type != curr_type)
3705 if (type == CPP_STRING)
3706 type = curr_type;
3707 else if (curr_type != CPP_STRING)
3708 error_at (tok->location,
3709 "unsupported non-standard concatenation "
3710 "of string literals");
3713 obstack_grow (&str_ob, &str, sizeof (cpp_string));
3715 tok = cp_lexer_peek_token (parser->lexer);
3716 if (cpp_userdef_string_p (tok->type))
3718 string_tree = USERDEF_LITERAL_VALUE (tok->u.value);
3719 curr_type = cpp_userdef_string_remove_type (tok->type);
3720 curr_tok_is_userdef_p = true;
3722 else
3724 string_tree = tok->u.value;
3725 curr_type = tok->type;
3726 curr_tok_is_userdef_p = false;
3729 while (cp_parser_is_string_literal (tok));
3731 strs = (cpp_string *) obstack_finish (&str_ob);
3734 if (type != CPP_STRING && !wide_ok)
3736 cp_parser_error (parser, "a wide string is invalid in this context");
3737 type = CPP_STRING;
3740 if ((translate ? cpp_interpret_string : cpp_interpret_string_notranslate)
3741 (parse_in, strs, count, &istr, type))
3743 value = build_string (istr.len, (const char *)istr.text);
3744 free (CONST_CAST (unsigned char *, istr.text));
3746 switch (type)
3748 default:
3749 case CPP_STRING:
3750 case CPP_UTF8STRING:
3751 TREE_TYPE (value) = char_array_type_node;
3752 break;
3753 case CPP_STRING16:
3754 TREE_TYPE (value) = char16_array_type_node;
3755 break;
3756 case CPP_STRING32:
3757 TREE_TYPE (value) = char32_array_type_node;
3758 break;
3759 case CPP_WSTRING:
3760 TREE_TYPE (value) = wchar_array_type_node;
3761 break;
3764 value = fix_string_type (value);
3766 if (have_suffix_p)
3768 tree literal = build_userdef_literal (suffix_id, value,
3769 OT_NONE, NULL_TREE);
3770 if (lookup_udlit)
3771 value = cp_parser_userdef_string_literal (literal);
3772 else
3773 value = literal;
3776 else
3777 /* cpp_interpret_string has issued an error. */
3778 value = error_mark_node;
3780 if (count > 1)
3781 obstack_free (&str_ob, 0);
3783 return value;
3786 /* Look up a literal operator with the name and the exact arguments. */
3788 static tree
3789 lookup_literal_operator (tree name, vec<tree, va_gc> *args)
3791 tree decl, fns;
3792 decl = lookup_name (name);
3793 if (!decl || !is_overloaded_fn (decl))
3794 return error_mark_node;
3796 for (fns = decl; fns; fns = OVL_NEXT (fns))
3798 unsigned int ix;
3799 bool found = true;
3800 tree fn = OVL_CURRENT (fns);
3801 tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (fn));
3802 if (parmtypes != NULL_TREE)
3804 for (ix = 0; ix < vec_safe_length (args) && parmtypes != NULL_TREE;
3805 ++ix, parmtypes = TREE_CHAIN (parmtypes))
3807 tree tparm = TREE_VALUE (parmtypes);
3808 tree targ = TREE_TYPE ((*args)[ix]);
3809 bool ptr = TYPE_PTR_P (tparm);
3810 bool arr = TREE_CODE (targ) == ARRAY_TYPE;
3811 if ((ptr || arr || !same_type_p (tparm, targ))
3812 && (!ptr || !arr
3813 || !same_type_p (TREE_TYPE (tparm),
3814 TREE_TYPE (targ))))
3815 found = false;
3817 if (found
3818 && ix == vec_safe_length (args)
3819 /* May be this should be sufficient_parms_p instead,
3820 depending on how exactly should user-defined literals
3821 work in presence of default arguments on the literal
3822 operator parameters. */
3823 && parmtypes == void_list_node)
3824 return fn;
3828 return error_mark_node;
3831 /* Parse a user-defined char constant. Returns a call to a user-defined
3832 literal operator taking the character as an argument. */
3834 static tree
3835 cp_parser_userdef_char_literal (cp_parser *parser)
3837 cp_token *token = cp_lexer_consume_token (parser->lexer);
3838 tree literal = token->u.value;
3839 tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
3840 tree value = USERDEF_LITERAL_VALUE (literal);
3841 tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
3842 tree decl, result;
3844 /* Build up a call to the user-defined operator */
3845 /* Lookup the name we got back from the id-expression. */
3846 vec<tree, va_gc> *args = make_tree_vector ();
3847 vec_safe_push (args, value);
3848 decl = lookup_literal_operator (name, args);
3849 if (!decl || decl == error_mark_node)
3851 error ("unable to find character literal operator %qD with %qT argument",
3852 name, TREE_TYPE (value));
3853 release_tree_vector (args);
3854 return error_mark_node;
3856 result = finish_call_expr (decl, &args, false, true, tf_warning_or_error);
3857 release_tree_vector (args);
3858 if (result != error_mark_node)
3859 return result;
3861 error ("unable to find character literal operator %qD with %qT argument",
3862 name, TREE_TYPE (value));
3863 return error_mark_node;
3866 /* A subroutine of cp_parser_userdef_numeric_literal to
3867 create a char... template parameter pack from a string node. */
3869 static tree
3870 make_char_string_pack (tree value)
3872 tree charvec;
3873 tree argpack = make_node (NONTYPE_ARGUMENT_PACK);
3874 const char *str = TREE_STRING_POINTER (value);
3875 int i, len = TREE_STRING_LENGTH (value) - 1;
3876 tree argvec = make_tree_vec (1);
3878 /* Fill in CHARVEC with all of the parameters. */
3879 charvec = make_tree_vec (len);
3880 for (i = 0; i < len; ++i)
3881 TREE_VEC_ELT (charvec, i) = build_int_cst (char_type_node, str[i]);
3883 /* Build the argument packs. */
3884 SET_ARGUMENT_PACK_ARGS (argpack, charvec);
3885 TREE_TYPE (argpack) = char_type_node;
3887 TREE_VEC_ELT (argvec, 0) = argpack;
3889 return argvec;
3892 /* A subroutine of cp_parser_userdef_numeric_literal to
3893 create a char... template parameter pack from a string node. */
3895 static tree
3896 make_string_pack (tree value)
3898 tree charvec;
3899 tree argpack = make_node (NONTYPE_ARGUMENT_PACK);
3900 const unsigned char *str
3901 = (const unsigned char *) TREE_STRING_POINTER (value);
3902 int sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (value))));
3903 int len = TREE_STRING_LENGTH (value) / sz - 1;
3904 tree argvec = make_tree_vec (2);
3906 tree str_char_type_node = TREE_TYPE (TREE_TYPE (value));
3907 str_char_type_node = TYPE_MAIN_VARIANT (str_char_type_node);
3909 /* First template parm is character type. */
3910 TREE_VEC_ELT (argvec, 0) = str_char_type_node;
3912 /* Fill in CHARVEC with all of the parameters. */
3913 charvec = make_tree_vec (len);
3914 for (int i = 0; i < len; ++i)
3915 TREE_VEC_ELT (charvec, i)
3916 = double_int_to_tree (str_char_type_node,
3917 double_int::from_buffer (str + i * sz, sz));
3919 /* Build the argument packs. */
3920 SET_ARGUMENT_PACK_ARGS (argpack, charvec);
3921 TREE_TYPE (argpack) = str_char_type_node;
3923 TREE_VEC_ELT (argvec, 1) = argpack;
3925 return argvec;
3928 /* Parse a user-defined numeric constant. returns a call to a user-defined
3929 literal operator. */
3931 static tree
3932 cp_parser_userdef_numeric_literal (cp_parser *parser)
3934 cp_token *token = cp_lexer_consume_token (parser->lexer);
3935 tree literal = token->u.value;
3936 tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
3937 tree value = USERDEF_LITERAL_VALUE (literal);
3938 int overflow = USERDEF_LITERAL_OVERFLOW (literal);
3939 tree num_string = USERDEF_LITERAL_NUM_STRING (literal);
3940 tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
3941 tree decl, result;
3942 vec<tree, va_gc> *args;
3944 /* Look for a literal operator taking the exact type of numeric argument
3945 as the literal value. */
3946 args = make_tree_vector ();
3947 vec_safe_push (args, value);
3948 decl = lookup_literal_operator (name, args);
3949 if (decl && decl != error_mark_node)
3951 result = finish_call_expr (decl, &args, false, true, tf_none);
3952 if (result != error_mark_node)
3954 if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE && overflow > 0)
3955 warning_at (token->location, OPT_Woverflow,
3956 "integer literal exceeds range of %qT type",
3957 long_long_unsigned_type_node);
3958 else
3960 if (overflow > 0)
3961 warning_at (token->location, OPT_Woverflow,
3962 "floating literal exceeds range of %qT type",
3963 long_double_type_node);
3964 else if (overflow < 0)
3965 warning_at (token->location, OPT_Woverflow,
3966 "floating literal truncated to zero");
3968 release_tree_vector (args);
3969 return result;
3972 release_tree_vector (args);
3974 /* If the numeric argument didn't work, look for a raw literal
3975 operator taking a const char* argument consisting of the number
3976 in string format. */
3977 args = make_tree_vector ();
3978 vec_safe_push (args, num_string);
3979 decl = lookup_literal_operator (name, args);
3980 if (decl && decl != error_mark_node)
3982 result = finish_call_expr (decl, &args, false, true, tf_none);
3983 if (result != error_mark_node)
3985 release_tree_vector (args);
3986 return result;
3989 release_tree_vector (args);
3991 /* If the raw literal didn't work, look for a non-type template
3992 function with parameter pack char.... Call the function with
3993 template parameter characters representing the number. */
3994 args = make_tree_vector ();
3995 decl = lookup_literal_operator (name, args);
3996 if (decl && decl != error_mark_node)
3998 tree tmpl_args = make_char_string_pack (num_string);
3999 decl = lookup_template_function (decl, tmpl_args);
4000 result = finish_call_expr (decl, &args, false, true, tf_none);
4001 if (result != error_mark_node)
4003 release_tree_vector (args);
4004 return result;
4007 release_tree_vector (args);
4009 error ("unable to find numeric literal operator %qD", name);
4010 if (!cpp_get_options (parse_in)->ext_numeric_literals)
4011 inform (token->location, "use -std=gnu++11 or -fext-numeric-literals "
4012 "to enable more built-in suffixes");
4013 return error_mark_node;
4016 /* Parse a user-defined string constant. Returns a call to a user-defined
4017 literal operator taking a character pointer and the length of the string
4018 as arguments. */
4020 static tree
4021 cp_parser_userdef_string_literal (tree literal)
4023 tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
4024 tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
4025 tree value = USERDEF_LITERAL_VALUE (literal);
4026 int len = TREE_STRING_LENGTH (value)
4027 / TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (value)))) - 1;
4028 tree decl, result;
4029 vec<tree, va_gc> *args;
4031 /* Look for a template function with typename parameter CharT
4032 and parameter pack CharT... Call the function with
4033 template parameter characters representing the string. */
4034 args = make_tree_vector ();
4035 decl = lookup_literal_operator (name, args);
4036 if (decl && decl != error_mark_node)
4038 tree tmpl_args = make_string_pack (value);
4039 decl = lookup_template_function (decl, tmpl_args);
4040 result = finish_call_expr (decl, &args, false, true, tf_none);
4041 if (result != error_mark_node)
4043 release_tree_vector (args);
4044 return result;
4047 release_tree_vector (args);
4049 /* Build up a call to the user-defined operator */
4050 /* Lookup the name we got back from the id-expression. */
4051 args = make_tree_vector ();
4052 vec_safe_push (args, value);
4053 vec_safe_push (args, build_int_cst (size_type_node, len));
4054 decl = lookup_name (name);
4055 if (!decl || decl == error_mark_node)
4057 error ("unable to find string literal operator %qD", name);
4058 release_tree_vector (args);
4059 return error_mark_node;
4061 result = finish_call_expr (decl, &args, false, true, tf_none);
4062 release_tree_vector (args);
4063 if (result != error_mark_node)
4064 return result;
4066 error ("unable to find string literal operator %qD with %qT, %qT arguments",
4067 name, TREE_TYPE (value), size_type_node);
4068 return error_mark_node;
4072 /* Basic concepts [gram.basic] */
4074 /* Parse a translation-unit.
4076 translation-unit:
4077 declaration-seq [opt]
4079 Returns TRUE if all went well. */
4081 static bool
4082 cp_parser_translation_unit (cp_parser* parser)
4084 /* The address of the first non-permanent object on the declarator
4085 obstack. */
4086 static void *declarator_obstack_base;
4088 bool success;
4090 /* Create the declarator obstack, if necessary. */
4091 if (!cp_error_declarator)
4093 gcc_obstack_init (&declarator_obstack);
4094 /* Create the error declarator. */
4095 cp_error_declarator = make_declarator (cdk_error);
4096 /* Create the empty parameter list. */
4097 no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE);
4098 /* Remember where the base of the declarator obstack lies. */
4099 declarator_obstack_base = obstack_next_free (&declarator_obstack);
4102 cp_parser_declaration_seq_opt (parser);
4104 /* If there are no tokens left then all went well. */
4105 if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
4107 /* Get rid of the token array; we don't need it any more. */
4108 cp_lexer_destroy (parser->lexer);
4109 parser->lexer = NULL;
4111 /* This file might have been a context that's implicitly extern
4112 "C". If so, pop the lang context. (Only relevant for PCH.) */
4113 if (parser->implicit_extern_c)
4115 pop_lang_context ();
4116 parser->implicit_extern_c = false;
4119 /* Finish up. */
4120 finish_translation_unit ();
4122 success = true;
4124 else
4126 cp_parser_error (parser, "expected declaration");
4127 success = false;
4130 /* Make sure the declarator obstack was fully cleaned up. */
4131 gcc_assert (obstack_next_free (&declarator_obstack)
4132 == declarator_obstack_base);
4134 /* All went well. */
4135 return success;
4138 /* Return the appropriate tsubst flags for parsing, possibly in N3276
4139 decltype context. */
4141 static inline tsubst_flags_t
4142 complain_flags (bool decltype_p)
4144 tsubst_flags_t complain = tf_warning_or_error;
4145 if (decltype_p)
4146 complain |= tf_decltype;
4147 return complain;
4150 /* We're about to parse a collection of statements. If we're currently
4151 parsing tentatively, set up a firewall so that any nested
4152 cp_parser_commit_to_tentative_parse won't affect the current context. */
4154 static cp_token_position
4155 cp_parser_start_tentative_firewall (cp_parser *parser)
4157 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
4158 return 0;
4160 cp_parser_parse_tentatively (parser);
4161 cp_parser_commit_to_topmost_tentative_parse (parser);
4162 return cp_lexer_token_position (parser->lexer, false);
4165 /* We've finished parsing the collection of statements. Wrap up the
4166 firewall and replace the relevant tokens with the parsed form. */
4168 static void
4169 cp_parser_end_tentative_firewall (cp_parser *parser, cp_token_position start,
4170 tree expr)
4172 if (!start)
4173 return;
4175 /* Finish the firewall level. */
4176 cp_parser_parse_definitely (parser);
4177 /* And remember the result of the parse for when we try again. */
4178 cp_token *token = cp_lexer_token_at (parser->lexer, start);
4179 token->type = CPP_PREPARSED_EXPR;
4180 token->u.value = expr;
4181 token->keyword = RID_MAX;
4182 cp_lexer_purge_tokens_after (parser->lexer, start);
4185 /* Parse a GNU statement-expression, i.e. ({ stmts }), except for the
4186 enclosing parentheses. */
4188 static tree
4189 cp_parser_statement_expr (cp_parser *parser)
4191 cp_token_position start = cp_parser_start_tentative_firewall (parser);
4193 /* Consume the '('. */
4194 cp_lexer_consume_token (parser->lexer);
4195 /* Start the statement-expression. */
4196 tree expr = begin_stmt_expr ();
4197 /* Parse the compound-statement. */
4198 cp_parser_compound_statement (parser, expr, false, false);
4199 /* Finish up. */
4200 expr = finish_stmt_expr (expr, false);
4201 /* Consume the ')'. */
4202 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
4203 cp_parser_skip_to_end_of_statement (parser);
4205 cp_parser_end_tentative_firewall (parser, start, expr);
4206 return expr;
4209 /* Expressions [gram.expr] */
4211 /* Parse a primary-expression.
4213 primary-expression:
4214 literal
4215 this
4216 ( expression )
4217 id-expression
4218 lambda-expression (C++11)
4220 GNU Extensions:
4222 primary-expression:
4223 ( compound-statement )
4224 __builtin_va_arg ( assignment-expression , type-id )
4225 __builtin_offsetof ( type-id , offsetof-expression )
4227 C++ Extensions:
4228 __has_nothrow_assign ( type-id )
4229 __has_nothrow_constructor ( type-id )
4230 __has_nothrow_copy ( type-id )
4231 __has_trivial_assign ( type-id )
4232 __has_trivial_constructor ( type-id )
4233 __has_trivial_copy ( type-id )
4234 __has_trivial_destructor ( type-id )
4235 __has_virtual_destructor ( type-id )
4236 __is_abstract ( type-id )
4237 __is_base_of ( type-id , type-id )
4238 __is_class ( type-id )
4239 __is_empty ( type-id )
4240 __is_enum ( type-id )
4241 __is_final ( type-id )
4242 __is_literal_type ( type-id )
4243 __is_pod ( type-id )
4244 __is_polymorphic ( type-id )
4245 __is_std_layout ( type-id )
4246 __is_trivial ( type-id )
4247 __is_union ( type-id )
4249 Objective-C++ Extension:
4251 primary-expression:
4252 objc-expression
4254 literal:
4255 __null
4257 ADDRESS_P is true iff this expression was immediately preceded by
4258 "&" and therefore might denote a pointer-to-member. CAST_P is true
4259 iff this expression is the target of a cast. TEMPLATE_ARG_P is
4260 true iff this expression is a template argument.
4262 Returns a representation of the expression. Upon return, *IDK
4263 indicates what kind of id-expression (if any) was present. */
4265 static tree
4266 cp_parser_primary_expression (cp_parser *parser,
4267 bool address_p,
4268 bool cast_p,
4269 bool template_arg_p,
4270 bool decltype_p,
4271 cp_id_kind *idk)
4273 cp_token *token = NULL;
4275 /* Assume the primary expression is not an id-expression. */
4276 *idk = CP_ID_KIND_NONE;
4278 /* Peek at the next token. */
4279 token = cp_lexer_peek_token (parser->lexer);
4280 switch ((int) token->type)
4282 /* literal:
4283 integer-literal
4284 character-literal
4285 floating-literal
4286 string-literal
4287 boolean-literal
4288 pointer-literal
4289 user-defined-literal */
4290 case CPP_CHAR:
4291 case CPP_CHAR16:
4292 case CPP_CHAR32:
4293 case CPP_WCHAR:
4294 case CPP_NUMBER:
4295 case CPP_PREPARSED_EXPR:
4296 if (TREE_CODE (token->u.value) == USERDEF_LITERAL)
4297 return cp_parser_userdef_numeric_literal (parser);
4298 token = cp_lexer_consume_token (parser->lexer);
4299 if (TREE_CODE (token->u.value) == FIXED_CST)
4301 error_at (token->location,
4302 "fixed-point types not supported in C++");
4303 return error_mark_node;
4305 /* Floating-point literals are only allowed in an integral
4306 constant expression if they are cast to an integral or
4307 enumeration type. */
4308 if (TREE_CODE (token->u.value) == REAL_CST
4309 && parser->integral_constant_expression_p
4310 && pedantic)
4312 /* CAST_P will be set even in invalid code like "int(2.7 +
4313 ...)". Therefore, we have to check that the next token
4314 is sure to end the cast. */
4315 if (cast_p)
4317 cp_token *next_token;
4319 next_token = cp_lexer_peek_token (parser->lexer);
4320 if (/* The comma at the end of an
4321 enumerator-definition. */
4322 next_token->type != CPP_COMMA
4323 /* The curly brace at the end of an enum-specifier. */
4324 && next_token->type != CPP_CLOSE_BRACE
4325 /* The end of a statement. */
4326 && next_token->type != CPP_SEMICOLON
4327 /* The end of the cast-expression. */
4328 && next_token->type != CPP_CLOSE_PAREN
4329 /* The end of an array bound. */
4330 && next_token->type != CPP_CLOSE_SQUARE
4331 /* The closing ">" in a template-argument-list. */
4332 && (next_token->type != CPP_GREATER
4333 || parser->greater_than_is_operator_p)
4334 /* C++0x only: A ">>" treated like two ">" tokens,
4335 in a template-argument-list. */
4336 && (next_token->type != CPP_RSHIFT
4337 || (cxx_dialect == cxx98)
4338 || parser->greater_than_is_operator_p))
4339 cast_p = false;
4342 /* If we are within a cast, then the constraint that the
4343 cast is to an integral or enumeration type will be
4344 checked at that point. If we are not within a cast, then
4345 this code is invalid. */
4346 if (!cast_p)
4347 cp_parser_non_integral_constant_expression (parser, NIC_FLOAT);
4349 return token->u.value;
4351 case CPP_CHAR_USERDEF:
4352 case CPP_CHAR16_USERDEF:
4353 case CPP_CHAR32_USERDEF:
4354 case CPP_WCHAR_USERDEF:
4355 return cp_parser_userdef_char_literal (parser);
4357 case CPP_STRING:
4358 case CPP_STRING16:
4359 case CPP_STRING32:
4360 case CPP_WSTRING:
4361 case CPP_UTF8STRING:
4362 case CPP_STRING_USERDEF:
4363 case CPP_STRING16_USERDEF:
4364 case CPP_STRING32_USERDEF:
4365 case CPP_WSTRING_USERDEF:
4366 case CPP_UTF8STRING_USERDEF:
4367 /* ??? Should wide strings be allowed when parser->translate_strings_p
4368 is false (i.e. in attributes)? If not, we can kill the third
4369 argument to cp_parser_string_literal. */
4370 return cp_parser_string_literal (parser,
4371 parser->translate_strings_p,
4372 true);
4374 case CPP_OPEN_PAREN:
4375 /* If we see `( { ' then we are looking at the beginning of
4376 a GNU statement-expression. */
4377 if (cp_parser_allow_gnu_extensions_p (parser)
4378 && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_BRACE))
4380 /* Statement-expressions are not allowed by the standard. */
4381 pedwarn (token->location, OPT_Wpedantic,
4382 "ISO C++ forbids braced-groups within expressions");
4384 /* And they're not allowed outside of a function-body; you
4385 cannot, for example, write:
4387 int i = ({ int j = 3; j + 1; });
4389 at class or namespace scope. */
4390 if (!parser->in_function_body
4391 || parser->in_template_argument_list_p)
4393 error_at (token->location,
4394 "statement-expressions are not allowed outside "
4395 "functions nor in template-argument lists");
4396 cp_parser_skip_to_end_of_block_or_statement (parser);
4397 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
4398 cp_lexer_consume_token (parser->lexer);
4399 return error_mark_node;
4401 else
4402 return cp_parser_statement_expr (parser);
4404 /* Otherwise it's a normal parenthesized expression. */
4406 tree expr;
4407 bool saved_greater_than_is_operator_p;
4409 /* Consume the `('. */
4410 cp_lexer_consume_token (parser->lexer);
4411 /* Within a parenthesized expression, a `>' token is always
4412 the greater-than operator. */
4413 saved_greater_than_is_operator_p
4414 = parser->greater_than_is_operator_p;
4415 parser->greater_than_is_operator_p = true;
4417 /* Parse the parenthesized expression. */
4418 expr = cp_parser_expression (parser, idk, cast_p, decltype_p);
4419 /* Let the front end know that this expression was
4420 enclosed in parentheses. This matters in case, for
4421 example, the expression is of the form `A::B', since
4422 `&A::B' might be a pointer-to-member, but `&(A::B)' is
4423 not. */
4424 expr = finish_parenthesized_expr (expr);
4425 /* DR 705: Wrapping an unqualified name in parentheses
4426 suppresses arg-dependent lookup. We want to pass back
4427 CP_ID_KIND_QUALIFIED for suppressing vtable lookup
4428 (c++/37862), but none of the others. */
4429 if (*idk != CP_ID_KIND_QUALIFIED)
4430 *idk = CP_ID_KIND_NONE;
4432 /* The `>' token might be the end of a template-id or
4433 template-parameter-list now. */
4434 parser->greater_than_is_operator_p
4435 = saved_greater_than_is_operator_p;
4436 /* Consume the `)'. */
4437 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
4438 cp_parser_skip_to_end_of_statement (parser);
4440 return expr;
4443 case CPP_OPEN_SQUARE:
4444 if (c_dialect_objc ())
4445 /* We have an Objective-C++ message. */
4446 return cp_parser_objc_expression (parser);
4448 tree lam = cp_parser_lambda_expression (parser);
4449 /* Don't warn about a failed tentative parse. */
4450 if (cp_parser_error_occurred (parser))
4451 return error_mark_node;
4452 maybe_warn_cpp0x (CPP0X_LAMBDA_EXPR);
4453 return lam;
4456 case CPP_OBJC_STRING:
4457 if (c_dialect_objc ())
4458 /* We have an Objective-C++ string literal. */
4459 return cp_parser_objc_expression (parser);
4460 cp_parser_error (parser, "expected primary-expression");
4461 return error_mark_node;
4463 case CPP_KEYWORD:
4464 switch (token->keyword)
4466 /* These two are the boolean literals. */
4467 case RID_TRUE:
4468 cp_lexer_consume_token (parser->lexer);
4469 return boolean_true_node;
4470 case RID_FALSE:
4471 cp_lexer_consume_token (parser->lexer);
4472 return boolean_false_node;
4474 /* The `__null' literal. */
4475 case RID_NULL:
4476 cp_lexer_consume_token (parser->lexer);
4477 return null_node;
4479 /* The `nullptr' literal. */
4480 case RID_NULLPTR:
4481 cp_lexer_consume_token (parser->lexer);
4482 return nullptr_node;
4484 /* Recognize the `this' keyword. */
4485 case RID_THIS:
4486 cp_lexer_consume_token (parser->lexer);
4487 if (parser->local_variables_forbidden_p)
4489 error_at (token->location,
4490 "%<this%> may not be used in this context");
4491 return error_mark_node;
4493 /* Pointers cannot appear in constant-expressions. */
4494 if (cp_parser_non_integral_constant_expression (parser, NIC_THIS))
4495 return error_mark_node;
4496 return finish_this_expr ();
4498 /* The `operator' keyword can be the beginning of an
4499 id-expression. */
4500 case RID_OPERATOR:
4501 goto id_expression;
4503 case RID_FUNCTION_NAME:
4504 case RID_PRETTY_FUNCTION_NAME:
4505 case RID_C99_FUNCTION_NAME:
4507 non_integral_constant name;
4509 /* The symbols __FUNCTION__, __PRETTY_FUNCTION__, and
4510 __func__ are the names of variables -- but they are
4511 treated specially. Therefore, they are handled here,
4512 rather than relying on the generic id-expression logic
4513 below. Grammatically, these names are id-expressions.
4515 Consume the token. */
4516 token = cp_lexer_consume_token (parser->lexer);
4518 switch (token->keyword)
4520 case RID_FUNCTION_NAME:
4521 name = NIC_FUNC_NAME;
4522 break;
4523 case RID_PRETTY_FUNCTION_NAME:
4524 name = NIC_PRETTY_FUNC;
4525 break;
4526 case RID_C99_FUNCTION_NAME:
4527 name = NIC_C99_FUNC;
4528 break;
4529 default:
4530 gcc_unreachable ();
4533 if (cp_parser_non_integral_constant_expression (parser, name))
4534 return error_mark_node;
4536 /* Look up the name. */
4537 return finish_fname (token->u.value);
4540 case RID_VA_ARG:
4542 tree expression;
4543 tree type;
4544 source_location type_location;
4546 /* The `__builtin_va_arg' construct is used to handle
4547 `va_arg'. Consume the `__builtin_va_arg' token. */
4548 cp_lexer_consume_token (parser->lexer);
4549 /* Look for the opening `('. */
4550 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
4551 /* Now, parse the assignment-expression. */
4552 expression = cp_parser_assignment_expression (parser);
4553 /* Look for the `,'. */
4554 cp_parser_require (parser, CPP_COMMA, RT_COMMA);
4555 type_location = cp_lexer_peek_token (parser->lexer)->location;
4556 /* Parse the type-id. */
4557 type = cp_parser_type_id (parser);
4558 /* Look for the closing `)'. */
4559 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4560 /* Using `va_arg' in a constant-expression is not
4561 allowed. */
4562 if (cp_parser_non_integral_constant_expression (parser,
4563 NIC_VA_ARG))
4564 return error_mark_node;
4565 return build_x_va_arg (type_location, expression, type);
4568 case RID_OFFSETOF:
4569 return cp_parser_builtin_offsetof (parser);
4571 case RID_HAS_NOTHROW_ASSIGN:
4572 case RID_HAS_NOTHROW_CONSTRUCTOR:
4573 case RID_HAS_NOTHROW_COPY:
4574 case RID_HAS_TRIVIAL_ASSIGN:
4575 case RID_HAS_TRIVIAL_CONSTRUCTOR:
4576 case RID_HAS_TRIVIAL_COPY:
4577 case RID_HAS_TRIVIAL_DESTRUCTOR:
4578 case RID_HAS_VIRTUAL_DESTRUCTOR:
4579 case RID_IS_ABSTRACT:
4580 case RID_IS_BASE_OF:
4581 case RID_IS_CLASS:
4582 case RID_IS_EMPTY:
4583 case RID_IS_ENUM:
4584 case RID_IS_FINAL:
4585 case RID_IS_LITERAL_TYPE:
4586 case RID_IS_POD:
4587 case RID_IS_POLYMORPHIC:
4588 case RID_IS_STD_LAYOUT:
4589 case RID_IS_TRIVIAL:
4590 case RID_IS_TRIVIALLY_ASSIGNABLE:
4591 case RID_IS_TRIVIALLY_CONSTRUCTIBLE:
4592 case RID_IS_TRIVIALLY_COPYABLE:
4593 case RID_IS_UNION:
4594 return cp_parser_trait_expr (parser, token->keyword);
4596 /* Objective-C++ expressions. */
4597 case RID_AT_ENCODE:
4598 case RID_AT_PROTOCOL:
4599 case RID_AT_SELECTOR:
4600 return cp_parser_objc_expression (parser);
4602 case RID_TEMPLATE:
4603 if (parser->in_function_body
4604 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
4605 == CPP_LESS))
4607 error_at (token->location,
4608 "a template declaration cannot appear at block scope");
4609 cp_parser_skip_to_end_of_block_or_statement (parser);
4610 return error_mark_node;
4612 default:
4613 cp_parser_error (parser, "expected primary-expression");
4614 return error_mark_node;
4617 /* An id-expression can start with either an identifier, a
4618 `::' as the beginning of a qualified-id, or the "operator"
4619 keyword. */
4620 case CPP_NAME:
4621 case CPP_SCOPE:
4622 case CPP_TEMPLATE_ID:
4623 case CPP_NESTED_NAME_SPECIFIER:
4625 tree id_expression;
4626 tree decl;
4627 const char *error_msg;
4628 bool template_p;
4629 bool done;
4630 cp_token *id_expr_token;
4632 id_expression:
4633 /* Parse the id-expression. */
4634 id_expression
4635 = cp_parser_id_expression (parser,
4636 /*template_keyword_p=*/false,
4637 /*check_dependency_p=*/true,
4638 &template_p,
4639 /*declarator_p=*/false,
4640 /*optional_p=*/false);
4641 if (id_expression == error_mark_node)
4642 return error_mark_node;
4643 id_expr_token = token;
4644 token = cp_lexer_peek_token (parser->lexer);
4645 done = (token->type != CPP_OPEN_SQUARE
4646 && token->type != CPP_OPEN_PAREN
4647 && token->type != CPP_DOT
4648 && token->type != CPP_DEREF
4649 && token->type != CPP_PLUS_PLUS
4650 && token->type != CPP_MINUS_MINUS);
4651 /* If we have a template-id, then no further lookup is
4652 required. If the template-id was for a template-class, we
4653 will sometimes have a TYPE_DECL at this point. */
4654 if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR
4655 || TREE_CODE (id_expression) == TYPE_DECL)
4656 decl = id_expression;
4657 /* Look up the name. */
4658 else
4660 tree ambiguous_decls;
4662 /* If we already know that this lookup is ambiguous, then
4663 we've already issued an error message; there's no reason
4664 to check again. */
4665 if (id_expr_token->type == CPP_NAME
4666 && id_expr_token->error_reported)
4668 cp_parser_simulate_error (parser);
4669 return error_mark_node;
4672 decl = cp_parser_lookup_name (parser, id_expression,
4673 none_type,
4674 template_p,
4675 /*is_namespace=*/false,
4676 /*check_dependency=*/true,
4677 &ambiguous_decls,
4678 id_expr_token->location);
4679 /* If the lookup was ambiguous, an error will already have
4680 been issued. */
4681 if (ambiguous_decls)
4682 return error_mark_node;
4684 /* In Objective-C++, we may have an Objective-C 2.0
4685 dot-syntax for classes here. */
4686 if (c_dialect_objc ()
4687 && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT
4688 && TREE_CODE (decl) == TYPE_DECL
4689 && objc_is_class_name (decl))
4691 tree component;
4692 cp_lexer_consume_token (parser->lexer);
4693 component = cp_parser_identifier (parser);
4694 if (component == error_mark_node)
4695 return error_mark_node;
4697 return objc_build_class_component_ref (id_expression, component);
4700 /* In Objective-C++, an instance variable (ivar) may be preferred
4701 to whatever cp_parser_lookup_name() found. */
4702 decl = objc_lookup_ivar (decl, id_expression);
4704 /* If name lookup gives us a SCOPE_REF, then the
4705 qualifying scope was dependent. */
4706 if (TREE_CODE (decl) == SCOPE_REF)
4708 /* At this point, we do not know if DECL is a valid
4709 integral constant expression. We assume that it is
4710 in fact such an expression, so that code like:
4712 template <int N> struct A {
4713 int a[B<N>::i];
4716 is accepted. At template-instantiation time, we
4717 will check that B<N>::i is actually a constant. */
4718 return decl;
4720 /* Check to see if DECL is a local variable in a context
4721 where that is forbidden. */
4722 if (parser->local_variables_forbidden_p
4723 && local_variable_p (decl))
4725 /* It might be that we only found DECL because we are
4726 trying to be generous with pre-ISO scoping rules.
4727 For example, consider:
4729 int i;
4730 void g() {
4731 for (int i = 0; i < 10; ++i) {}
4732 extern void f(int j = i);
4735 Here, name look up will originally find the out
4736 of scope `i'. We need to issue a warning message,
4737 but then use the global `i'. */
4738 decl = check_for_out_of_scope_variable (decl);
4739 if (local_variable_p (decl))
4741 error_at (id_expr_token->location,
4742 "local variable %qD may not appear in this context",
4743 decl);
4744 return error_mark_node;
4749 decl = (finish_id_expression
4750 (id_expression, decl, parser->scope,
4751 idk,
4752 parser->integral_constant_expression_p,
4753 parser->allow_non_integral_constant_expression_p,
4754 &parser->non_integral_constant_expression_p,
4755 template_p, done, address_p,
4756 template_arg_p,
4757 &error_msg,
4758 id_expr_token->location));
4759 if (error_msg)
4760 cp_parser_error (parser, error_msg);
4761 return decl;
4764 /* Anything else is an error. */
4765 default:
4766 cp_parser_error (parser, "expected primary-expression");
4767 return error_mark_node;
4771 static inline tree
4772 cp_parser_primary_expression (cp_parser *parser,
4773 bool address_p,
4774 bool cast_p,
4775 bool template_arg_p,
4776 cp_id_kind *idk)
4778 return cp_parser_primary_expression (parser, address_p, cast_p, template_arg_p,
4779 /*decltype*/false, idk);
4782 /* Parse an id-expression.
4784 id-expression:
4785 unqualified-id
4786 qualified-id
4788 qualified-id:
4789 :: [opt] nested-name-specifier template [opt] unqualified-id
4790 :: identifier
4791 :: operator-function-id
4792 :: template-id
4794 Return a representation of the unqualified portion of the
4795 identifier. Sets PARSER->SCOPE to the qualifying scope if there is
4796 a `::' or nested-name-specifier.
4798 Often, if the id-expression was a qualified-id, the caller will
4799 want to make a SCOPE_REF to represent the qualified-id. This
4800 function does not do this in order to avoid wastefully creating
4801 SCOPE_REFs when they are not required.
4803 If TEMPLATE_KEYWORD_P is true, then we have just seen the
4804 `template' keyword.
4806 If CHECK_DEPENDENCY_P is false, then names are looked up inside
4807 uninstantiated templates.
4809 If *TEMPLATE_P is non-NULL, it is set to true iff the
4810 `template' keyword is used to explicitly indicate that the entity
4811 named is a template.
4813 If DECLARATOR_P is true, the id-expression is appearing as part of
4814 a declarator, rather than as part of an expression. */
4816 static tree
4817 cp_parser_id_expression (cp_parser *parser,
4818 bool template_keyword_p,
4819 bool check_dependency_p,
4820 bool *template_p,
4821 bool declarator_p,
4822 bool optional_p)
4824 bool global_scope_p;
4825 bool nested_name_specifier_p;
4827 /* Assume the `template' keyword was not used. */
4828 if (template_p)
4829 *template_p = template_keyword_p;
4831 /* Look for the optional `::' operator. */
4832 global_scope_p
4833 = (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false)
4834 != NULL_TREE);
4835 /* Look for the optional nested-name-specifier. */
4836 nested_name_specifier_p
4837 = (cp_parser_nested_name_specifier_opt (parser,
4838 /*typename_keyword_p=*/false,
4839 check_dependency_p,
4840 /*type_p=*/false,
4841 declarator_p)
4842 != NULL_TREE);
4843 /* If there is a nested-name-specifier, then we are looking at
4844 the first qualified-id production. */
4845 if (nested_name_specifier_p)
4847 tree saved_scope;
4848 tree saved_object_scope;
4849 tree saved_qualifying_scope;
4850 tree unqualified_id;
4851 bool is_template;
4853 /* See if the next token is the `template' keyword. */
4854 if (!template_p)
4855 template_p = &is_template;
4856 *template_p = cp_parser_optional_template_keyword (parser);
4857 /* Name lookup we do during the processing of the
4858 unqualified-id might obliterate SCOPE. */
4859 saved_scope = parser->scope;
4860 saved_object_scope = parser->object_scope;
4861 saved_qualifying_scope = parser->qualifying_scope;
4862 /* Process the final unqualified-id. */
4863 unqualified_id = cp_parser_unqualified_id (parser, *template_p,
4864 check_dependency_p,
4865 declarator_p,
4866 /*optional_p=*/false);
4867 /* Restore the SAVED_SCOPE for our caller. */
4868 parser->scope = saved_scope;
4869 parser->object_scope = saved_object_scope;
4870 parser->qualifying_scope = saved_qualifying_scope;
4872 return unqualified_id;
4874 /* Otherwise, if we are in global scope, then we are looking at one
4875 of the other qualified-id productions. */
4876 else if (global_scope_p)
4878 cp_token *token;
4879 tree id;
4881 /* Peek at the next token. */
4882 token = cp_lexer_peek_token (parser->lexer);
4884 /* If it's an identifier, and the next token is not a "<", then
4885 we can avoid the template-id case. This is an optimization
4886 for this common case. */
4887 if (token->type == CPP_NAME
4888 && !cp_parser_nth_token_starts_template_argument_list_p
4889 (parser, 2))
4890 return cp_parser_identifier (parser);
4892 cp_parser_parse_tentatively (parser);
4893 /* Try a template-id. */
4894 id = cp_parser_template_id (parser,
4895 /*template_keyword_p=*/false,
4896 /*check_dependency_p=*/true,
4897 none_type,
4898 declarator_p);
4899 /* If that worked, we're done. */
4900 if (cp_parser_parse_definitely (parser))
4901 return id;
4903 /* Peek at the next token. (Changes in the token buffer may
4904 have invalidated the pointer obtained above.) */
4905 token = cp_lexer_peek_token (parser->lexer);
4907 switch (token->type)
4909 case CPP_NAME:
4910 return cp_parser_identifier (parser);
4912 case CPP_KEYWORD:
4913 if (token->keyword == RID_OPERATOR)
4914 return cp_parser_operator_function_id (parser);
4915 /* Fall through. */
4917 default:
4918 cp_parser_error (parser, "expected id-expression");
4919 return error_mark_node;
4922 else
4923 return cp_parser_unqualified_id (parser, template_keyword_p,
4924 /*check_dependency_p=*/true,
4925 declarator_p,
4926 optional_p);
4929 /* Parse an unqualified-id.
4931 unqualified-id:
4932 identifier
4933 operator-function-id
4934 conversion-function-id
4935 ~ class-name
4936 template-id
4938 If TEMPLATE_KEYWORD_P is TRUE, we have just seen the `template'
4939 keyword, in a construct like `A::template ...'.
4941 Returns a representation of unqualified-id. For the `identifier'
4942 production, an IDENTIFIER_NODE is returned. For the `~ class-name'
4943 production a BIT_NOT_EXPR is returned; the operand of the
4944 BIT_NOT_EXPR is an IDENTIFIER_NODE for the class-name. For the
4945 other productions, see the documentation accompanying the
4946 corresponding parsing functions. If CHECK_DEPENDENCY_P is false,
4947 names are looked up in uninstantiated templates. If DECLARATOR_P
4948 is true, the unqualified-id is appearing as part of a declarator,
4949 rather than as part of an expression. */
4951 static tree
4952 cp_parser_unqualified_id (cp_parser* parser,
4953 bool template_keyword_p,
4954 bool check_dependency_p,
4955 bool declarator_p,
4956 bool optional_p)
4958 cp_token *token;
4960 /* Peek at the next token. */
4961 token = cp_lexer_peek_token (parser->lexer);
4963 switch ((int) token->type)
4965 case CPP_NAME:
4967 tree id;
4969 /* We don't know yet whether or not this will be a
4970 template-id. */
4971 cp_parser_parse_tentatively (parser);
4972 /* Try a template-id. */
4973 id = cp_parser_template_id (parser, template_keyword_p,
4974 check_dependency_p,
4975 none_type,
4976 declarator_p);
4977 /* If it worked, we're done. */
4978 if (cp_parser_parse_definitely (parser))
4979 return id;
4980 /* Otherwise, it's an ordinary identifier. */
4981 return cp_parser_identifier (parser);
4984 case CPP_TEMPLATE_ID:
4985 return cp_parser_template_id (parser, template_keyword_p,
4986 check_dependency_p,
4987 none_type,
4988 declarator_p);
4990 case CPP_COMPL:
4992 tree type_decl;
4993 tree qualifying_scope;
4994 tree object_scope;
4995 tree scope;
4996 bool done;
4998 /* Consume the `~' token. */
4999 cp_lexer_consume_token (parser->lexer);
5000 /* Parse the class-name. The standard, as written, seems to
5001 say that:
5003 template <typename T> struct S { ~S (); };
5004 template <typename T> S<T>::~S() {}
5006 is invalid, since `~' must be followed by a class-name, but
5007 `S<T>' is dependent, and so not known to be a class.
5008 That's not right; we need to look in uninstantiated
5009 templates. A further complication arises from:
5011 template <typename T> void f(T t) {
5012 t.T::~T();
5015 Here, it is not possible to look up `T' in the scope of `T'
5016 itself. We must look in both the current scope, and the
5017 scope of the containing complete expression.
5019 Yet another issue is:
5021 struct S {
5022 int S;
5023 ~S();
5026 S::~S() {}
5028 The standard does not seem to say that the `S' in `~S'
5029 should refer to the type `S' and not the data member
5030 `S::S'. */
5032 /* DR 244 says that we look up the name after the "~" in the
5033 same scope as we looked up the qualifying name. That idea
5034 isn't fully worked out; it's more complicated than that. */
5035 scope = parser->scope;
5036 object_scope = parser->object_scope;
5037 qualifying_scope = parser->qualifying_scope;
5039 /* Check for invalid scopes. */
5040 if (scope == error_mark_node)
5042 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
5043 cp_lexer_consume_token (parser->lexer);
5044 return error_mark_node;
5046 if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
5048 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
5049 error_at (token->location,
5050 "scope %qT before %<~%> is not a class-name",
5051 scope);
5052 cp_parser_simulate_error (parser);
5053 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
5054 cp_lexer_consume_token (parser->lexer);
5055 return error_mark_node;
5057 gcc_assert (!scope || TYPE_P (scope));
5059 /* If the name is of the form "X::~X" it's OK even if X is a
5060 typedef. */
5061 token = cp_lexer_peek_token (parser->lexer);
5062 if (scope
5063 && token->type == CPP_NAME
5064 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
5065 != CPP_LESS)
5066 && (token->u.value == TYPE_IDENTIFIER (scope)
5067 || (CLASS_TYPE_P (scope)
5068 && constructor_name_p (token->u.value, scope))))
5070 cp_lexer_consume_token (parser->lexer);
5071 return build_nt (BIT_NOT_EXPR, scope);
5074 /* ~auto means the destructor of whatever the object is. */
5075 if (cp_parser_is_keyword (token, RID_AUTO))
5077 if (cxx_dialect < cxx14)
5078 pedwarn (input_location, 0,
5079 "%<~auto%> only available with "
5080 "-std=c++14 or -std=gnu++14");
5081 cp_lexer_consume_token (parser->lexer);
5082 return build_nt (BIT_NOT_EXPR, make_auto ());
5085 /* If there was an explicit qualification (S::~T), first look
5086 in the scope given by the qualification (i.e., S).
5088 Note: in the calls to cp_parser_class_name below we pass
5089 typename_type so that lookup finds the injected-class-name
5090 rather than the constructor. */
5091 done = false;
5092 type_decl = NULL_TREE;
5093 if (scope)
5095 cp_parser_parse_tentatively (parser);
5096 type_decl = cp_parser_class_name (parser,
5097 /*typename_keyword_p=*/false,
5098 /*template_keyword_p=*/false,
5099 typename_type,
5100 /*check_dependency=*/false,
5101 /*class_head_p=*/false,
5102 declarator_p);
5103 if (cp_parser_parse_definitely (parser))
5104 done = true;
5106 /* In "N::S::~S", look in "N" as well. */
5107 if (!done && scope && qualifying_scope)
5109 cp_parser_parse_tentatively (parser);
5110 parser->scope = qualifying_scope;
5111 parser->object_scope = NULL_TREE;
5112 parser->qualifying_scope = NULL_TREE;
5113 type_decl
5114 = cp_parser_class_name (parser,
5115 /*typename_keyword_p=*/false,
5116 /*template_keyword_p=*/false,
5117 typename_type,
5118 /*check_dependency=*/false,
5119 /*class_head_p=*/false,
5120 declarator_p);
5121 if (cp_parser_parse_definitely (parser))
5122 done = true;
5124 /* In "p->S::~T", look in the scope given by "*p" as well. */
5125 else if (!done && object_scope)
5127 cp_parser_parse_tentatively (parser);
5128 parser->scope = object_scope;
5129 parser->object_scope = NULL_TREE;
5130 parser->qualifying_scope = NULL_TREE;
5131 type_decl
5132 = cp_parser_class_name (parser,
5133 /*typename_keyword_p=*/false,
5134 /*template_keyword_p=*/false,
5135 typename_type,
5136 /*check_dependency=*/false,
5137 /*class_head_p=*/false,
5138 declarator_p);
5139 if (cp_parser_parse_definitely (parser))
5140 done = true;
5142 /* Look in the surrounding context. */
5143 if (!done)
5145 parser->scope = NULL_TREE;
5146 parser->object_scope = NULL_TREE;
5147 parser->qualifying_scope = NULL_TREE;
5148 if (processing_template_decl)
5149 cp_parser_parse_tentatively (parser);
5150 type_decl
5151 = cp_parser_class_name (parser,
5152 /*typename_keyword_p=*/false,
5153 /*template_keyword_p=*/false,
5154 typename_type,
5155 /*check_dependency=*/false,
5156 /*class_head_p=*/false,
5157 declarator_p);
5158 if (processing_template_decl
5159 && ! cp_parser_parse_definitely (parser))
5161 /* We couldn't find a type with this name, so just accept
5162 it and check for a match at instantiation time. */
5163 type_decl = cp_parser_identifier (parser);
5164 if (type_decl != error_mark_node)
5165 type_decl = build_nt (BIT_NOT_EXPR, type_decl);
5166 return type_decl;
5169 /* If an error occurred, assume that the name of the
5170 destructor is the same as the name of the qualifying
5171 class. That allows us to keep parsing after running
5172 into ill-formed destructor names. */
5173 if (type_decl == error_mark_node && scope)
5174 return build_nt (BIT_NOT_EXPR, scope);
5175 else if (type_decl == error_mark_node)
5176 return error_mark_node;
5178 /* Check that destructor name and scope match. */
5179 if (declarator_p && scope && !check_dtor_name (scope, type_decl))
5181 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
5182 error_at (token->location,
5183 "declaration of %<~%T%> as member of %qT",
5184 type_decl, scope);
5185 cp_parser_simulate_error (parser);
5186 return error_mark_node;
5189 /* [class.dtor]
5191 A typedef-name that names a class shall not be used as the
5192 identifier in the declarator for a destructor declaration. */
5193 if (declarator_p
5194 && !DECL_IMPLICIT_TYPEDEF_P (type_decl)
5195 && !DECL_SELF_REFERENCE_P (type_decl)
5196 && !cp_parser_uncommitted_to_tentative_parse_p (parser))
5197 error_at (token->location,
5198 "typedef-name %qD used as destructor declarator",
5199 type_decl);
5201 return build_nt (BIT_NOT_EXPR, TREE_TYPE (type_decl));
5204 case CPP_KEYWORD:
5205 if (token->keyword == RID_OPERATOR)
5207 tree id;
5209 /* This could be a template-id, so we try that first. */
5210 cp_parser_parse_tentatively (parser);
5211 /* Try a template-id. */
5212 id = cp_parser_template_id (parser, template_keyword_p,
5213 /*check_dependency_p=*/true,
5214 none_type,
5215 declarator_p);
5216 /* If that worked, we're done. */
5217 if (cp_parser_parse_definitely (parser))
5218 return id;
5219 /* We still don't know whether we're looking at an
5220 operator-function-id or a conversion-function-id. */
5221 cp_parser_parse_tentatively (parser);
5222 /* Try an operator-function-id. */
5223 id = cp_parser_operator_function_id (parser);
5224 /* If that didn't work, try a conversion-function-id. */
5225 if (!cp_parser_parse_definitely (parser))
5226 id = cp_parser_conversion_function_id (parser);
5227 else if (UDLIT_OPER_P (id))
5229 /* 17.6.3.3.5 */
5230 const char *name = UDLIT_OP_SUFFIX (id);
5231 if (name[0] != '_' && !in_system_header_at (input_location)
5232 && declarator_p)
5233 warning (0, "literal operator suffixes not preceded by %<_%>"
5234 " are reserved for future standardization");
5237 return id;
5239 /* Fall through. */
5241 default:
5242 if (optional_p)
5243 return NULL_TREE;
5244 cp_parser_error (parser, "expected unqualified-id");
5245 return error_mark_node;
5249 /* Parse an (optional) nested-name-specifier.
5251 nested-name-specifier: [C++98]
5252 class-or-namespace-name :: nested-name-specifier [opt]
5253 class-or-namespace-name :: template nested-name-specifier [opt]
5255 nested-name-specifier: [C++0x]
5256 type-name ::
5257 namespace-name ::
5258 nested-name-specifier identifier ::
5259 nested-name-specifier template [opt] simple-template-id ::
5261 PARSER->SCOPE should be set appropriately before this function is
5262 called. TYPENAME_KEYWORD_P is TRUE if the `typename' keyword is in
5263 effect. TYPE_P is TRUE if we non-type bindings should be ignored
5264 in name lookups.
5266 Sets PARSER->SCOPE to the class (TYPE) or namespace
5267 (NAMESPACE_DECL) specified by the nested-name-specifier, or leaves
5268 it unchanged if there is no nested-name-specifier. Returns the new
5269 scope iff there is a nested-name-specifier, or NULL_TREE otherwise.
5271 If IS_DECLARATION is TRUE, the nested-name-specifier is known to be
5272 part of a declaration and/or decl-specifier. */
5274 static tree
5275 cp_parser_nested_name_specifier_opt (cp_parser *parser,
5276 bool typename_keyword_p,
5277 bool check_dependency_p,
5278 bool type_p,
5279 bool is_declaration)
5281 bool success = false;
5282 cp_token_position start = 0;
5283 cp_token *token;
5285 /* Remember where the nested-name-specifier starts. */
5286 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
5288 start = cp_lexer_token_position (parser->lexer, false);
5289 push_deferring_access_checks (dk_deferred);
5292 while (true)
5294 tree new_scope;
5295 tree old_scope;
5296 tree saved_qualifying_scope;
5297 bool template_keyword_p;
5299 /* Spot cases that cannot be the beginning of a
5300 nested-name-specifier. */
5301 token = cp_lexer_peek_token (parser->lexer);
5303 /* If the next token is CPP_NESTED_NAME_SPECIFIER, just process
5304 the already parsed nested-name-specifier. */
5305 if (token->type == CPP_NESTED_NAME_SPECIFIER)
5307 /* Grab the nested-name-specifier and continue the loop. */
5308 cp_parser_pre_parsed_nested_name_specifier (parser);
5309 /* If we originally encountered this nested-name-specifier
5310 with IS_DECLARATION set to false, we will not have
5311 resolved TYPENAME_TYPEs, so we must do so here. */
5312 if (is_declaration
5313 && TREE_CODE (parser->scope) == TYPENAME_TYPE)
5315 new_scope = resolve_typename_type (parser->scope,
5316 /*only_current_p=*/false);
5317 if (TREE_CODE (new_scope) != TYPENAME_TYPE)
5318 parser->scope = new_scope;
5320 success = true;
5321 continue;
5324 /* Spot cases that cannot be the beginning of a
5325 nested-name-specifier. On the second and subsequent times
5326 through the loop, we look for the `template' keyword. */
5327 if (success && token->keyword == RID_TEMPLATE)
5329 /* A template-id can start a nested-name-specifier. */
5330 else if (token->type == CPP_TEMPLATE_ID)
5332 /* DR 743: decltype can be used in a nested-name-specifier. */
5333 else if (token_is_decltype (token))
5335 else
5337 /* If the next token is not an identifier, then it is
5338 definitely not a type-name or namespace-name. */
5339 if (token->type != CPP_NAME)
5340 break;
5341 /* If the following token is neither a `<' (to begin a
5342 template-id), nor a `::', then we are not looking at a
5343 nested-name-specifier. */
5344 token = cp_lexer_peek_nth_token (parser->lexer, 2);
5346 if (token->type == CPP_COLON
5347 && parser->colon_corrects_to_scope_p
5348 && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_NAME)
5350 error_at (token->location,
5351 "found %<:%> in nested-name-specifier, expected %<::%>");
5352 token->type = CPP_SCOPE;
5355 if (token->type != CPP_SCOPE
5356 && !cp_parser_nth_token_starts_template_argument_list_p
5357 (parser, 2))
5358 break;
5361 /* The nested-name-specifier is optional, so we parse
5362 tentatively. */
5363 cp_parser_parse_tentatively (parser);
5365 /* Look for the optional `template' keyword, if this isn't the
5366 first time through the loop. */
5367 if (success)
5368 template_keyword_p = cp_parser_optional_template_keyword (parser);
5369 else
5370 template_keyword_p = false;
5372 /* Save the old scope since the name lookup we are about to do
5373 might destroy it. */
5374 old_scope = parser->scope;
5375 saved_qualifying_scope = parser->qualifying_scope;
5376 /* In a declarator-id like "X<T>::I::Y<T>" we must be able to
5377 look up names in "X<T>::I" in order to determine that "Y" is
5378 a template. So, if we have a typename at this point, we make
5379 an effort to look through it. */
5380 if (is_declaration
5381 && !typename_keyword_p
5382 && parser->scope
5383 && TREE_CODE (parser->scope) == TYPENAME_TYPE)
5384 parser->scope = resolve_typename_type (parser->scope,
5385 /*only_current_p=*/false);
5386 /* Parse the qualifying entity. */
5387 new_scope
5388 = cp_parser_qualifying_entity (parser,
5389 typename_keyword_p,
5390 template_keyword_p,
5391 check_dependency_p,
5392 type_p,
5393 is_declaration);
5394 /* Look for the `::' token. */
5395 cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
5397 /* If we found what we wanted, we keep going; otherwise, we're
5398 done. */
5399 if (!cp_parser_parse_definitely (parser))
5401 bool error_p = false;
5403 /* Restore the OLD_SCOPE since it was valid before the
5404 failed attempt at finding the last
5405 class-or-namespace-name. */
5406 parser->scope = old_scope;
5407 parser->qualifying_scope = saved_qualifying_scope;
5409 /* If the next token is a decltype, and the one after that is a
5410 `::', then the decltype has failed to resolve to a class or
5411 enumeration type. Give this error even when parsing
5412 tentatively since it can't possibly be valid--and we're going
5413 to replace it with a CPP_NESTED_NAME_SPECIFIER below, so we
5414 won't get another chance.*/
5415 if (cp_lexer_next_token_is (parser->lexer, CPP_DECLTYPE)
5416 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
5417 == CPP_SCOPE))
5419 token = cp_lexer_consume_token (parser->lexer);
5420 error_at (token->location, "decltype evaluates to %qT, "
5421 "which is not a class or enumeration type",
5422 token->u.value);
5423 parser->scope = error_mark_node;
5424 error_p = true;
5425 /* As below. */
5426 success = true;
5427 cp_lexer_consume_token (parser->lexer);
5430 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
5431 break;
5432 /* If the next token is an identifier, and the one after
5433 that is a `::', then any valid interpretation would have
5434 found a class-or-namespace-name. */
5435 while (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
5436 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
5437 == CPP_SCOPE)
5438 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
5439 != CPP_COMPL))
5441 token = cp_lexer_consume_token (parser->lexer);
5442 if (!error_p)
5444 if (!token->error_reported)
5446 tree decl;
5447 tree ambiguous_decls;
5449 decl = cp_parser_lookup_name (parser, token->u.value,
5450 none_type,
5451 /*is_template=*/false,
5452 /*is_namespace=*/false,
5453 /*check_dependency=*/true,
5454 &ambiguous_decls,
5455 token->location);
5456 if (TREE_CODE (decl) == TEMPLATE_DECL)
5457 error_at (token->location,
5458 "%qD used without template parameters",
5459 decl);
5460 else if (ambiguous_decls)
5462 // cp_parser_lookup_name has the same diagnostic,
5463 // thus make sure to emit it at most once.
5464 if (cp_parser_uncommitted_to_tentative_parse_p
5465 (parser))
5467 error_at (token->location,
5468 "reference to %qD is ambiguous",
5469 token->u.value);
5470 print_candidates (ambiguous_decls);
5472 decl = error_mark_node;
5474 else
5476 if (cxx_dialect != cxx98)
5477 cp_parser_name_lookup_error
5478 (parser, token->u.value, decl, NLE_NOT_CXX98,
5479 token->location);
5480 else
5481 cp_parser_name_lookup_error
5482 (parser, token->u.value, decl, NLE_CXX98,
5483 token->location);
5486 parser->scope = error_mark_node;
5487 error_p = true;
5488 /* Treat this as a successful nested-name-specifier
5489 due to:
5491 [basic.lookup.qual]
5493 If the name found is not a class-name (clause
5494 _class_) or namespace-name (_namespace.def_), the
5495 program is ill-formed. */
5496 success = true;
5498 cp_lexer_consume_token (parser->lexer);
5500 break;
5502 /* We've found one valid nested-name-specifier. */
5503 success = true;
5504 /* Name lookup always gives us a DECL. */
5505 if (TREE_CODE (new_scope) == TYPE_DECL)
5506 new_scope = TREE_TYPE (new_scope);
5507 /* Uses of "template" must be followed by actual templates. */
5508 if (template_keyword_p
5509 && !(CLASS_TYPE_P (new_scope)
5510 && ((CLASSTYPE_USE_TEMPLATE (new_scope)
5511 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (new_scope)))
5512 || CLASSTYPE_IS_TEMPLATE (new_scope)))
5513 && !(TREE_CODE (new_scope) == TYPENAME_TYPE
5514 && (TREE_CODE (TYPENAME_TYPE_FULLNAME (new_scope))
5515 == TEMPLATE_ID_EXPR)))
5516 permerror (input_location, TYPE_P (new_scope)
5517 ? G_("%qT is not a template")
5518 : G_("%qD is not a template"),
5519 new_scope);
5520 /* If it is a class scope, try to complete it; we are about to
5521 be looking up names inside the class. */
5522 if (TYPE_P (new_scope)
5523 /* Since checking types for dependency can be expensive,
5524 avoid doing it if the type is already complete. */
5525 && !COMPLETE_TYPE_P (new_scope)
5526 /* Do not try to complete dependent types. */
5527 && !dependent_type_p (new_scope))
5529 new_scope = complete_type (new_scope);
5530 /* If it is a typedef to current class, use the current
5531 class instead, as the typedef won't have any names inside
5532 it yet. */
5533 if (!COMPLETE_TYPE_P (new_scope)
5534 && currently_open_class (new_scope))
5535 new_scope = TYPE_MAIN_VARIANT (new_scope);
5537 /* Make sure we look in the right scope the next time through
5538 the loop. */
5539 parser->scope = new_scope;
5542 /* If parsing tentatively, replace the sequence of tokens that makes
5543 up the nested-name-specifier with a CPP_NESTED_NAME_SPECIFIER
5544 token. That way, should we re-parse the token stream, we will
5545 not have to repeat the effort required to do the parse, nor will
5546 we issue duplicate error messages. */
5547 if (success && start)
5549 cp_token *token;
5551 token = cp_lexer_token_at (parser->lexer, start);
5552 /* Reset the contents of the START token. */
5553 token->type = CPP_NESTED_NAME_SPECIFIER;
5554 /* Retrieve any deferred checks. Do not pop this access checks yet
5555 so the memory will not be reclaimed during token replacing below. */
5556 token->u.tree_check_value = ggc_cleared_alloc<struct tree_check> ();
5557 token->u.tree_check_value->value = parser->scope;
5558 token->u.tree_check_value->checks = get_deferred_access_checks ();
5559 token->u.tree_check_value->qualifying_scope =
5560 parser->qualifying_scope;
5561 token->keyword = RID_MAX;
5563 /* Purge all subsequent tokens. */
5564 cp_lexer_purge_tokens_after (parser->lexer, start);
5567 if (start)
5568 pop_to_parent_deferring_access_checks ();
5570 return success ? parser->scope : NULL_TREE;
5573 /* Parse a nested-name-specifier. See
5574 cp_parser_nested_name_specifier_opt for details. This function
5575 behaves identically, except that it will an issue an error if no
5576 nested-name-specifier is present. */
5578 static tree
5579 cp_parser_nested_name_specifier (cp_parser *parser,
5580 bool typename_keyword_p,
5581 bool check_dependency_p,
5582 bool type_p,
5583 bool is_declaration)
5585 tree scope;
5587 /* Look for the nested-name-specifier. */
5588 scope = cp_parser_nested_name_specifier_opt (parser,
5589 typename_keyword_p,
5590 check_dependency_p,
5591 type_p,
5592 is_declaration);
5593 /* If it was not present, issue an error message. */
5594 if (!scope)
5596 cp_parser_error (parser, "expected nested-name-specifier");
5597 parser->scope = NULL_TREE;
5600 return scope;
5603 /* Parse the qualifying entity in a nested-name-specifier. For C++98,
5604 this is either a class-name or a namespace-name (which corresponds
5605 to the class-or-namespace-name production in the grammar). For
5606 C++0x, it can also be a type-name that refers to an enumeration
5607 type or a simple-template-id.
5609 TYPENAME_KEYWORD_P is TRUE iff the `typename' keyword is in effect.
5610 TEMPLATE_KEYWORD_P is TRUE iff the `template' keyword is in effect.
5611 CHECK_DEPENDENCY_P is FALSE iff dependent names should be looked up.
5612 TYPE_P is TRUE iff the next name should be taken as a class-name,
5613 even the same name is declared to be another entity in the same
5614 scope.
5616 Returns the class (TYPE_DECL) or namespace (NAMESPACE_DECL)
5617 specified by the class-or-namespace-name. If neither is found the
5618 ERROR_MARK_NODE is returned. */
5620 static tree
5621 cp_parser_qualifying_entity (cp_parser *parser,
5622 bool typename_keyword_p,
5623 bool template_keyword_p,
5624 bool check_dependency_p,
5625 bool type_p,
5626 bool is_declaration)
5628 tree saved_scope;
5629 tree saved_qualifying_scope;
5630 tree saved_object_scope;
5631 tree scope;
5632 bool only_class_p;
5633 bool successful_parse_p;
5635 /* DR 743: decltype can appear in a nested-name-specifier. */
5636 if (cp_lexer_next_token_is_decltype (parser->lexer))
5638 scope = cp_parser_decltype (parser);
5639 if (TREE_CODE (scope) != ENUMERAL_TYPE
5640 && !MAYBE_CLASS_TYPE_P (scope))
5642 cp_parser_simulate_error (parser);
5643 return error_mark_node;
5645 if (TYPE_NAME (scope))
5646 scope = TYPE_NAME (scope);
5647 return scope;
5650 /* Before we try to parse the class-name, we must save away the
5651 current PARSER->SCOPE since cp_parser_class_name will destroy
5652 it. */
5653 saved_scope = parser->scope;
5654 saved_qualifying_scope = parser->qualifying_scope;
5655 saved_object_scope = parser->object_scope;
5656 /* Try for a class-name first. If the SAVED_SCOPE is a type, then
5657 there is no need to look for a namespace-name. */
5658 only_class_p = template_keyword_p
5659 || (saved_scope && TYPE_P (saved_scope) && cxx_dialect == cxx98);
5660 if (!only_class_p)
5661 cp_parser_parse_tentatively (parser);
5662 scope = cp_parser_class_name (parser,
5663 typename_keyword_p,
5664 template_keyword_p,
5665 type_p ? class_type : none_type,
5666 check_dependency_p,
5667 /*class_head_p=*/false,
5668 is_declaration);
5669 successful_parse_p = only_class_p || cp_parser_parse_definitely (parser);
5670 /* If that didn't work and we're in C++0x mode, try for a type-name. */
5671 if (!only_class_p
5672 && cxx_dialect != cxx98
5673 && !successful_parse_p)
5675 /* Restore the saved scope. */
5676 parser->scope = saved_scope;
5677 parser->qualifying_scope = saved_qualifying_scope;
5678 parser->object_scope = saved_object_scope;
5680 /* Parse tentatively. */
5681 cp_parser_parse_tentatively (parser);
5683 /* Parse a type-name */
5684 scope = cp_parser_type_name (parser);
5686 /* "If the name found does not designate a namespace or a class,
5687 enumeration, or dependent type, the program is ill-formed."
5689 We cover classes and dependent types above and namespaces below,
5690 so this code is only looking for enums. */
5691 if (!scope || TREE_CODE (scope) != TYPE_DECL
5692 || TREE_CODE (TREE_TYPE (scope)) != ENUMERAL_TYPE)
5693 cp_parser_simulate_error (parser);
5695 successful_parse_p = cp_parser_parse_definitely (parser);
5697 /* If that didn't work, try for a namespace-name. */
5698 if (!only_class_p && !successful_parse_p)
5700 /* Restore the saved scope. */
5701 parser->scope = saved_scope;
5702 parser->qualifying_scope = saved_qualifying_scope;
5703 parser->object_scope = saved_object_scope;
5704 /* If we are not looking at an identifier followed by the scope
5705 resolution operator, then this is not part of a
5706 nested-name-specifier. (Note that this function is only used
5707 to parse the components of a nested-name-specifier.) */
5708 if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME)
5709 || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
5710 return error_mark_node;
5711 scope = cp_parser_namespace_name (parser);
5714 return scope;
5717 /* Return true if we are looking at a compound-literal, false otherwise. */
5719 static bool
5720 cp_parser_compound_literal_p (cp_parser *parser)
5722 /* Consume the `('. */
5723 cp_lexer_consume_token (parser->lexer);
5725 cp_lexer_save_tokens (parser->lexer);
5727 /* Skip tokens until the next token is a closing parenthesis.
5728 If we find the closing `)', and the next token is a `{', then
5729 we are looking at a compound-literal. */
5730 bool compound_literal_p
5731 = (cp_parser_skip_to_closing_parenthesis (parser, false, false,
5732 /*consume_paren=*/true)
5733 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE));
5735 /* Roll back the tokens we skipped. */
5736 cp_lexer_rollback_tokens (parser->lexer);
5738 return compound_literal_p;
5741 /* Parse a postfix-expression.
5743 postfix-expression:
5744 primary-expression
5745 postfix-expression [ expression ]
5746 postfix-expression ( expression-list [opt] )
5747 simple-type-specifier ( expression-list [opt] )
5748 typename :: [opt] nested-name-specifier identifier
5749 ( expression-list [opt] )
5750 typename :: [opt] nested-name-specifier template [opt] template-id
5751 ( expression-list [opt] )
5752 postfix-expression . template [opt] id-expression
5753 postfix-expression -> template [opt] id-expression
5754 postfix-expression . pseudo-destructor-name
5755 postfix-expression -> pseudo-destructor-name
5756 postfix-expression ++
5757 postfix-expression --
5758 dynamic_cast < type-id > ( expression )
5759 static_cast < type-id > ( expression )
5760 reinterpret_cast < type-id > ( expression )
5761 const_cast < type-id > ( expression )
5762 typeid ( expression )
5763 typeid ( type-id )
5765 GNU Extension:
5767 postfix-expression:
5768 ( type-id ) { initializer-list , [opt] }
5770 This extension is a GNU version of the C99 compound-literal
5771 construct. (The C99 grammar uses `type-name' instead of `type-id',
5772 but they are essentially the same concept.)
5774 If ADDRESS_P is true, the postfix expression is the operand of the
5775 `&' operator. CAST_P is true if this expression is the target of a
5776 cast.
5778 If MEMBER_ACCESS_ONLY_P, we only allow postfix expressions that are
5779 class member access expressions [expr.ref].
5781 Returns a representation of the expression. */
5783 static tree
5784 cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
5785 bool member_access_only_p, bool decltype_p,
5786 cp_id_kind * pidk_return)
5788 cp_token *token;
5789 location_t loc;
5790 enum rid keyword;
5791 cp_id_kind idk = CP_ID_KIND_NONE;
5792 tree postfix_expression = NULL_TREE;
5793 bool is_member_access = false;
5794 int saved_in_statement = -1;
5796 /* Peek at the next token. */
5797 token = cp_lexer_peek_token (parser->lexer);
5798 loc = token->location;
5799 /* Some of the productions are determined by keywords. */
5800 keyword = token->keyword;
5801 switch (keyword)
5803 case RID_DYNCAST:
5804 case RID_STATCAST:
5805 case RID_REINTCAST:
5806 case RID_CONSTCAST:
5808 tree type;
5809 tree expression;
5810 const char *saved_message;
5811 bool saved_in_type_id_in_expr_p;
5813 /* All of these can be handled in the same way from the point
5814 of view of parsing. Begin by consuming the token
5815 identifying the cast. */
5816 cp_lexer_consume_token (parser->lexer);
5818 /* New types cannot be defined in the cast. */
5819 saved_message = parser->type_definition_forbidden_message;
5820 parser->type_definition_forbidden_message
5821 = G_("types may not be defined in casts");
5823 /* Look for the opening `<'. */
5824 cp_parser_require (parser, CPP_LESS, RT_LESS);
5825 /* Parse the type to which we are casting. */
5826 saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
5827 parser->in_type_id_in_expr_p = true;
5828 type = cp_parser_type_id (parser);
5829 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
5830 /* Look for the closing `>'. */
5831 cp_parser_require (parser, CPP_GREATER, RT_GREATER);
5832 /* Restore the old message. */
5833 parser->type_definition_forbidden_message = saved_message;
5835 bool saved_greater_than_is_operator_p
5836 = parser->greater_than_is_operator_p;
5837 parser->greater_than_is_operator_p = true;
5839 /* And the expression which is being cast. */
5840 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
5841 expression = cp_parser_expression (parser, & idk, /*cast_p=*/true);
5842 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
5844 parser->greater_than_is_operator_p
5845 = saved_greater_than_is_operator_p;
5847 /* Only type conversions to integral or enumeration types
5848 can be used in constant-expressions. */
5849 if (!cast_valid_in_integral_constant_expression_p (type)
5850 && cp_parser_non_integral_constant_expression (parser, NIC_CAST))
5851 return error_mark_node;
5853 switch (keyword)
5855 case RID_DYNCAST:
5856 postfix_expression
5857 = build_dynamic_cast (type, expression, tf_warning_or_error);
5858 break;
5859 case RID_STATCAST:
5860 postfix_expression
5861 = build_static_cast (type, expression, tf_warning_or_error);
5862 break;
5863 case RID_REINTCAST:
5864 postfix_expression
5865 = build_reinterpret_cast (type, expression,
5866 tf_warning_or_error);
5867 break;
5868 case RID_CONSTCAST:
5869 postfix_expression
5870 = build_const_cast (type, expression, tf_warning_or_error);
5871 break;
5872 default:
5873 gcc_unreachable ();
5876 break;
5878 case RID_TYPEID:
5880 tree type;
5881 const char *saved_message;
5882 bool saved_in_type_id_in_expr_p;
5884 /* Consume the `typeid' token. */
5885 cp_lexer_consume_token (parser->lexer);
5886 /* Look for the `(' token. */
5887 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
5888 /* Types cannot be defined in a `typeid' expression. */
5889 saved_message = parser->type_definition_forbidden_message;
5890 parser->type_definition_forbidden_message
5891 = G_("types may not be defined in a %<typeid%> expression");
5892 /* We can't be sure yet whether we're looking at a type-id or an
5893 expression. */
5894 cp_parser_parse_tentatively (parser);
5895 /* Try a type-id first. */
5896 saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
5897 parser->in_type_id_in_expr_p = true;
5898 type = cp_parser_type_id (parser);
5899 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
5900 /* Look for the `)' token. Otherwise, we can't be sure that
5901 we're not looking at an expression: consider `typeid (int
5902 (3))', for example. */
5903 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
5904 /* If all went well, simply lookup the type-id. */
5905 if (cp_parser_parse_definitely (parser))
5906 postfix_expression = get_typeid (type, tf_warning_or_error);
5907 /* Otherwise, fall back to the expression variant. */
5908 else
5910 tree expression;
5912 /* Look for an expression. */
5913 expression = cp_parser_expression (parser, & idk);
5914 /* Compute its typeid. */
5915 postfix_expression = build_typeid (expression, tf_warning_or_error);
5916 /* Look for the `)' token. */
5917 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
5919 /* Restore the saved message. */
5920 parser->type_definition_forbidden_message = saved_message;
5921 /* `typeid' may not appear in an integral constant expression. */
5922 if (cp_parser_non_integral_constant_expression (parser, NIC_TYPEID))
5923 return error_mark_node;
5925 break;
5927 case RID_TYPENAME:
5929 tree type;
5930 /* The syntax permitted here is the same permitted for an
5931 elaborated-type-specifier. */
5932 type = cp_parser_elaborated_type_specifier (parser,
5933 /*is_friend=*/false,
5934 /*is_declaration=*/false);
5935 postfix_expression = cp_parser_functional_cast (parser, type);
5937 break;
5939 case RID_CILK_SPAWN:
5941 cp_lexer_consume_token (parser->lexer);
5942 token = cp_lexer_peek_token (parser->lexer);
5943 if (token->type == CPP_SEMICOLON)
5945 error_at (token->location, "%<_Cilk_spawn%> must be followed by "
5946 "an expression");
5947 postfix_expression = error_mark_node;
5948 break;
5950 else if (!current_function_decl)
5952 error_at (token->location, "%<_Cilk_spawn%> may only be used "
5953 "inside a function");
5954 postfix_expression = error_mark_node;
5955 break;
5957 else
5959 /* Consecutive _Cilk_spawns are not allowed in a statement. */
5960 saved_in_statement = parser->in_statement;
5961 parser->in_statement |= IN_CILK_SPAWN;
5963 cfun->calls_cilk_spawn = 1;
5964 postfix_expression =
5965 cp_parser_postfix_expression (parser, false, false,
5966 false, false, &idk);
5967 if (!flag_cilkplus)
5969 error_at (token->location, "-fcilkplus must be enabled to use"
5970 " %<_Cilk_spawn%>");
5971 cfun->calls_cilk_spawn = 0;
5973 else if (saved_in_statement & IN_CILK_SPAWN)
5975 error_at (token->location, "consecutive %<_Cilk_spawn%> keywords "
5976 "are not permitted");
5977 postfix_expression = error_mark_node;
5978 cfun->calls_cilk_spawn = 0;
5980 else
5982 postfix_expression = build_cilk_spawn (token->location,
5983 postfix_expression);
5984 if (postfix_expression != error_mark_node)
5985 SET_EXPR_LOCATION (postfix_expression, input_location);
5986 parser->in_statement = parser->in_statement & ~IN_CILK_SPAWN;
5988 break;
5991 case RID_BUILTIN_SHUFFLE:
5993 vec<tree, va_gc> *vec;
5994 unsigned int i;
5995 tree p;
5997 cp_lexer_consume_token (parser->lexer);
5998 vec = cp_parser_parenthesized_expression_list (parser, non_attr,
5999 /*cast_p=*/false, /*allow_expansion_p=*/true,
6000 /*non_constant_p=*/NULL);
6001 if (vec == NULL)
6002 return error_mark_node;
6004 FOR_EACH_VEC_ELT (*vec, i, p)
6005 mark_exp_read (p);
6007 if (vec->length () == 2)
6008 return build_x_vec_perm_expr (loc, (*vec)[0], NULL_TREE, (*vec)[1],
6009 tf_warning_or_error);
6010 else if (vec->length () == 3)
6011 return build_x_vec_perm_expr (loc, (*vec)[0], (*vec)[1], (*vec)[2],
6012 tf_warning_or_error);
6013 else
6015 error_at (loc, "wrong number of arguments to "
6016 "%<__builtin_shuffle%>");
6017 return error_mark_node;
6019 break;
6022 default:
6024 tree type;
6026 /* If the next thing is a simple-type-specifier, we may be
6027 looking at a functional cast. We could also be looking at
6028 an id-expression. So, we try the functional cast, and if
6029 that doesn't work we fall back to the primary-expression. */
6030 cp_parser_parse_tentatively (parser);
6031 /* Look for the simple-type-specifier. */
6032 type = cp_parser_simple_type_specifier (parser,
6033 /*decl_specs=*/NULL,
6034 CP_PARSER_FLAGS_NONE);
6035 /* Parse the cast itself. */
6036 if (!cp_parser_error_occurred (parser))
6037 postfix_expression
6038 = cp_parser_functional_cast (parser, type);
6039 /* If that worked, we're done. */
6040 if (cp_parser_parse_definitely (parser))
6041 break;
6043 /* If the functional-cast didn't work out, try a
6044 compound-literal. */
6045 if (cp_parser_allow_gnu_extensions_p (parser)
6046 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
6048 tree initializer = NULL_TREE;
6050 cp_parser_parse_tentatively (parser);
6052 /* Avoid calling cp_parser_type_id pointlessly, see comment
6053 in cp_parser_cast_expression about c++/29234. */
6054 if (!cp_parser_compound_literal_p (parser))
6055 cp_parser_simulate_error (parser);
6056 else
6058 /* Parse the type. */
6059 bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
6060 parser->in_type_id_in_expr_p = true;
6061 type = cp_parser_type_id (parser);
6062 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
6063 /* Look for the `)'. */
6064 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
6067 /* If things aren't going well, there's no need to
6068 keep going. */
6069 if (!cp_parser_error_occurred (parser))
6071 bool non_constant_p;
6072 /* Parse the brace-enclosed initializer list. */
6073 initializer = cp_parser_braced_list (parser,
6074 &non_constant_p);
6076 /* If that worked, we're definitely looking at a
6077 compound-literal expression. */
6078 if (cp_parser_parse_definitely (parser))
6080 /* Warn the user that a compound literal is not
6081 allowed in standard C++. */
6082 pedwarn (input_location, OPT_Wpedantic,
6083 "ISO C++ forbids compound-literals");
6084 /* For simplicity, we disallow compound literals in
6085 constant-expressions. We could
6086 allow compound literals of integer type, whose
6087 initializer was a constant, in constant
6088 expressions. Permitting that usage, as a further
6089 extension, would not change the meaning of any
6090 currently accepted programs. (Of course, as
6091 compound literals are not part of ISO C++, the
6092 standard has nothing to say.) */
6093 if (cp_parser_non_integral_constant_expression (parser,
6094 NIC_NCC))
6096 postfix_expression = error_mark_node;
6097 break;
6099 /* Form the representation of the compound-literal. */
6100 postfix_expression
6101 = finish_compound_literal (type, initializer,
6102 tf_warning_or_error);
6103 break;
6107 /* It must be a primary-expression. */
6108 postfix_expression
6109 = cp_parser_primary_expression (parser, address_p, cast_p,
6110 /*template_arg_p=*/false,
6111 decltype_p,
6112 &idk);
6114 break;
6117 /* Note that we don't need to worry about calling build_cplus_new on a
6118 class-valued CALL_EXPR in decltype when it isn't the end of the
6119 postfix-expression; unary_complex_lvalue will take care of that for
6120 all these cases. */
6122 /* Keep looping until the postfix-expression is complete. */
6123 while (true)
6125 if (idk == CP_ID_KIND_UNQUALIFIED
6126 && identifier_p (postfix_expression)
6127 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
6128 /* It is not a Koenig lookup function call. */
6129 postfix_expression
6130 = unqualified_name_lookup_error (postfix_expression);
6132 /* Peek at the next token. */
6133 token = cp_lexer_peek_token (parser->lexer);
6135 switch (token->type)
6137 case CPP_OPEN_SQUARE:
6138 if (cp_next_tokens_can_be_std_attribute_p (parser))
6140 cp_parser_error (parser,
6141 "two consecutive %<[%> shall "
6142 "only introduce an attribute");
6143 return error_mark_node;
6145 postfix_expression
6146 = cp_parser_postfix_open_square_expression (parser,
6147 postfix_expression,
6148 false,
6149 decltype_p);
6150 idk = CP_ID_KIND_NONE;
6151 is_member_access = false;
6152 break;
6154 case CPP_OPEN_PAREN:
6155 /* postfix-expression ( expression-list [opt] ) */
6157 bool koenig_p;
6158 bool is_builtin_constant_p;
6159 bool saved_integral_constant_expression_p = false;
6160 bool saved_non_integral_constant_expression_p = false;
6161 tsubst_flags_t complain = complain_flags (decltype_p);
6162 vec<tree, va_gc> *args;
6164 is_member_access = false;
6166 is_builtin_constant_p
6167 = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
6168 if (is_builtin_constant_p)
6170 /* The whole point of __builtin_constant_p is to allow
6171 non-constant expressions to appear as arguments. */
6172 saved_integral_constant_expression_p
6173 = parser->integral_constant_expression_p;
6174 saved_non_integral_constant_expression_p
6175 = parser->non_integral_constant_expression_p;
6176 parser->integral_constant_expression_p = false;
6178 args = (cp_parser_parenthesized_expression_list
6179 (parser, non_attr,
6180 /*cast_p=*/false, /*allow_expansion_p=*/true,
6181 /*non_constant_p=*/NULL,
6182 /*want_literal_zero_p=*/warn_memset_transposed_args));
6183 if (is_builtin_constant_p)
6185 parser->integral_constant_expression_p
6186 = saved_integral_constant_expression_p;
6187 parser->non_integral_constant_expression_p
6188 = saved_non_integral_constant_expression_p;
6191 if (args == NULL)
6193 postfix_expression = error_mark_node;
6194 break;
6197 /* Function calls are not permitted in
6198 constant-expressions. */
6199 if (! builtin_valid_in_constant_expr_p (postfix_expression)
6200 && cp_parser_non_integral_constant_expression (parser,
6201 NIC_FUNC_CALL))
6203 postfix_expression = error_mark_node;
6204 release_tree_vector (args);
6205 break;
6208 koenig_p = false;
6209 if (idk == CP_ID_KIND_UNQUALIFIED
6210 || idk == CP_ID_KIND_TEMPLATE_ID)
6212 if (identifier_p (postfix_expression))
6214 if (!args->is_empty ())
6216 koenig_p = true;
6217 if (!any_type_dependent_arguments_p (args))
6218 postfix_expression
6219 = perform_koenig_lookup (postfix_expression, args,
6220 complain);
6222 else
6223 postfix_expression
6224 = unqualified_fn_lookup_error (postfix_expression);
6226 /* We do not perform argument-dependent lookup if
6227 normal lookup finds a non-function, in accordance
6228 with the expected resolution of DR 218. */
6229 else if (!args->is_empty ()
6230 && is_overloaded_fn (postfix_expression))
6232 tree fn = get_first_fn (postfix_expression);
6233 fn = STRIP_TEMPLATE (fn);
6235 /* Do not do argument dependent lookup if regular
6236 lookup finds a member function or a block-scope
6237 function declaration. [basic.lookup.argdep]/3 */
6238 if (!DECL_FUNCTION_MEMBER_P (fn)
6239 && !DECL_LOCAL_FUNCTION_P (fn))
6241 koenig_p = true;
6242 if (!any_type_dependent_arguments_p (args))
6243 postfix_expression
6244 = perform_koenig_lookup (postfix_expression, args,
6245 complain);
6250 if (warn_memset_transposed_args)
6252 if (TREE_CODE (postfix_expression) == FUNCTION_DECL
6253 && DECL_BUILT_IN_CLASS (postfix_expression) == BUILT_IN_NORMAL
6254 && DECL_FUNCTION_CODE (postfix_expression) == BUILT_IN_MEMSET
6255 && vec_safe_length (args) == 3
6256 && integer_zerop ((*args)[2])
6257 && LITERAL_ZERO_P ((*args)[2])
6258 && !(integer_zerop ((*args)[1])
6259 && LITERAL_ZERO_P ((*args)[1])))
6260 warning (OPT_Wmemset_transposed_args,
6261 "%<memset%> used with constant zero length "
6262 "parameter; this could be due to transposed "
6263 "parameters");
6265 /* Replace LITERAL_ZERO_P INTEGER_CSTs with normal ones
6266 to avoid leaking those into folder and middle-end. */
6267 unsigned int i;
6268 tree arg;
6269 FOR_EACH_VEC_SAFE_ELT (args, i, arg)
6270 if (TREE_CODE (arg) == INTEGER_CST && LITERAL_ZERO_P (arg))
6271 (*args)[i] = build_int_cst (TREE_TYPE (arg), 0);
6274 if (TREE_CODE (postfix_expression) == COMPONENT_REF)
6276 tree instance = TREE_OPERAND (postfix_expression, 0);
6277 tree fn = TREE_OPERAND (postfix_expression, 1);
6279 if (processing_template_decl
6280 && (type_dependent_expression_p (instance)
6281 || (!BASELINK_P (fn)
6282 && TREE_CODE (fn) != FIELD_DECL)
6283 || type_dependent_expression_p (fn)
6284 || any_type_dependent_arguments_p (args)))
6286 postfix_expression
6287 = build_nt_call_vec (postfix_expression, args);
6288 release_tree_vector (args);
6289 break;
6292 if (BASELINK_P (fn))
6294 postfix_expression
6295 = (build_new_method_call
6296 (instance, fn, &args, NULL_TREE,
6297 (idk == CP_ID_KIND_QUALIFIED
6298 ? LOOKUP_NORMAL|LOOKUP_NONVIRTUAL
6299 : LOOKUP_NORMAL),
6300 /*fn_p=*/NULL,
6301 complain));
6303 else
6304 postfix_expression
6305 = finish_call_expr (postfix_expression, &args,
6306 /*disallow_virtual=*/false,
6307 /*koenig_p=*/false,
6308 complain);
6310 else if (TREE_CODE (postfix_expression) == OFFSET_REF
6311 || TREE_CODE (postfix_expression) == MEMBER_REF
6312 || TREE_CODE (postfix_expression) == DOTSTAR_EXPR)
6313 postfix_expression = (build_offset_ref_call_from_tree
6314 (postfix_expression, &args,
6315 complain));
6316 else if (idk == CP_ID_KIND_QUALIFIED)
6317 /* A call to a static class member, or a namespace-scope
6318 function. */
6319 postfix_expression
6320 = finish_call_expr (postfix_expression, &args,
6321 /*disallow_virtual=*/true,
6322 koenig_p,
6323 complain);
6324 else
6325 /* All other function calls. */
6326 postfix_expression
6327 = finish_call_expr (postfix_expression, &args,
6328 /*disallow_virtual=*/false,
6329 koenig_p,
6330 complain);
6332 protected_set_expr_location (postfix_expression, token->location);
6334 /* The POSTFIX_EXPRESSION is certainly no longer an id. */
6335 idk = CP_ID_KIND_NONE;
6337 release_tree_vector (args);
6339 break;
6341 case CPP_DOT:
6342 case CPP_DEREF:
6343 /* postfix-expression . template [opt] id-expression
6344 postfix-expression . pseudo-destructor-name
6345 postfix-expression -> template [opt] id-expression
6346 postfix-expression -> pseudo-destructor-name */
6348 /* Consume the `.' or `->' operator. */
6349 cp_lexer_consume_token (parser->lexer);
6351 postfix_expression
6352 = cp_parser_postfix_dot_deref_expression (parser, token->type,
6353 postfix_expression,
6354 false, &idk, loc);
6356 is_member_access = true;
6357 break;
6359 case CPP_PLUS_PLUS:
6360 /* postfix-expression ++ */
6361 /* Consume the `++' token. */
6362 cp_lexer_consume_token (parser->lexer);
6363 /* Generate a representation for the complete expression. */
6364 postfix_expression
6365 = finish_increment_expr (postfix_expression,
6366 POSTINCREMENT_EXPR);
6367 /* Increments may not appear in constant-expressions. */
6368 if (cp_parser_non_integral_constant_expression (parser, NIC_INC))
6369 postfix_expression = error_mark_node;
6370 idk = CP_ID_KIND_NONE;
6371 is_member_access = false;
6372 break;
6374 case CPP_MINUS_MINUS:
6375 /* postfix-expression -- */
6376 /* Consume the `--' token. */
6377 cp_lexer_consume_token (parser->lexer);
6378 /* Generate a representation for the complete expression. */
6379 postfix_expression
6380 = finish_increment_expr (postfix_expression,
6381 POSTDECREMENT_EXPR);
6382 /* Decrements may not appear in constant-expressions. */
6383 if (cp_parser_non_integral_constant_expression (parser, NIC_DEC))
6384 postfix_expression = error_mark_node;
6385 idk = CP_ID_KIND_NONE;
6386 is_member_access = false;
6387 break;
6389 default:
6390 if (pidk_return != NULL)
6391 * pidk_return = idk;
6392 if (member_access_only_p)
6393 return is_member_access? postfix_expression : error_mark_node;
6394 else
6395 return postfix_expression;
6399 /* We should never get here. */
6400 gcc_unreachable ();
6401 return error_mark_node;
6404 /* This function parses Cilk Plus array notations. If a normal array expr. is
6405 parsed then the array index is passed back to the caller through *INIT_INDEX
6406 and the function returns a NULL_TREE. If array notation expr. is parsed,
6407 then *INIT_INDEX is ignored by the caller and the function returns
6408 a tree of type ARRAY_NOTATION_REF. If some error occurred it returns
6409 error_mark_node. */
6411 static tree
6412 cp_parser_array_notation (location_t loc, cp_parser *parser, tree *init_index,
6413 tree array_value)
6415 cp_token *token = NULL;
6416 tree length_index, stride = NULL_TREE, value_tree, array_type;
6417 if (!array_value || array_value == error_mark_node)
6419 cp_parser_skip_to_end_of_statement (parser);
6420 return error_mark_node;
6423 array_type = TREE_TYPE (array_value);
6425 bool saved_colon_corrects = parser->colon_corrects_to_scope_p;
6426 parser->colon_corrects_to_scope_p = false;
6427 token = cp_lexer_peek_token (parser->lexer);
6429 if (!token)
6431 cp_parser_error (parser, "expected %<:%> or numeral");
6432 return error_mark_node;
6434 else if (token->type == CPP_COLON)
6436 /* Consume the ':'. */
6437 cp_lexer_consume_token (parser->lexer);
6439 /* If we are here, then we have a case like this A[:]. */
6440 if (cp_lexer_peek_token (parser->lexer)->type != CPP_CLOSE_SQUARE)
6442 cp_parser_error (parser, "expected %<]%>");
6443 cp_parser_skip_to_end_of_statement (parser);
6444 return error_mark_node;
6446 *init_index = NULL_TREE;
6447 stride = NULL_TREE;
6448 length_index = NULL_TREE;
6450 else
6452 /* If we are here, then there are three valid possibilities:
6453 1. ARRAY [ EXP ]
6454 2. ARRAY [ EXP : EXP ]
6455 3. ARRAY [ EXP : EXP : EXP ] */
6457 *init_index = cp_parser_expression (parser);
6458 if (cp_lexer_peek_token (parser->lexer)->type != CPP_COLON)
6460 /* This indicates that we have a normal array expression. */
6461 parser->colon_corrects_to_scope_p = saved_colon_corrects;
6462 return NULL_TREE;
6465 /* Consume the ':'. */
6466 cp_lexer_consume_token (parser->lexer);
6467 length_index = cp_parser_expression (parser);
6468 if (cp_lexer_peek_token (parser->lexer)->type == CPP_COLON)
6470 cp_lexer_consume_token (parser->lexer);
6471 stride = cp_parser_expression (parser);
6474 parser->colon_corrects_to_scope_p = saved_colon_corrects;
6476 if (*init_index == error_mark_node || length_index == error_mark_node
6477 || stride == error_mark_node || array_type == error_mark_node)
6479 if (cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_SQUARE)
6480 cp_lexer_consume_token (parser->lexer);
6481 return error_mark_node;
6483 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
6485 value_tree = build_array_notation_ref (loc, array_value, *init_index,
6486 length_index, stride, array_type);
6487 return value_tree;
6490 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
6491 by cp_parser_builtin_offsetof. We're looking for
6493 postfix-expression [ expression ]
6494 postfix-expression [ braced-init-list ] (C++11)
6496 FOR_OFFSETOF is set if we're being called in that context, which
6497 changes how we deal with integer constant expressions. */
6499 static tree
6500 cp_parser_postfix_open_square_expression (cp_parser *parser,
6501 tree postfix_expression,
6502 bool for_offsetof,
6503 bool decltype_p)
6505 tree index = NULL_TREE;
6506 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
6507 bool saved_greater_than_is_operator_p;
6509 /* Consume the `[' token. */
6510 cp_lexer_consume_token (parser->lexer);
6512 saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
6513 parser->greater_than_is_operator_p = true;
6515 /* Parse the index expression. */
6516 /* ??? For offsetof, there is a question of what to allow here. If
6517 offsetof is not being used in an integral constant expression context,
6518 then we *could* get the right answer by computing the value at runtime.
6519 If we are in an integral constant expression context, then we might
6520 could accept any constant expression; hard to say without analysis.
6521 Rather than open the barn door too wide right away, allow only integer
6522 constant expressions here. */
6523 if (for_offsetof)
6524 index = cp_parser_constant_expression (parser);
6525 else
6527 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
6529 bool expr_nonconst_p;
6530 cp_lexer_set_source_position (parser->lexer);
6531 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
6532 index = cp_parser_braced_list (parser, &expr_nonconst_p);
6533 if (flag_cilkplus
6534 && cp_lexer_peek_token (parser->lexer)->type == CPP_COLON)
6536 error_at (cp_lexer_peek_token (parser->lexer)->location,
6537 "braced list index is not allowed with array "
6538 "notation");
6539 cp_parser_skip_to_end_of_statement (parser);
6540 return error_mark_node;
6543 else if (flag_cilkplus)
6545 /* Here are have these two options:
6546 ARRAY[EXP : EXP] - Array notation expr with default
6547 stride of 1.
6548 ARRAY[EXP : EXP : EXP] - Array Notation with user-defined
6549 stride. */
6550 tree an_exp = cp_parser_array_notation (loc, parser, &index,
6551 postfix_expression);
6552 if (an_exp)
6553 return an_exp;
6555 else
6556 index = cp_parser_expression (parser);
6559 parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
6561 /* Look for the closing `]'. */
6562 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
6564 /* Build the ARRAY_REF. */
6565 postfix_expression = grok_array_decl (loc, postfix_expression,
6566 index, decltype_p);
6568 /* When not doing offsetof, array references are not permitted in
6569 constant-expressions. */
6570 if (!for_offsetof
6571 && (cp_parser_non_integral_constant_expression (parser, NIC_ARRAY_REF)))
6572 postfix_expression = error_mark_node;
6574 return postfix_expression;
6577 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
6578 by cp_parser_builtin_offsetof. We're looking for
6580 postfix-expression . template [opt] id-expression
6581 postfix-expression . pseudo-destructor-name
6582 postfix-expression -> template [opt] id-expression
6583 postfix-expression -> pseudo-destructor-name
6585 FOR_OFFSETOF is set if we're being called in that context. That sorta
6586 limits what of the above we'll actually accept, but nevermind.
6587 TOKEN_TYPE is the "." or "->" token, which will already have been
6588 removed from the stream. */
6590 static tree
6591 cp_parser_postfix_dot_deref_expression (cp_parser *parser,
6592 enum cpp_ttype token_type,
6593 tree postfix_expression,
6594 bool for_offsetof, cp_id_kind *idk,
6595 location_t location)
6597 tree name;
6598 bool dependent_p;
6599 bool pseudo_destructor_p;
6600 tree scope = NULL_TREE;
6602 /* If this is a `->' operator, dereference the pointer. */
6603 if (token_type == CPP_DEREF)
6604 postfix_expression = build_x_arrow (location, postfix_expression,
6605 tf_warning_or_error);
6606 /* Check to see whether or not the expression is type-dependent. */
6607 dependent_p = type_dependent_expression_p (postfix_expression);
6608 /* The identifier following the `->' or `.' is not qualified. */
6609 parser->scope = NULL_TREE;
6610 parser->qualifying_scope = NULL_TREE;
6611 parser->object_scope = NULL_TREE;
6612 *idk = CP_ID_KIND_NONE;
6614 /* Enter the scope corresponding to the type of the object
6615 given by the POSTFIX_EXPRESSION. */
6616 if (!dependent_p && TREE_TYPE (postfix_expression) != NULL_TREE)
6618 scope = TREE_TYPE (postfix_expression);
6619 /* According to the standard, no expression should ever have
6620 reference type. Unfortunately, we do not currently match
6621 the standard in this respect in that our internal representation
6622 of an expression may have reference type even when the standard
6623 says it does not. Therefore, we have to manually obtain the
6624 underlying type here. */
6625 scope = non_reference (scope);
6626 /* The type of the POSTFIX_EXPRESSION must be complete. */
6627 if (scope == unknown_type_node)
6629 error_at (location, "%qE does not have class type",
6630 postfix_expression);
6631 scope = NULL_TREE;
6633 /* Unlike the object expression in other contexts, *this is not
6634 required to be of complete type for purposes of class member
6635 access (5.2.5) outside the member function body. */
6636 else if (postfix_expression != current_class_ref
6637 && !(processing_template_decl && scope == current_class_type))
6638 scope = complete_type_or_else (scope, NULL_TREE);
6639 /* Let the name lookup machinery know that we are processing a
6640 class member access expression. */
6641 parser->context->object_type = scope;
6642 /* If something went wrong, we want to be able to discern that case,
6643 as opposed to the case where there was no SCOPE due to the type
6644 of expression being dependent. */
6645 if (!scope)
6646 scope = error_mark_node;
6647 /* If the SCOPE was erroneous, make the various semantic analysis
6648 functions exit quickly -- and without issuing additional error
6649 messages. */
6650 if (scope == error_mark_node)
6651 postfix_expression = error_mark_node;
6654 /* Assume this expression is not a pseudo-destructor access. */
6655 pseudo_destructor_p = false;
6657 /* If the SCOPE is a scalar type, then, if this is a valid program,
6658 we must be looking at a pseudo-destructor-name. If POSTFIX_EXPRESSION
6659 is type dependent, it can be pseudo-destructor-name or something else.
6660 Try to parse it as pseudo-destructor-name first. */
6661 if ((scope && SCALAR_TYPE_P (scope)) || dependent_p)
6663 tree s;
6664 tree type;
6666 cp_parser_parse_tentatively (parser);
6667 /* Parse the pseudo-destructor-name. */
6668 s = NULL_TREE;
6669 cp_parser_pseudo_destructor_name (parser, postfix_expression,
6670 &s, &type);
6671 if (dependent_p
6672 && (cp_parser_error_occurred (parser)
6673 || !SCALAR_TYPE_P (type)))
6674 cp_parser_abort_tentative_parse (parser);
6675 else if (cp_parser_parse_definitely (parser))
6677 pseudo_destructor_p = true;
6678 postfix_expression
6679 = finish_pseudo_destructor_expr (postfix_expression,
6680 s, type, location);
6684 if (!pseudo_destructor_p)
6686 /* If the SCOPE is not a scalar type, we are looking at an
6687 ordinary class member access expression, rather than a
6688 pseudo-destructor-name. */
6689 bool template_p;
6690 cp_token *token = cp_lexer_peek_token (parser->lexer);
6691 /* Parse the id-expression. */
6692 name = (cp_parser_id_expression
6693 (parser,
6694 cp_parser_optional_template_keyword (parser),
6695 /*check_dependency_p=*/true,
6696 &template_p,
6697 /*declarator_p=*/false,
6698 /*optional_p=*/false));
6699 /* In general, build a SCOPE_REF if the member name is qualified.
6700 However, if the name was not dependent and has already been
6701 resolved; there is no need to build the SCOPE_REF. For example;
6703 struct X { void f(); };
6704 template <typename T> void f(T* t) { t->X::f(); }
6706 Even though "t" is dependent, "X::f" is not and has been resolved
6707 to a BASELINK; there is no need to include scope information. */
6709 /* But we do need to remember that there was an explicit scope for
6710 virtual function calls. */
6711 if (parser->scope)
6712 *idk = CP_ID_KIND_QUALIFIED;
6714 /* If the name is a template-id that names a type, we will get a
6715 TYPE_DECL here. That is invalid code. */
6716 if (TREE_CODE (name) == TYPE_DECL)
6718 error_at (token->location, "invalid use of %qD", name);
6719 postfix_expression = error_mark_node;
6721 else
6723 if (name != error_mark_node && !BASELINK_P (name) && parser->scope)
6725 if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
6727 error_at (token->location, "%<%D::%D%> is not a class member",
6728 parser->scope, name);
6729 postfix_expression = error_mark_node;
6731 else
6732 name = build_qualified_name (/*type=*/NULL_TREE,
6733 parser->scope,
6734 name,
6735 template_p);
6736 parser->scope = NULL_TREE;
6737 parser->qualifying_scope = NULL_TREE;
6738 parser->object_scope = NULL_TREE;
6740 if (parser->scope && name && BASELINK_P (name))
6741 adjust_result_of_qualified_name_lookup
6742 (name, parser->scope, scope);
6743 postfix_expression
6744 = finish_class_member_access_expr (postfix_expression, name,
6745 template_p,
6746 tf_warning_or_error);
6750 /* We no longer need to look up names in the scope of the object on
6751 the left-hand side of the `.' or `->' operator. */
6752 parser->context->object_type = NULL_TREE;
6754 /* Outside of offsetof, these operators may not appear in
6755 constant-expressions. */
6756 if (!for_offsetof
6757 && (cp_parser_non_integral_constant_expression
6758 (parser, token_type == CPP_DEREF ? NIC_ARROW : NIC_POINT)))
6759 postfix_expression = error_mark_node;
6761 return postfix_expression;
6764 /* Cache of LITERAL_ZERO_P constants. */
6766 static GTY(()) tree literal_zeros[itk_none];
6768 /* Parse a parenthesized expression-list.
6770 expression-list:
6771 assignment-expression
6772 expression-list, assignment-expression
6774 attribute-list:
6775 expression-list
6776 identifier
6777 identifier, expression-list
6779 CAST_P is true if this expression is the target of a cast.
6781 ALLOW_EXPANSION_P is true if this expression allows expansion of an
6782 argument pack.
6784 Returns a vector of trees. Each element is a representation of an
6785 assignment-expression. NULL is returned if the ( and or ) are
6786 missing. An empty, but allocated, vector is returned on no
6787 expressions. The parentheses are eaten. IS_ATTRIBUTE_LIST is id_attr
6788 if we are parsing an attribute list for an attribute that wants a
6789 plain identifier argument, normal_attr for an attribute that wants
6790 an expression, or non_attr if we aren't parsing an attribute list. If
6791 NON_CONSTANT_P is non-NULL, *NON_CONSTANT_P indicates whether or
6792 not all of the expressions in the list were constant.
6793 WANT_LITERAL_ZERO_P is true if the caller is interested in
6794 LITERAL_ZERO_P INTEGER_CSTs. FIXME: once we don't fold everything
6795 immediately, this can be removed. */
6797 static vec<tree, va_gc> *
6798 cp_parser_parenthesized_expression_list (cp_parser* parser,
6799 int is_attribute_list,
6800 bool cast_p,
6801 bool allow_expansion_p,
6802 bool *non_constant_p,
6803 bool want_literal_zero_p)
6805 vec<tree, va_gc> *expression_list;
6806 bool fold_expr_p = is_attribute_list != non_attr;
6807 tree identifier = NULL_TREE;
6808 bool saved_greater_than_is_operator_p;
6810 /* Assume all the expressions will be constant. */
6811 if (non_constant_p)
6812 *non_constant_p = false;
6814 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
6815 return NULL;
6817 expression_list = make_tree_vector ();
6819 /* Within a parenthesized expression, a `>' token is always
6820 the greater-than operator. */
6821 saved_greater_than_is_operator_p
6822 = parser->greater_than_is_operator_p;
6823 parser->greater_than_is_operator_p = true;
6825 /* Consume expressions until there are no more. */
6826 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
6827 while (true)
6829 tree expr;
6831 /* At the beginning of attribute lists, check to see if the
6832 next token is an identifier. */
6833 if (is_attribute_list == id_attr
6834 && cp_lexer_peek_token (parser->lexer)->type == CPP_NAME)
6836 cp_token *token;
6838 /* Consume the identifier. */
6839 token = cp_lexer_consume_token (parser->lexer);
6840 /* Save the identifier. */
6841 identifier = token->u.value;
6843 else
6845 bool expr_non_constant_p;
6847 /* Parse the next assignment-expression. */
6848 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
6850 /* A braced-init-list. */
6851 cp_lexer_set_source_position (parser->lexer);
6852 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
6853 expr = cp_parser_braced_list (parser, &expr_non_constant_p);
6854 if (non_constant_p && expr_non_constant_p)
6855 *non_constant_p = true;
6857 else if (non_constant_p)
6859 expr = (cp_parser_constant_expression
6860 (parser, /*allow_non_constant_p=*/true,
6861 &expr_non_constant_p));
6862 if (expr_non_constant_p)
6863 *non_constant_p = true;
6865 else
6867 expr = NULL_TREE;
6868 cp_token *tok = cp_lexer_peek_token (parser->lexer);
6869 switch (tok->type)
6871 case CPP_NUMBER:
6872 case CPP_CHAR:
6873 case CPP_WCHAR:
6874 case CPP_CHAR16:
6875 case CPP_CHAR32:
6876 /* If a parameter is literal zero alone, remember it
6877 for -Wmemset-transposed-args warning. */
6878 if (integer_zerop (tok->u.value)
6879 && !TREE_OVERFLOW (tok->u.value)
6880 && want_literal_zero_p
6881 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
6882 == CPP_COMMA
6883 || cp_lexer_peek_nth_token (parser->lexer, 2)->type
6884 == CPP_CLOSE_PAREN))
6886 unsigned int i;
6887 for (i = 0; i < itk_none; ++i)
6888 if (TREE_TYPE (tok->u.value) == integer_types[i])
6889 break;
6890 if (i < itk_none && literal_zeros[i])
6891 expr = literal_zeros[i];
6892 else
6894 expr = copy_node (tok->u.value);
6895 LITERAL_ZERO_P (expr) = 1;
6896 if (i < itk_none)
6897 literal_zeros[i] = expr;
6899 /* Consume the 0 token (or '\0', 0LL etc.). */
6900 cp_lexer_consume_token (parser->lexer);
6902 break;
6903 default:
6904 break;
6906 if (expr == NULL_TREE)
6907 expr = cp_parser_assignment_expression (parser, /*pidk=*/NULL,
6908 cast_p);
6911 if (fold_expr_p)
6912 expr = instantiate_non_dependent_expr (expr);
6914 /* If we have an ellipsis, then this is an expression
6915 expansion. */
6916 if (allow_expansion_p
6917 && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
6919 /* Consume the `...'. */
6920 cp_lexer_consume_token (parser->lexer);
6922 /* Build the argument pack. */
6923 expr = make_pack_expansion (expr);
6926 /* Add it to the list. We add error_mark_node
6927 expressions to the list, so that we can still tell if
6928 the correct form for a parenthesized expression-list
6929 is found. That gives better errors. */
6930 vec_safe_push (expression_list, expr);
6932 if (expr == error_mark_node)
6933 goto skip_comma;
6936 /* After the first item, attribute lists look the same as
6937 expression lists. */
6938 is_attribute_list = non_attr;
6940 get_comma:;
6941 /* If the next token isn't a `,', then we are done. */
6942 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
6943 break;
6945 /* Otherwise, consume the `,' and keep going. */
6946 cp_lexer_consume_token (parser->lexer);
6949 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
6951 int ending;
6953 skip_comma:;
6954 /* We try and resync to an unnested comma, as that will give the
6955 user better diagnostics. */
6956 ending = cp_parser_skip_to_closing_parenthesis (parser,
6957 /*recovering=*/true,
6958 /*or_comma=*/true,
6959 /*consume_paren=*/true);
6960 if (ending < 0)
6961 goto get_comma;
6962 if (!ending)
6964 parser->greater_than_is_operator_p
6965 = saved_greater_than_is_operator_p;
6966 return NULL;
6970 parser->greater_than_is_operator_p
6971 = saved_greater_than_is_operator_p;
6973 if (identifier)
6974 vec_safe_insert (expression_list, 0, identifier);
6976 return expression_list;
6979 /* Parse a pseudo-destructor-name.
6981 pseudo-destructor-name:
6982 :: [opt] nested-name-specifier [opt] type-name :: ~ type-name
6983 :: [opt] nested-name-specifier template template-id :: ~ type-name
6984 :: [opt] nested-name-specifier [opt] ~ type-name
6986 If either of the first two productions is used, sets *SCOPE to the
6987 TYPE specified before the final `::'. Otherwise, *SCOPE is set to
6988 NULL_TREE. *TYPE is set to the TYPE_DECL for the final type-name,
6989 or ERROR_MARK_NODE if the parse fails. */
6991 static void
6992 cp_parser_pseudo_destructor_name (cp_parser* parser,
6993 tree object,
6994 tree* scope,
6995 tree* type)
6997 bool nested_name_specifier_p;
6999 /* Handle ~auto. */
7000 if (cp_lexer_next_token_is (parser->lexer, CPP_COMPL)
7001 && cp_lexer_nth_token_is_keyword (parser->lexer, 2, RID_AUTO)
7002 && !type_dependent_expression_p (object))
7004 if (cxx_dialect < cxx14)
7005 pedwarn (input_location, 0,
7006 "%<~auto%> only available with "
7007 "-std=c++14 or -std=gnu++14");
7008 cp_lexer_consume_token (parser->lexer);
7009 cp_lexer_consume_token (parser->lexer);
7010 *scope = NULL_TREE;
7011 *type = TREE_TYPE (object);
7012 return;
7015 /* Assume that things will not work out. */
7016 *type = error_mark_node;
7018 /* Look for the optional `::' operator. */
7019 cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true);
7020 /* Look for the optional nested-name-specifier. */
7021 nested_name_specifier_p
7022 = (cp_parser_nested_name_specifier_opt (parser,
7023 /*typename_keyword_p=*/false,
7024 /*check_dependency_p=*/true,
7025 /*type_p=*/false,
7026 /*is_declaration=*/false)
7027 != NULL_TREE);
7028 /* Now, if we saw a nested-name-specifier, we might be doing the
7029 second production. */
7030 if (nested_name_specifier_p
7031 && cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
7033 /* Consume the `template' keyword. */
7034 cp_lexer_consume_token (parser->lexer);
7035 /* Parse the template-id. */
7036 cp_parser_template_id (parser,
7037 /*template_keyword_p=*/true,
7038 /*check_dependency_p=*/false,
7039 class_type,
7040 /*is_declaration=*/true);
7041 /* Look for the `::' token. */
7042 cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
7044 /* If the next token is not a `~', then there might be some
7045 additional qualification. */
7046 else if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMPL))
7048 /* At this point, we're looking for "type-name :: ~". The type-name
7049 must not be a class-name, since this is a pseudo-destructor. So,
7050 it must be either an enum-name, or a typedef-name -- both of which
7051 are just identifiers. So, we peek ahead to check that the "::"
7052 and "~" tokens are present; if they are not, then we can avoid
7053 calling type_name. */
7054 if (cp_lexer_peek_token (parser->lexer)->type != CPP_NAME
7055 || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE
7056 || cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_COMPL)
7058 cp_parser_error (parser, "non-scalar type");
7059 return;
7062 /* Look for the type-name. */
7063 *scope = TREE_TYPE (cp_parser_nonclass_name (parser));
7064 if (*scope == error_mark_node)
7065 return;
7067 /* Look for the `::' token. */
7068 cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
7070 else
7071 *scope = NULL_TREE;
7073 /* Look for the `~'. */
7074 cp_parser_require (parser, CPP_COMPL, RT_COMPL);
7076 /* Once we see the ~, this has to be a pseudo-destructor. */
7077 if (!processing_template_decl && !cp_parser_error_occurred (parser))
7078 cp_parser_commit_to_topmost_tentative_parse (parser);
7080 /* Look for the type-name again. We are not responsible for
7081 checking that it matches the first type-name. */
7082 *type = TREE_TYPE (cp_parser_nonclass_name (parser));
7085 /* Parse a unary-expression.
7087 unary-expression:
7088 postfix-expression
7089 ++ cast-expression
7090 -- cast-expression
7091 unary-operator cast-expression
7092 sizeof unary-expression
7093 sizeof ( type-id )
7094 alignof ( type-id ) [C++0x]
7095 new-expression
7096 delete-expression
7098 GNU Extensions:
7100 unary-expression:
7101 __extension__ cast-expression
7102 __alignof__ unary-expression
7103 __alignof__ ( type-id )
7104 alignof unary-expression [C++0x]
7105 __real__ cast-expression
7106 __imag__ cast-expression
7107 && identifier
7108 sizeof ( type-id ) { initializer-list , [opt] }
7109 alignof ( type-id ) { initializer-list , [opt] } [C++0x]
7110 __alignof__ ( type-id ) { initializer-list , [opt] }
7112 ADDRESS_P is true iff the unary-expression is appearing as the
7113 operand of the `&' operator. CAST_P is true if this expression is
7114 the target of a cast.
7116 Returns a representation of the expression. */
7118 static tree
7119 cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk,
7120 bool address_p, bool cast_p, bool decltype_p)
7122 cp_token *token;
7123 enum tree_code unary_operator;
7125 /* Peek at the next token. */
7126 token = cp_lexer_peek_token (parser->lexer);
7127 /* Some keywords give away the kind of expression. */
7128 if (token->type == CPP_KEYWORD)
7130 enum rid keyword = token->keyword;
7132 switch (keyword)
7134 case RID_ALIGNOF:
7135 case RID_SIZEOF:
7137 tree operand, ret;
7138 enum tree_code op;
7139 location_t first_loc;
7141 op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR;
7142 /* Consume the token. */
7143 cp_lexer_consume_token (parser->lexer);
7144 first_loc = cp_lexer_peek_token (parser->lexer)->location;
7145 /* Parse the operand. */
7146 operand = cp_parser_sizeof_operand (parser, keyword);
7148 if (TYPE_P (operand))
7149 ret = cxx_sizeof_or_alignof_type (operand, op, true);
7150 else
7152 /* ISO C++ defines alignof only with types, not with
7153 expressions. So pedwarn if alignof is used with a non-
7154 type expression. However, __alignof__ is ok. */
7155 if (!strcmp (IDENTIFIER_POINTER (token->u.value), "alignof"))
7156 pedwarn (token->location, OPT_Wpedantic,
7157 "ISO C++ does not allow %<alignof%> "
7158 "with a non-type");
7160 ret = cxx_sizeof_or_alignof_expr (operand, op, true);
7162 /* For SIZEOF_EXPR, just issue diagnostics, but keep
7163 SIZEOF_EXPR with the original operand. */
7164 if (op == SIZEOF_EXPR && ret != error_mark_node)
7166 if (TREE_CODE (ret) != SIZEOF_EXPR || TYPE_P (operand))
7168 if (!processing_template_decl && TYPE_P (operand))
7170 ret = build_min (SIZEOF_EXPR, size_type_node,
7171 build1 (NOP_EXPR, operand,
7172 error_mark_node));
7173 SIZEOF_EXPR_TYPE_P (ret) = 1;
7175 else
7176 ret = build_min (SIZEOF_EXPR, size_type_node, operand);
7177 TREE_SIDE_EFFECTS (ret) = 0;
7178 TREE_READONLY (ret) = 1;
7180 SET_EXPR_LOCATION (ret, first_loc);
7182 return ret;
7185 case RID_NEW:
7186 return cp_parser_new_expression (parser);
7188 case RID_DELETE:
7189 return cp_parser_delete_expression (parser);
7191 case RID_EXTENSION:
7193 /* The saved value of the PEDANTIC flag. */
7194 int saved_pedantic;
7195 tree expr;
7197 /* Save away the PEDANTIC flag. */
7198 cp_parser_extension_opt (parser, &saved_pedantic);
7199 /* Parse the cast-expression. */
7200 expr = cp_parser_simple_cast_expression (parser);
7201 /* Restore the PEDANTIC flag. */
7202 pedantic = saved_pedantic;
7204 return expr;
7207 case RID_REALPART:
7208 case RID_IMAGPART:
7210 tree expression;
7212 /* Consume the `__real__' or `__imag__' token. */
7213 cp_lexer_consume_token (parser->lexer);
7214 /* Parse the cast-expression. */
7215 expression = cp_parser_simple_cast_expression (parser);
7216 /* Create the complete representation. */
7217 return build_x_unary_op (token->location,
7218 (keyword == RID_REALPART
7219 ? REALPART_EXPR : IMAGPART_EXPR),
7220 expression,
7221 tf_warning_or_error);
7223 break;
7225 case RID_TRANSACTION_ATOMIC:
7226 case RID_TRANSACTION_RELAXED:
7227 return cp_parser_transaction_expression (parser, keyword);
7229 case RID_NOEXCEPT:
7231 tree expr;
7232 const char *saved_message;
7233 bool saved_integral_constant_expression_p;
7234 bool saved_non_integral_constant_expression_p;
7235 bool saved_greater_than_is_operator_p;
7237 cp_lexer_consume_token (parser->lexer);
7238 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
7240 saved_message = parser->type_definition_forbidden_message;
7241 parser->type_definition_forbidden_message
7242 = G_("types may not be defined in %<noexcept%> expressions");
7244 saved_integral_constant_expression_p
7245 = parser->integral_constant_expression_p;
7246 saved_non_integral_constant_expression_p
7247 = parser->non_integral_constant_expression_p;
7248 parser->integral_constant_expression_p = false;
7250 saved_greater_than_is_operator_p
7251 = parser->greater_than_is_operator_p;
7252 parser->greater_than_is_operator_p = true;
7254 ++cp_unevaluated_operand;
7255 ++c_inhibit_evaluation_warnings;
7256 ++cp_noexcept_operand;
7257 expr = cp_parser_expression (parser);
7258 --cp_noexcept_operand;
7259 --c_inhibit_evaluation_warnings;
7260 --cp_unevaluated_operand;
7262 parser->greater_than_is_operator_p
7263 = saved_greater_than_is_operator_p;
7265 parser->integral_constant_expression_p
7266 = saved_integral_constant_expression_p;
7267 parser->non_integral_constant_expression_p
7268 = saved_non_integral_constant_expression_p;
7270 parser->type_definition_forbidden_message = saved_message;
7272 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7273 return finish_noexcept_expr (expr, tf_warning_or_error);
7276 default:
7277 break;
7281 /* Look for the `:: new' and `:: delete', which also signal the
7282 beginning of a new-expression, or delete-expression,
7283 respectively. If the next token is `::', then it might be one of
7284 these. */
7285 if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
7287 enum rid keyword;
7289 /* See if the token after the `::' is one of the keywords in
7290 which we're interested. */
7291 keyword = cp_lexer_peek_nth_token (parser->lexer, 2)->keyword;
7292 /* If it's `new', we have a new-expression. */
7293 if (keyword == RID_NEW)
7294 return cp_parser_new_expression (parser);
7295 /* Similarly, for `delete'. */
7296 else if (keyword == RID_DELETE)
7297 return cp_parser_delete_expression (parser);
7300 /* Look for a unary operator. */
7301 unary_operator = cp_parser_unary_operator (token);
7302 /* The `++' and `--' operators can be handled similarly, even though
7303 they are not technically unary-operators in the grammar. */
7304 if (unary_operator == ERROR_MARK)
7306 if (token->type == CPP_PLUS_PLUS)
7307 unary_operator = PREINCREMENT_EXPR;
7308 else if (token->type == CPP_MINUS_MINUS)
7309 unary_operator = PREDECREMENT_EXPR;
7310 /* Handle the GNU address-of-label extension. */
7311 else if (cp_parser_allow_gnu_extensions_p (parser)
7312 && token->type == CPP_AND_AND)
7314 tree identifier;
7315 tree expression;
7316 location_t loc = token->location;
7318 /* Consume the '&&' token. */
7319 cp_lexer_consume_token (parser->lexer);
7320 /* Look for the identifier. */
7321 identifier = cp_parser_identifier (parser);
7322 /* Create an expression representing the address. */
7323 expression = finish_label_address_expr (identifier, loc);
7324 if (cp_parser_non_integral_constant_expression (parser,
7325 NIC_ADDR_LABEL))
7326 expression = error_mark_node;
7327 return expression;
7330 if (unary_operator != ERROR_MARK)
7332 tree cast_expression;
7333 tree expression = error_mark_node;
7334 non_integral_constant non_constant_p = NIC_NONE;
7335 location_t loc = token->location;
7336 tsubst_flags_t complain = complain_flags (decltype_p);
7338 /* Consume the operator token. */
7339 token = cp_lexer_consume_token (parser->lexer);
7340 /* Parse the cast-expression. */
7341 cast_expression
7342 = cp_parser_cast_expression (parser,
7343 unary_operator == ADDR_EXPR,
7344 /*cast_p=*/false,
7345 /*decltype*/false,
7346 pidk);
7347 /* Now, build an appropriate representation. */
7348 switch (unary_operator)
7350 case INDIRECT_REF:
7351 non_constant_p = NIC_STAR;
7352 expression = build_x_indirect_ref (loc, cast_expression,
7353 RO_UNARY_STAR,
7354 complain);
7355 break;
7357 case ADDR_EXPR:
7358 non_constant_p = NIC_ADDR;
7359 /* Fall through. */
7360 case BIT_NOT_EXPR:
7361 expression = build_x_unary_op (loc, unary_operator,
7362 cast_expression,
7363 complain);
7364 break;
7366 case PREINCREMENT_EXPR:
7367 case PREDECREMENT_EXPR:
7368 non_constant_p = unary_operator == PREINCREMENT_EXPR
7369 ? NIC_PREINCREMENT : NIC_PREDECREMENT;
7370 /* Fall through. */
7371 case UNARY_PLUS_EXPR:
7372 case NEGATE_EXPR:
7373 case TRUTH_NOT_EXPR:
7374 expression = finish_unary_op_expr (loc, unary_operator,
7375 cast_expression, complain);
7376 break;
7378 default:
7379 gcc_unreachable ();
7382 if (non_constant_p != NIC_NONE
7383 && cp_parser_non_integral_constant_expression (parser,
7384 non_constant_p))
7385 expression = error_mark_node;
7387 return expression;
7390 return cp_parser_postfix_expression (parser, address_p, cast_p,
7391 /*member_access_only_p=*/false,
7392 decltype_p,
7393 pidk);
7396 /* Returns ERROR_MARK if TOKEN is not a unary-operator. If TOKEN is a
7397 unary-operator, the corresponding tree code is returned. */
7399 static enum tree_code
7400 cp_parser_unary_operator (cp_token* token)
7402 switch (token->type)
7404 case CPP_MULT:
7405 return INDIRECT_REF;
7407 case CPP_AND:
7408 return ADDR_EXPR;
7410 case CPP_PLUS:
7411 return UNARY_PLUS_EXPR;
7413 case CPP_MINUS:
7414 return NEGATE_EXPR;
7416 case CPP_NOT:
7417 return TRUTH_NOT_EXPR;
7419 case CPP_COMPL:
7420 return BIT_NOT_EXPR;
7422 default:
7423 return ERROR_MARK;
7427 /* Parse a new-expression.
7429 new-expression:
7430 :: [opt] new new-placement [opt] new-type-id new-initializer [opt]
7431 :: [opt] new new-placement [opt] ( type-id ) new-initializer [opt]
7433 Returns a representation of the expression. */
7435 static tree
7436 cp_parser_new_expression (cp_parser* parser)
7438 bool global_scope_p;
7439 vec<tree, va_gc> *placement;
7440 tree type;
7441 vec<tree, va_gc> *initializer;
7442 tree nelts = NULL_TREE;
7443 tree ret;
7445 /* Look for the optional `::' operator. */
7446 global_scope_p
7447 = (cp_parser_global_scope_opt (parser,
7448 /*current_scope_valid_p=*/false)
7449 != NULL_TREE);
7450 /* Look for the `new' operator. */
7451 cp_parser_require_keyword (parser, RID_NEW, RT_NEW);
7452 /* There's no easy way to tell a new-placement from the
7453 `( type-id )' construct. */
7454 cp_parser_parse_tentatively (parser);
7455 /* Look for a new-placement. */
7456 placement = cp_parser_new_placement (parser);
7457 /* If that didn't work out, there's no new-placement. */
7458 if (!cp_parser_parse_definitely (parser))
7460 if (placement != NULL)
7461 release_tree_vector (placement);
7462 placement = NULL;
7465 /* If the next token is a `(', then we have a parenthesized
7466 type-id. */
7467 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
7469 cp_token *token;
7470 const char *saved_message = parser->type_definition_forbidden_message;
7472 /* Consume the `('. */
7473 cp_lexer_consume_token (parser->lexer);
7475 /* Parse the type-id. */
7476 parser->type_definition_forbidden_message
7477 = G_("types may not be defined in a new-expression");
7478 type = cp_parser_type_id (parser);
7479 parser->type_definition_forbidden_message = saved_message;
7481 /* Look for the closing `)'. */
7482 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7483 token = cp_lexer_peek_token (parser->lexer);
7484 /* There should not be a direct-new-declarator in this production,
7485 but GCC used to allowed this, so we check and emit a sensible error
7486 message for this case. */
7487 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
7489 error_at (token->location,
7490 "array bound forbidden after parenthesized type-id");
7491 inform (token->location,
7492 "try removing the parentheses around the type-id");
7493 cp_parser_direct_new_declarator (parser);
7496 /* Otherwise, there must be a new-type-id. */
7497 else
7498 type = cp_parser_new_type_id (parser, &nelts);
7500 /* If the next token is a `(' or '{', then we have a new-initializer. */
7501 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
7502 || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
7503 initializer = cp_parser_new_initializer (parser);
7504 else
7505 initializer = NULL;
7507 /* A new-expression may not appear in an integral constant
7508 expression. */
7509 if (cp_parser_non_integral_constant_expression (parser, NIC_NEW))
7510 ret = error_mark_node;
7511 else
7513 /* Create a representation of the new-expression. */
7514 ret = build_new (&placement, type, nelts, &initializer, global_scope_p,
7515 tf_warning_or_error);
7518 if (placement != NULL)
7519 release_tree_vector (placement);
7520 if (initializer != NULL)
7521 release_tree_vector (initializer);
7523 return ret;
7526 /* Parse a new-placement.
7528 new-placement:
7529 ( expression-list )
7531 Returns the same representation as for an expression-list. */
7533 static vec<tree, va_gc> *
7534 cp_parser_new_placement (cp_parser* parser)
7536 vec<tree, va_gc> *expression_list;
7538 /* Parse the expression-list. */
7539 expression_list = (cp_parser_parenthesized_expression_list
7540 (parser, non_attr, /*cast_p=*/false,
7541 /*allow_expansion_p=*/true,
7542 /*non_constant_p=*/NULL));
7544 return expression_list;
7547 /* Parse a new-type-id.
7549 new-type-id:
7550 type-specifier-seq new-declarator [opt]
7552 Returns the TYPE allocated. If the new-type-id indicates an array
7553 type, *NELTS is set to the number of elements in the last array
7554 bound; the TYPE will not include the last array bound. */
7556 static tree
7557 cp_parser_new_type_id (cp_parser* parser, tree *nelts)
7559 cp_decl_specifier_seq type_specifier_seq;
7560 cp_declarator *new_declarator;
7561 cp_declarator *declarator;
7562 cp_declarator *outer_declarator;
7563 const char *saved_message;
7565 /* The type-specifier sequence must not contain type definitions.
7566 (It cannot contain declarations of new types either, but if they
7567 are not definitions we will catch that because they are not
7568 complete.) */
7569 saved_message = parser->type_definition_forbidden_message;
7570 parser->type_definition_forbidden_message
7571 = G_("types may not be defined in a new-type-id");
7572 /* Parse the type-specifier-seq. */
7573 cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
7574 /*is_trailing_return=*/false,
7575 &type_specifier_seq);
7576 /* Restore the old message. */
7577 parser->type_definition_forbidden_message = saved_message;
7579 if (type_specifier_seq.type == error_mark_node)
7580 return error_mark_node;
7582 /* Parse the new-declarator. */
7583 new_declarator = cp_parser_new_declarator_opt (parser);
7585 /* Determine the number of elements in the last array dimension, if
7586 any. */
7587 *nelts = NULL_TREE;
7588 /* Skip down to the last array dimension. */
7589 declarator = new_declarator;
7590 outer_declarator = NULL;
7591 while (declarator && (declarator->kind == cdk_pointer
7592 || declarator->kind == cdk_ptrmem))
7594 outer_declarator = declarator;
7595 declarator = declarator->declarator;
7597 while (declarator
7598 && declarator->kind == cdk_array
7599 && declarator->declarator
7600 && declarator->declarator->kind == cdk_array)
7602 outer_declarator = declarator;
7603 declarator = declarator->declarator;
7606 if (declarator && declarator->kind == cdk_array)
7608 *nelts = declarator->u.array.bounds;
7609 if (*nelts == error_mark_node)
7610 *nelts = integer_one_node;
7612 if (outer_declarator)
7613 outer_declarator->declarator = declarator->declarator;
7614 else
7615 new_declarator = NULL;
7618 return groktypename (&type_specifier_seq, new_declarator, false);
7621 /* Parse an (optional) new-declarator.
7623 new-declarator:
7624 ptr-operator new-declarator [opt]
7625 direct-new-declarator
7627 Returns the declarator. */
7629 static cp_declarator *
7630 cp_parser_new_declarator_opt (cp_parser* parser)
7632 enum tree_code code;
7633 tree type, std_attributes = NULL_TREE;
7634 cp_cv_quals cv_quals;
7636 /* We don't know if there's a ptr-operator next, or not. */
7637 cp_parser_parse_tentatively (parser);
7638 /* Look for a ptr-operator. */
7639 code = cp_parser_ptr_operator (parser, &type, &cv_quals, &std_attributes);
7640 /* If that worked, look for more new-declarators. */
7641 if (cp_parser_parse_definitely (parser))
7643 cp_declarator *declarator;
7645 /* Parse another optional declarator. */
7646 declarator = cp_parser_new_declarator_opt (parser);
7648 declarator = cp_parser_make_indirect_declarator
7649 (code, type, cv_quals, declarator, std_attributes);
7651 return declarator;
7654 /* If the next token is a `[', there is a direct-new-declarator. */
7655 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
7656 return cp_parser_direct_new_declarator (parser);
7658 return NULL;
7661 /* Parse a direct-new-declarator.
7663 direct-new-declarator:
7664 [ expression ]
7665 direct-new-declarator [constant-expression]
7669 static cp_declarator *
7670 cp_parser_direct_new_declarator (cp_parser* parser)
7672 cp_declarator *declarator = NULL;
7674 while (true)
7676 tree expression;
7677 cp_token *token;
7679 /* Look for the opening `['. */
7680 cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
7682 token = cp_lexer_peek_token (parser->lexer);
7683 expression = cp_parser_expression (parser);
7684 /* The standard requires that the expression have integral
7685 type. DR 74 adds enumeration types. We believe that the
7686 real intent is that these expressions be handled like the
7687 expression in a `switch' condition, which also allows
7688 classes with a single conversion to integral or
7689 enumeration type. */
7690 if (!processing_template_decl)
7692 expression
7693 = build_expr_type_conversion (WANT_INT | WANT_ENUM,
7694 expression,
7695 /*complain=*/true);
7696 if (!expression)
7698 error_at (token->location,
7699 "expression in new-declarator must have integral "
7700 "or enumeration type");
7701 expression = error_mark_node;
7705 /* Look for the closing `]'. */
7706 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
7708 /* Add this bound to the declarator. */
7709 declarator = make_array_declarator (declarator, expression);
7711 /* If the next token is not a `[', then there are no more
7712 bounds. */
7713 if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
7714 break;
7717 return declarator;
7720 /* Parse a new-initializer.
7722 new-initializer:
7723 ( expression-list [opt] )
7724 braced-init-list
7726 Returns a representation of the expression-list. */
7728 static vec<tree, va_gc> *
7729 cp_parser_new_initializer (cp_parser* parser)
7731 vec<tree, va_gc> *expression_list;
7733 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
7735 tree t;
7736 bool expr_non_constant_p;
7737 cp_lexer_set_source_position (parser->lexer);
7738 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
7739 t = cp_parser_braced_list (parser, &expr_non_constant_p);
7740 CONSTRUCTOR_IS_DIRECT_INIT (t) = 1;
7741 expression_list = make_tree_vector_single (t);
7743 else
7744 expression_list = (cp_parser_parenthesized_expression_list
7745 (parser, non_attr, /*cast_p=*/false,
7746 /*allow_expansion_p=*/true,
7747 /*non_constant_p=*/NULL));
7749 return expression_list;
7752 /* Parse a delete-expression.
7754 delete-expression:
7755 :: [opt] delete cast-expression
7756 :: [opt] delete [ ] cast-expression
7758 Returns a representation of the expression. */
7760 static tree
7761 cp_parser_delete_expression (cp_parser* parser)
7763 bool global_scope_p;
7764 bool array_p;
7765 tree expression;
7767 /* Look for the optional `::' operator. */
7768 global_scope_p
7769 = (cp_parser_global_scope_opt (parser,
7770 /*current_scope_valid_p=*/false)
7771 != NULL_TREE);
7772 /* Look for the `delete' keyword. */
7773 cp_parser_require_keyword (parser, RID_DELETE, RT_DELETE);
7774 /* See if the array syntax is in use. */
7775 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
7777 /* Consume the `[' token. */
7778 cp_lexer_consume_token (parser->lexer);
7779 /* Look for the `]' token. */
7780 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
7781 /* Remember that this is the `[]' construct. */
7782 array_p = true;
7784 else
7785 array_p = false;
7787 /* Parse the cast-expression. */
7788 expression = cp_parser_simple_cast_expression (parser);
7790 /* A delete-expression may not appear in an integral constant
7791 expression. */
7792 if (cp_parser_non_integral_constant_expression (parser, NIC_DEL))
7793 return error_mark_node;
7795 return delete_sanity (expression, NULL_TREE, array_p, global_scope_p,
7796 tf_warning_or_error);
7799 /* Returns 1 if TOKEN may start a cast-expression and isn't '++', '--',
7800 neither '[' in C++11; -1 if TOKEN is '++', '--', or '[' in C++11;
7801 0 otherwise. */
7803 static int
7804 cp_parser_tokens_start_cast_expression (cp_parser *parser)
7806 cp_token *token = cp_lexer_peek_token (parser->lexer);
7807 switch (token->type)
7809 case CPP_COMMA:
7810 case CPP_SEMICOLON:
7811 case CPP_QUERY:
7812 case CPP_COLON:
7813 case CPP_CLOSE_SQUARE:
7814 case CPP_CLOSE_PAREN:
7815 case CPP_CLOSE_BRACE:
7816 case CPP_OPEN_BRACE:
7817 case CPP_DOT:
7818 case CPP_DOT_STAR:
7819 case CPP_DEREF:
7820 case CPP_DEREF_STAR:
7821 case CPP_DIV:
7822 case CPP_MOD:
7823 case CPP_LSHIFT:
7824 case CPP_RSHIFT:
7825 case CPP_LESS:
7826 case CPP_GREATER:
7827 case CPP_LESS_EQ:
7828 case CPP_GREATER_EQ:
7829 case CPP_EQ_EQ:
7830 case CPP_NOT_EQ:
7831 case CPP_EQ:
7832 case CPP_MULT_EQ:
7833 case CPP_DIV_EQ:
7834 case CPP_MOD_EQ:
7835 case CPP_PLUS_EQ:
7836 case CPP_MINUS_EQ:
7837 case CPP_RSHIFT_EQ:
7838 case CPP_LSHIFT_EQ:
7839 case CPP_AND_EQ:
7840 case CPP_XOR_EQ:
7841 case CPP_OR_EQ:
7842 case CPP_XOR:
7843 case CPP_OR:
7844 case CPP_OR_OR:
7845 case CPP_EOF:
7846 case CPP_ELLIPSIS:
7847 return 0;
7849 case CPP_OPEN_PAREN:
7850 /* In ((type ()) () the last () isn't a valid cast-expression,
7851 so the whole must be parsed as postfix-expression. */
7852 return cp_lexer_peek_nth_token (parser->lexer, 2)->type
7853 != CPP_CLOSE_PAREN;
7855 case CPP_OPEN_SQUARE:
7856 /* '[' may start a primary-expression in obj-c++ and in C++11,
7857 as a lambda-expression, eg, '(void)[]{}'. */
7858 if (cxx_dialect >= cxx11)
7859 return -1;
7860 return c_dialect_objc ();
7862 case CPP_PLUS_PLUS:
7863 case CPP_MINUS_MINUS:
7864 /* '++' and '--' may or may not start a cast-expression:
7866 struct T { void operator++(int); };
7867 void f() { (T())++; }
7871 int a;
7872 (int)++a; */
7873 return -1;
7875 default:
7876 return 1;
7880 /* Parse a cast-expression.
7882 cast-expression:
7883 unary-expression
7884 ( type-id ) cast-expression
7886 ADDRESS_P is true iff the unary-expression is appearing as the
7887 operand of the `&' operator. CAST_P is true if this expression is
7888 the target of a cast.
7890 Returns a representation of the expression. */
7892 static tree
7893 cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p,
7894 bool decltype_p, cp_id_kind * pidk)
7896 /* If it's a `(', then we might be looking at a cast. */
7897 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
7899 tree type = NULL_TREE;
7900 tree expr = NULL_TREE;
7901 int cast_expression = 0;
7902 const char *saved_message;
7904 /* There's no way to know yet whether or not this is a cast.
7905 For example, `(int (3))' is a unary-expression, while `(int)
7906 3' is a cast. So, we resort to parsing tentatively. */
7907 cp_parser_parse_tentatively (parser);
7908 /* Types may not be defined in a cast. */
7909 saved_message = parser->type_definition_forbidden_message;
7910 parser->type_definition_forbidden_message
7911 = G_("types may not be defined in casts");
7912 /* Consume the `('. */
7913 cp_lexer_consume_token (parser->lexer);
7914 /* A very tricky bit is that `(struct S) { 3 }' is a
7915 compound-literal (which we permit in C++ as an extension).
7916 But, that construct is not a cast-expression -- it is a
7917 postfix-expression. (The reason is that `(struct S) { 3 }.i'
7918 is legal; if the compound-literal were a cast-expression,
7919 you'd need an extra set of parentheses.) But, if we parse
7920 the type-id, and it happens to be a class-specifier, then we
7921 will commit to the parse at that point, because we cannot
7922 undo the action that is done when creating a new class. So,
7923 then we cannot back up and do a postfix-expression.
7925 Another tricky case is the following (c++/29234):
7927 struct S { void operator () (); };
7929 void foo ()
7931 ( S()() );
7934 As a type-id we parse the parenthesized S()() as a function
7935 returning a function, groktypename complains and we cannot
7936 back up in this case either.
7938 Therefore, we scan ahead to the closing `)', and check to see
7939 if the tokens after the `)' can start a cast-expression. Otherwise
7940 we are dealing with an unary-expression, a postfix-expression
7941 or something else.
7943 Yet another tricky case, in C++11, is the following (c++/54891):
7945 (void)[]{};
7947 The issue is that usually, besides the case of lambda-expressions,
7948 the parenthesized type-id cannot be followed by '[', and, eg, we
7949 want to parse '(C ())[2];' in parse/pr26997.C as unary-expression.
7950 Thus, if cp_parser_tokens_start_cast_expression returns -1, below
7951 we don't commit, we try a cast-expression, then an unary-expression.
7953 Save tokens so that we can put them back. */
7954 cp_lexer_save_tokens (parser->lexer);
7956 /* We may be looking at a cast-expression. */
7957 if (cp_parser_skip_to_closing_parenthesis (parser, false, false,
7958 /*consume_paren=*/true))
7959 cast_expression
7960 = cp_parser_tokens_start_cast_expression (parser);
7962 /* Roll back the tokens we skipped. */
7963 cp_lexer_rollback_tokens (parser->lexer);
7964 /* If we aren't looking at a cast-expression, simulate an error so
7965 that the call to cp_parser_error_occurred below returns true. */
7966 if (!cast_expression)
7967 cp_parser_simulate_error (parser);
7968 else
7970 bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
7971 parser->in_type_id_in_expr_p = true;
7972 /* Look for the type-id. */
7973 type = cp_parser_type_id (parser);
7974 /* Look for the closing `)'. */
7975 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7976 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
7979 /* Restore the saved message. */
7980 parser->type_definition_forbidden_message = saved_message;
7982 /* At this point this can only be either a cast or a
7983 parenthesized ctor such as `(T ())' that looks like a cast to
7984 function returning T. */
7985 if (!cp_parser_error_occurred (parser))
7987 /* Only commit if the cast-expression doesn't start with
7988 '++', '--', or '[' in C++11. */
7989 if (cast_expression > 0)
7990 cp_parser_commit_to_topmost_tentative_parse (parser);
7992 expr = cp_parser_cast_expression (parser,
7993 /*address_p=*/false,
7994 /*cast_p=*/true,
7995 /*decltype_p=*/false,
7996 pidk);
7998 if (cp_parser_parse_definitely (parser))
8000 /* Warn about old-style casts, if so requested. */
8001 if (warn_old_style_cast
8002 && !in_system_header_at (input_location)
8003 && !VOID_TYPE_P (type)
8004 && current_lang_name != lang_name_c)
8005 warning (OPT_Wold_style_cast, "use of old-style cast");
8007 /* Only type conversions to integral or enumeration types
8008 can be used in constant-expressions. */
8009 if (!cast_valid_in_integral_constant_expression_p (type)
8010 && cp_parser_non_integral_constant_expression (parser,
8011 NIC_CAST))
8012 return error_mark_node;
8014 /* Perform the cast. */
8015 expr = build_c_cast (input_location, type, expr);
8016 return expr;
8019 else
8020 cp_parser_abort_tentative_parse (parser);
8023 /* If we get here, then it's not a cast, so it must be a
8024 unary-expression. */
8025 return cp_parser_unary_expression (parser, pidk, address_p,
8026 cast_p, decltype_p);
8029 /* Parse a binary expression of the general form:
8031 pm-expression:
8032 cast-expression
8033 pm-expression .* cast-expression
8034 pm-expression ->* cast-expression
8036 multiplicative-expression:
8037 pm-expression
8038 multiplicative-expression * pm-expression
8039 multiplicative-expression / pm-expression
8040 multiplicative-expression % pm-expression
8042 additive-expression:
8043 multiplicative-expression
8044 additive-expression + multiplicative-expression
8045 additive-expression - multiplicative-expression
8047 shift-expression:
8048 additive-expression
8049 shift-expression << additive-expression
8050 shift-expression >> additive-expression
8052 relational-expression:
8053 shift-expression
8054 relational-expression < shift-expression
8055 relational-expression > shift-expression
8056 relational-expression <= shift-expression
8057 relational-expression >= shift-expression
8059 GNU Extension:
8061 relational-expression:
8062 relational-expression <? shift-expression
8063 relational-expression >? shift-expression
8065 equality-expression:
8066 relational-expression
8067 equality-expression == relational-expression
8068 equality-expression != relational-expression
8070 and-expression:
8071 equality-expression
8072 and-expression & equality-expression
8074 exclusive-or-expression:
8075 and-expression
8076 exclusive-or-expression ^ and-expression
8078 inclusive-or-expression:
8079 exclusive-or-expression
8080 inclusive-or-expression | exclusive-or-expression
8082 logical-and-expression:
8083 inclusive-or-expression
8084 logical-and-expression && inclusive-or-expression
8086 logical-or-expression:
8087 logical-and-expression
8088 logical-or-expression || logical-and-expression
8090 All these are implemented with a single function like:
8092 binary-expression:
8093 simple-cast-expression
8094 binary-expression <token> binary-expression
8096 CAST_P is true if this expression is the target of a cast.
8098 The binops_by_token map is used to get the tree codes for each <token> type.
8099 binary-expressions are associated according to a precedence table. */
8101 #define TOKEN_PRECEDENCE(token) \
8102 (((token->type == CPP_GREATER \
8103 || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT)) \
8104 && !parser->greater_than_is_operator_p) \
8105 ? PREC_NOT_OPERATOR \
8106 : binops_by_token[token->type].prec)
8108 static tree
8109 cp_parser_binary_expression (cp_parser* parser, bool cast_p,
8110 bool no_toplevel_fold_p,
8111 bool decltype_p,
8112 enum cp_parser_prec prec,
8113 cp_id_kind * pidk)
8115 cp_parser_expression_stack stack;
8116 cp_parser_expression_stack_entry *sp = &stack[0];
8117 cp_parser_expression_stack_entry current;
8118 tree rhs;
8119 cp_token *token;
8120 enum tree_code rhs_type;
8121 enum cp_parser_prec new_prec, lookahead_prec;
8122 tree overload;
8124 /* Parse the first expression. */
8125 current.lhs_type = (cp_lexer_next_token_is (parser->lexer, CPP_NOT)
8126 ? TRUTH_NOT_EXPR : ERROR_MARK);
8127 current.lhs = cp_parser_cast_expression (parser, /*address_p=*/false,
8128 cast_p, decltype_p, pidk);
8129 current.prec = prec;
8131 if (cp_parser_error_occurred (parser))
8132 return error_mark_node;
8134 for (;;)
8136 /* Get an operator token. */
8137 token = cp_lexer_peek_token (parser->lexer);
8139 if (warn_cxx0x_compat
8140 && token->type == CPP_RSHIFT
8141 && !parser->greater_than_is_operator_p)
8143 if (warning_at (token->location, OPT_Wc__0x_compat,
8144 "%<>>%> operator is treated"
8145 " as two right angle brackets in C++11"))
8146 inform (token->location,
8147 "suggest parentheses around %<>>%> expression");
8150 new_prec = TOKEN_PRECEDENCE (token);
8152 /* Popping an entry off the stack means we completed a subexpression:
8153 - either we found a token which is not an operator (`>' where it is not
8154 an operator, or prec == PREC_NOT_OPERATOR), in which case popping
8155 will happen repeatedly;
8156 - or, we found an operator which has lower priority. This is the case
8157 where the recursive descent *ascends*, as in `3 * 4 + 5' after
8158 parsing `3 * 4'. */
8159 if (new_prec <= current.prec)
8161 if (sp == stack)
8162 break;
8163 else
8164 goto pop;
8167 get_rhs:
8168 current.tree_type = binops_by_token[token->type].tree_type;
8169 current.loc = token->location;
8171 /* We used the operator token. */
8172 cp_lexer_consume_token (parser->lexer);
8174 /* For "false && x" or "true || x", x will never be executed;
8175 disable warnings while evaluating it. */
8176 if (current.tree_type == TRUTH_ANDIF_EXPR)
8177 c_inhibit_evaluation_warnings += current.lhs == truthvalue_false_node;
8178 else if (current.tree_type == TRUTH_ORIF_EXPR)
8179 c_inhibit_evaluation_warnings += current.lhs == truthvalue_true_node;
8181 /* Extract another operand. It may be the RHS of this expression
8182 or the LHS of a new, higher priority expression. */
8183 rhs_type = (cp_lexer_next_token_is (parser->lexer, CPP_NOT)
8184 ? TRUTH_NOT_EXPR : ERROR_MARK);
8185 rhs = cp_parser_simple_cast_expression (parser);
8187 /* Get another operator token. Look up its precedence to avoid
8188 building a useless (immediately popped) stack entry for common
8189 cases such as 3 + 4 + 5 or 3 * 4 + 5. */
8190 token = cp_lexer_peek_token (parser->lexer);
8191 lookahead_prec = TOKEN_PRECEDENCE (token);
8192 if (lookahead_prec > new_prec)
8194 /* ... and prepare to parse the RHS of the new, higher priority
8195 expression. Since precedence levels on the stack are
8196 monotonically increasing, we do not have to care about
8197 stack overflows. */
8198 *sp = current;
8199 ++sp;
8200 current.lhs = rhs;
8201 current.lhs_type = rhs_type;
8202 current.prec = new_prec;
8203 new_prec = lookahead_prec;
8204 goto get_rhs;
8206 pop:
8207 lookahead_prec = new_prec;
8208 /* If the stack is not empty, we have parsed into LHS the right side
8209 (`4' in the example above) of an expression we had suspended.
8210 We can use the information on the stack to recover the LHS (`3')
8211 from the stack together with the tree code (`MULT_EXPR'), and
8212 the precedence of the higher level subexpression
8213 (`PREC_ADDITIVE_EXPRESSION'). TOKEN is the CPP_PLUS token,
8214 which will be used to actually build the additive expression. */
8215 rhs = current.lhs;
8216 rhs_type = current.lhs_type;
8217 --sp;
8218 current = *sp;
8221 /* Undo the disabling of warnings done above. */
8222 if (current.tree_type == TRUTH_ANDIF_EXPR)
8223 c_inhibit_evaluation_warnings -= current.lhs == truthvalue_false_node;
8224 else if (current.tree_type == TRUTH_ORIF_EXPR)
8225 c_inhibit_evaluation_warnings -= current.lhs == truthvalue_true_node;
8227 if (warn_logical_not_paren
8228 && current.lhs_type == TRUTH_NOT_EXPR)
8229 warn_logical_not_parentheses (current.loc, current.tree_type, rhs);
8231 overload = NULL;
8232 /* ??? Currently we pass lhs_type == ERROR_MARK and rhs_type ==
8233 ERROR_MARK for everything that is not a binary expression.
8234 This makes warn_about_parentheses miss some warnings that
8235 involve unary operators. For unary expressions we should
8236 pass the correct tree_code unless the unary expression was
8237 surrounded by parentheses.
8239 if (no_toplevel_fold_p
8240 && lookahead_prec <= current.prec
8241 && sp == stack)
8242 current.lhs = build2 (current.tree_type,
8243 TREE_CODE_CLASS (current.tree_type)
8244 == tcc_comparison
8245 ? boolean_type_node : TREE_TYPE (current.lhs),
8246 current.lhs, rhs);
8247 else
8248 current.lhs = build_x_binary_op (current.loc, current.tree_type,
8249 current.lhs, current.lhs_type,
8250 rhs, rhs_type, &overload,
8251 complain_flags (decltype_p));
8252 current.lhs_type = current.tree_type;
8253 if (EXPR_P (current.lhs))
8254 SET_EXPR_LOCATION (current.lhs, current.loc);
8256 /* If the binary operator required the use of an overloaded operator,
8257 then this expression cannot be an integral constant-expression.
8258 An overloaded operator can be used even if both operands are
8259 otherwise permissible in an integral constant-expression if at
8260 least one of the operands is of enumeration type. */
8262 if (overload
8263 && cp_parser_non_integral_constant_expression (parser,
8264 NIC_OVERLOADED))
8265 return error_mark_node;
8268 return current.lhs;
8271 static tree
8272 cp_parser_binary_expression (cp_parser* parser, bool cast_p,
8273 bool no_toplevel_fold_p,
8274 enum cp_parser_prec prec,
8275 cp_id_kind * pidk)
8277 return cp_parser_binary_expression (parser, cast_p, no_toplevel_fold_p,
8278 /*decltype*/false, prec, pidk);
8281 /* Parse the `? expression : assignment-expression' part of a
8282 conditional-expression. The LOGICAL_OR_EXPR is the
8283 logical-or-expression that started the conditional-expression.
8284 Returns a representation of the entire conditional-expression.
8286 This routine is used by cp_parser_assignment_expression.
8288 ? expression : assignment-expression
8290 GNU Extensions:
8292 ? : assignment-expression */
8294 static tree
8295 cp_parser_question_colon_clause (cp_parser* parser, tree logical_or_expr)
8297 tree expr;
8298 tree assignment_expr;
8299 struct cp_token *token;
8300 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
8302 /* Consume the `?' token. */
8303 cp_lexer_consume_token (parser->lexer);
8304 token = cp_lexer_peek_token (parser->lexer);
8305 if (cp_parser_allow_gnu_extensions_p (parser)
8306 && token->type == CPP_COLON)
8308 pedwarn (token->location, OPT_Wpedantic,
8309 "ISO C++ does not allow ?: with omitted middle operand");
8310 /* Implicit true clause. */
8311 expr = NULL_TREE;
8312 c_inhibit_evaluation_warnings += logical_or_expr == truthvalue_true_node;
8313 warn_for_omitted_condop (token->location, logical_or_expr);
8315 else
8317 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
8318 parser->colon_corrects_to_scope_p = false;
8319 /* Parse the expression. */
8320 c_inhibit_evaluation_warnings += logical_or_expr == truthvalue_false_node;
8321 expr = cp_parser_expression (parser);
8322 c_inhibit_evaluation_warnings +=
8323 ((logical_or_expr == truthvalue_true_node)
8324 - (logical_or_expr == truthvalue_false_node));
8325 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
8328 /* The next token should be a `:'. */
8329 cp_parser_require (parser, CPP_COLON, RT_COLON);
8330 /* Parse the assignment-expression. */
8331 assignment_expr = cp_parser_assignment_expression (parser);
8332 c_inhibit_evaluation_warnings -= logical_or_expr == truthvalue_true_node;
8334 /* Build the conditional-expression. */
8335 return build_x_conditional_expr (loc, logical_or_expr,
8336 expr,
8337 assignment_expr,
8338 tf_warning_or_error);
8341 /* Parse an assignment-expression.
8343 assignment-expression:
8344 conditional-expression
8345 logical-or-expression assignment-operator assignment_expression
8346 throw-expression
8348 CAST_P is true if this expression is the target of a cast.
8349 DECLTYPE_P is true if this expression is the operand of decltype.
8351 Returns a representation for the expression. */
8353 static tree
8354 cp_parser_assignment_expression (cp_parser* parser, cp_id_kind * pidk,
8355 bool cast_p, bool decltype_p)
8357 tree expr;
8359 /* If the next token is the `throw' keyword, then we're looking at
8360 a throw-expression. */
8361 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THROW))
8362 expr = cp_parser_throw_expression (parser);
8363 /* Otherwise, it must be that we are looking at a
8364 logical-or-expression. */
8365 else
8367 /* Parse the binary expressions (logical-or-expression). */
8368 expr = cp_parser_binary_expression (parser, cast_p, false,
8369 decltype_p,
8370 PREC_NOT_OPERATOR, pidk);
8371 /* If the next token is a `?' then we're actually looking at a
8372 conditional-expression. */
8373 if (cp_lexer_next_token_is (parser->lexer, CPP_QUERY))
8374 return cp_parser_question_colon_clause (parser, expr);
8375 else
8377 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
8379 /* If it's an assignment-operator, we're using the second
8380 production. */
8381 enum tree_code assignment_operator
8382 = cp_parser_assignment_operator_opt (parser);
8383 if (assignment_operator != ERROR_MARK)
8385 bool non_constant_p;
8386 location_t saved_input_location;
8388 /* Parse the right-hand side of the assignment. */
8389 tree rhs = cp_parser_initializer_clause (parser, &non_constant_p);
8391 if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
8392 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
8394 /* An assignment may not appear in a
8395 constant-expression. */
8396 if (cp_parser_non_integral_constant_expression (parser,
8397 NIC_ASSIGNMENT))
8398 return error_mark_node;
8399 /* Build the assignment expression. Its default
8400 location is the location of the '=' token. */
8401 saved_input_location = input_location;
8402 input_location = loc;
8403 expr = build_x_modify_expr (loc, expr,
8404 assignment_operator,
8405 rhs,
8406 complain_flags (decltype_p));
8407 input_location = saved_input_location;
8412 return expr;
8415 /* Parse an (optional) assignment-operator.
8417 assignment-operator: one of
8418 = *= /= %= += -= >>= <<= &= ^= |=
8420 GNU Extension:
8422 assignment-operator: one of
8423 <?= >?=
8425 If the next token is an assignment operator, the corresponding tree
8426 code is returned, and the token is consumed. For example, for
8427 `+=', PLUS_EXPR is returned. For `=' itself, the code returned is
8428 NOP_EXPR. For `/', TRUNC_DIV_EXPR is returned; for `%',
8429 TRUNC_MOD_EXPR is returned. If TOKEN is not an assignment
8430 operator, ERROR_MARK is returned. */
8432 static enum tree_code
8433 cp_parser_assignment_operator_opt (cp_parser* parser)
8435 enum tree_code op;
8436 cp_token *token;
8438 /* Peek at the next token. */
8439 token = cp_lexer_peek_token (parser->lexer);
8441 switch (token->type)
8443 case CPP_EQ:
8444 op = NOP_EXPR;
8445 break;
8447 case CPP_MULT_EQ:
8448 op = MULT_EXPR;
8449 break;
8451 case CPP_DIV_EQ:
8452 op = TRUNC_DIV_EXPR;
8453 break;
8455 case CPP_MOD_EQ:
8456 op = TRUNC_MOD_EXPR;
8457 break;
8459 case CPP_PLUS_EQ:
8460 op = PLUS_EXPR;
8461 break;
8463 case CPP_MINUS_EQ:
8464 op = MINUS_EXPR;
8465 break;
8467 case CPP_RSHIFT_EQ:
8468 op = RSHIFT_EXPR;
8469 break;
8471 case CPP_LSHIFT_EQ:
8472 op = LSHIFT_EXPR;
8473 break;
8475 case CPP_AND_EQ:
8476 op = BIT_AND_EXPR;
8477 break;
8479 case CPP_XOR_EQ:
8480 op = BIT_XOR_EXPR;
8481 break;
8483 case CPP_OR_EQ:
8484 op = BIT_IOR_EXPR;
8485 break;
8487 default:
8488 /* Nothing else is an assignment operator. */
8489 op = ERROR_MARK;
8492 /* If it was an assignment operator, consume it. */
8493 if (op != ERROR_MARK)
8494 cp_lexer_consume_token (parser->lexer);
8496 return op;
8499 /* Parse an expression.
8501 expression:
8502 assignment-expression
8503 expression , assignment-expression
8505 CAST_P is true if this expression is the target of a cast.
8506 DECLTYPE_P is true if this expression is the immediate operand of decltype,
8507 except possibly parenthesized or on the RHS of a comma (N3276).
8509 Returns a representation of the expression. */
8511 static tree
8512 cp_parser_expression (cp_parser* parser, cp_id_kind * pidk,
8513 bool cast_p, bool decltype_p)
8515 tree expression = NULL_TREE;
8516 location_t loc = UNKNOWN_LOCATION;
8518 while (true)
8520 tree assignment_expression;
8522 /* Parse the next assignment-expression. */
8523 assignment_expression
8524 = cp_parser_assignment_expression (parser, pidk, cast_p, decltype_p);
8526 /* We don't create a temporary for a call that is the immediate operand
8527 of decltype or on the RHS of a comma. But when we see a comma, we
8528 need to create a temporary for a call on the LHS. */
8529 if (decltype_p && !processing_template_decl
8530 && TREE_CODE (assignment_expression) == CALL_EXPR
8531 && CLASS_TYPE_P (TREE_TYPE (assignment_expression))
8532 && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
8533 assignment_expression
8534 = build_cplus_new (TREE_TYPE (assignment_expression),
8535 assignment_expression, tf_warning_or_error);
8537 /* If this is the first assignment-expression, we can just
8538 save it away. */
8539 if (!expression)
8540 expression = assignment_expression;
8541 else
8542 expression = build_x_compound_expr (loc, expression,
8543 assignment_expression,
8544 complain_flags (decltype_p));
8545 /* If the next token is not a comma, then we are done with the
8546 expression. */
8547 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
8548 break;
8549 /* Consume the `,'. */
8550 loc = cp_lexer_peek_token (parser->lexer)->location;
8551 cp_lexer_consume_token (parser->lexer);
8552 /* A comma operator cannot appear in a constant-expression. */
8553 if (cp_parser_non_integral_constant_expression (parser, NIC_COMMA))
8554 expression = error_mark_node;
8557 return expression;
8560 /* Parse a constant-expression.
8562 constant-expression:
8563 conditional-expression
8565 If ALLOW_NON_CONSTANT_P a non-constant expression is silently
8566 accepted. If ALLOW_NON_CONSTANT_P is true and the expression is not
8567 constant, *NON_CONSTANT_P is set to TRUE. If ALLOW_NON_CONSTANT_P
8568 is false, NON_CONSTANT_P should be NULL. */
8570 static tree
8571 cp_parser_constant_expression (cp_parser* parser,
8572 bool allow_non_constant_p,
8573 bool *non_constant_p)
8575 bool saved_integral_constant_expression_p;
8576 bool saved_allow_non_integral_constant_expression_p;
8577 bool saved_non_integral_constant_expression_p;
8578 tree expression;
8580 /* It might seem that we could simply parse the
8581 conditional-expression, and then check to see if it were
8582 TREE_CONSTANT. However, an expression that is TREE_CONSTANT is
8583 one that the compiler can figure out is constant, possibly after
8584 doing some simplifications or optimizations. The standard has a
8585 precise definition of constant-expression, and we must honor
8586 that, even though it is somewhat more restrictive.
8588 For example:
8590 int i[(2, 3)];
8592 is not a legal declaration, because `(2, 3)' is not a
8593 constant-expression. The `,' operator is forbidden in a
8594 constant-expression. However, GCC's constant-folding machinery
8595 will fold this operation to an INTEGER_CST for `3'. */
8597 /* Save the old settings. */
8598 saved_integral_constant_expression_p = parser->integral_constant_expression_p;
8599 saved_allow_non_integral_constant_expression_p
8600 = parser->allow_non_integral_constant_expression_p;
8601 saved_non_integral_constant_expression_p = parser->non_integral_constant_expression_p;
8602 /* We are now parsing a constant-expression. */
8603 parser->integral_constant_expression_p = true;
8604 parser->allow_non_integral_constant_expression_p
8605 = (allow_non_constant_p || cxx_dialect >= cxx11);
8606 parser->non_integral_constant_expression_p = false;
8607 /* Although the grammar says "conditional-expression", we parse an
8608 "assignment-expression", which also permits "throw-expression"
8609 and the use of assignment operators. In the case that
8610 ALLOW_NON_CONSTANT_P is false, we get better errors than we would
8611 otherwise. In the case that ALLOW_NON_CONSTANT_P is true, it is
8612 actually essential that we look for an assignment-expression.
8613 For example, cp_parser_initializer_clauses uses this function to
8614 determine whether a particular assignment-expression is in fact
8615 constant. */
8616 expression = cp_parser_assignment_expression (parser);
8617 /* Restore the old settings. */
8618 parser->integral_constant_expression_p
8619 = saved_integral_constant_expression_p;
8620 parser->allow_non_integral_constant_expression_p
8621 = saved_allow_non_integral_constant_expression_p;
8622 if (cxx_dialect >= cxx11)
8624 /* Require an rvalue constant expression here; that's what our
8625 callers expect. Reference constant expressions are handled
8626 separately in e.g. cp_parser_template_argument. */
8627 bool is_const = potential_rvalue_constant_expression (expression);
8628 parser->non_integral_constant_expression_p = !is_const;
8629 if (!is_const && !allow_non_constant_p)
8630 require_potential_rvalue_constant_expression (expression);
8632 if (allow_non_constant_p)
8633 *non_constant_p = parser->non_integral_constant_expression_p;
8634 parser->non_integral_constant_expression_p
8635 = saved_non_integral_constant_expression_p;
8637 return expression;
8640 /* Parse __builtin_offsetof.
8642 offsetof-expression:
8643 "__builtin_offsetof" "(" type-id "," offsetof-member-designator ")"
8645 offsetof-member-designator:
8646 id-expression
8647 | offsetof-member-designator "." id-expression
8648 | offsetof-member-designator "[" expression "]"
8649 | offsetof-member-designator "->" id-expression */
8651 static tree
8652 cp_parser_builtin_offsetof (cp_parser *parser)
8654 int save_ice_p, save_non_ice_p;
8655 tree type, expr;
8656 cp_id_kind dummy;
8657 cp_token *token;
8659 /* We're about to accept non-integral-constant things, but will
8660 definitely yield an integral constant expression. Save and
8661 restore these values around our local parsing. */
8662 save_ice_p = parser->integral_constant_expression_p;
8663 save_non_ice_p = parser->non_integral_constant_expression_p;
8665 /* Consume the "__builtin_offsetof" token. */
8666 cp_lexer_consume_token (parser->lexer);
8667 /* Consume the opening `('. */
8668 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8669 /* Parse the type-id. */
8670 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
8671 type = cp_parser_type_id (parser);
8672 /* Look for the `,'. */
8673 cp_parser_require (parser, CPP_COMMA, RT_COMMA);
8674 token = cp_lexer_peek_token (parser->lexer);
8676 /* Build the (type *)null that begins the traditional offsetof macro. */
8677 expr = build_static_cast (build_pointer_type (type), null_pointer_node,
8678 tf_warning_or_error);
8680 /* Parse the offsetof-member-designator. We begin as if we saw "expr->". */
8681 expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DEREF, expr,
8682 true, &dummy, token->location);
8683 while (true)
8685 token = cp_lexer_peek_token (parser->lexer);
8686 switch (token->type)
8688 case CPP_OPEN_SQUARE:
8689 /* offsetof-member-designator "[" expression "]" */
8690 expr = cp_parser_postfix_open_square_expression (parser, expr,
8691 true, false);
8692 break;
8694 case CPP_DEREF:
8695 /* offsetof-member-designator "->" identifier */
8696 expr = grok_array_decl (token->location, expr,
8697 integer_zero_node, false);
8698 /* FALLTHRU */
8700 case CPP_DOT:
8701 /* offsetof-member-designator "." identifier */
8702 cp_lexer_consume_token (parser->lexer);
8703 expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT,
8704 expr, true, &dummy,
8705 token->location);
8706 break;
8708 case CPP_CLOSE_PAREN:
8709 /* Consume the ")" token. */
8710 cp_lexer_consume_token (parser->lexer);
8711 goto success;
8713 default:
8714 /* Error. We know the following require will fail, but
8715 that gives the proper error message. */
8716 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8717 cp_parser_skip_to_closing_parenthesis (parser, true, false, true);
8718 expr = error_mark_node;
8719 goto failure;
8723 success:
8724 /* If we're processing a template, we can't finish the semantics yet.
8725 Otherwise we can fold the entire expression now. */
8726 if (processing_template_decl)
8728 expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
8729 SET_EXPR_LOCATION (expr, loc);
8731 else
8732 expr = finish_offsetof (expr, loc);
8734 failure:
8735 parser->integral_constant_expression_p = save_ice_p;
8736 parser->non_integral_constant_expression_p = save_non_ice_p;
8738 return expr;
8741 /* Parse a trait expression.
8743 Returns a representation of the expression, the underlying type
8744 of the type at issue when KEYWORD is RID_UNDERLYING_TYPE. */
8746 static tree
8747 cp_parser_trait_expr (cp_parser* parser, enum rid keyword)
8749 cp_trait_kind kind;
8750 tree type1, type2 = NULL_TREE;
8751 bool binary = false;
8752 bool variadic = false;
8754 switch (keyword)
8756 case RID_HAS_NOTHROW_ASSIGN:
8757 kind = CPTK_HAS_NOTHROW_ASSIGN;
8758 break;
8759 case RID_HAS_NOTHROW_CONSTRUCTOR:
8760 kind = CPTK_HAS_NOTHROW_CONSTRUCTOR;
8761 break;
8762 case RID_HAS_NOTHROW_COPY:
8763 kind = CPTK_HAS_NOTHROW_COPY;
8764 break;
8765 case RID_HAS_TRIVIAL_ASSIGN:
8766 kind = CPTK_HAS_TRIVIAL_ASSIGN;
8767 break;
8768 case RID_HAS_TRIVIAL_CONSTRUCTOR:
8769 kind = CPTK_HAS_TRIVIAL_CONSTRUCTOR;
8770 break;
8771 case RID_HAS_TRIVIAL_COPY:
8772 kind = CPTK_HAS_TRIVIAL_COPY;
8773 break;
8774 case RID_HAS_TRIVIAL_DESTRUCTOR:
8775 kind = CPTK_HAS_TRIVIAL_DESTRUCTOR;
8776 break;
8777 case RID_HAS_VIRTUAL_DESTRUCTOR:
8778 kind = CPTK_HAS_VIRTUAL_DESTRUCTOR;
8779 break;
8780 case RID_IS_ABSTRACT:
8781 kind = CPTK_IS_ABSTRACT;
8782 break;
8783 case RID_IS_BASE_OF:
8784 kind = CPTK_IS_BASE_OF;
8785 binary = true;
8786 break;
8787 case RID_IS_CLASS:
8788 kind = CPTK_IS_CLASS;
8789 break;
8790 case RID_IS_EMPTY:
8791 kind = CPTK_IS_EMPTY;
8792 break;
8793 case RID_IS_ENUM:
8794 kind = CPTK_IS_ENUM;
8795 break;
8796 case RID_IS_FINAL:
8797 kind = CPTK_IS_FINAL;
8798 break;
8799 case RID_IS_LITERAL_TYPE:
8800 kind = CPTK_IS_LITERAL_TYPE;
8801 break;
8802 case RID_IS_POD:
8803 kind = CPTK_IS_POD;
8804 break;
8805 case RID_IS_POLYMORPHIC:
8806 kind = CPTK_IS_POLYMORPHIC;
8807 break;
8808 case RID_IS_STD_LAYOUT:
8809 kind = CPTK_IS_STD_LAYOUT;
8810 break;
8811 case RID_IS_TRIVIAL:
8812 kind = CPTK_IS_TRIVIAL;
8813 break;
8814 case RID_IS_TRIVIALLY_ASSIGNABLE:
8815 kind = CPTK_IS_TRIVIALLY_ASSIGNABLE;
8816 binary = true;
8817 break;
8818 case RID_IS_TRIVIALLY_CONSTRUCTIBLE:
8819 kind = CPTK_IS_TRIVIALLY_CONSTRUCTIBLE;
8820 variadic = true;
8821 break;
8822 case RID_IS_TRIVIALLY_COPYABLE:
8823 kind = CPTK_IS_TRIVIALLY_COPYABLE;
8824 break;
8825 case RID_IS_UNION:
8826 kind = CPTK_IS_UNION;
8827 break;
8828 case RID_UNDERLYING_TYPE:
8829 kind = CPTK_UNDERLYING_TYPE;
8830 break;
8831 case RID_BASES:
8832 kind = CPTK_BASES;
8833 break;
8834 case RID_DIRECT_BASES:
8835 kind = CPTK_DIRECT_BASES;
8836 break;
8837 default:
8838 gcc_unreachable ();
8841 /* Consume the token. */
8842 cp_lexer_consume_token (parser->lexer);
8844 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8846 type1 = cp_parser_type_id (parser);
8848 if (type1 == error_mark_node)
8849 return error_mark_node;
8851 if (binary)
8853 cp_parser_require (parser, CPP_COMMA, RT_COMMA);
8855 type2 = cp_parser_type_id (parser);
8857 if (type2 == error_mark_node)
8858 return error_mark_node;
8860 else if (variadic)
8862 while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
8864 cp_lexer_consume_token (parser->lexer);
8865 tree elt = cp_parser_type_id (parser);
8866 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
8868 cp_lexer_consume_token (parser->lexer);
8869 elt = make_pack_expansion (elt);
8871 if (elt == error_mark_node)
8872 return error_mark_node;
8873 type2 = tree_cons (NULL_TREE, elt, type2);
8877 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8879 /* Complete the trait expression, which may mean either processing
8880 the trait expr now or saving it for template instantiation. */
8881 switch(kind)
8883 case CPTK_UNDERLYING_TYPE:
8884 return finish_underlying_type (type1);
8885 case CPTK_BASES:
8886 return finish_bases (type1, false);
8887 case CPTK_DIRECT_BASES:
8888 return finish_bases (type1, true);
8889 default:
8890 return finish_trait_expr (kind, type1, type2);
8894 /* Lambdas that appear in variable initializer or default argument scope
8895 get that in their mangling, so we need to record it. We might as well
8896 use the count for function and namespace scopes as well. */
8897 static GTY(()) tree lambda_scope;
8898 static GTY(()) int lambda_count;
8899 typedef struct GTY(()) tree_int
8901 tree t;
8902 int i;
8903 } tree_int;
8904 static GTY(()) vec<tree_int, va_gc> *lambda_scope_stack;
8906 static void
8907 start_lambda_scope (tree decl)
8909 tree_int ti;
8910 gcc_assert (decl);
8911 /* Once we're inside a function, we ignore other scopes and just push
8912 the function again so that popping works properly. */
8913 if (current_function_decl && TREE_CODE (decl) != FUNCTION_DECL)
8914 decl = current_function_decl;
8915 ti.t = lambda_scope;
8916 ti.i = lambda_count;
8917 vec_safe_push (lambda_scope_stack, ti);
8918 if (lambda_scope != decl)
8920 /* Don't reset the count if we're still in the same function. */
8921 lambda_scope = decl;
8922 lambda_count = 0;
8926 static void
8927 record_lambda_scope (tree lambda)
8929 LAMBDA_EXPR_EXTRA_SCOPE (lambda) = lambda_scope;
8930 LAMBDA_EXPR_DISCRIMINATOR (lambda) = lambda_count++;
8933 static void
8934 finish_lambda_scope (void)
8936 tree_int *p = &lambda_scope_stack->last ();
8937 if (lambda_scope != p->t)
8939 lambda_scope = p->t;
8940 lambda_count = p->i;
8942 lambda_scope_stack->pop ();
8945 /* Parse a lambda expression.
8947 lambda-expression:
8948 lambda-introducer lambda-declarator [opt] compound-statement
8950 Returns a representation of the expression. */
8952 static tree
8953 cp_parser_lambda_expression (cp_parser* parser)
8955 tree lambda_expr = build_lambda_expr ();
8956 tree type;
8957 bool ok = true;
8958 cp_token *token = cp_lexer_peek_token (parser->lexer);
8959 cp_token_position start = 0;
8961 LAMBDA_EXPR_LOCATION (lambda_expr) = token->location;
8963 if (cp_unevaluated_operand)
8965 if (!token->error_reported)
8967 error_at (LAMBDA_EXPR_LOCATION (lambda_expr),
8968 "lambda-expression in unevaluated context");
8969 token->error_reported = true;
8971 ok = false;
8973 else if (parser->in_template_argument_list_p)
8975 if (!token->error_reported)
8977 error_at (token->location, "lambda-expression in template-argument");
8978 token->error_reported = true;
8980 ok = false;
8983 /* We may be in the middle of deferred access check. Disable
8984 it now. */
8985 push_deferring_access_checks (dk_no_deferred);
8987 cp_parser_lambda_introducer (parser, lambda_expr);
8989 type = begin_lambda_type (lambda_expr);
8990 if (type == error_mark_node)
8991 return error_mark_node;
8993 record_lambda_scope (lambda_expr);
8995 /* Do this again now that LAMBDA_EXPR_EXTRA_SCOPE is set. */
8996 determine_visibility (TYPE_NAME (type));
8998 /* Now that we've started the type, add the capture fields for any
8999 explicit captures. */
9000 register_capture_members (LAMBDA_EXPR_CAPTURE_LIST (lambda_expr));
9003 /* Inside the class, surrounding template-parameter-lists do not apply. */
9004 unsigned int saved_num_template_parameter_lists
9005 = parser->num_template_parameter_lists;
9006 unsigned char in_statement = parser->in_statement;
9007 bool in_switch_statement_p = parser->in_switch_statement_p;
9008 bool fully_implicit_function_template_p
9009 = parser->fully_implicit_function_template_p;
9010 tree implicit_template_parms = parser->implicit_template_parms;
9011 cp_binding_level* implicit_template_scope = parser->implicit_template_scope;
9012 bool auto_is_implicit_function_template_parm_p
9013 = parser->auto_is_implicit_function_template_parm_p;
9015 parser->num_template_parameter_lists = 0;
9016 parser->in_statement = 0;
9017 parser->in_switch_statement_p = false;
9018 parser->fully_implicit_function_template_p = false;
9019 parser->implicit_template_parms = 0;
9020 parser->implicit_template_scope = 0;
9021 parser->auto_is_implicit_function_template_parm_p = false;
9023 /* By virtue of defining a local class, a lambda expression has access to
9024 the private variables of enclosing classes. */
9026 ok &= cp_parser_lambda_declarator_opt (parser, lambda_expr);
9028 if (ok)
9030 if (!cp_parser_error_occurred (parser)
9031 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
9032 && cp_parser_start_tentative_firewall (parser))
9033 start = token;
9034 cp_parser_lambda_body (parser, lambda_expr);
9036 else if (cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
9038 if (cp_parser_skip_to_closing_brace (parser))
9039 cp_lexer_consume_token (parser->lexer);
9042 /* The capture list was built up in reverse order; fix that now. */
9043 LAMBDA_EXPR_CAPTURE_LIST (lambda_expr)
9044 = nreverse (LAMBDA_EXPR_CAPTURE_LIST (lambda_expr));
9046 if (ok)
9047 maybe_add_lambda_conv_op (type);
9049 type = finish_struct (type, /*attributes=*/NULL_TREE);
9051 parser->num_template_parameter_lists = saved_num_template_parameter_lists;
9052 parser->in_statement = in_statement;
9053 parser->in_switch_statement_p = in_switch_statement_p;
9054 parser->fully_implicit_function_template_p
9055 = fully_implicit_function_template_p;
9056 parser->implicit_template_parms = implicit_template_parms;
9057 parser->implicit_template_scope = implicit_template_scope;
9058 parser->auto_is_implicit_function_template_parm_p
9059 = auto_is_implicit_function_template_parm_p;
9062 pop_deferring_access_checks ();
9064 /* This field is only used during parsing of the lambda. */
9065 LAMBDA_EXPR_THIS_CAPTURE (lambda_expr) = NULL_TREE;
9067 /* This lambda shouldn't have any proxies left at this point. */
9068 gcc_assert (LAMBDA_EXPR_PENDING_PROXIES (lambda_expr) == NULL);
9069 /* And now that we're done, push proxies for an enclosing lambda. */
9070 insert_pending_capture_proxies ();
9072 if (ok)
9073 lambda_expr = build_lambda_object (lambda_expr);
9074 else
9075 lambda_expr = error_mark_node;
9077 cp_parser_end_tentative_firewall (parser, start, lambda_expr);
9079 return lambda_expr;
9082 /* Parse the beginning of a lambda expression.
9084 lambda-introducer:
9085 [ lambda-capture [opt] ]
9087 LAMBDA_EXPR is the current representation of the lambda expression. */
9089 static void
9090 cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
9092 /* Need commas after the first capture. */
9093 bool first = true;
9095 /* Eat the leading `['. */
9096 cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
9098 /* Record default capture mode. "[&" "[=" "[&," "[=," */
9099 if (cp_lexer_next_token_is (parser->lexer, CPP_AND)
9100 && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_NAME)
9101 LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_REFERENCE;
9102 else if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
9103 LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_COPY;
9105 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE)
9107 cp_lexer_consume_token (parser->lexer);
9108 first = false;
9111 while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_SQUARE))
9113 cp_token* capture_token;
9114 tree capture_id;
9115 tree capture_init_expr;
9116 cp_id_kind idk = CP_ID_KIND_NONE;
9117 bool explicit_init_p = false;
9119 enum capture_kind_type
9121 BY_COPY,
9122 BY_REFERENCE
9124 enum capture_kind_type capture_kind = BY_COPY;
9126 if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
9128 error ("expected end of capture-list");
9129 return;
9132 if (first)
9133 first = false;
9134 else
9135 cp_parser_require (parser, CPP_COMMA, RT_COMMA);
9137 /* Possibly capture `this'. */
9138 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THIS))
9140 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9141 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY)
9142 pedwarn (loc, 0, "explicit by-copy capture of %<this%> redundant "
9143 "with by-copy capture default");
9144 cp_lexer_consume_token (parser->lexer);
9145 add_capture (lambda_expr,
9146 /*id=*/this_identifier,
9147 /*initializer=*/finish_this_expr(),
9148 /*by_reference_p=*/false,
9149 explicit_init_p);
9150 continue;
9153 /* Remember whether we want to capture as a reference or not. */
9154 if (cp_lexer_next_token_is (parser->lexer, CPP_AND))
9156 capture_kind = BY_REFERENCE;
9157 cp_lexer_consume_token (parser->lexer);
9160 /* Get the identifier. */
9161 capture_token = cp_lexer_peek_token (parser->lexer);
9162 capture_id = cp_parser_identifier (parser);
9164 if (capture_id == error_mark_node)
9165 /* Would be nice to have a cp_parser_skip_to_closing_x for general
9166 delimiters, but I modified this to stop on unnested ']' as well. It
9167 was already changed to stop on unnested '}', so the
9168 "closing_parenthesis" name is no more misleading with my change. */
9170 cp_parser_skip_to_closing_parenthesis (parser,
9171 /*recovering=*/true,
9172 /*or_comma=*/true,
9173 /*consume_paren=*/true);
9174 break;
9177 /* Find the initializer for this capture. */
9178 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ)
9179 || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
9180 || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9182 bool direct, non_constant;
9183 /* An explicit initializer exists. */
9184 if (cxx_dialect < cxx14)
9185 pedwarn (input_location, 0,
9186 "lambda capture initializers "
9187 "only available with -std=c++14 or -std=gnu++14");
9188 capture_init_expr = cp_parser_initializer (parser, &direct,
9189 &non_constant);
9190 explicit_init_p = true;
9191 if (capture_init_expr == NULL_TREE)
9193 error ("empty initializer for lambda init-capture");
9194 capture_init_expr = error_mark_node;
9197 else
9199 const char* error_msg;
9201 /* Turn the identifier into an id-expression. */
9202 capture_init_expr
9203 = cp_parser_lookup_name_simple (parser, capture_id,
9204 capture_token->location);
9206 if (capture_init_expr == error_mark_node)
9208 unqualified_name_lookup_error (capture_id);
9209 continue;
9211 else if (DECL_P (capture_init_expr)
9212 && (!VAR_P (capture_init_expr)
9213 && TREE_CODE (capture_init_expr) != PARM_DECL))
9215 error_at (capture_token->location,
9216 "capture of non-variable %qD ",
9217 capture_init_expr);
9218 inform (0, "%q+#D declared here", capture_init_expr);
9219 continue;
9221 if (VAR_P (capture_init_expr)
9222 && decl_storage_duration (capture_init_expr) != dk_auto)
9224 if (pedwarn (capture_token->location, 0, "capture of variable "
9225 "%qD with non-automatic storage duration",
9226 capture_init_expr))
9227 inform (0, "%q+#D declared here", capture_init_expr);
9228 continue;
9231 capture_init_expr
9232 = finish_id_expression
9233 (capture_id,
9234 capture_init_expr,
9235 parser->scope,
9236 &idk,
9237 /*integral_constant_expression_p=*/false,
9238 /*allow_non_integral_constant_expression_p=*/false,
9239 /*non_integral_constant_expression_p=*/NULL,
9240 /*template_p=*/false,
9241 /*done=*/true,
9242 /*address_p=*/false,
9243 /*template_arg_p=*/false,
9244 &error_msg,
9245 capture_token->location);
9247 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
9249 cp_lexer_consume_token (parser->lexer);
9250 capture_init_expr = make_pack_expansion (capture_init_expr);
9252 else
9253 check_for_bare_parameter_packs (capture_init_expr);
9256 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE
9257 && !explicit_init_p)
9259 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY
9260 && capture_kind == BY_COPY)
9261 pedwarn (capture_token->location, 0, "explicit by-copy capture "
9262 "of %qD redundant with by-copy capture default",
9263 capture_id);
9264 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_REFERENCE
9265 && capture_kind == BY_REFERENCE)
9266 pedwarn (capture_token->location, 0, "explicit by-reference "
9267 "capture of %qD redundant with by-reference capture "
9268 "default", capture_id);
9271 add_capture (lambda_expr,
9272 capture_id,
9273 capture_init_expr,
9274 /*by_reference_p=*/capture_kind == BY_REFERENCE,
9275 explicit_init_p);
9278 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
9281 /* Parse the (optional) middle of a lambda expression.
9283 lambda-declarator:
9284 < template-parameter-list [opt] >
9285 ( parameter-declaration-clause [opt] )
9286 attribute-specifier [opt]
9287 mutable [opt]
9288 exception-specification [opt]
9289 lambda-return-type-clause [opt]
9291 LAMBDA_EXPR is the current representation of the lambda expression. */
9293 static bool
9294 cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
9296 /* 5.1.1.4 of the standard says:
9297 If a lambda-expression does not include a lambda-declarator, it is as if
9298 the lambda-declarator were ().
9299 This means an empty parameter list, no attributes, and no exception
9300 specification. */
9301 tree param_list = void_list_node;
9302 tree attributes = NULL_TREE;
9303 tree exception_spec = NULL_TREE;
9304 tree template_param_list = NULL_TREE;
9306 /* The template-parameter-list is optional, but must begin with
9307 an opening angle if present. */
9308 if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
9310 if (cxx_dialect < cxx14)
9311 pedwarn (parser->lexer->next_token->location, 0,
9312 "lambda templates are only available with "
9313 "-std=c++14 or -std=gnu++14");
9315 cp_lexer_consume_token (parser->lexer);
9317 template_param_list = cp_parser_template_parameter_list (parser);
9319 cp_parser_skip_to_end_of_template_parameter_list (parser);
9321 /* We just processed one more parameter list. */
9322 ++parser->num_template_parameter_lists;
9325 /* The parameter-declaration-clause is optional (unless
9326 template-parameter-list was given), but must begin with an
9327 opening parenthesis if present. */
9328 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
9330 cp_lexer_consume_token (parser->lexer);
9332 begin_scope (sk_function_parms, /*entity=*/NULL_TREE);
9334 /* Parse parameters. */
9335 param_list = cp_parser_parameter_declaration_clause (parser);
9337 /* Default arguments shall not be specified in the
9338 parameter-declaration-clause of a lambda-declarator. */
9339 for (tree t = param_list; t; t = TREE_CHAIN (t))
9340 if (TREE_PURPOSE (t) && cxx_dialect < cxx14)
9341 pedwarn (DECL_SOURCE_LOCATION (TREE_VALUE (t)), OPT_Wpedantic,
9342 "default argument specified for lambda parameter");
9344 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
9346 attributes = cp_parser_attributes_opt (parser);
9348 /* Parse optional `mutable' keyword. */
9349 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_MUTABLE))
9351 cp_lexer_consume_token (parser->lexer);
9352 LAMBDA_EXPR_MUTABLE_P (lambda_expr) = 1;
9355 /* Parse optional exception specification. */
9356 exception_spec = cp_parser_exception_specification_opt (parser);
9358 /* Parse optional trailing return type. */
9359 if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
9361 cp_lexer_consume_token (parser->lexer);
9362 LAMBDA_EXPR_RETURN_TYPE (lambda_expr)
9363 = cp_parser_trailing_type_id (parser);
9366 /* The function parameters must be in scope all the way until after the
9367 trailing-return-type in case of decltype. */
9368 pop_bindings_and_leave_scope ();
9370 else if (template_param_list != NULL_TREE) // generate diagnostic
9371 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
9373 /* Create the function call operator.
9375 Messing with declarators like this is no uglier than building up the
9376 FUNCTION_DECL by hand, and this is less likely to get out of sync with
9377 other code. */
9379 cp_decl_specifier_seq return_type_specs;
9380 cp_declarator* declarator;
9381 tree fco;
9382 int quals;
9383 void *p;
9385 clear_decl_specs (&return_type_specs);
9386 if (LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
9387 return_type_specs.type = LAMBDA_EXPR_RETURN_TYPE (lambda_expr);
9388 else
9389 /* Maybe we will deduce the return type later. */
9390 return_type_specs.type = make_auto ();
9392 p = obstack_alloc (&declarator_obstack, 0);
9394 declarator = make_id_declarator (NULL_TREE, ansi_opname (CALL_EXPR),
9395 sfk_none);
9397 quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
9398 ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST);
9399 declarator = make_call_declarator (declarator, param_list, quals,
9400 VIRT_SPEC_UNSPECIFIED,
9401 REF_QUAL_NONE,
9402 exception_spec,
9403 /*late_return_type=*/NULL_TREE);
9404 declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr);
9406 fco = grokmethod (&return_type_specs,
9407 declarator,
9408 attributes);
9409 if (fco != error_mark_node)
9411 DECL_INITIALIZED_IN_CLASS_P (fco) = 1;
9412 DECL_ARTIFICIAL (fco) = 1;
9413 /* Give the object parameter a different name. */
9414 DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure");
9415 if (LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
9416 TYPE_HAS_LATE_RETURN_TYPE (TREE_TYPE (fco)) = 1;
9418 if (template_param_list)
9420 fco = finish_member_template_decl (fco);
9421 finish_template_decl (template_param_list);
9422 --parser->num_template_parameter_lists;
9424 else if (parser->fully_implicit_function_template_p)
9425 fco = finish_fully_implicit_template (parser, fco);
9427 finish_member_declaration (fco);
9429 obstack_free (&declarator_obstack, p);
9431 return (fco != error_mark_node);
9435 /* Parse the body of a lambda expression, which is simply
9437 compound-statement
9439 but which requires special handling.
9440 LAMBDA_EXPR is the current representation of the lambda expression. */
9442 static void
9443 cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
9445 bool nested = (current_function_decl != NULL_TREE);
9446 bool local_variables_forbidden_p = parser->local_variables_forbidden_p;
9447 if (nested)
9448 push_function_context ();
9449 else
9450 /* Still increment function_depth so that we don't GC in the
9451 middle of an expression. */
9452 ++function_depth;
9453 /* Clear this in case we're in the middle of a default argument. */
9454 parser->local_variables_forbidden_p = false;
9456 /* Finish the function call operator
9457 - class_specifier
9458 + late_parsing_for_member
9459 + function_definition_after_declarator
9460 + ctor_initializer_opt_and_function_body */
9462 tree fco = lambda_function (lambda_expr);
9463 tree body;
9464 bool done = false;
9465 tree compound_stmt;
9466 tree cap;
9468 /* Let the front end know that we are going to be defining this
9469 function. */
9470 start_preparsed_function (fco,
9471 NULL_TREE,
9472 SF_PRE_PARSED | SF_INCLASS_INLINE);
9474 start_lambda_scope (fco);
9475 body = begin_function_body ();
9477 if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
9478 goto out;
9480 /* Push the proxies for any explicit captures. */
9481 for (cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
9482 cap = TREE_CHAIN (cap))
9483 build_capture_proxy (TREE_PURPOSE (cap));
9485 compound_stmt = begin_compound_stmt (0);
9487 /* 5.1.1.4 of the standard says:
9488 If a lambda-expression does not include a trailing-return-type, it
9489 is as if the trailing-return-type denotes the following type:
9490 * if the compound-statement is of the form
9491 { return attribute-specifier [opt] expression ; }
9492 the type of the returned expression after lvalue-to-rvalue
9493 conversion (_conv.lval_ 4.1), array-to-pointer conversion
9494 (_conv.array_ 4.2), and function-to-pointer conversion
9495 (_conv.func_ 4.3);
9496 * otherwise, void. */
9498 /* In a lambda that has neither a lambda-return-type-clause
9499 nor a deducible form, errors should be reported for return statements
9500 in the body. Since we used void as the placeholder return type, parsing
9501 the body as usual will give such desired behavior. */
9502 if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)
9503 && cp_lexer_peek_nth_token (parser->lexer, 1)->keyword == RID_RETURN
9504 && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SEMICOLON)
9506 tree expr = NULL_TREE;
9507 cp_id_kind idk = CP_ID_KIND_NONE;
9509 /* Parse tentatively in case there's more after the initial return
9510 statement. */
9511 cp_parser_parse_tentatively (parser);
9513 cp_parser_require_keyword (parser, RID_RETURN, RT_RETURN);
9515 expr = cp_parser_expression (parser, &idk);
9517 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9518 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
9520 if (cp_parser_parse_definitely (parser))
9522 if (!processing_template_decl)
9523 apply_deduced_return_type (fco, lambda_return_type (expr));
9525 /* Will get error here if type not deduced yet. */
9526 finish_return_stmt (expr);
9528 done = true;
9532 if (!done)
9534 while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
9535 cp_parser_label_declaration (parser);
9536 cp_parser_statement_seq_opt (parser, NULL_TREE);
9537 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
9540 finish_compound_stmt (compound_stmt);
9542 out:
9543 finish_function_body (body);
9544 finish_lambda_scope ();
9546 /* Finish the function and generate code for it if necessary. */
9547 tree fn = finish_function (/*inline*/2);
9549 /* Only expand if the call op is not a template. */
9550 if (!DECL_TEMPLATE_INFO (fco))
9551 expand_or_defer_fn (fn);
9554 parser->local_variables_forbidden_p = local_variables_forbidden_p;
9555 if (nested)
9556 pop_function_context();
9557 else
9558 --function_depth;
9561 /* Statements [gram.stmt.stmt] */
9563 /* Parse a statement.
9565 statement:
9566 labeled-statement
9567 expression-statement
9568 compound-statement
9569 selection-statement
9570 iteration-statement
9571 jump-statement
9572 declaration-statement
9573 try-block
9575 C++11:
9577 statement:
9578 labeled-statement
9579 attribute-specifier-seq (opt) expression-statement
9580 attribute-specifier-seq (opt) compound-statement
9581 attribute-specifier-seq (opt) selection-statement
9582 attribute-specifier-seq (opt) iteration-statement
9583 attribute-specifier-seq (opt) jump-statement
9584 declaration-statement
9585 attribute-specifier-seq (opt) try-block
9587 TM Extension:
9589 statement:
9590 atomic-statement
9592 IN_COMPOUND is true when the statement is nested inside a
9593 cp_parser_compound_statement; this matters for certain pragmas.
9595 If IF_P is not NULL, *IF_P is set to indicate whether the statement
9596 is a (possibly labeled) if statement which is not enclosed in braces
9597 and has an else clause. This is used to implement -Wparentheses. */
9599 static void
9600 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
9601 bool in_compound, bool *if_p)
9603 tree statement, std_attrs = NULL_TREE;
9604 cp_token *token;
9605 location_t statement_location, attrs_location;
9607 restart:
9608 if (if_p != NULL)
9609 *if_p = false;
9610 /* There is no statement yet. */
9611 statement = NULL_TREE;
9613 saved_token_sentinel saved_tokens (parser->lexer);
9614 attrs_location = cp_lexer_peek_token (parser->lexer)->location;
9615 if (c_dialect_objc ())
9616 /* In obj-c++, seeing '[[' might be the either the beginning of
9617 c++11 attributes, or a nested objc-message-expression. So
9618 let's parse the c++11 attributes tentatively. */
9619 cp_parser_parse_tentatively (parser);
9620 std_attrs = cp_parser_std_attribute_spec_seq (parser);
9621 if (c_dialect_objc ())
9623 if (!cp_parser_parse_definitely (parser))
9624 std_attrs = NULL_TREE;
9627 /* Peek at the next token. */
9628 token = cp_lexer_peek_token (parser->lexer);
9629 /* Remember the location of the first token in the statement. */
9630 statement_location = token->location;
9631 /* If this is a keyword, then that will often determine what kind of
9632 statement we have. */
9633 if (token->type == CPP_KEYWORD)
9635 enum rid keyword = token->keyword;
9637 switch (keyword)
9639 case RID_CASE:
9640 case RID_DEFAULT:
9641 /* Looks like a labeled-statement with a case label.
9642 Parse the label, and then use tail recursion to parse
9643 the statement. */
9644 cp_parser_label_for_labeled_statement (parser, std_attrs);
9645 goto restart;
9647 case RID_IF:
9648 case RID_SWITCH:
9649 statement = cp_parser_selection_statement (parser, if_p);
9650 break;
9652 case RID_WHILE:
9653 case RID_DO:
9654 case RID_FOR:
9655 statement = cp_parser_iteration_statement (parser, false);
9656 break;
9658 case RID_CILK_FOR:
9659 if (!flag_cilkplus)
9661 error_at (cp_lexer_peek_token (parser->lexer)->location,
9662 "-fcilkplus must be enabled to use %<_Cilk_for%>");
9663 cp_lexer_consume_token (parser->lexer);
9664 statement = error_mark_node;
9666 else
9667 statement = cp_parser_cilk_for (parser, integer_zero_node);
9668 break;
9670 case RID_BREAK:
9671 case RID_CONTINUE:
9672 case RID_RETURN:
9673 case RID_GOTO:
9674 statement = cp_parser_jump_statement (parser);
9675 break;
9677 case RID_CILK_SYNC:
9678 cp_lexer_consume_token (parser->lexer);
9679 if (flag_cilkplus)
9681 tree sync_expr = build_cilk_sync ();
9682 SET_EXPR_LOCATION (sync_expr,
9683 token->location);
9684 statement = finish_expr_stmt (sync_expr);
9686 else
9688 error_at (token->location, "-fcilkplus must be enabled to use"
9689 " %<_Cilk_sync%>");
9690 statement = error_mark_node;
9692 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9693 break;
9695 /* Objective-C++ exception-handling constructs. */
9696 case RID_AT_TRY:
9697 case RID_AT_CATCH:
9698 case RID_AT_FINALLY:
9699 case RID_AT_SYNCHRONIZED:
9700 case RID_AT_THROW:
9701 statement = cp_parser_objc_statement (parser);
9702 break;
9704 case RID_TRY:
9705 statement = cp_parser_try_block (parser);
9706 break;
9708 case RID_NAMESPACE:
9709 /* This must be a namespace alias definition. */
9710 cp_parser_declaration_statement (parser);
9711 return;
9713 case RID_TRANSACTION_ATOMIC:
9714 case RID_TRANSACTION_RELAXED:
9715 statement = cp_parser_transaction (parser, keyword);
9716 break;
9717 case RID_TRANSACTION_CANCEL:
9718 statement = cp_parser_transaction_cancel (parser);
9719 break;
9721 default:
9722 /* It might be a keyword like `int' that can start a
9723 declaration-statement. */
9724 break;
9727 else if (token->type == CPP_NAME)
9729 /* If the next token is a `:', then we are looking at a
9730 labeled-statement. */
9731 token = cp_lexer_peek_nth_token (parser->lexer, 2);
9732 if (token->type == CPP_COLON)
9734 /* Looks like a labeled-statement with an ordinary label.
9735 Parse the label, and then use tail recursion to parse
9736 the statement. */
9738 cp_parser_label_for_labeled_statement (parser, std_attrs);
9739 goto restart;
9742 /* Anything that starts with a `{' must be a compound-statement. */
9743 else if (token->type == CPP_OPEN_BRACE)
9744 statement = cp_parser_compound_statement (parser, NULL, false, false);
9745 /* CPP_PRAGMA is a #pragma inside a function body, which constitutes
9746 a statement all its own. */
9747 else if (token->type == CPP_PRAGMA)
9749 /* Only certain OpenMP pragmas are attached to statements, and thus
9750 are considered statements themselves. All others are not. In
9751 the context of a compound, accept the pragma as a "statement" and
9752 return so that we can check for a close brace. Otherwise we
9753 require a real statement and must go back and read one. */
9754 if (in_compound)
9755 cp_parser_pragma (parser, pragma_compound);
9756 else if (!cp_parser_pragma (parser, pragma_stmt))
9757 goto restart;
9758 return;
9760 else if (token->type == CPP_EOF)
9762 cp_parser_error (parser, "expected statement");
9763 return;
9766 /* Everything else must be a declaration-statement or an
9767 expression-statement. Try for the declaration-statement
9768 first, unless we are looking at a `;', in which case we know that
9769 we have an expression-statement. */
9770 if (!statement)
9772 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9774 if (std_attrs != NULL_TREE)
9776 /* Attributes should be parsed as part of the the
9777 declaration, so let's un-parse them. */
9778 saved_tokens.rollback();
9779 std_attrs = NULL_TREE;
9782 cp_parser_parse_tentatively (parser);
9783 /* Try to parse the declaration-statement. */
9784 cp_parser_declaration_statement (parser);
9785 /* If that worked, we're done. */
9786 if (cp_parser_parse_definitely (parser))
9787 return;
9789 /* Look for an expression-statement instead. */
9790 statement = cp_parser_expression_statement (parser, in_statement_expr);
9793 /* Set the line number for the statement. */
9794 if (statement && STATEMENT_CODE_P (TREE_CODE (statement)))
9795 SET_EXPR_LOCATION (statement, statement_location);
9797 /* Note that for now, we don't do anything with c++11 statements
9798 parsed at this level. */
9799 if (std_attrs != NULL_TREE)
9800 warning_at (attrs_location,
9801 OPT_Wattributes,
9802 "attributes at the beginning of statement are ignored");
9805 /* Parse the label for a labeled-statement, i.e.
9807 identifier :
9808 case constant-expression :
9809 default :
9811 GNU Extension:
9812 case constant-expression ... constant-expression : statement
9814 When a label is parsed without errors, the label is added to the
9815 parse tree by the finish_* functions, so this function doesn't
9816 have to return the label. */
9818 static void
9819 cp_parser_label_for_labeled_statement (cp_parser* parser, tree attributes)
9821 cp_token *token;
9822 tree label = NULL_TREE;
9823 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
9825 /* The next token should be an identifier. */
9826 token = cp_lexer_peek_token (parser->lexer);
9827 if (token->type != CPP_NAME
9828 && token->type != CPP_KEYWORD)
9830 cp_parser_error (parser, "expected labeled-statement");
9831 return;
9834 parser->colon_corrects_to_scope_p = false;
9835 switch (token->keyword)
9837 case RID_CASE:
9839 tree expr, expr_hi;
9840 cp_token *ellipsis;
9842 /* Consume the `case' token. */
9843 cp_lexer_consume_token (parser->lexer);
9844 /* Parse the constant-expression. */
9845 expr = cp_parser_constant_expression (parser);
9846 if (check_for_bare_parameter_packs (expr))
9847 expr = error_mark_node;
9849 ellipsis = cp_lexer_peek_token (parser->lexer);
9850 if (ellipsis->type == CPP_ELLIPSIS)
9852 /* Consume the `...' token. */
9853 cp_lexer_consume_token (parser->lexer);
9854 expr_hi = cp_parser_constant_expression (parser);
9855 if (check_for_bare_parameter_packs (expr_hi))
9856 expr_hi = error_mark_node;
9858 /* We don't need to emit warnings here, as the common code
9859 will do this for us. */
9861 else
9862 expr_hi = NULL_TREE;
9864 if (parser->in_switch_statement_p)
9865 finish_case_label (token->location, expr, expr_hi);
9866 else
9867 error_at (token->location,
9868 "case label %qE not within a switch statement",
9869 expr);
9871 break;
9873 case RID_DEFAULT:
9874 /* Consume the `default' token. */
9875 cp_lexer_consume_token (parser->lexer);
9877 if (parser->in_switch_statement_p)
9878 finish_case_label (token->location, NULL_TREE, NULL_TREE);
9879 else
9880 error_at (token->location, "case label not within a switch statement");
9881 break;
9883 default:
9884 /* Anything else must be an ordinary label. */
9885 label = finish_label_stmt (cp_parser_identifier (parser));
9886 break;
9889 /* Require the `:' token. */
9890 cp_parser_require (parser, CPP_COLON, RT_COLON);
9892 /* An ordinary label may optionally be followed by attributes.
9893 However, this is only permitted if the attributes are then
9894 followed by a semicolon. This is because, for backward
9895 compatibility, when parsing
9896 lab: __attribute__ ((unused)) int i;
9897 we want the attribute to attach to "i", not "lab". */
9898 if (label != NULL_TREE
9899 && cp_next_tokens_can_be_gnu_attribute_p (parser))
9901 tree attrs;
9902 cp_parser_parse_tentatively (parser);
9903 attrs = cp_parser_gnu_attributes_opt (parser);
9904 if (attrs == NULL_TREE
9905 || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9906 cp_parser_abort_tentative_parse (parser);
9907 else if (!cp_parser_parse_definitely (parser))
9909 else
9910 attributes = chainon (attributes, attrs);
9913 if (attributes != NULL_TREE)
9914 cplus_decl_attributes (&label, attributes, 0);
9916 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
9919 /* Parse an expression-statement.
9921 expression-statement:
9922 expression [opt] ;
9924 Returns the new EXPR_STMT -- or NULL_TREE if the expression
9925 statement consists of nothing more than an `;'. IN_STATEMENT_EXPR_P
9926 indicates whether this expression-statement is part of an
9927 expression statement. */
9929 static tree
9930 cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
9932 tree statement = NULL_TREE;
9933 cp_token *token = cp_lexer_peek_token (parser->lexer);
9935 /* If the next token is a ';', then there is no expression
9936 statement. */
9937 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9939 statement = cp_parser_expression (parser);
9940 if (statement == error_mark_node
9941 && !cp_parser_uncommitted_to_tentative_parse_p (parser))
9943 cp_parser_skip_to_end_of_block_or_statement (parser);
9944 return error_mark_node;
9948 /* Give a helpful message for "A<T>::type t;" and the like. */
9949 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
9950 && !cp_parser_uncommitted_to_tentative_parse_p (parser))
9952 if (TREE_CODE (statement) == SCOPE_REF)
9953 error_at (token->location, "need %<typename%> before %qE because "
9954 "%qT is a dependent scope",
9955 statement, TREE_OPERAND (statement, 0));
9956 else if (is_overloaded_fn (statement)
9957 && DECL_CONSTRUCTOR_P (get_first_fn (statement)))
9959 /* A::A a; */
9960 tree fn = get_first_fn (statement);
9961 error_at (token->location,
9962 "%<%T::%D%> names the constructor, not the type",
9963 DECL_CONTEXT (fn), DECL_NAME (fn));
9967 /* Consume the final `;'. */
9968 cp_parser_consume_semicolon_at_end_of_statement (parser);
9970 if (in_statement_expr
9971 && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
9972 /* This is the final expression statement of a statement
9973 expression. */
9974 statement = finish_stmt_expr_expr (statement, in_statement_expr);
9975 else if (statement)
9976 statement = finish_expr_stmt (statement);
9978 return statement;
9981 /* Parse a compound-statement.
9983 compound-statement:
9984 { statement-seq [opt] }
9986 GNU extension:
9988 compound-statement:
9989 { label-declaration-seq [opt] statement-seq [opt] }
9991 label-declaration-seq:
9992 label-declaration
9993 label-declaration-seq label-declaration
9995 Returns a tree representing the statement. */
9997 static tree
9998 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
9999 bool in_try, bool function_body)
10001 tree compound_stmt;
10003 /* Consume the `{'. */
10004 if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
10005 return error_mark_node;
10006 if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
10007 && !function_body && cxx_dialect < cxx14)
10008 pedwarn (input_location, OPT_Wpedantic,
10009 "compound-statement in constexpr function");
10010 /* Begin the compound-statement. */
10011 compound_stmt = begin_compound_stmt (in_try ? BCS_TRY_BLOCK : 0);
10012 /* If the next keyword is `__label__' we have a label declaration. */
10013 while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
10014 cp_parser_label_declaration (parser);
10015 /* Parse an (optional) statement-seq. */
10016 cp_parser_statement_seq_opt (parser, in_statement_expr);
10017 /* Finish the compound-statement. */
10018 finish_compound_stmt (compound_stmt);
10019 /* Consume the `}'. */
10020 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
10022 return compound_stmt;
10025 /* Parse an (optional) statement-seq.
10027 statement-seq:
10028 statement
10029 statement-seq [opt] statement */
10031 static void
10032 cp_parser_statement_seq_opt (cp_parser* parser, tree in_statement_expr)
10034 /* Scan statements until there aren't any more. */
10035 while (true)
10037 cp_token *token = cp_lexer_peek_token (parser->lexer);
10039 /* If we are looking at a `}', then we have run out of
10040 statements; the same is true if we have reached the end
10041 of file, or have stumbled upon a stray '@end'. */
10042 if (token->type == CPP_CLOSE_BRACE
10043 || token->type == CPP_EOF
10044 || token->type == CPP_PRAGMA_EOL
10045 || (token->type == CPP_KEYWORD && token->keyword == RID_AT_END))
10046 break;
10048 /* If we are in a compound statement and find 'else' then
10049 something went wrong. */
10050 else if (token->type == CPP_KEYWORD && token->keyword == RID_ELSE)
10052 if (parser->in_statement & IN_IF_STMT)
10053 break;
10054 else
10056 token = cp_lexer_consume_token (parser->lexer);
10057 error_at (token->location, "%<else%> without a previous %<if%>");
10061 /* Parse the statement. */
10062 cp_parser_statement (parser, in_statement_expr, true, NULL);
10066 /* Parse a selection-statement.
10068 selection-statement:
10069 if ( condition ) statement
10070 if ( condition ) statement else statement
10071 switch ( condition ) statement
10073 Returns the new IF_STMT or SWITCH_STMT.
10075 If IF_P is not NULL, *IF_P is set to indicate whether the statement
10076 is a (possibly labeled) if statement which is not enclosed in
10077 braces and has an else clause. This is used to implement
10078 -Wparentheses. */
10080 static tree
10081 cp_parser_selection_statement (cp_parser* parser, bool *if_p)
10083 cp_token *token;
10084 enum rid keyword;
10086 if (if_p != NULL)
10087 *if_p = false;
10089 /* Peek at the next token. */
10090 token = cp_parser_require (parser, CPP_KEYWORD, RT_SELECT);
10092 /* See what kind of keyword it is. */
10093 keyword = token->keyword;
10094 switch (keyword)
10096 case RID_IF:
10097 case RID_SWITCH:
10099 tree statement;
10100 tree condition;
10102 /* Look for the `('. */
10103 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
10105 cp_parser_skip_to_end_of_statement (parser);
10106 return error_mark_node;
10109 /* Begin the selection-statement. */
10110 if (keyword == RID_IF)
10111 statement = begin_if_stmt ();
10112 else
10113 statement = begin_switch_stmt ();
10115 /* Parse the condition. */
10116 condition = cp_parser_condition (parser);
10117 /* Look for the `)'. */
10118 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10119 cp_parser_skip_to_closing_parenthesis (parser, true, false,
10120 /*consume_paren=*/true);
10122 if (keyword == RID_IF)
10124 bool nested_if;
10125 unsigned char in_statement;
10127 /* Add the condition. */
10128 finish_if_stmt_cond (condition, statement);
10130 /* Parse the then-clause. */
10131 in_statement = parser->in_statement;
10132 parser->in_statement |= IN_IF_STMT;
10133 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
10135 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
10136 add_stmt (build_empty_stmt (loc));
10137 cp_lexer_consume_token (parser->lexer);
10138 if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_ELSE))
10139 warning_at (loc, OPT_Wempty_body, "suggest braces around "
10140 "empty body in an %<if%> statement");
10141 nested_if = false;
10143 else
10144 cp_parser_implicitly_scoped_statement (parser, &nested_if);
10145 parser->in_statement = in_statement;
10147 finish_then_clause (statement);
10149 /* If the next token is `else', parse the else-clause. */
10150 if (cp_lexer_next_token_is_keyword (parser->lexer,
10151 RID_ELSE))
10153 /* Consume the `else' keyword. */
10154 cp_lexer_consume_token (parser->lexer);
10155 begin_else_clause (statement);
10156 /* Parse the else-clause. */
10157 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
10159 location_t loc;
10160 loc = cp_lexer_peek_token (parser->lexer)->location;
10161 warning_at (loc,
10162 OPT_Wempty_body, "suggest braces around "
10163 "empty body in an %<else%> statement");
10164 add_stmt (build_empty_stmt (loc));
10165 cp_lexer_consume_token (parser->lexer);
10167 else
10168 cp_parser_implicitly_scoped_statement (parser, NULL);
10170 finish_else_clause (statement);
10172 /* If we are currently parsing a then-clause, then
10173 IF_P will not be NULL. We set it to true to
10174 indicate that this if statement has an else clause.
10175 This may trigger the Wparentheses warning below
10176 when we get back up to the parent if statement. */
10177 if (if_p != NULL)
10178 *if_p = true;
10180 else
10182 /* This if statement does not have an else clause. If
10183 NESTED_IF is true, then the then-clause is an if
10184 statement which does have an else clause. We warn
10185 about the potential ambiguity. */
10186 if (nested_if)
10187 warning_at (EXPR_LOCATION (statement), OPT_Wparentheses,
10188 "suggest explicit braces to avoid ambiguous"
10189 " %<else%>");
10192 /* Now we're all done with the if-statement. */
10193 finish_if_stmt (statement);
10195 else
10197 bool in_switch_statement_p;
10198 unsigned char in_statement;
10200 /* Add the condition. */
10201 finish_switch_cond (condition, statement);
10203 /* Parse the body of the switch-statement. */
10204 in_switch_statement_p = parser->in_switch_statement_p;
10205 in_statement = parser->in_statement;
10206 parser->in_switch_statement_p = true;
10207 parser->in_statement |= IN_SWITCH_STMT;
10208 cp_parser_implicitly_scoped_statement (parser, NULL);
10209 parser->in_switch_statement_p = in_switch_statement_p;
10210 parser->in_statement = in_statement;
10212 /* Now we're all done with the switch-statement. */
10213 finish_switch_stmt (statement);
10216 return statement;
10218 break;
10220 default:
10221 cp_parser_error (parser, "expected selection-statement");
10222 return error_mark_node;
10226 /* Parse a condition.
10228 condition:
10229 expression
10230 type-specifier-seq declarator = initializer-clause
10231 type-specifier-seq declarator braced-init-list
10233 GNU Extension:
10235 condition:
10236 type-specifier-seq declarator asm-specification [opt]
10237 attributes [opt] = assignment-expression
10239 Returns the expression that should be tested. */
10241 static tree
10242 cp_parser_condition (cp_parser* parser)
10244 cp_decl_specifier_seq type_specifiers;
10245 const char *saved_message;
10246 int declares_class_or_enum;
10248 /* Try the declaration first. */
10249 cp_parser_parse_tentatively (parser);
10250 /* New types are not allowed in the type-specifier-seq for a
10251 condition. */
10252 saved_message = parser->type_definition_forbidden_message;
10253 parser->type_definition_forbidden_message
10254 = G_("types may not be defined in conditions");
10255 /* Parse the type-specifier-seq. */
10256 cp_parser_decl_specifier_seq (parser,
10257 CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR,
10258 &type_specifiers,
10259 &declares_class_or_enum);
10260 /* Restore the saved message. */
10261 parser->type_definition_forbidden_message = saved_message;
10262 /* If all is well, we might be looking at a declaration. */
10263 if (!cp_parser_error_occurred (parser))
10265 tree decl;
10266 tree asm_specification;
10267 tree attributes;
10268 cp_declarator *declarator;
10269 tree initializer = NULL_TREE;
10271 /* Parse the declarator. */
10272 declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
10273 /*ctor_dtor_or_conv_p=*/NULL,
10274 /*parenthesized_p=*/NULL,
10275 /*member_p=*/false,
10276 /*friend_p=*/false);
10277 /* Parse the attributes. */
10278 attributes = cp_parser_attributes_opt (parser);
10279 /* Parse the asm-specification. */
10280 asm_specification = cp_parser_asm_specification_opt (parser);
10281 /* If the next token is not an `=' or '{', then we might still be
10282 looking at an expression. For example:
10284 if (A(a).x)
10286 looks like a decl-specifier-seq and a declarator -- but then
10287 there is no `=', so this is an expression. */
10288 if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
10289 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
10290 cp_parser_simulate_error (parser);
10292 /* If we did see an `=' or '{', then we are looking at a declaration
10293 for sure. */
10294 if (cp_parser_parse_definitely (parser))
10296 tree pushed_scope;
10297 bool non_constant_p;
10298 bool flags = LOOKUP_ONLYCONVERTING;
10300 /* Create the declaration. */
10301 decl = start_decl (declarator, &type_specifiers,
10302 /*initialized_p=*/true,
10303 attributes, /*prefix_attributes=*/NULL_TREE,
10304 &pushed_scope);
10306 /* Parse the initializer. */
10307 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10309 initializer = cp_parser_braced_list (parser, &non_constant_p);
10310 CONSTRUCTOR_IS_DIRECT_INIT (initializer) = 1;
10311 flags = 0;
10313 else
10315 /* Consume the `='. */
10316 cp_parser_require (parser, CPP_EQ, RT_EQ);
10317 initializer = cp_parser_initializer_clause (parser, &non_constant_p);
10319 if (BRACE_ENCLOSED_INITIALIZER_P (initializer))
10320 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
10322 /* Process the initializer. */
10323 cp_finish_decl (decl,
10324 initializer, !non_constant_p,
10325 asm_specification,
10326 flags);
10328 if (pushed_scope)
10329 pop_scope (pushed_scope);
10331 return convert_from_reference (decl);
10334 /* If we didn't even get past the declarator successfully, we are
10335 definitely not looking at a declaration. */
10336 else
10337 cp_parser_abort_tentative_parse (parser);
10339 /* Otherwise, we are looking at an expression. */
10340 return cp_parser_expression (parser);
10343 /* Parses a for-statement or range-for-statement until the closing ')',
10344 not included. */
10346 static tree
10347 cp_parser_for (cp_parser *parser, bool ivdep)
10349 tree init, scope, decl;
10350 bool is_range_for;
10352 /* Begin the for-statement. */
10353 scope = begin_for_scope (&init);
10355 /* Parse the initialization. */
10356 is_range_for = cp_parser_for_init_statement (parser, &decl);
10358 if (is_range_for)
10359 return cp_parser_range_for (parser, scope, init, decl, ivdep);
10360 else
10361 return cp_parser_c_for (parser, scope, init, ivdep);
10364 static tree
10365 cp_parser_c_for (cp_parser *parser, tree scope, tree init, bool ivdep)
10367 /* Normal for loop */
10368 tree condition = NULL_TREE;
10369 tree expression = NULL_TREE;
10370 tree stmt;
10372 stmt = begin_for_stmt (scope, init);
10373 /* The for-init-statement has already been parsed in
10374 cp_parser_for_init_statement, so no work is needed here. */
10375 finish_for_init_stmt (stmt);
10377 /* If there's a condition, process it. */
10378 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
10379 condition = cp_parser_condition (parser);
10380 else if (ivdep)
10382 cp_parser_error (parser, "missing loop condition in loop with "
10383 "%<GCC ivdep%> pragma");
10384 condition = error_mark_node;
10386 finish_for_cond (condition, stmt, ivdep);
10387 /* Look for the `;'. */
10388 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10390 /* If there's an expression, process it. */
10391 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
10392 expression = cp_parser_expression (parser);
10393 finish_for_expr (expression, stmt);
10395 return stmt;
10398 /* Tries to parse a range-based for-statement:
10400 range-based-for:
10401 decl-specifier-seq declarator : expression
10403 The decl-specifier-seq declarator and the `:' are already parsed by
10404 cp_parser_for_init_statement. If processing_template_decl it returns a
10405 newly created RANGE_FOR_STMT; if not, it is converted to a
10406 regular FOR_STMT. */
10408 static tree
10409 cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl,
10410 bool ivdep)
10412 tree stmt, range_expr;
10414 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10416 bool expr_non_constant_p;
10417 range_expr = cp_parser_braced_list (parser, &expr_non_constant_p);
10419 else
10420 range_expr = cp_parser_expression (parser);
10422 /* If in template, STMT is converted to a normal for-statement
10423 at instantiation. If not, it is done just ahead. */
10424 if (processing_template_decl)
10426 if (check_for_bare_parameter_packs (range_expr))
10427 range_expr = error_mark_node;
10428 stmt = begin_range_for_stmt (scope, init);
10429 if (ivdep)
10430 RANGE_FOR_IVDEP (stmt) = 1;
10431 finish_range_for_decl (stmt, range_decl, range_expr);
10432 if (!type_dependent_expression_p (range_expr)
10433 /* do_auto_deduction doesn't mess with template init-lists. */
10434 && !BRACE_ENCLOSED_INITIALIZER_P (range_expr))
10435 do_range_for_auto_deduction (range_decl, range_expr);
10437 else
10439 stmt = begin_for_stmt (scope, init);
10440 stmt = cp_convert_range_for (stmt, range_decl, range_expr, ivdep);
10442 return stmt;
10445 /* Subroutine of cp_convert_range_for: given the initializer expression,
10446 builds up the range temporary. */
10448 static tree
10449 build_range_temp (tree range_expr)
10451 tree range_type, range_temp;
10453 /* Find out the type deduced by the declaration
10454 `auto &&__range = range_expr'. */
10455 range_type = cp_build_reference_type (make_auto (), true);
10456 range_type = do_auto_deduction (range_type, range_expr,
10457 type_uses_auto (range_type));
10459 /* Create the __range variable. */
10460 range_temp = build_decl (input_location, VAR_DECL,
10461 get_identifier ("__for_range"), range_type);
10462 TREE_USED (range_temp) = 1;
10463 DECL_ARTIFICIAL (range_temp) = 1;
10465 return range_temp;
10468 /* Used by cp_parser_range_for in template context: we aren't going to
10469 do a full conversion yet, but we still need to resolve auto in the
10470 type of the for-range-declaration if present. This is basically
10471 a shortcut version of cp_convert_range_for. */
10473 static void
10474 do_range_for_auto_deduction (tree decl, tree range_expr)
10476 tree auto_node = type_uses_auto (TREE_TYPE (decl));
10477 if (auto_node)
10479 tree begin_dummy, end_dummy, range_temp, iter_type, iter_decl;
10480 range_temp = convert_from_reference (build_range_temp (range_expr));
10481 iter_type = (cp_parser_perform_range_for_lookup
10482 (range_temp, &begin_dummy, &end_dummy));
10483 if (iter_type)
10485 iter_decl = build_decl (input_location, VAR_DECL, NULL_TREE,
10486 iter_type);
10487 iter_decl = build_x_indirect_ref (input_location, iter_decl, RO_NULL,
10488 tf_warning_or_error);
10489 TREE_TYPE (decl) = do_auto_deduction (TREE_TYPE (decl),
10490 iter_decl, auto_node);
10495 /* Converts a range-based for-statement into a normal
10496 for-statement, as per the definition.
10498 for (RANGE_DECL : RANGE_EXPR)
10499 BLOCK
10501 should be equivalent to:
10504 auto &&__range = RANGE_EXPR;
10505 for (auto __begin = BEGIN_EXPR, end = END_EXPR;
10506 __begin != __end;
10507 ++__begin)
10509 RANGE_DECL = *__begin;
10510 BLOCK
10514 If RANGE_EXPR is an array:
10515 BEGIN_EXPR = __range
10516 END_EXPR = __range + ARRAY_SIZE(__range)
10517 Else if RANGE_EXPR has a member 'begin' or 'end':
10518 BEGIN_EXPR = __range.begin()
10519 END_EXPR = __range.end()
10520 Else:
10521 BEGIN_EXPR = begin(__range)
10522 END_EXPR = end(__range);
10524 If __range has a member 'begin' but not 'end', or vice versa, we must
10525 still use the second alternative (it will surely fail, however).
10526 When calling begin()/end() in the third alternative we must use
10527 argument dependent lookup, but always considering 'std' as an associated
10528 namespace. */
10530 tree
10531 cp_convert_range_for (tree statement, tree range_decl, tree range_expr,
10532 bool ivdep)
10534 tree begin, end;
10535 tree iter_type, begin_expr, end_expr;
10536 tree condition, expression;
10538 if (range_decl == error_mark_node || range_expr == error_mark_node)
10539 /* If an error happened previously do nothing or else a lot of
10540 unhelpful errors would be issued. */
10541 begin_expr = end_expr = iter_type = error_mark_node;
10542 else
10544 tree range_temp;
10546 if (TREE_CODE (range_expr) == VAR_DECL
10547 && array_of_runtime_bound_p (TREE_TYPE (range_expr)))
10548 /* Can't bind a reference to an array of runtime bound. */
10549 range_temp = range_expr;
10550 else
10552 range_temp = build_range_temp (range_expr);
10553 pushdecl (range_temp);
10554 cp_finish_decl (range_temp, range_expr,
10555 /*is_constant_init*/false, NULL_TREE,
10556 LOOKUP_ONLYCONVERTING);
10557 range_temp = convert_from_reference (range_temp);
10559 iter_type = cp_parser_perform_range_for_lookup (range_temp,
10560 &begin_expr, &end_expr);
10563 /* The new for initialization statement. */
10564 begin = build_decl (input_location, VAR_DECL,
10565 get_identifier ("__for_begin"), iter_type);
10566 TREE_USED (begin) = 1;
10567 DECL_ARTIFICIAL (begin) = 1;
10568 pushdecl (begin);
10569 cp_finish_decl (begin, begin_expr,
10570 /*is_constant_init*/false, NULL_TREE,
10571 LOOKUP_ONLYCONVERTING);
10573 end = build_decl (input_location, VAR_DECL,
10574 get_identifier ("__for_end"), iter_type);
10575 TREE_USED (end) = 1;
10576 DECL_ARTIFICIAL (end) = 1;
10577 pushdecl (end);
10578 cp_finish_decl (end, end_expr,
10579 /*is_constant_init*/false, NULL_TREE,
10580 LOOKUP_ONLYCONVERTING);
10582 finish_for_init_stmt (statement);
10584 /* The new for condition. */
10585 condition = build_x_binary_op (input_location, NE_EXPR,
10586 begin, ERROR_MARK,
10587 end, ERROR_MARK,
10588 NULL, tf_warning_or_error);
10589 finish_for_cond (condition, statement, ivdep);
10591 /* The new increment expression. */
10592 expression = finish_unary_op_expr (input_location,
10593 PREINCREMENT_EXPR, begin,
10594 tf_warning_or_error);
10595 finish_for_expr (expression, statement);
10597 /* The declaration is initialized with *__begin inside the loop body. */
10598 cp_finish_decl (range_decl,
10599 build_x_indirect_ref (input_location, begin, RO_NULL,
10600 tf_warning_or_error),
10601 /*is_constant_init*/false, NULL_TREE,
10602 LOOKUP_ONLYCONVERTING);
10604 return statement;
10607 /* Solves BEGIN_EXPR and END_EXPR as described in cp_convert_range_for.
10608 We need to solve both at the same time because the method used
10609 depends on the existence of members begin or end.
10610 Returns the type deduced for the iterator expression. */
10612 static tree
10613 cp_parser_perform_range_for_lookup (tree range, tree *begin, tree *end)
10615 if (error_operand_p (range))
10617 *begin = *end = error_mark_node;
10618 return error_mark_node;
10621 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (range))))
10623 error ("range-based %<for%> expression of type %qT "
10624 "has incomplete type", TREE_TYPE (range));
10625 *begin = *end = error_mark_node;
10626 return error_mark_node;
10628 if (TREE_CODE (TREE_TYPE (range)) == ARRAY_TYPE)
10630 /* If RANGE is an array, we will use pointer arithmetic. */
10631 *begin = range;
10632 *end = build_binary_op (input_location, PLUS_EXPR,
10633 range,
10634 array_type_nelts_top (TREE_TYPE (range)),
10636 return build_pointer_type (TREE_TYPE (TREE_TYPE (range)));
10638 else
10640 /* If it is not an array, we must do a bit of magic. */
10641 tree id_begin, id_end;
10642 tree member_begin, member_end;
10644 *begin = *end = error_mark_node;
10646 id_begin = get_identifier ("begin");
10647 id_end = get_identifier ("end");
10648 member_begin = lookup_member (TREE_TYPE (range), id_begin,
10649 /*protect=*/2, /*want_type=*/false,
10650 tf_warning_or_error);
10651 member_end = lookup_member (TREE_TYPE (range), id_end,
10652 /*protect=*/2, /*want_type=*/false,
10653 tf_warning_or_error);
10655 if (member_begin != NULL_TREE || member_end != NULL_TREE)
10657 /* Use the member functions. */
10658 if (member_begin != NULL_TREE)
10659 *begin = cp_parser_range_for_member_function (range, id_begin);
10660 else
10661 error ("range-based %<for%> expression of type %qT has an "
10662 "%<end%> member but not a %<begin%>", TREE_TYPE (range));
10664 if (member_end != NULL_TREE)
10665 *end = cp_parser_range_for_member_function (range, id_end);
10666 else
10667 error ("range-based %<for%> expression of type %qT has a "
10668 "%<begin%> member but not an %<end%>", TREE_TYPE (range));
10670 else
10672 /* Use global functions with ADL. */
10673 vec<tree, va_gc> *vec;
10674 vec = make_tree_vector ();
10676 vec_safe_push (vec, range);
10678 member_begin = perform_koenig_lookup (id_begin, vec,
10679 tf_warning_or_error);
10680 *begin = finish_call_expr (member_begin, &vec, false, true,
10681 tf_warning_or_error);
10682 member_end = perform_koenig_lookup (id_end, vec,
10683 tf_warning_or_error);
10684 *end = finish_call_expr (member_end, &vec, false, true,
10685 tf_warning_or_error);
10687 release_tree_vector (vec);
10690 /* Last common checks. */
10691 if (*begin == error_mark_node || *end == error_mark_node)
10693 /* If one of the expressions is an error do no more checks. */
10694 *begin = *end = error_mark_node;
10695 return error_mark_node;
10697 else if (type_dependent_expression_p (*begin)
10698 || type_dependent_expression_p (*end))
10699 /* Can happen, when, eg, in a template context, Koenig lookup
10700 can't resolve begin/end (c++/58503). */
10701 return NULL_TREE;
10702 else
10704 tree iter_type = cv_unqualified (TREE_TYPE (*begin));
10705 /* The unqualified type of the __begin and __end temporaries should
10706 be the same, as required by the multiple auto declaration. */
10707 if (!same_type_p (iter_type, cv_unqualified (TREE_TYPE (*end))))
10708 error ("inconsistent begin/end types in range-based %<for%> "
10709 "statement: %qT and %qT",
10710 TREE_TYPE (*begin), TREE_TYPE (*end));
10711 return iter_type;
10716 /* Helper function for cp_parser_perform_range_for_lookup.
10717 Builds a tree for RANGE.IDENTIFIER(). */
10719 static tree
10720 cp_parser_range_for_member_function (tree range, tree identifier)
10722 tree member, res;
10723 vec<tree, va_gc> *vec;
10725 member = finish_class_member_access_expr (range, identifier,
10726 false, tf_warning_or_error);
10727 if (member == error_mark_node)
10728 return error_mark_node;
10730 vec = make_tree_vector ();
10731 res = finish_call_expr (member, &vec,
10732 /*disallow_virtual=*/false,
10733 /*koenig_p=*/false,
10734 tf_warning_or_error);
10735 release_tree_vector (vec);
10736 return res;
10739 /* Parse an iteration-statement.
10741 iteration-statement:
10742 while ( condition ) statement
10743 do statement while ( expression ) ;
10744 for ( for-init-statement condition [opt] ; expression [opt] )
10745 statement
10747 Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT. */
10749 static tree
10750 cp_parser_iteration_statement (cp_parser* parser, bool ivdep)
10752 cp_token *token;
10753 enum rid keyword;
10754 tree statement;
10755 unsigned char in_statement;
10757 /* Peek at the next token. */
10758 token = cp_parser_require (parser, CPP_KEYWORD, RT_INTERATION);
10759 if (!token)
10760 return error_mark_node;
10762 /* Remember whether or not we are already within an iteration
10763 statement. */
10764 in_statement = parser->in_statement;
10766 /* See what kind of keyword it is. */
10767 keyword = token->keyword;
10768 switch (keyword)
10770 case RID_WHILE:
10772 tree condition;
10774 /* Begin the while-statement. */
10775 statement = begin_while_stmt ();
10776 /* Look for the `('. */
10777 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10778 /* Parse the condition. */
10779 condition = cp_parser_condition (parser);
10780 finish_while_stmt_cond (condition, statement, ivdep);
10781 /* Look for the `)'. */
10782 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
10783 /* Parse the dependent statement. */
10784 parser->in_statement = IN_ITERATION_STMT;
10785 cp_parser_already_scoped_statement (parser);
10786 parser->in_statement = in_statement;
10787 /* We're done with the while-statement. */
10788 finish_while_stmt (statement);
10790 break;
10792 case RID_DO:
10794 tree expression;
10796 /* Begin the do-statement. */
10797 statement = begin_do_stmt ();
10798 /* Parse the body of the do-statement. */
10799 parser->in_statement = IN_ITERATION_STMT;
10800 cp_parser_implicitly_scoped_statement (parser, NULL);
10801 parser->in_statement = in_statement;
10802 finish_do_body (statement);
10803 /* Look for the `while' keyword. */
10804 cp_parser_require_keyword (parser, RID_WHILE, RT_WHILE);
10805 /* Look for the `('. */
10806 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10807 /* Parse the expression. */
10808 expression = cp_parser_expression (parser);
10809 /* We're done with the do-statement. */
10810 finish_do_stmt (expression, statement, ivdep);
10811 /* Look for the `)'. */
10812 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
10813 /* Look for the `;'. */
10814 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10816 break;
10818 case RID_FOR:
10820 /* Look for the `('. */
10821 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10823 statement = cp_parser_for (parser, ivdep);
10825 /* Look for the `)'. */
10826 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
10828 /* Parse the body of the for-statement. */
10829 parser->in_statement = IN_ITERATION_STMT;
10830 cp_parser_already_scoped_statement (parser);
10831 parser->in_statement = in_statement;
10833 /* We're done with the for-statement. */
10834 finish_for_stmt (statement);
10836 break;
10838 default:
10839 cp_parser_error (parser, "expected iteration-statement");
10840 statement = error_mark_node;
10841 break;
10844 return statement;
10847 /* Parse a for-init-statement or the declarator of a range-based-for.
10848 Returns true if a range-based-for declaration is seen.
10850 for-init-statement:
10851 expression-statement
10852 simple-declaration */
10854 static bool
10855 cp_parser_for_init_statement (cp_parser* parser, tree *decl)
10857 /* If the next token is a `;', then we have an empty
10858 expression-statement. Grammatically, this is also a
10859 simple-declaration, but an invalid one, because it does not
10860 declare anything. Therefore, if we did not handle this case
10861 specially, we would issue an error message about an invalid
10862 declaration. */
10863 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
10865 bool is_range_for = false;
10866 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
10868 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
10869 && cp_lexer_nth_token_is (parser->lexer, 2, CPP_COLON))
10871 /* N3994 -- for (id : init) ... */
10872 if (cxx_dialect < cxx1z)
10873 pedwarn (input_location, 0, "range-based for loop without a "
10874 "type-specifier only available with "
10875 "-std=c++1z or -std=gnu++1z");
10876 tree name = cp_parser_identifier (parser);
10877 tree type = cp_build_reference_type (make_auto (), /*rval*/true);
10878 *decl = build_decl (input_location, VAR_DECL, name, type);
10879 pushdecl (*decl);
10880 cp_lexer_consume_token (parser->lexer);
10881 return true;
10884 /* A colon is used in range-based for. */
10885 parser->colon_corrects_to_scope_p = false;
10887 /* We're going to speculatively look for a declaration, falling back
10888 to an expression, if necessary. */
10889 cp_parser_parse_tentatively (parser);
10890 /* Parse the declaration. */
10891 cp_parser_simple_declaration (parser,
10892 /*function_definition_allowed_p=*/false,
10893 decl);
10894 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
10895 if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
10897 /* It is a range-for, consume the ':' */
10898 cp_lexer_consume_token (parser->lexer);
10899 is_range_for = true;
10900 if (cxx_dialect < cxx11)
10902 pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0,
10903 "range-based %<for%> loops only available with "
10904 "-std=c++11 or -std=gnu++11");
10905 *decl = error_mark_node;
10908 else
10909 /* The ';' is not consumed yet because we told
10910 cp_parser_simple_declaration not to. */
10911 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10913 if (cp_parser_parse_definitely (parser))
10914 return is_range_for;
10915 /* If the tentative parse failed, then we shall need to look for an
10916 expression-statement. */
10918 /* If we are here, it is an expression-statement. */
10919 cp_parser_expression_statement (parser, NULL_TREE);
10920 return false;
10923 /* Parse a jump-statement.
10925 jump-statement:
10926 break ;
10927 continue ;
10928 return expression [opt] ;
10929 return braced-init-list ;
10930 goto identifier ;
10932 GNU extension:
10934 jump-statement:
10935 goto * expression ;
10937 Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR. */
10939 static tree
10940 cp_parser_jump_statement (cp_parser* parser)
10942 tree statement = error_mark_node;
10943 cp_token *token;
10944 enum rid keyword;
10945 unsigned char in_statement;
10947 /* Peek at the next token. */
10948 token = cp_parser_require (parser, CPP_KEYWORD, RT_JUMP);
10949 if (!token)
10950 return error_mark_node;
10952 /* See what kind of keyword it is. */
10953 keyword = token->keyword;
10954 switch (keyword)
10956 case RID_BREAK:
10957 in_statement = parser->in_statement & ~IN_IF_STMT;
10958 switch (in_statement)
10960 case 0:
10961 error_at (token->location, "break statement not within loop or switch");
10962 break;
10963 default:
10964 gcc_assert ((in_statement & IN_SWITCH_STMT)
10965 || in_statement == IN_ITERATION_STMT);
10966 statement = finish_break_stmt ();
10967 if (in_statement == IN_ITERATION_STMT)
10968 break_maybe_infinite_loop ();
10969 break;
10970 case IN_OMP_BLOCK:
10971 error_at (token->location, "invalid exit from OpenMP structured block");
10972 break;
10973 case IN_OMP_FOR:
10974 error_at (token->location, "break statement used with OpenMP for loop");
10975 break;
10976 case IN_CILK_SIMD_FOR:
10977 error_at (token->location, "break statement used with Cilk Plus for loop");
10978 break;
10980 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10981 break;
10983 case RID_CONTINUE:
10984 switch (parser->in_statement & ~(IN_SWITCH_STMT | IN_IF_STMT))
10986 case 0:
10987 error_at (token->location, "continue statement not within a loop");
10988 break;
10989 case IN_CILK_SIMD_FOR:
10990 error_at (token->location,
10991 "continue statement within %<#pragma simd%> loop body");
10992 /* Fall through. */
10993 case IN_ITERATION_STMT:
10994 case IN_OMP_FOR:
10995 statement = finish_continue_stmt ();
10996 break;
10997 case IN_OMP_BLOCK:
10998 error_at (token->location, "invalid exit from OpenMP structured block");
10999 break;
11000 default:
11001 gcc_unreachable ();
11003 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
11004 break;
11006 case RID_RETURN:
11008 tree expr;
11009 bool expr_non_constant_p;
11011 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
11013 cp_lexer_set_source_position (parser->lexer);
11014 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
11015 expr = cp_parser_braced_list (parser, &expr_non_constant_p);
11017 else if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
11018 expr = cp_parser_expression (parser);
11019 else
11020 /* If the next token is a `;', then there is no
11021 expression. */
11022 expr = NULL_TREE;
11023 /* Build the return-statement. */
11024 statement = finish_return_stmt (expr);
11025 /* Look for the final `;'. */
11026 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
11028 break;
11030 case RID_GOTO:
11031 if (parser->in_function_body
11032 && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
11034 error ("%<goto%> in %<constexpr%> function");
11035 cp_function_chain->invalid_constexpr = true;
11038 /* Create the goto-statement. */
11039 if (cp_lexer_next_token_is (parser->lexer, CPP_MULT))
11041 /* Issue a warning about this use of a GNU extension. */
11042 pedwarn (token->location, OPT_Wpedantic, "ISO C++ forbids computed gotos");
11043 /* Consume the '*' token. */
11044 cp_lexer_consume_token (parser->lexer);
11045 /* Parse the dependent expression. */
11046 finish_goto_stmt (cp_parser_expression (parser));
11048 else
11049 finish_goto_stmt (cp_parser_identifier (parser));
11050 /* Look for the final `;'. */
11051 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
11052 break;
11054 default:
11055 cp_parser_error (parser, "expected jump-statement");
11056 break;
11059 return statement;
11062 /* Parse a declaration-statement.
11064 declaration-statement:
11065 block-declaration */
11067 static void
11068 cp_parser_declaration_statement (cp_parser* parser)
11070 void *p;
11072 /* Get the high-water mark for the DECLARATOR_OBSTACK. */
11073 p = obstack_alloc (&declarator_obstack, 0);
11075 /* Parse the block-declaration. */
11076 cp_parser_block_declaration (parser, /*statement_p=*/true);
11078 /* Free any declarators allocated. */
11079 obstack_free (&declarator_obstack, p);
11082 /* Some dependent statements (like `if (cond) statement'), are
11083 implicitly in their own scope. In other words, if the statement is
11084 a single statement (as opposed to a compound-statement), it is
11085 none-the-less treated as if it were enclosed in braces. Any
11086 declarations appearing in the dependent statement are out of scope
11087 after control passes that point. This function parses a statement,
11088 but ensures that is in its own scope, even if it is not a
11089 compound-statement.
11091 If IF_P is not NULL, *IF_P is set to indicate whether the statement
11092 is a (possibly labeled) if statement which is not enclosed in
11093 braces and has an else clause. This is used to implement
11094 -Wparentheses.
11096 Returns the new statement. */
11098 static tree
11099 cp_parser_implicitly_scoped_statement (cp_parser* parser, bool *if_p)
11101 tree statement;
11103 if (if_p != NULL)
11104 *if_p = false;
11106 /* Mark if () ; with a special NOP_EXPR. */
11107 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
11109 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
11110 cp_lexer_consume_token (parser->lexer);
11111 statement = add_stmt (build_empty_stmt (loc));
11113 /* if a compound is opened, we simply parse the statement directly. */
11114 else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
11115 statement = cp_parser_compound_statement (parser, NULL, false, false);
11116 /* If the token is not a `{', then we must take special action. */
11117 else
11119 /* Create a compound-statement. */
11120 statement = begin_compound_stmt (0);
11121 /* Parse the dependent-statement. */
11122 cp_parser_statement (parser, NULL_TREE, false, if_p);
11123 /* Finish the dummy compound-statement. */
11124 finish_compound_stmt (statement);
11127 /* Return the statement. */
11128 return statement;
11131 /* For some dependent statements (like `while (cond) statement'), we
11132 have already created a scope. Therefore, even if the dependent
11133 statement is a compound-statement, we do not want to create another
11134 scope. */
11136 static void
11137 cp_parser_already_scoped_statement (cp_parser* parser)
11139 /* If the token is a `{', then we must take special action. */
11140 if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
11141 cp_parser_statement (parser, NULL_TREE, false, NULL);
11142 else
11144 /* Avoid calling cp_parser_compound_statement, so that we
11145 don't create a new scope. Do everything else by hand. */
11146 cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
11147 /* If the next keyword is `__label__' we have a label declaration. */
11148 while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
11149 cp_parser_label_declaration (parser);
11150 /* Parse an (optional) statement-seq. */
11151 cp_parser_statement_seq_opt (parser, NULL_TREE);
11152 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
11156 /* Declarations [gram.dcl.dcl] */
11158 /* Parse an optional declaration-sequence.
11160 declaration-seq:
11161 declaration
11162 declaration-seq declaration */
11164 static void
11165 cp_parser_declaration_seq_opt (cp_parser* parser)
11167 while (true)
11169 cp_token *token;
11171 token = cp_lexer_peek_token (parser->lexer);
11173 if (token->type == CPP_CLOSE_BRACE
11174 || token->type == CPP_EOF
11175 || token->type == CPP_PRAGMA_EOL)
11176 break;
11178 if (token->type == CPP_SEMICOLON)
11180 /* A declaration consisting of a single semicolon is
11181 invalid. Allow it unless we're being pedantic. */
11182 cp_lexer_consume_token (parser->lexer);
11183 if (!in_system_header_at (input_location))
11184 pedwarn (input_location, OPT_Wpedantic, "extra %<;%>");
11185 continue;
11188 /* If we're entering or exiting a region that's implicitly
11189 extern "C", modify the lang context appropriately. */
11190 if (!parser->implicit_extern_c && token->implicit_extern_c)
11192 push_lang_context (lang_name_c);
11193 parser->implicit_extern_c = true;
11195 else if (parser->implicit_extern_c && !token->implicit_extern_c)
11197 pop_lang_context ();
11198 parser->implicit_extern_c = false;
11201 if (token->type == CPP_PRAGMA)
11203 /* A top-level declaration can consist solely of a #pragma.
11204 A nested declaration cannot, so this is done here and not
11205 in cp_parser_declaration. (A #pragma at block scope is
11206 handled in cp_parser_statement.) */
11207 cp_parser_pragma (parser, pragma_external);
11208 continue;
11211 /* Parse the declaration itself. */
11212 cp_parser_declaration (parser);
11216 /* Parse a declaration.
11218 declaration:
11219 block-declaration
11220 function-definition
11221 template-declaration
11222 explicit-instantiation
11223 explicit-specialization
11224 linkage-specification
11225 namespace-definition
11227 GNU extension:
11229 declaration:
11230 __extension__ declaration */
11232 static void
11233 cp_parser_declaration (cp_parser* parser)
11235 cp_token token1;
11236 cp_token token2;
11237 int saved_pedantic;
11238 void *p;
11239 tree attributes = NULL_TREE;
11241 /* Check for the `__extension__' keyword. */
11242 if (cp_parser_extension_opt (parser, &saved_pedantic))
11244 /* Parse the qualified declaration. */
11245 cp_parser_declaration (parser);
11246 /* Restore the PEDANTIC flag. */
11247 pedantic = saved_pedantic;
11249 return;
11252 /* Try to figure out what kind of declaration is present. */
11253 token1 = *cp_lexer_peek_token (parser->lexer);
11255 if (token1.type != CPP_EOF)
11256 token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
11257 else
11259 token2.type = CPP_EOF;
11260 token2.keyword = RID_MAX;
11263 /* Get the high-water mark for the DECLARATOR_OBSTACK. */
11264 p = obstack_alloc (&declarator_obstack, 0);
11266 /* If the next token is `extern' and the following token is a string
11267 literal, then we have a linkage specification. */
11268 if (token1.keyword == RID_EXTERN
11269 && cp_parser_is_pure_string_literal (&token2))
11270 cp_parser_linkage_specification (parser);
11271 /* If the next token is `template', then we have either a template
11272 declaration, an explicit instantiation, or an explicit
11273 specialization. */
11274 else if (token1.keyword == RID_TEMPLATE)
11276 /* `template <>' indicates a template specialization. */
11277 if (token2.type == CPP_LESS
11278 && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
11279 cp_parser_explicit_specialization (parser);
11280 /* `template <' indicates a template declaration. */
11281 else if (token2.type == CPP_LESS)
11282 cp_parser_template_declaration (parser, /*member_p=*/false);
11283 /* Anything else must be an explicit instantiation. */
11284 else
11285 cp_parser_explicit_instantiation (parser);
11287 /* If the next token is `export', then we have a template
11288 declaration. */
11289 else if (token1.keyword == RID_EXPORT)
11290 cp_parser_template_declaration (parser, /*member_p=*/false);
11291 /* If the next token is `extern', 'static' or 'inline' and the one
11292 after that is `template', we have a GNU extended explicit
11293 instantiation directive. */
11294 else if (cp_parser_allow_gnu_extensions_p (parser)
11295 && (token1.keyword == RID_EXTERN
11296 || token1.keyword == RID_STATIC
11297 || token1.keyword == RID_INLINE)
11298 && token2.keyword == RID_TEMPLATE)
11299 cp_parser_explicit_instantiation (parser);
11300 /* If the next token is `namespace', check for a named or unnamed
11301 namespace definition. */
11302 else if (token1.keyword == RID_NAMESPACE
11303 && (/* A named namespace definition. */
11304 (token2.type == CPP_NAME
11305 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
11306 != CPP_EQ))
11307 /* An unnamed namespace definition. */
11308 || token2.type == CPP_OPEN_BRACE
11309 || token2.keyword == RID_ATTRIBUTE))
11310 cp_parser_namespace_definition (parser);
11311 /* An inline (associated) namespace definition. */
11312 else if (token1.keyword == RID_INLINE
11313 && token2.keyword == RID_NAMESPACE)
11314 cp_parser_namespace_definition (parser);
11315 /* Objective-C++ declaration/definition. */
11316 else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
11317 cp_parser_objc_declaration (parser, NULL_TREE);
11318 else if (c_dialect_objc ()
11319 && token1.keyword == RID_ATTRIBUTE
11320 && cp_parser_objc_valid_prefix_attributes (parser, &attributes))
11321 cp_parser_objc_declaration (parser, attributes);
11322 /* We must have either a block declaration or a function
11323 definition. */
11324 else
11325 /* Try to parse a block-declaration, or a function-definition. */
11326 cp_parser_block_declaration (parser, /*statement_p=*/false);
11328 /* Free any declarators allocated. */
11329 obstack_free (&declarator_obstack, p);
11332 /* Parse a block-declaration.
11334 block-declaration:
11335 simple-declaration
11336 asm-definition
11337 namespace-alias-definition
11338 using-declaration
11339 using-directive
11341 GNU Extension:
11343 block-declaration:
11344 __extension__ block-declaration
11346 C++0x Extension:
11348 block-declaration:
11349 static_assert-declaration
11351 If STATEMENT_P is TRUE, then this block-declaration is occurring as
11352 part of a declaration-statement. */
11354 static void
11355 cp_parser_block_declaration (cp_parser *parser,
11356 bool statement_p)
11358 cp_token *token1;
11359 int saved_pedantic;
11361 /* Check for the `__extension__' keyword. */
11362 if (cp_parser_extension_opt (parser, &saved_pedantic))
11364 /* Parse the qualified declaration. */
11365 cp_parser_block_declaration (parser, statement_p);
11366 /* Restore the PEDANTIC flag. */
11367 pedantic = saved_pedantic;
11369 return;
11372 /* Peek at the next token to figure out which kind of declaration is
11373 present. */
11374 token1 = cp_lexer_peek_token (parser->lexer);
11376 /* If the next keyword is `asm', we have an asm-definition. */
11377 if (token1->keyword == RID_ASM)
11379 if (statement_p)
11380 cp_parser_commit_to_tentative_parse (parser);
11381 cp_parser_asm_definition (parser);
11383 /* If the next keyword is `namespace', we have a
11384 namespace-alias-definition. */
11385 else if (token1->keyword == RID_NAMESPACE)
11386 cp_parser_namespace_alias_definition (parser);
11387 /* If the next keyword is `using', we have a
11388 using-declaration, a using-directive, or an alias-declaration. */
11389 else if (token1->keyword == RID_USING)
11391 cp_token *token2;
11393 if (statement_p)
11394 cp_parser_commit_to_tentative_parse (parser);
11395 /* If the token after `using' is `namespace', then we have a
11396 using-directive. */
11397 token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
11398 if (token2->keyword == RID_NAMESPACE)
11399 cp_parser_using_directive (parser);
11400 /* If the second token after 'using' is '=', then we have an
11401 alias-declaration. */
11402 else if (cxx_dialect >= cxx11
11403 && token2->type == CPP_NAME
11404 && ((cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_EQ)
11405 || (cp_nth_tokens_can_be_attribute_p (parser, 3))))
11406 cp_parser_alias_declaration (parser);
11407 /* Otherwise, it's a using-declaration. */
11408 else
11409 cp_parser_using_declaration (parser,
11410 /*access_declaration_p=*/false);
11412 /* If the next keyword is `__label__' we have a misplaced label
11413 declaration. */
11414 else if (token1->keyword == RID_LABEL)
11416 cp_lexer_consume_token (parser->lexer);
11417 error_at (token1->location, "%<__label__%> not at the beginning of a block");
11418 cp_parser_skip_to_end_of_statement (parser);
11419 /* If the next token is now a `;', consume it. */
11420 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
11421 cp_lexer_consume_token (parser->lexer);
11423 /* If the next token is `static_assert' we have a static assertion. */
11424 else if (token1->keyword == RID_STATIC_ASSERT)
11425 cp_parser_static_assert (parser, /*member_p=*/false);
11426 /* Anything else must be a simple-declaration. */
11427 else
11428 cp_parser_simple_declaration (parser, !statement_p,
11429 /*maybe_range_for_decl*/NULL);
11432 /* Parse a simple-declaration.
11434 simple-declaration:
11435 decl-specifier-seq [opt] init-declarator-list [opt] ;
11437 init-declarator-list:
11438 init-declarator
11439 init-declarator-list , init-declarator
11441 If FUNCTION_DEFINITION_ALLOWED_P is TRUE, then we also recognize a
11442 function-definition as a simple-declaration.
11444 If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
11445 parsed declaration if it is an uninitialized single declarator not followed
11446 by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
11447 if present, will not be consumed. */
11449 static void
11450 cp_parser_simple_declaration (cp_parser* parser,
11451 bool function_definition_allowed_p,
11452 tree *maybe_range_for_decl)
11454 cp_decl_specifier_seq decl_specifiers;
11455 int declares_class_or_enum;
11456 bool saw_declarator;
11458 if (maybe_range_for_decl)
11459 *maybe_range_for_decl = NULL_TREE;
11461 /* Defer access checks until we know what is being declared; the
11462 checks for names appearing in the decl-specifier-seq should be
11463 done as if we were in the scope of the thing being declared. */
11464 push_deferring_access_checks (dk_deferred);
11466 /* Parse the decl-specifier-seq. We have to keep track of whether
11467 or not the decl-specifier-seq declares a named class or
11468 enumeration type, since that is the only case in which the
11469 init-declarator-list is allowed to be empty.
11471 [dcl.dcl]
11473 In a simple-declaration, the optional init-declarator-list can be
11474 omitted only when declaring a class or enumeration, that is when
11475 the decl-specifier-seq contains either a class-specifier, an
11476 elaborated-type-specifier, or an enum-specifier. */
11477 cp_parser_decl_specifier_seq (parser,
11478 CP_PARSER_FLAGS_OPTIONAL,
11479 &decl_specifiers,
11480 &declares_class_or_enum);
11481 /* We no longer need to defer access checks. */
11482 stop_deferring_access_checks ();
11484 /* In a block scope, a valid declaration must always have a
11485 decl-specifier-seq. By not trying to parse declarators, we can
11486 resolve the declaration/expression ambiguity more quickly. */
11487 if (!function_definition_allowed_p
11488 && !decl_specifiers.any_specifiers_p)
11490 cp_parser_error (parser, "expected declaration");
11491 goto done;
11494 /* If the next two tokens are both identifiers, the code is
11495 erroneous. The usual cause of this situation is code like:
11497 T t;
11499 where "T" should name a type -- but does not. */
11500 if (!decl_specifiers.any_type_specifiers_p
11501 && cp_parser_parse_and_diagnose_invalid_type_name (parser))
11503 /* If parsing tentatively, we should commit; we really are
11504 looking at a declaration. */
11505 cp_parser_commit_to_tentative_parse (parser);
11506 /* Give up. */
11507 goto done;
11510 /* If we have seen at least one decl-specifier, and the next token
11511 is not a parenthesis, then we must be looking at a declaration.
11512 (After "int (" we might be looking at a functional cast.) */
11513 if (decl_specifiers.any_specifiers_p
11514 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN)
11515 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
11516 && !cp_parser_error_occurred (parser))
11517 cp_parser_commit_to_tentative_parse (parser);
11519 /* Keep going until we hit the `;' at the end of the simple
11520 declaration. */
11521 saw_declarator = false;
11522 while (cp_lexer_next_token_is_not (parser->lexer,
11523 CPP_SEMICOLON))
11525 cp_token *token;
11526 bool function_definition_p;
11527 tree decl;
11529 if (saw_declarator)
11531 /* If we are processing next declarator, coma is expected */
11532 token = cp_lexer_peek_token (parser->lexer);
11533 gcc_assert (token->type == CPP_COMMA);
11534 cp_lexer_consume_token (parser->lexer);
11535 if (maybe_range_for_decl)
11536 *maybe_range_for_decl = error_mark_node;
11538 else
11539 saw_declarator = true;
11541 /* Parse the init-declarator. */
11542 decl = cp_parser_init_declarator (parser, &decl_specifiers,
11543 /*checks=*/NULL,
11544 function_definition_allowed_p,
11545 /*member_p=*/false,
11546 declares_class_or_enum,
11547 &function_definition_p,
11548 maybe_range_for_decl);
11549 /* If an error occurred while parsing tentatively, exit quickly.
11550 (That usually happens when in the body of a function; each
11551 statement is treated as a declaration-statement until proven
11552 otherwise.) */
11553 if (cp_parser_error_occurred (parser))
11554 goto done;
11555 /* Handle function definitions specially. */
11556 if (function_definition_p)
11558 /* If the next token is a `,', then we are probably
11559 processing something like:
11561 void f() {}, *p;
11563 which is erroneous. */
11564 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
11566 cp_token *token = cp_lexer_peek_token (parser->lexer);
11567 error_at (token->location,
11568 "mixing"
11569 " declarations and function-definitions is forbidden");
11571 /* Otherwise, we're done with the list of declarators. */
11572 else
11574 pop_deferring_access_checks ();
11575 return;
11578 if (maybe_range_for_decl && *maybe_range_for_decl == NULL_TREE)
11579 *maybe_range_for_decl = decl;
11580 /* The next token should be either a `,' or a `;'. */
11581 token = cp_lexer_peek_token (parser->lexer);
11582 /* If it's a `,', there are more declarators to come. */
11583 if (token->type == CPP_COMMA)
11584 /* will be consumed next time around */;
11585 /* If it's a `;', we are done. */
11586 else if (token->type == CPP_SEMICOLON || maybe_range_for_decl)
11587 break;
11588 /* Anything else is an error. */
11589 else
11591 /* If we have already issued an error message we don't need
11592 to issue another one. */
11593 if (decl != error_mark_node
11594 || cp_parser_uncommitted_to_tentative_parse_p (parser))
11595 cp_parser_error (parser, "expected %<,%> or %<;%>");
11596 /* Skip tokens until we reach the end of the statement. */
11597 cp_parser_skip_to_end_of_statement (parser);
11598 /* If the next token is now a `;', consume it. */
11599 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
11600 cp_lexer_consume_token (parser->lexer);
11601 goto done;
11603 /* After the first time around, a function-definition is not
11604 allowed -- even if it was OK at first. For example:
11606 int i, f() {}
11608 is not valid. */
11609 function_definition_allowed_p = false;
11612 /* Issue an error message if no declarators are present, and the
11613 decl-specifier-seq does not itself declare a class or
11614 enumeration: [dcl.dcl]/3. */
11615 if (!saw_declarator)
11617 if (cp_parser_declares_only_class_p (parser))
11619 if (!declares_class_or_enum
11620 && decl_specifiers.type
11621 && OVERLOAD_TYPE_P (decl_specifiers.type))
11622 /* Ensure an error is issued anyway when finish_decltype_type,
11623 called via cp_parser_decl_specifier_seq, returns a class or
11624 an enumeration (c++/51786). */
11625 decl_specifiers.type = NULL_TREE;
11626 shadow_tag (&decl_specifiers);
11628 /* Perform any deferred access checks. */
11629 perform_deferred_access_checks (tf_warning_or_error);
11632 /* Consume the `;'. */
11633 if (!maybe_range_for_decl)
11634 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
11636 done:
11637 pop_deferring_access_checks ();
11640 /* Parse a decl-specifier-seq.
11642 decl-specifier-seq:
11643 decl-specifier-seq [opt] decl-specifier
11644 decl-specifier attribute-specifier-seq [opt] (C++11)
11646 decl-specifier:
11647 storage-class-specifier
11648 type-specifier
11649 function-specifier
11650 friend
11651 typedef
11653 GNU Extension:
11655 decl-specifier:
11656 attributes
11658 Set *DECL_SPECS to a representation of the decl-specifier-seq.
11660 The parser flags FLAGS is used to control type-specifier parsing.
11662 *DECLARES_CLASS_OR_ENUM is set to the bitwise or of the following
11663 flags:
11665 1: one of the decl-specifiers is an elaborated-type-specifier
11666 (i.e., a type declaration)
11667 2: one of the decl-specifiers is an enum-specifier or a
11668 class-specifier (i.e., a type definition)
11672 static void
11673 cp_parser_decl_specifier_seq (cp_parser* parser,
11674 cp_parser_flags flags,
11675 cp_decl_specifier_seq *decl_specs,
11676 int* declares_class_or_enum)
11678 bool constructor_possible_p = !parser->in_declarator_p;
11679 bool found_decl_spec = false;
11680 cp_token *start_token = NULL;
11681 cp_decl_spec ds;
11683 /* Clear DECL_SPECS. */
11684 clear_decl_specs (decl_specs);
11686 /* Assume no class or enumeration type is declared. */
11687 *declares_class_or_enum = 0;
11689 /* Keep reading specifiers until there are no more to read. */
11690 while (true)
11692 bool constructor_p;
11693 cp_token *token;
11694 ds = ds_last;
11696 /* Peek at the next token. */
11697 token = cp_lexer_peek_token (parser->lexer);
11699 /* Save the first token of the decl spec list for error
11700 reporting. */
11701 if (!start_token)
11702 start_token = token;
11703 /* Handle attributes. */
11704 if (cp_next_tokens_can_be_attribute_p (parser))
11706 /* Parse the attributes. */
11707 tree attrs = cp_parser_attributes_opt (parser);
11709 /* In a sequence of declaration specifiers, c++11 attributes
11710 appertain to the type that precede them. In that case
11711 [dcl.spec]/1 says:
11713 The attribute-specifier-seq affects the type only for
11714 the declaration it appears in, not other declarations
11715 involving the same type.
11717 But for now let's force the user to position the
11718 attribute either at the beginning of the declaration or
11719 after the declarator-id, which would clearly mean that it
11720 applies to the declarator. */
11721 if (cxx11_attribute_p (attrs))
11723 if (!found_decl_spec)
11724 /* The c++11 attribute is at the beginning of the
11725 declaration. It appertains to the entity being
11726 declared. */;
11727 else
11729 if (decl_specs->type && CLASS_TYPE_P (decl_specs->type))
11731 /* This is an attribute following a
11732 class-specifier. */
11733 if (decl_specs->type_definition_p)
11734 warn_misplaced_attr_for_class_type (token->location,
11735 decl_specs->type);
11736 attrs = NULL_TREE;
11738 else
11740 decl_specs->std_attributes
11741 = chainon (decl_specs->std_attributes,
11742 attrs);
11743 if (decl_specs->locations[ds_std_attribute] == 0)
11744 decl_specs->locations[ds_std_attribute] = token->location;
11746 continue;
11750 decl_specs->attributes
11751 = chainon (decl_specs->attributes,
11752 attrs);
11753 if (decl_specs->locations[ds_attribute] == 0)
11754 decl_specs->locations[ds_attribute] = token->location;
11755 continue;
11757 /* Assume we will find a decl-specifier keyword. */
11758 found_decl_spec = true;
11759 /* If the next token is an appropriate keyword, we can simply
11760 add it to the list. */
11761 switch (token->keyword)
11763 /* decl-specifier:
11764 friend
11765 constexpr */
11766 case RID_FRIEND:
11767 if (!at_class_scope_p ())
11769 error_at (token->location, "%<friend%> used outside of class");
11770 cp_lexer_purge_token (parser->lexer);
11772 else
11774 ds = ds_friend;
11775 /* Consume the token. */
11776 cp_lexer_consume_token (parser->lexer);
11778 break;
11780 case RID_CONSTEXPR:
11781 ds = ds_constexpr;
11782 cp_lexer_consume_token (parser->lexer);
11783 break;
11785 /* function-specifier:
11786 inline
11787 virtual
11788 explicit */
11789 case RID_INLINE:
11790 case RID_VIRTUAL:
11791 case RID_EXPLICIT:
11792 cp_parser_function_specifier_opt (parser, decl_specs);
11793 break;
11795 /* decl-specifier:
11796 typedef */
11797 case RID_TYPEDEF:
11798 ds = ds_typedef;
11799 /* Consume the token. */
11800 cp_lexer_consume_token (parser->lexer);
11801 /* A constructor declarator cannot appear in a typedef. */
11802 constructor_possible_p = false;
11803 /* The "typedef" keyword can only occur in a declaration; we
11804 may as well commit at this point. */
11805 cp_parser_commit_to_tentative_parse (parser);
11807 if (decl_specs->storage_class != sc_none)
11808 decl_specs->conflicting_specifiers_p = true;
11809 break;
11811 /* storage-class-specifier:
11812 auto
11813 register
11814 static
11815 extern
11816 mutable
11818 GNU Extension:
11819 thread */
11820 case RID_AUTO:
11821 if (cxx_dialect == cxx98)
11823 /* Consume the token. */
11824 cp_lexer_consume_token (parser->lexer);
11826 /* Complain about `auto' as a storage specifier, if
11827 we're complaining about C++0x compatibility. */
11828 warning_at (token->location, OPT_Wc__0x_compat, "%<auto%>"
11829 " changes meaning in C++11; please remove it");
11831 /* Set the storage class anyway. */
11832 cp_parser_set_storage_class (parser, decl_specs, RID_AUTO,
11833 token);
11835 else
11836 /* C++0x auto type-specifier. */
11837 found_decl_spec = false;
11838 break;
11840 case RID_REGISTER:
11841 case RID_STATIC:
11842 case RID_EXTERN:
11843 case RID_MUTABLE:
11844 /* Consume the token. */
11845 cp_lexer_consume_token (parser->lexer);
11846 cp_parser_set_storage_class (parser, decl_specs, token->keyword,
11847 token);
11848 break;
11849 case RID_THREAD:
11850 /* Consume the token. */
11851 ds = ds_thread;
11852 cp_lexer_consume_token (parser->lexer);
11853 break;
11855 default:
11856 /* We did not yet find a decl-specifier yet. */
11857 found_decl_spec = false;
11858 break;
11861 if (found_decl_spec
11862 && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR)
11863 && token->keyword != RID_CONSTEXPR)
11864 error ("decl-specifier invalid in condition");
11866 if (ds != ds_last)
11867 set_and_check_decl_spec_loc (decl_specs, ds, token);
11869 /* Constructors are a special case. The `S' in `S()' is not a
11870 decl-specifier; it is the beginning of the declarator. */
11871 constructor_p
11872 = (!found_decl_spec
11873 && constructor_possible_p
11874 && (cp_parser_constructor_declarator_p
11875 (parser, decl_spec_seq_has_spec_p (decl_specs, ds_friend))));
11877 /* If we don't have a DECL_SPEC yet, then we must be looking at
11878 a type-specifier. */
11879 if (!found_decl_spec && !constructor_p)
11881 int decl_spec_declares_class_or_enum;
11882 bool is_cv_qualifier;
11883 tree type_spec;
11885 type_spec
11886 = cp_parser_type_specifier (parser, flags,
11887 decl_specs,
11888 /*is_declaration=*/true,
11889 &decl_spec_declares_class_or_enum,
11890 &is_cv_qualifier);
11891 *declares_class_or_enum |= decl_spec_declares_class_or_enum;
11893 /* If this type-specifier referenced a user-defined type
11894 (a typedef, class-name, etc.), then we can't allow any
11895 more such type-specifiers henceforth.
11897 [dcl.spec]
11899 The longest sequence of decl-specifiers that could
11900 possibly be a type name is taken as the
11901 decl-specifier-seq of a declaration. The sequence shall
11902 be self-consistent as described below.
11904 [dcl.type]
11906 As a general rule, at most one type-specifier is allowed
11907 in the complete decl-specifier-seq of a declaration. The
11908 only exceptions are the following:
11910 -- const or volatile can be combined with any other
11911 type-specifier.
11913 -- signed or unsigned can be combined with char, long,
11914 short, or int.
11916 -- ..
11918 Example:
11920 typedef char* Pc;
11921 void g (const int Pc);
11923 Here, Pc is *not* part of the decl-specifier seq; it's
11924 the declarator. Therefore, once we see a type-specifier
11925 (other than a cv-qualifier), we forbid any additional
11926 user-defined types. We *do* still allow things like `int
11927 int' to be considered a decl-specifier-seq, and issue the
11928 error message later. */
11929 if (type_spec && !is_cv_qualifier)
11930 flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
11931 /* A constructor declarator cannot follow a type-specifier. */
11932 if (type_spec)
11934 constructor_possible_p = false;
11935 found_decl_spec = true;
11936 if (!is_cv_qualifier)
11937 decl_specs->any_type_specifiers_p = true;
11941 /* If we still do not have a DECL_SPEC, then there are no more
11942 decl-specifiers. */
11943 if (!found_decl_spec)
11944 break;
11946 decl_specs->any_specifiers_p = true;
11947 /* After we see one decl-specifier, further decl-specifiers are
11948 always optional. */
11949 flags |= CP_PARSER_FLAGS_OPTIONAL;
11952 /* Don't allow a friend specifier with a class definition. */
11953 if (decl_spec_seq_has_spec_p (decl_specs, ds_friend)
11954 && (*declares_class_or_enum & 2))
11955 error_at (decl_specs->locations[ds_friend],
11956 "class definition may not be declared a friend");
11959 /* Parse an (optional) storage-class-specifier.
11961 storage-class-specifier:
11962 auto
11963 register
11964 static
11965 extern
11966 mutable
11968 GNU Extension:
11970 storage-class-specifier:
11971 thread
11973 Returns an IDENTIFIER_NODE corresponding to the keyword used. */
11975 static tree
11976 cp_parser_storage_class_specifier_opt (cp_parser* parser)
11978 switch (cp_lexer_peek_token (parser->lexer)->keyword)
11980 case RID_AUTO:
11981 if (cxx_dialect != cxx98)
11982 return NULL_TREE;
11983 /* Fall through for C++98. */
11985 case RID_REGISTER:
11986 case RID_STATIC:
11987 case RID_EXTERN:
11988 case RID_MUTABLE:
11989 case RID_THREAD:
11990 /* Consume the token. */
11991 return cp_lexer_consume_token (parser->lexer)->u.value;
11993 default:
11994 return NULL_TREE;
11998 /* Parse an (optional) function-specifier.
12000 function-specifier:
12001 inline
12002 virtual
12003 explicit
12005 Returns an IDENTIFIER_NODE corresponding to the keyword used.
12006 Updates DECL_SPECS, if it is non-NULL. */
12008 static tree
12009 cp_parser_function_specifier_opt (cp_parser* parser,
12010 cp_decl_specifier_seq *decl_specs)
12012 cp_token *token = cp_lexer_peek_token (parser->lexer);
12013 switch (token->keyword)
12015 case RID_INLINE:
12016 set_and_check_decl_spec_loc (decl_specs, ds_inline, token);
12017 break;
12019 case RID_VIRTUAL:
12020 /* 14.5.2.3 [temp.mem]
12022 A member function template shall not be virtual. */
12023 if (PROCESSING_REAL_TEMPLATE_DECL_P ())
12024 error_at (token->location, "templates may not be %<virtual%>");
12025 else
12026 set_and_check_decl_spec_loc (decl_specs, ds_virtual, token);
12027 break;
12029 case RID_EXPLICIT:
12030 set_and_check_decl_spec_loc (decl_specs, ds_explicit, token);
12031 break;
12033 default:
12034 return NULL_TREE;
12037 /* Consume the token. */
12038 return cp_lexer_consume_token (parser->lexer)->u.value;
12041 /* Parse a linkage-specification.
12043 linkage-specification:
12044 extern string-literal { declaration-seq [opt] }
12045 extern string-literal declaration */
12047 static void
12048 cp_parser_linkage_specification (cp_parser* parser)
12050 tree linkage;
12052 /* Look for the `extern' keyword. */
12053 cp_parser_require_keyword (parser, RID_EXTERN, RT_EXTERN);
12055 /* Look for the string-literal. */
12056 linkage = cp_parser_string_literal (parser, false, false);
12058 /* Transform the literal into an identifier. If the literal is a
12059 wide-character string, or contains embedded NULs, then we can't
12060 handle it as the user wants. */
12061 if (strlen (TREE_STRING_POINTER (linkage))
12062 != (size_t) (TREE_STRING_LENGTH (linkage) - 1))
12064 cp_parser_error (parser, "invalid linkage-specification");
12065 /* Assume C++ linkage. */
12066 linkage = lang_name_cplusplus;
12068 else
12069 linkage = get_identifier (TREE_STRING_POINTER (linkage));
12071 /* We're now using the new linkage. */
12072 push_lang_context (linkage);
12074 /* If the next token is a `{', then we're using the first
12075 production. */
12076 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
12078 cp_ensure_no_omp_declare_simd (parser);
12080 /* Consume the `{' token. */
12081 cp_lexer_consume_token (parser->lexer);
12082 /* Parse the declarations. */
12083 cp_parser_declaration_seq_opt (parser);
12084 /* Look for the closing `}'. */
12085 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
12087 /* Otherwise, there's just one declaration. */
12088 else
12090 bool saved_in_unbraced_linkage_specification_p;
12092 saved_in_unbraced_linkage_specification_p
12093 = parser->in_unbraced_linkage_specification_p;
12094 parser->in_unbraced_linkage_specification_p = true;
12095 cp_parser_declaration (parser);
12096 parser->in_unbraced_linkage_specification_p
12097 = saved_in_unbraced_linkage_specification_p;
12100 /* We're done with the linkage-specification. */
12101 pop_lang_context ();
12104 /* Parse a static_assert-declaration.
12106 static_assert-declaration:
12107 static_assert ( constant-expression , string-literal ) ;
12109 If MEMBER_P, this static_assert is a class member. */
12111 static void
12112 cp_parser_static_assert(cp_parser *parser, bool member_p)
12114 tree condition;
12115 tree message;
12116 cp_token *token;
12117 location_t saved_loc;
12118 bool dummy;
12120 /* Peek at the `static_assert' token so we can keep track of exactly
12121 where the static assertion started. */
12122 token = cp_lexer_peek_token (parser->lexer);
12123 saved_loc = token->location;
12125 /* Look for the `static_assert' keyword. */
12126 if (!cp_parser_require_keyword (parser, RID_STATIC_ASSERT,
12127 RT_STATIC_ASSERT))
12128 return;
12130 /* We know we are in a static assertion; commit to any tentative
12131 parse. */
12132 if (cp_parser_parsing_tentatively (parser))
12133 cp_parser_commit_to_tentative_parse (parser);
12135 /* Parse the `(' starting the static assertion condition. */
12136 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
12138 /* Parse the constant-expression. Allow a non-constant expression
12139 here in order to give better diagnostics in finish_static_assert. */
12140 condition =
12141 cp_parser_constant_expression (parser,
12142 /*allow_non_constant_p=*/true,
12143 /*non_constant_p=*/&dummy);
12145 /* Parse the separating `,'. */
12146 cp_parser_require (parser, CPP_COMMA, RT_COMMA);
12148 /* Parse the string-literal message. */
12149 message = cp_parser_string_literal (parser,
12150 /*translate=*/false,
12151 /*wide_ok=*/true);
12153 /* A `)' completes the static assertion. */
12154 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
12155 cp_parser_skip_to_closing_parenthesis (parser,
12156 /*recovering=*/true,
12157 /*or_comma=*/false,
12158 /*consume_paren=*/true);
12160 /* A semicolon terminates the declaration. */
12161 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12163 /* Complete the static assertion, which may mean either processing
12164 the static assert now or saving it for template instantiation. */
12165 finish_static_assert (condition, message, saved_loc, member_p);
12168 /* Parse the expression in decltype ( expression ). */
12170 static tree
12171 cp_parser_decltype_expr (cp_parser *parser,
12172 bool &id_expression_or_member_access_p)
12174 cp_token *id_expr_start_token;
12175 tree expr;
12177 /* First, try parsing an id-expression. */
12178 id_expr_start_token = cp_lexer_peek_token (parser->lexer);
12179 cp_parser_parse_tentatively (parser);
12180 expr = cp_parser_id_expression (parser,
12181 /*template_keyword_p=*/false,
12182 /*check_dependency_p=*/true,
12183 /*template_p=*/NULL,
12184 /*declarator_p=*/false,
12185 /*optional_p=*/false);
12187 if (!cp_parser_error_occurred (parser) && expr != error_mark_node)
12189 bool non_integral_constant_expression_p = false;
12190 tree id_expression = expr;
12191 cp_id_kind idk;
12192 const char *error_msg;
12194 if (identifier_p (expr))
12195 /* Lookup the name we got back from the id-expression. */
12196 expr = cp_parser_lookup_name_simple (parser, expr,
12197 id_expr_start_token->location);
12199 if (expr
12200 && expr != error_mark_node
12201 && TREE_CODE (expr) != TYPE_DECL
12202 && (TREE_CODE (expr) != BIT_NOT_EXPR
12203 || !TYPE_P (TREE_OPERAND (expr, 0)))
12204 && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
12206 /* Complete lookup of the id-expression. */
12207 expr = (finish_id_expression
12208 (id_expression, expr, parser->scope, &idk,
12209 /*integral_constant_expression_p=*/false,
12210 /*allow_non_integral_constant_expression_p=*/true,
12211 &non_integral_constant_expression_p,
12212 /*template_p=*/false,
12213 /*done=*/true,
12214 /*address_p=*/false,
12215 /*template_arg_p=*/false,
12216 &error_msg,
12217 id_expr_start_token->location));
12219 if (expr == error_mark_node)
12220 /* We found an id-expression, but it was something that we
12221 should not have found. This is an error, not something
12222 we can recover from, so note that we found an
12223 id-expression and we'll recover as gracefully as
12224 possible. */
12225 id_expression_or_member_access_p = true;
12228 if (expr
12229 && expr != error_mark_node
12230 && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
12231 /* We have an id-expression. */
12232 id_expression_or_member_access_p = true;
12235 if (!id_expression_or_member_access_p)
12237 /* Abort the id-expression parse. */
12238 cp_parser_abort_tentative_parse (parser);
12240 /* Parsing tentatively, again. */
12241 cp_parser_parse_tentatively (parser);
12243 /* Parse a class member access. */
12244 expr = cp_parser_postfix_expression (parser, /*address_p=*/false,
12245 /*cast_p=*/false, /*decltype*/true,
12246 /*member_access_only_p=*/true, NULL);
12248 if (expr
12249 && expr != error_mark_node
12250 && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
12251 /* We have an id-expression. */
12252 id_expression_or_member_access_p = true;
12255 if (id_expression_or_member_access_p)
12256 /* We have parsed the complete id-expression or member access. */
12257 cp_parser_parse_definitely (parser);
12258 else
12260 /* Abort our attempt to parse an id-expression or member access
12261 expression. */
12262 cp_parser_abort_tentative_parse (parser);
12264 /* Parse a full expression. */
12265 expr = cp_parser_expression (parser, /*pidk=*/NULL, /*cast_p=*/false,
12266 /*decltype_p=*/true);
12269 return expr;
12272 /* Parse a `decltype' type. Returns the type.
12274 simple-type-specifier:
12275 decltype ( expression )
12276 C++14 proposal:
12277 decltype ( auto ) */
12279 static tree
12280 cp_parser_decltype (cp_parser *parser)
12282 tree expr;
12283 bool id_expression_or_member_access_p = false;
12284 const char *saved_message;
12285 bool saved_integral_constant_expression_p;
12286 bool saved_non_integral_constant_expression_p;
12287 bool saved_greater_than_is_operator_p;
12288 cp_token *start_token = cp_lexer_peek_token (parser->lexer);
12290 if (start_token->type == CPP_DECLTYPE)
12292 /* Already parsed. */
12293 cp_lexer_consume_token (parser->lexer);
12294 return start_token->u.value;
12297 /* Look for the `decltype' token. */
12298 if (!cp_parser_require_keyword (parser, RID_DECLTYPE, RT_DECLTYPE))
12299 return error_mark_node;
12301 /* Parse the opening `('. */
12302 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
12303 return error_mark_node;
12305 /* decltype (auto) */
12306 if (cxx_dialect >= cxx14
12307 && cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
12309 cp_lexer_consume_token (parser->lexer);
12310 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
12311 return error_mark_node;
12312 expr = make_decltype_auto ();
12313 AUTO_IS_DECLTYPE (expr) = true;
12314 goto rewrite;
12317 /* Types cannot be defined in a `decltype' expression. Save away the
12318 old message. */
12319 saved_message = parser->type_definition_forbidden_message;
12321 /* And create the new one. */
12322 parser->type_definition_forbidden_message
12323 = G_("types may not be defined in %<decltype%> expressions");
12325 /* The restrictions on constant-expressions do not apply inside
12326 decltype expressions. */
12327 saved_integral_constant_expression_p
12328 = parser->integral_constant_expression_p;
12329 saved_non_integral_constant_expression_p
12330 = parser->non_integral_constant_expression_p;
12331 parser->integral_constant_expression_p = false;
12333 /* Within a parenthesized expression, a `>' token is always
12334 the greater-than operator. */
12335 saved_greater_than_is_operator_p
12336 = parser->greater_than_is_operator_p;
12337 parser->greater_than_is_operator_p = true;
12339 /* Do not actually evaluate the expression. */
12340 ++cp_unevaluated_operand;
12342 /* Do not warn about problems with the expression. */
12343 ++c_inhibit_evaluation_warnings;
12345 expr = cp_parser_decltype_expr (parser, id_expression_or_member_access_p);
12347 /* Go back to evaluating expressions. */
12348 --cp_unevaluated_operand;
12349 --c_inhibit_evaluation_warnings;
12351 /* The `>' token might be the end of a template-id or
12352 template-parameter-list now. */
12353 parser->greater_than_is_operator_p
12354 = saved_greater_than_is_operator_p;
12356 /* Restore the old message and the integral constant expression
12357 flags. */
12358 parser->type_definition_forbidden_message = saved_message;
12359 parser->integral_constant_expression_p
12360 = saved_integral_constant_expression_p;
12361 parser->non_integral_constant_expression_p
12362 = saved_non_integral_constant_expression_p;
12364 /* Parse to the closing `)'. */
12365 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
12367 cp_parser_skip_to_closing_parenthesis (parser, true, false,
12368 /*consume_paren=*/true);
12369 return error_mark_node;
12372 expr = finish_decltype_type (expr, id_expression_or_member_access_p,
12373 tf_warning_or_error);
12375 rewrite:
12376 /* Replace the decltype with a CPP_DECLTYPE so we don't need to parse
12377 it again. */
12378 start_token->type = CPP_DECLTYPE;
12379 start_token->u.value = expr;
12380 start_token->keyword = RID_MAX;
12381 cp_lexer_purge_tokens_after (parser->lexer, start_token);
12383 return expr;
12386 /* Special member functions [gram.special] */
12388 /* Parse a conversion-function-id.
12390 conversion-function-id:
12391 operator conversion-type-id
12393 Returns an IDENTIFIER_NODE representing the operator. */
12395 static tree
12396 cp_parser_conversion_function_id (cp_parser* parser)
12398 tree type;
12399 tree saved_scope;
12400 tree saved_qualifying_scope;
12401 tree saved_object_scope;
12402 tree pushed_scope = NULL_TREE;
12404 /* Look for the `operator' token. */
12405 if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
12406 return error_mark_node;
12407 /* When we parse the conversion-type-id, the current scope will be
12408 reset. However, we need that information in able to look up the
12409 conversion function later, so we save it here. */
12410 saved_scope = parser->scope;
12411 saved_qualifying_scope = parser->qualifying_scope;
12412 saved_object_scope = parser->object_scope;
12413 /* We must enter the scope of the class so that the names of
12414 entities declared within the class are available in the
12415 conversion-type-id. For example, consider:
12417 struct S {
12418 typedef int I;
12419 operator I();
12422 S::operator I() { ... }
12424 In order to see that `I' is a type-name in the definition, we
12425 must be in the scope of `S'. */
12426 if (saved_scope)
12427 pushed_scope = push_scope (saved_scope);
12428 /* Parse the conversion-type-id. */
12429 type = cp_parser_conversion_type_id (parser);
12430 /* Leave the scope of the class, if any. */
12431 if (pushed_scope)
12432 pop_scope (pushed_scope);
12433 /* Restore the saved scope. */
12434 parser->scope = saved_scope;
12435 parser->qualifying_scope = saved_qualifying_scope;
12436 parser->object_scope = saved_object_scope;
12437 /* If the TYPE is invalid, indicate failure. */
12438 if (type == error_mark_node)
12439 return error_mark_node;
12440 return mangle_conv_op_name_for_type (type);
12443 /* Parse a conversion-type-id:
12445 conversion-type-id:
12446 type-specifier-seq conversion-declarator [opt]
12448 Returns the TYPE specified. */
12450 static tree
12451 cp_parser_conversion_type_id (cp_parser* parser)
12453 tree attributes;
12454 cp_decl_specifier_seq type_specifiers;
12455 cp_declarator *declarator;
12456 tree type_specified;
12457 const char *saved_message;
12459 /* Parse the attributes. */
12460 attributes = cp_parser_attributes_opt (parser);
12462 saved_message = parser->type_definition_forbidden_message;
12463 parser->type_definition_forbidden_message
12464 = G_("types may not be defined in a conversion-type-id");
12466 /* Parse the type-specifiers. */
12467 cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
12468 /*is_trailing_return=*/false,
12469 &type_specifiers);
12471 parser->type_definition_forbidden_message = saved_message;
12473 /* If that didn't work, stop. */
12474 if (type_specifiers.type == error_mark_node)
12475 return error_mark_node;
12476 /* Parse the conversion-declarator. */
12477 declarator = cp_parser_conversion_declarator_opt (parser);
12479 type_specified = grokdeclarator (declarator, &type_specifiers, TYPENAME,
12480 /*initialized=*/0, &attributes);
12481 if (attributes)
12482 cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
12484 /* Don't give this error when parsing tentatively. This happens to
12485 work because we always parse this definitively once. */
12486 if (! cp_parser_uncommitted_to_tentative_parse_p (parser)
12487 && type_uses_auto (type_specified))
12489 if (cxx_dialect < cxx14)
12491 error ("invalid use of %<auto%> in conversion operator");
12492 return error_mark_node;
12494 else if (template_parm_scope_p ())
12495 warning (0, "use of %<auto%> in member template "
12496 "conversion operator can never be deduced");
12499 return type_specified;
12502 /* Parse an (optional) conversion-declarator.
12504 conversion-declarator:
12505 ptr-operator conversion-declarator [opt]
12509 static cp_declarator *
12510 cp_parser_conversion_declarator_opt (cp_parser* parser)
12512 enum tree_code code;
12513 tree class_type, std_attributes = NULL_TREE;
12514 cp_cv_quals cv_quals;
12516 /* We don't know if there's a ptr-operator next, or not. */
12517 cp_parser_parse_tentatively (parser);
12518 /* Try the ptr-operator. */
12519 code = cp_parser_ptr_operator (parser, &class_type, &cv_quals,
12520 &std_attributes);
12521 /* If it worked, look for more conversion-declarators. */
12522 if (cp_parser_parse_definitely (parser))
12524 cp_declarator *declarator;
12526 /* Parse another optional declarator. */
12527 declarator = cp_parser_conversion_declarator_opt (parser);
12529 declarator = cp_parser_make_indirect_declarator
12530 (code, class_type, cv_quals, declarator, std_attributes);
12532 return declarator;
12535 return NULL;
12538 /* Parse an (optional) ctor-initializer.
12540 ctor-initializer:
12541 : mem-initializer-list
12543 Returns TRUE iff the ctor-initializer was actually present. */
12545 static bool
12546 cp_parser_ctor_initializer_opt (cp_parser* parser)
12548 /* If the next token is not a `:', then there is no
12549 ctor-initializer. */
12550 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
12552 /* Do default initialization of any bases and members. */
12553 if (DECL_CONSTRUCTOR_P (current_function_decl))
12554 finish_mem_initializers (NULL_TREE);
12556 return false;
12559 /* Consume the `:' token. */
12560 cp_lexer_consume_token (parser->lexer);
12561 /* And the mem-initializer-list. */
12562 cp_parser_mem_initializer_list (parser);
12564 return true;
12567 /* Parse a mem-initializer-list.
12569 mem-initializer-list:
12570 mem-initializer ... [opt]
12571 mem-initializer ... [opt] , mem-initializer-list */
12573 static void
12574 cp_parser_mem_initializer_list (cp_parser* parser)
12576 tree mem_initializer_list = NULL_TREE;
12577 tree target_ctor = error_mark_node;
12578 cp_token *token = cp_lexer_peek_token (parser->lexer);
12580 /* Let the semantic analysis code know that we are starting the
12581 mem-initializer-list. */
12582 if (!DECL_CONSTRUCTOR_P (current_function_decl))
12583 error_at (token->location,
12584 "only constructors take member initializers");
12586 /* Loop through the list. */
12587 while (true)
12589 tree mem_initializer;
12591 token = cp_lexer_peek_token (parser->lexer);
12592 /* Parse the mem-initializer. */
12593 mem_initializer = cp_parser_mem_initializer (parser);
12594 /* If the next token is a `...', we're expanding member initializers. */
12595 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
12597 /* Consume the `...'. */
12598 cp_lexer_consume_token (parser->lexer);
12600 /* The TREE_PURPOSE must be a _TYPE, because base-specifiers
12601 can be expanded but members cannot. */
12602 if (mem_initializer != error_mark_node
12603 && !TYPE_P (TREE_PURPOSE (mem_initializer)))
12605 error_at (token->location,
12606 "cannot expand initializer for member %<%D%>",
12607 TREE_PURPOSE (mem_initializer));
12608 mem_initializer = error_mark_node;
12611 /* Construct the pack expansion type. */
12612 if (mem_initializer != error_mark_node)
12613 mem_initializer = make_pack_expansion (mem_initializer);
12615 if (target_ctor != error_mark_node
12616 && mem_initializer != error_mark_node)
12618 error ("mem-initializer for %qD follows constructor delegation",
12619 TREE_PURPOSE (mem_initializer));
12620 mem_initializer = error_mark_node;
12622 /* Look for a target constructor. */
12623 if (mem_initializer != error_mark_node
12624 && CLASS_TYPE_P (TREE_PURPOSE (mem_initializer))
12625 && same_type_p (TREE_PURPOSE (mem_initializer), current_class_type))
12627 maybe_warn_cpp0x (CPP0X_DELEGATING_CTORS);
12628 if (mem_initializer_list)
12630 error ("constructor delegation follows mem-initializer for %qD",
12631 TREE_PURPOSE (mem_initializer_list));
12632 mem_initializer = error_mark_node;
12634 target_ctor = mem_initializer;
12636 /* Add it to the list, unless it was erroneous. */
12637 if (mem_initializer != error_mark_node)
12639 TREE_CHAIN (mem_initializer) = mem_initializer_list;
12640 mem_initializer_list = mem_initializer;
12642 /* If the next token is not a `,', we're done. */
12643 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
12644 break;
12645 /* Consume the `,' token. */
12646 cp_lexer_consume_token (parser->lexer);
12649 /* Perform semantic analysis. */
12650 if (DECL_CONSTRUCTOR_P (current_function_decl))
12651 finish_mem_initializers (mem_initializer_list);
12654 /* Parse a mem-initializer.
12656 mem-initializer:
12657 mem-initializer-id ( expression-list [opt] )
12658 mem-initializer-id braced-init-list
12660 GNU extension:
12662 mem-initializer:
12663 ( expression-list [opt] )
12665 Returns a TREE_LIST. The TREE_PURPOSE is the TYPE (for a base
12666 class) or FIELD_DECL (for a non-static data member) to initialize;
12667 the TREE_VALUE is the expression-list. An empty initialization
12668 list is represented by void_list_node. */
12670 static tree
12671 cp_parser_mem_initializer (cp_parser* parser)
12673 tree mem_initializer_id;
12674 tree expression_list;
12675 tree member;
12676 cp_token *token = cp_lexer_peek_token (parser->lexer);
12678 /* Find out what is being initialized. */
12679 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
12681 permerror (token->location,
12682 "anachronistic old-style base class initializer");
12683 mem_initializer_id = NULL_TREE;
12685 else
12687 mem_initializer_id = cp_parser_mem_initializer_id (parser);
12688 if (mem_initializer_id == error_mark_node)
12689 return mem_initializer_id;
12691 member = expand_member_init (mem_initializer_id);
12692 if (member && !DECL_P (member))
12693 in_base_initializer = 1;
12695 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
12697 bool expr_non_constant_p;
12698 cp_lexer_set_source_position (parser->lexer);
12699 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
12700 expression_list = cp_parser_braced_list (parser, &expr_non_constant_p);
12701 CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
12702 expression_list = build_tree_list (NULL_TREE, expression_list);
12704 else
12706 vec<tree, va_gc> *vec;
12707 vec = cp_parser_parenthesized_expression_list (parser, non_attr,
12708 /*cast_p=*/false,
12709 /*allow_expansion_p=*/true,
12710 /*non_constant_p=*/NULL);
12711 if (vec == NULL)
12712 return error_mark_node;
12713 expression_list = build_tree_list_vec (vec);
12714 release_tree_vector (vec);
12717 if (expression_list == error_mark_node)
12718 return error_mark_node;
12719 if (!expression_list)
12720 expression_list = void_type_node;
12722 in_base_initializer = 0;
12724 return member ? build_tree_list (member, expression_list) : error_mark_node;
12727 /* Parse a mem-initializer-id.
12729 mem-initializer-id:
12730 :: [opt] nested-name-specifier [opt] class-name
12731 identifier
12733 Returns a TYPE indicating the class to be initializer for the first
12734 production. Returns an IDENTIFIER_NODE indicating the data member
12735 to be initialized for the second production. */
12737 static tree
12738 cp_parser_mem_initializer_id (cp_parser* parser)
12740 bool global_scope_p;
12741 bool nested_name_specifier_p;
12742 bool template_p = false;
12743 tree id;
12745 cp_token *token = cp_lexer_peek_token (parser->lexer);
12747 /* `typename' is not allowed in this context ([temp.res]). */
12748 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
12750 error_at (token->location,
12751 "keyword %<typename%> not allowed in this context (a qualified "
12752 "member initializer is implicitly a type)");
12753 cp_lexer_consume_token (parser->lexer);
12755 /* Look for the optional `::' operator. */
12756 global_scope_p
12757 = (cp_parser_global_scope_opt (parser,
12758 /*current_scope_valid_p=*/false)
12759 != NULL_TREE);
12760 /* Look for the optional nested-name-specifier. The simplest way to
12761 implement:
12763 [temp.res]
12765 The keyword `typename' is not permitted in a base-specifier or
12766 mem-initializer; in these contexts a qualified name that
12767 depends on a template-parameter is implicitly assumed to be a
12768 type name.
12770 is to assume that we have seen the `typename' keyword at this
12771 point. */
12772 nested_name_specifier_p
12773 = (cp_parser_nested_name_specifier_opt (parser,
12774 /*typename_keyword_p=*/true,
12775 /*check_dependency_p=*/true,
12776 /*type_p=*/true,
12777 /*is_declaration=*/true)
12778 != NULL_TREE);
12779 if (nested_name_specifier_p)
12780 template_p = cp_parser_optional_template_keyword (parser);
12781 /* If there is a `::' operator or a nested-name-specifier, then we
12782 are definitely looking for a class-name. */
12783 if (global_scope_p || nested_name_specifier_p)
12784 return cp_parser_class_name (parser,
12785 /*typename_keyword_p=*/true,
12786 /*template_keyword_p=*/template_p,
12787 typename_type,
12788 /*check_dependency_p=*/true,
12789 /*class_head_p=*/false,
12790 /*is_declaration=*/true);
12791 /* Otherwise, we could also be looking for an ordinary identifier. */
12792 cp_parser_parse_tentatively (parser);
12793 /* Try a class-name. */
12794 id = cp_parser_class_name (parser,
12795 /*typename_keyword_p=*/true,
12796 /*template_keyword_p=*/false,
12797 none_type,
12798 /*check_dependency_p=*/true,
12799 /*class_head_p=*/false,
12800 /*is_declaration=*/true);
12801 /* If we found one, we're done. */
12802 if (cp_parser_parse_definitely (parser))
12803 return id;
12804 /* Otherwise, look for an ordinary identifier. */
12805 return cp_parser_identifier (parser);
12808 /* Overloading [gram.over] */
12810 /* Parse an operator-function-id.
12812 operator-function-id:
12813 operator operator
12815 Returns an IDENTIFIER_NODE for the operator which is a
12816 human-readable spelling of the identifier, e.g., `operator +'. */
12818 static tree
12819 cp_parser_operator_function_id (cp_parser* parser)
12821 /* Look for the `operator' keyword. */
12822 if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
12823 return error_mark_node;
12824 /* And then the name of the operator itself. */
12825 return cp_parser_operator (parser);
12828 /* Return an identifier node for a user-defined literal operator.
12829 The suffix identifier is chained to the operator name identifier. */
12831 static tree
12832 cp_literal_operator_id (const char* name)
12834 tree identifier;
12835 char *buffer = XNEWVEC (char, strlen (UDLIT_OP_ANSI_PREFIX)
12836 + strlen (name) + 10);
12837 sprintf (buffer, UDLIT_OP_ANSI_FORMAT, name);
12838 identifier = get_identifier (buffer);
12840 return identifier;
12843 /* Parse an operator.
12845 operator:
12846 new delete new[] delete[] + - * / % ^ & | ~ ! = < >
12847 += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= &&
12848 || ++ -- , ->* -> () []
12850 GNU Extensions:
12852 operator:
12853 <? >? <?= >?=
12855 Returns an IDENTIFIER_NODE for the operator which is a
12856 human-readable spelling of the identifier, e.g., `operator +'. */
12858 static tree
12859 cp_parser_operator (cp_parser* parser)
12861 tree id = NULL_TREE;
12862 cp_token *token;
12863 bool utf8 = false;
12865 /* Peek at the next token. */
12866 token = cp_lexer_peek_token (parser->lexer);
12867 /* Figure out which operator we have. */
12868 switch (token->type)
12870 case CPP_KEYWORD:
12872 enum tree_code op;
12874 /* The keyword should be either `new' or `delete'. */
12875 if (token->keyword == RID_NEW)
12876 op = NEW_EXPR;
12877 else if (token->keyword == RID_DELETE)
12878 op = DELETE_EXPR;
12879 else
12880 break;
12882 /* Consume the `new' or `delete' token. */
12883 cp_lexer_consume_token (parser->lexer);
12885 /* Peek at the next token. */
12886 token = cp_lexer_peek_token (parser->lexer);
12887 /* If it's a `[' token then this is the array variant of the
12888 operator. */
12889 if (token->type == CPP_OPEN_SQUARE)
12891 /* Consume the `[' token. */
12892 cp_lexer_consume_token (parser->lexer);
12893 /* Look for the `]' token. */
12894 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
12895 id = ansi_opname (op == NEW_EXPR
12896 ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
12898 /* Otherwise, we have the non-array variant. */
12899 else
12900 id = ansi_opname (op);
12902 return id;
12905 case CPP_PLUS:
12906 id = ansi_opname (PLUS_EXPR);
12907 break;
12909 case CPP_MINUS:
12910 id = ansi_opname (MINUS_EXPR);
12911 break;
12913 case CPP_MULT:
12914 id = ansi_opname (MULT_EXPR);
12915 break;
12917 case CPP_DIV:
12918 id = ansi_opname (TRUNC_DIV_EXPR);
12919 break;
12921 case CPP_MOD:
12922 id = ansi_opname (TRUNC_MOD_EXPR);
12923 break;
12925 case CPP_XOR:
12926 id = ansi_opname (BIT_XOR_EXPR);
12927 break;
12929 case CPP_AND:
12930 id = ansi_opname (BIT_AND_EXPR);
12931 break;
12933 case CPP_OR:
12934 id = ansi_opname (BIT_IOR_EXPR);
12935 break;
12937 case CPP_COMPL:
12938 id = ansi_opname (BIT_NOT_EXPR);
12939 break;
12941 case CPP_NOT:
12942 id = ansi_opname (TRUTH_NOT_EXPR);
12943 break;
12945 case CPP_EQ:
12946 id = ansi_assopname (NOP_EXPR);
12947 break;
12949 case CPP_LESS:
12950 id = ansi_opname (LT_EXPR);
12951 break;
12953 case CPP_GREATER:
12954 id = ansi_opname (GT_EXPR);
12955 break;
12957 case CPP_PLUS_EQ:
12958 id = ansi_assopname (PLUS_EXPR);
12959 break;
12961 case CPP_MINUS_EQ:
12962 id = ansi_assopname (MINUS_EXPR);
12963 break;
12965 case CPP_MULT_EQ:
12966 id = ansi_assopname (MULT_EXPR);
12967 break;
12969 case CPP_DIV_EQ:
12970 id = ansi_assopname (TRUNC_DIV_EXPR);
12971 break;
12973 case CPP_MOD_EQ:
12974 id = ansi_assopname (TRUNC_MOD_EXPR);
12975 break;
12977 case CPP_XOR_EQ:
12978 id = ansi_assopname (BIT_XOR_EXPR);
12979 break;
12981 case CPP_AND_EQ:
12982 id = ansi_assopname (BIT_AND_EXPR);
12983 break;
12985 case CPP_OR_EQ:
12986 id = ansi_assopname (BIT_IOR_EXPR);
12987 break;
12989 case CPP_LSHIFT:
12990 id = ansi_opname (LSHIFT_EXPR);
12991 break;
12993 case CPP_RSHIFT:
12994 id = ansi_opname (RSHIFT_EXPR);
12995 break;
12997 case CPP_LSHIFT_EQ:
12998 id = ansi_assopname (LSHIFT_EXPR);
12999 break;
13001 case CPP_RSHIFT_EQ:
13002 id = ansi_assopname (RSHIFT_EXPR);
13003 break;
13005 case CPP_EQ_EQ:
13006 id = ansi_opname (EQ_EXPR);
13007 break;
13009 case CPP_NOT_EQ:
13010 id = ansi_opname (NE_EXPR);
13011 break;
13013 case CPP_LESS_EQ:
13014 id = ansi_opname (LE_EXPR);
13015 break;
13017 case CPP_GREATER_EQ:
13018 id = ansi_opname (GE_EXPR);
13019 break;
13021 case CPP_AND_AND:
13022 id = ansi_opname (TRUTH_ANDIF_EXPR);
13023 break;
13025 case CPP_OR_OR:
13026 id = ansi_opname (TRUTH_ORIF_EXPR);
13027 break;
13029 case CPP_PLUS_PLUS:
13030 id = ansi_opname (POSTINCREMENT_EXPR);
13031 break;
13033 case CPP_MINUS_MINUS:
13034 id = ansi_opname (PREDECREMENT_EXPR);
13035 break;
13037 case CPP_COMMA:
13038 id = ansi_opname (COMPOUND_EXPR);
13039 break;
13041 case CPP_DEREF_STAR:
13042 id = ansi_opname (MEMBER_REF);
13043 break;
13045 case CPP_DEREF:
13046 id = ansi_opname (COMPONENT_REF);
13047 break;
13049 case CPP_OPEN_PAREN:
13050 /* Consume the `('. */
13051 cp_lexer_consume_token (parser->lexer);
13052 /* Look for the matching `)'. */
13053 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
13054 return ansi_opname (CALL_EXPR);
13056 case CPP_OPEN_SQUARE:
13057 /* Consume the `['. */
13058 cp_lexer_consume_token (parser->lexer);
13059 /* Look for the matching `]'. */
13060 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
13061 return ansi_opname (ARRAY_REF);
13063 case CPP_UTF8STRING:
13064 case CPP_UTF8STRING_USERDEF:
13065 utf8 = true;
13066 case CPP_STRING:
13067 case CPP_WSTRING:
13068 case CPP_STRING16:
13069 case CPP_STRING32:
13070 case CPP_STRING_USERDEF:
13071 case CPP_WSTRING_USERDEF:
13072 case CPP_STRING16_USERDEF:
13073 case CPP_STRING32_USERDEF:
13075 tree str, string_tree;
13076 int sz, len;
13078 if (cxx_dialect == cxx98)
13079 maybe_warn_cpp0x (CPP0X_USER_DEFINED_LITERALS);
13081 /* Consume the string. */
13082 str = cp_parser_string_literal (parser, /*translate=*/true,
13083 /*wide_ok=*/true, /*lookup_udlit=*/false);
13084 if (str == error_mark_node)
13085 return error_mark_node;
13086 else if (TREE_CODE (str) == USERDEF_LITERAL)
13088 string_tree = USERDEF_LITERAL_VALUE (str);
13089 id = USERDEF_LITERAL_SUFFIX_ID (str);
13091 else
13093 string_tree = str;
13094 /* Look for the suffix identifier. */
13095 token = cp_lexer_peek_token (parser->lexer);
13096 if (token->type == CPP_NAME)
13097 id = cp_parser_identifier (parser);
13098 else if (token->type == CPP_KEYWORD)
13100 error ("unexpected keyword;"
13101 " remove space between quotes and suffix identifier");
13102 return error_mark_node;
13104 else
13106 error ("expected suffix identifier");
13107 return error_mark_node;
13110 sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT
13111 (TREE_TYPE (TREE_TYPE (string_tree))));
13112 len = TREE_STRING_LENGTH (string_tree) / sz - 1;
13113 if (len != 0)
13115 error ("expected empty string after %<operator%> keyword");
13116 return error_mark_node;
13118 if (utf8 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string_tree)))
13119 != char_type_node)
13121 error ("invalid encoding prefix in literal operator");
13122 return error_mark_node;
13124 if (id != error_mark_node)
13126 const char *name = IDENTIFIER_POINTER (id);
13127 id = cp_literal_operator_id (name);
13129 return id;
13132 default:
13133 /* Anything else is an error. */
13134 break;
13137 /* If we have selected an identifier, we need to consume the
13138 operator token. */
13139 if (id)
13140 cp_lexer_consume_token (parser->lexer);
13141 /* Otherwise, no valid operator name was present. */
13142 else
13144 cp_parser_error (parser, "expected operator");
13145 id = error_mark_node;
13148 return id;
13151 /* Parse a template-declaration.
13153 template-declaration:
13154 export [opt] template < template-parameter-list > declaration
13156 If MEMBER_P is TRUE, this template-declaration occurs within a
13157 class-specifier.
13159 The grammar rule given by the standard isn't correct. What
13160 is really meant is:
13162 template-declaration:
13163 export [opt] template-parameter-list-seq
13164 decl-specifier-seq [opt] init-declarator [opt] ;
13165 export [opt] template-parameter-list-seq
13166 function-definition
13168 template-parameter-list-seq:
13169 template-parameter-list-seq [opt]
13170 template < template-parameter-list > */
13172 static void
13173 cp_parser_template_declaration (cp_parser* parser, bool member_p)
13175 /* Check for `export'. */
13176 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXPORT))
13178 /* Consume the `export' token. */
13179 cp_lexer_consume_token (parser->lexer);
13180 /* Warn that we do not support `export'. */
13181 warning (0, "keyword %<export%> not implemented, and will be ignored");
13184 cp_parser_template_declaration_after_export (parser, member_p);
13187 /* Parse a template-parameter-list.
13189 template-parameter-list:
13190 template-parameter
13191 template-parameter-list , template-parameter
13193 Returns a TREE_LIST. Each node represents a template parameter.
13194 The nodes are connected via their TREE_CHAINs. */
13196 static tree
13197 cp_parser_template_parameter_list (cp_parser* parser)
13199 tree parameter_list = NULL_TREE;
13201 begin_template_parm_list ();
13203 /* The loop below parses the template parms. We first need to know
13204 the total number of template parms to be able to compute proper
13205 canonical types of each dependent type. So after the loop, when
13206 we know the total number of template parms,
13207 end_template_parm_list computes the proper canonical types and
13208 fixes up the dependent types accordingly. */
13209 while (true)
13211 tree parameter;
13212 bool is_non_type;
13213 bool is_parameter_pack;
13214 location_t parm_loc;
13216 /* Parse the template-parameter. */
13217 parm_loc = cp_lexer_peek_token (parser->lexer)->location;
13218 parameter = cp_parser_template_parameter (parser,
13219 &is_non_type,
13220 &is_parameter_pack);
13221 /* Add it to the list. */
13222 if (parameter != error_mark_node)
13223 parameter_list = process_template_parm (parameter_list,
13224 parm_loc,
13225 parameter,
13226 is_non_type,
13227 is_parameter_pack);
13228 else
13230 tree err_parm = build_tree_list (parameter, parameter);
13231 parameter_list = chainon (parameter_list, err_parm);
13234 /* If the next token is not a `,', we're done. */
13235 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
13236 break;
13237 /* Otherwise, consume the `,' token. */
13238 cp_lexer_consume_token (parser->lexer);
13241 return end_template_parm_list (parameter_list);
13244 /* Parse a template-parameter.
13246 template-parameter:
13247 type-parameter
13248 parameter-declaration
13250 If all goes well, returns a TREE_LIST. The TREE_VALUE represents
13251 the parameter. The TREE_PURPOSE is the default value, if any.
13252 Returns ERROR_MARK_NODE on failure. *IS_NON_TYPE is set to true
13253 iff this parameter is a non-type parameter. *IS_PARAMETER_PACK is
13254 set to true iff this parameter is a parameter pack. */
13256 static tree
13257 cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
13258 bool *is_parameter_pack)
13260 cp_token *token;
13261 cp_parameter_declarator *parameter_declarator;
13262 cp_declarator *id_declarator;
13263 tree parm;
13265 /* Assume it is a type parameter or a template parameter. */
13266 *is_non_type = false;
13267 /* Assume it not a parameter pack. */
13268 *is_parameter_pack = false;
13269 /* Peek at the next token. */
13270 token = cp_lexer_peek_token (parser->lexer);
13271 /* If it is `class' or `template', we have a type-parameter. */
13272 if (token->keyword == RID_TEMPLATE)
13273 return cp_parser_type_parameter (parser, is_parameter_pack);
13274 /* If it is `class' or `typename' we do not know yet whether it is a
13275 type parameter or a non-type parameter. Consider:
13277 template <typename T, typename T::X X> ...
13281 template <class C, class D*> ...
13283 Here, the first parameter is a type parameter, and the second is
13284 a non-type parameter. We can tell by looking at the token after
13285 the identifier -- if it is a `,', `=', or `>' then we have a type
13286 parameter. */
13287 if (token->keyword == RID_TYPENAME || token->keyword == RID_CLASS)
13289 /* Peek at the token after `class' or `typename'. */
13290 token = cp_lexer_peek_nth_token (parser->lexer, 2);
13291 /* If it's an ellipsis, we have a template type parameter
13292 pack. */
13293 if (token->type == CPP_ELLIPSIS)
13294 return cp_parser_type_parameter (parser, is_parameter_pack);
13295 /* If it's an identifier, skip it. */
13296 if (token->type == CPP_NAME)
13297 token = cp_lexer_peek_nth_token (parser->lexer, 3);
13298 /* Now, see if the token looks like the end of a template
13299 parameter. */
13300 if (token->type == CPP_COMMA
13301 || token->type == CPP_EQ
13302 || token->type == CPP_GREATER)
13303 return cp_parser_type_parameter (parser, is_parameter_pack);
13306 /* Otherwise, it is a non-type parameter.
13308 [temp.param]
13310 When parsing a default template-argument for a non-type
13311 template-parameter, the first non-nested `>' is taken as the end
13312 of the template parameter-list rather than a greater-than
13313 operator. */
13314 *is_non_type = true;
13315 parameter_declarator
13316 = cp_parser_parameter_declaration (parser, /*template_parm_p=*/true,
13317 /*parenthesized_p=*/NULL);
13319 if (!parameter_declarator)
13320 return error_mark_node;
13322 /* If the parameter declaration is marked as a parameter pack, set
13323 *IS_PARAMETER_PACK to notify the caller. Also, unmark the
13324 declarator's PACK_EXPANSION_P, otherwise we'll get errors from
13325 grokdeclarator. */
13326 if (parameter_declarator->declarator
13327 && parameter_declarator->declarator->parameter_pack_p)
13329 *is_parameter_pack = true;
13330 parameter_declarator->declarator->parameter_pack_p = false;
13333 if (parameter_declarator->default_argument)
13335 /* Can happen in some cases of erroneous input (c++/34892). */
13336 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
13337 /* Consume the `...' for better error recovery. */
13338 cp_lexer_consume_token (parser->lexer);
13340 /* If the next token is an ellipsis, and we don't already have it
13341 marked as a parameter pack, then we have a parameter pack (that
13342 has no declarator). */
13343 else if (!*is_parameter_pack
13344 && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
13345 && (declarator_can_be_parameter_pack
13346 (parameter_declarator->declarator)))
13348 /* Consume the `...'. */
13349 cp_lexer_consume_token (parser->lexer);
13350 maybe_warn_variadic_templates ();
13352 *is_parameter_pack = true;
13354 /* We might end up with a pack expansion as the type of the non-type
13355 template parameter, in which case this is a non-type template
13356 parameter pack. */
13357 else if (parameter_declarator->decl_specifiers.type
13358 && PACK_EXPANSION_P (parameter_declarator->decl_specifiers.type))
13360 *is_parameter_pack = true;
13361 parameter_declarator->decl_specifiers.type =
13362 PACK_EXPANSION_PATTERN (parameter_declarator->decl_specifiers.type);
13365 if (*is_parameter_pack && cp_lexer_next_token_is (parser->lexer, CPP_EQ))
13367 /* Parameter packs cannot have default arguments. However, a
13368 user may try to do so, so we'll parse them and give an
13369 appropriate diagnostic here. */
13371 cp_token *start_token = cp_lexer_peek_token (parser->lexer);
13373 /* Find the name of the parameter pack. */
13374 id_declarator = parameter_declarator->declarator;
13375 while (id_declarator && id_declarator->kind != cdk_id)
13376 id_declarator = id_declarator->declarator;
13378 if (id_declarator && id_declarator->kind == cdk_id)
13379 error_at (start_token->location,
13380 "template parameter pack %qD cannot have a default argument",
13381 id_declarator->u.id.unqualified_name);
13382 else
13383 error_at (start_token->location,
13384 "template parameter pack cannot have a default argument");
13386 /* Parse the default argument, but throw away the result. */
13387 cp_parser_default_argument (parser, /*template_parm_p=*/true);
13390 parm = grokdeclarator (parameter_declarator->declarator,
13391 &parameter_declarator->decl_specifiers,
13392 TPARM, /*initialized=*/0,
13393 /*attrlist=*/NULL);
13394 if (parm == error_mark_node)
13395 return error_mark_node;
13397 return build_tree_list (parameter_declarator->default_argument, parm);
13400 /* Parse a type-parameter.
13402 type-parameter:
13403 class identifier [opt]
13404 class identifier [opt] = type-id
13405 typename identifier [opt]
13406 typename identifier [opt] = type-id
13407 template < template-parameter-list > class identifier [opt]
13408 template < template-parameter-list > class identifier [opt]
13409 = id-expression
13411 GNU Extension (variadic templates):
13413 type-parameter:
13414 class ... identifier [opt]
13415 typename ... identifier [opt]
13417 Returns a TREE_LIST. The TREE_VALUE is itself a TREE_LIST. The
13418 TREE_PURPOSE is the default-argument, if any. The TREE_VALUE is
13419 the declaration of the parameter.
13421 Sets *IS_PARAMETER_PACK if this is a template parameter pack. */
13423 static tree
13424 cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
13426 cp_token *token;
13427 tree parameter;
13429 /* Look for a keyword to tell us what kind of parameter this is. */
13430 token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_TYPENAME_TEMPLATE);
13431 if (!token)
13432 return error_mark_node;
13434 switch (token->keyword)
13436 case RID_CLASS:
13437 case RID_TYPENAME:
13439 tree identifier;
13440 tree default_argument;
13442 /* If the next token is an ellipsis, we have a template
13443 argument pack. */
13444 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
13446 /* Consume the `...' token. */
13447 cp_lexer_consume_token (parser->lexer);
13448 maybe_warn_variadic_templates ();
13450 *is_parameter_pack = true;
13453 /* If the next token is an identifier, then it names the
13454 parameter. */
13455 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13456 identifier = cp_parser_identifier (parser);
13457 else
13458 identifier = NULL_TREE;
13460 /* Create the parameter. */
13461 parameter = finish_template_type_parm (class_type_node, identifier);
13463 /* If the next token is an `=', we have a default argument. */
13464 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
13466 /* Consume the `=' token. */
13467 cp_lexer_consume_token (parser->lexer);
13468 /* Parse the default-argument. */
13469 push_deferring_access_checks (dk_no_deferred);
13470 default_argument = cp_parser_type_id (parser);
13472 /* Template parameter packs cannot have default
13473 arguments. */
13474 if (*is_parameter_pack)
13476 if (identifier)
13477 error_at (token->location,
13478 "template parameter pack %qD cannot have a "
13479 "default argument", identifier);
13480 else
13481 error_at (token->location,
13482 "template parameter packs cannot have "
13483 "default arguments");
13484 default_argument = NULL_TREE;
13486 pop_deferring_access_checks ();
13488 else
13489 default_argument = NULL_TREE;
13491 /* Create the combined representation of the parameter and the
13492 default argument. */
13493 parameter = build_tree_list (default_argument, parameter);
13495 break;
13497 case RID_TEMPLATE:
13499 tree identifier;
13500 tree default_argument;
13502 /* Look for the `<'. */
13503 cp_parser_require (parser, CPP_LESS, RT_LESS);
13504 /* Parse the template-parameter-list. */
13505 cp_parser_template_parameter_list (parser);
13506 /* Look for the `>'. */
13507 cp_parser_require (parser, CPP_GREATER, RT_GREATER);
13508 /* Look for the `class' or 'typename' keywords. */
13509 cp_parser_type_parameter_key (parser);
13510 /* If the next token is an ellipsis, we have a template
13511 argument pack. */
13512 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
13514 /* Consume the `...' token. */
13515 cp_lexer_consume_token (parser->lexer);
13516 maybe_warn_variadic_templates ();
13518 *is_parameter_pack = true;
13520 /* If the next token is an `=', then there is a
13521 default-argument. If the next token is a `>', we are at
13522 the end of the parameter-list. If the next token is a `,',
13523 then we are at the end of this parameter. */
13524 if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
13525 && cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
13526 && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
13528 identifier = cp_parser_identifier (parser);
13529 /* Treat invalid names as if the parameter were nameless. */
13530 if (identifier == error_mark_node)
13531 identifier = NULL_TREE;
13533 else
13534 identifier = NULL_TREE;
13536 /* Create the template parameter. */
13537 parameter = finish_template_template_parm (class_type_node,
13538 identifier);
13540 /* If the next token is an `=', then there is a
13541 default-argument. */
13542 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
13544 bool is_template;
13546 /* Consume the `='. */
13547 cp_lexer_consume_token (parser->lexer);
13548 /* Parse the id-expression. */
13549 push_deferring_access_checks (dk_no_deferred);
13550 /* save token before parsing the id-expression, for error
13551 reporting */
13552 token = cp_lexer_peek_token (parser->lexer);
13553 default_argument
13554 = cp_parser_id_expression (parser,
13555 /*template_keyword_p=*/false,
13556 /*check_dependency_p=*/true,
13557 /*template_p=*/&is_template,
13558 /*declarator_p=*/false,
13559 /*optional_p=*/false);
13560 if (TREE_CODE (default_argument) == TYPE_DECL)
13561 /* If the id-expression was a template-id that refers to
13562 a template-class, we already have the declaration here,
13563 so no further lookup is needed. */
13565 else
13566 /* Look up the name. */
13567 default_argument
13568 = cp_parser_lookup_name (parser, default_argument,
13569 none_type,
13570 /*is_template=*/is_template,
13571 /*is_namespace=*/false,
13572 /*check_dependency=*/true,
13573 /*ambiguous_decls=*/NULL,
13574 token->location);
13575 /* See if the default argument is valid. */
13576 default_argument
13577 = check_template_template_default_arg (default_argument);
13579 /* Template parameter packs cannot have default
13580 arguments. */
13581 if (*is_parameter_pack)
13583 if (identifier)
13584 error_at (token->location,
13585 "template parameter pack %qD cannot "
13586 "have a default argument",
13587 identifier);
13588 else
13589 error_at (token->location, "template parameter packs cannot "
13590 "have default arguments");
13591 default_argument = NULL_TREE;
13593 pop_deferring_access_checks ();
13595 else
13596 default_argument = NULL_TREE;
13598 /* Create the combined representation of the parameter and the
13599 default argument. */
13600 parameter = build_tree_list (default_argument, parameter);
13602 break;
13604 default:
13605 gcc_unreachable ();
13606 break;
13609 return parameter;
13612 /* Parse a template-id.
13614 template-id:
13615 template-name < template-argument-list [opt] >
13617 If TEMPLATE_KEYWORD_P is TRUE, then we have just seen the
13618 `template' keyword. In this case, a TEMPLATE_ID_EXPR will be
13619 returned. Otherwise, if the template-name names a function, or set
13620 of functions, returns a TEMPLATE_ID_EXPR. If the template-name
13621 names a class, returns a TYPE_DECL for the specialization.
13623 If CHECK_DEPENDENCY_P is FALSE, names are looked up in
13624 uninstantiated templates. */
13626 static tree
13627 cp_parser_template_id (cp_parser *parser,
13628 bool template_keyword_p,
13629 bool check_dependency_p,
13630 enum tag_types tag_type,
13631 bool is_declaration)
13633 int i;
13634 tree templ;
13635 tree arguments;
13636 tree template_id;
13637 cp_token_position start_of_id = 0;
13638 deferred_access_check *chk;
13639 vec<deferred_access_check, va_gc> *access_check;
13640 cp_token *next_token = NULL, *next_token_2 = NULL;
13641 bool is_identifier;
13643 /* If the next token corresponds to a template-id, there is no need
13644 to reparse it. */
13645 next_token = cp_lexer_peek_token (parser->lexer);
13646 if (next_token->type == CPP_TEMPLATE_ID)
13648 struct tree_check *check_value;
13650 /* Get the stored value. */
13651 check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
13652 /* Perform any access checks that were deferred. */
13653 access_check = check_value->checks;
13654 if (access_check)
13656 FOR_EACH_VEC_ELT (*access_check, i, chk)
13657 perform_or_defer_access_check (chk->binfo,
13658 chk->decl,
13659 chk->diag_decl,
13660 tf_warning_or_error);
13662 /* Return the stored value. */
13663 return check_value->value;
13666 /* Avoid performing name lookup if there is no possibility of
13667 finding a template-id. */
13668 if ((next_token->type != CPP_NAME && next_token->keyword != RID_OPERATOR)
13669 || (next_token->type == CPP_NAME
13670 && !cp_parser_nth_token_starts_template_argument_list_p
13671 (parser, 2)))
13673 cp_parser_error (parser, "expected template-id");
13674 return error_mark_node;
13677 /* Remember where the template-id starts. */
13678 if (cp_parser_uncommitted_to_tentative_parse_p (parser))
13679 start_of_id = cp_lexer_token_position (parser->lexer, false);
13681 push_deferring_access_checks (dk_deferred);
13683 /* Parse the template-name. */
13684 is_identifier = false;
13685 templ = cp_parser_template_name (parser, template_keyword_p,
13686 check_dependency_p,
13687 is_declaration,
13688 tag_type,
13689 &is_identifier);
13690 if (templ == error_mark_node || is_identifier)
13692 pop_deferring_access_checks ();
13693 return templ;
13696 /* If we find the sequence `[:' after a template-name, it's probably
13697 a digraph-typo for `< ::'. Substitute the tokens and check if we can
13698 parse correctly the argument list. */
13699 next_token = cp_lexer_peek_token (parser->lexer);
13700 next_token_2 = cp_lexer_peek_nth_token (parser->lexer, 2);
13701 if (next_token->type == CPP_OPEN_SQUARE
13702 && next_token->flags & DIGRAPH
13703 && next_token_2->type == CPP_COLON
13704 && !(next_token_2->flags & PREV_WHITE))
13706 cp_parser_parse_tentatively (parser);
13707 /* Change `:' into `::'. */
13708 next_token_2->type = CPP_SCOPE;
13709 /* Consume the first token (CPP_OPEN_SQUARE - which we pretend it is
13710 CPP_LESS. */
13711 cp_lexer_consume_token (parser->lexer);
13713 /* Parse the arguments. */
13714 arguments = cp_parser_enclosed_template_argument_list (parser);
13715 if (!cp_parser_parse_definitely (parser))
13717 /* If we couldn't parse an argument list, then we revert our changes
13718 and return simply an error. Maybe this is not a template-id
13719 after all. */
13720 next_token_2->type = CPP_COLON;
13721 cp_parser_error (parser, "expected %<<%>");
13722 pop_deferring_access_checks ();
13723 return error_mark_node;
13725 /* Otherwise, emit an error about the invalid digraph, but continue
13726 parsing because we got our argument list. */
13727 if (permerror (next_token->location,
13728 "%<<::%> cannot begin a template-argument list"))
13730 static bool hint = false;
13731 inform (next_token->location,
13732 "%<<:%> is an alternate spelling for %<[%>."
13733 " Insert whitespace between %<<%> and %<::%>");
13734 if (!hint && !flag_permissive)
13736 inform (next_token->location, "(if you use %<-fpermissive%> "
13737 "or %<-std=c++11%>, or %<-std=gnu++11%> G++ will "
13738 "accept your code)");
13739 hint = true;
13743 else
13745 /* Look for the `<' that starts the template-argument-list. */
13746 if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
13748 pop_deferring_access_checks ();
13749 return error_mark_node;
13751 /* Parse the arguments. */
13752 arguments = cp_parser_enclosed_template_argument_list (parser);
13755 /* Build a representation of the specialization. */
13756 if (identifier_p (templ))
13757 template_id = build_min_nt_loc (next_token->location,
13758 TEMPLATE_ID_EXPR,
13759 templ, arguments);
13760 else if (DECL_TYPE_TEMPLATE_P (templ)
13761 || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
13763 bool entering_scope;
13764 /* In "template <typename T> ... A<T>::", A<T> is the abstract A
13765 template (rather than some instantiation thereof) only if
13766 is not nested within some other construct. For example, in
13767 "template <typename T> void f(T) { A<T>::", A<T> is just an
13768 instantiation of A. */
13769 entering_scope = (template_parm_scope_p ()
13770 && cp_lexer_next_token_is (parser->lexer,
13771 CPP_SCOPE));
13772 template_id
13773 = finish_template_type (templ, arguments, entering_scope);
13775 else if (variable_template_p (templ))
13777 template_id = lookup_template_variable (templ, arguments);
13779 else
13781 /* If it's not a class-template or a template-template, it should be
13782 a function-template. */
13783 gcc_assert ((DECL_FUNCTION_TEMPLATE_P (templ)
13784 || TREE_CODE (templ) == OVERLOAD
13785 || BASELINK_P (templ)));
13787 template_id = lookup_template_function (templ, arguments);
13790 /* If parsing tentatively, replace the sequence of tokens that makes
13791 up the template-id with a CPP_TEMPLATE_ID token. That way,
13792 should we re-parse the token stream, we will not have to repeat
13793 the effort required to do the parse, nor will we issue duplicate
13794 error messages about problems during instantiation of the
13795 template. */
13796 if (start_of_id
13797 /* Don't do this if we had a parse error in a declarator; re-parsing
13798 might succeed if a name changes meaning (60361). */
13799 && !(cp_parser_error_occurred (parser)
13800 && cp_parser_parsing_tentatively (parser)
13801 && parser->in_declarator_p))
13803 cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
13805 /* Reset the contents of the START_OF_ID token. */
13806 token->type = CPP_TEMPLATE_ID;
13807 /* Retrieve any deferred checks. Do not pop this access checks yet
13808 so the memory will not be reclaimed during token replacing below. */
13809 token->u.tree_check_value = ggc_cleared_alloc<struct tree_check> ();
13810 token->u.tree_check_value->value = template_id;
13811 token->u.tree_check_value->checks = get_deferred_access_checks ();
13812 token->keyword = RID_MAX;
13814 /* Purge all subsequent tokens. */
13815 cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
13817 /* ??? Can we actually assume that, if template_id ==
13818 error_mark_node, we will have issued a diagnostic to the
13819 user, as opposed to simply marking the tentative parse as
13820 failed? */
13821 if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
13822 error_at (token->location, "parse error in template argument list");
13825 pop_to_parent_deferring_access_checks ();
13826 return template_id;
13829 /* Parse a template-name.
13831 template-name:
13832 identifier
13834 The standard should actually say:
13836 template-name:
13837 identifier
13838 operator-function-id
13840 A defect report has been filed about this issue.
13842 A conversion-function-id cannot be a template name because they cannot
13843 be part of a template-id. In fact, looking at this code:
13845 a.operator K<int>()
13847 the conversion-function-id is "operator K<int>", and K<int> is a type-id.
13848 It is impossible to call a templated conversion-function-id with an
13849 explicit argument list, since the only allowed template parameter is
13850 the type to which it is converting.
13852 If TEMPLATE_KEYWORD_P is true, then we have just seen the
13853 `template' keyword, in a construction like:
13855 T::template f<3>()
13857 In that case `f' is taken to be a template-name, even though there
13858 is no way of knowing for sure.
13860 Returns the TEMPLATE_DECL for the template, or an OVERLOAD if the
13861 name refers to a set of overloaded functions, at least one of which
13862 is a template, or an IDENTIFIER_NODE with the name of the template,
13863 if TEMPLATE_KEYWORD_P is true. If CHECK_DEPENDENCY_P is FALSE,
13864 names are looked up inside uninstantiated templates. */
13866 static tree
13867 cp_parser_template_name (cp_parser* parser,
13868 bool template_keyword_p,
13869 bool check_dependency_p,
13870 bool is_declaration,
13871 enum tag_types tag_type,
13872 bool *is_identifier)
13874 tree identifier;
13875 tree decl;
13876 tree fns;
13877 cp_token *token = cp_lexer_peek_token (parser->lexer);
13879 /* If the next token is `operator', then we have either an
13880 operator-function-id or a conversion-function-id. */
13881 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_OPERATOR))
13883 /* We don't know whether we're looking at an
13884 operator-function-id or a conversion-function-id. */
13885 cp_parser_parse_tentatively (parser);
13886 /* Try an operator-function-id. */
13887 identifier = cp_parser_operator_function_id (parser);
13888 /* If that didn't work, try a conversion-function-id. */
13889 if (!cp_parser_parse_definitely (parser))
13891 cp_parser_error (parser, "expected template-name");
13892 return error_mark_node;
13895 /* Look for the identifier. */
13896 else
13897 identifier = cp_parser_identifier (parser);
13899 /* If we didn't find an identifier, we don't have a template-id. */
13900 if (identifier == error_mark_node)
13901 return error_mark_node;
13903 /* If the name immediately followed the `template' keyword, then it
13904 is a template-name. However, if the next token is not `<', then
13905 we do not treat it as a template-name, since it is not being used
13906 as part of a template-id. This enables us to handle constructs
13907 like:
13909 template <typename T> struct S { S(); };
13910 template <typename T> S<T>::S();
13912 correctly. We would treat `S' as a template -- if it were `S<T>'
13913 -- but we do not if there is no `<'. */
13915 if (processing_template_decl
13916 && cp_parser_nth_token_starts_template_argument_list_p (parser, 1))
13918 /* In a declaration, in a dependent context, we pretend that the
13919 "template" keyword was present in order to improve error
13920 recovery. For example, given:
13922 template <typename T> void f(T::X<int>);
13924 we want to treat "X<int>" as a template-id. */
13925 if (is_declaration
13926 && !template_keyword_p
13927 && parser->scope && TYPE_P (parser->scope)
13928 && check_dependency_p
13929 && dependent_scope_p (parser->scope)
13930 /* Do not do this for dtors (or ctors), since they never
13931 need the template keyword before their name. */
13932 && !constructor_name_p (identifier, parser->scope))
13934 cp_token_position start = 0;
13936 /* Explain what went wrong. */
13937 error_at (token->location, "non-template %qD used as template",
13938 identifier);
13939 inform (token->location, "use %<%T::template %D%> to indicate that it is a template",
13940 parser->scope, identifier);
13941 /* If parsing tentatively, find the location of the "<" token. */
13942 if (cp_parser_simulate_error (parser))
13943 start = cp_lexer_token_position (parser->lexer, true);
13944 /* Parse the template arguments so that we can issue error
13945 messages about them. */
13946 cp_lexer_consume_token (parser->lexer);
13947 cp_parser_enclosed_template_argument_list (parser);
13948 /* Skip tokens until we find a good place from which to
13949 continue parsing. */
13950 cp_parser_skip_to_closing_parenthesis (parser,
13951 /*recovering=*/true,
13952 /*or_comma=*/true,
13953 /*consume_paren=*/false);
13954 /* If parsing tentatively, permanently remove the
13955 template argument list. That will prevent duplicate
13956 error messages from being issued about the missing
13957 "template" keyword. */
13958 if (start)
13959 cp_lexer_purge_tokens_after (parser->lexer, start);
13960 if (is_identifier)
13961 *is_identifier = true;
13962 return identifier;
13965 /* If the "template" keyword is present, then there is generally
13966 no point in doing name-lookup, so we just return IDENTIFIER.
13967 But, if the qualifying scope is non-dependent then we can
13968 (and must) do name-lookup normally. */
13969 if (template_keyword_p
13970 && (!parser->scope
13971 || (TYPE_P (parser->scope)
13972 && dependent_type_p (parser->scope))))
13973 return identifier;
13976 /* Look up the name. */
13977 decl = cp_parser_lookup_name (parser, identifier,
13978 tag_type,
13979 /*is_template=*/true,
13980 /*is_namespace=*/false,
13981 check_dependency_p,
13982 /*ambiguous_decls=*/NULL,
13983 token->location);
13985 /* If DECL is a template, then the name was a template-name. */
13986 if (TREE_CODE (decl) == TEMPLATE_DECL)
13988 if (TREE_DEPRECATED (decl)
13989 && deprecated_state != DEPRECATED_SUPPRESS)
13990 warn_deprecated_use (decl, NULL_TREE);
13992 else
13994 tree fn = NULL_TREE;
13996 /* The standard does not explicitly indicate whether a name that
13997 names a set of overloaded declarations, some of which are
13998 templates, is a template-name. However, such a name should
13999 be a template-name; otherwise, there is no way to form a
14000 template-id for the overloaded templates. */
14001 fns = BASELINK_P (decl) ? BASELINK_FUNCTIONS (decl) : decl;
14002 if (TREE_CODE (fns) == OVERLOAD)
14003 for (fn = fns; fn; fn = OVL_NEXT (fn))
14004 if (TREE_CODE (OVL_CURRENT (fn)) == TEMPLATE_DECL)
14005 break;
14007 if (!fn)
14009 /* The name does not name a template. */
14010 cp_parser_error (parser, "expected template-name");
14011 return error_mark_node;
14015 /* If DECL is dependent, and refers to a function, then just return
14016 its name; we will look it up again during template instantiation. */
14017 if (DECL_FUNCTION_TEMPLATE_P (decl) || !DECL_P (decl))
14019 tree scope = ovl_scope (decl);
14020 if (TYPE_P (scope) && dependent_type_p (scope))
14021 return identifier;
14024 return decl;
14027 /* Parse a template-argument-list.
14029 template-argument-list:
14030 template-argument ... [opt]
14031 template-argument-list , template-argument ... [opt]
14033 Returns a TREE_VEC containing the arguments. */
14035 static tree
14036 cp_parser_template_argument_list (cp_parser* parser)
14038 tree fixed_args[10];
14039 unsigned n_args = 0;
14040 unsigned alloced = 10;
14041 tree *arg_ary = fixed_args;
14042 tree vec;
14043 bool saved_in_template_argument_list_p;
14044 bool saved_ice_p;
14045 bool saved_non_ice_p;
14047 saved_in_template_argument_list_p = parser->in_template_argument_list_p;
14048 parser->in_template_argument_list_p = true;
14049 /* Even if the template-id appears in an integral
14050 constant-expression, the contents of the argument list do
14051 not. */
14052 saved_ice_p = parser->integral_constant_expression_p;
14053 parser->integral_constant_expression_p = false;
14054 saved_non_ice_p = parser->non_integral_constant_expression_p;
14055 parser->non_integral_constant_expression_p = false;
14057 /* Parse the arguments. */
14060 tree argument;
14062 if (n_args)
14063 /* Consume the comma. */
14064 cp_lexer_consume_token (parser->lexer);
14066 /* Parse the template-argument. */
14067 argument = cp_parser_template_argument (parser);
14069 /* If the next token is an ellipsis, we're expanding a template
14070 argument pack. */
14071 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
14073 if (argument == error_mark_node)
14075 cp_token *token = cp_lexer_peek_token (parser->lexer);
14076 error_at (token->location,
14077 "expected parameter pack before %<...%>");
14079 /* Consume the `...' token. */
14080 cp_lexer_consume_token (parser->lexer);
14082 /* Make the argument into a TYPE_PACK_EXPANSION or
14083 EXPR_PACK_EXPANSION. */
14084 argument = make_pack_expansion (argument);
14087 if (n_args == alloced)
14089 alloced *= 2;
14091 if (arg_ary == fixed_args)
14093 arg_ary = XNEWVEC (tree, alloced);
14094 memcpy (arg_ary, fixed_args, sizeof (tree) * n_args);
14096 else
14097 arg_ary = XRESIZEVEC (tree, arg_ary, alloced);
14099 arg_ary[n_args++] = argument;
14101 while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
14103 vec = make_tree_vec (n_args);
14105 while (n_args--)
14106 TREE_VEC_ELT (vec, n_args) = arg_ary[n_args];
14108 if (arg_ary != fixed_args)
14109 free (arg_ary);
14110 parser->non_integral_constant_expression_p = saved_non_ice_p;
14111 parser->integral_constant_expression_p = saved_ice_p;
14112 parser->in_template_argument_list_p = saved_in_template_argument_list_p;
14113 #ifdef ENABLE_CHECKING
14114 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (vec, TREE_VEC_LENGTH (vec));
14115 #endif
14116 return vec;
14119 /* Parse a template-argument.
14121 template-argument:
14122 assignment-expression
14123 type-id
14124 id-expression
14126 The representation is that of an assignment-expression, type-id, or
14127 id-expression -- except that the qualified id-expression is
14128 evaluated, so that the value returned is either a DECL or an
14129 OVERLOAD.
14131 Although the standard says "assignment-expression", it forbids
14132 throw-expressions or assignments in the template argument.
14133 Therefore, we use "conditional-expression" instead. */
14135 static tree
14136 cp_parser_template_argument (cp_parser* parser)
14138 tree argument;
14139 bool template_p;
14140 bool address_p;
14141 bool maybe_type_id = false;
14142 cp_token *token = NULL, *argument_start_token = NULL;
14143 location_t loc = 0;
14144 cp_id_kind idk;
14146 /* There's really no way to know what we're looking at, so we just
14147 try each alternative in order.
14149 [temp.arg]
14151 In a template-argument, an ambiguity between a type-id and an
14152 expression is resolved to a type-id, regardless of the form of
14153 the corresponding template-parameter.
14155 Therefore, we try a type-id first. */
14156 cp_parser_parse_tentatively (parser);
14157 argument = cp_parser_template_type_arg (parser);
14158 /* If there was no error parsing the type-id but the next token is a
14159 '>>', our behavior depends on which dialect of C++ we're
14160 parsing. In C++98, we probably found a typo for '> >'. But there
14161 are type-id which are also valid expressions. For instance:
14163 struct X { int operator >> (int); };
14164 template <int V> struct Foo {};
14165 Foo<X () >> 5> r;
14167 Here 'X()' is a valid type-id of a function type, but the user just
14168 wanted to write the expression "X() >> 5". Thus, we remember that we
14169 found a valid type-id, but we still try to parse the argument as an
14170 expression to see what happens.
14172 In C++0x, the '>>' will be considered two separate '>'
14173 tokens. */
14174 if (!cp_parser_error_occurred (parser)
14175 && cxx_dialect == cxx98
14176 && cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
14178 maybe_type_id = true;
14179 cp_parser_abort_tentative_parse (parser);
14181 else
14183 /* If the next token isn't a `,' or a `>', then this argument wasn't
14184 really finished. This means that the argument is not a valid
14185 type-id. */
14186 if (!cp_parser_next_token_ends_template_argument_p (parser))
14187 cp_parser_error (parser, "expected template-argument");
14188 /* If that worked, we're done. */
14189 if (cp_parser_parse_definitely (parser))
14190 return argument;
14192 /* We're still not sure what the argument will be. */
14193 cp_parser_parse_tentatively (parser);
14194 /* Try a template. */
14195 argument_start_token = cp_lexer_peek_token (parser->lexer);
14196 argument = cp_parser_id_expression (parser,
14197 /*template_keyword_p=*/false,
14198 /*check_dependency_p=*/true,
14199 &template_p,
14200 /*declarator_p=*/false,
14201 /*optional_p=*/false);
14202 /* If the next token isn't a `,' or a `>', then this argument wasn't
14203 really finished. */
14204 if (!cp_parser_next_token_ends_template_argument_p (parser))
14205 cp_parser_error (parser, "expected template-argument");
14206 if (!cp_parser_error_occurred (parser))
14208 /* Figure out what is being referred to. If the id-expression
14209 was for a class template specialization, then we will have a
14210 TYPE_DECL at this point. There is no need to do name lookup
14211 at this point in that case. */
14212 if (TREE_CODE (argument) != TYPE_DECL)
14213 argument = cp_parser_lookup_name (parser, argument,
14214 none_type,
14215 /*is_template=*/template_p,
14216 /*is_namespace=*/false,
14217 /*check_dependency=*/true,
14218 /*ambiguous_decls=*/NULL,
14219 argument_start_token->location);
14220 if (TREE_CODE (argument) != TEMPLATE_DECL
14221 && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
14222 cp_parser_error (parser, "expected template-name");
14224 if (cp_parser_parse_definitely (parser))
14226 if (TREE_DEPRECATED (argument))
14227 warn_deprecated_use (argument, NULL_TREE);
14228 return argument;
14230 /* It must be a non-type argument. There permitted cases are given
14231 in [temp.arg.nontype]:
14233 -- an integral constant-expression of integral or enumeration
14234 type; or
14236 -- the name of a non-type template-parameter; or
14238 -- the name of an object or function with external linkage...
14240 -- the address of an object or function with external linkage...
14242 -- a pointer to member... */
14243 /* Look for a non-type template parameter. */
14244 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
14246 cp_parser_parse_tentatively (parser);
14247 argument = cp_parser_primary_expression (parser,
14248 /*address_p=*/false,
14249 /*cast_p=*/false,
14250 /*template_arg_p=*/true,
14251 &idk);
14252 if (TREE_CODE (argument) != TEMPLATE_PARM_INDEX
14253 || !cp_parser_next_token_ends_template_argument_p (parser))
14254 cp_parser_simulate_error (parser);
14255 if (cp_parser_parse_definitely (parser))
14256 return argument;
14259 /* If the next token is "&", the argument must be the address of an
14260 object or function with external linkage. */
14261 address_p = cp_lexer_next_token_is (parser->lexer, CPP_AND);
14262 if (address_p)
14264 loc = cp_lexer_peek_token (parser->lexer)->location;
14265 cp_lexer_consume_token (parser->lexer);
14267 /* See if we might have an id-expression. */
14268 token = cp_lexer_peek_token (parser->lexer);
14269 if (token->type == CPP_NAME
14270 || token->keyword == RID_OPERATOR
14271 || token->type == CPP_SCOPE
14272 || token->type == CPP_TEMPLATE_ID
14273 || token->type == CPP_NESTED_NAME_SPECIFIER)
14275 cp_parser_parse_tentatively (parser);
14276 argument = cp_parser_primary_expression (parser,
14277 address_p,
14278 /*cast_p=*/false,
14279 /*template_arg_p=*/true,
14280 &idk);
14281 if (cp_parser_error_occurred (parser)
14282 || !cp_parser_next_token_ends_template_argument_p (parser))
14283 cp_parser_abort_tentative_parse (parser);
14284 else
14286 tree probe;
14288 if (INDIRECT_REF_P (argument))
14290 /* Strip the dereference temporarily. */
14291 gcc_assert (REFERENCE_REF_P (argument));
14292 argument = TREE_OPERAND (argument, 0);
14295 /* If we're in a template, we represent a qualified-id referring
14296 to a static data member as a SCOPE_REF even if the scope isn't
14297 dependent so that we can check access control later. */
14298 probe = argument;
14299 if (TREE_CODE (probe) == SCOPE_REF)
14300 probe = TREE_OPERAND (probe, 1);
14301 if (VAR_P (probe))
14303 /* A variable without external linkage might still be a
14304 valid constant-expression, so no error is issued here
14305 if the external-linkage check fails. */
14306 if (!address_p && !DECL_EXTERNAL_LINKAGE_P (probe))
14307 cp_parser_simulate_error (parser);
14309 else if (is_overloaded_fn (argument))
14310 /* All overloaded functions are allowed; if the external
14311 linkage test does not pass, an error will be issued
14312 later. */
14314 else if (address_p
14315 && (TREE_CODE (argument) == OFFSET_REF
14316 || TREE_CODE (argument) == SCOPE_REF))
14317 /* A pointer-to-member. */
14319 else if (TREE_CODE (argument) == TEMPLATE_PARM_INDEX)
14321 else
14322 cp_parser_simulate_error (parser);
14324 if (cp_parser_parse_definitely (parser))
14326 if (address_p)
14327 argument = build_x_unary_op (loc, ADDR_EXPR, argument,
14328 tf_warning_or_error);
14329 else
14330 argument = convert_from_reference (argument);
14331 return argument;
14335 /* If the argument started with "&", there are no other valid
14336 alternatives at this point. */
14337 if (address_p)
14339 cp_parser_error (parser, "invalid non-type template argument");
14340 return error_mark_node;
14343 /* If the argument wasn't successfully parsed as a type-id followed
14344 by '>>', the argument can only be a constant expression now.
14345 Otherwise, we try parsing the constant-expression tentatively,
14346 because the argument could really be a type-id. */
14347 if (maybe_type_id)
14348 cp_parser_parse_tentatively (parser);
14349 argument = cp_parser_constant_expression (parser);
14351 if (!maybe_type_id)
14352 return argument;
14353 if (!cp_parser_next_token_ends_template_argument_p (parser))
14354 cp_parser_error (parser, "expected template-argument");
14355 if (cp_parser_parse_definitely (parser))
14356 return argument;
14357 /* We did our best to parse the argument as a non type-id, but that
14358 was the only alternative that matched (albeit with a '>' after
14359 it). We can assume it's just a typo from the user, and a
14360 diagnostic will then be issued. */
14361 return cp_parser_template_type_arg (parser);
14364 /* Parse an explicit-instantiation.
14366 explicit-instantiation:
14367 template declaration
14369 Although the standard says `declaration', what it really means is:
14371 explicit-instantiation:
14372 template decl-specifier-seq [opt] declarator [opt] ;
14374 Things like `template int S<int>::i = 5, int S<double>::j;' are not
14375 supposed to be allowed. A defect report has been filed about this
14376 issue.
14378 GNU Extension:
14380 explicit-instantiation:
14381 storage-class-specifier template
14382 decl-specifier-seq [opt] declarator [opt] ;
14383 function-specifier template
14384 decl-specifier-seq [opt] declarator [opt] ; */
14386 static void
14387 cp_parser_explicit_instantiation (cp_parser* parser)
14389 int declares_class_or_enum;
14390 cp_decl_specifier_seq decl_specifiers;
14391 tree extension_specifier = NULL_TREE;
14393 timevar_push (TV_TEMPLATE_INST);
14395 /* Look for an (optional) storage-class-specifier or
14396 function-specifier. */
14397 if (cp_parser_allow_gnu_extensions_p (parser))
14399 extension_specifier
14400 = cp_parser_storage_class_specifier_opt (parser);
14401 if (!extension_specifier)
14402 extension_specifier
14403 = cp_parser_function_specifier_opt (parser,
14404 /*decl_specs=*/NULL);
14407 /* Look for the `template' keyword. */
14408 cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
14409 /* Let the front end know that we are processing an explicit
14410 instantiation. */
14411 begin_explicit_instantiation ();
14412 /* [temp.explicit] says that we are supposed to ignore access
14413 control while processing explicit instantiation directives. */
14414 push_deferring_access_checks (dk_no_check);
14415 /* Parse a decl-specifier-seq. */
14416 cp_parser_decl_specifier_seq (parser,
14417 CP_PARSER_FLAGS_OPTIONAL,
14418 &decl_specifiers,
14419 &declares_class_or_enum);
14420 /* If there was exactly one decl-specifier, and it declared a class,
14421 and there's no declarator, then we have an explicit type
14422 instantiation. */
14423 if (declares_class_or_enum && cp_parser_declares_only_class_p (parser))
14425 tree type;
14427 type = check_tag_decl (&decl_specifiers,
14428 /*explicit_type_instantiation_p=*/true);
14429 /* Turn access control back on for names used during
14430 template instantiation. */
14431 pop_deferring_access_checks ();
14432 if (type)
14433 do_type_instantiation (type, extension_specifier,
14434 /*complain=*/tf_error);
14436 else
14438 cp_declarator *declarator;
14439 tree decl;
14441 /* Parse the declarator. */
14442 declarator
14443 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
14444 /*ctor_dtor_or_conv_p=*/NULL,
14445 /*parenthesized_p=*/NULL,
14446 /*member_p=*/false,
14447 /*friend_p=*/false);
14448 if (declares_class_or_enum & 2)
14449 cp_parser_check_for_definition_in_return_type (declarator,
14450 decl_specifiers.type,
14451 decl_specifiers.locations[ds_type_spec]);
14452 if (declarator != cp_error_declarator)
14454 if (decl_spec_seq_has_spec_p (&decl_specifiers, ds_inline))
14455 permerror (decl_specifiers.locations[ds_inline],
14456 "explicit instantiation shall not use"
14457 " %<inline%> specifier");
14458 if (decl_spec_seq_has_spec_p (&decl_specifiers, ds_constexpr))
14459 permerror (decl_specifiers.locations[ds_constexpr],
14460 "explicit instantiation shall not use"
14461 " %<constexpr%> specifier");
14463 decl = grokdeclarator (declarator, &decl_specifiers,
14464 NORMAL, 0, &decl_specifiers.attributes);
14465 /* Turn access control back on for names used during
14466 template instantiation. */
14467 pop_deferring_access_checks ();
14468 /* Do the explicit instantiation. */
14469 do_decl_instantiation (decl, extension_specifier);
14471 else
14473 pop_deferring_access_checks ();
14474 /* Skip the body of the explicit instantiation. */
14475 cp_parser_skip_to_end_of_statement (parser);
14478 /* We're done with the instantiation. */
14479 end_explicit_instantiation ();
14481 cp_parser_consume_semicolon_at_end_of_statement (parser);
14483 timevar_pop (TV_TEMPLATE_INST);
14486 /* Parse an explicit-specialization.
14488 explicit-specialization:
14489 template < > declaration
14491 Although the standard says `declaration', what it really means is:
14493 explicit-specialization:
14494 template <> decl-specifier [opt] init-declarator [opt] ;
14495 template <> function-definition
14496 template <> explicit-specialization
14497 template <> template-declaration */
14499 static void
14500 cp_parser_explicit_specialization (cp_parser* parser)
14502 bool need_lang_pop;
14503 cp_token *token = cp_lexer_peek_token (parser->lexer);
14505 /* Look for the `template' keyword. */
14506 cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
14507 /* Look for the `<'. */
14508 cp_parser_require (parser, CPP_LESS, RT_LESS);
14509 /* Look for the `>'. */
14510 cp_parser_require (parser, CPP_GREATER, RT_GREATER);
14511 /* We have processed another parameter list. */
14512 ++parser->num_template_parameter_lists;
14513 /* [temp]
14515 A template ... explicit specialization ... shall not have C
14516 linkage. */
14517 if (current_lang_name == lang_name_c)
14519 error_at (token->location, "template specialization with C linkage");
14520 /* Give it C++ linkage to avoid confusing other parts of the
14521 front end. */
14522 push_lang_context (lang_name_cplusplus);
14523 need_lang_pop = true;
14525 else
14526 need_lang_pop = false;
14527 /* Let the front end know that we are beginning a specialization. */
14528 if (!begin_specialization ())
14530 end_specialization ();
14531 return;
14534 /* If the next keyword is `template', we need to figure out whether
14535 or not we're looking a template-declaration. */
14536 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
14538 if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
14539 && cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_GREATER)
14540 cp_parser_template_declaration_after_export (parser,
14541 /*member_p=*/false);
14542 else
14543 cp_parser_explicit_specialization (parser);
14545 else
14546 /* Parse the dependent declaration. */
14547 cp_parser_single_declaration (parser,
14548 /*checks=*/NULL,
14549 /*member_p=*/false,
14550 /*explicit_specialization_p=*/true,
14551 /*friend_p=*/NULL);
14552 /* We're done with the specialization. */
14553 end_specialization ();
14554 /* For the erroneous case of a template with C linkage, we pushed an
14555 implicit C++ linkage scope; exit that scope now. */
14556 if (need_lang_pop)
14557 pop_lang_context ();
14558 /* We're done with this parameter list. */
14559 --parser->num_template_parameter_lists;
14562 /* Parse a type-specifier.
14564 type-specifier:
14565 simple-type-specifier
14566 class-specifier
14567 enum-specifier
14568 elaborated-type-specifier
14569 cv-qualifier
14571 GNU Extension:
14573 type-specifier:
14574 __complex__
14576 Returns a representation of the type-specifier. For a
14577 class-specifier, enum-specifier, or elaborated-type-specifier, a
14578 TREE_TYPE is returned; otherwise, a TYPE_DECL is returned.
14580 The parser flags FLAGS is used to control type-specifier parsing.
14582 If IS_DECLARATION is TRUE, then this type-specifier is appearing
14583 in a decl-specifier-seq.
14585 If DECLARES_CLASS_OR_ENUM is non-NULL, and the type-specifier is a
14586 class-specifier, enum-specifier, or elaborated-type-specifier, then
14587 *DECLARES_CLASS_OR_ENUM is set to a nonzero value. The value is 1
14588 if a type is declared; 2 if it is defined. Otherwise, it is set to
14589 zero.
14591 If IS_CV_QUALIFIER is non-NULL, and the type-specifier is a
14592 cv-qualifier, then IS_CV_QUALIFIER is set to TRUE. Otherwise, it
14593 is set to FALSE. */
14595 static tree
14596 cp_parser_type_specifier (cp_parser* parser,
14597 cp_parser_flags flags,
14598 cp_decl_specifier_seq *decl_specs,
14599 bool is_declaration,
14600 int* declares_class_or_enum,
14601 bool* is_cv_qualifier)
14603 tree type_spec = NULL_TREE;
14604 cp_token *token;
14605 enum rid keyword;
14606 cp_decl_spec ds = ds_last;
14608 /* Assume this type-specifier does not declare a new type. */
14609 if (declares_class_or_enum)
14610 *declares_class_or_enum = 0;
14611 /* And that it does not specify a cv-qualifier. */
14612 if (is_cv_qualifier)
14613 *is_cv_qualifier = false;
14614 /* Peek at the next token. */
14615 token = cp_lexer_peek_token (parser->lexer);
14617 /* If we're looking at a keyword, we can use that to guide the
14618 production we choose. */
14619 keyword = token->keyword;
14620 switch (keyword)
14622 case RID_ENUM:
14623 if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
14624 goto elaborated_type_specifier;
14626 /* Look for the enum-specifier. */
14627 type_spec = cp_parser_enum_specifier (parser);
14628 /* If that worked, we're done. */
14629 if (type_spec)
14631 if (declares_class_or_enum)
14632 *declares_class_or_enum = 2;
14633 if (decl_specs)
14634 cp_parser_set_decl_spec_type (decl_specs,
14635 type_spec,
14636 token,
14637 /*type_definition_p=*/true);
14638 return type_spec;
14640 else
14641 goto elaborated_type_specifier;
14643 /* Any of these indicate either a class-specifier, or an
14644 elaborated-type-specifier. */
14645 case RID_CLASS:
14646 case RID_STRUCT:
14647 case RID_UNION:
14648 if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
14649 goto elaborated_type_specifier;
14651 /* Parse tentatively so that we can back up if we don't find a
14652 class-specifier. */
14653 cp_parser_parse_tentatively (parser);
14654 /* Look for the class-specifier. */
14655 type_spec = cp_parser_class_specifier (parser);
14656 invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, type_spec);
14657 /* If that worked, we're done. */
14658 if (cp_parser_parse_definitely (parser))
14660 if (declares_class_or_enum)
14661 *declares_class_or_enum = 2;
14662 if (decl_specs)
14663 cp_parser_set_decl_spec_type (decl_specs,
14664 type_spec,
14665 token,
14666 /*type_definition_p=*/true);
14667 return type_spec;
14670 /* Fall through. */
14671 elaborated_type_specifier:
14672 /* We're declaring (not defining) a class or enum. */
14673 if (declares_class_or_enum)
14674 *declares_class_or_enum = 1;
14676 /* Fall through. */
14677 case RID_TYPENAME:
14678 /* Look for an elaborated-type-specifier. */
14679 type_spec
14680 = (cp_parser_elaborated_type_specifier
14681 (parser,
14682 decl_spec_seq_has_spec_p (decl_specs, ds_friend),
14683 is_declaration));
14684 if (decl_specs)
14685 cp_parser_set_decl_spec_type (decl_specs,
14686 type_spec,
14687 token,
14688 /*type_definition_p=*/false);
14689 return type_spec;
14691 case RID_CONST:
14692 ds = ds_const;
14693 if (is_cv_qualifier)
14694 *is_cv_qualifier = true;
14695 break;
14697 case RID_VOLATILE:
14698 ds = ds_volatile;
14699 if (is_cv_qualifier)
14700 *is_cv_qualifier = true;
14701 break;
14703 case RID_RESTRICT:
14704 ds = ds_restrict;
14705 if (is_cv_qualifier)
14706 *is_cv_qualifier = true;
14707 break;
14709 case RID_COMPLEX:
14710 /* The `__complex__' keyword is a GNU extension. */
14711 ds = ds_complex;
14712 break;
14714 default:
14715 break;
14718 /* Handle simple keywords. */
14719 if (ds != ds_last)
14721 if (decl_specs)
14723 set_and_check_decl_spec_loc (decl_specs, ds, token);
14724 decl_specs->any_specifiers_p = true;
14726 return cp_lexer_consume_token (parser->lexer)->u.value;
14729 /* If we do not already have a type-specifier, assume we are looking
14730 at a simple-type-specifier. */
14731 type_spec = cp_parser_simple_type_specifier (parser,
14732 decl_specs,
14733 flags);
14735 /* If we didn't find a type-specifier, and a type-specifier was not
14736 optional in this context, issue an error message. */
14737 if (!type_spec && !(flags & CP_PARSER_FLAGS_OPTIONAL))
14739 cp_parser_error (parser, "expected type specifier");
14740 return error_mark_node;
14743 return type_spec;
14746 /* Parse a simple-type-specifier.
14748 simple-type-specifier:
14749 :: [opt] nested-name-specifier [opt] type-name
14750 :: [opt] nested-name-specifier template template-id
14751 char
14752 wchar_t
14753 bool
14754 short
14756 long
14757 signed
14758 unsigned
14759 float
14760 double
14761 void
14763 C++0x Extension:
14765 simple-type-specifier:
14766 auto
14767 decltype ( expression )
14768 char16_t
14769 char32_t
14770 __underlying_type ( type-id )
14772 GNU Extension:
14774 simple-type-specifier:
14775 __int128
14776 __typeof__ unary-expression
14777 __typeof__ ( type-id )
14778 __typeof__ ( type-id ) { initializer-list , [opt] }
14780 Returns the indicated TYPE_DECL. If DECL_SPECS is not NULL, it is
14781 appropriately updated. */
14783 static tree
14784 cp_parser_simple_type_specifier (cp_parser* parser,
14785 cp_decl_specifier_seq *decl_specs,
14786 cp_parser_flags flags)
14788 tree type = NULL_TREE;
14789 cp_token *token;
14790 int idx;
14792 /* Peek at the next token. */
14793 token = cp_lexer_peek_token (parser->lexer);
14795 /* If we're looking at a keyword, things are easy. */
14796 switch (token->keyword)
14798 case RID_CHAR:
14799 if (decl_specs)
14800 decl_specs->explicit_char_p = true;
14801 type = char_type_node;
14802 break;
14803 case RID_CHAR16:
14804 type = char16_type_node;
14805 break;
14806 case RID_CHAR32:
14807 type = char32_type_node;
14808 break;
14809 case RID_WCHAR:
14810 type = wchar_type_node;
14811 break;
14812 case RID_BOOL:
14813 type = boolean_type_node;
14814 break;
14815 case RID_SHORT:
14816 set_and_check_decl_spec_loc (decl_specs, ds_short, token);
14817 type = short_integer_type_node;
14818 break;
14819 case RID_INT:
14820 if (decl_specs)
14821 decl_specs->explicit_int_p = true;
14822 type = integer_type_node;
14823 break;
14824 case RID_INT_N_0:
14825 case RID_INT_N_1:
14826 case RID_INT_N_2:
14827 case RID_INT_N_3:
14828 idx = token->keyword - RID_INT_N_0;
14829 if (! int_n_enabled_p [idx])
14830 break;
14831 if (decl_specs)
14833 decl_specs->explicit_intN_p = true;
14834 decl_specs->int_n_idx = idx;
14836 type = int_n_trees [idx].signed_type;
14837 break;
14838 case RID_LONG:
14839 if (decl_specs)
14840 set_and_check_decl_spec_loc (decl_specs, ds_long, token);
14841 type = long_integer_type_node;
14842 break;
14843 case RID_SIGNED:
14844 set_and_check_decl_spec_loc (decl_specs, ds_signed, token);
14845 type = integer_type_node;
14846 break;
14847 case RID_UNSIGNED:
14848 set_and_check_decl_spec_loc (decl_specs, ds_unsigned, token);
14849 type = unsigned_type_node;
14850 break;
14851 case RID_FLOAT:
14852 type = float_type_node;
14853 break;
14854 case RID_DOUBLE:
14855 type = double_type_node;
14856 break;
14857 case RID_VOID:
14858 type = void_type_node;
14859 break;
14861 case RID_AUTO:
14862 maybe_warn_cpp0x (CPP0X_AUTO);
14863 if (parser->auto_is_implicit_function_template_parm_p)
14865 type = synthesize_implicit_template_parm (parser);
14867 if (current_class_type && LAMBDA_TYPE_P (current_class_type))
14869 if (cxx_dialect < cxx14)
14870 pedwarn (location_of (type), 0,
14871 "use of %<auto%> in lambda parameter declaration "
14872 "only available with "
14873 "-std=c++14 or -std=gnu++14");
14875 else if (cxx_dialect < cxx14)
14876 pedwarn (location_of (type), 0,
14877 "use of %<auto%> in parameter declaration "
14878 "only available with "
14879 "-std=c++14 or -std=gnu++14");
14880 else
14881 pedwarn (location_of (type), OPT_Wpedantic,
14882 "ISO C++ forbids use of %<auto%> in parameter "
14883 "declaration");
14885 else
14886 type = make_auto ();
14887 break;
14889 case RID_DECLTYPE:
14890 /* Since DR 743, decltype can either be a simple-type-specifier by
14891 itself or begin a nested-name-specifier. Parsing it will replace
14892 it with a CPP_DECLTYPE, so just rewind and let the CPP_DECLTYPE
14893 handling below decide what to do. */
14894 cp_parser_decltype (parser);
14895 cp_lexer_set_token_position (parser->lexer, token);
14896 break;
14898 case RID_TYPEOF:
14899 /* Consume the `typeof' token. */
14900 cp_lexer_consume_token (parser->lexer);
14901 /* Parse the operand to `typeof'. */
14902 type = cp_parser_sizeof_operand (parser, RID_TYPEOF);
14903 /* If it is not already a TYPE, take its type. */
14904 if (!TYPE_P (type))
14905 type = finish_typeof (type);
14907 if (decl_specs)
14908 cp_parser_set_decl_spec_type (decl_specs, type,
14909 token,
14910 /*type_definition_p=*/false);
14912 return type;
14914 case RID_UNDERLYING_TYPE:
14915 type = cp_parser_trait_expr (parser, RID_UNDERLYING_TYPE);
14916 if (decl_specs)
14917 cp_parser_set_decl_spec_type (decl_specs, type,
14918 token,
14919 /*type_definition_p=*/false);
14921 return type;
14923 case RID_BASES:
14924 case RID_DIRECT_BASES:
14925 type = cp_parser_trait_expr (parser, token->keyword);
14926 if (decl_specs)
14927 cp_parser_set_decl_spec_type (decl_specs, type,
14928 token,
14929 /*type_definition_p=*/false);
14930 return type;
14931 default:
14932 break;
14935 /* If token is an already-parsed decltype not followed by ::,
14936 it's a simple-type-specifier. */
14937 if (token->type == CPP_DECLTYPE
14938 && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
14940 type = token->u.value;
14941 if (decl_specs)
14943 cp_parser_set_decl_spec_type (decl_specs, type,
14944 token,
14945 /*type_definition_p=*/false);
14946 /* Remember that we are handling a decltype in order to
14947 implement the resolution of DR 1510 when the argument
14948 isn't instantiation dependent. */
14949 decl_specs->decltype_p = true;
14951 cp_lexer_consume_token (parser->lexer);
14952 return type;
14955 /* If the type-specifier was for a built-in type, we're done. */
14956 if (type)
14958 /* Record the type. */
14959 if (decl_specs
14960 && (token->keyword != RID_SIGNED
14961 && token->keyword != RID_UNSIGNED
14962 && token->keyword != RID_SHORT
14963 && token->keyword != RID_LONG))
14964 cp_parser_set_decl_spec_type (decl_specs,
14965 type,
14966 token,
14967 /*type_definition_p=*/false);
14968 if (decl_specs)
14969 decl_specs->any_specifiers_p = true;
14971 /* Consume the token. */
14972 cp_lexer_consume_token (parser->lexer);
14974 /* There is no valid C++ program where a non-template type is
14975 followed by a "<". That usually indicates that the user thought
14976 that the type was a template. */
14977 cp_parser_check_for_invalid_template_id (parser, type, none_type,
14978 token->location);
14980 return TYPE_NAME (type);
14983 /* The type-specifier must be a user-defined type. */
14984 if (!(flags & CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES))
14986 bool qualified_p;
14987 bool global_p;
14989 /* Don't gobble tokens or issue error messages if this is an
14990 optional type-specifier. */
14991 if (flags & CP_PARSER_FLAGS_OPTIONAL)
14992 cp_parser_parse_tentatively (parser);
14994 /* Look for the optional `::' operator. */
14995 global_p
14996 = (cp_parser_global_scope_opt (parser,
14997 /*current_scope_valid_p=*/false)
14998 != NULL_TREE);
14999 /* Look for the nested-name specifier. */
15000 qualified_p
15001 = (cp_parser_nested_name_specifier_opt (parser,
15002 /*typename_keyword_p=*/false,
15003 /*check_dependency_p=*/true,
15004 /*type_p=*/false,
15005 /*is_declaration=*/false)
15006 != NULL_TREE);
15007 token = cp_lexer_peek_token (parser->lexer);
15008 /* If we have seen a nested-name-specifier, and the next token
15009 is `template', then we are using the template-id production. */
15010 if (parser->scope
15011 && cp_parser_optional_template_keyword (parser))
15013 /* Look for the template-id. */
15014 type = cp_parser_template_id (parser,
15015 /*template_keyword_p=*/true,
15016 /*check_dependency_p=*/true,
15017 none_type,
15018 /*is_declaration=*/false);
15019 /* If the template-id did not name a type, we are out of
15020 luck. */
15021 if (TREE_CODE (type) != TYPE_DECL)
15023 cp_parser_error (parser, "expected template-id for type");
15024 type = NULL_TREE;
15027 /* Otherwise, look for a type-name. */
15028 else
15029 type = cp_parser_type_name (parser);
15030 /* Keep track of all name-lookups performed in class scopes. */
15031 if (type
15032 && !global_p
15033 && !qualified_p
15034 && TREE_CODE (type) == TYPE_DECL
15035 && identifier_p (DECL_NAME (type)))
15036 maybe_note_name_used_in_class (DECL_NAME (type), type);
15037 /* If it didn't work out, we don't have a TYPE. */
15038 if ((flags & CP_PARSER_FLAGS_OPTIONAL)
15039 && !cp_parser_parse_definitely (parser))
15040 type = NULL_TREE;
15041 if (type && decl_specs)
15042 cp_parser_set_decl_spec_type (decl_specs, type,
15043 token,
15044 /*type_definition_p=*/false);
15047 /* If we didn't get a type-name, issue an error message. */
15048 if (!type && !(flags & CP_PARSER_FLAGS_OPTIONAL))
15050 cp_parser_error (parser, "expected type-name");
15051 return error_mark_node;
15054 if (type && type != error_mark_node)
15056 /* See if TYPE is an Objective-C type, and if so, parse and
15057 accept any protocol references following it. Do this before
15058 the cp_parser_check_for_invalid_template_id() call, because
15059 Objective-C types can be followed by '<...>' which would
15060 enclose protocol names rather than template arguments, and so
15061 everything is fine. */
15062 if (c_dialect_objc () && !parser->scope
15063 && (objc_is_id (type) || objc_is_class_name (type)))
15065 tree protos = cp_parser_objc_protocol_refs_opt (parser);
15066 tree qual_type = objc_get_protocol_qualified_type (type, protos);
15068 /* Clobber the "unqualified" type previously entered into
15069 DECL_SPECS with the new, improved protocol-qualified version. */
15070 if (decl_specs)
15071 decl_specs->type = qual_type;
15073 return qual_type;
15076 /* There is no valid C++ program where a non-template type is
15077 followed by a "<". That usually indicates that the user
15078 thought that the type was a template. */
15079 cp_parser_check_for_invalid_template_id (parser, TREE_TYPE (type),
15080 none_type,
15081 token->location);
15084 return type;
15087 /* Parse a type-name.
15089 type-name:
15090 class-name
15091 enum-name
15092 typedef-name
15093 simple-template-id [in c++0x]
15095 enum-name:
15096 identifier
15098 typedef-name:
15099 identifier
15101 Returns a TYPE_DECL for the type. */
15103 static tree
15104 cp_parser_type_name (cp_parser* parser)
15106 tree type_decl;
15108 /* We can't know yet whether it is a class-name or not. */
15109 cp_parser_parse_tentatively (parser);
15110 /* Try a class-name. */
15111 type_decl = cp_parser_class_name (parser,
15112 /*typename_keyword_p=*/false,
15113 /*template_keyword_p=*/false,
15114 none_type,
15115 /*check_dependency_p=*/true,
15116 /*class_head_p=*/false,
15117 /*is_declaration=*/false);
15118 /* If it's not a class-name, keep looking. */
15119 if (!cp_parser_parse_definitely (parser))
15121 if (cxx_dialect < cxx11)
15122 /* It must be a typedef-name or an enum-name. */
15123 return cp_parser_nonclass_name (parser);
15125 cp_parser_parse_tentatively (parser);
15126 /* It is either a simple-template-id representing an
15127 instantiation of an alias template... */
15128 type_decl = cp_parser_template_id (parser,
15129 /*template_keyword_p=*/false,
15130 /*check_dependency_p=*/true,
15131 none_type,
15132 /*is_declaration=*/false);
15133 /* Note that this must be an instantiation of an alias template
15134 because [temp.names]/6 says:
15136 A template-id that names an alias template specialization
15137 is a type-name.
15139 Whereas [temp.names]/7 says:
15141 A simple-template-id that names a class template
15142 specialization is a class-name. */
15143 if (type_decl != NULL_TREE
15144 && TREE_CODE (type_decl) == TYPE_DECL
15145 && TYPE_DECL_ALIAS_P (type_decl))
15146 gcc_assert (DECL_TEMPLATE_INSTANTIATION (type_decl));
15147 else
15148 cp_parser_simulate_error (parser);
15150 if (!cp_parser_parse_definitely (parser))
15151 /* ... Or a typedef-name or an enum-name. */
15152 return cp_parser_nonclass_name (parser);
15155 return type_decl;
15158 /* Parse a non-class type-name, that is, either an enum-name or a typedef-name.
15160 enum-name:
15161 identifier
15163 typedef-name:
15164 identifier
15166 Returns a TYPE_DECL for the type. */
15168 static tree
15169 cp_parser_nonclass_name (cp_parser* parser)
15171 tree type_decl;
15172 tree identifier;
15174 cp_token *token = cp_lexer_peek_token (parser->lexer);
15175 identifier = cp_parser_identifier (parser);
15176 if (identifier == error_mark_node)
15177 return error_mark_node;
15179 /* Look up the type-name. */
15180 type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location);
15182 type_decl = strip_using_decl (type_decl);
15184 if (TREE_CODE (type_decl) != TYPE_DECL
15185 && (objc_is_id (identifier) || objc_is_class_name (identifier)))
15187 /* See if this is an Objective-C type. */
15188 tree protos = cp_parser_objc_protocol_refs_opt (parser);
15189 tree type = objc_get_protocol_qualified_type (identifier, protos);
15190 if (type)
15191 type_decl = TYPE_NAME (type);
15194 /* Issue an error if we did not find a type-name. */
15195 if (TREE_CODE (type_decl) != TYPE_DECL
15196 /* In Objective-C, we have the complication that class names are
15197 normally type names and start declarations (eg, the
15198 "NSObject" in "NSObject *object;"), but can be used in an
15199 Objective-C 2.0 dot-syntax (as in "NSObject.version") which
15200 is an expression. So, a classname followed by a dot is not a
15201 valid type-name. */
15202 || (objc_is_class_name (TREE_TYPE (type_decl))
15203 && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT))
15205 if (!cp_parser_simulate_error (parser))
15206 cp_parser_name_lookup_error (parser, identifier, type_decl,
15207 NLE_TYPE, token->location);
15208 return error_mark_node;
15210 /* Remember that the name was used in the definition of the
15211 current class so that we can check later to see if the
15212 meaning would have been different after the class was
15213 entirely defined. */
15214 else if (type_decl != error_mark_node
15215 && !parser->scope)
15216 maybe_note_name_used_in_class (identifier, type_decl);
15218 return type_decl;
15221 /* Parse an elaborated-type-specifier. Note that the grammar given
15222 here incorporates the resolution to DR68.
15224 elaborated-type-specifier:
15225 class-key :: [opt] nested-name-specifier [opt] identifier
15226 class-key :: [opt] nested-name-specifier [opt] template [opt] template-id
15227 enum-key :: [opt] nested-name-specifier [opt] identifier
15228 typename :: [opt] nested-name-specifier identifier
15229 typename :: [opt] nested-name-specifier template [opt]
15230 template-id
15232 GNU extension:
15234 elaborated-type-specifier:
15235 class-key attributes :: [opt] nested-name-specifier [opt] identifier
15236 class-key attributes :: [opt] nested-name-specifier [opt]
15237 template [opt] template-id
15238 enum attributes :: [opt] nested-name-specifier [opt] identifier
15240 If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
15241 declared `friend'. If IS_DECLARATION is TRUE, then this
15242 elaborated-type-specifier appears in a decl-specifiers-seq, i.e.,
15243 something is being declared.
15245 Returns the TYPE specified. */
15247 static tree
15248 cp_parser_elaborated_type_specifier (cp_parser* parser,
15249 bool is_friend,
15250 bool is_declaration)
15252 enum tag_types tag_type;
15253 tree identifier;
15254 tree type = NULL_TREE;
15255 tree attributes = NULL_TREE;
15256 tree globalscope;
15257 cp_token *token = NULL;
15259 /* See if we're looking at the `enum' keyword. */
15260 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ENUM))
15262 /* Consume the `enum' token. */
15263 cp_lexer_consume_token (parser->lexer);
15264 /* Remember that it's an enumeration type. */
15265 tag_type = enum_type;
15266 /* Issue a warning if the `struct' or `class' key (for C++0x scoped
15267 enums) is used here. */
15268 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
15269 || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
15271 pedwarn (input_location, 0, "elaborated-type-specifier "
15272 "for a scoped enum must not use the %<%D%> keyword",
15273 cp_lexer_peek_token (parser->lexer)->u.value);
15274 /* Consume the `struct' or `class' and parse it anyway. */
15275 cp_lexer_consume_token (parser->lexer);
15277 /* Parse the attributes. */
15278 attributes = cp_parser_attributes_opt (parser);
15280 /* Or, it might be `typename'. */
15281 else if (cp_lexer_next_token_is_keyword (parser->lexer,
15282 RID_TYPENAME))
15284 /* Consume the `typename' token. */
15285 cp_lexer_consume_token (parser->lexer);
15286 /* Remember that it's a `typename' type. */
15287 tag_type = typename_type;
15289 /* Otherwise it must be a class-key. */
15290 else
15292 tag_type = cp_parser_class_key (parser);
15293 if (tag_type == none_type)
15294 return error_mark_node;
15295 /* Parse the attributes. */
15296 attributes = cp_parser_attributes_opt (parser);
15299 /* Look for the `::' operator. */
15300 globalscope = cp_parser_global_scope_opt (parser,
15301 /*current_scope_valid_p=*/false);
15302 /* Look for the nested-name-specifier. */
15303 if (tag_type == typename_type && !globalscope)
15305 if (!cp_parser_nested_name_specifier (parser,
15306 /*typename_keyword_p=*/true,
15307 /*check_dependency_p=*/true,
15308 /*type_p=*/true,
15309 is_declaration))
15310 return error_mark_node;
15312 else
15313 /* Even though `typename' is not present, the proposed resolution
15314 to Core Issue 180 says that in `class A<T>::B', `B' should be
15315 considered a type-name, even if `A<T>' is dependent. */
15316 cp_parser_nested_name_specifier_opt (parser,
15317 /*typename_keyword_p=*/true,
15318 /*check_dependency_p=*/true,
15319 /*type_p=*/true,
15320 is_declaration);
15321 /* For everything but enumeration types, consider a template-id.
15322 For an enumeration type, consider only a plain identifier. */
15323 if (tag_type != enum_type)
15325 bool template_p = false;
15326 tree decl;
15328 /* Allow the `template' keyword. */
15329 template_p = cp_parser_optional_template_keyword (parser);
15330 /* If we didn't see `template', we don't know if there's a
15331 template-id or not. */
15332 if (!template_p)
15333 cp_parser_parse_tentatively (parser);
15334 /* Parse the template-id. */
15335 token = cp_lexer_peek_token (parser->lexer);
15336 decl = cp_parser_template_id (parser, template_p,
15337 /*check_dependency_p=*/true,
15338 tag_type,
15339 is_declaration);
15340 /* If we didn't find a template-id, look for an ordinary
15341 identifier. */
15342 if (!template_p && !cp_parser_parse_definitely (parser))
15344 /* We can get here when cp_parser_template_id, called by
15345 cp_parser_class_name with tag_type == none_type, succeeds
15346 and caches a BASELINK. Then, when called again here,
15347 instead of failing and returning an error_mark_node
15348 returns it (see template/typename17.C in C++11).
15349 ??? Could we diagnose this earlier? */
15350 else if (tag_type == typename_type && BASELINK_P (decl))
15352 cp_parser_diagnose_invalid_type_name (parser, decl, token->location);
15353 type = error_mark_node;
15355 /* If DECL is a TEMPLATE_ID_EXPR, and the `typename' keyword is
15356 in effect, then we must assume that, upon instantiation, the
15357 template will correspond to a class. */
15358 else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
15359 && tag_type == typename_type)
15360 type = make_typename_type (parser->scope, decl,
15361 typename_type,
15362 /*complain=*/tf_error);
15363 /* If the `typename' keyword is in effect and DECL is not a type
15364 decl, then type is non existent. */
15365 else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL)
15367 else if (TREE_CODE (decl) == TYPE_DECL)
15368 type = check_elaborated_type_specifier (tag_type, decl,
15369 /*allow_template_p=*/true);
15370 else if (decl == error_mark_node)
15371 type = error_mark_node;
15374 if (!type)
15376 token = cp_lexer_peek_token (parser->lexer);
15377 identifier = cp_parser_identifier (parser);
15379 if (identifier == error_mark_node)
15381 parser->scope = NULL_TREE;
15382 return error_mark_node;
15385 /* For a `typename', we needn't call xref_tag. */
15386 if (tag_type == typename_type
15387 && TREE_CODE (parser->scope) != NAMESPACE_DECL)
15388 return cp_parser_make_typename_type (parser, identifier,
15389 token->location);
15391 /* Template parameter lists apply only if we are not within a
15392 function parameter list. */
15393 bool template_parm_lists_apply
15394 = parser->num_template_parameter_lists;
15395 if (template_parm_lists_apply)
15396 for (cp_binding_level *s = current_binding_level;
15397 s && s->kind != sk_template_parms;
15398 s = s->level_chain)
15399 if (s->kind == sk_function_parms)
15400 template_parm_lists_apply = false;
15402 /* Look up a qualified name in the usual way. */
15403 if (parser->scope)
15405 tree decl;
15406 tree ambiguous_decls;
15408 decl = cp_parser_lookup_name (parser, identifier,
15409 tag_type,
15410 /*is_template=*/false,
15411 /*is_namespace=*/false,
15412 /*check_dependency=*/true,
15413 &ambiguous_decls,
15414 token->location);
15416 /* If the lookup was ambiguous, an error will already have been
15417 issued. */
15418 if (ambiguous_decls)
15419 return error_mark_node;
15421 /* If we are parsing friend declaration, DECL may be a
15422 TEMPLATE_DECL tree node here. However, we need to check
15423 whether this TEMPLATE_DECL results in valid code. Consider
15424 the following example:
15426 namespace N {
15427 template <class T> class C {};
15429 class X {
15430 template <class T> friend class N::C; // #1, valid code
15432 template <class T> class Y {
15433 friend class N::C; // #2, invalid code
15436 For both case #1 and #2, we arrive at a TEMPLATE_DECL after
15437 name lookup of `N::C'. We see that friend declaration must
15438 be template for the code to be valid. Note that
15439 processing_template_decl does not work here since it is
15440 always 1 for the above two cases. */
15442 decl = (cp_parser_maybe_treat_template_as_class
15443 (decl, /*tag_name_p=*/is_friend
15444 && template_parm_lists_apply));
15446 if (TREE_CODE (decl) != TYPE_DECL)
15448 cp_parser_diagnose_invalid_type_name (parser,
15449 identifier,
15450 token->location);
15451 return error_mark_node;
15454 if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
15456 bool allow_template = (template_parm_lists_apply
15457 || DECL_SELF_REFERENCE_P (decl));
15458 type = check_elaborated_type_specifier (tag_type, decl,
15459 allow_template);
15461 if (type == error_mark_node)
15462 return error_mark_node;
15465 /* Forward declarations of nested types, such as
15467 class C1::C2;
15468 class C1::C2::C3;
15470 are invalid unless all components preceding the final '::'
15471 are complete. If all enclosing types are complete, these
15472 declarations become merely pointless.
15474 Invalid forward declarations of nested types are errors
15475 caught elsewhere in parsing. Those that are pointless arrive
15476 here. */
15478 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
15479 && !is_friend && !processing_explicit_instantiation)
15480 warning (0, "declaration %qD does not declare anything", decl);
15482 type = TREE_TYPE (decl);
15484 else
15486 /* An elaborated-type-specifier sometimes introduces a new type and
15487 sometimes names an existing type. Normally, the rule is that it
15488 introduces a new type only if there is not an existing type of
15489 the same name already in scope. For example, given:
15491 struct S {};
15492 void f() { struct S s; }
15494 the `struct S' in the body of `f' is the same `struct S' as in
15495 the global scope; the existing definition is used. However, if
15496 there were no global declaration, this would introduce a new
15497 local class named `S'.
15499 An exception to this rule applies to the following code:
15501 namespace N { struct S; }
15503 Here, the elaborated-type-specifier names a new type
15504 unconditionally; even if there is already an `S' in the
15505 containing scope this declaration names a new type.
15506 This exception only applies if the elaborated-type-specifier
15507 forms the complete declaration:
15509 [class.name]
15511 A declaration consisting solely of `class-key identifier ;' is
15512 either a redeclaration of the name in the current scope or a
15513 forward declaration of the identifier as a class name. It
15514 introduces the name into the current scope.
15516 We are in this situation precisely when the next token is a `;'.
15518 An exception to the exception is that a `friend' declaration does
15519 *not* name a new type; i.e., given:
15521 struct S { friend struct T; };
15523 `T' is not a new type in the scope of `S'.
15525 Also, `new struct S' or `sizeof (struct S)' never results in the
15526 definition of a new type; a new type can only be declared in a
15527 declaration context. */
15529 tag_scope ts;
15530 bool template_p;
15532 if (is_friend)
15533 /* Friends have special name lookup rules. */
15534 ts = ts_within_enclosing_non_class;
15535 else if (is_declaration
15536 && cp_lexer_next_token_is (parser->lexer,
15537 CPP_SEMICOLON))
15538 /* This is a `class-key identifier ;' */
15539 ts = ts_current;
15540 else
15541 ts = ts_global;
15543 template_p =
15544 (template_parm_lists_apply
15545 && (cp_parser_next_token_starts_class_definition_p (parser)
15546 || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)));
15547 /* An unqualified name was used to reference this type, so
15548 there were no qualifying templates. */
15549 if (template_parm_lists_apply
15550 && !cp_parser_check_template_parameters (parser,
15551 /*num_templates=*/0,
15552 token->location,
15553 /*declarator=*/NULL))
15554 return error_mark_node;
15555 type = xref_tag (tag_type, identifier, ts, template_p);
15559 if (type == error_mark_node)
15560 return error_mark_node;
15562 /* Allow attributes on forward declarations of classes. */
15563 if (attributes)
15565 if (TREE_CODE (type) == TYPENAME_TYPE)
15566 warning (OPT_Wattributes,
15567 "attributes ignored on uninstantiated type");
15568 else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
15569 && ! processing_explicit_instantiation)
15570 warning (OPT_Wattributes,
15571 "attributes ignored on template instantiation");
15572 else if (is_declaration && cp_parser_declares_only_class_p (parser))
15573 cplus_decl_attributes (&type, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
15574 else
15575 warning (OPT_Wattributes,
15576 "attributes ignored on elaborated-type-specifier that is not a forward declaration");
15579 if (tag_type != enum_type)
15581 /* Indicate whether this class was declared as a `class' or as a
15582 `struct'. */
15583 if (TREE_CODE (type) == RECORD_TYPE)
15584 CLASSTYPE_DECLARED_CLASS (type) = (tag_type == class_type);
15585 cp_parser_check_class_key (tag_type, type);
15588 /* A "<" cannot follow an elaborated type specifier. If that
15589 happens, the user was probably trying to form a template-id. */
15590 cp_parser_check_for_invalid_template_id (parser, type, tag_type,
15591 token->location);
15593 return type;
15596 /* Parse an enum-specifier.
15598 enum-specifier:
15599 enum-head { enumerator-list [opt] }
15600 enum-head { enumerator-list , } [C++0x]
15602 enum-head:
15603 enum-key identifier [opt] enum-base [opt]
15604 enum-key nested-name-specifier identifier enum-base [opt]
15606 enum-key:
15607 enum
15608 enum class [C++0x]
15609 enum struct [C++0x]
15611 enum-base: [C++0x]
15612 : type-specifier-seq
15614 opaque-enum-specifier:
15615 enum-key identifier enum-base [opt] ;
15617 GNU Extensions:
15618 enum-key attributes[opt] identifier [opt] enum-base [opt]
15619 { enumerator-list [opt] }attributes[opt]
15620 enum-key attributes[opt] identifier [opt] enum-base [opt]
15621 { enumerator-list, }attributes[opt] [C++0x]
15623 Returns an ENUM_TYPE representing the enumeration, or NULL_TREE
15624 if the token stream isn't an enum-specifier after all. */
15626 static tree
15627 cp_parser_enum_specifier (cp_parser* parser)
15629 tree identifier;
15630 tree type = NULL_TREE;
15631 tree prev_scope;
15632 tree nested_name_specifier = NULL_TREE;
15633 tree attributes;
15634 bool scoped_enum_p = false;
15635 bool has_underlying_type = false;
15636 bool nested_being_defined = false;
15637 bool new_value_list = false;
15638 bool is_new_type = false;
15639 bool is_anonymous = false;
15640 tree underlying_type = NULL_TREE;
15641 cp_token *type_start_token = NULL;
15642 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
15644 parser->colon_corrects_to_scope_p = false;
15646 /* Parse tentatively so that we can back up if we don't find a
15647 enum-specifier. */
15648 cp_parser_parse_tentatively (parser);
15650 /* Caller guarantees that the current token is 'enum', an identifier
15651 possibly follows, and the token after that is an opening brace.
15652 If we don't have an identifier, fabricate an anonymous name for
15653 the enumeration being defined. */
15654 cp_lexer_consume_token (parser->lexer);
15656 /* Parse the "class" or "struct", which indicates a scoped
15657 enumeration type in C++0x. */
15658 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
15659 || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
15661 if (cxx_dialect < cxx11)
15662 maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
15664 /* Consume the `struct' or `class' token. */
15665 cp_lexer_consume_token (parser->lexer);
15667 scoped_enum_p = true;
15670 attributes = cp_parser_attributes_opt (parser);
15672 /* Clear the qualification. */
15673 parser->scope = NULL_TREE;
15674 parser->qualifying_scope = NULL_TREE;
15675 parser->object_scope = NULL_TREE;
15677 /* Figure out in what scope the declaration is being placed. */
15678 prev_scope = current_scope ();
15680 type_start_token = cp_lexer_peek_token (parser->lexer);
15682 push_deferring_access_checks (dk_no_check);
15683 nested_name_specifier
15684 = cp_parser_nested_name_specifier_opt (parser,
15685 /*typename_keyword_p=*/true,
15686 /*check_dependency_p=*/false,
15687 /*type_p=*/false,
15688 /*is_declaration=*/false);
15690 if (nested_name_specifier)
15692 tree name;
15694 identifier = cp_parser_identifier (parser);
15695 name = cp_parser_lookup_name (parser, identifier,
15696 enum_type,
15697 /*is_template=*/false,
15698 /*is_namespace=*/false,
15699 /*check_dependency=*/true,
15700 /*ambiguous_decls=*/NULL,
15701 input_location);
15702 if (name && name != error_mark_node)
15704 type = TREE_TYPE (name);
15705 if (TREE_CODE (type) == TYPENAME_TYPE)
15707 /* Are template enums allowed in ISO? */
15708 if (template_parm_scope_p ())
15709 pedwarn (type_start_token->location, OPT_Wpedantic,
15710 "%qD is an enumeration template", name);
15711 /* ignore a typename reference, for it will be solved by name
15712 in start_enum. */
15713 type = NULL_TREE;
15716 else if (nested_name_specifier == error_mark_node)
15717 /* We already issued an error. */;
15718 else
15719 error_at (type_start_token->location,
15720 "%qD is not an enumerator-name", identifier);
15722 else
15724 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
15725 identifier = cp_parser_identifier (parser);
15726 else
15728 identifier = make_anon_name ();
15729 is_anonymous = true;
15730 if (scoped_enum_p)
15731 error_at (type_start_token->location,
15732 "anonymous scoped enum is not allowed");
15735 pop_deferring_access_checks ();
15737 /* Check for the `:' that denotes a specified underlying type in C++0x.
15738 Note that a ':' could also indicate a bitfield width, however. */
15739 if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
15741 cp_decl_specifier_seq type_specifiers;
15743 /* Consume the `:'. */
15744 cp_lexer_consume_token (parser->lexer);
15746 /* Parse the type-specifier-seq. */
15747 cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
15748 /*is_trailing_return=*/false,
15749 &type_specifiers);
15751 /* At this point this is surely not elaborated type specifier. */
15752 if (!cp_parser_parse_definitely (parser))
15753 return NULL_TREE;
15755 if (cxx_dialect < cxx11)
15756 maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
15758 has_underlying_type = true;
15760 /* If that didn't work, stop. */
15761 if (type_specifiers.type != error_mark_node)
15763 underlying_type = grokdeclarator (NULL, &type_specifiers, TYPENAME,
15764 /*initialized=*/0, NULL);
15765 if (underlying_type == error_mark_node
15766 || check_for_bare_parameter_packs (underlying_type))
15767 underlying_type = NULL_TREE;
15771 /* Look for the `{' but don't consume it yet. */
15772 if (!cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
15774 if (cxx_dialect < cxx11 || (!scoped_enum_p && !underlying_type))
15776 cp_parser_error (parser, "expected %<{%>");
15777 if (has_underlying_type)
15779 type = NULL_TREE;
15780 goto out;
15783 /* An opaque-enum-specifier must have a ';' here. */
15784 if ((scoped_enum_p || underlying_type)
15785 && cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
15787 cp_parser_error (parser, "expected %<;%> or %<{%>");
15788 if (has_underlying_type)
15790 type = NULL_TREE;
15791 goto out;
15796 if (!has_underlying_type && !cp_parser_parse_definitely (parser))
15797 return NULL_TREE;
15799 if (nested_name_specifier)
15801 if (CLASS_TYPE_P (nested_name_specifier))
15803 nested_being_defined = TYPE_BEING_DEFINED (nested_name_specifier);
15804 TYPE_BEING_DEFINED (nested_name_specifier) = 1;
15805 push_scope (nested_name_specifier);
15807 else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
15809 push_nested_namespace (nested_name_specifier);
15813 /* Issue an error message if type-definitions are forbidden here. */
15814 if (!cp_parser_check_type_definition (parser))
15815 type = error_mark_node;
15816 else
15817 /* Create the new type. We do this before consuming the opening
15818 brace so the enum will be recorded as being on the line of its
15819 tag (or the 'enum' keyword, if there is no tag). */
15820 type = start_enum (identifier, type, underlying_type,
15821 scoped_enum_p, &is_new_type);
15823 /* If the next token is not '{' it is an opaque-enum-specifier or an
15824 elaborated-type-specifier. */
15825 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
15827 timevar_push (TV_PARSE_ENUM);
15828 if (nested_name_specifier
15829 && nested_name_specifier != error_mark_node)
15831 /* The following catches invalid code such as:
15832 enum class S<int>::E { A, B, C }; */
15833 if (!processing_specialization
15834 && CLASS_TYPE_P (nested_name_specifier)
15835 && CLASSTYPE_USE_TEMPLATE (nested_name_specifier))
15836 error_at (type_start_token->location, "cannot add an enumerator "
15837 "list to a template instantiation");
15839 if (TREE_CODE (nested_name_specifier) == TYPENAME_TYPE)
15841 error_at (type_start_token->location,
15842 "%<%T::%E%> has not been declared",
15843 TYPE_CONTEXT (nested_name_specifier),
15844 nested_name_specifier);
15845 type = error_mark_node;
15847 /* If that scope does not contain the scope in which the
15848 class was originally declared, the program is invalid. */
15849 else if (prev_scope && !is_ancestor (prev_scope,
15850 nested_name_specifier))
15852 if (at_namespace_scope_p ())
15853 error_at (type_start_token->location,
15854 "declaration of %qD in namespace %qD which does not "
15855 "enclose %qD",
15856 type, prev_scope, nested_name_specifier);
15857 else
15858 error_at (type_start_token->location,
15859 "declaration of %qD in %qD which does not "
15860 "enclose %qD",
15861 type, prev_scope, nested_name_specifier);
15862 type = error_mark_node;
15866 if (scoped_enum_p)
15867 begin_scope (sk_scoped_enum, type);
15869 /* Consume the opening brace. */
15870 cp_lexer_consume_token (parser->lexer);
15872 if (type == error_mark_node)
15873 ; /* Nothing to add */
15874 else if (OPAQUE_ENUM_P (type)
15875 || (cxx_dialect > cxx98 && processing_specialization))
15877 new_value_list = true;
15878 SET_OPAQUE_ENUM_P (type, false);
15879 DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
15881 else
15883 error_at (type_start_token->location,
15884 "multiple definition of %q#T", type);
15885 inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
15886 "previous definition here");
15887 type = error_mark_node;
15890 if (type == error_mark_node)
15891 cp_parser_skip_to_end_of_block_or_statement (parser);
15892 /* If the next token is not '}', then there are some enumerators. */
15893 else if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
15895 if (is_anonymous && !scoped_enum_p)
15896 pedwarn (type_start_token->location, OPT_Wpedantic,
15897 "ISO C++ forbids empty anonymous enum");
15899 else
15900 cp_parser_enumerator_list (parser, type);
15902 /* Consume the final '}'. */
15903 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
15905 if (scoped_enum_p)
15906 finish_scope ();
15907 timevar_pop (TV_PARSE_ENUM);
15909 else
15911 /* If a ';' follows, then it is an opaque-enum-specifier
15912 and additional restrictions apply. */
15913 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
15915 if (is_anonymous)
15916 error_at (type_start_token->location,
15917 "opaque-enum-specifier without name");
15918 else if (nested_name_specifier)
15919 error_at (type_start_token->location,
15920 "opaque-enum-specifier must use a simple identifier");
15924 /* Look for trailing attributes to apply to this enumeration, and
15925 apply them if appropriate. */
15926 if (cp_parser_allow_gnu_extensions_p (parser))
15928 tree trailing_attr = cp_parser_gnu_attributes_opt (parser);
15929 trailing_attr = chainon (trailing_attr, attributes);
15930 cplus_decl_attributes (&type,
15931 trailing_attr,
15932 (int) ATTR_FLAG_TYPE_IN_PLACE);
15935 /* Finish up the enumeration. */
15936 if (type != error_mark_node)
15938 if (new_value_list)
15939 finish_enum_value_list (type);
15940 if (is_new_type)
15941 finish_enum (type);
15944 if (nested_name_specifier)
15946 if (CLASS_TYPE_P (nested_name_specifier))
15948 TYPE_BEING_DEFINED (nested_name_specifier) = nested_being_defined;
15949 pop_scope (nested_name_specifier);
15951 else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
15953 pop_nested_namespace (nested_name_specifier);
15956 out:
15957 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
15958 return type;
15961 /* Parse an enumerator-list. The enumerators all have the indicated
15962 TYPE.
15964 enumerator-list:
15965 enumerator-definition
15966 enumerator-list , enumerator-definition */
15968 static void
15969 cp_parser_enumerator_list (cp_parser* parser, tree type)
15971 while (true)
15973 /* Parse an enumerator-definition. */
15974 cp_parser_enumerator_definition (parser, type);
15976 /* If the next token is not a ',', we've reached the end of
15977 the list. */
15978 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
15979 break;
15980 /* Otherwise, consume the `,' and keep going. */
15981 cp_lexer_consume_token (parser->lexer);
15982 /* If the next token is a `}', there is a trailing comma. */
15983 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
15985 if (cxx_dialect < cxx11 && !in_system_header_at (input_location))
15986 pedwarn (input_location, OPT_Wpedantic,
15987 "comma at end of enumerator list");
15988 break;
15993 /* Parse an enumerator-definition. The enumerator has the indicated
15994 TYPE.
15996 enumerator-definition:
15997 enumerator
15998 enumerator = constant-expression
16000 enumerator:
16001 identifier */
16003 static void
16004 cp_parser_enumerator_definition (cp_parser* parser, tree type)
16006 tree identifier;
16007 tree value;
16008 location_t loc;
16010 /* Save the input location because we are interested in the location
16011 of the identifier and not the location of the explicit value. */
16012 loc = cp_lexer_peek_token (parser->lexer)->location;
16014 /* Look for the identifier. */
16015 identifier = cp_parser_identifier (parser);
16016 if (identifier == error_mark_node)
16017 return;
16019 /* If the next token is an '=', then there is an explicit value. */
16020 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
16022 /* Consume the `=' token. */
16023 cp_lexer_consume_token (parser->lexer);
16024 /* Parse the value. */
16025 value = cp_parser_constant_expression (parser);
16027 else
16028 value = NULL_TREE;
16030 /* If we are processing a template, make sure the initializer of the
16031 enumerator doesn't contain any bare template parameter pack. */
16032 if (check_for_bare_parameter_packs (value))
16033 value = error_mark_node;
16035 /* Create the enumerator. */
16036 build_enumerator (identifier, value, type, loc);
16039 /* Parse a namespace-name.
16041 namespace-name:
16042 original-namespace-name
16043 namespace-alias
16045 Returns the NAMESPACE_DECL for the namespace. */
16047 static tree
16048 cp_parser_namespace_name (cp_parser* parser)
16050 tree identifier;
16051 tree namespace_decl;
16053 cp_token *token = cp_lexer_peek_token (parser->lexer);
16055 /* Get the name of the namespace. */
16056 identifier = cp_parser_identifier (parser);
16057 if (identifier == error_mark_node)
16058 return error_mark_node;
16060 /* Look up the identifier in the currently active scope. Look only
16061 for namespaces, due to:
16063 [basic.lookup.udir]
16065 When looking up a namespace-name in a using-directive or alias
16066 definition, only namespace names are considered.
16068 And:
16070 [basic.lookup.qual]
16072 During the lookup of a name preceding the :: scope resolution
16073 operator, object, function, and enumerator names are ignored.
16075 (Note that cp_parser_qualifying_entity only calls this
16076 function if the token after the name is the scope resolution
16077 operator.) */
16078 namespace_decl = cp_parser_lookup_name (parser, identifier,
16079 none_type,
16080 /*is_template=*/false,
16081 /*is_namespace=*/true,
16082 /*check_dependency=*/true,
16083 /*ambiguous_decls=*/NULL,
16084 token->location);
16085 /* If it's not a namespace, issue an error. */
16086 if (namespace_decl == error_mark_node
16087 || TREE_CODE (namespace_decl) != NAMESPACE_DECL)
16089 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
16090 error_at (token->location, "%qD is not a namespace-name", identifier);
16091 cp_parser_error (parser, "expected namespace-name");
16092 namespace_decl = error_mark_node;
16095 return namespace_decl;
16098 /* Parse a namespace-definition.
16100 namespace-definition:
16101 named-namespace-definition
16102 unnamed-namespace-definition
16104 named-namespace-definition:
16105 original-namespace-definition
16106 extension-namespace-definition
16108 original-namespace-definition:
16109 namespace identifier { namespace-body }
16111 extension-namespace-definition:
16112 namespace original-namespace-name { namespace-body }
16114 unnamed-namespace-definition:
16115 namespace { namespace-body } */
16117 static void
16118 cp_parser_namespace_definition (cp_parser* parser)
16120 tree identifier, attribs;
16121 bool has_visibility;
16122 bool is_inline;
16124 cp_ensure_no_omp_declare_simd (parser);
16125 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_INLINE))
16127 maybe_warn_cpp0x (CPP0X_INLINE_NAMESPACES);
16128 is_inline = true;
16129 cp_lexer_consume_token (parser->lexer);
16131 else
16132 is_inline = false;
16134 /* Look for the `namespace' keyword. */
16135 cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
16137 /* Get the name of the namespace. We do not attempt to distinguish
16138 between an original-namespace-definition and an
16139 extension-namespace-definition at this point. The semantic
16140 analysis routines are responsible for that. */
16141 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
16142 identifier = cp_parser_identifier (parser);
16143 else
16144 identifier = NULL_TREE;
16146 /* Parse any specified attributes. */
16147 attribs = cp_parser_attributes_opt (parser);
16149 /* Look for the `{' to start the namespace. */
16150 cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
16151 /* Start the namespace. */
16152 push_namespace (identifier);
16154 /* "inline namespace" is equivalent to a stub namespace definition
16155 followed by a strong using directive. */
16156 if (is_inline)
16158 tree name_space = current_namespace;
16159 /* Set up namespace association. */
16160 DECL_NAMESPACE_ASSOCIATIONS (name_space)
16161 = tree_cons (CP_DECL_CONTEXT (name_space), NULL_TREE,
16162 DECL_NAMESPACE_ASSOCIATIONS (name_space));
16163 /* Import the contents of the inline namespace. */
16164 pop_namespace ();
16165 do_using_directive (name_space);
16166 push_namespace (identifier);
16169 has_visibility = handle_namespace_attrs (current_namespace, attribs);
16171 /* Parse the body of the namespace. */
16172 cp_parser_namespace_body (parser);
16174 if (has_visibility)
16175 pop_visibility (1);
16177 /* Finish the namespace. */
16178 pop_namespace ();
16179 /* Look for the final `}'. */
16180 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16183 /* Parse a namespace-body.
16185 namespace-body:
16186 declaration-seq [opt] */
16188 static void
16189 cp_parser_namespace_body (cp_parser* parser)
16191 cp_parser_declaration_seq_opt (parser);
16194 /* Parse a namespace-alias-definition.
16196 namespace-alias-definition:
16197 namespace identifier = qualified-namespace-specifier ; */
16199 static void
16200 cp_parser_namespace_alias_definition (cp_parser* parser)
16202 tree identifier;
16203 tree namespace_specifier;
16205 cp_token *token = cp_lexer_peek_token (parser->lexer);
16207 /* Look for the `namespace' keyword. */
16208 cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
16209 /* Look for the identifier. */
16210 identifier = cp_parser_identifier (parser);
16211 if (identifier == error_mark_node)
16212 return;
16213 /* Look for the `=' token. */
16214 if (!cp_parser_uncommitted_to_tentative_parse_p (parser)
16215 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
16217 error_at (token->location, "%<namespace%> definition is not allowed here");
16218 /* Skip the definition. */
16219 cp_lexer_consume_token (parser->lexer);
16220 if (cp_parser_skip_to_closing_brace (parser))
16221 cp_lexer_consume_token (parser->lexer);
16222 return;
16224 cp_parser_require (parser, CPP_EQ, RT_EQ);
16225 /* Look for the qualified-namespace-specifier. */
16226 namespace_specifier
16227 = cp_parser_qualified_namespace_specifier (parser);
16228 /* Look for the `;' token. */
16229 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
16231 /* Register the alias in the symbol table. */
16232 do_namespace_alias (identifier, namespace_specifier);
16235 /* Parse a qualified-namespace-specifier.
16237 qualified-namespace-specifier:
16238 :: [opt] nested-name-specifier [opt] namespace-name
16240 Returns a NAMESPACE_DECL corresponding to the specified
16241 namespace. */
16243 static tree
16244 cp_parser_qualified_namespace_specifier (cp_parser* parser)
16246 /* Look for the optional `::'. */
16247 cp_parser_global_scope_opt (parser,
16248 /*current_scope_valid_p=*/false);
16250 /* Look for the optional nested-name-specifier. */
16251 cp_parser_nested_name_specifier_opt (parser,
16252 /*typename_keyword_p=*/false,
16253 /*check_dependency_p=*/true,
16254 /*type_p=*/false,
16255 /*is_declaration=*/true);
16257 return cp_parser_namespace_name (parser);
16260 /* Parse a using-declaration, or, if ACCESS_DECLARATION_P is true, an
16261 access declaration.
16263 using-declaration:
16264 using typename [opt] :: [opt] nested-name-specifier unqualified-id ;
16265 using :: unqualified-id ;
16267 access-declaration:
16268 qualified-id ;
16272 static bool
16273 cp_parser_using_declaration (cp_parser* parser,
16274 bool access_declaration_p)
16276 cp_token *token;
16277 bool typename_p = false;
16278 bool global_scope_p;
16279 tree decl;
16280 tree identifier;
16281 tree qscope;
16282 int oldcount = errorcount;
16283 cp_token *diag_token = NULL;
16285 if (access_declaration_p)
16287 diag_token = cp_lexer_peek_token (parser->lexer);
16288 cp_parser_parse_tentatively (parser);
16290 else
16292 /* Look for the `using' keyword. */
16293 cp_parser_require_keyword (parser, RID_USING, RT_USING);
16295 /* Peek at the next token. */
16296 token = cp_lexer_peek_token (parser->lexer);
16297 /* See if it's `typename'. */
16298 if (token->keyword == RID_TYPENAME)
16300 /* Remember that we've seen it. */
16301 typename_p = true;
16302 /* Consume the `typename' token. */
16303 cp_lexer_consume_token (parser->lexer);
16307 /* Look for the optional global scope qualification. */
16308 global_scope_p
16309 = (cp_parser_global_scope_opt (parser,
16310 /*current_scope_valid_p=*/false)
16311 != NULL_TREE);
16313 /* If we saw `typename', or didn't see `::', then there must be a
16314 nested-name-specifier present. */
16315 if (typename_p || !global_scope_p)
16317 qscope = cp_parser_nested_name_specifier (parser, typename_p,
16318 /*check_dependency_p=*/true,
16319 /*type_p=*/false,
16320 /*is_declaration=*/true);
16321 if (!qscope && !cp_parser_uncommitted_to_tentative_parse_p (parser))
16323 cp_parser_skip_to_end_of_block_or_statement (parser);
16324 return false;
16327 /* Otherwise, we could be in either of the two productions. In that
16328 case, treat the nested-name-specifier as optional. */
16329 else
16330 qscope = cp_parser_nested_name_specifier_opt (parser,
16331 /*typename_keyword_p=*/false,
16332 /*check_dependency_p=*/true,
16333 /*type_p=*/false,
16334 /*is_declaration=*/true);
16335 if (!qscope)
16336 qscope = global_namespace;
16337 else if (UNSCOPED_ENUM_P (qscope))
16338 qscope = CP_TYPE_CONTEXT (qscope);
16340 if (access_declaration_p && cp_parser_error_occurred (parser))
16341 /* Something has already gone wrong; there's no need to parse
16342 further. Since an error has occurred, the return value of
16343 cp_parser_parse_definitely will be false, as required. */
16344 return cp_parser_parse_definitely (parser);
16346 token = cp_lexer_peek_token (parser->lexer);
16347 /* Parse the unqualified-id. */
16348 identifier = cp_parser_unqualified_id (parser,
16349 /*template_keyword_p=*/false,
16350 /*check_dependency_p=*/true,
16351 /*declarator_p=*/true,
16352 /*optional_p=*/false);
16354 if (access_declaration_p)
16356 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
16357 cp_parser_simulate_error (parser);
16358 if (!cp_parser_parse_definitely (parser))
16359 return false;
16362 /* The function we call to handle a using-declaration is different
16363 depending on what scope we are in. */
16364 if (qscope == error_mark_node || identifier == error_mark_node)
16366 else if (!identifier_p (identifier)
16367 && TREE_CODE (identifier) != BIT_NOT_EXPR)
16368 /* [namespace.udecl]
16370 A using declaration shall not name a template-id. */
16371 error_at (token->location,
16372 "a template-id may not appear in a using-declaration");
16373 else
16375 if (at_class_scope_p ())
16377 /* Create the USING_DECL. */
16378 decl = do_class_using_decl (parser->scope, identifier);
16380 if (decl && typename_p)
16381 USING_DECL_TYPENAME_P (decl) = 1;
16383 if (check_for_bare_parameter_packs (decl))
16385 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
16386 return false;
16388 else
16389 /* Add it to the list of members in this class. */
16390 finish_member_declaration (decl);
16392 else
16394 decl = cp_parser_lookup_name_simple (parser,
16395 identifier,
16396 token->location);
16397 if (decl == error_mark_node)
16398 cp_parser_name_lookup_error (parser, identifier,
16399 decl, NLE_NULL,
16400 token->location);
16401 else if (check_for_bare_parameter_packs (decl))
16403 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
16404 return false;
16406 else if (!at_namespace_scope_p ())
16407 do_local_using_decl (decl, qscope, identifier);
16408 else
16409 do_toplevel_using_decl (decl, qscope, identifier);
16413 /* Look for the final `;'. */
16414 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
16416 if (access_declaration_p && errorcount == oldcount)
16417 warning_at (diag_token->location, OPT_Wdeprecated,
16418 "access declarations are deprecated "
16419 "in favour of using-declarations; "
16420 "suggestion: add the %<using%> keyword");
16422 return true;
16425 /* Parse an alias-declaration.
16427 alias-declaration:
16428 using identifier attribute-specifier-seq [opt] = type-id */
16430 static tree
16431 cp_parser_alias_declaration (cp_parser* parser)
16433 tree id, type, decl, pushed_scope = NULL_TREE, attributes;
16434 location_t id_location;
16435 cp_declarator *declarator;
16436 cp_decl_specifier_seq decl_specs;
16437 bool member_p;
16438 const char *saved_message = NULL;
16440 /* Look for the `using' keyword. */
16441 cp_token *using_token
16442 = cp_parser_require_keyword (parser, RID_USING, RT_USING);
16443 if (using_token == NULL)
16444 return error_mark_node;
16446 id_location = cp_lexer_peek_token (parser->lexer)->location;
16447 id = cp_parser_identifier (parser);
16448 if (id == error_mark_node)
16449 return error_mark_node;
16451 cp_token *attrs_token = cp_lexer_peek_token (parser->lexer);
16452 attributes = cp_parser_attributes_opt (parser);
16453 if (attributes == error_mark_node)
16454 return error_mark_node;
16456 cp_parser_require (parser, CPP_EQ, RT_EQ);
16458 if (cp_parser_error_occurred (parser))
16459 return error_mark_node;
16461 cp_parser_commit_to_tentative_parse (parser);
16463 /* Now we are going to parse the type-id of the declaration. */
16466 [dcl.type]/3 says:
16468 "A type-specifier-seq shall not define a class or enumeration
16469 unless it appears in the type-id of an alias-declaration (7.1.3) that
16470 is not the declaration of a template-declaration."
16472 In other words, if we currently are in an alias template, the
16473 type-id should not define a type.
16475 So let's set parser->type_definition_forbidden_message in that
16476 case; cp_parser_check_type_definition (called by
16477 cp_parser_class_specifier) will then emit an error if a type is
16478 defined in the type-id. */
16479 if (parser->num_template_parameter_lists)
16481 saved_message = parser->type_definition_forbidden_message;
16482 parser->type_definition_forbidden_message =
16483 G_("types may not be defined in alias template declarations");
16486 type = cp_parser_type_id (parser);
16488 /* Restore the error message if need be. */
16489 if (parser->num_template_parameter_lists)
16490 parser->type_definition_forbidden_message = saved_message;
16492 if (type == error_mark_node
16493 || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
16495 cp_parser_skip_to_end_of_block_or_statement (parser);
16496 return error_mark_node;
16499 /* A typedef-name can also be introduced by an alias-declaration. The
16500 identifier following the using keyword becomes a typedef-name. It has
16501 the same semantics as if it were introduced by the typedef
16502 specifier. In particular, it does not define a new type and it shall
16503 not appear in the type-id. */
16505 clear_decl_specs (&decl_specs);
16506 decl_specs.type = type;
16507 if (attributes != NULL_TREE)
16509 decl_specs.attributes = attributes;
16510 set_and_check_decl_spec_loc (&decl_specs,
16511 ds_attribute,
16512 attrs_token);
16514 set_and_check_decl_spec_loc (&decl_specs,
16515 ds_typedef,
16516 using_token);
16517 set_and_check_decl_spec_loc (&decl_specs,
16518 ds_alias,
16519 using_token);
16521 declarator = make_id_declarator (NULL_TREE, id, sfk_none);
16522 declarator->id_loc = id_location;
16524 member_p = at_class_scope_p ();
16525 if (member_p)
16526 decl = grokfield (declarator, &decl_specs, NULL_TREE, false,
16527 NULL_TREE, attributes);
16528 else
16529 decl = start_decl (declarator, &decl_specs, 0,
16530 attributes, NULL_TREE, &pushed_scope);
16531 if (decl == error_mark_node)
16532 return decl;
16534 cp_finish_decl (decl, NULL_TREE, 0, NULL_TREE, 0);
16536 if (pushed_scope)
16537 pop_scope (pushed_scope);
16539 /* If decl is a template, return its TEMPLATE_DECL so that it gets
16540 added into the symbol table; otherwise, return the TYPE_DECL. */
16541 if (DECL_LANG_SPECIFIC (decl)
16542 && DECL_TEMPLATE_INFO (decl)
16543 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl)))
16545 decl = DECL_TI_TEMPLATE (decl);
16546 if (member_p)
16547 check_member_template (decl);
16550 return decl;
16553 /* Parse a using-directive.
16555 using-directive:
16556 using namespace :: [opt] nested-name-specifier [opt]
16557 namespace-name ; */
16559 static void
16560 cp_parser_using_directive (cp_parser* parser)
16562 tree namespace_decl;
16563 tree attribs;
16565 /* Look for the `using' keyword. */
16566 cp_parser_require_keyword (parser, RID_USING, RT_USING);
16567 /* And the `namespace' keyword. */
16568 cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
16569 /* Look for the optional `::' operator. */
16570 cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
16571 /* And the optional nested-name-specifier. */
16572 cp_parser_nested_name_specifier_opt (parser,
16573 /*typename_keyword_p=*/false,
16574 /*check_dependency_p=*/true,
16575 /*type_p=*/false,
16576 /*is_declaration=*/true);
16577 /* Get the namespace being used. */
16578 namespace_decl = cp_parser_namespace_name (parser);
16579 /* And any specified attributes. */
16580 attribs = cp_parser_attributes_opt (parser);
16581 /* Update the symbol table. */
16582 parse_using_directive (namespace_decl, attribs);
16583 /* Look for the final `;'. */
16584 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
16587 /* Parse an asm-definition.
16589 asm-definition:
16590 asm ( string-literal ) ;
16592 GNU Extension:
16594 asm-definition:
16595 asm volatile [opt] ( string-literal ) ;
16596 asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ;
16597 asm volatile [opt] ( string-literal : asm-operand-list [opt]
16598 : asm-operand-list [opt] ) ;
16599 asm volatile [opt] ( string-literal : asm-operand-list [opt]
16600 : asm-operand-list [opt]
16601 : asm-clobber-list [opt] ) ;
16602 asm volatile [opt] goto ( string-literal : : asm-operand-list [opt]
16603 : asm-clobber-list [opt]
16604 : asm-goto-list ) ; */
16606 static void
16607 cp_parser_asm_definition (cp_parser* parser)
16609 tree string;
16610 tree outputs = NULL_TREE;
16611 tree inputs = NULL_TREE;
16612 tree clobbers = NULL_TREE;
16613 tree labels = NULL_TREE;
16614 tree asm_stmt;
16615 bool volatile_p = false;
16616 bool extended_p = false;
16617 bool invalid_inputs_p = false;
16618 bool invalid_outputs_p = false;
16619 bool goto_p = false;
16620 required_token missing = RT_NONE;
16622 /* Look for the `asm' keyword. */
16623 cp_parser_require_keyword (parser, RID_ASM, RT_ASM);
16625 if (parser->in_function_body
16626 && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
16628 error ("%<asm%> in %<constexpr%> function");
16629 cp_function_chain->invalid_constexpr = true;
16632 /* See if the next token is `volatile'. */
16633 if (cp_parser_allow_gnu_extensions_p (parser)
16634 && cp_lexer_next_token_is_keyword (parser->lexer, RID_VOLATILE))
16636 /* Remember that we saw the `volatile' keyword. */
16637 volatile_p = true;
16638 /* Consume the token. */
16639 cp_lexer_consume_token (parser->lexer);
16641 if (cp_parser_allow_gnu_extensions_p (parser)
16642 && parser->in_function_body
16643 && cp_lexer_next_token_is_keyword (parser->lexer, RID_GOTO))
16645 /* Remember that we saw the `goto' keyword. */
16646 goto_p = true;
16647 /* Consume the token. */
16648 cp_lexer_consume_token (parser->lexer);
16650 /* Look for the opening `('. */
16651 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
16652 return;
16653 /* Look for the string. */
16654 string = cp_parser_string_literal (parser, false, false);
16655 if (string == error_mark_node)
16657 cp_parser_skip_to_closing_parenthesis (parser, true, false,
16658 /*consume_paren=*/true);
16659 return;
16662 /* If we're allowing GNU extensions, check for the extended assembly
16663 syntax. Unfortunately, the `:' tokens need not be separated by
16664 a space in C, and so, for compatibility, we tolerate that here
16665 too. Doing that means that we have to treat the `::' operator as
16666 two `:' tokens. */
16667 if (cp_parser_allow_gnu_extensions_p (parser)
16668 && parser->in_function_body
16669 && (cp_lexer_next_token_is (parser->lexer, CPP_COLON)
16670 || cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)))
16672 bool inputs_p = false;
16673 bool clobbers_p = false;
16674 bool labels_p = false;
16676 /* The extended syntax was used. */
16677 extended_p = true;
16679 /* Look for outputs. */
16680 if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
16682 /* Consume the `:'. */
16683 cp_lexer_consume_token (parser->lexer);
16684 /* Parse the output-operands. */
16685 if (cp_lexer_next_token_is_not (parser->lexer,
16686 CPP_COLON)
16687 && cp_lexer_next_token_is_not (parser->lexer,
16688 CPP_SCOPE)
16689 && cp_lexer_next_token_is_not (parser->lexer,
16690 CPP_CLOSE_PAREN)
16691 && !goto_p)
16692 outputs = cp_parser_asm_operand_list (parser);
16694 if (outputs == error_mark_node)
16695 invalid_outputs_p = true;
16697 /* If the next token is `::', there are no outputs, and the
16698 next token is the beginning of the inputs. */
16699 else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16700 /* The inputs are coming next. */
16701 inputs_p = true;
16703 /* Look for inputs. */
16704 if (inputs_p
16705 || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
16707 /* Consume the `:' or `::'. */
16708 cp_lexer_consume_token (parser->lexer);
16709 /* Parse the output-operands. */
16710 if (cp_lexer_next_token_is_not (parser->lexer,
16711 CPP_COLON)
16712 && cp_lexer_next_token_is_not (parser->lexer,
16713 CPP_SCOPE)
16714 && cp_lexer_next_token_is_not (parser->lexer,
16715 CPP_CLOSE_PAREN))
16716 inputs = cp_parser_asm_operand_list (parser);
16718 if (inputs == error_mark_node)
16719 invalid_inputs_p = true;
16721 else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16722 /* The clobbers are coming next. */
16723 clobbers_p = true;
16725 /* Look for clobbers. */
16726 if (clobbers_p
16727 || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
16729 clobbers_p = true;
16730 /* Consume the `:' or `::'. */
16731 cp_lexer_consume_token (parser->lexer);
16732 /* Parse the clobbers. */
16733 if (cp_lexer_next_token_is_not (parser->lexer,
16734 CPP_COLON)
16735 && cp_lexer_next_token_is_not (parser->lexer,
16736 CPP_CLOSE_PAREN))
16737 clobbers = cp_parser_asm_clobber_list (parser);
16739 else if (goto_p
16740 && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16741 /* The labels are coming next. */
16742 labels_p = true;
16744 /* Look for labels. */
16745 if (labels_p
16746 || (goto_p && cp_lexer_next_token_is (parser->lexer, CPP_COLON)))
16748 labels_p = true;
16749 /* Consume the `:' or `::'. */
16750 cp_lexer_consume_token (parser->lexer);
16751 /* Parse the labels. */
16752 labels = cp_parser_asm_label_list (parser);
16755 if (goto_p && !labels_p)
16756 missing = clobbers_p ? RT_COLON : RT_COLON_SCOPE;
16758 else if (goto_p)
16759 missing = RT_COLON_SCOPE;
16761 /* Look for the closing `)'. */
16762 if (!cp_parser_require (parser, missing ? CPP_COLON : CPP_CLOSE_PAREN,
16763 missing ? missing : RT_CLOSE_PAREN))
16764 cp_parser_skip_to_closing_parenthesis (parser, true, false,
16765 /*consume_paren=*/true);
16766 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
16768 if (!invalid_inputs_p && !invalid_outputs_p)
16770 /* Create the ASM_EXPR. */
16771 if (parser->in_function_body)
16773 asm_stmt = finish_asm_stmt (volatile_p, string, outputs,
16774 inputs, clobbers, labels);
16775 /* If the extended syntax was not used, mark the ASM_EXPR. */
16776 if (!extended_p)
16778 tree temp = asm_stmt;
16779 if (TREE_CODE (temp) == CLEANUP_POINT_EXPR)
16780 temp = TREE_OPERAND (temp, 0);
16782 ASM_INPUT_P (temp) = 1;
16785 else
16786 symtab->finalize_toplevel_asm (string);
16790 /* Declarators [gram.dcl.decl] */
16792 /* Parse an init-declarator.
16794 init-declarator:
16795 declarator initializer [opt]
16797 GNU Extension:
16799 init-declarator:
16800 declarator asm-specification [opt] attributes [opt] initializer [opt]
16802 function-definition:
16803 decl-specifier-seq [opt] declarator ctor-initializer [opt]
16804 function-body
16805 decl-specifier-seq [opt] declarator function-try-block
16807 GNU Extension:
16809 function-definition:
16810 __extension__ function-definition
16812 TM Extension:
16814 function-definition:
16815 decl-specifier-seq [opt] declarator function-transaction-block
16817 The DECL_SPECIFIERS apply to this declarator. Returns a
16818 representation of the entity declared. If MEMBER_P is TRUE, then
16819 this declarator appears in a class scope. The new DECL created by
16820 this declarator is returned.
16822 The CHECKS are access checks that should be performed once we know
16823 what entity is being declared (and, therefore, what classes have
16824 befriended it).
16826 If FUNCTION_DEFINITION_ALLOWED_P then we handle the declarator and
16827 for a function-definition here as well. If the declarator is a
16828 declarator for a function-definition, *FUNCTION_DEFINITION_P will
16829 be TRUE upon return. By that point, the function-definition will
16830 have been completely parsed.
16832 FUNCTION_DEFINITION_P may be NULL if FUNCTION_DEFINITION_ALLOWED_P
16833 is FALSE.
16835 If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
16836 parsed declaration if it is an uninitialized single declarator not followed
16837 by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
16838 if present, will not be consumed. If returned, this declarator will be
16839 created with SD_INITIALIZED but will not call cp_finish_decl. */
16841 static tree
16842 cp_parser_init_declarator (cp_parser* parser,
16843 cp_decl_specifier_seq *decl_specifiers,
16844 vec<deferred_access_check, va_gc> *checks,
16845 bool function_definition_allowed_p,
16846 bool member_p,
16847 int declares_class_or_enum,
16848 bool* function_definition_p,
16849 tree* maybe_range_for_decl)
16851 cp_token *token = NULL, *asm_spec_start_token = NULL,
16852 *attributes_start_token = NULL;
16853 cp_declarator *declarator;
16854 tree prefix_attributes;
16855 tree attributes = NULL;
16856 tree asm_specification;
16857 tree initializer;
16858 tree decl = NULL_TREE;
16859 tree scope;
16860 int is_initialized;
16861 /* Only valid if IS_INITIALIZED is true. In that case, CPP_EQ if
16862 initialized with "= ..", CPP_OPEN_PAREN if initialized with
16863 "(...)". */
16864 enum cpp_ttype initialization_kind;
16865 bool is_direct_init = false;
16866 bool is_non_constant_init;
16867 int ctor_dtor_or_conv_p;
16868 bool friend_p = cp_parser_friend_p (decl_specifiers);
16869 tree pushed_scope = NULL_TREE;
16870 bool range_for_decl_p = false;
16871 bool saved_default_arg_ok_p = parser->default_arg_ok_p;
16873 /* Gather the attributes that were provided with the
16874 decl-specifiers. */
16875 prefix_attributes = decl_specifiers->attributes;
16877 /* Assume that this is not the declarator for a function
16878 definition. */
16879 if (function_definition_p)
16880 *function_definition_p = false;
16882 /* Default arguments are only permitted for function parameters. */
16883 if (decl_spec_seq_has_spec_p (decl_specifiers, ds_typedef))
16884 parser->default_arg_ok_p = false;
16886 /* Defer access checks while parsing the declarator; we cannot know
16887 what names are accessible until we know what is being
16888 declared. */
16889 resume_deferring_access_checks ();
16891 /* Parse the declarator. */
16892 token = cp_lexer_peek_token (parser->lexer);
16893 declarator
16894 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
16895 &ctor_dtor_or_conv_p,
16896 /*parenthesized_p=*/NULL,
16897 member_p, friend_p);
16898 /* Gather up the deferred checks. */
16899 stop_deferring_access_checks ();
16901 parser->default_arg_ok_p = saved_default_arg_ok_p;
16903 /* If the DECLARATOR was erroneous, there's no need to go
16904 further. */
16905 if (declarator == cp_error_declarator)
16906 return error_mark_node;
16908 /* Check that the number of template-parameter-lists is OK. */
16909 if (!cp_parser_check_declarator_template_parameters (parser, declarator,
16910 token->location))
16911 return error_mark_node;
16913 if (declares_class_or_enum & 2)
16914 cp_parser_check_for_definition_in_return_type (declarator,
16915 decl_specifiers->type,
16916 decl_specifiers->locations[ds_type_spec]);
16918 /* Figure out what scope the entity declared by the DECLARATOR is
16919 located in. `grokdeclarator' sometimes changes the scope, so
16920 we compute it now. */
16921 scope = get_scope_of_declarator (declarator);
16923 /* Perform any lookups in the declared type which were thought to be
16924 dependent, but are not in the scope of the declarator. */
16925 decl_specifiers->type
16926 = maybe_update_decl_type (decl_specifiers->type, scope);
16928 /* If we're allowing GNU extensions, look for an
16929 asm-specification. */
16930 if (cp_parser_allow_gnu_extensions_p (parser))
16932 /* Look for an asm-specification. */
16933 asm_spec_start_token = cp_lexer_peek_token (parser->lexer);
16934 asm_specification = cp_parser_asm_specification_opt (parser);
16936 else
16937 asm_specification = NULL_TREE;
16939 /* Look for attributes. */
16940 attributes_start_token = cp_lexer_peek_token (parser->lexer);
16941 attributes = cp_parser_attributes_opt (parser);
16943 /* Peek at the next token. */
16944 token = cp_lexer_peek_token (parser->lexer);
16946 bool bogus_implicit_tmpl = false;
16948 if (function_declarator_p (declarator))
16950 /* Check to see if the token indicates the start of a
16951 function-definition. */
16952 if (cp_parser_token_starts_function_definition_p (token))
16954 if (!function_definition_allowed_p)
16956 /* If a function-definition should not appear here, issue an
16957 error message. */
16958 cp_parser_error (parser,
16959 "a function-definition is not allowed here");
16960 return error_mark_node;
16963 location_t func_brace_location
16964 = cp_lexer_peek_token (parser->lexer)->location;
16966 /* Neither attributes nor an asm-specification are allowed
16967 on a function-definition. */
16968 if (asm_specification)
16969 error_at (asm_spec_start_token->location,
16970 "an asm-specification is not allowed "
16971 "on a function-definition");
16972 if (attributes)
16973 error_at (attributes_start_token->location,
16974 "attributes are not allowed "
16975 "on a function-definition");
16976 /* This is a function-definition. */
16977 *function_definition_p = true;
16979 /* Parse the function definition. */
16980 if (member_p)
16981 decl = cp_parser_save_member_function_body (parser,
16982 decl_specifiers,
16983 declarator,
16984 prefix_attributes);
16985 else
16986 decl =
16987 (cp_parser_function_definition_from_specifiers_and_declarator
16988 (parser, decl_specifiers, prefix_attributes, declarator));
16990 if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
16992 /* This is where the prologue starts... */
16993 DECL_STRUCT_FUNCTION (decl)->function_start_locus
16994 = func_brace_location;
16997 return decl;
17000 else if (parser->fully_implicit_function_template_p)
17002 /* A non-template declaration involving a function parameter list
17003 containing an implicit template parameter will be made into a
17004 template. If the resulting declaration is not going to be an
17005 actual function then finish the template scope here to prevent it.
17006 An error message will be issued once we have a decl to talk about.
17008 FIXME probably we should do type deduction rather than create an
17009 implicit template, but the standard currently doesn't allow it. */
17010 bogus_implicit_tmpl = true;
17011 finish_fully_implicit_template (parser, NULL_TREE);
17014 /* [dcl.dcl]
17016 Only in function declarations for constructors, destructors, and
17017 type conversions can the decl-specifier-seq be omitted.
17019 We explicitly postpone this check past the point where we handle
17020 function-definitions because we tolerate function-definitions
17021 that are missing their return types in some modes. */
17022 if (!decl_specifiers->any_specifiers_p && ctor_dtor_or_conv_p <= 0)
17024 cp_parser_error (parser,
17025 "expected constructor, destructor, or type conversion");
17026 return error_mark_node;
17029 /* An `=' or an `(', or an '{' in C++0x, indicates an initializer. */
17030 if (token->type == CPP_EQ
17031 || token->type == CPP_OPEN_PAREN
17032 || token->type == CPP_OPEN_BRACE)
17034 is_initialized = SD_INITIALIZED;
17035 initialization_kind = token->type;
17036 if (maybe_range_for_decl)
17037 *maybe_range_for_decl = error_mark_node;
17039 if (token->type == CPP_EQ
17040 && function_declarator_p (declarator))
17042 cp_token *t2 = cp_lexer_peek_nth_token (parser->lexer, 2);
17043 if (t2->keyword == RID_DEFAULT)
17044 is_initialized = SD_DEFAULTED;
17045 else if (t2->keyword == RID_DELETE)
17046 is_initialized = SD_DELETED;
17049 else
17051 /* If the init-declarator isn't initialized and isn't followed by a
17052 `,' or `;', it's not a valid init-declarator. */
17053 if (token->type != CPP_COMMA
17054 && token->type != CPP_SEMICOLON)
17056 if (maybe_range_for_decl && *maybe_range_for_decl != error_mark_node)
17057 range_for_decl_p = true;
17058 else
17060 cp_parser_error (parser, "expected initializer");
17061 return error_mark_node;
17064 is_initialized = SD_UNINITIALIZED;
17065 initialization_kind = CPP_EOF;
17068 /* Because start_decl has side-effects, we should only call it if we
17069 know we're going ahead. By this point, we know that we cannot
17070 possibly be looking at any other construct. */
17071 cp_parser_commit_to_tentative_parse (parser);
17073 /* Enter the newly declared entry in the symbol table. If we're
17074 processing a declaration in a class-specifier, we wait until
17075 after processing the initializer. */
17076 if (!member_p)
17078 if (parser->in_unbraced_linkage_specification_p)
17079 decl_specifiers->storage_class = sc_extern;
17080 decl = start_decl (declarator, decl_specifiers,
17081 range_for_decl_p? SD_INITIALIZED : is_initialized,
17082 attributes, prefix_attributes, &pushed_scope);
17083 cp_finalize_omp_declare_simd (parser, decl);
17084 /* Adjust location of decl if declarator->id_loc is more appropriate:
17085 set, and decl wasn't merged with another decl, in which case its
17086 location would be different from input_location, and more accurate. */
17087 if (DECL_P (decl)
17088 && declarator->id_loc != UNKNOWN_LOCATION
17089 && DECL_SOURCE_LOCATION (decl) == input_location)
17090 DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
17092 else if (scope)
17093 /* Enter the SCOPE. That way unqualified names appearing in the
17094 initializer will be looked up in SCOPE. */
17095 pushed_scope = push_scope (scope);
17097 /* Perform deferred access control checks, now that we know in which
17098 SCOPE the declared entity resides. */
17099 if (!member_p && decl)
17101 tree saved_current_function_decl = NULL_TREE;
17103 /* If the entity being declared is a function, pretend that we
17104 are in its scope. If it is a `friend', it may have access to
17105 things that would not otherwise be accessible. */
17106 if (TREE_CODE (decl) == FUNCTION_DECL)
17108 saved_current_function_decl = current_function_decl;
17109 current_function_decl = decl;
17112 /* Perform access checks for template parameters. */
17113 cp_parser_perform_template_parameter_access_checks (checks);
17115 /* Perform the access control checks for the declarator and the
17116 decl-specifiers. */
17117 perform_deferred_access_checks (tf_warning_or_error);
17119 /* Restore the saved value. */
17120 if (TREE_CODE (decl) == FUNCTION_DECL)
17121 current_function_decl = saved_current_function_decl;
17124 /* Parse the initializer. */
17125 initializer = NULL_TREE;
17126 is_direct_init = false;
17127 is_non_constant_init = true;
17128 if (is_initialized)
17130 if (function_declarator_p (declarator))
17132 cp_token *initializer_start_token = cp_lexer_peek_token (parser->lexer);
17133 if (initialization_kind == CPP_EQ)
17134 initializer = cp_parser_pure_specifier (parser);
17135 else
17137 /* If the declaration was erroneous, we don't really
17138 know what the user intended, so just silently
17139 consume the initializer. */
17140 if (decl != error_mark_node)
17141 error_at (initializer_start_token->location,
17142 "initializer provided for function");
17143 cp_parser_skip_to_closing_parenthesis (parser,
17144 /*recovering=*/true,
17145 /*or_comma=*/false,
17146 /*consume_paren=*/true);
17149 else
17151 /* We want to record the extra mangling scope for in-class
17152 initializers of class members and initializers of static data
17153 member templates. The former involves deferring
17154 parsing of the initializer until end of class as with default
17155 arguments. So right here we only handle the latter. */
17156 if (!member_p && processing_template_decl)
17157 start_lambda_scope (decl);
17158 initializer = cp_parser_initializer (parser,
17159 &is_direct_init,
17160 &is_non_constant_init);
17161 if (!member_p && processing_template_decl)
17162 finish_lambda_scope ();
17163 if (initializer == error_mark_node)
17164 cp_parser_skip_to_end_of_statement (parser);
17168 /* The old parser allows attributes to appear after a parenthesized
17169 initializer. Mark Mitchell proposed removing this functionality
17170 on the GCC mailing lists on 2002-08-13. This parser accepts the
17171 attributes -- but ignores them. */
17172 if (cp_parser_allow_gnu_extensions_p (parser)
17173 && initialization_kind == CPP_OPEN_PAREN)
17174 if (cp_parser_attributes_opt (parser))
17175 warning (OPT_Wattributes,
17176 "attributes after parenthesized initializer ignored");
17178 /* And now complain about a non-function implicit template. */
17179 if (bogus_implicit_tmpl)
17180 error_at (DECL_SOURCE_LOCATION (decl),
17181 "non-function %qD declared as implicit template", decl);
17183 /* For an in-class declaration, use `grokfield' to create the
17184 declaration. */
17185 if (member_p)
17187 if (pushed_scope)
17189 pop_scope (pushed_scope);
17190 pushed_scope = NULL_TREE;
17192 decl = grokfield (declarator, decl_specifiers,
17193 initializer, !is_non_constant_init,
17194 /*asmspec=*/NULL_TREE,
17195 chainon (attributes, prefix_attributes));
17196 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
17197 cp_parser_save_default_args (parser, decl);
17198 cp_finalize_omp_declare_simd (parser, decl);
17201 /* Finish processing the declaration. But, skip member
17202 declarations. */
17203 if (!member_p && decl && decl != error_mark_node && !range_for_decl_p)
17205 cp_finish_decl (decl,
17206 initializer, !is_non_constant_init,
17207 asm_specification,
17208 /* If the initializer is in parentheses, then this is
17209 a direct-initialization, which means that an
17210 `explicit' constructor is OK. Otherwise, an
17211 `explicit' constructor cannot be used. */
17212 ((is_direct_init || !is_initialized)
17213 ? LOOKUP_NORMAL : LOOKUP_IMPLICIT));
17215 else if ((cxx_dialect != cxx98) && friend_p
17216 && decl && TREE_CODE (decl) == FUNCTION_DECL)
17217 /* Core issue #226 (C++0x only): A default template-argument
17218 shall not be specified in a friend class template
17219 declaration. */
17220 check_default_tmpl_args (decl, current_template_parms, /*is_primary=*/true,
17221 /*is_partial=*/false, /*is_friend_decl=*/1);
17223 if (!friend_p && pushed_scope)
17224 pop_scope (pushed_scope);
17226 if (function_declarator_p (declarator)
17227 && parser->fully_implicit_function_template_p)
17229 if (member_p)
17230 decl = finish_fully_implicit_template (parser, decl);
17231 else
17232 finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
17235 return decl;
17238 /* Parse a declarator.
17240 declarator:
17241 direct-declarator
17242 ptr-operator declarator
17244 abstract-declarator:
17245 ptr-operator abstract-declarator [opt]
17246 direct-abstract-declarator
17248 GNU Extensions:
17250 declarator:
17251 attributes [opt] direct-declarator
17252 attributes [opt] ptr-operator declarator
17254 abstract-declarator:
17255 attributes [opt] ptr-operator abstract-declarator [opt]
17256 attributes [opt] direct-abstract-declarator
17258 If CTOR_DTOR_OR_CONV_P is not NULL, *CTOR_DTOR_OR_CONV_P is used to
17259 detect constructor, destructor or conversion operators. It is set
17260 to -1 if the declarator is a name, and +1 if it is a
17261 function. Otherwise it is set to zero. Usually you just want to
17262 test for >0, but internally the negative value is used.
17264 (The reason for CTOR_DTOR_OR_CONV_P is that a declaration must have
17265 a decl-specifier-seq unless it declares a constructor, destructor,
17266 or conversion. It might seem that we could check this condition in
17267 semantic analysis, rather than parsing, but that makes it difficult
17268 to handle something like `f()'. We want to notice that there are
17269 no decl-specifiers, and therefore realize that this is an
17270 expression, not a declaration.)
17272 If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to true iff
17273 the declarator is a direct-declarator of the form "(...)".
17275 MEMBER_P is true iff this declarator is a member-declarator.
17277 FRIEND_P is true iff this declarator is a friend. */
17279 static cp_declarator *
17280 cp_parser_declarator (cp_parser* parser,
17281 cp_parser_declarator_kind dcl_kind,
17282 int* ctor_dtor_or_conv_p,
17283 bool* parenthesized_p,
17284 bool member_p, bool friend_p)
17286 cp_declarator *declarator;
17287 enum tree_code code;
17288 cp_cv_quals cv_quals;
17289 tree class_type;
17290 tree gnu_attributes = NULL_TREE, std_attributes = NULL_TREE;
17292 /* Assume this is not a constructor, destructor, or type-conversion
17293 operator. */
17294 if (ctor_dtor_or_conv_p)
17295 *ctor_dtor_or_conv_p = 0;
17297 if (cp_parser_allow_gnu_extensions_p (parser))
17298 gnu_attributes = cp_parser_gnu_attributes_opt (parser);
17300 /* Check for the ptr-operator production. */
17301 cp_parser_parse_tentatively (parser);
17302 /* Parse the ptr-operator. */
17303 code = cp_parser_ptr_operator (parser,
17304 &class_type,
17305 &cv_quals,
17306 &std_attributes);
17308 /* If that worked, then we have a ptr-operator. */
17309 if (cp_parser_parse_definitely (parser))
17311 /* If a ptr-operator was found, then this declarator was not
17312 parenthesized. */
17313 if (parenthesized_p)
17314 *parenthesized_p = true;
17315 /* The dependent declarator is optional if we are parsing an
17316 abstract-declarator. */
17317 if (dcl_kind != CP_PARSER_DECLARATOR_NAMED)
17318 cp_parser_parse_tentatively (parser);
17320 /* Parse the dependent declarator. */
17321 declarator = cp_parser_declarator (parser, dcl_kind,
17322 /*ctor_dtor_or_conv_p=*/NULL,
17323 /*parenthesized_p=*/NULL,
17324 /*member_p=*/false,
17325 friend_p);
17327 /* If we are parsing an abstract-declarator, we must handle the
17328 case where the dependent declarator is absent. */
17329 if (dcl_kind != CP_PARSER_DECLARATOR_NAMED
17330 && !cp_parser_parse_definitely (parser))
17331 declarator = NULL;
17333 declarator = cp_parser_make_indirect_declarator
17334 (code, class_type, cv_quals, declarator, std_attributes);
17336 /* Everything else is a direct-declarator. */
17337 else
17339 if (parenthesized_p)
17340 *parenthesized_p = cp_lexer_next_token_is (parser->lexer,
17341 CPP_OPEN_PAREN);
17342 declarator = cp_parser_direct_declarator (parser, dcl_kind,
17343 ctor_dtor_or_conv_p,
17344 member_p, friend_p);
17347 if (gnu_attributes && declarator && declarator != cp_error_declarator)
17348 declarator->attributes = gnu_attributes;
17349 return declarator;
17352 /* Parse a direct-declarator or direct-abstract-declarator.
17354 direct-declarator:
17355 declarator-id
17356 direct-declarator ( parameter-declaration-clause )
17357 cv-qualifier-seq [opt]
17358 ref-qualifier [opt]
17359 exception-specification [opt]
17360 direct-declarator [ constant-expression [opt] ]
17361 ( declarator )
17363 direct-abstract-declarator:
17364 direct-abstract-declarator [opt]
17365 ( parameter-declaration-clause )
17366 cv-qualifier-seq [opt]
17367 ref-qualifier [opt]
17368 exception-specification [opt]
17369 direct-abstract-declarator [opt] [ constant-expression [opt] ]
17370 ( abstract-declarator )
17372 Returns a representation of the declarator. DCL_KIND is
17373 CP_PARSER_DECLARATOR_ABSTRACT, if we are parsing a
17374 direct-abstract-declarator. It is CP_PARSER_DECLARATOR_NAMED, if
17375 we are parsing a direct-declarator. It is
17376 CP_PARSER_DECLARATOR_EITHER, if we can accept either - in the case
17377 of ambiguity we prefer an abstract declarator, as per
17378 [dcl.ambig.res]. CTOR_DTOR_OR_CONV_P, MEMBER_P, and FRIEND_P are
17379 as for cp_parser_declarator. */
17381 static cp_declarator *
17382 cp_parser_direct_declarator (cp_parser* parser,
17383 cp_parser_declarator_kind dcl_kind,
17384 int* ctor_dtor_or_conv_p,
17385 bool member_p, bool friend_p)
17387 cp_token *token;
17388 cp_declarator *declarator = NULL;
17389 tree scope = NULL_TREE;
17390 bool saved_default_arg_ok_p = parser->default_arg_ok_p;
17391 bool saved_in_declarator_p = parser->in_declarator_p;
17392 bool first = true;
17393 tree pushed_scope = NULL_TREE;
17395 while (true)
17397 /* Peek at the next token. */
17398 token = cp_lexer_peek_token (parser->lexer);
17399 if (token->type == CPP_OPEN_PAREN)
17401 /* This is either a parameter-declaration-clause, or a
17402 parenthesized declarator. When we know we are parsing a
17403 named declarator, it must be a parenthesized declarator
17404 if FIRST is true. For instance, `(int)' is a
17405 parameter-declaration-clause, with an omitted
17406 direct-abstract-declarator. But `((*))', is a
17407 parenthesized abstract declarator. Finally, when T is a
17408 template parameter `(T)' is a
17409 parameter-declaration-clause, and not a parenthesized
17410 named declarator.
17412 We first try and parse a parameter-declaration-clause,
17413 and then try a nested declarator (if FIRST is true).
17415 It is not an error for it not to be a
17416 parameter-declaration-clause, even when FIRST is
17417 false. Consider,
17419 int i (int);
17420 int i (3);
17422 The first is the declaration of a function while the
17423 second is the definition of a variable, including its
17424 initializer.
17426 Having seen only the parenthesis, we cannot know which of
17427 these two alternatives should be selected. Even more
17428 complex are examples like:
17430 int i (int (a));
17431 int i (int (3));
17433 The former is a function-declaration; the latter is a
17434 variable initialization.
17436 Thus again, we try a parameter-declaration-clause, and if
17437 that fails, we back out and return. */
17439 if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
17441 tree params;
17442 bool is_declarator = false;
17444 /* In a member-declarator, the only valid interpretation
17445 of a parenthesis is the start of a
17446 parameter-declaration-clause. (It is invalid to
17447 initialize a static data member with a parenthesized
17448 initializer; only the "=" form of initialization is
17449 permitted.) */
17450 if (!member_p)
17451 cp_parser_parse_tentatively (parser);
17453 /* Consume the `('. */
17454 cp_lexer_consume_token (parser->lexer);
17455 if (first)
17457 /* If this is going to be an abstract declarator, we're
17458 in a declarator and we can't have default args. */
17459 parser->default_arg_ok_p = false;
17460 parser->in_declarator_p = true;
17463 begin_scope (sk_function_parms, NULL_TREE);
17465 /* Parse the parameter-declaration-clause. */
17466 params = cp_parser_parameter_declaration_clause (parser);
17468 /* Consume the `)'. */
17469 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
17471 /* If all went well, parse the cv-qualifier-seq,
17472 ref-qualifier and the exception-specification. */
17473 if (member_p || cp_parser_parse_definitely (parser))
17475 cp_cv_quals cv_quals;
17476 cp_virt_specifiers virt_specifiers;
17477 cp_ref_qualifier ref_qual;
17478 tree exception_specification;
17479 tree late_return;
17480 tree attrs;
17481 bool memfn = (member_p || (pushed_scope
17482 && CLASS_TYPE_P (pushed_scope)));
17484 is_declarator = true;
17486 if (ctor_dtor_or_conv_p)
17487 *ctor_dtor_or_conv_p = *ctor_dtor_or_conv_p < 0;
17488 first = false;
17490 /* Parse the cv-qualifier-seq. */
17491 cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
17492 /* Parse the ref-qualifier. */
17493 ref_qual = cp_parser_ref_qualifier_opt (parser);
17494 /* And the exception-specification. */
17495 exception_specification
17496 = cp_parser_exception_specification_opt (parser);
17498 attrs = cp_parser_std_attribute_spec_seq (parser);
17500 /* In here, we handle cases where attribute is used after
17501 the function declaration. For example:
17502 void func (int x) __attribute__((vector(..))); */
17503 if (flag_cilkplus
17504 && cp_next_tokens_can_be_gnu_attribute_p (parser))
17506 cp_parser_parse_tentatively (parser);
17507 tree attr = cp_parser_gnu_attributes_opt (parser);
17508 if (cp_lexer_next_token_is_not (parser->lexer,
17509 CPP_SEMICOLON)
17510 && cp_lexer_next_token_is_not (parser->lexer,
17511 CPP_OPEN_BRACE))
17512 cp_parser_abort_tentative_parse (parser);
17513 else if (!cp_parser_parse_definitely (parser))
17515 else
17516 attrs = chainon (attr, attrs);
17518 late_return = (cp_parser_late_return_type_opt
17519 (parser, declarator,
17520 memfn ? cv_quals : -1));
17523 /* Parse the virt-specifier-seq. */
17524 virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
17526 /* Create the function-declarator. */
17527 declarator = make_call_declarator (declarator,
17528 params,
17529 cv_quals,
17530 virt_specifiers,
17531 ref_qual,
17532 exception_specification,
17533 late_return);
17534 declarator->std_attributes = attrs;
17535 /* Any subsequent parameter lists are to do with
17536 return type, so are not those of the declared
17537 function. */
17538 parser->default_arg_ok_p = false;
17541 /* Remove the function parms from scope. */
17542 pop_bindings_and_leave_scope ();
17544 if (is_declarator)
17545 /* Repeat the main loop. */
17546 continue;
17549 /* If this is the first, we can try a parenthesized
17550 declarator. */
17551 if (first)
17553 bool saved_in_type_id_in_expr_p;
17555 parser->default_arg_ok_p = saved_default_arg_ok_p;
17556 parser->in_declarator_p = saved_in_declarator_p;
17558 /* Consume the `('. */
17559 cp_lexer_consume_token (parser->lexer);
17560 /* Parse the nested declarator. */
17561 saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
17562 parser->in_type_id_in_expr_p = true;
17563 declarator
17564 = cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p,
17565 /*parenthesized_p=*/NULL,
17566 member_p, friend_p);
17567 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
17568 first = false;
17569 /* Expect a `)'. */
17570 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
17571 declarator = cp_error_declarator;
17572 if (declarator == cp_error_declarator)
17573 break;
17575 goto handle_declarator;
17577 /* Otherwise, we must be done. */
17578 else
17579 break;
17581 else if ((!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
17582 && token->type == CPP_OPEN_SQUARE
17583 && !cp_next_tokens_can_be_attribute_p (parser))
17585 /* Parse an array-declarator. */
17586 tree bounds, attrs;
17588 if (ctor_dtor_or_conv_p)
17589 *ctor_dtor_or_conv_p = 0;
17591 first = false;
17592 parser->default_arg_ok_p = false;
17593 parser->in_declarator_p = true;
17594 /* Consume the `['. */
17595 cp_lexer_consume_token (parser->lexer);
17596 /* Peek at the next token. */
17597 token = cp_lexer_peek_token (parser->lexer);
17598 /* If the next token is `]', then there is no
17599 constant-expression. */
17600 if (token->type != CPP_CLOSE_SQUARE)
17602 bool non_constant_p;
17603 bounds
17604 = cp_parser_constant_expression (parser,
17605 /*allow_non_constant=*/true,
17606 &non_constant_p);
17607 if (!non_constant_p)
17608 /* OK */;
17609 else if (error_operand_p (bounds))
17610 /* Already gave an error. */;
17611 else if (!parser->in_function_body
17612 || current_binding_level->kind == sk_function_parms)
17614 /* Normally, the array bound must be an integral constant
17615 expression. However, as an extension, we allow VLAs
17616 in function scopes as long as they aren't part of a
17617 parameter declaration. */
17618 cp_parser_error (parser,
17619 "array bound is not an integer constant");
17620 bounds = error_mark_node;
17622 else if (processing_template_decl
17623 && !type_dependent_expression_p (bounds))
17625 /* Remember this wasn't a constant-expression. */
17626 bounds = build_nop (TREE_TYPE (bounds), bounds);
17627 TREE_SIDE_EFFECTS (bounds) = 1;
17630 else
17631 bounds = NULL_TREE;
17632 /* Look for the closing `]'. */
17633 if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
17635 declarator = cp_error_declarator;
17636 break;
17639 attrs = cp_parser_std_attribute_spec_seq (parser);
17640 declarator = make_array_declarator (declarator, bounds);
17641 declarator->std_attributes = attrs;
17643 else if (first && dcl_kind != CP_PARSER_DECLARATOR_ABSTRACT)
17646 tree qualifying_scope;
17647 tree unqualified_name;
17648 tree attrs;
17649 special_function_kind sfk;
17650 bool abstract_ok;
17651 bool pack_expansion_p = false;
17652 cp_token *declarator_id_start_token;
17654 /* Parse a declarator-id */
17655 abstract_ok = (dcl_kind == CP_PARSER_DECLARATOR_EITHER);
17656 if (abstract_ok)
17658 cp_parser_parse_tentatively (parser);
17660 /* If we see an ellipsis, we should be looking at a
17661 parameter pack. */
17662 if (token->type == CPP_ELLIPSIS)
17664 /* Consume the `...' */
17665 cp_lexer_consume_token (parser->lexer);
17667 pack_expansion_p = true;
17671 declarator_id_start_token = cp_lexer_peek_token (parser->lexer);
17672 unqualified_name
17673 = cp_parser_declarator_id (parser, /*optional_p=*/abstract_ok);
17674 qualifying_scope = parser->scope;
17675 if (abstract_ok)
17677 bool okay = false;
17679 if (!unqualified_name && pack_expansion_p)
17681 /* Check whether an error occurred. */
17682 okay = !cp_parser_error_occurred (parser);
17684 /* We already consumed the ellipsis to mark a
17685 parameter pack, but we have no way to report it,
17686 so abort the tentative parse. We will be exiting
17687 immediately anyway. */
17688 cp_parser_abort_tentative_parse (parser);
17690 else
17691 okay = cp_parser_parse_definitely (parser);
17693 if (!okay)
17694 unqualified_name = error_mark_node;
17695 else if (unqualified_name
17696 && (qualifying_scope
17697 || (!identifier_p (unqualified_name))))
17699 cp_parser_error (parser, "expected unqualified-id");
17700 unqualified_name = error_mark_node;
17704 if (!unqualified_name)
17705 return NULL;
17706 if (unqualified_name == error_mark_node)
17708 declarator = cp_error_declarator;
17709 pack_expansion_p = false;
17710 declarator->parameter_pack_p = false;
17711 break;
17714 attrs = cp_parser_std_attribute_spec_seq (parser);
17716 if (qualifying_scope && at_namespace_scope_p ()
17717 && TREE_CODE (qualifying_scope) == TYPENAME_TYPE)
17719 /* In the declaration of a member of a template class
17720 outside of the class itself, the SCOPE will sometimes
17721 be a TYPENAME_TYPE. For example, given:
17723 template <typename T>
17724 int S<T>::R::i = 3;
17726 the SCOPE will be a TYPENAME_TYPE for `S<T>::R'. In
17727 this context, we must resolve S<T>::R to an ordinary
17728 type, rather than a typename type.
17730 The reason we normally avoid resolving TYPENAME_TYPEs
17731 is that a specialization of `S' might render
17732 `S<T>::R' not a type. However, if `S' is
17733 specialized, then this `i' will not be used, so there
17734 is no harm in resolving the types here. */
17735 tree type;
17737 /* Resolve the TYPENAME_TYPE. */
17738 type = resolve_typename_type (qualifying_scope,
17739 /*only_current_p=*/false);
17740 /* If that failed, the declarator is invalid. */
17741 if (TREE_CODE (type) == TYPENAME_TYPE)
17743 if (typedef_variant_p (type))
17744 error_at (declarator_id_start_token->location,
17745 "cannot define member of dependent typedef "
17746 "%qT", type);
17747 else
17748 error_at (declarator_id_start_token->location,
17749 "%<%T::%E%> is not a type",
17750 TYPE_CONTEXT (qualifying_scope),
17751 TYPE_IDENTIFIER (qualifying_scope));
17753 qualifying_scope = type;
17756 sfk = sfk_none;
17758 if (unqualified_name)
17760 tree class_type;
17762 if (qualifying_scope
17763 && CLASS_TYPE_P (qualifying_scope))
17764 class_type = qualifying_scope;
17765 else
17766 class_type = current_class_type;
17768 if (TREE_CODE (unqualified_name) == TYPE_DECL)
17770 tree name_type = TREE_TYPE (unqualified_name);
17771 if (class_type && same_type_p (name_type, class_type))
17773 if (qualifying_scope
17774 && CLASSTYPE_USE_TEMPLATE (name_type))
17776 error_at (declarator_id_start_token->location,
17777 "invalid use of constructor as a template");
17778 inform (declarator_id_start_token->location,
17779 "use %<%T::%D%> instead of %<%T::%D%> to "
17780 "name the constructor in a qualified name",
17781 class_type,
17782 DECL_NAME (TYPE_TI_TEMPLATE (class_type)),
17783 class_type, name_type);
17784 declarator = cp_error_declarator;
17785 break;
17787 else
17788 unqualified_name = constructor_name (class_type);
17790 else
17792 /* We do not attempt to print the declarator
17793 here because we do not have enough
17794 information about its original syntactic
17795 form. */
17796 cp_parser_error (parser, "invalid declarator");
17797 declarator = cp_error_declarator;
17798 break;
17802 if (class_type)
17804 if (TREE_CODE (unqualified_name) == BIT_NOT_EXPR)
17805 sfk = sfk_destructor;
17806 else if (IDENTIFIER_TYPENAME_P (unqualified_name))
17807 sfk = sfk_conversion;
17808 else if (/* There's no way to declare a constructor
17809 for an anonymous type, even if the type
17810 got a name for linkage purposes. */
17811 !TYPE_WAS_ANONYMOUS (class_type)
17812 /* Handle correctly (c++/19200):
17814 struct S {
17815 struct T{};
17816 friend void S(T);
17819 and also:
17821 namespace N {
17822 void S();
17825 struct S {
17826 friend void N::S();
17827 }; */
17828 && !(friend_p
17829 && class_type != qualifying_scope)
17830 && constructor_name_p (unqualified_name,
17831 class_type))
17833 unqualified_name = constructor_name (class_type);
17834 sfk = sfk_constructor;
17836 else if (is_overloaded_fn (unqualified_name)
17837 && DECL_CONSTRUCTOR_P (get_first_fn
17838 (unqualified_name)))
17839 sfk = sfk_constructor;
17841 if (ctor_dtor_or_conv_p && sfk != sfk_none)
17842 *ctor_dtor_or_conv_p = -1;
17845 declarator = make_id_declarator (qualifying_scope,
17846 unqualified_name,
17847 sfk);
17848 declarator->std_attributes = attrs;
17849 declarator->id_loc = token->location;
17850 declarator->parameter_pack_p = pack_expansion_p;
17852 if (pack_expansion_p)
17853 maybe_warn_variadic_templates ();
17856 handle_declarator:;
17857 scope = get_scope_of_declarator (declarator);
17858 if (scope)
17860 /* Any names that appear after the declarator-id for a
17861 member are looked up in the containing scope. */
17862 if (at_function_scope_p ())
17864 /* But declarations with qualified-ids can't appear in a
17865 function. */
17866 cp_parser_error (parser, "qualified-id in declaration");
17867 declarator = cp_error_declarator;
17868 break;
17870 pushed_scope = push_scope (scope);
17872 parser->in_declarator_p = true;
17873 if ((ctor_dtor_or_conv_p && *ctor_dtor_or_conv_p)
17874 || (declarator && declarator->kind == cdk_id))
17875 /* Default args are only allowed on function
17876 declarations. */
17877 parser->default_arg_ok_p = saved_default_arg_ok_p;
17878 else
17879 parser->default_arg_ok_p = false;
17881 first = false;
17883 /* We're done. */
17884 else
17885 break;
17888 /* For an abstract declarator, we might wind up with nothing at this
17889 point. That's an error; the declarator is not optional. */
17890 if (!declarator)
17891 cp_parser_error (parser, "expected declarator");
17893 /* If we entered a scope, we must exit it now. */
17894 if (pushed_scope)
17895 pop_scope (pushed_scope);
17897 parser->default_arg_ok_p = saved_default_arg_ok_p;
17898 parser->in_declarator_p = saved_in_declarator_p;
17900 return declarator;
17903 /* Parse a ptr-operator.
17905 ptr-operator:
17906 * attribute-specifier-seq [opt] cv-qualifier-seq [opt] (C++11)
17907 * cv-qualifier-seq [opt]
17909 :: [opt] nested-name-specifier * cv-qualifier-seq [opt]
17910 nested-name-specifier * attribute-specifier-seq [opt] cv-qualifier-seq [opt] (C++11)
17912 GNU Extension:
17914 ptr-operator:
17915 & cv-qualifier-seq [opt]
17917 Returns INDIRECT_REF if a pointer, or pointer-to-member, was used.
17918 Returns ADDR_EXPR if a reference was used, or NON_LVALUE_EXPR for
17919 an rvalue reference. In the case of a pointer-to-member, *TYPE is
17920 filled in with the TYPE containing the member. *CV_QUALS is
17921 filled in with the cv-qualifier-seq, or TYPE_UNQUALIFIED, if there
17922 are no cv-qualifiers. Returns ERROR_MARK if an error occurred.
17923 Note that the tree codes returned by this function have nothing
17924 to do with the types of trees that will be eventually be created
17925 to represent the pointer or reference type being parsed. They are
17926 just constants with suggestive names. */
17927 static enum tree_code
17928 cp_parser_ptr_operator (cp_parser* parser,
17929 tree* type,
17930 cp_cv_quals *cv_quals,
17931 tree *attributes)
17933 enum tree_code code = ERROR_MARK;
17934 cp_token *token;
17935 tree attrs = NULL_TREE;
17937 /* Assume that it's not a pointer-to-member. */
17938 *type = NULL_TREE;
17939 /* And that there are no cv-qualifiers. */
17940 *cv_quals = TYPE_UNQUALIFIED;
17942 /* Peek at the next token. */
17943 token = cp_lexer_peek_token (parser->lexer);
17945 /* If it's a `*', `&' or `&&' we have a pointer or reference. */
17946 if (token->type == CPP_MULT)
17947 code = INDIRECT_REF;
17948 else if (token->type == CPP_AND)
17949 code = ADDR_EXPR;
17950 else if ((cxx_dialect != cxx98) &&
17951 token->type == CPP_AND_AND) /* C++0x only */
17952 code = NON_LVALUE_EXPR;
17954 if (code != ERROR_MARK)
17956 /* Consume the `*', `&' or `&&'. */
17957 cp_lexer_consume_token (parser->lexer);
17959 /* A `*' can be followed by a cv-qualifier-seq, and so can a
17960 `&', if we are allowing GNU extensions. (The only qualifier
17961 that can legally appear after `&' is `restrict', but that is
17962 enforced during semantic analysis. */
17963 if (code == INDIRECT_REF
17964 || cp_parser_allow_gnu_extensions_p (parser))
17965 *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
17967 attrs = cp_parser_std_attribute_spec_seq (parser);
17968 if (attributes != NULL)
17969 *attributes = attrs;
17971 else
17973 /* Try the pointer-to-member case. */
17974 cp_parser_parse_tentatively (parser);
17975 /* Look for the optional `::' operator. */
17976 cp_parser_global_scope_opt (parser,
17977 /*current_scope_valid_p=*/false);
17978 /* Look for the nested-name specifier. */
17979 token = cp_lexer_peek_token (parser->lexer);
17980 cp_parser_nested_name_specifier (parser,
17981 /*typename_keyword_p=*/false,
17982 /*check_dependency_p=*/true,
17983 /*type_p=*/false,
17984 /*is_declaration=*/false);
17985 /* If we found it, and the next token is a `*', then we are
17986 indeed looking at a pointer-to-member operator. */
17987 if (!cp_parser_error_occurred (parser)
17988 && cp_parser_require (parser, CPP_MULT, RT_MULT))
17990 /* Indicate that the `*' operator was used. */
17991 code = INDIRECT_REF;
17993 if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
17994 error_at (token->location, "%qD is a namespace", parser->scope);
17995 else if (TREE_CODE (parser->scope) == ENUMERAL_TYPE)
17996 error_at (token->location, "cannot form pointer to member of "
17997 "non-class %q#T", parser->scope);
17998 else
18000 /* The type of which the member is a member is given by the
18001 current SCOPE. */
18002 *type = parser->scope;
18003 /* The next name will not be qualified. */
18004 parser->scope = NULL_TREE;
18005 parser->qualifying_scope = NULL_TREE;
18006 parser->object_scope = NULL_TREE;
18007 /* Look for optional c++11 attributes. */
18008 attrs = cp_parser_std_attribute_spec_seq (parser);
18009 if (attributes != NULL)
18010 *attributes = attrs;
18011 /* Look for the optional cv-qualifier-seq. */
18012 *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
18015 /* If that didn't work we don't have a ptr-operator. */
18016 if (!cp_parser_parse_definitely (parser))
18017 cp_parser_error (parser, "expected ptr-operator");
18020 return code;
18023 /* Parse an (optional) cv-qualifier-seq.
18025 cv-qualifier-seq:
18026 cv-qualifier cv-qualifier-seq [opt]
18028 cv-qualifier:
18029 const
18030 volatile
18032 GNU Extension:
18034 cv-qualifier:
18035 __restrict__
18037 Returns a bitmask representing the cv-qualifiers. */
18039 static cp_cv_quals
18040 cp_parser_cv_qualifier_seq_opt (cp_parser* parser)
18042 cp_cv_quals cv_quals = TYPE_UNQUALIFIED;
18044 while (true)
18046 cp_token *token;
18047 cp_cv_quals cv_qualifier;
18049 /* Peek at the next token. */
18050 token = cp_lexer_peek_token (parser->lexer);
18051 /* See if it's a cv-qualifier. */
18052 switch (token->keyword)
18054 case RID_CONST:
18055 cv_qualifier = TYPE_QUAL_CONST;
18056 break;
18058 case RID_VOLATILE:
18059 cv_qualifier = TYPE_QUAL_VOLATILE;
18060 break;
18062 case RID_RESTRICT:
18063 cv_qualifier = TYPE_QUAL_RESTRICT;
18064 break;
18066 default:
18067 cv_qualifier = TYPE_UNQUALIFIED;
18068 break;
18071 if (!cv_qualifier)
18072 break;
18074 if (cv_quals & cv_qualifier)
18076 error_at (token->location, "duplicate cv-qualifier");
18077 cp_lexer_purge_token (parser->lexer);
18079 else
18081 cp_lexer_consume_token (parser->lexer);
18082 cv_quals |= cv_qualifier;
18086 return cv_quals;
18089 /* Parse an (optional) ref-qualifier
18091 ref-qualifier:
18095 Returns cp_ref_qualifier representing ref-qualifier. */
18097 static cp_ref_qualifier
18098 cp_parser_ref_qualifier_opt (cp_parser* parser)
18100 cp_ref_qualifier ref_qual = REF_QUAL_NONE;
18102 /* Don't try to parse bitwise '&' as a ref-qualifier (c++/57532). */
18103 if (cxx_dialect < cxx11 && cp_parser_parsing_tentatively (parser))
18104 return ref_qual;
18106 while (true)
18108 cp_ref_qualifier curr_ref_qual = REF_QUAL_NONE;
18109 cp_token *token = cp_lexer_peek_token (parser->lexer);
18111 switch (token->type)
18113 case CPP_AND:
18114 curr_ref_qual = REF_QUAL_LVALUE;
18115 break;
18117 case CPP_AND_AND:
18118 curr_ref_qual = REF_QUAL_RVALUE;
18119 break;
18121 default:
18122 curr_ref_qual = REF_QUAL_NONE;
18123 break;
18126 if (!curr_ref_qual)
18127 break;
18128 else if (ref_qual)
18130 error_at (token->location, "multiple ref-qualifiers");
18131 cp_lexer_purge_token (parser->lexer);
18133 else
18135 ref_qual = curr_ref_qual;
18136 cp_lexer_consume_token (parser->lexer);
18140 return ref_qual;
18143 /* Parse an (optional) virt-specifier-seq.
18145 virt-specifier-seq:
18146 virt-specifier virt-specifier-seq [opt]
18148 virt-specifier:
18149 override
18150 final
18152 Returns a bitmask representing the virt-specifiers. */
18154 static cp_virt_specifiers
18155 cp_parser_virt_specifier_seq_opt (cp_parser* parser)
18157 cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
18159 while (true)
18161 cp_token *token;
18162 cp_virt_specifiers virt_specifier;
18164 /* Peek at the next token. */
18165 token = cp_lexer_peek_token (parser->lexer);
18166 /* See if it's a virt-specifier-qualifier. */
18167 if (token->type != CPP_NAME)
18168 break;
18169 if (!strcmp (IDENTIFIER_POINTER(token->u.value), "override"))
18171 maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS);
18172 virt_specifier = VIRT_SPEC_OVERRIDE;
18174 else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "final"))
18176 maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS);
18177 virt_specifier = VIRT_SPEC_FINAL;
18179 else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "__final"))
18181 virt_specifier = VIRT_SPEC_FINAL;
18183 else
18184 break;
18186 if (virt_specifiers & virt_specifier)
18188 error_at (token->location, "duplicate virt-specifier");
18189 cp_lexer_purge_token (parser->lexer);
18191 else
18193 cp_lexer_consume_token (parser->lexer);
18194 virt_specifiers |= virt_specifier;
18197 return virt_specifiers;
18200 /* Used by handling of trailing-return-types and NSDMI, in which 'this'
18201 is in scope even though it isn't real. */
18203 void
18204 inject_this_parameter (tree ctype, cp_cv_quals quals)
18206 tree this_parm;
18208 if (current_class_ptr)
18210 /* We don't clear this between NSDMIs. Is it already what we want? */
18211 tree type = TREE_TYPE (TREE_TYPE (current_class_ptr));
18212 if (same_type_ignoring_top_level_qualifiers_p (ctype, type)
18213 && cp_type_quals (type) == quals)
18214 return;
18217 this_parm = build_this_parm (ctype, quals);
18218 /* Clear this first to avoid shortcut in cp_build_indirect_ref. */
18219 current_class_ptr = NULL_TREE;
18220 current_class_ref
18221 = cp_build_indirect_ref (this_parm, RO_NULL, tf_warning_or_error);
18222 current_class_ptr = this_parm;
18225 /* Return true iff our current scope is a non-static data member
18226 initializer. */
18228 bool
18229 parsing_nsdmi (void)
18231 /* We recognize NSDMI context by the context-less 'this' pointer set up
18232 by the function above. */
18233 if (current_class_ptr && DECL_CONTEXT (current_class_ptr) == NULL_TREE)
18234 return true;
18235 return false;
18238 /* Parse a late-specified return type, if any. This is not a separate
18239 non-terminal, but part of a function declarator, which looks like
18241 -> trailing-type-specifier-seq abstract-declarator(opt)
18243 Returns the type indicated by the type-id.
18245 In addition to this this parses any queued up omp declare simd
18246 clauses and Cilk Plus SIMD-enabled function's vector attributes.
18248 QUALS is either a bitmask of cv_qualifiers or -1 for a non-member
18249 function. */
18251 static tree
18252 cp_parser_late_return_type_opt (cp_parser* parser, cp_declarator *declarator,
18253 cp_cv_quals quals)
18255 cp_token *token;
18256 tree type = NULL_TREE;
18257 bool declare_simd_p = (parser->omp_declare_simd
18258 && declarator
18259 && declarator->kind == cdk_id);
18261 bool cilk_simd_fn_vector_p = (parser->cilk_simd_fn_info
18262 && declarator && declarator->kind == cdk_id);
18264 /* Peek at the next token. */
18265 token = cp_lexer_peek_token (parser->lexer);
18266 /* A late-specified return type is indicated by an initial '->'. */
18267 if (token->type != CPP_DEREF && !(declare_simd_p || cilk_simd_fn_vector_p))
18268 return NULL_TREE;
18270 tree save_ccp = current_class_ptr;
18271 tree save_ccr = current_class_ref;
18272 if (quals >= 0)
18274 /* DR 1207: 'this' is in scope in the trailing return type. */
18275 inject_this_parameter (current_class_type, quals);
18278 if (token->type == CPP_DEREF)
18280 /* Consume the ->. */
18281 cp_lexer_consume_token (parser->lexer);
18283 type = cp_parser_trailing_type_id (parser);
18286 if (cilk_simd_fn_vector_p)
18287 declarator->std_attributes
18288 = cp_parser_late_parsing_cilk_simd_fn_info (parser,
18289 declarator->std_attributes);
18290 if (declare_simd_p)
18291 declarator->std_attributes
18292 = cp_parser_late_parsing_omp_declare_simd (parser,
18293 declarator->std_attributes);
18295 if (quals >= 0)
18297 current_class_ptr = save_ccp;
18298 current_class_ref = save_ccr;
18301 return type;
18304 /* Parse a declarator-id.
18306 declarator-id:
18307 id-expression
18308 :: [opt] nested-name-specifier [opt] type-name
18310 In the `id-expression' case, the value returned is as for
18311 cp_parser_id_expression if the id-expression was an unqualified-id.
18312 If the id-expression was a qualified-id, then a SCOPE_REF is
18313 returned. The first operand is the scope (either a NAMESPACE_DECL
18314 or TREE_TYPE), but the second is still just a representation of an
18315 unqualified-id. */
18317 static tree
18318 cp_parser_declarator_id (cp_parser* parser, bool optional_p)
18320 tree id;
18321 /* The expression must be an id-expression. Assume that qualified
18322 names are the names of types so that:
18324 template <class T>
18325 int S<T>::R::i = 3;
18327 will work; we must treat `S<T>::R' as the name of a type.
18328 Similarly, assume that qualified names are templates, where
18329 required, so that:
18331 template <class T>
18332 int S<T>::R<T>::i = 3;
18334 will work, too. */
18335 id = cp_parser_id_expression (parser,
18336 /*template_keyword_p=*/false,
18337 /*check_dependency_p=*/false,
18338 /*template_p=*/NULL,
18339 /*declarator_p=*/true,
18340 optional_p);
18341 if (id && BASELINK_P (id))
18342 id = BASELINK_FUNCTIONS (id);
18343 return id;
18346 /* Parse a type-id.
18348 type-id:
18349 type-specifier-seq abstract-declarator [opt]
18351 Returns the TYPE specified. */
18353 static tree
18354 cp_parser_type_id_1 (cp_parser* parser, bool is_template_arg,
18355 bool is_trailing_return)
18357 cp_decl_specifier_seq type_specifier_seq;
18358 cp_declarator *abstract_declarator;
18360 /* Parse the type-specifier-seq. */
18361 cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
18362 is_trailing_return,
18363 &type_specifier_seq);
18364 if (type_specifier_seq.type == error_mark_node)
18365 return error_mark_node;
18367 /* There might or might not be an abstract declarator. */
18368 cp_parser_parse_tentatively (parser);
18369 /* Look for the declarator. */
18370 abstract_declarator
18371 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_ABSTRACT, NULL,
18372 /*parenthesized_p=*/NULL,
18373 /*member_p=*/false,
18374 /*friend_p=*/false);
18375 /* Check to see if there really was a declarator. */
18376 if (!cp_parser_parse_definitely (parser))
18377 abstract_declarator = NULL;
18379 if (type_specifier_seq.type
18380 /* None of the valid uses of 'auto' in C++14 involve the type-id
18381 nonterminal, but it is valid in a trailing-return-type. */
18382 && !(cxx_dialect >= cxx14 && is_trailing_return)
18383 && type_uses_auto (type_specifier_seq.type))
18385 /* A type-id with type 'auto' is only ok if the abstract declarator
18386 is a function declarator with a late-specified return type. */
18387 if (abstract_declarator
18388 && abstract_declarator->kind == cdk_function
18389 && abstract_declarator->u.function.late_return_type)
18390 /* OK */;
18391 else
18393 error ("invalid use of %<auto%>");
18394 return error_mark_node;
18398 return groktypename (&type_specifier_seq, abstract_declarator,
18399 is_template_arg);
18402 static tree cp_parser_type_id (cp_parser *parser)
18404 return cp_parser_type_id_1 (parser, false, false);
18407 static tree cp_parser_template_type_arg (cp_parser *parser)
18409 tree r;
18410 const char *saved_message = parser->type_definition_forbidden_message;
18411 parser->type_definition_forbidden_message
18412 = G_("types may not be defined in template arguments");
18413 r = cp_parser_type_id_1 (parser, true, false);
18414 parser->type_definition_forbidden_message = saved_message;
18415 if (cxx_dialect >= cxx14 && type_uses_auto (r))
18417 error ("invalid use of %<auto%> in template argument");
18418 r = error_mark_node;
18420 return r;
18423 static tree cp_parser_trailing_type_id (cp_parser *parser)
18425 return cp_parser_type_id_1 (parser, false, true);
18428 /* Parse a type-specifier-seq.
18430 type-specifier-seq:
18431 type-specifier type-specifier-seq [opt]
18433 GNU extension:
18435 type-specifier-seq:
18436 attributes type-specifier-seq [opt]
18438 If IS_DECLARATION is true, we are at the start of a "condition" or
18439 exception-declaration, so we might be followed by a declarator-id.
18441 If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
18442 i.e. we've just seen "->".
18444 Sets *TYPE_SPECIFIER_SEQ to represent the sequence. */
18446 static void
18447 cp_parser_type_specifier_seq (cp_parser* parser,
18448 bool is_declaration,
18449 bool is_trailing_return,
18450 cp_decl_specifier_seq *type_specifier_seq)
18452 bool seen_type_specifier = false;
18453 cp_parser_flags flags = CP_PARSER_FLAGS_OPTIONAL;
18454 cp_token *start_token = NULL;
18456 /* Clear the TYPE_SPECIFIER_SEQ. */
18457 clear_decl_specs (type_specifier_seq);
18459 /* In the context of a trailing return type, enum E { } is an
18460 elaborated-type-specifier followed by a function-body, not an
18461 enum-specifier. */
18462 if (is_trailing_return)
18463 flags |= CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS;
18465 /* Parse the type-specifiers and attributes. */
18466 while (true)
18468 tree type_specifier;
18469 bool is_cv_qualifier;
18471 /* Check for attributes first. */
18472 if (cp_next_tokens_can_be_attribute_p (parser))
18474 type_specifier_seq->attributes =
18475 chainon (type_specifier_seq->attributes,
18476 cp_parser_attributes_opt (parser));
18477 continue;
18480 /* record the token of the beginning of the type specifier seq,
18481 for error reporting purposes*/
18482 if (!start_token)
18483 start_token = cp_lexer_peek_token (parser->lexer);
18485 /* Look for the type-specifier. */
18486 type_specifier = cp_parser_type_specifier (parser,
18487 flags,
18488 type_specifier_seq,
18489 /*is_declaration=*/false,
18490 NULL,
18491 &is_cv_qualifier);
18492 if (!type_specifier)
18494 /* If the first type-specifier could not be found, this is not a
18495 type-specifier-seq at all. */
18496 if (!seen_type_specifier)
18498 /* Set in_declarator_p to avoid skipping to the semicolon. */
18499 int in_decl = parser->in_declarator_p;
18500 parser->in_declarator_p = true;
18502 if (cp_parser_uncommitted_to_tentative_parse_p (parser)
18503 || !cp_parser_parse_and_diagnose_invalid_type_name (parser))
18504 cp_parser_error (parser, "expected type-specifier");
18506 parser->in_declarator_p = in_decl;
18508 type_specifier_seq->type = error_mark_node;
18509 return;
18511 /* If subsequent type-specifiers could not be found, the
18512 type-specifier-seq is complete. */
18513 break;
18516 seen_type_specifier = true;
18517 /* The standard says that a condition can be:
18519 type-specifier-seq declarator = assignment-expression
18521 However, given:
18523 struct S {};
18524 if (int S = ...)
18526 we should treat the "S" as a declarator, not as a
18527 type-specifier. The standard doesn't say that explicitly for
18528 type-specifier-seq, but it does say that for
18529 decl-specifier-seq in an ordinary declaration. Perhaps it
18530 would be clearer just to allow a decl-specifier-seq here, and
18531 then add a semantic restriction that if any decl-specifiers
18532 that are not type-specifiers appear, the program is invalid. */
18533 if (is_declaration && !is_cv_qualifier)
18534 flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
18538 /* Return whether the function currently being declared has an associated
18539 template parameter list. */
18541 static bool
18542 function_being_declared_is_template_p (cp_parser* parser)
18544 if (!current_template_parms || processing_template_parmlist)
18545 return false;
18547 if (parser->implicit_template_scope)
18548 return true;
18550 if (at_class_scope_p ()
18551 && TYPE_BEING_DEFINED (current_class_type))
18552 return parser->num_template_parameter_lists != 0;
18554 return ((int) parser->num_template_parameter_lists > template_class_depth
18555 (current_class_type));
18558 /* Parse a parameter-declaration-clause.
18560 parameter-declaration-clause:
18561 parameter-declaration-list [opt] ... [opt]
18562 parameter-declaration-list , ...
18564 Returns a representation for the parameter declarations. A return
18565 value of NULL indicates a parameter-declaration-clause consisting
18566 only of an ellipsis. */
18568 static tree
18569 cp_parser_parameter_declaration_clause (cp_parser* parser)
18571 tree parameters;
18572 cp_token *token;
18573 bool ellipsis_p;
18574 bool is_error;
18576 struct cleanup {
18577 cp_parser* parser;
18578 int auto_is_implicit_function_template_parm_p;
18579 ~cleanup() {
18580 parser->auto_is_implicit_function_template_parm_p
18581 = auto_is_implicit_function_template_parm_p;
18583 } cleanup = { parser, parser->auto_is_implicit_function_template_parm_p };
18585 (void) cleanup;
18587 if (!processing_specialization
18588 && !processing_template_parmlist
18589 && !processing_explicit_instantiation)
18590 if (!current_function_decl
18591 || (current_class_type && LAMBDA_TYPE_P (current_class_type)))
18592 parser->auto_is_implicit_function_template_parm_p = true;
18594 /* Peek at the next token. */
18595 token = cp_lexer_peek_token (parser->lexer);
18596 /* Check for trivial parameter-declaration-clauses. */
18597 if (token->type == CPP_ELLIPSIS)
18599 /* Consume the `...' token. */
18600 cp_lexer_consume_token (parser->lexer);
18601 return NULL_TREE;
18603 else if (token->type == CPP_CLOSE_PAREN)
18604 /* There are no parameters. */
18606 #ifndef NO_IMPLICIT_EXTERN_C
18607 if (in_system_header_at (input_location)
18608 && current_class_type == NULL
18609 && current_lang_name == lang_name_c)
18610 return NULL_TREE;
18611 else
18612 #endif
18613 return void_list_node;
18615 /* Check for `(void)', too, which is a special case. */
18616 else if (token->keyword == RID_VOID
18617 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
18618 == CPP_CLOSE_PAREN))
18620 /* Consume the `void' token. */
18621 cp_lexer_consume_token (parser->lexer);
18622 /* There are no parameters. */
18623 return void_list_node;
18626 /* Parse the parameter-declaration-list. */
18627 parameters = cp_parser_parameter_declaration_list (parser, &is_error);
18628 /* If a parse error occurred while parsing the
18629 parameter-declaration-list, then the entire
18630 parameter-declaration-clause is erroneous. */
18631 if (is_error)
18632 return NULL;
18634 /* Peek at the next token. */
18635 token = cp_lexer_peek_token (parser->lexer);
18636 /* If it's a `,', the clause should terminate with an ellipsis. */
18637 if (token->type == CPP_COMMA)
18639 /* Consume the `,'. */
18640 cp_lexer_consume_token (parser->lexer);
18641 /* Expect an ellipsis. */
18642 ellipsis_p
18643 = (cp_parser_require (parser, CPP_ELLIPSIS, RT_ELLIPSIS) != NULL);
18645 /* It might also be `...' if the optional trailing `,' was
18646 omitted. */
18647 else if (token->type == CPP_ELLIPSIS)
18649 /* Consume the `...' token. */
18650 cp_lexer_consume_token (parser->lexer);
18651 /* And remember that we saw it. */
18652 ellipsis_p = true;
18654 else
18655 ellipsis_p = false;
18657 /* Finish the parameter list. */
18658 if (!ellipsis_p)
18659 parameters = chainon (parameters, void_list_node);
18661 return parameters;
18664 /* Parse a parameter-declaration-list.
18666 parameter-declaration-list:
18667 parameter-declaration
18668 parameter-declaration-list , parameter-declaration
18670 Returns a representation of the parameter-declaration-list, as for
18671 cp_parser_parameter_declaration_clause. However, the
18672 `void_list_node' is never appended to the list. Upon return,
18673 *IS_ERROR will be true iff an error occurred. */
18675 static tree
18676 cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
18678 tree parameters = NULL_TREE;
18679 tree *tail = &parameters;
18680 bool saved_in_unbraced_linkage_specification_p;
18681 int index = 0;
18683 /* Assume all will go well. */
18684 *is_error = false;
18685 /* The special considerations that apply to a function within an
18686 unbraced linkage specifications do not apply to the parameters
18687 to the function. */
18688 saved_in_unbraced_linkage_specification_p
18689 = parser->in_unbraced_linkage_specification_p;
18690 parser->in_unbraced_linkage_specification_p = false;
18692 /* Look for more parameters. */
18693 while (true)
18695 cp_parameter_declarator *parameter;
18696 tree decl = error_mark_node;
18697 bool parenthesized_p = false;
18698 int template_parm_idx = (function_being_declared_is_template_p (parser)?
18699 TREE_VEC_LENGTH (INNERMOST_TEMPLATE_PARMS
18700 (current_template_parms)) : 0);
18702 /* Parse the parameter. */
18703 parameter
18704 = cp_parser_parameter_declaration (parser,
18705 /*template_parm_p=*/false,
18706 &parenthesized_p);
18708 /* We don't know yet if the enclosing context is deprecated, so wait
18709 and warn in grokparms if appropriate. */
18710 deprecated_state = DEPRECATED_SUPPRESS;
18712 if (parameter)
18714 /* If a function parameter pack was specified and an implicit template
18715 parameter was introduced during cp_parser_parameter_declaration,
18716 change any implicit parameters introduced into packs. */
18717 if (parser->implicit_template_parms
18718 && parameter->declarator
18719 && parameter->declarator->parameter_pack_p)
18721 int latest_template_parm_idx = TREE_VEC_LENGTH
18722 (INNERMOST_TEMPLATE_PARMS (current_template_parms));
18724 if (latest_template_parm_idx != template_parm_idx)
18725 parameter->decl_specifiers.type = convert_generic_types_to_packs
18726 (parameter->decl_specifiers.type,
18727 template_parm_idx, latest_template_parm_idx);
18730 decl = grokdeclarator (parameter->declarator,
18731 &parameter->decl_specifiers,
18732 PARM,
18733 parameter->default_argument != NULL_TREE,
18734 &parameter->decl_specifiers.attributes);
18737 deprecated_state = DEPRECATED_NORMAL;
18739 /* If a parse error occurred parsing the parameter declaration,
18740 then the entire parameter-declaration-list is erroneous. */
18741 if (decl == error_mark_node)
18743 *is_error = true;
18744 parameters = error_mark_node;
18745 break;
18748 if (parameter->decl_specifiers.attributes)
18749 cplus_decl_attributes (&decl,
18750 parameter->decl_specifiers.attributes,
18752 if (DECL_NAME (decl))
18753 decl = pushdecl (decl);
18755 if (decl != error_mark_node)
18757 retrofit_lang_decl (decl);
18758 DECL_PARM_INDEX (decl) = ++index;
18759 DECL_PARM_LEVEL (decl) = function_parm_depth ();
18762 /* Add the new parameter to the list. */
18763 *tail = build_tree_list (parameter->default_argument, decl);
18764 tail = &TREE_CHAIN (*tail);
18766 /* Peek at the next token. */
18767 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
18768 || cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
18769 /* These are for Objective-C++ */
18770 || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
18771 || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18772 /* The parameter-declaration-list is complete. */
18773 break;
18774 else if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
18776 cp_token *token;
18778 /* Peek at the next token. */
18779 token = cp_lexer_peek_nth_token (parser->lexer, 2);
18780 /* If it's an ellipsis, then the list is complete. */
18781 if (token->type == CPP_ELLIPSIS)
18782 break;
18783 /* Otherwise, there must be more parameters. Consume the
18784 `,'. */
18785 cp_lexer_consume_token (parser->lexer);
18786 /* When parsing something like:
18788 int i(float f, double d)
18790 we can tell after seeing the declaration for "f" that we
18791 are not looking at an initialization of a variable "i",
18792 but rather at the declaration of a function "i".
18794 Due to the fact that the parsing of template arguments
18795 (as specified to a template-id) requires backtracking we
18796 cannot use this technique when inside a template argument
18797 list. */
18798 if (!parser->in_template_argument_list_p
18799 && !parser->in_type_id_in_expr_p
18800 && cp_parser_uncommitted_to_tentative_parse_p (parser)
18801 /* However, a parameter-declaration of the form
18802 "float(f)" (which is a valid declaration of a
18803 parameter "f") can also be interpreted as an
18804 expression (the conversion of "f" to "float"). */
18805 && !parenthesized_p)
18806 cp_parser_commit_to_tentative_parse (parser);
18808 else
18810 cp_parser_error (parser, "expected %<,%> or %<...%>");
18811 if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
18812 cp_parser_skip_to_closing_parenthesis (parser,
18813 /*recovering=*/true,
18814 /*or_comma=*/false,
18815 /*consume_paren=*/false);
18816 break;
18820 parser->in_unbraced_linkage_specification_p
18821 = saved_in_unbraced_linkage_specification_p;
18823 /* Reset implicit_template_scope if we are about to leave the function
18824 parameter list that introduced it. Note that for out-of-line member
18825 definitions, there will be one or more class scopes before we get to
18826 the template parameter scope. */
18828 if (cp_binding_level *its = parser->implicit_template_scope)
18829 if (cp_binding_level *maybe_its = current_binding_level->level_chain)
18831 while (maybe_its->kind == sk_class)
18832 maybe_its = maybe_its->level_chain;
18833 if (maybe_its == its)
18835 parser->implicit_template_parms = 0;
18836 parser->implicit_template_scope = 0;
18840 return parameters;
18843 /* Parse a parameter declaration.
18845 parameter-declaration:
18846 decl-specifier-seq ... [opt] declarator
18847 decl-specifier-seq declarator = assignment-expression
18848 decl-specifier-seq ... [opt] abstract-declarator [opt]
18849 decl-specifier-seq abstract-declarator [opt] = assignment-expression
18851 If TEMPLATE_PARM_P is TRUE, then this parameter-declaration
18852 declares a template parameter. (In that case, a non-nested `>'
18853 token encountered during the parsing of the assignment-expression
18854 is not interpreted as a greater-than operator.)
18856 Returns a representation of the parameter, or NULL if an error
18857 occurs. If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to
18858 true iff the declarator is of the form "(p)". */
18860 static cp_parameter_declarator *
18861 cp_parser_parameter_declaration (cp_parser *parser,
18862 bool template_parm_p,
18863 bool *parenthesized_p)
18865 int declares_class_or_enum;
18866 cp_decl_specifier_seq decl_specifiers;
18867 cp_declarator *declarator;
18868 tree default_argument;
18869 cp_token *token = NULL, *declarator_token_start = NULL;
18870 const char *saved_message;
18872 /* In a template parameter, `>' is not an operator.
18874 [temp.param]
18876 When parsing a default template-argument for a non-type
18877 template-parameter, the first non-nested `>' is taken as the end
18878 of the template parameter-list rather than a greater-than
18879 operator. */
18881 /* Type definitions may not appear in parameter types. */
18882 saved_message = parser->type_definition_forbidden_message;
18883 parser->type_definition_forbidden_message
18884 = G_("types may not be defined in parameter types");
18886 /* Parse the declaration-specifiers. */
18887 cp_parser_decl_specifier_seq (parser,
18888 CP_PARSER_FLAGS_NONE,
18889 &decl_specifiers,
18890 &declares_class_or_enum);
18892 /* Complain about missing 'typename' or other invalid type names. */
18893 if (!decl_specifiers.any_type_specifiers_p
18894 && cp_parser_parse_and_diagnose_invalid_type_name (parser))
18895 decl_specifiers.type = error_mark_node;
18897 /* If an error occurred, there's no reason to attempt to parse the
18898 rest of the declaration. */
18899 if (cp_parser_error_occurred (parser))
18901 parser->type_definition_forbidden_message = saved_message;
18902 return NULL;
18905 /* Peek at the next token. */
18906 token = cp_lexer_peek_token (parser->lexer);
18908 /* If the next token is a `)', `,', `=', `>', or `...', then there
18909 is no declarator. However, when variadic templates are enabled,
18910 there may be a declarator following `...'. */
18911 if (token->type == CPP_CLOSE_PAREN
18912 || token->type == CPP_COMMA
18913 || token->type == CPP_EQ
18914 || token->type == CPP_GREATER)
18916 declarator = NULL;
18917 if (parenthesized_p)
18918 *parenthesized_p = false;
18920 /* Otherwise, there should be a declarator. */
18921 else
18923 bool saved_default_arg_ok_p = parser->default_arg_ok_p;
18924 parser->default_arg_ok_p = false;
18926 /* After seeing a decl-specifier-seq, if the next token is not a
18927 "(", there is no possibility that the code is a valid
18928 expression. Therefore, if parsing tentatively, we commit at
18929 this point. */
18930 if (!parser->in_template_argument_list_p
18931 /* In an expression context, having seen:
18933 (int((char ...
18935 we cannot be sure whether we are looking at a
18936 function-type (taking a "char" as a parameter) or a cast
18937 of some object of type "char" to "int". */
18938 && !parser->in_type_id_in_expr_p
18939 && cp_parser_uncommitted_to_tentative_parse_p (parser)
18940 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
18941 && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
18942 cp_parser_commit_to_tentative_parse (parser);
18943 /* Parse the declarator. */
18944 declarator_token_start = token;
18945 declarator = cp_parser_declarator (parser,
18946 CP_PARSER_DECLARATOR_EITHER,
18947 /*ctor_dtor_or_conv_p=*/NULL,
18948 parenthesized_p,
18949 /*member_p=*/false,
18950 /*friend_p=*/false);
18951 parser->default_arg_ok_p = saved_default_arg_ok_p;
18952 /* After the declarator, allow more attributes. */
18953 decl_specifiers.attributes
18954 = chainon (decl_specifiers.attributes,
18955 cp_parser_attributes_opt (parser));
18958 /* If the next token is an ellipsis, and we have not seen a
18959 declarator name, and the type of the declarator contains parameter
18960 packs but it is not a TYPE_PACK_EXPANSION, then we actually have
18961 a parameter pack expansion expression. Otherwise, leave the
18962 ellipsis for a C-style variadic function. */
18963 token = cp_lexer_peek_token (parser->lexer);
18964 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18966 tree type = decl_specifiers.type;
18968 if (type && DECL_P (type))
18969 type = TREE_TYPE (type);
18971 if (type
18972 && TREE_CODE (type) != TYPE_PACK_EXPANSION
18973 && declarator_can_be_parameter_pack (declarator)
18974 && (!declarator || !declarator->parameter_pack_p)
18975 && uses_parameter_packs (type))
18977 /* Consume the `...'. */
18978 cp_lexer_consume_token (parser->lexer);
18979 maybe_warn_variadic_templates ();
18981 /* Build a pack expansion type */
18982 if (declarator)
18983 declarator->parameter_pack_p = true;
18984 else
18985 decl_specifiers.type = make_pack_expansion (type);
18989 /* The restriction on defining new types applies only to the type
18990 of the parameter, not to the default argument. */
18991 parser->type_definition_forbidden_message = saved_message;
18993 /* If the next token is `=', then process a default argument. */
18994 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
18996 token = cp_lexer_peek_token (parser->lexer);
18997 /* If we are defining a class, then the tokens that make up the
18998 default argument must be saved and processed later. */
18999 if (!template_parm_p && at_class_scope_p ()
19000 && TYPE_BEING_DEFINED (current_class_type)
19001 && !LAMBDA_TYPE_P (current_class_type))
19002 default_argument = cp_parser_cache_defarg (parser, /*nsdmi=*/false);
19003 /* Outside of a class definition, we can just parse the
19004 assignment-expression. */
19005 else
19006 default_argument
19007 = cp_parser_default_argument (parser, template_parm_p);
19009 if (!parser->default_arg_ok_p)
19011 if (flag_permissive)
19012 warning (0, "deprecated use of default argument for parameter of non-function");
19013 else
19015 error_at (token->location,
19016 "default arguments are only "
19017 "permitted for function parameters");
19018 default_argument = NULL_TREE;
19021 else if ((declarator && declarator->parameter_pack_p)
19022 || (decl_specifiers.type
19023 && PACK_EXPANSION_P (decl_specifiers.type)))
19025 /* Find the name of the parameter pack. */
19026 cp_declarator *id_declarator = declarator;
19027 while (id_declarator && id_declarator->kind != cdk_id)
19028 id_declarator = id_declarator->declarator;
19030 if (id_declarator && id_declarator->kind == cdk_id)
19031 error_at (declarator_token_start->location,
19032 template_parm_p
19033 ? G_("template parameter pack %qD "
19034 "cannot have a default argument")
19035 : G_("parameter pack %qD cannot have "
19036 "a default argument"),
19037 id_declarator->u.id.unqualified_name);
19038 else
19039 error_at (declarator_token_start->location,
19040 template_parm_p
19041 ? G_("template parameter pack cannot have "
19042 "a default argument")
19043 : G_("parameter pack cannot have a "
19044 "default argument"));
19046 default_argument = NULL_TREE;
19049 else
19050 default_argument = NULL_TREE;
19052 return make_parameter_declarator (&decl_specifiers,
19053 declarator,
19054 default_argument);
19057 /* Parse a default argument and return it.
19059 TEMPLATE_PARM_P is true if this is a default argument for a
19060 non-type template parameter. */
19061 static tree
19062 cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
19064 tree default_argument = NULL_TREE;
19065 bool saved_greater_than_is_operator_p;
19066 bool saved_local_variables_forbidden_p;
19067 bool non_constant_p, is_direct_init;
19069 /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is
19070 set correctly. */
19071 saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
19072 parser->greater_than_is_operator_p = !template_parm_p;
19073 /* Local variable names (and the `this' keyword) may not
19074 appear in a default argument. */
19075 saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
19076 parser->local_variables_forbidden_p = true;
19077 /* Parse the assignment-expression. */
19078 if (template_parm_p)
19079 push_deferring_access_checks (dk_no_deferred);
19080 tree saved_class_ptr = NULL_TREE;
19081 tree saved_class_ref = NULL_TREE;
19082 /* The "this" pointer is not valid in a default argument. */
19083 if (cfun)
19085 saved_class_ptr = current_class_ptr;
19086 cp_function_chain->x_current_class_ptr = NULL_TREE;
19087 saved_class_ref = current_class_ref;
19088 cp_function_chain->x_current_class_ref = NULL_TREE;
19090 default_argument
19091 = cp_parser_initializer (parser, &is_direct_init, &non_constant_p);
19092 /* Restore the "this" pointer. */
19093 if (cfun)
19095 cp_function_chain->x_current_class_ptr = saved_class_ptr;
19096 cp_function_chain->x_current_class_ref = saved_class_ref;
19098 if (BRACE_ENCLOSED_INITIALIZER_P (default_argument))
19099 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
19100 if (template_parm_p)
19101 pop_deferring_access_checks ();
19102 parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
19103 parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
19105 return default_argument;
19108 /* Parse a function-body.
19110 function-body:
19111 compound_statement */
19113 static void
19114 cp_parser_function_body (cp_parser *parser, bool in_function_try_block)
19116 cp_parser_compound_statement (parser, NULL, in_function_try_block, true);
19119 /* Parse a ctor-initializer-opt followed by a function-body. Return
19120 true if a ctor-initializer was present. When IN_FUNCTION_TRY_BLOCK
19121 is true we are parsing a function-try-block. */
19123 static bool
19124 cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser,
19125 bool in_function_try_block)
19127 tree body, list;
19128 bool ctor_initializer_p;
19129 const bool check_body_p =
19130 DECL_CONSTRUCTOR_P (current_function_decl)
19131 && DECL_DECLARED_CONSTEXPR_P (current_function_decl);
19132 tree last = NULL;
19134 /* Begin the function body. */
19135 body = begin_function_body ();
19136 /* Parse the optional ctor-initializer. */
19137 ctor_initializer_p = cp_parser_ctor_initializer_opt (parser);
19139 /* If we're parsing a constexpr constructor definition, we need
19140 to check that the constructor body is indeed empty. However,
19141 before we get to cp_parser_function_body lot of junk has been
19142 generated, so we can't just check that we have an empty block.
19143 Rather we take a snapshot of the outermost block, and check whether
19144 cp_parser_function_body changed its state. */
19145 if (check_body_p)
19147 list = cur_stmt_list;
19148 if (STATEMENT_LIST_TAIL (list))
19149 last = STATEMENT_LIST_TAIL (list)->stmt;
19151 /* Parse the function-body. */
19152 cp_parser_function_body (parser, in_function_try_block);
19153 if (check_body_p)
19154 check_constexpr_ctor_body (last, list, /*complain=*/true);
19155 /* Finish the function body. */
19156 finish_function_body (body);
19158 return ctor_initializer_p;
19161 /* Parse an initializer.
19163 initializer:
19164 = initializer-clause
19165 ( expression-list )
19167 Returns an expression representing the initializer. If no
19168 initializer is present, NULL_TREE is returned.
19170 *IS_DIRECT_INIT is set to FALSE if the `= initializer-clause'
19171 production is used, and TRUE otherwise. *IS_DIRECT_INIT is
19172 set to TRUE if there is no initializer present. If there is an
19173 initializer, and it is not a constant-expression, *NON_CONSTANT_P
19174 is set to true; otherwise it is set to false. */
19176 static tree
19177 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
19178 bool* non_constant_p)
19180 cp_token *token;
19181 tree init;
19183 /* Peek at the next token. */
19184 token = cp_lexer_peek_token (parser->lexer);
19186 /* Let our caller know whether or not this initializer was
19187 parenthesized. */
19188 *is_direct_init = (token->type != CPP_EQ);
19189 /* Assume that the initializer is constant. */
19190 *non_constant_p = false;
19192 if (token->type == CPP_EQ)
19194 /* Consume the `='. */
19195 cp_lexer_consume_token (parser->lexer);
19196 /* Parse the initializer-clause. */
19197 init = cp_parser_initializer_clause (parser, non_constant_p);
19199 else if (token->type == CPP_OPEN_PAREN)
19201 vec<tree, va_gc> *vec;
19202 vec = cp_parser_parenthesized_expression_list (parser, non_attr,
19203 /*cast_p=*/false,
19204 /*allow_expansion_p=*/true,
19205 non_constant_p);
19206 if (vec == NULL)
19207 return error_mark_node;
19208 init = build_tree_list_vec (vec);
19209 release_tree_vector (vec);
19211 else if (token->type == CPP_OPEN_BRACE)
19213 cp_lexer_set_source_position (parser->lexer);
19214 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
19215 init = cp_parser_braced_list (parser, non_constant_p);
19216 CONSTRUCTOR_IS_DIRECT_INIT (init) = 1;
19218 else
19220 /* Anything else is an error. */
19221 cp_parser_error (parser, "expected initializer");
19222 init = error_mark_node;
19225 return init;
19228 /* Parse an initializer-clause.
19230 initializer-clause:
19231 assignment-expression
19232 braced-init-list
19234 Returns an expression representing the initializer.
19236 If the `assignment-expression' production is used the value
19237 returned is simply a representation for the expression.
19239 Otherwise, calls cp_parser_braced_list. */
19241 static tree
19242 cp_parser_initializer_clause (cp_parser* parser, bool* non_constant_p)
19244 tree initializer;
19246 /* Assume the expression is constant. */
19247 *non_constant_p = false;
19249 /* If it is not a `{', then we are looking at an
19250 assignment-expression. */
19251 if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
19253 initializer
19254 = cp_parser_constant_expression (parser,
19255 /*allow_non_constant_p=*/true,
19256 non_constant_p);
19258 else
19259 initializer = cp_parser_braced_list (parser, non_constant_p);
19261 return initializer;
19264 /* Parse a brace-enclosed initializer list.
19266 braced-init-list:
19267 { initializer-list , [opt] }
19270 Returns a CONSTRUCTOR. The CONSTRUCTOR_ELTS will be
19271 the elements of the initializer-list (or NULL, if the last
19272 production is used). The TREE_TYPE for the CONSTRUCTOR will be
19273 NULL_TREE. There is no way to detect whether or not the optional
19274 trailing `,' was provided. NON_CONSTANT_P is as for
19275 cp_parser_initializer. */
19277 static tree
19278 cp_parser_braced_list (cp_parser* parser, bool* non_constant_p)
19280 tree initializer;
19282 /* Consume the `{' token. */
19283 cp_lexer_consume_token (parser->lexer);
19284 /* Create a CONSTRUCTOR to represent the braced-initializer. */
19285 initializer = make_node (CONSTRUCTOR);
19286 /* If it's not a `}', then there is a non-trivial initializer. */
19287 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
19289 /* Parse the initializer list. */
19290 CONSTRUCTOR_ELTS (initializer)
19291 = cp_parser_initializer_list (parser, non_constant_p);
19292 /* A trailing `,' token is allowed. */
19293 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
19294 cp_lexer_consume_token (parser->lexer);
19296 else
19297 *non_constant_p = false;
19298 /* Now, there should be a trailing `}'. */
19299 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
19300 TREE_TYPE (initializer) = init_list_type_node;
19301 return initializer;
19304 /* Consume tokens up to, and including, the next non-nested closing `]'.
19305 Returns true iff we found a closing `]'. */
19307 static bool
19308 cp_parser_skip_to_closing_square_bracket (cp_parser *parser)
19310 unsigned square_depth = 0;
19312 while (true)
19314 cp_token * token = cp_lexer_peek_token (parser->lexer);
19316 switch (token->type)
19318 case CPP_EOF:
19319 case CPP_PRAGMA_EOL:
19320 /* If we've run out of tokens, then there is no closing `]'. */
19321 return false;
19323 case CPP_OPEN_SQUARE:
19324 ++square_depth;
19325 break;
19327 case CPP_CLOSE_SQUARE:
19328 if (!square_depth--)
19330 cp_lexer_consume_token (parser->lexer);
19331 return true;
19333 break;
19335 default:
19336 break;
19339 /* Consume the token. */
19340 cp_lexer_consume_token (parser->lexer);
19344 /* Return true if we are looking at an array-designator, false otherwise. */
19346 static bool
19347 cp_parser_array_designator_p (cp_parser *parser)
19349 /* Consume the `['. */
19350 cp_lexer_consume_token (parser->lexer);
19352 cp_lexer_save_tokens (parser->lexer);
19354 /* Skip tokens until the next token is a closing square bracket.
19355 If we find the closing `]', and the next token is a `=', then
19356 we are looking at an array designator. */
19357 bool array_designator_p
19358 = (cp_parser_skip_to_closing_square_bracket (parser)
19359 && cp_lexer_next_token_is (parser->lexer, CPP_EQ));
19361 /* Roll back the tokens we skipped. */
19362 cp_lexer_rollback_tokens (parser->lexer);
19364 return array_designator_p;
19367 /* Parse an initializer-list.
19369 initializer-list:
19370 initializer-clause ... [opt]
19371 initializer-list , initializer-clause ... [opt]
19373 GNU Extension:
19375 initializer-list:
19376 designation initializer-clause ...[opt]
19377 initializer-list , designation initializer-clause ...[opt]
19379 designation:
19380 . identifier =
19381 identifier :
19382 [ constant-expression ] =
19384 Returns a vec of constructor_elt. The VALUE of each elt is an expression
19385 for the initializer. If the INDEX of the elt is non-NULL, it is the
19386 IDENTIFIER_NODE naming the field to initialize. NON_CONSTANT_P is
19387 as for cp_parser_initializer. */
19389 static vec<constructor_elt, va_gc> *
19390 cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
19392 vec<constructor_elt, va_gc> *v = NULL;
19394 /* Assume all of the expressions are constant. */
19395 *non_constant_p = false;
19397 /* Parse the rest of the list. */
19398 while (true)
19400 cp_token *token;
19401 tree designator;
19402 tree initializer;
19403 bool clause_non_constant_p;
19405 /* If the next token is an identifier and the following one is a
19406 colon, we are looking at the GNU designated-initializer
19407 syntax. */
19408 if (cp_parser_allow_gnu_extensions_p (parser)
19409 && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
19410 && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
19412 /* Warn the user that they are using an extension. */
19413 pedwarn (input_location, OPT_Wpedantic,
19414 "ISO C++ does not allow designated initializers");
19415 /* Consume the identifier. */
19416 designator = cp_lexer_consume_token (parser->lexer)->u.value;
19417 /* Consume the `:'. */
19418 cp_lexer_consume_token (parser->lexer);
19420 /* Also handle the C99 syntax, '. id ='. */
19421 else if (cp_parser_allow_gnu_extensions_p (parser)
19422 && cp_lexer_next_token_is (parser->lexer, CPP_DOT)
19423 && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME
19424 && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_EQ)
19426 /* Warn the user that they are using an extension. */
19427 pedwarn (input_location, OPT_Wpedantic,
19428 "ISO C++ does not allow C99 designated initializers");
19429 /* Consume the `.'. */
19430 cp_lexer_consume_token (parser->lexer);
19431 /* Consume the identifier. */
19432 designator = cp_lexer_consume_token (parser->lexer)->u.value;
19433 /* Consume the `='. */
19434 cp_lexer_consume_token (parser->lexer);
19436 /* Also handle C99 array designators, '[ const ] ='. */
19437 else if (cp_parser_allow_gnu_extensions_p (parser)
19438 && !c_dialect_objc ()
19439 && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
19441 /* In C++11, [ could start a lambda-introducer. */
19442 bool non_const = false;
19444 cp_parser_parse_tentatively (parser);
19446 if (!cp_parser_array_designator_p (parser))
19448 cp_parser_simulate_error (parser);
19449 designator = NULL_TREE;
19451 else
19453 designator = cp_parser_constant_expression (parser, true,
19454 &non_const);
19455 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
19456 cp_parser_require (parser, CPP_EQ, RT_EQ);
19459 if (!cp_parser_parse_definitely (parser))
19460 designator = NULL_TREE;
19461 else if (non_const)
19462 require_potential_rvalue_constant_expression (designator);
19464 else
19465 designator = NULL_TREE;
19467 /* Parse the initializer. */
19468 initializer = cp_parser_initializer_clause (parser,
19469 &clause_non_constant_p);
19470 /* If any clause is non-constant, so is the entire initializer. */
19471 if (clause_non_constant_p)
19472 *non_constant_p = true;
19474 /* If we have an ellipsis, this is an initializer pack
19475 expansion. */
19476 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
19478 /* Consume the `...'. */
19479 cp_lexer_consume_token (parser->lexer);
19481 /* Turn the initializer into an initializer expansion. */
19482 initializer = make_pack_expansion (initializer);
19485 /* Add it to the vector. */
19486 CONSTRUCTOR_APPEND_ELT (v, designator, initializer);
19488 /* If the next token is not a comma, we have reached the end of
19489 the list. */
19490 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19491 break;
19493 /* Peek at the next token. */
19494 token = cp_lexer_peek_nth_token (parser->lexer, 2);
19495 /* If the next token is a `}', then we're still done. An
19496 initializer-clause can have a trailing `,' after the
19497 initializer-list and before the closing `}'. */
19498 if (token->type == CPP_CLOSE_BRACE)
19499 break;
19501 /* Consume the `,' token. */
19502 cp_lexer_consume_token (parser->lexer);
19505 return v;
19508 /* Classes [gram.class] */
19510 /* Parse a class-name.
19512 class-name:
19513 identifier
19514 template-id
19516 TYPENAME_KEYWORD_P is true iff the `typename' keyword has been used
19517 to indicate that names looked up in dependent types should be
19518 assumed to be types. TEMPLATE_KEYWORD_P is true iff the `template'
19519 keyword has been used to indicate that the name that appears next
19520 is a template. TAG_TYPE indicates the explicit tag given before
19521 the type name, if any. If CHECK_DEPENDENCY_P is FALSE, names are
19522 looked up in dependent scopes. If CLASS_HEAD_P is TRUE, this class
19523 is the class being defined in a class-head.
19525 Returns the TYPE_DECL representing the class. */
19527 static tree
19528 cp_parser_class_name (cp_parser *parser,
19529 bool typename_keyword_p,
19530 bool template_keyword_p,
19531 enum tag_types tag_type,
19532 bool check_dependency_p,
19533 bool class_head_p,
19534 bool is_declaration)
19536 tree decl;
19537 tree scope;
19538 bool typename_p;
19539 cp_token *token;
19540 tree identifier = NULL_TREE;
19542 /* All class-names start with an identifier. */
19543 token = cp_lexer_peek_token (parser->lexer);
19544 if (token->type != CPP_NAME && token->type != CPP_TEMPLATE_ID)
19546 cp_parser_error (parser, "expected class-name");
19547 return error_mark_node;
19550 /* PARSER->SCOPE can be cleared when parsing the template-arguments
19551 to a template-id, so we save it here. */
19552 scope = parser->scope;
19553 if (scope == error_mark_node)
19554 return error_mark_node;
19556 /* Any name names a type if we're following the `typename' keyword
19557 in a qualified name where the enclosing scope is type-dependent. */
19558 typename_p = (typename_keyword_p && scope && TYPE_P (scope)
19559 && dependent_type_p (scope));
19560 /* Handle the common case (an identifier, but not a template-id)
19561 efficiently. */
19562 if (token->type == CPP_NAME
19563 && !cp_parser_nth_token_starts_template_argument_list_p (parser, 2))
19565 cp_token *identifier_token;
19566 bool ambiguous_p;
19568 /* Look for the identifier. */
19569 identifier_token = cp_lexer_peek_token (parser->lexer);
19570 ambiguous_p = identifier_token->error_reported;
19571 identifier = cp_parser_identifier (parser);
19572 /* If the next token isn't an identifier, we are certainly not
19573 looking at a class-name. */
19574 if (identifier == error_mark_node)
19575 decl = error_mark_node;
19576 /* If we know this is a type-name, there's no need to look it
19577 up. */
19578 else if (typename_p)
19579 decl = identifier;
19580 else
19582 tree ambiguous_decls;
19583 /* If we already know that this lookup is ambiguous, then
19584 we've already issued an error message; there's no reason
19585 to check again. */
19586 if (ambiguous_p)
19588 cp_parser_simulate_error (parser);
19589 return error_mark_node;
19591 /* If the next token is a `::', then the name must be a type
19592 name.
19594 [basic.lookup.qual]
19596 During the lookup for a name preceding the :: scope
19597 resolution operator, object, function, and enumerator
19598 names are ignored. */
19599 if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
19600 tag_type = typename_type;
19601 /* Look up the name. */
19602 decl = cp_parser_lookup_name (parser, identifier,
19603 tag_type,
19604 /*is_template=*/false,
19605 /*is_namespace=*/false,
19606 check_dependency_p,
19607 &ambiguous_decls,
19608 identifier_token->location);
19609 if (ambiguous_decls)
19611 if (cp_parser_parsing_tentatively (parser))
19612 cp_parser_simulate_error (parser);
19613 return error_mark_node;
19617 else
19619 /* Try a template-id. */
19620 decl = cp_parser_template_id (parser, template_keyword_p,
19621 check_dependency_p,
19622 tag_type,
19623 is_declaration);
19624 if (decl == error_mark_node)
19625 return error_mark_node;
19628 decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
19630 /* If this is a typename, create a TYPENAME_TYPE. */
19631 if (typename_p && decl != error_mark_node)
19633 decl = make_typename_type (scope, decl, typename_type,
19634 /*complain=*/tf_error);
19635 if (decl != error_mark_node)
19636 decl = TYPE_NAME (decl);
19639 decl = strip_using_decl (decl);
19641 /* Check to see that it is really the name of a class. */
19642 if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
19643 && identifier_p (TREE_OPERAND (decl, 0))
19644 && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
19645 /* Situations like this:
19647 template <typename T> struct A {
19648 typename T::template X<int>::I i;
19651 are problematic. Is `T::template X<int>' a class-name? The
19652 standard does not seem to be definitive, but there is no other
19653 valid interpretation of the following `::'. Therefore, those
19654 names are considered class-names. */
19656 decl = make_typename_type (scope, decl, tag_type, tf_error);
19657 if (decl != error_mark_node)
19658 decl = TYPE_NAME (decl);
19660 else if (TREE_CODE (decl) != TYPE_DECL
19661 || TREE_TYPE (decl) == error_mark_node
19662 || !MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))
19663 /* In Objective-C 2.0, a classname followed by '.' starts a
19664 dot-syntax expression, and it's not a type-name. */
19665 || (c_dialect_objc ()
19666 && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT
19667 && objc_is_class_name (decl)))
19668 decl = error_mark_node;
19670 if (decl == error_mark_node)
19671 cp_parser_error (parser, "expected class-name");
19672 else if (identifier && !parser->scope)
19673 maybe_note_name_used_in_class (identifier, decl);
19675 return decl;
19678 /* Parse a class-specifier.
19680 class-specifier:
19681 class-head { member-specification [opt] }
19683 Returns the TREE_TYPE representing the class. */
19685 static tree
19686 cp_parser_class_specifier_1 (cp_parser* parser)
19688 tree type;
19689 tree attributes = NULL_TREE;
19690 bool nested_name_specifier_p;
19691 unsigned saved_num_template_parameter_lists;
19692 bool saved_in_function_body;
19693 unsigned char in_statement;
19694 bool in_switch_statement_p;
19695 bool saved_in_unbraced_linkage_specification_p;
19696 tree old_scope = NULL_TREE;
19697 tree scope = NULL_TREE;
19698 cp_token *closing_brace;
19700 push_deferring_access_checks (dk_no_deferred);
19702 /* Parse the class-head. */
19703 type = cp_parser_class_head (parser,
19704 &nested_name_specifier_p);
19705 /* If the class-head was a semantic disaster, skip the entire body
19706 of the class. */
19707 if (!type)
19709 cp_parser_skip_to_end_of_block_or_statement (parser);
19710 pop_deferring_access_checks ();
19711 return error_mark_node;
19714 /* Look for the `{'. */
19715 if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
19717 pop_deferring_access_checks ();
19718 return error_mark_node;
19721 cp_ensure_no_omp_declare_simd (parser);
19723 /* Issue an error message if type-definitions are forbidden here. */
19724 cp_parser_check_type_definition (parser);
19725 /* Remember that we are defining one more class. */
19726 ++parser->num_classes_being_defined;
19727 /* Inside the class, surrounding template-parameter-lists do not
19728 apply. */
19729 saved_num_template_parameter_lists
19730 = parser->num_template_parameter_lists;
19731 parser->num_template_parameter_lists = 0;
19732 /* We are not in a function body. */
19733 saved_in_function_body = parser->in_function_body;
19734 parser->in_function_body = false;
19735 /* Or in a loop. */
19736 in_statement = parser->in_statement;
19737 parser->in_statement = 0;
19738 /* Or in a switch. */
19739 in_switch_statement_p = parser->in_switch_statement_p;
19740 parser->in_switch_statement_p = false;
19741 /* We are not immediately inside an extern "lang" block. */
19742 saved_in_unbraced_linkage_specification_p
19743 = parser->in_unbraced_linkage_specification_p;
19744 parser->in_unbraced_linkage_specification_p = false;
19746 /* Start the class. */
19747 if (nested_name_specifier_p)
19749 scope = CP_DECL_CONTEXT (TYPE_MAIN_DECL (type));
19750 old_scope = push_inner_scope (scope);
19752 type = begin_class_definition (type);
19754 if (type == error_mark_node)
19755 /* If the type is erroneous, skip the entire body of the class. */
19756 cp_parser_skip_to_closing_brace (parser);
19757 else
19758 /* Parse the member-specification. */
19759 cp_parser_member_specification_opt (parser);
19761 /* Look for the trailing `}'. */
19762 closing_brace = cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
19763 /* Look for trailing attributes to apply to this class. */
19764 if (cp_parser_allow_gnu_extensions_p (parser))
19765 attributes = cp_parser_gnu_attributes_opt (parser);
19766 if (type != error_mark_node)
19767 type = finish_struct (type, attributes);
19768 if (nested_name_specifier_p)
19769 pop_inner_scope (old_scope, scope);
19771 /* We've finished a type definition. Check for the common syntax
19772 error of forgetting a semicolon after the definition. We need to
19773 be careful, as we can't just check for not-a-semicolon and be done
19774 with it; the user might have typed:
19776 class X { } c = ...;
19777 class X { } *p = ...;
19779 and so forth. Instead, enumerate all the possible tokens that
19780 might follow this production; if we don't see one of them, then
19781 complain and silently insert the semicolon. */
19783 cp_token *token = cp_lexer_peek_token (parser->lexer);
19784 bool want_semicolon = true;
19786 if (cp_next_tokens_can_be_std_attribute_p (parser))
19787 /* Don't try to parse c++11 attributes here. As per the
19788 grammar, that should be a task for
19789 cp_parser_decl_specifier_seq. */
19790 want_semicolon = false;
19792 switch (token->type)
19794 case CPP_NAME:
19795 case CPP_SEMICOLON:
19796 case CPP_MULT:
19797 case CPP_AND:
19798 case CPP_OPEN_PAREN:
19799 case CPP_CLOSE_PAREN:
19800 case CPP_COMMA:
19801 want_semicolon = false;
19802 break;
19804 /* While it's legal for type qualifiers and storage class
19805 specifiers to follow type definitions in the grammar, only
19806 compiler testsuites contain code like that. Assume that if
19807 we see such code, then what we're really seeing is a case
19808 like:
19810 class X { }
19811 const <type> var = ...;
19815 class Y { }
19816 static <type> func (...) ...
19818 i.e. the qualifier or specifier applies to the next
19819 declaration. To do so, however, we need to look ahead one
19820 more token to see if *that* token is a type specifier.
19822 This code could be improved to handle:
19824 class Z { }
19825 static const <type> var = ...; */
19826 case CPP_KEYWORD:
19827 if (keyword_is_decl_specifier (token->keyword))
19829 cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
19831 /* Handling user-defined types here would be nice, but very
19832 tricky. */
19833 want_semicolon
19834 = (lookahead->type == CPP_KEYWORD
19835 && keyword_begins_type_specifier (lookahead->keyword));
19837 break;
19838 default:
19839 break;
19842 /* If we don't have a type, then something is very wrong and we
19843 shouldn't try to do anything clever. Likewise for not seeing the
19844 closing brace. */
19845 if (closing_brace && TYPE_P (type) && want_semicolon)
19847 cp_token_position prev
19848 = cp_lexer_previous_token_position (parser->lexer);
19849 cp_token *prev_token = cp_lexer_token_at (parser->lexer, prev);
19850 location_t loc = prev_token->location;
19852 if (CLASSTYPE_DECLARED_CLASS (type))
19853 error_at (loc, "expected %<;%> after class definition");
19854 else if (TREE_CODE (type) == RECORD_TYPE)
19855 error_at (loc, "expected %<;%> after struct definition");
19856 else if (TREE_CODE (type) == UNION_TYPE)
19857 error_at (loc, "expected %<;%> after union definition");
19858 else
19859 gcc_unreachable ();
19861 /* Unget one token and smash it to look as though we encountered
19862 a semicolon in the input stream. */
19863 cp_lexer_set_token_position (parser->lexer, prev);
19864 token = cp_lexer_peek_token (parser->lexer);
19865 token->type = CPP_SEMICOLON;
19866 token->keyword = RID_MAX;
19870 /* If this class is not itself within the scope of another class,
19871 then we need to parse the bodies of all of the queued function
19872 definitions. Note that the queued functions defined in a class
19873 are not always processed immediately following the
19874 class-specifier for that class. Consider:
19876 struct A {
19877 struct B { void f() { sizeof (A); } };
19880 If `f' were processed before the processing of `A' were
19881 completed, there would be no way to compute the size of `A'.
19882 Note that the nesting we are interested in here is lexical --
19883 not the semantic nesting given by TYPE_CONTEXT. In particular,
19884 for:
19886 struct A { struct B; };
19887 struct A::B { void f() { } };
19889 there is no need to delay the parsing of `A::B::f'. */
19890 if (--parser->num_classes_being_defined == 0)
19892 tree decl;
19893 tree class_type = NULL_TREE;
19894 tree pushed_scope = NULL_TREE;
19895 unsigned ix;
19896 cp_default_arg_entry *e;
19897 tree save_ccp, save_ccr;
19899 /* In a first pass, parse default arguments to the functions.
19900 Then, in a second pass, parse the bodies of the functions.
19901 This two-phased approach handles cases like:
19903 struct S {
19904 void f() { g(); }
19905 void g(int i = 3);
19909 FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_default_args, ix, e)
19911 decl = e->decl;
19912 /* If there are default arguments that have not yet been processed,
19913 take care of them now. */
19914 if (class_type != e->class_type)
19916 if (pushed_scope)
19917 pop_scope (pushed_scope);
19918 class_type = e->class_type;
19919 pushed_scope = push_scope (class_type);
19921 /* Make sure that any template parameters are in scope. */
19922 maybe_begin_member_template_processing (decl);
19923 /* Parse the default argument expressions. */
19924 cp_parser_late_parsing_default_args (parser, decl);
19925 /* Remove any template parameters from the symbol table. */
19926 maybe_end_member_template_processing ();
19928 vec_safe_truncate (unparsed_funs_with_default_args, 0);
19929 /* Now parse any NSDMIs. */
19930 save_ccp = current_class_ptr;
19931 save_ccr = current_class_ref;
19932 FOR_EACH_VEC_SAFE_ELT (unparsed_nsdmis, ix, decl)
19934 if (class_type != DECL_CONTEXT (decl))
19936 if (pushed_scope)
19937 pop_scope (pushed_scope);
19938 class_type = DECL_CONTEXT (decl);
19939 pushed_scope = push_scope (class_type);
19941 inject_this_parameter (class_type, TYPE_UNQUALIFIED);
19942 cp_parser_late_parsing_nsdmi (parser, decl);
19944 vec_safe_truncate (unparsed_nsdmis, 0);
19945 current_class_ptr = save_ccp;
19946 current_class_ref = save_ccr;
19947 if (pushed_scope)
19948 pop_scope (pushed_scope);
19950 /* Now do some post-NSDMI bookkeeping. */
19951 FOR_EACH_VEC_SAFE_ELT (unparsed_classes, ix, class_type)
19952 after_nsdmi_defaulted_late_checks (class_type);
19953 vec_safe_truncate (unparsed_classes, 0);
19954 after_nsdmi_defaulted_late_checks (type);
19956 /* Now parse the body of the functions. */
19957 if (flag_openmp)
19959 /* OpenMP UDRs need to be parsed before all other functions. */
19960 FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_definitions, ix, decl)
19961 if (DECL_OMP_DECLARE_REDUCTION_P (decl))
19962 cp_parser_late_parsing_for_member (parser, decl);
19963 FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_definitions, ix, decl)
19964 if (!DECL_OMP_DECLARE_REDUCTION_P (decl))
19965 cp_parser_late_parsing_for_member (parser, decl);
19967 else
19968 FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_definitions, ix, decl)
19969 cp_parser_late_parsing_for_member (parser, decl);
19970 vec_safe_truncate (unparsed_funs_with_definitions, 0);
19972 else
19973 vec_safe_push (unparsed_classes, type);
19975 /* Put back any saved access checks. */
19976 pop_deferring_access_checks ();
19978 /* Restore saved state. */
19979 parser->in_switch_statement_p = in_switch_statement_p;
19980 parser->in_statement = in_statement;
19981 parser->in_function_body = saved_in_function_body;
19982 parser->num_template_parameter_lists
19983 = saved_num_template_parameter_lists;
19984 parser->in_unbraced_linkage_specification_p
19985 = saved_in_unbraced_linkage_specification_p;
19987 return type;
19990 static tree
19991 cp_parser_class_specifier (cp_parser* parser)
19993 tree ret;
19994 timevar_push (TV_PARSE_STRUCT);
19995 ret = cp_parser_class_specifier_1 (parser);
19996 timevar_pop (TV_PARSE_STRUCT);
19997 return ret;
20000 /* Parse a class-head.
20002 class-head:
20003 class-key identifier [opt] base-clause [opt]
20004 class-key nested-name-specifier identifier class-virt-specifier [opt] base-clause [opt]
20005 class-key nested-name-specifier [opt] template-id
20006 base-clause [opt]
20008 class-virt-specifier:
20009 final
20011 GNU Extensions:
20012 class-key attributes identifier [opt] base-clause [opt]
20013 class-key attributes nested-name-specifier identifier base-clause [opt]
20014 class-key attributes nested-name-specifier [opt] template-id
20015 base-clause [opt]
20017 Upon return BASES is initialized to the list of base classes (or
20018 NULL, if there are none) in the same form returned by
20019 cp_parser_base_clause.
20021 Returns the TYPE of the indicated class. Sets
20022 *NESTED_NAME_SPECIFIER_P to TRUE iff one of the productions
20023 involving a nested-name-specifier was used, and FALSE otherwise.
20025 Returns error_mark_node if this is not a class-head.
20027 Returns NULL_TREE if the class-head is syntactically valid, but
20028 semantically invalid in a way that means we should skip the entire
20029 body of the class. */
20031 static tree
20032 cp_parser_class_head (cp_parser* parser,
20033 bool* nested_name_specifier_p)
20035 tree nested_name_specifier;
20036 enum tag_types class_key;
20037 tree id = NULL_TREE;
20038 tree type = NULL_TREE;
20039 tree attributes;
20040 tree bases;
20041 cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
20042 bool template_id_p = false;
20043 bool qualified_p = false;
20044 bool invalid_nested_name_p = false;
20045 bool invalid_explicit_specialization_p = false;
20046 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
20047 tree pushed_scope = NULL_TREE;
20048 unsigned num_templates;
20049 cp_token *type_start_token = NULL, *nested_name_specifier_token_start = NULL;
20050 /* Assume no nested-name-specifier will be present. */
20051 *nested_name_specifier_p = false;
20052 /* Assume no template parameter lists will be used in defining the
20053 type. */
20054 num_templates = 0;
20055 parser->colon_corrects_to_scope_p = false;
20057 /* Look for the class-key. */
20058 class_key = cp_parser_class_key (parser);
20059 if (class_key == none_type)
20060 return error_mark_node;
20062 /* Parse the attributes. */
20063 attributes = cp_parser_attributes_opt (parser);
20065 /* If the next token is `::', that is invalid -- but sometimes
20066 people do try to write:
20068 struct ::S {};
20070 Handle this gracefully by accepting the extra qualifier, and then
20071 issuing an error about it later if this really is a
20072 class-head. If it turns out just to be an elaborated type
20073 specifier, remain silent. */
20074 if (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false))
20075 qualified_p = true;
20077 push_deferring_access_checks (dk_no_check);
20079 /* Determine the name of the class. Begin by looking for an
20080 optional nested-name-specifier. */
20081 nested_name_specifier_token_start = cp_lexer_peek_token (parser->lexer);
20082 nested_name_specifier
20083 = cp_parser_nested_name_specifier_opt (parser,
20084 /*typename_keyword_p=*/false,
20085 /*check_dependency_p=*/false,
20086 /*type_p=*/true,
20087 /*is_declaration=*/false);
20088 /* If there was a nested-name-specifier, then there *must* be an
20089 identifier. */
20090 if (nested_name_specifier)
20092 type_start_token = cp_lexer_peek_token (parser->lexer);
20093 /* Although the grammar says `identifier', it really means
20094 `class-name' or `template-name'. You are only allowed to
20095 define a class that has already been declared with this
20096 syntax.
20098 The proposed resolution for Core Issue 180 says that wherever
20099 you see `class T::X' you should treat `X' as a type-name.
20101 It is OK to define an inaccessible class; for example:
20103 class A { class B; };
20104 class A::B {};
20106 We do not know if we will see a class-name, or a
20107 template-name. We look for a class-name first, in case the
20108 class-name is a template-id; if we looked for the
20109 template-name first we would stop after the template-name. */
20110 cp_parser_parse_tentatively (parser);
20111 type = cp_parser_class_name (parser,
20112 /*typename_keyword_p=*/false,
20113 /*template_keyword_p=*/false,
20114 class_type,
20115 /*check_dependency_p=*/false,
20116 /*class_head_p=*/true,
20117 /*is_declaration=*/false);
20118 /* If that didn't work, ignore the nested-name-specifier. */
20119 if (!cp_parser_parse_definitely (parser))
20121 invalid_nested_name_p = true;
20122 type_start_token = cp_lexer_peek_token (parser->lexer);
20123 id = cp_parser_identifier (parser);
20124 if (id == error_mark_node)
20125 id = NULL_TREE;
20127 /* If we could not find a corresponding TYPE, treat this
20128 declaration like an unqualified declaration. */
20129 if (type == error_mark_node)
20130 nested_name_specifier = NULL_TREE;
20131 /* Otherwise, count the number of templates used in TYPE and its
20132 containing scopes. */
20133 else
20135 tree scope;
20137 for (scope = TREE_TYPE (type);
20138 scope && TREE_CODE (scope) != NAMESPACE_DECL;
20139 scope = get_containing_scope (scope))
20140 if (TYPE_P (scope)
20141 && CLASS_TYPE_P (scope)
20142 && CLASSTYPE_TEMPLATE_INFO (scope)
20143 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))
20144 && (!CLASSTYPE_TEMPLATE_SPECIALIZATION (scope)
20145 || uses_template_parms (CLASSTYPE_TI_ARGS (scope))))
20146 ++num_templates;
20149 /* Otherwise, the identifier is optional. */
20150 else
20152 /* We don't know whether what comes next is a template-id,
20153 an identifier, or nothing at all. */
20154 cp_parser_parse_tentatively (parser);
20155 /* Check for a template-id. */
20156 type_start_token = cp_lexer_peek_token (parser->lexer);
20157 id = cp_parser_template_id (parser,
20158 /*template_keyword_p=*/false,
20159 /*check_dependency_p=*/true,
20160 class_key,
20161 /*is_declaration=*/true);
20162 /* If that didn't work, it could still be an identifier. */
20163 if (!cp_parser_parse_definitely (parser))
20165 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
20167 type_start_token = cp_lexer_peek_token (parser->lexer);
20168 id = cp_parser_identifier (parser);
20170 else
20171 id = NULL_TREE;
20173 else
20175 template_id_p = true;
20176 ++num_templates;
20180 pop_deferring_access_checks ();
20182 if (id)
20184 cp_parser_check_for_invalid_template_id (parser, id,
20185 class_key,
20186 type_start_token->location);
20188 virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
20190 /* If it's not a `:' or a `{' then we can't really be looking at a
20191 class-head, since a class-head only appears as part of a
20192 class-specifier. We have to detect this situation before calling
20193 xref_tag, since that has irreversible side-effects. */
20194 if (!cp_parser_next_token_starts_class_definition_p (parser))
20196 cp_parser_error (parser, "expected %<{%> or %<:%>");
20197 type = error_mark_node;
20198 goto out;
20201 /* At this point, we're going ahead with the class-specifier, even
20202 if some other problem occurs. */
20203 cp_parser_commit_to_tentative_parse (parser);
20204 if (virt_specifiers & VIRT_SPEC_OVERRIDE)
20206 cp_parser_error (parser,
20207 "cannot specify %<override%> for a class");
20208 type = error_mark_node;
20209 goto out;
20211 /* Issue the error about the overly-qualified name now. */
20212 if (qualified_p)
20214 cp_parser_error (parser,
20215 "global qualification of class name is invalid");
20216 type = error_mark_node;
20217 goto out;
20219 else if (invalid_nested_name_p)
20221 cp_parser_error (parser,
20222 "qualified name does not name a class");
20223 type = error_mark_node;
20224 goto out;
20226 else if (nested_name_specifier)
20228 tree scope;
20230 /* Reject typedef-names in class heads. */
20231 if (!DECL_IMPLICIT_TYPEDEF_P (type))
20233 error_at (type_start_token->location,
20234 "invalid class name in declaration of %qD",
20235 type);
20236 type = NULL_TREE;
20237 goto done;
20240 /* Figure out in what scope the declaration is being placed. */
20241 scope = current_scope ();
20242 /* If that scope does not contain the scope in which the
20243 class was originally declared, the program is invalid. */
20244 if (scope && !is_ancestor (scope, nested_name_specifier))
20246 if (at_namespace_scope_p ())
20247 error_at (type_start_token->location,
20248 "declaration of %qD in namespace %qD which does not "
20249 "enclose %qD",
20250 type, scope, nested_name_specifier);
20251 else
20252 error_at (type_start_token->location,
20253 "declaration of %qD in %qD which does not enclose %qD",
20254 type, scope, nested_name_specifier);
20255 type = NULL_TREE;
20256 goto done;
20258 /* [dcl.meaning]
20260 A declarator-id shall not be qualified except for the
20261 definition of a ... nested class outside of its class
20262 ... [or] the definition or explicit instantiation of a
20263 class member of a namespace outside of its namespace. */
20264 if (scope == nested_name_specifier)
20266 permerror (nested_name_specifier_token_start->location,
20267 "extra qualification not allowed");
20268 nested_name_specifier = NULL_TREE;
20269 num_templates = 0;
20272 /* An explicit-specialization must be preceded by "template <>". If
20273 it is not, try to recover gracefully. */
20274 if (at_namespace_scope_p ()
20275 && parser->num_template_parameter_lists == 0
20276 && template_id_p)
20278 error_at (type_start_token->location,
20279 "an explicit specialization must be preceded by %<template <>%>");
20280 invalid_explicit_specialization_p = true;
20281 /* Take the same action that would have been taken by
20282 cp_parser_explicit_specialization. */
20283 ++parser->num_template_parameter_lists;
20284 begin_specialization ();
20286 /* There must be no "return" statements between this point and the
20287 end of this function; set "type "to the correct return value and
20288 use "goto done;" to return. */
20289 /* Make sure that the right number of template parameters were
20290 present. */
20291 if (!cp_parser_check_template_parameters (parser, num_templates,
20292 type_start_token->location,
20293 /*declarator=*/NULL))
20295 /* If something went wrong, there is no point in even trying to
20296 process the class-definition. */
20297 type = NULL_TREE;
20298 goto done;
20301 /* Look up the type. */
20302 if (template_id_p)
20304 if (TREE_CODE (id) == TEMPLATE_ID_EXPR
20305 && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
20306 || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
20308 error_at (type_start_token->location,
20309 "function template %qD redeclared as a class template", id);
20310 type = error_mark_node;
20312 else
20314 type = TREE_TYPE (id);
20315 type = maybe_process_partial_specialization (type);
20317 if (nested_name_specifier)
20318 pushed_scope = push_scope (nested_name_specifier);
20320 else if (nested_name_specifier)
20322 tree class_type;
20324 /* Given:
20326 template <typename T> struct S { struct T };
20327 template <typename T> struct S<T>::T { };
20329 we will get a TYPENAME_TYPE when processing the definition of
20330 `S::T'. We need to resolve it to the actual type before we
20331 try to define it. */
20332 if (TREE_CODE (TREE_TYPE (type)) == TYPENAME_TYPE)
20334 class_type = resolve_typename_type (TREE_TYPE (type),
20335 /*only_current_p=*/false);
20336 if (TREE_CODE (class_type) != TYPENAME_TYPE)
20337 type = TYPE_NAME (class_type);
20338 else
20340 cp_parser_error (parser, "could not resolve typename type");
20341 type = error_mark_node;
20345 if (maybe_process_partial_specialization (TREE_TYPE (type))
20346 == error_mark_node)
20348 type = NULL_TREE;
20349 goto done;
20352 class_type = current_class_type;
20353 /* Enter the scope indicated by the nested-name-specifier. */
20354 pushed_scope = push_scope (nested_name_specifier);
20355 /* Get the canonical version of this type. */
20356 type = TYPE_MAIN_DECL (TREE_TYPE (type));
20357 /* Call push_template_decl if it seems like we should be defining a
20358 template either from the template headers or the type we're
20359 defining, so that we diagnose both extra and missing headers. */
20360 if ((PROCESSING_REAL_TEMPLATE_DECL_P ()
20361 || CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (type)))
20362 && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
20364 type = push_template_decl (type);
20365 if (type == error_mark_node)
20367 type = NULL_TREE;
20368 goto done;
20372 type = TREE_TYPE (type);
20373 *nested_name_specifier_p = true;
20375 else /* The name is not a nested name. */
20377 /* If the class was unnamed, create a dummy name. */
20378 if (!id)
20379 id = make_anon_name ();
20380 type = xref_tag (class_key, id, /*tag_scope=*/ts_current,
20381 parser->num_template_parameter_lists);
20384 /* Indicate whether this class was declared as a `class' or as a
20385 `struct'. */
20386 if (TREE_CODE (type) == RECORD_TYPE)
20387 CLASSTYPE_DECLARED_CLASS (type) = (class_key == class_type);
20388 cp_parser_check_class_key (class_key, type);
20390 /* If this type was already complete, and we see another definition,
20391 that's an error. */
20392 if (type != error_mark_node && COMPLETE_TYPE_P (type))
20394 error_at (type_start_token->location, "redefinition of %q#T",
20395 type);
20396 error_at (type_start_token->location, "previous definition of %q+#T",
20397 type);
20398 type = NULL_TREE;
20399 goto done;
20401 else if (type == error_mark_node)
20402 type = NULL_TREE;
20404 if (type)
20406 /* Apply attributes now, before any use of the class as a template
20407 argument in its base list. */
20408 cplus_decl_attributes (&type, attributes, (int)ATTR_FLAG_TYPE_IN_PLACE);
20409 fixup_attribute_variants (type);
20412 /* We will have entered the scope containing the class; the names of
20413 base classes should be looked up in that context. For example:
20415 struct A { struct B {}; struct C; };
20416 struct A::C : B {};
20418 is valid. */
20420 /* Get the list of base-classes, if there is one. */
20421 if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
20423 /* PR59482: enter the class scope so that base-specifiers are looked
20424 up correctly. */
20425 if (type)
20426 pushclass (type);
20427 bases = cp_parser_base_clause (parser);
20428 /* PR59482: get out of the previously pushed class scope so that the
20429 subsequent pops pop the right thing. */
20430 if (type)
20431 popclass ();
20433 else
20434 bases = NULL_TREE;
20436 /* If we're really defining a class, process the base classes.
20437 If they're invalid, fail. */
20438 if (type && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
20439 && !xref_basetypes (type, bases))
20440 type = NULL_TREE;
20442 done:
20443 /* Leave the scope given by the nested-name-specifier. We will
20444 enter the class scope itself while processing the members. */
20445 if (pushed_scope)
20446 pop_scope (pushed_scope);
20448 if (invalid_explicit_specialization_p)
20450 end_specialization ();
20451 --parser->num_template_parameter_lists;
20454 if (type)
20455 DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
20456 if (type && (virt_specifiers & VIRT_SPEC_FINAL))
20457 CLASSTYPE_FINAL (type) = 1;
20458 out:
20459 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
20460 return type;
20463 /* Parse a class-key.
20465 class-key:
20466 class
20467 struct
20468 union
20470 Returns the kind of class-key specified, or none_type to indicate
20471 error. */
20473 static enum tag_types
20474 cp_parser_class_key (cp_parser* parser)
20476 cp_token *token;
20477 enum tag_types tag_type;
20479 /* Look for the class-key. */
20480 token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_KEY);
20481 if (!token)
20482 return none_type;
20484 /* Check to see if the TOKEN is a class-key. */
20485 tag_type = cp_parser_token_is_class_key (token);
20486 if (!tag_type)
20487 cp_parser_error (parser, "expected class-key");
20488 return tag_type;
20491 /* Parse a type-parameter-key.
20493 type-parameter-key:
20494 class
20495 typename
20498 static void
20499 cp_parser_type_parameter_key (cp_parser* parser)
20501 /* Look for the type-parameter-key. */
20502 enum tag_types tag_type = none_type;
20503 cp_token *token = cp_lexer_peek_token (parser->lexer);
20504 if ((tag_type = cp_parser_token_is_type_parameter_key (token)) != none_type)
20506 cp_lexer_consume_token (parser->lexer);
20507 if (pedantic && tag_type == typename_type && cxx_dialect < cxx1z)
20508 /* typename is not allowed in a template template parameter
20509 by the standard until C++1Z. */
20510 pedwarn (token->location, OPT_Wpedantic,
20511 "ISO C++ forbids typename key in template template parameter;"
20512 " use -std=c++1z or -std=gnu++1z");
20514 else
20515 cp_parser_error (parser, "expected %<class%> or %<typename%>");
20517 return;
20520 /* Parse an (optional) member-specification.
20522 member-specification:
20523 member-declaration member-specification [opt]
20524 access-specifier : member-specification [opt] */
20526 static void
20527 cp_parser_member_specification_opt (cp_parser* parser)
20529 while (true)
20531 cp_token *token;
20532 enum rid keyword;
20534 /* Peek at the next token. */
20535 token = cp_lexer_peek_token (parser->lexer);
20536 /* If it's a `}', or EOF then we've seen all the members. */
20537 if (token->type == CPP_CLOSE_BRACE
20538 || token->type == CPP_EOF
20539 || token->type == CPP_PRAGMA_EOL)
20540 break;
20542 /* See if this token is a keyword. */
20543 keyword = token->keyword;
20544 switch (keyword)
20546 case RID_PUBLIC:
20547 case RID_PROTECTED:
20548 case RID_PRIVATE:
20549 /* Consume the access-specifier. */
20550 cp_lexer_consume_token (parser->lexer);
20551 /* Remember which access-specifier is active. */
20552 current_access_specifier = token->u.value;
20553 /* Look for the `:'. */
20554 cp_parser_require (parser, CPP_COLON, RT_COLON);
20555 break;
20557 default:
20558 /* Accept #pragmas at class scope. */
20559 if (token->type == CPP_PRAGMA)
20561 cp_parser_pragma (parser, pragma_member);
20562 break;
20565 /* Otherwise, the next construction must be a
20566 member-declaration. */
20567 cp_parser_member_declaration (parser);
20572 /* Parse a member-declaration.
20574 member-declaration:
20575 decl-specifier-seq [opt] member-declarator-list [opt] ;
20576 function-definition ; [opt]
20577 :: [opt] nested-name-specifier template [opt] unqualified-id ;
20578 using-declaration
20579 template-declaration
20580 alias-declaration
20582 member-declarator-list:
20583 member-declarator
20584 member-declarator-list , member-declarator
20586 member-declarator:
20587 declarator pure-specifier [opt]
20588 declarator constant-initializer [opt]
20589 identifier [opt] : constant-expression
20591 GNU Extensions:
20593 member-declaration:
20594 __extension__ member-declaration
20596 member-declarator:
20597 declarator attributes [opt] pure-specifier [opt]
20598 declarator attributes [opt] constant-initializer [opt]
20599 identifier [opt] attributes [opt] : constant-expression
20601 C++0x Extensions:
20603 member-declaration:
20604 static_assert-declaration */
20606 static void
20607 cp_parser_member_declaration (cp_parser* parser)
20609 cp_decl_specifier_seq decl_specifiers;
20610 tree prefix_attributes;
20611 tree decl;
20612 int declares_class_or_enum;
20613 bool friend_p;
20614 cp_token *token = NULL;
20615 cp_token *decl_spec_token_start = NULL;
20616 cp_token *initializer_token_start = NULL;
20617 int saved_pedantic;
20618 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
20620 /* Check for the `__extension__' keyword. */
20621 if (cp_parser_extension_opt (parser, &saved_pedantic))
20623 /* Recurse. */
20624 cp_parser_member_declaration (parser);
20625 /* Restore the old value of the PEDANTIC flag. */
20626 pedantic = saved_pedantic;
20628 return;
20631 /* Check for a template-declaration. */
20632 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
20634 /* An explicit specialization here is an error condition, and we
20635 expect the specialization handler to detect and report this. */
20636 if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
20637 && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
20638 cp_parser_explicit_specialization (parser);
20639 else
20640 cp_parser_template_declaration (parser, /*member_p=*/true);
20642 return;
20645 /* Check for a using-declaration. */
20646 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
20648 if (cxx_dialect < cxx11)
20650 /* Parse the using-declaration. */
20651 cp_parser_using_declaration (parser,
20652 /*access_declaration_p=*/false);
20653 return;
20655 else
20657 tree decl;
20658 bool alias_decl_expected;
20659 cp_parser_parse_tentatively (parser);
20660 decl = cp_parser_alias_declaration (parser);
20661 /* Note that if we actually see the '=' token after the
20662 identifier, cp_parser_alias_declaration commits the
20663 tentative parse. In that case, we really expects an
20664 alias-declaration. Otherwise, we expect a using
20665 declaration. */
20666 alias_decl_expected =
20667 !cp_parser_uncommitted_to_tentative_parse_p (parser);
20668 cp_parser_parse_definitely (parser);
20670 if (alias_decl_expected)
20671 finish_member_declaration (decl);
20672 else
20673 cp_parser_using_declaration (parser,
20674 /*access_declaration_p=*/false);
20675 return;
20679 /* Check for @defs. */
20680 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_DEFS))
20682 tree ivar, member;
20683 tree ivar_chains = cp_parser_objc_defs_expression (parser);
20684 ivar = ivar_chains;
20685 while (ivar)
20687 member = ivar;
20688 ivar = TREE_CHAIN (member);
20689 TREE_CHAIN (member) = NULL_TREE;
20690 finish_member_declaration (member);
20692 return;
20695 /* If the next token is `static_assert' we have a static assertion. */
20696 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC_ASSERT))
20698 cp_parser_static_assert (parser, /*member_p=*/true);
20699 return;
20702 parser->colon_corrects_to_scope_p = false;
20704 if (cp_parser_using_declaration (parser, /*access_declaration=*/true))
20705 goto out;
20707 /* Parse the decl-specifier-seq. */
20708 decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
20709 cp_parser_decl_specifier_seq (parser,
20710 CP_PARSER_FLAGS_OPTIONAL,
20711 &decl_specifiers,
20712 &declares_class_or_enum);
20713 /* Check for an invalid type-name. */
20714 if (!decl_specifiers.any_type_specifiers_p
20715 && cp_parser_parse_and_diagnose_invalid_type_name (parser))
20716 goto out;
20717 /* If there is no declarator, then the decl-specifier-seq should
20718 specify a type. */
20719 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
20721 /* If there was no decl-specifier-seq, and the next token is a
20722 `;', then we have something like:
20724 struct S { ; };
20726 [class.mem]
20728 Each member-declaration shall declare at least one member
20729 name of the class. */
20730 if (!decl_specifiers.any_specifiers_p)
20732 cp_token *token = cp_lexer_peek_token (parser->lexer);
20733 if (!in_system_header_at (token->location))
20734 pedwarn (token->location, OPT_Wpedantic, "extra %<;%>");
20736 else
20738 tree type;
20740 /* See if this declaration is a friend. */
20741 friend_p = cp_parser_friend_p (&decl_specifiers);
20742 /* If there were decl-specifiers, check to see if there was
20743 a class-declaration. */
20744 type = check_tag_decl (&decl_specifiers,
20745 /*explicit_type_instantiation_p=*/false);
20746 /* Nested classes have already been added to the class, but
20747 a `friend' needs to be explicitly registered. */
20748 if (friend_p)
20750 /* If the `friend' keyword was present, the friend must
20751 be introduced with a class-key. */
20752 if (!declares_class_or_enum && cxx_dialect < cxx11)
20753 pedwarn (decl_spec_token_start->location, OPT_Wpedantic,
20754 "in C++03 a class-key must be used "
20755 "when declaring a friend");
20756 /* In this case:
20758 template <typename T> struct A {
20759 friend struct A<T>::B;
20762 A<T>::B will be represented by a TYPENAME_TYPE, and
20763 therefore not recognized by check_tag_decl. */
20764 if (!type)
20766 type = decl_specifiers.type;
20767 if (type && TREE_CODE (type) == TYPE_DECL)
20768 type = TREE_TYPE (type);
20770 if (!type || !TYPE_P (type))
20771 error_at (decl_spec_token_start->location,
20772 "friend declaration does not name a class or "
20773 "function");
20774 else
20775 make_friend_class (current_class_type, type,
20776 /*complain=*/true);
20778 /* If there is no TYPE, an error message will already have
20779 been issued. */
20780 else if (!type || type == error_mark_node)
20782 /* An anonymous aggregate has to be handled specially; such
20783 a declaration really declares a data member (with a
20784 particular type), as opposed to a nested class. */
20785 else if (ANON_AGGR_TYPE_P (type))
20787 /* C++11 9.5/6. */
20788 if (decl_specifiers.storage_class != sc_none)
20789 error_at (decl_spec_token_start->location,
20790 "a storage class on an anonymous aggregate "
20791 "in class scope is not allowed");
20793 /* Remove constructors and such from TYPE, now that we
20794 know it is an anonymous aggregate. */
20795 fixup_anonymous_aggr (type);
20796 /* And make the corresponding data member. */
20797 decl = build_decl (decl_spec_token_start->location,
20798 FIELD_DECL, NULL_TREE, type);
20799 /* Add it to the class. */
20800 finish_member_declaration (decl);
20802 else
20803 cp_parser_check_access_in_redeclaration
20804 (TYPE_NAME (type),
20805 decl_spec_token_start->location);
20808 else
20810 bool assume_semicolon = false;
20812 /* Clear attributes from the decl_specifiers but keep them
20813 around as prefix attributes that apply them to the entity
20814 being declared. */
20815 prefix_attributes = decl_specifiers.attributes;
20816 decl_specifiers.attributes = NULL_TREE;
20818 /* See if these declarations will be friends. */
20819 friend_p = cp_parser_friend_p (&decl_specifiers);
20821 /* Keep going until we hit the `;' at the end of the
20822 declaration. */
20823 while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
20825 tree attributes = NULL_TREE;
20826 tree first_attribute;
20828 /* Peek at the next token. */
20829 token = cp_lexer_peek_token (parser->lexer);
20831 /* Check for a bitfield declaration. */
20832 if (token->type == CPP_COLON
20833 || (token->type == CPP_NAME
20834 && cp_lexer_peek_nth_token (parser->lexer, 2)->type
20835 == CPP_COLON))
20837 tree identifier;
20838 tree width;
20840 /* Get the name of the bitfield. Note that we cannot just
20841 check TOKEN here because it may have been invalidated by
20842 the call to cp_lexer_peek_nth_token above. */
20843 if (cp_lexer_peek_token (parser->lexer)->type != CPP_COLON)
20844 identifier = cp_parser_identifier (parser);
20845 else
20846 identifier = NULL_TREE;
20848 /* Consume the `:' token. */
20849 cp_lexer_consume_token (parser->lexer);
20850 /* Get the width of the bitfield. */
20851 width
20852 = cp_parser_constant_expression (parser);
20854 /* Look for attributes that apply to the bitfield. */
20855 attributes = cp_parser_attributes_opt (parser);
20856 /* Remember which attributes are prefix attributes and
20857 which are not. */
20858 first_attribute = attributes;
20859 /* Combine the attributes. */
20860 attributes = chainon (prefix_attributes, attributes);
20862 /* Create the bitfield declaration. */
20863 decl = grokbitfield (identifier
20864 ? make_id_declarator (NULL_TREE,
20865 identifier,
20866 sfk_none)
20867 : NULL,
20868 &decl_specifiers,
20869 width,
20870 attributes);
20872 else
20874 cp_declarator *declarator;
20875 tree initializer;
20876 tree asm_specification;
20877 int ctor_dtor_or_conv_p;
20879 /* Parse the declarator. */
20880 declarator
20881 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
20882 &ctor_dtor_or_conv_p,
20883 /*parenthesized_p=*/NULL,
20884 /*member_p=*/true,
20885 friend_p);
20887 /* If something went wrong parsing the declarator, make sure
20888 that we at least consume some tokens. */
20889 if (declarator == cp_error_declarator)
20891 /* Skip to the end of the statement. */
20892 cp_parser_skip_to_end_of_statement (parser);
20893 /* If the next token is not a semicolon, that is
20894 probably because we just skipped over the body of
20895 a function. So, we consume a semicolon if
20896 present, but do not issue an error message if it
20897 is not present. */
20898 if (cp_lexer_next_token_is (parser->lexer,
20899 CPP_SEMICOLON))
20900 cp_lexer_consume_token (parser->lexer);
20901 goto out;
20904 if (declares_class_or_enum & 2)
20905 cp_parser_check_for_definition_in_return_type
20906 (declarator, decl_specifiers.type,
20907 decl_specifiers.locations[ds_type_spec]);
20909 /* Look for an asm-specification. */
20910 asm_specification = cp_parser_asm_specification_opt (parser);
20911 /* Look for attributes that apply to the declaration. */
20912 attributes = cp_parser_attributes_opt (parser);
20913 /* Remember which attributes are prefix attributes and
20914 which are not. */
20915 first_attribute = attributes;
20916 /* Combine the attributes. */
20917 attributes = chainon (prefix_attributes, attributes);
20919 /* If it's an `=', then we have a constant-initializer or a
20920 pure-specifier. It is not correct to parse the
20921 initializer before registering the member declaration
20922 since the member declaration should be in scope while
20923 its initializer is processed. However, the rest of the
20924 front end does not yet provide an interface that allows
20925 us to handle this correctly. */
20926 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
20928 /* In [class.mem]:
20930 A pure-specifier shall be used only in the declaration of
20931 a virtual function.
20933 A member-declarator can contain a constant-initializer
20934 only if it declares a static member of integral or
20935 enumeration type.
20937 Therefore, if the DECLARATOR is for a function, we look
20938 for a pure-specifier; otherwise, we look for a
20939 constant-initializer. When we call `grokfield', it will
20940 perform more stringent semantics checks. */
20941 initializer_token_start = cp_lexer_peek_token (parser->lexer);
20942 if (function_declarator_p (declarator)
20943 || (decl_specifiers.type
20944 && TREE_CODE (decl_specifiers.type) == TYPE_DECL
20945 && declarator->kind == cdk_id
20946 && (TREE_CODE (TREE_TYPE (decl_specifiers.type))
20947 == FUNCTION_TYPE)))
20948 initializer = cp_parser_pure_specifier (parser);
20949 else if (decl_specifiers.storage_class != sc_static)
20950 initializer = cp_parser_save_nsdmi (parser);
20951 else if (cxx_dialect >= cxx11)
20953 bool nonconst;
20954 /* Don't require a constant rvalue in C++11, since we
20955 might want a reference constant. We'll enforce
20956 constancy later. */
20957 cp_lexer_consume_token (parser->lexer);
20958 /* Parse the initializer. */
20959 initializer = cp_parser_initializer_clause (parser,
20960 &nonconst);
20962 else
20963 /* Parse the initializer. */
20964 initializer = cp_parser_constant_initializer (parser);
20966 else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
20967 && !function_declarator_p (declarator))
20969 bool x;
20970 if (decl_specifiers.storage_class != sc_static)
20971 initializer = cp_parser_save_nsdmi (parser);
20972 else
20973 initializer = cp_parser_initializer (parser, &x, &x);
20975 /* Otherwise, there is no initializer. */
20976 else
20977 initializer = NULL_TREE;
20979 /* See if we are probably looking at a function
20980 definition. We are certainly not looking at a
20981 member-declarator. Calling `grokfield' has
20982 side-effects, so we must not do it unless we are sure
20983 that we are looking at a member-declarator. */
20984 if (cp_parser_token_starts_function_definition_p
20985 (cp_lexer_peek_token (parser->lexer)))
20987 /* The grammar does not allow a pure-specifier to be
20988 used when a member function is defined. (It is
20989 possible that this fact is an oversight in the
20990 standard, since a pure function may be defined
20991 outside of the class-specifier. */
20992 if (initializer && initializer_token_start)
20993 error_at (initializer_token_start->location,
20994 "pure-specifier on function-definition");
20995 decl = cp_parser_save_member_function_body (parser,
20996 &decl_specifiers,
20997 declarator,
20998 attributes);
20999 if (parser->fully_implicit_function_template_p)
21000 decl = finish_fully_implicit_template (parser, decl);
21001 /* If the member was not a friend, declare it here. */
21002 if (!friend_p)
21003 finish_member_declaration (decl);
21004 /* Peek at the next token. */
21005 token = cp_lexer_peek_token (parser->lexer);
21006 /* If the next token is a semicolon, consume it. */
21007 if (token->type == CPP_SEMICOLON)
21008 cp_lexer_consume_token (parser->lexer);
21009 goto out;
21011 else
21012 if (declarator->kind == cdk_function)
21013 declarator->id_loc = token->location;
21014 /* Create the declaration. */
21015 decl = grokfield (declarator, &decl_specifiers,
21016 initializer, /*init_const_expr_p=*/true,
21017 asm_specification, attributes);
21018 if (parser->fully_implicit_function_template_p)
21020 if (friend_p)
21021 finish_fully_implicit_template (parser, 0);
21022 else
21023 decl = finish_fully_implicit_template (parser, decl);
21027 cp_finalize_omp_declare_simd (parser, decl);
21029 /* Reset PREFIX_ATTRIBUTES. */
21030 while (attributes && TREE_CHAIN (attributes) != first_attribute)
21031 attributes = TREE_CHAIN (attributes);
21032 if (attributes)
21033 TREE_CHAIN (attributes) = NULL_TREE;
21035 /* If there is any qualification still in effect, clear it
21036 now; we will be starting fresh with the next declarator. */
21037 parser->scope = NULL_TREE;
21038 parser->qualifying_scope = NULL_TREE;
21039 parser->object_scope = NULL_TREE;
21040 /* If it's a `,', then there are more declarators. */
21041 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
21043 cp_lexer_consume_token (parser->lexer);
21044 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
21046 cp_token *token = cp_lexer_previous_token (parser->lexer);
21047 error_at (token->location,
21048 "stray %<,%> at end of member declaration");
21051 /* If the next token isn't a `;', then we have a parse error. */
21052 else if (cp_lexer_next_token_is_not (parser->lexer,
21053 CPP_SEMICOLON))
21055 /* The next token might be a ways away from where the
21056 actual semicolon is missing. Find the previous token
21057 and use that for our error position. */
21058 cp_token *token = cp_lexer_previous_token (parser->lexer);
21059 error_at (token->location,
21060 "expected %<;%> at end of member declaration");
21062 /* Assume that the user meant to provide a semicolon. If
21063 we were to cp_parser_skip_to_end_of_statement, we might
21064 skip to a semicolon inside a member function definition
21065 and issue nonsensical error messages. */
21066 assume_semicolon = true;
21069 if (decl)
21071 /* Add DECL to the list of members. */
21072 if (!friend_p)
21073 finish_member_declaration (decl);
21075 if (TREE_CODE (decl) == FUNCTION_DECL)
21076 cp_parser_save_default_args (parser, decl);
21077 else if (TREE_CODE (decl) == FIELD_DECL
21078 && !DECL_C_BIT_FIELD (decl)
21079 && DECL_INITIAL (decl))
21080 /* Add DECL to the queue of NSDMI to be parsed later. */
21081 vec_safe_push (unparsed_nsdmis, decl);
21084 if (assume_semicolon)
21085 goto out;
21089 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
21090 out:
21091 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
21094 /* Parse a pure-specifier.
21096 pure-specifier:
21099 Returns INTEGER_ZERO_NODE if a pure specifier is found.
21100 Otherwise, ERROR_MARK_NODE is returned. */
21102 static tree
21103 cp_parser_pure_specifier (cp_parser* parser)
21105 cp_token *token;
21107 /* Look for the `=' token. */
21108 if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
21109 return error_mark_node;
21110 /* Look for the `0' token. */
21111 token = cp_lexer_peek_token (parser->lexer);
21113 if (token->type == CPP_EOF
21114 || token->type == CPP_PRAGMA_EOL)
21115 return error_mark_node;
21117 cp_lexer_consume_token (parser->lexer);
21119 /* Accept = default or = delete in c++0x mode. */
21120 if (token->keyword == RID_DEFAULT
21121 || token->keyword == RID_DELETE)
21123 maybe_warn_cpp0x (CPP0X_DEFAULTED_DELETED);
21124 return token->u.value;
21127 /* c_lex_with_flags marks a single digit '0' with PURE_ZERO. */
21128 if (token->type != CPP_NUMBER || !(token->flags & PURE_ZERO))
21130 cp_parser_error (parser,
21131 "invalid pure specifier (only %<= 0%> is allowed)");
21132 cp_parser_skip_to_end_of_statement (parser);
21133 return error_mark_node;
21135 if (PROCESSING_REAL_TEMPLATE_DECL_P ())
21137 error_at (token->location, "templates may not be %<virtual%>");
21138 return error_mark_node;
21141 return integer_zero_node;
21144 /* Parse a constant-initializer.
21146 constant-initializer:
21147 = constant-expression
21149 Returns a representation of the constant-expression. */
21151 static tree
21152 cp_parser_constant_initializer (cp_parser* parser)
21154 /* Look for the `=' token. */
21155 if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
21156 return error_mark_node;
21158 /* It is invalid to write:
21160 struct S { static const int i = { 7 }; };
21163 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
21165 cp_parser_error (parser,
21166 "a brace-enclosed initializer is not allowed here");
21167 /* Consume the opening brace. */
21168 cp_lexer_consume_token (parser->lexer);
21169 /* Skip the initializer. */
21170 cp_parser_skip_to_closing_brace (parser);
21171 /* Look for the trailing `}'. */
21172 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
21174 return error_mark_node;
21177 return cp_parser_constant_expression (parser);
21180 /* Derived classes [gram.class.derived] */
21182 /* Parse a base-clause.
21184 base-clause:
21185 : base-specifier-list
21187 base-specifier-list:
21188 base-specifier ... [opt]
21189 base-specifier-list , base-specifier ... [opt]
21191 Returns a TREE_LIST representing the base-classes, in the order in
21192 which they were declared. The representation of each node is as
21193 described by cp_parser_base_specifier.
21195 In the case that no bases are specified, this function will return
21196 NULL_TREE, not ERROR_MARK_NODE. */
21198 static tree
21199 cp_parser_base_clause (cp_parser* parser)
21201 tree bases = NULL_TREE;
21203 /* Look for the `:' that begins the list. */
21204 cp_parser_require (parser, CPP_COLON, RT_COLON);
21206 /* Scan the base-specifier-list. */
21207 while (true)
21209 cp_token *token;
21210 tree base;
21211 bool pack_expansion_p = false;
21213 /* Look for the base-specifier. */
21214 base = cp_parser_base_specifier (parser);
21215 /* Look for the (optional) ellipsis. */
21216 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
21218 /* Consume the `...'. */
21219 cp_lexer_consume_token (parser->lexer);
21221 pack_expansion_p = true;
21224 /* Add BASE to the front of the list. */
21225 if (base && base != error_mark_node)
21227 if (pack_expansion_p)
21228 /* Make this a pack expansion type. */
21229 TREE_VALUE (base) = make_pack_expansion (TREE_VALUE (base));
21231 if (!check_for_bare_parameter_packs (TREE_VALUE (base)))
21233 TREE_CHAIN (base) = bases;
21234 bases = base;
21237 /* Peek at the next token. */
21238 token = cp_lexer_peek_token (parser->lexer);
21239 /* If it's not a comma, then the list is complete. */
21240 if (token->type != CPP_COMMA)
21241 break;
21242 /* Consume the `,'. */
21243 cp_lexer_consume_token (parser->lexer);
21246 /* PARSER->SCOPE may still be non-NULL at this point, if the last
21247 base class had a qualified name. However, the next name that
21248 appears is certainly not qualified. */
21249 parser->scope = NULL_TREE;
21250 parser->qualifying_scope = NULL_TREE;
21251 parser->object_scope = NULL_TREE;
21253 return nreverse (bases);
21256 /* Parse a base-specifier.
21258 base-specifier:
21259 :: [opt] nested-name-specifier [opt] class-name
21260 virtual access-specifier [opt] :: [opt] nested-name-specifier
21261 [opt] class-name
21262 access-specifier virtual [opt] :: [opt] nested-name-specifier
21263 [opt] class-name
21265 Returns a TREE_LIST. The TREE_PURPOSE will be one of
21266 ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
21267 indicate the specifiers provided. The TREE_VALUE will be a TYPE
21268 (or the ERROR_MARK_NODE) indicating the type that was specified. */
21270 static tree
21271 cp_parser_base_specifier (cp_parser* parser)
21273 cp_token *token;
21274 bool done = false;
21275 bool virtual_p = false;
21276 bool duplicate_virtual_error_issued_p = false;
21277 bool duplicate_access_error_issued_p = false;
21278 bool class_scope_p, template_p;
21279 tree access = access_default_node;
21280 tree type;
21282 /* Process the optional `virtual' and `access-specifier'. */
21283 while (!done)
21285 /* Peek at the next token. */
21286 token = cp_lexer_peek_token (parser->lexer);
21287 /* Process `virtual'. */
21288 switch (token->keyword)
21290 case RID_VIRTUAL:
21291 /* If `virtual' appears more than once, issue an error. */
21292 if (virtual_p && !duplicate_virtual_error_issued_p)
21294 cp_parser_error (parser,
21295 "%<virtual%> specified more than once in base-specified");
21296 duplicate_virtual_error_issued_p = true;
21299 virtual_p = true;
21301 /* Consume the `virtual' token. */
21302 cp_lexer_consume_token (parser->lexer);
21304 break;
21306 case RID_PUBLIC:
21307 case RID_PROTECTED:
21308 case RID_PRIVATE:
21309 /* If more than one access specifier appears, issue an
21310 error. */
21311 if (access != access_default_node
21312 && !duplicate_access_error_issued_p)
21314 cp_parser_error (parser,
21315 "more than one access specifier in base-specified");
21316 duplicate_access_error_issued_p = true;
21319 access = ridpointers[(int) token->keyword];
21321 /* Consume the access-specifier. */
21322 cp_lexer_consume_token (parser->lexer);
21324 break;
21326 default:
21327 done = true;
21328 break;
21331 /* It is not uncommon to see programs mechanically, erroneously, use
21332 the 'typename' keyword to denote (dependent) qualified types
21333 as base classes. */
21334 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
21336 token = cp_lexer_peek_token (parser->lexer);
21337 if (!processing_template_decl)
21338 error_at (token->location,
21339 "keyword %<typename%> not allowed outside of templates");
21340 else
21341 error_at (token->location,
21342 "keyword %<typename%> not allowed in this context "
21343 "(the base class is implicitly a type)");
21344 cp_lexer_consume_token (parser->lexer);
21347 /* Look for the optional `::' operator. */
21348 cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
21349 /* Look for the nested-name-specifier. The simplest way to
21350 implement:
21352 [temp.res]
21354 The keyword `typename' is not permitted in a base-specifier or
21355 mem-initializer; in these contexts a qualified name that
21356 depends on a template-parameter is implicitly assumed to be a
21357 type name.
21359 is to pretend that we have seen the `typename' keyword at this
21360 point. */
21361 cp_parser_nested_name_specifier_opt (parser,
21362 /*typename_keyword_p=*/true,
21363 /*check_dependency_p=*/true,
21364 typename_type,
21365 /*is_declaration=*/true);
21366 /* If the base class is given by a qualified name, assume that names
21367 we see are type names or templates, as appropriate. */
21368 class_scope_p = (parser->scope && TYPE_P (parser->scope));
21369 template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
21371 if (!parser->scope
21372 && cp_lexer_next_token_is_decltype (parser->lexer))
21373 /* DR 950 allows decltype as a base-specifier. */
21374 type = cp_parser_decltype (parser);
21375 else
21377 /* Otherwise, look for the class-name. */
21378 type = cp_parser_class_name (parser,
21379 class_scope_p,
21380 template_p,
21381 typename_type,
21382 /*check_dependency_p=*/true,
21383 /*class_head_p=*/false,
21384 /*is_declaration=*/true);
21385 type = TREE_TYPE (type);
21388 if (type == error_mark_node)
21389 return error_mark_node;
21391 return finish_base_specifier (type, access, virtual_p);
21394 /* Exception handling [gram.exception] */
21396 /* Parse an (optional) noexcept-specification.
21398 noexcept-specification:
21399 noexcept ( constant-expression ) [opt]
21401 If no noexcept-specification is present, returns NULL_TREE.
21402 Otherwise, if REQUIRE_CONSTEXPR is false, then either parse and return any
21403 expression if parentheses follow noexcept, or return BOOLEAN_TRUE_NODE if
21404 there are no parentheses. CONSUMED_EXPR will be set accordingly.
21405 Otherwise, returns a noexcept specification unless RETURN_COND is true,
21406 in which case a boolean condition is returned instead. */
21408 static tree
21409 cp_parser_noexcept_specification_opt (cp_parser* parser,
21410 bool require_constexpr,
21411 bool* consumed_expr,
21412 bool return_cond)
21414 cp_token *token;
21415 const char *saved_message;
21417 /* Peek at the next token. */
21418 token = cp_lexer_peek_token (parser->lexer);
21420 /* Is it a noexcept-specification? */
21421 if (cp_parser_is_keyword (token, RID_NOEXCEPT))
21423 tree expr;
21424 cp_lexer_consume_token (parser->lexer);
21426 if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
21428 cp_lexer_consume_token (parser->lexer);
21430 if (require_constexpr)
21432 /* Types may not be defined in an exception-specification. */
21433 saved_message = parser->type_definition_forbidden_message;
21434 parser->type_definition_forbidden_message
21435 = G_("types may not be defined in an exception-specification");
21437 expr = cp_parser_constant_expression (parser);
21439 /* Restore the saved message. */
21440 parser->type_definition_forbidden_message = saved_message;
21442 else
21444 expr = cp_parser_expression (parser);
21445 *consumed_expr = true;
21448 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21450 else
21452 expr = boolean_true_node;
21453 if (!require_constexpr)
21454 *consumed_expr = false;
21457 /* We cannot build a noexcept-spec right away because this will check
21458 that expr is a constexpr. */
21459 if (!return_cond)
21460 return build_noexcept_spec (expr, tf_warning_or_error);
21461 else
21462 return expr;
21464 else
21465 return NULL_TREE;
21468 /* Parse an (optional) exception-specification.
21470 exception-specification:
21471 throw ( type-id-list [opt] )
21473 Returns a TREE_LIST representing the exception-specification. The
21474 TREE_VALUE of each node is a type. */
21476 static tree
21477 cp_parser_exception_specification_opt (cp_parser* parser)
21479 cp_token *token;
21480 tree type_id_list;
21481 const char *saved_message;
21483 /* Peek at the next token. */
21484 token = cp_lexer_peek_token (parser->lexer);
21486 /* Is it a noexcept-specification? */
21487 type_id_list = cp_parser_noexcept_specification_opt(parser, true, NULL,
21488 false);
21489 if (type_id_list != NULL_TREE)
21490 return type_id_list;
21492 /* If it's not `throw', then there's no exception-specification. */
21493 if (!cp_parser_is_keyword (token, RID_THROW))
21494 return NULL_TREE;
21496 #if 0
21497 /* Enable this once a lot of code has transitioned to noexcept? */
21498 if (cxx_dialect >= cxx11 && !in_system_header_at (input_location))
21499 warning (OPT_Wdeprecated, "dynamic exception specifications are "
21500 "deprecated in C++0x; use %<noexcept%> instead");
21501 #endif
21503 /* Consume the `throw'. */
21504 cp_lexer_consume_token (parser->lexer);
21506 /* Look for the `('. */
21507 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21509 /* Peek at the next token. */
21510 token = cp_lexer_peek_token (parser->lexer);
21511 /* If it's not a `)', then there is a type-id-list. */
21512 if (token->type != CPP_CLOSE_PAREN)
21514 /* Types may not be defined in an exception-specification. */
21515 saved_message = parser->type_definition_forbidden_message;
21516 parser->type_definition_forbidden_message
21517 = G_("types may not be defined in an exception-specification");
21518 /* Parse the type-id-list. */
21519 type_id_list = cp_parser_type_id_list (parser);
21520 /* Restore the saved message. */
21521 parser->type_definition_forbidden_message = saved_message;
21523 else
21524 type_id_list = empty_except_spec;
21526 /* Look for the `)'. */
21527 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21529 return type_id_list;
21532 /* Parse an (optional) type-id-list.
21534 type-id-list:
21535 type-id ... [opt]
21536 type-id-list , type-id ... [opt]
21538 Returns a TREE_LIST. The TREE_VALUE of each node is a TYPE,
21539 in the order that the types were presented. */
21541 static tree
21542 cp_parser_type_id_list (cp_parser* parser)
21544 tree types = NULL_TREE;
21546 while (true)
21548 cp_token *token;
21549 tree type;
21551 /* Get the next type-id. */
21552 type = cp_parser_type_id (parser);
21553 /* Parse the optional ellipsis. */
21554 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
21556 /* Consume the `...'. */
21557 cp_lexer_consume_token (parser->lexer);
21559 /* Turn the type into a pack expansion expression. */
21560 type = make_pack_expansion (type);
21562 /* Add it to the list. */
21563 types = add_exception_specifier (types, type, /*complain=*/1);
21564 /* Peek at the next token. */
21565 token = cp_lexer_peek_token (parser->lexer);
21566 /* If it is not a `,', we are done. */
21567 if (token->type != CPP_COMMA)
21568 break;
21569 /* Consume the `,'. */
21570 cp_lexer_consume_token (parser->lexer);
21573 return nreverse (types);
21576 /* Parse a try-block.
21578 try-block:
21579 try compound-statement handler-seq */
21581 static tree
21582 cp_parser_try_block (cp_parser* parser)
21584 tree try_block;
21586 cp_parser_require_keyword (parser, RID_TRY, RT_TRY);
21587 if (parser->in_function_body
21588 && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
21589 error ("%<try%> in %<constexpr%> function");
21591 try_block = begin_try_block ();
21592 cp_parser_compound_statement (parser, NULL, true, false);
21593 finish_try_block (try_block);
21594 cp_parser_handler_seq (parser);
21595 finish_handler_sequence (try_block);
21597 return try_block;
21600 /* Parse a function-try-block.
21602 function-try-block:
21603 try ctor-initializer [opt] function-body handler-seq */
21605 static bool
21606 cp_parser_function_try_block (cp_parser* parser)
21608 tree compound_stmt;
21609 tree try_block;
21610 bool ctor_initializer_p;
21612 /* Look for the `try' keyword. */
21613 if (!cp_parser_require_keyword (parser, RID_TRY, RT_TRY))
21614 return false;
21615 /* Let the rest of the front end know where we are. */
21616 try_block = begin_function_try_block (&compound_stmt);
21617 /* Parse the function-body. */
21618 ctor_initializer_p = cp_parser_ctor_initializer_opt_and_function_body
21619 (parser, /*in_function_try_block=*/true);
21620 /* We're done with the `try' part. */
21621 finish_function_try_block (try_block);
21622 /* Parse the handlers. */
21623 cp_parser_handler_seq (parser);
21624 /* We're done with the handlers. */
21625 finish_function_handler_sequence (try_block, compound_stmt);
21627 return ctor_initializer_p;
21630 /* Parse a handler-seq.
21632 handler-seq:
21633 handler handler-seq [opt] */
21635 static void
21636 cp_parser_handler_seq (cp_parser* parser)
21638 while (true)
21640 cp_token *token;
21642 /* Parse the handler. */
21643 cp_parser_handler (parser);
21644 /* Peek at the next token. */
21645 token = cp_lexer_peek_token (parser->lexer);
21646 /* If it's not `catch' then there are no more handlers. */
21647 if (!cp_parser_is_keyword (token, RID_CATCH))
21648 break;
21652 /* Parse a handler.
21654 handler:
21655 catch ( exception-declaration ) compound-statement */
21657 static void
21658 cp_parser_handler (cp_parser* parser)
21660 tree handler;
21661 tree declaration;
21663 cp_parser_require_keyword (parser, RID_CATCH, RT_CATCH);
21664 handler = begin_handler ();
21665 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21666 declaration = cp_parser_exception_declaration (parser);
21667 finish_handler_parms (declaration, handler);
21668 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21669 cp_parser_compound_statement (parser, NULL, false, false);
21670 finish_handler (handler);
21673 /* Parse an exception-declaration.
21675 exception-declaration:
21676 type-specifier-seq declarator
21677 type-specifier-seq abstract-declarator
21678 type-specifier-seq
21681 Returns a VAR_DECL for the declaration, or NULL_TREE if the
21682 ellipsis variant is used. */
21684 static tree
21685 cp_parser_exception_declaration (cp_parser* parser)
21687 cp_decl_specifier_seq type_specifiers;
21688 cp_declarator *declarator;
21689 const char *saved_message;
21691 /* If it's an ellipsis, it's easy to handle. */
21692 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
21694 /* Consume the `...' token. */
21695 cp_lexer_consume_token (parser->lexer);
21696 return NULL_TREE;
21699 /* Types may not be defined in exception-declarations. */
21700 saved_message = parser->type_definition_forbidden_message;
21701 parser->type_definition_forbidden_message
21702 = G_("types may not be defined in exception-declarations");
21704 /* Parse the type-specifier-seq. */
21705 cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
21706 /*is_trailing_return=*/false,
21707 &type_specifiers);
21708 /* If it's a `)', then there is no declarator. */
21709 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
21710 declarator = NULL;
21711 else
21712 declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_EITHER,
21713 /*ctor_dtor_or_conv_p=*/NULL,
21714 /*parenthesized_p=*/NULL,
21715 /*member_p=*/false,
21716 /*friend_p=*/false);
21718 /* Restore the saved message. */
21719 parser->type_definition_forbidden_message = saved_message;
21721 if (!type_specifiers.any_specifiers_p)
21722 return error_mark_node;
21724 return grokdeclarator (declarator, &type_specifiers, CATCHPARM, 1, NULL);
21727 /* Parse a throw-expression.
21729 throw-expression:
21730 throw assignment-expression [opt]
21732 Returns a THROW_EXPR representing the throw-expression. */
21734 static tree
21735 cp_parser_throw_expression (cp_parser* parser)
21737 tree expression;
21738 cp_token* token;
21740 cp_parser_require_keyword (parser, RID_THROW, RT_THROW);
21741 token = cp_lexer_peek_token (parser->lexer);
21742 /* Figure out whether or not there is an assignment-expression
21743 following the "throw" keyword. */
21744 if (token->type == CPP_COMMA
21745 || token->type == CPP_SEMICOLON
21746 || token->type == CPP_CLOSE_PAREN
21747 || token->type == CPP_CLOSE_SQUARE
21748 || token->type == CPP_CLOSE_BRACE
21749 || token->type == CPP_COLON)
21750 expression = NULL_TREE;
21751 else
21752 expression = cp_parser_assignment_expression (parser);
21754 return build_throw (expression);
21757 /* GNU Extensions */
21759 /* Parse an (optional) asm-specification.
21761 asm-specification:
21762 asm ( string-literal )
21764 If the asm-specification is present, returns a STRING_CST
21765 corresponding to the string-literal. Otherwise, returns
21766 NULL_TREE. */
21768 static tree
21769 cp_parser_asm_specification_opt (cp_parser* parser)
21771 cp_token *token;
21772 tree asm_specification;
21774 /* Peek at the next token. */
21775 token = cp_lexer_peek_token (parser->lexer);
21776 /* If the next token isn't the `asm' keyword, then there's no
21777 asm-specification. */
21778 if (!cp_parser_is_keyword (token, RID_ASM))
21779 return NULL_TREE;
21781 /* Consume the `asm' token. */
21782 cp_lexer_consume_token (parser->lexer);
21783 /* Look for the `('. */
21784 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21786 /* Look for the string-literal. */
21787 asm_specification = cp_parser_string_literal (parser, false, false);
21789 /* Look for the `)'. */
21790 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21792 return asm_specification;
21795 /* Parse an asm-operand-list.
21797 asm-operand-list:
21798 asm-operand
21799 asm-operand-list , asm-operand
21801 asm-operand:
21802 string-literal ( expression )
21803 [ string-literal ] string-literal ( expression )
21805 Returns a TREE_LIST representing the operands. The TREE_VALUE of
21806 each node is the expression. The TREE_PURPOSE is itself a
21807 TREE_LIST whose TREE_PURPOSE is a STRING_CST for the bracketed
21808 string-literal (or NULL_TREE if not present) and whose TREE_VALUE
21809 is a STRING_CST for the string literal before the parenthesis. Returns
21810 ERROR_MARK_NODE if any of the operands are invalid. */
21812 static tree
21813 cp_parser_asm_operand_list (cp_parser* parser)
21815 tree asm_operands = NULL_TREE;
21816 bool invalid_operands = false;
21818 while (true)
21820 tree string_literal;
21821 tree expression;
21822 tree name;
21824 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
21826 /* Consume the `[' token. */
21827 cp_lexer_consume_token (parser->lexer);
21828 /* Read the operand name. */
21829 name = cp_parser_identifier (parser);
21830 if (name != error_mark_node)
21831 name = build_string (IDENTIFIER_LENGTH (name),
21832 IDENTIFIER_POINTER (name));
21833 /* Look for the closing `]'. */
21834 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
21836 else
21837 name = NULL_TREE;
21838 /* Look for the string-literal. */
21839 string_literal = cp_parser_string_literal (parser, false, false);
21841 /* Look for the `('. */
21842 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21843 /* Parse the expression. */
21844 expression = cp_parser_expression (parser);
21845 /* Look for the `)'. */
21846 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21848 if (name == error_mark_node
21849 || string_literal == error_mark_node
21850 || expression == error_mark_node)
21851 invalid_operands = true;
21853 /* Add this operand to the list. */
21854 asm_operands = tree_cons (build_tree_list (name, string_literal),
21855 expression,
21856 asm_operands);
21857 /* If the next token is not a `,', there are no more
21858 operands. */
21859 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
21860 break;
21861 /* Consume the `,'. */
21862 cp_lexer_consume_token (parser->lexer);
21865 return invalid_operands ? error_mark_node : nreverse (asm_operands);
21868 /* Parse an asm-clobber-list.
21870 asm-clobber-list:
21871 string-literal
21872 asm-clobber-list , string-literal
21874 Returns a TREE_LIST, indicating the clobbers in the order that they
21875 appeared. The TREE_VALUE of each node is a STRING_CST. */
21877 static tree
21878 cp_parser_asm_clobber_list (cp_parser* parser)
21880 tree clobbers = NULL_TREE;
21882 while (true)
21884 tree string_literal;
21886 /* Look for the string literal. */
21887 string_literal = cp_parser_string_literal (parser, false, false);
21888 /* Add it to the list. */
21889 clobbers = tree_cons (NULL_TREE, string_literal, clobbers);
21890 /* If the next token is not a `,', then the list is
21891 complete. */
21892 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
21893 break;
21894 /* Consume the `,' token. */
21895 cp_lexer_consume_token (parser->lexer);
21898 return clobbers;
21901 /* Parse an asm-label-list.
21903 asm-label-list:
21904 identifier
21905 asm-label-list , identifier
21907 Returns a TREE_LIST, indicating the labels in the order that they
21908 appeared. The TREE_VALUE of each node is a label. */
21910 static tree
21911 cp_parser_asm_label_list (cp_parser* parser)
21913 tree labels = NULL_TREE;
21915 while (true)
21917 tree identifier, label, name;
21919 /* Look for the identifier. */
21920 identifier = cp_parser_identifier (parser);
21921 if (!error_operand_p (identifier))
21923 label = lookup_label (identifier);
21924 if (TREE_CODE (label) == LABEL_DECL)
21926 TREE_USED (label) = 1;
21927 check_goto (label);
21928 name = build_string (IDENTIFIER_LENGTH (identifier),
21929 IDENTIFIER_POINTER (identifier));
21930 labels = tree_cons (name, label, labels);
21933 /* If the next token is not a `,', then the list is
21934 complete. */
21935 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
21936 break;
21937 /* Consume the `,' token. */
21938 cp_lexer_consume_token (parser->lexer);
21941 return nreverse (labels);
21944 /* Return TRUE iff the next tokens in the stream are possibly the
21945 beginning of a GNU extension attribute. */
21947 static bool
21948 cp_next_tokens_can_be_gnu_attribute_p (cp_parser *parser)
21950 return cp_nth_tokens_can_be_gnu_attribute_p (parser, 1);
21953 /* Return TRUE iff the next tokens in the stream are possibly the
21954 beginning of a standard C++-11 attribute specifier. */
21956 static bool
21957 cp_next_tokens_can_be_std_attribute_p (cp_parser *parser)
21959 return cp_nth_tokens_can_be_std_attribute_p (parser, 1);
21962 /* Return TRUE iff the next Nth tokens in the stream are possibly the
21963 beginning of a standard C++-11 attribute specifier. */
21965 static bool
21966 cp_nth_tokens_can_be_std_attribute_p (cp_parser *parser, size_t n)
21968 cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
21970 return (cxx_dialect >= cxx11
21971 && ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
21972 || (token->type == CPP_OPEN_SQUARE
21973 && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
21974 && token->type == CPP_OPEN_SQUARE)));
21977 /* Return TRUE iff the next Nth tokens in the stream are possibly the
21978 beginning of a GNU extension attribute. */
21980 static bool
21981 cp_nth_tokens_can_be_gnu_attribute_p (cp_parser *parser, size_t n)
21983 cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
21985 return token->type == CPP_KEYWORD && token->keyword == RID_ATTRIBUTE;
21988 /* Return true iff the next tokens can be the beginning of either a
21989 GNU attribute list, or a standard C++11 attribute sequence. */
21991 static bool
21992 cp_next_tokens_can_be_attribute_p (cp_parser *parser)
21994 return (cp_next_tokens_can_be_gnu_attribute_p (parser)
21995 || cp_next_tokens_can_be_std_attribute_p (parser));
21998 /* Return true iff the next Nth tokens can be the beginning of either
21999 a GNU attribute list, or a standard C++11 attribute sequence. */
22001 static bool
22002 cp_nth_tokens_can_be_attribute_p (cp_parser *parser, size_t n)
22004 return (cp_nth_tokens_can_be_gnu_attribute_p (parser, n)
22005 || cp_nth_tokens_can_be_std_attribute_p (parser, n));
22008 /* Parse either a standard C++-11 attribute-specifier-seq, or a series
22009 of GNU attributes, or return NULL. */
22011 static tree
22012 cp_parser_attributes_opt (cp_parser *parser)
22014 if (cp_next_tokens_can_be_gnu_attribute_p (parser))
22015 return cp_parser_gnu_attributes_opt (parser);
22016 return cp_parser_std_attribute_spec_seq (parser);
22019 #define CILK_SIMD_FN_CLAUSE_MASK \
22020 ((OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_VECTORLENGTH) \
22021 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_LINEAR) \
22022 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_UNIFORM) \
22023 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_MASK) \
22024 | (OMP_CLAUSE_MASK_1 << PRAGMA_CILK_CLAUSE_NOMASK))
22026 /* Parses the Cilk Plus SIMD-enabled function's attribute. Syntax:
22027 vector [(<clauses>)] */
22029 static void
22030 cp_parser_cilk_simd_fn_vector_attrs (cp_parser *parser, cp_token *v_token)
22032 bool first_p = parser->cilk_simd_fn_info == NULL;
22033 cp_token *token = v_token;
22034 if (first_p)
22036 parser->cilk_simd_fn_info = XNEW (cp_omp_declare_simd_data);
22037 parser->cilk_simd_fn_info->error_seen = false;
22038 parser->cilk_simd_fn_info->fndecl_seen = false;
22039 parser->cilk_simd_fn_info->tokens = vNULL;
22041 int paren_scope = 0;
22042 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
22044 cp_lexer_consume_token (parser->lexer);
22045 v_token = cp_lexer_peek_token (parser->lexer);
22046 paren_scope++;
22048 while (paren_scope > 0)
22050 token = cp_lexer_peek_token (parser->lexer);
22051 if (token->type == CPP_OPEN_PAREN)
22052 paren_scope++;
22053 else if (token->type == CPP_CLOSE_PAREN)
22054 paren_scope--;
22055 /* Do not push the last ')' */
22056 if (!(token->type == CPP_CLOSE_PAREN && paren_scope == 0))
22057 cp_lexer_consume_token (parser->lexer);
22060 token->type = CPP_PRAGMA_EOL;
22061 parser->lexer->next_token = token;
22062 cp_lexer_consume_token (parser->lexer);
22064 struct cp_token_cache *cp
22065 = cp_token_cache_new (v_token, cp_lexer_peek_token (parser->lexer));
22066 parser->cilk_simd_fn_info->tokens.safe_push (cp);
22069 /* Parse an (optional) series of attributes.
22071 attributes:
22072 attributes attribute
22074 attribute:
22075 __attribute__ (( attribute-list [opt] ))
22077 The return value is as for cp_parser_gnu_attribute_list. */
22079 static tree
22080 cp_parser_gnu_attributes_opt (cp_parser* parser)
22082 tree attributes = NULL_TREE;
22084 while (true)
22086 cp_token *token;
22087 tree attribute_list;
22088 bool ok = true;
22090 /* Peek at the next token. */
22091 token = cp_lexer_peek_token (parser->lexer);
22092 /* If it's not `__attribute__', then we're done. */
22093 if (token->keyword != RID_ATTRIBUTE)
22094 break;
22096 /* Consume the `__attribute__' keyword. */
22097 cp_lexer_consume_token (parser->lexer);
22098 /* Look for the two `(' tokens. */
22099 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
22100 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
22102 /* Peek at the next token. */
22103 token = cp_lexer_peek_token (parser->lexer);
22104 if (token->type != CPP_CLOSE_PAREN)
22105 /* Parse the attribute-list. */
22106 attribute_list = cp_parser_gnu_attribute_list (parser);
22107 else
22108 /* If the next token is a `)', then there is no attribute
22109 list. */
22110 attribute_list = NULL;
22112 /* Look for the two `)' tokens. */
22113 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
22114 ok = false;
22115 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
22116 ok = false;
22117 if (!ok)
22118 cp_parser_skip_to_end_of_statement (parser);
22120 /* Add these new attributes to the list. */
22121 attributes = chainon (attributes, attribute_list);
22124 return attributes;
22127 /* Returns true of NAME is an IDENTIFIER_NODE with identiifer "vector,"
22128 "__vector" or "__vector__." */
22130 static inline bool
22131 is_cilkplus_vector_p (tree name)
22133 if (flag_cilkplus && is_attribute_p ("vector", name))
22134 return true;
22135 return false;
22138 /* Parse a GNU attribute-list.
22140 attribute-list:
22141 attribute
22142 attribute-list , attribute
22144 attribute:
22145 identifier
22146 identifier ( identifier )
22147 identifier ( identifier , expression-list )
22148 identifier ( expression-list )
22150 Returns a TREE_LIST, or NULL_TREE on error. Each node corresponds
22151 to an attribute. The TREE_PURPOSE of each node is the identifier
22152 indicating which attribute is in use. The TREE_VALUE represents
22153 the arguments, if any. */
22155 static tree
22156 cp_parser_gnu_attribute_list (cp_parser* parser)
22158 tree attribute_list = NULL_TREE;
22159 bool save_translate_strings_p = parser->translate_strings_p;
22161 parser->translate_strings_p = false;
22162 while (true)
22164 cp_token *token;
22165 tree identifier;
22166 tree attribute;
22168 /* Look for the identifier. We also allow keywords here; for
22169 example `__attribute__ ((const))' is legal. */
22170 token = cp_lexer_peek_token (parser->lexer);
22171 if (token->type == CPP_NAME
22172 || token->type == CPP_KEYWORD)
22174 tree arguments = NULL_TREE;
22176 /* Consume the token, but save it since we need it for the
22177 SIMD enabled function parsing. */
22178 cp_token *id_token = cp_lexer_consume_token (parser->lexer);
22180 /* Save away the identifier that indicates which attribute
22181 this is. */
22182 identifier = (token->type == CPP_KEYWORD)
22183 /* For keywords, use the canonical spelling, not the
22184 parsed identifier. */
22185 ? ridpointers[(int) token->keyword]
22186 : id_token->u.value;
22188 attribute = build_tree_list (identifier, NULL_TREE);
22190 /* Peek at the next token. */
22191 token = cp_lexer_peek_token (parser->lexer);
22192 /* If it's an `(', then parse the attribute arguments. */
22193 if (token->type == CPP_OPEN_PAREN)
22195 vec<tree, va_gc> *vec;
22196 int attr_flag = (attribute_takes_identifier_p (identifier)
22197 ? id_attr : normal_attr);
22198 if (is_cilkplus_vector_p (identifier))
22200 cp_parser_cilk_simd_fn_vector_attrs (parser, id_token);
22201 continue;
22203 else
22204 vec = cp_parser_parenthesized_expression_list
22205 (parser, attr_flag, /*cast_p=*/false,
22206 /*allow_expansion_p=*/false,
22207 /*non_constant_p=*/NULL);
22208 if (vec == NULL)
22209 arguments = error_mark_node;
22210 else
22212 arguments = build_tree_list_vec (vec);
22213 release_tree_vector (vec);
22215 /* Save the arguments away. */
22216 TREE_VALUE (attribute) = arguments;
22218 else if (is_cilkplus_vector_p (identifier))
22220 cp_parser_cilk_simd_fn_vector_attrs (parser, id_token);
22221 continue;
22224 if (arguments != error_mark_node)
22226 /* Add this attribute to the list. */
22227 TREE_CHAIN (attribute) = attribute_list;
22228 attribute_list = attribute;
22231 token = cp_lexer_peek_token (parser->lexer);
22233 /* Now, look for more attributes. If the next token isn't a
22234 `,', we're done. */
22235 if (token->type != CPP_COMMA)
22236 break;
22238 /* Consume the comma and keep going. */
22239 cp_lexer_consume_token (parser->lexer);
22241 parser->translate_strings_p = save_translate_strings_p;
22243 /* We built up the list in reverse order. */
22244 return nreverse (attribute_list);
22247 /* Parse a standard C++11 attribute.
22249 The returned representation is a TREE_LIST which TREE_PURPOSE is
22250 the scoped name of the attribute, and the TREE_VALUE is its
22251 arguments list.
22253 Note that the scoped name of the attribute is itself a TREE_LIST
22254 which TREE_PURPOSE is the namespace of the attribute, and
22255 TREE_VALUE its name. This is unlike a GNU attribute -- as parsed
22256 by cp_parser_gnu_attribute_list -- that doesn't have any namespace
22257 and which TREE_PURPOSE is directly the attribute name.
22259 Clients of the attribute code should use get_attribute_namespace
22260 and get_attribute_name to get the actual namespace and name of
22261 attributes, regardless of their being GNU or C++11 attributes.
22263 attribute:
22264 attribute-token attribute-argument-clause [opt]
22266 attribute-token:
22267 identifier
22268 attribute-scoped-token
22270 attribute-scoped-token:
22271 attribute-namespace :: identifier
22273 attribute-namespace:
22274 identifier
22276 attribute-argument-clause:
22277 ( balanced-token-seq )
22279 balanced-token-seq:
22280 balanced-token [opt]
22281 balanced-token-seq balanced-token
22283 balanced-token:
22284 ( balanced-token-seq )
22285 [ balanced-token-seq ]
22286 { balanced-token-seq }. */
22288 static tree
22289 cp_parser_std_attribute (cp_parser *parser)
22291 tree attribute, attr_ns = NULL_TREE, attr_id = NULL_TREE, arguments;
22292 cp_token *token;
22294 /* First, parse name of the the attribute, a.k.a
22295 attribute-token. */
22297 token = cp_lexer_peek_token (parser->lexer);
22298 if (token->type == CPP_NAME)
22299 attr_id = token->u.value;
22300 else if (token->type == CPP_KEYWORD)
22301 attr_id = ridpointers[(int) token->keyword];
22302 else if (token->flags & NAMED_OP)
22303 attr_id = get_identifier (cpp_type2name (token->type, token->flags));
22305 if (attr_id == NULL_TREE)
22306 return NULL_TREE;
22308 cp_lexer_consume_token (parser->lexer);
22310 token = cp_lexer_peek_token (parser->lexer);
22311 if (token->type == CPP_SCOPE)
22313 /* We are seeing a scoped attribute token. */
22315 cp_lexer_consume_token (parser->lexer);
22316 attr_ns = attr_id;
22318 token = cp_lexer_consume_token (parser->lexer);
22319 if (token->type == CPP_NAME)
22320 attr_id = token->u.value;
22321 else if (token->type == CPP_KEYWORD)
22322 attr_id = ridpointers[(int) token->keyword];
22323 else
22325 error_at (token->location,
22326 "expected an identifier for the attribute name");
22327 return error_mark_node;
22329 attribute = build_tree_list (build_tree_list (attr_ns, attr_id),
22330 NULL_TREE);
22331 token = cp_lexer_peek_token (parser->lexer);
22333 else
22335 attribute = build_tree_list (build_tree_list (NULL_TREE, attr_id),
22336 NULL_TREE);
22337 /* C++11 noreturn attribute is equivalent to GNU's. */
22338 if (is_attribute_p ("noreturn", attr_id))
22339 TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
22340 /* C++14 deprecated attribute is equivalent to GNU's. */
22341 else if (cxx_dialect >= cxx11 && is_attribute_p ("deprecated", attr_id))
22343 if (cxx_dialect == cxx11)
22344 pedwarn (token->location, OPT_Wpedantic,
22345 "%<deprecated%> is a C++14 feature;"
22346 " use %<gnu::deprecated%>");
22347 TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
22351 /* Now parse the optional argument clause of the attribute. */
22353 if (token->type != CPP_OPEN_PAREN)
22354 return attribute;
22357 vec<tree, va_gc> *vec;
22358 int attr_flag = normal_attr;
22360 if (attr_ns == get_identifier ("gnu")
22361 && attribute_takes_identifier_p (attr_id))
22362 /* A GNU attribute that takes an identifier in parameter. */
22363 attr_flag = id_attr;
22365 vec = cp_parser_parenthesized_expression_list
22366 (parser, attr_flag, /*cast_p=*/false,
22367 /*allow_expansion_p=*/true,
22368 /*non_constant_p=*/NULL);
22369 if (vec == NULL)
22370 arguments = error_mark_node;
22371 else
22373 arguments = build_tree_list_vec (vec);
22374 release_tree_vector (vec);
22377 if (arguments == error_mark_node)
22378 attribute = error_mark_node;
22379 else
22380 TREE_VALUE (attribute) = arguments;
22383 return attribute;
22386 /* Parse a list of standard C++-11 attributes.
22388 attribute-list:
22389 attribute [opt]
22390 attribute-list , attribute[opt]
22391 attribute ...
22392 attribute-list , attribute ...
22395 static tree
22396 cp_parser_std_attribute_list (cp_parser *parser)
22398 tree attributes = NULL_TREE, attribute = NULL_TREE;
22399 cp_token *token = NULL;
22401 while (true)
22403 attribute = cp_parser_std_attribute (parser);
22404 if (attribute == error_mark_node)
22405 break;
22406 if (attribute != NULL_TREE)
22408 TREE_CHAIN (attribute) = attributes;
22409 attributes = attribute;
22411 token = cp_lexer_peek_token (parser->lexer);
22412 if (token->type != CPP_COMMA)
22413 break;
22414 cp_lexer_consume_token (parser->lexer);
22416 attributes = nreverse (attributes);
22417 return attributes;
22420 /* Parse a standard C++-11 attribute specifier.
22422 attribute-specifier:
22423 [ [ attribute-list ] ]
22424 alignment-specifier
22426 alignment-specifier:
22427 alignas ( type-id ... [opt] )
22428 alignas ( alignment-expression ... [opt] ). */
22430 static tree
22431 cp_parser_std_attribute_spec (cp_parser *parser)
22433 tree attributes = NULL_TREE;
22434 cp_token *token = cp_lexer_peek_token (parser->lexer);
22436 if (token->type == CPP_OPEN_SQUARE
22437 && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_OPEN_SQUARE)
22439 cp_lexer_consume_token (parser->lexer);
22440 cp_lexer_consume_token (parser->lexer);
22442 attributes = cp_parser_std_attribute_list (parser);
22444 if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE)
22445 || !cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
22446 cp_parser_skip_to_end_of_statement (parser);
22447 else
22448 /* Warn about parsing c++11 attribute in non-c++1 mode, only
22449 when we are sure that we have actually parsed them. */
22450 maybe_warn_cpp0x (CPP0X_ATTRIBUTES);
22452 else
22454 tree alignas_expr;
22456 /* Look for an alignment-specifier. */
22458 token = cp_lexer_peek_token (parser->lexer);
22460 if (token->type != CPP_KEYWORD
22461 || token->keyword != RID_ALIGNAS)
22462 return NULL_TREE;
22464 cp_lexer_consume_token (parser->lexer);
22465 maybe_warn_cpp0x (CPP0X_ATTRIBUTES);
22467 if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN) == NULL)
22469 cp_parser_error (parser, "expected %<(%>");
22470 return error_mark_node;
22473 cp_parser_parse_tentatively (parser);
22474 alignas_expr = cp_parser_type_id (parser);
22476 if (!cp_parser_parse_definitely (parser))
22478 gcc_assert (alignas_expr == error_mark_node
22479 || alignas_expr == NULL_TREE);
22481 alignas_expr =
22482 cp_parser_assignment_expression (parser);
22483 if (alignas_expr == error_mark_node)
22484 cp_parser_skip_to_end_of_statement (parser);
22485 if (alignas_expr == NULL_TREE
22486 || alignas_expr == error_mark_node)
22487 return alignas_expr;
22490 if (cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN) == NULL)
22492 cp_parser_error (parser, "expected %<)%>");
22493 return error_mark_node;
22496 alignas_expr = cxx_alignas_expr (alignas_expr);
22498 /* Build the C++-11 representation of an 'aligned'
22499 attribute. */
22500 attributes =
22501 build_tree_list (build_tree_list (get_identifier ("gnu"),
22502 get_identifier ("aligned")),
22503 build_tree_list (NULL_TREE, alignas_expr));
22506 return attributes;
22509 /* Parse a standard C++-11 attribute-specifier-seq.
22511 attribute-specifier-seq:
22512 attribute-specifier-seq [opt] attribute-specifier
22515 static tree
22516 cp_parser_std_attribute_spec_seq (cp_parser *parser)
22518 tree attr_specs = NULL;
22520 while (true)
22522 tree attr_spec = cp_parser_std_attribute_spec (parser);
22523 if (attr_spec == NULL_TREE)
22524 break;
22525 if (attr_spec == error_mark_node)
22526 return error_mark_node;
22528 TREE_CHAIN (attr_spec) = attr_specs;
22529 attr_specs = attr_spec;
22532 attr_specs = nreverse (attr_specs);
22533 return attr_specs;
22536 /* Parse an optional `__extension__' keyword. Returns TRUE if it is
22537 present, and FALSE otherwise. *SAVED_PEDANTIC is set to the
22538 current value of the PEDANTIC flag, regardless of whether or not
22539 the `__extension__' keyword is present. The caller is responsible
22540 for restoring the value of the PEDANTIC flag. */
22542 static bool
22543 cp_parser_extension_opt (cp_parser* parser, int* saved_pedantic)
22545 /* Save the old value of the PEDANTIC flag. */
22546 *saved_pedantic = pedantic;
22548 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXTENSION))
22550 /* Consume the `__extension__' token. */
22551 cp_lexer_consume_token (parser->lexer);
22552 /* We're not being pedantic while the `__extension__' keyword is
22553 in effect. */
22554 pedantic = 0;
22556 return true;
22559 return false;
22562 /* Parse a label declaration.
22564 label-declaration:
22565 __label__ label-declarator-seq ;
22567 label-declarator-seq:
22568 identifier , label-declarator-seq
22569 identifier */
22571 static void
22572 cp_parser_label_declaration (cp_parser* parser)
22574 /* Look for the `__label__' keyword. */
22575 cp_parser_require_keyword (parser, RID_LABEL, RT_LABEL);
22577 while (true)
22579 tree identifier;
22581 /* Look for an identifier. */
22582 identifier = cp_parser_identifier (parser);
22583 /* If we failed, stop. */
22584 if (identifier == error_mark_node)
22585 break;
22586 /* Declare it as a label. */
22587 finish_label_decl (identifier);
22588 /* If the next token is a `;', stop. */
22589 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22590 break;
22591 /* Look for the `,' separating the label declarations. */
22592 cp_parser_require (parser, CPP_COMMA, RT_COMMA);
22595 /* Look for the final `;'. */
22596 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
22599 /* Support Functions */
22601 /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
22602 NAME should have one of the representations used for an
22603 id-expression. If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
22604 is returned. If PARSER->SCOPE is a dependent type, then a
22605 SCOPE_REF is returned.
22607 If NAME is a TEMPLATE_ID_EXPR, then it will be immediately
22608 returned; the name was already resolved when the TEMPLATE_ID_EXPR
22609 was formed. Abstractly, such entities should not be passed to this
22610 function, because they do not need to be looked up, but it is
22611 simpler to check for this special case here, rather than at the
22612 call-sites.
22614 In cases not explicitly covered above, this function returns a
22615 DECL, OVERLOAD, or baselink representing the result of the lookup.
22616 If there was no entity with the indicated NAME, the ERROR_MARK_NODE
22617 is returned.
22619 If TAG_TYPE is not NONE_TYPE, it indicates an explicit type keyword
22620 (e.g., "struct") that was used. In that case bindings that do not
22621 refer to types are ignored.
22623 If IS_TEMPLATE is TRUE, bindings that do not refer to templates are
22624 ignored.
22626 If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces
22627 are ignored.
22629 If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
22630 types.
22632 If AMBIGUOUS_DECLS is non-NULL, *AMBIGUOUS_DECLS is set to a
22633 TREE_LIST of candidates if name-lookup results in an ambiguity, and
22634 NULL_TREE otherwise. */
22636 static tree
22637 cp_parser_lookup_name (cp_parser *parser, tree name,
22638 enum tag_types tag_type,
22639 bool is_template,
22640 bool is_namespace,
22641 bool check_dependency,
22642 tree *ambiguous_decls,
22643 location_t name_location)
22645 tree decl;
22646 tree object_type = parser->context->object_type;
22648 /* Assume that the lookup will be unambiguous. */
22649 if (ambiguous_decls)
22650 *ambiguous_decls = NULL_TREE;
22652 /* Now that we have looked up the name, the OBJECT_TYPE (if any) is
22653 no longer valid. Note that if we are parsing tentatively, and
22654 the parse fails, OBJECT_TYPE will be automatically restored. */
22655 parser->context->object_type = NULL_TREE;
22657 if (name == error_mark_node)
22658 return error_mark_node;
22660 /* A template-id has already been resolved; there is no lookup to
22661 do. */
22662 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
22663 return name;
22664 if (BASELINK_P (name))
22666 gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name))
22667 == TEMPLATE_ID_EXPR);
22668 return name;
22671 /* A BIT_NOT_EXPR is used to represent a destructor. By this point,
22672 it should already have been checked to make sure that the name
22673 used matches the type being destroyed. */
22674 if (TREE_CODE (name) == BIT_NOT_EXPR)
22676 tree type;
22678 /* Figure out to which type this destructor applies. */
22679 if (parser->scope)
22680 type = parser->scope;
22681 else if (object_type)
22682 type = object_type;
22683 else
22684 type = current_class_type;
22685 /* If that's not a class type, there is no destructor. */
22686 if (!type || !CLASS_TYPE_P (type))
22687 return error_mark_node;
22688 if (CLASSTYPE_LAZY_DESTRUCTOR (type))
22689 lazily_declare_fn (sfk_destructor, type);
22690 if (!CLASSTYPE_DESTRUCTORS (type))
22691 return error_mark_node;
22692 /* If it was a class type, return the destructor. */
22693 return CLASSTYPE_DESTRUCTORS (type);
22696 /* By this point, the NAME should be an ordinary identifier. If
22697 the id-expression was a qualified name, the qualifying scope is
22698 stored in PARSER->SCOPE at this point. */
22699 gcc_assert (identifier_p (name));
22701 /* Perform the lookup. */
22702 if (parser->scope)
22704 bool dependent_p;
22706 if (parser->scope == error_mark_node)
22707 return error_mark_node;
22709 /* If the SCOPE is dependent, the lookup must be deferred until
22710 the template is instantiated -- unless we are explicitly
22711 looking up names in uninstantiated templates. Even then, we
22712 cannot look up the name if the scope is not a class type; it
22713 might, for example, be a template type parameter. */
22714 dependent_p = (TYPE_P (parser->scope)
22715 && dependent_scope_p (parser->scope));
22716 if ((check_dependency || !CLASS_TYPE_P (parser->scope))
22717 && dependent_p)
22718 /* Defer lookup. */
22719 decl = error_mark_node;
22720 else
22722 tree pushed_scope = NULL_TREE;
22724 /* If PARSER->SCOPE is a dependent type, then it must be a
22725 class type, and we must not be checking dependencies;
22726 otherwise, we would have processed this lookup above. So
22727 that PARSER->SCOPE is not considered a dependent base by
22728 lookup_member, we must enter the scope here. */
22729 if (dependent_p)
22730 pushed_scope = push_scope (parser->scope);
22732 /* If the PARSER->SCOPE is a template specialization, it
22733 may be instantiated during name lookup. In that case,
22734 errors may be issued. Even if we rollback the current
22735 tentative parse, those errors are valid. */
22736 decl = lookup_qualified_name (parser->scope, name,
22737 tag_type != none_type,
22738 /*complain=*/true);
22740 /* 3.4.3.1: In a lookup in which the constructor is an acceptable
22741 lookup result and the nested-name-specifier nominates a class C:
22742 * if the name specified after the nested-name-specifier, when
22743 looked up in C, is the injected-class-name of C (Clause 9), or
22744 * if the name specified after the nested-name-specifier is the
22745 same as the identifier or the simple-template-id's template-
22746 name in the last component of the nested-name-specifier,
22747 the name is instead considered to name the constructor of
22748 class C. [ Note: for example, the constructor is not an
22749 acceptable lookup result in an elaborated-type-specifier so
22750 the constructor would not be used in place of the
22751 injected-class-name. --end note ] Such a constructor name
22752 shall be used only in the declarator-id of a declaration that
22753 names a constructor or in a using-declaration. */
22754 if (tag_type == none_type
22755 && DECL_SELF_REFERENCE_P (decl)
22756 && same_type_p (DECL_CONTEXT (decl), parser->scope))
22757 decl = lookup_qualified_name (parser->scope, ctor_identifier,
22758 tag_type != none_type,
22759 /*complain=*/true);
22761 /* If we have a single function from a using decl, pull it out. */
22762 if (TREE_CODE (decl) == OVERLOAD
22763 && !really_overloaded_fn (decl))
22764 decl = OVL_FUNCTION (decl);
22766 if (pushed_scope)
22767 pop_scope (pushed_scope);
22770 /* If the scope is a dependent type and either we deferred lookup or
22771 we did lookup but didn't find the name, rememeber the name. */
22772 if (decl == error_mark_node && TYPE_P (parser->scope)
22773 && dependent_type_p (parser->scope))
22775 if (tag_type)
22777 tree type;
22779 /* The resolution to Core Issue 180 says that `struct
22780 A::B' should be considered a type-name, even if `A'
22781 is dependent. */
22782 type = make_typename_type (parser->scope, name, tag_type,
22783 /*complain=*/tf_error);
22784 if (type != error_mark_node)
22785 decl = TYPE_NAME (type);
22787 else if (is_template
22788 && (cp_parser_next_token_ends_template_argument_p (parser)
22789 || cp_lexer_next_token_is (parser->lexer,
22790 CPP_CLOSE_PAREN)))
22791 decl = make_unbound_class_template (parser->scope,
22792 name, NULL_TREE,
22793 /*complain=*/tf_error);
22794 else
22795 decl = build_qualified_name (/*type=*/NULL_TREE,
22796 parser->scope, name,
22797 is_template);
22799 parser->qualifying_scope = parser->scope;
22800 parser->object_scope = NULL_TREE;
22802 else if (object_type)
22804 /* Look up the name in the scope of the OBJECT_TYPE, unless the
22805 OBJECT_TYPE is not a class. */
22806 if (CLASS_TYPE_P (object_type))
22807 /* If the OBJECT_TYPE is a template specialization, it may
22808 be instantiated during name lookup. In that case, errors
22809 may be issued. Even if we rollback the current tentative
22810 parse, those errors are valid. */
22811 decl = lookup_member (object_type,
22812 name,
22813 /*protect=*/0,
22814 tag_type != none_type,
22815 tf_warning_or_error);
22816 else
22817 decl = NULL_TREE;
22819 if (!decl)
22820 /* Look it up in the enclosing context. */
22821 decl = lookup_name_real (name, tag_type != none_type,
22822 /*nonclass=*/0,
22823 /*block_p=*/true, is_namespace, 0);
22824 parser->object_scope = object_type;
22825 parser->qualifying_scope = NULL_TREE;
22827 else
22829 decl = lookup_name_real (name, tag_type != none_type,
22830 /*nonclass=*/0,
22831 /*block_p=*/true, is_namespace, 0);
22832 parser->qualifying_scope = NULL_TREE;
22833 parser->object_scope = NULL_TREE;
22836 /* If the lookup failed, let our caller know. */
22837 if (!decl || decl == error_mark_node)
22838 return error_mark_node;
22840 /* Pull out the template from an injected-class-name (or multiple). */
22841 if (is_template)
22842 decl = maybe_get_template_decl_from_type_decl (decl);
22844 /* If it's a TREE_LIST, the result of the lookup was ambiguous. */
22845 if (TREE_CODE (decl) == TREE_LIST)
22847 if (ambiguous_decls)
22848 *ambiguous_decls = decl;
22849 /* The error message we have to print is too complicated for
22850 cp_parser_error, so we incorporate its actions directly. */
22851 if (!cp_parser_simulate_error (parser))
22853 error_at (name_location, "reference to %qD is ambiguous",
22854 name);
22855 print_candidates (decl);
22857 return error_mark_node;
22860 gcc_assert (DECL_P (decl)
22861 || TREE_CODE (decl) == OVERLOAD
22862 || TREE_CODE (decl) == SCOPE_REF
22863 || TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE
22864 || BASELINK_P (decl));
22866 /* If we have resolved the name of a member declaration, check to
22867 see if the declaration is accessible. When the name resolves to
22868 set of overloaded functions, accessibility is checked when
22869 overload resolution is done.
22871 During an explicit instantiation, access is not checked at all,
22872 as per [temp.explicit]. */
22873 if (DECL_P (decl))
22874 check_accessibility_of_qualified_id (decl, object_type, parser->scope);
22876 maybe_record_typedef_use (decl);
22878 return decl;
22881 /* Like cp_parser_lookup_name, but for use in the typical case where
22882 CHECK_ACCESS is TRUE, IS_TYPE is FALSE, IS_TEMPLATE is FALSE,
22883 IS_NAMESPACE is FALSE, and CHECK_DEPENDENCY is TRUE. */
22885 static tree
22886 cp_parser_lookup_name_simple (cp_parser* parser, tree name, location_t location)
22888 return cp_parser_lookup_name (parser, name,
22889 none_type,
22890 /*is_template=*/false,
22891 /*is_namespace=*/false,
22892 /*check_dependency=*/true,
22893 /*ambiguous_decls=*/NULL,
22894 location);
22897 /* If DECL is a TEMPLATE_DECL that can be treated like a TYPE_DECL in
22898 the current context, return the TYPE_DECL. If TAG_NAME_P is
22899 true, the DECL indicates the class being defined in a class-head,
22900 or declared in an elaborated-type-specifier.
22902 Otherwise, return DECL. */
22904 static tree
22905 cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
22907 /* If the TEMPLATE_DECL is being declared as part of a class-head,
22908 the translation from TEMPLATE_DECL to TYPE_DECL occurs:
22910 struct A {
22911 template <typename T> struct B;
22914 template <typename T> struct A::B {};
22916 Similarly, in an elaborated-type-specifier:
22918 namespace N { struct X{}; }
22920 struct A {
22921 template <typename T> friend struct N::X;
22924 However, if the DECL refers to a class type, and we are in
22925 the scope of the class, then the name lookup automatically
22926 finds the TYPE_DECL created by build_self_reference rather
22927 than a TEMPLATE_DECL. For example, in:
22929 template <class T> struct S {
22930 S s;
22933 there is no need to handle such case. */
22935 if (DECL_CLASS_TEMPLATE_P (decl) && tag_name_p)
22936 return DECL_TEMPLATE_RESULT (decl);
22938 return decl;
22941 /* If too many, or too few, template-parameter lists apply to the
22942 declarator, issue an error message. Returns TRUE if all went well,
22943 and FALSE otherwise. */
22945 static bool
22946 cp_parser_check_declarator_template_parameters (cp_parser* parser,
22947 cp_declarator *declarator,
22948 location_t declarator_location)
22950 switch (declarator->kind)
22952 case cdk_id:
22954 unsigned num_templates = 0;
22955 tree scope = declarator->u.id.qualifying_scope;
22957 if (scope)
22958 num_templates = num_template_headers_for_class (scope);
22959 else if (TREE_CODE (declarator->u.id.unqualified_name)
22960 == TEMPLATE_ID_EXPR)
22961 /* If the DECLARATOR has the form `X<y>' then it uses one
22962 additional level of template parameters. */
22963 ++num_templates;
22965 return cp_parser_check_template_parameters
22966 (parser, num_templates, declarator_location, declarator);
22969 case cdk_function:
22970 case cdk_array:
22971 case cdk_pointer:
22972 case cdk_reference:
22973 case cdk_ptrmem:
22974 return (cp_parser_check_declarator_template_parameters
22975 (parser, declarator->declarator, declarator_location));
22977 case cdk_error:
22978 return true;
22980 default:
22981 gcc_unreachable ();
22983 return false;
22986 /* NUM_TEMPLATES were used in the current declaration. If that is
22987 invalid, return FALSE and issue an error messages. Otherwise,
22988 return TRUE. If DECLARATOR is non-NULL, then we are checking a
22989 declarator and we can print more accurate diagnostics. */
22991 static bool
22992 cp_parser_check_template_parameters (cp_parser* parser,
22993 unsigned num_templates,
22994 location_t location,
22995 cp_declarator *declarator)
22997 /* If there are the same number of template classes and parameter
22998 lists, that's OK. */
22999 if (parser->num_template_parameter_lists == num_templates)
23000 return true;
23001 /* If there are more, but only one more, then we are referring to a
23002 member template. That's OK too. */
23003 if (parser->num_template_parameter_lists == num_templates + 1)
23004 return true;
23005 /* If there are more template classes than parameter lists, we have
23006 something like:
23008 template <class T> void S<T>::R<T>::f (); */
23009 if (parser->num_template_parameter_lists < num_templates)
23011 if (declarator && !current_function_decl)
23012 error_at (location, "specializing member %<%T::%E%> "
23013 "requires %<template<>%> syntax",
23014 declarator->u.id.qualifying_scope,
23015 declarator->u.id.unqualified_name);
23016 else if (declarator)
23017 error_at (location, "invalid declaration of %<%T::%E%>",
23018 declarator->u.id.qualifying_scope,
23019 declarator->u.id.unqualified_name);
23020 else
23021 error_at (location, "too few template-parameter-lists");
23022 return false;
23024 /* Otherwise, there are too many template parameter lists. We have
23025 something like:
23027 template <class T> template <class U> void S::f(); */
23028 error_at (location, "too many template-parameter-lists");
23029 return false;
23032 /* Parse an optional `::' token indicating that the following name is
23033 from the global namespace. If so, PARSER->SCOPE is set to the
23034 GLOBAL_NAMESPACE. Otherwise, PARSER->SCOPE is set to NULL_TREE,
23035 unless CURRENT_SCOPE_VALID_P is TRUE, in which case it is left alone.
23036 Returns the new value of PARSER->SCOPE, if the `::' token is
23037 present, and NULL_TREE otherwise. */
23039 static tree
23040 cp_parser_global_scope_opt (cp_parser* parser, bool current_scope_valid_p)
23042 cp_token *token;
23044 /* Peek at the next token. */
23045 token = cp_lexer_peek_token (parser->lexer);
23046 /* If we're looking at a `::' token then we're starting from the
23047 global namespace, not our current location. */
23048 if (token->type == CPP_SCOPE)
23050 /* Consume the `::' token. */
23051 cp_lexer_consume_token (parser->lexer);
23052 /* Set the SCOPE so that we know where to start the lookup. */
23053 parser->scope = global_namespace;
23054 parser->qualifying_scope = global_namespace;
23055 parser->object_scope = NULL_TREE;
23057 return parser->scope;
23059 else if (!current_scope_valid_p)
23061 parser->scope = NULL_TREE;
23062 parser->qualifying_scope = NULL_TREE;
23063 parser->object_scope = NULL_TREE;
23066 return NULL_TREE;
23069 /* Returns TRUE if the upcoming token sequence is the start of a
23070 constructor declarator. If FRIEND_P is true, the declarator is
23071 preceded by the `friend' specifier. */
23073 static bool
23074 cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
23076 bool constructor_p;
23077 bool outside_class_specifier_p;
23078 tree nested_name_specifier;
23079 cp_token *next_token;
23081 /* The common case is that this is not a constructor declarator, so
23082 try to avoid doing lots of work if at all possible. It's not
23083 valid declare a constructor at function scope. */
23084 if (parser->in_function_body)
23085 return false;
23086 /* And only certain tokens can begin a constructor declarator. */
23087 next_token = cp_lexer_peek_token (parser->lexer);
23088 if (next_token->type != CPP_NAME
23089 && next_token->type != CPP_SCOPE
23090 && next_token->type != CPP_NESTED_NAME_SPECIFIER
23091 && next_token->type != CPP_TEMPLATE_ID)
23092 return false;
23094 /* Parse tentatively; we are going to roll back all of the tokens
23095 consumed here. */
23096 cp_parser_parse_tentatively (parser);
23097 /* Assume that we are looking at a constructor declarator. */
23098 constructor_p = true;
23100 /* Look for the optional `::' operator. */
23101 cp_parser_global_scope_opt (parser,
23102 /*current_scope_valid_p=*/false);
23103 /* Look for the nested-name-specifier. */
23104 nested_name_specifier
23105 = (cp_parser_nested_name_specifier_opt (parser,
23106 /*typename_keyword_p=*/false,
23107 /*check_dependency_p=*/false,
23108 /*type_p=*/false,
23109 /*is_declaration=*/false));
23111 outside_class_specifier_p = (!at_class_scope_p ()
23112 || !TYPE_BEING_DEFINED (current_class_type)
23113 || friend_p);
23115 /* Outside of a class-specifier, there must be a
23116 nested-name-specifier. */
23117 if (!nested_name_specifier && outside_class_specifier_p)
23118 constructor_p = false;
23119 else if (nested_name_specifier == error_mark_node)
23120 constructor_p = false;
23122 /* If we have a class scope, this is easy; DR 147 says that S::S always
23123 names the constructor, and no other qualified name could. */
23124 if (constructor_p && nested_name_specifier
23125 && CLASS_TYPE_P (nested_name_specifier))
23127 tree id = cp_parser_unqualified_id (parser,
23128 /*template_keyword_p=*/false,
23129 /*check_dependency_p=*/false,
23130 /*declarator_p=*/true,
23131 /*optional_p=*/false);
23132 if (is_overloaded_fn (id))
23133 id = DECL_NAME (get_first_fn (id));
23134 if (!constructor_name_p (id, nested_name_specifier))
23135 constructor_p = false;
23137 /* If we still think that this might be a constructor-declarator,
23138 look for a class-name. */
23139 else if (constructor_p)
23141 /* If we have:
23143 template <typename T> struct S {
23144 S();
23147 we must recognize that the nested `S' names a class. */
23148 tree type_decl;
23149 type_decl = cp_parser_class_name (parser,
23150 /*typename_keyword_p=*/false,
23151 /*template_keyword_p=*/false,
23152 none_type,
23153 /*check_dependency_p=*/false,
23154 /*class_head_p=*/false,
23155 /*is_declaration=*/false);
23156 /* If there was no class-name, then this is not a constructor.
23157 Otherwise, if we are in a class-specifier and we aren't
23158 handling a friend declaration, check that its type matches
23159 current_class_type (c++/38313). Note: error_mark_node
23160 is left alone for error recovery purposes. */
23161 constructor_p = (!cp_parser_error_occurred (parser)
23162 && (outside_class_specifier_p
23163 || type_decl == error_mark_node
23164 || same_type_p (current_class_type,
23165 TREE_TYPE (type_decl))));
23167 /* If we're still considering a constructor, we have to see a `(',
23168 to begin the parameter-declaration-clause, followed by either a
23169 `)', an `...', or a decl-specifier. We need to check for a
23170 type-specifier to avoid being fooled into thinking that:
23172 S (f) (int);
23174 is a constructor. (It is actually a function named `f' that
23175 takes one parameter (of type `int') and returns a value of type
23176 `S'. */
23177 if (constructor_p
23178 && !cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23179 constructor_p = false;
23181 if (constructor_p
23182 && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
23183 && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS)
23184 /* A parameter declaration begins with a decl-specifier,
23185 which is either the "attribute" keyword, a storage class
23186 specifier, or (usually) a type-specifier. */
23187 && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
23189 tree type;
23190 tree pushed_scope = NULL_TREE;
23191 unsigned saved_num_template_parameter_lists;
23193 /* Names appearing in the type-specifier should be looked up
23194 in the scope of the class. */
23195 if (current_class_type)
23196 type = NULL_TREE;
23197 else
23199 type = TREE_TYPE (type_decl);
23200 if (TREE_CODE (type) == TYPENAME_TYPE)
23202 type = resolve_typename_type (type,
23203 /*only_current_p=*/false);
23204 if (TREE_CODE (type) == TYPENAME_TYPE)
23206 cp_parser_abort_tentative_parse (parser);
23207 return false;
23210 pushed_scope = push_scope (type);
23213 /* Inside the constructor parameter list, surrounding
23214 template-parameter-lists do not apply. */
23215 saved_num_template_parameter_lists
23216 = parser->num_template_parameter_lists;
23217 parser->num_template_parameter_lists = 0;
23219 /* Look for the type-specifier. */
23220 cp_parser_type_specifier (parser,
23221 CP_PARSER_FLAGS_NONE,
23222 /*decl_specs=*/NULL,
23223 /*is_declarator=*/true,
23224 /*declares_class_or_enum=*/NULL,
23225 /*is_cv_qualifier=*/NULL);
23227 parser->num_template_parameter_lists
23228 = saved_num_template_parameter_lists;
23230 /* Leave the scope of the class. */
23231 if (pushed_scope)
23232 pop_scope (pushed_scope);
23234 constructor_p = !cp_parser_error_occurred (parser);
23238 /* We did not really want to consume any tokens. */
23239 cp_parser_abort_tentative_parse (parser);
23241 return constructor_p;
23244 /* Parse the definition of the function given by the DECL_SPECIFIERS,
23245 ATTRIBUTES, and DECLARATOR. The access checks have been deferred;
23246 they must be performed once we are in the scope of the function.
23248 Returns the function defined. */
23250 static tree
23251 cp_parser_function_definition_from_specifiers_and_declarator
23252 (cp_parser* parser,
23253 cp_decl_specifier_seq *decl_specifiers,
23254 tree attributes,
23255 const cp_declarator *declarator)
23257 tree fn;
23258 bool success_p;
23260 /* Begin the function-definition. */
23261 success_p = start_function (decl_specifiers, declarator, attributes);
23263 /* The things we're about to see are not directly qualified by any
23264 template headers we've seen thus far. */
23265 reset_specialization ();
23267 /* If there were names looked up in the decl-specifier-seq that we
23268 did not check, check them now. We must wait until we are in the
23269 scope of the function to perform the checks, since the function
23270 might be a friend. */
23271 perform_deferred_access_checks (tf_warning_or_error);
23273 if (success_p)
23275 cp_finalize_omp_declare_simd (parser, current_function_decl);
23276 parser->omp_declare_simd = NULL;
23279 if (!success_p)
23281 /* Skip the entire function. */
23282 cp_parser_skip_to_end_of_block_or_statement (parser);
23283 fn = error_mark_node;
23285 else if (DECL_INITIAL (current_function_decl) != error_mark_node)
23287 /* Seen already, skip it. An error message has already been output. */
23288 cp_parser_skip_to_end_of_block_or_statement (parser);
23289 fn = current_function_decl;
23290 current_function_decl = NULL_TREE;
23291 /* If this is a function from a class, pop the nested class. */
23292 if (current_class_name)
23293 pop_nested_class ();
23295 else
23297 timevar_id_t tv;
23298 if (DECL_DECLARED_INLINE_P (current_function_decl))
23299 tv = TV_PARSE_INLINE;
23300 else
23301 tv = TV_PARSE_FUNC;
23302 timevar_push (tv);
23303 fn = cp_parser_function_definition_after_declarator (parser,
23304 /*inline_p=*/false);
23305 timevar_pop (tv);
23308 return fn;
23311 /* Parse the part of a function-definition that follows the
23312 declarator. INLINE_P is TRUE iff this function is an inline
23313 function defined within a class-specifier.
23315 Returns the function defined. */
23317 static tree
23318 cp_parser_function_definition_after_declarator (cp_parser* parser,
23319 bool inline_p)
23321 tree fn;
23322 bool ctor_initializer_p = false;
23323 bool saved_in_unbraced_linkage_specification_p;
23324 bool saved_in_function_body;
23325 unsigned saved_num_template_parameter_lists;
23326 cp_token *token;
23327 bool fully_implicit_function_template_p
23328 = parser->fully_implicit_function_template_p;
23329 parser->fully_implicit_function_template_p = false;
23330 tree implicit_template_parms
23331 = parser->implicit_template_parms;
23332 parser->implicit_template_parms = 0;
23333 cp_binding_level* implicit_template_scope
23334 = parser->implicit_template_scope;
23335 parser->implicit_template_scope = 0;
23337 saved_in_function_body = parser->in_function_body;
23338 parser->in_function_body = true;
23339 /* If the next token is `return', then the code may be trying to
23340 make use of the "named return value" extension that G++ used to
23341 support. */
23342 token = cp_lexer_peek_token (parser->lexer);
23343 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_RETURN))
23345 /* Consume the `return' keyword. */
23346 cp_lexer_consume_token (parser->lexer);
23347 /* Look for the identifier that indicates what value is to be
23348 returned. */
23349 cp_parser_identifier (parser);
23350 /* Issue an error message. */
23351 error_at (token->location,
23352 "named return values are no longer supported");
23353 /* Skip tokens until we reach the start of the function body. */
23354 while (true)
23356 cp_token *token = cp_lexer_peek_token (parser->lexer);
23357 if (token->type == CPP_OPEN_BRACE
23358 || token->type == CPP_EOF
23359 || token->type == CPP_PRAGMA_EOL)
23360 break;
23361 cp_lexer_consume_token (parser->lexer);
23364 /* The `extern' in `extern "C" void f () { ... }' does not apply to
23365 anything declared inside `f'. */
23366 saved_in_unbraced_linkage_specification_p
23367 = parser->in_unbraced_linkage_specification_p;
23368 parser->in_unbraced_linkage_specification_p = false;
23369 /* Inside the function, surrounding template-parameter-lists do not
23370 apply. */
23371 saved_num_template_parameter_lists
23372 = parser->num_template_parameter_lists;
23373 parser->num_template_parameter_lists = 0;
23375 start_lambda_scope (current_function_decl);
23377 /* If the next token is `try', `__transaction_atomic', or
23378 `__transaction_relaxed`, then we are looking at either function-try-block
23379 or function-transaction-block. Note that all of these include the
23380 function-body. */
23381 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRANSACTION_ATOMIC))
23382 ctor_initializer_p = cp_parser_function_transaction (parser,
23383 RID_TRANSACTION_ATOMIC);
23384 else if (cp_lexer_next_token_is_keyword (parser->lexer,
23385 RID_TRANSACTION_RELAXED))
23386 ctor_initializer_p = cp_parser_function_transaction (parser,
23387 RID_TRANSACTION_RELAXED);
23388 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
23389 ctor_initializer_p = cp_parser_function_try_block (parser);
23390 else
23391 ctor_initializer_p = cp_parser_ctor_initializer_opt_and_function_body
23392 (parser, /*in_function_try_block=*/false);
23394 finish_lambda_scope ();
23396 /* Finish the function. */
23397 fn = finish_function ((ctor_initializer_p ? 1 : 0) |
23398 (inline_p ? 2 : 0));
23399 /* Generate code for it, if necessary. */
23400 expand_or_defer_fn (fn);
23401 /* Restore the saved values. */
23402 parser->in_unbraced_linkage_specification_p
23403 = saved_in_unbraced_linkage_specification_p;
23404 parser->num_template_parameter_lists
23405 = saved_num_template_parameter_lists;
23406 parser->in_function_body = saved_in_function_body;
23408 parser->fully_implicit_function_template_p
23409 = fully_implicit_function_template_p;
23410 parser->implicit_template_parms
23411 = implicit_template_parms;
23412 parser->implicit_template_scope
23413 = implicit_template_scope;
23415 if (parser->fully_implicit_function_template_p)
23416 finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
23418 return fn;
23421 /* Parse a template-declaration, assuming that the `export' (and
23422 `extern') keywords, if present, has already been scanned. MEMBER_P
23423 is as for cp_parser_template_declaration. */
23425 static void
23426 cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
23428 tree decl = NULL_TREE;
23429 vec<deferred_access_check, va_gc> *checks;
23430 tree parameter_list;
23431 bool friend_p = false;
23432 bool need_lang_pop;
23433 cp_token *token;
23435 /* Look for the `template' keyword. */
23436 token = cp_lexer_peek_token (parser->lexer);
23437 if (!cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE))
23438 return;
23440 /* And the `<'. */
23441 if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
23442 return;
23443 if (at_class_scope_p () && current_function_decl)
23445 /* 14.5.2.2 [temp.mem]
23447 A local class shall not have member templates. */
23448 error_at (token->location,
23449 "invalid declaration of member template in local class");
23450 cp_parser_skip_to_end_of_block_or_statement (parser);
23451 return;
23453 /* [temp]
23455 A template ... shall not have C linkage. */
23456 if (current_lang_name == lang_name_c)
23458 error_at (token->location, "template with C linkage");
23459 /* Give it C++ linkage to avoid confusing other parts of the
23460 front end. */
23461 push_lang_context (lang_name_cplusplus);
23462 need_lang_pop = true;
23464 else
23465 need_lang_pop = false;
23467 /* We cannot perform access checks on the template parameter
23468 declarations until we know what is being declared, just as we
23469 cannot check the decl-specifier list. */
23470 push_deferring_access_checks (dk_deferred);
23472 /* If the next token is `>', then we have an invalid
23473 specialization. Rather than complain about an invalid template
23474 parameter, issue an error message here. */
23475 if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER))
23477 cp_parser_error (parser, "invalid explicit specialization");
23478 begin_specialization ();
23479 parameter_list = NULL_TREE;
23481 else
23483 /* Parse the template parameters. */
23484 parameter_list = cp_parser_template_parameter_list (parser);
23487 /* Get the deferred access checks from the parameter list. These
23488 will be checked once we know what is being declared, as for a
23489 member template the checks must be performed in the scope of the
23490 class containing the member. */
23491 checks = get_deferred_access_checks ();
23493 /* Look for the `>'. */
23494 cp_parser_skip_to_end_of_template_parameter_list (parser);
23495 /* We just processed one more parameter list. */
23496 ++parser->num_template_parameter_lists;
23497 /* If the next token is `template', there are more template
23498 parameters. */
23499 if (cp_lexer_next_token_is_keyword (parser->lexer,
23500 RID_TEMPLATE))
23501 cp_parser_template_declaration_after_export (parser, member_p);
23502 else if (cxx_dialect >= cxx11
23503 && cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
23504 decl = cp_parser_alias_declaration (parser);
23505 else
23507 /* There are no access checks when parsing a template, as we do not
23508 know if a specialization will be a friend. */
23509 push_deferring_access_checks (dk_no_check);
23510 token = cp_lexer_peek_token (parser->lexer);
23511 decl = cp_parser_single_declaration (parser,
23512 checks,
23513 member_p,
23514 /*explicit_specialization_p=*/false,
23515 &friend_p);
23516 pop_deferring_access_checks ();
23518 /* If this is a member template declaration, let the front
23519 end know. */
23520 if (member_p && !friend_p && decl)
23522 if (TREE_CODE (decl) == TYPE_DECL)
23523 cp_parser_check_access_in_redeclaration (decl, token->location);
23525 decl = finish_member_template_decl (decl);
23527 else if (friend_p && decl
23528 && DECL_DECLARES_TYPE_P (decl))
23529 make_friend_class (current_class_type, TREE_TYPE (decl),
23530 /*complain=*/true);
23532 /* We are done with the current parameter list. */
23533 --parser->num_template_parameter_lists;
23535 pop_deferring_access_checks ();
23537 /* Finish up. */
23538 finish_template_decl (parameter_list);
23540 /* Check the template arguments for a literal operator template. */
23541 if (decl
23542 && DECL_DECLARES_FUNCTION_P (decl)
23543 && UDLIT_OPER_P (DECL_NAME (decl)))
23545 bool ok = true;
23546 if (parameter_list == NULL_TREE)
23547 ok = false;
23548 else
23550 int num_parms = TREE_VEC_LENGTH (parameter_list);
23551 if (num_parms == 1)
23553 tree parm_list = TREE_VEC_ELT (parameter_list, 0);
23554 tree parm = INNERMOST_TEMPLATE_PARMS (parm_list);
23555 if (TREE_TYPE (parm) != char_type_node
23556 || !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))
23557 ok = false;
23559 else if (num_parms == 2 && cxx_dialect >= cxx14)
23561 tree parm_type = TREE_VEC_ELT (parameter_list, 0);
23562 tree type = INNERMOST_TEMPLATE_PARMS (parm_type);
23563 tree parm_list = TREE_VEC_ELT (parameter_list, 1);
23564 tree parm = INNERMOST_TEMPLATE_PARMS (parm_list);
23565 if (TREE_TYPE (parm) != TREE_TYPE (type)
23566 || !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))
23567 ok = false;
23569 else
23570 ok = false;
23572 if (!ok)
23574 if (cxx_dialect >= cxx14)
23575 error ("literal operator template %qD has invalid parameter list."
23576 " Expected non-type template argument pack <char...>"
23577 " or <typename CharT, CharT...>",
23578 decl);
23579 else
23580 error ("literal operator template %qD has invalid parameter list."
23581 " Expected non-type template argument pack <char...>",
23582 decl);
23585 /* Register member declarations. */
23586 if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
23587 finish_member_declaration (decl);
23588 /* For the erroneous case of a template with C linkage, we pushed an
23589 implicit C++ linkage scope; exit that scope now. */
23590 if (need_lang_pop)
23591 pop_lang_context ();
23592 /* If DECL is a function template, we must return to parse it later.
23593 (Even though there is no definition, there might be default
23594 arguments that need handling.) */
23595 if (member_p && decl
23596 && DECL_DECLARES_FUNCTION_P (decl))
23597 vec_safe_push (unparsed_funs_with_definitions, decl);
23600 /* Perform the deferred access checks from a template-parameter-list.
23601 CHECKS is a TREE_LIST of access checks, as returned by
23602 get_deferred_access_checks. */
23604 static void
23605 cp_parser_perform_template_parameter_access_checks (vec<deferred_access_check, va_gc> *checks)
23607 ++processing_template_parmlist;
23608 perform_access_checks (checks, tf_warning_or_error);
23609 --processing_template_parmlist;
23612 /* Parse a `decl-specifier-seq [opt] init-declarator [opt] ;' or
23613 `function-definition' sequence that follows a template header.
23614 If MEMBER_P is true, this declaration appears in a class scope.
23616 Returns the DECL for the declared entity. If FRIEND_P is non-NULL,
23617 *FRIEND_P is set to TRUE iff the declaration is a friend. */
23619 static tree
23620 cp_parser_single_declaration (cp_parser* parser,
23621 vec<deferred_access_check, va_gc> *checks,
23622 bool member_p,
23623 bool explicit_specialization_p,
23624 bool* friend_p)
23626 int declares_class_or_enum;
23627 tree decl = NULL_TREE;
23628 cp_decl_specifier_seq decl_specifiers;
23629 bool function_definition_p = false;
23630 cp_token *decl_spec_token_start;
23632 /* This function is only used when processing a template
23633 declaration. */
23634 gcc_assert (innermost_scope_kind () == sk_template_parms
23635 || innermost_scope_kind () == sk_template_spec);
23637 /* Defer access checks until we know what is being declared. */
23638 push_deferring_access_checks (dk_deferred);
23640 /* Try the `decl-specifier-seq [opt] init-declarator [opt]'
23641 alternative. */
23642 decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
23643 cp_parser_decl_specifier_seq (parser,
23644 CP_PARSER_FLAGS_OPTIONAL,
23645 &decl_specifiers,
23646 &declares_class_or_enum);
23647 if (friend_p)
23648 *friend_p = cp_parser_friend_p (&decl_specifiers);
23650 /* There are no template typedefs. */
23651 if (decl_spec_seq_has_spec_p (&decl_specifiers, ds_typedef))
23653 error_at (decl_spec_token_start->location,
23654 "template declaration of %<typedef%>");
23655 decl = error_mark_node;
23658 /* Gather up the access checks that occurred the
23659 decl-specifier-seq. */
23660 stop_deferring_access_checks ();
23662 /* Check for the declaration of a template class. */
23663 if (declares_class_or_enum)
23665 if (cp_parser_declares_only_class_p (parser))
23667 decl = shadow_tag (&decl_specifiers);
23669 /* In this case:
23671 struct C {
23672 friend template <typename T> struct A<T>::B;
23675 A<T>::B will be represented by a TYPENAME_TYPE, and
23676 therefore not recognized by shadow_tag. */
23677 if (friend_p && *friend_p
23678 && !decl
23679 && decl_specifiers.type
23680 && TYPE_P (decl_specifiers.type))
23681 decl = decl_specifiers.type;
23683 if (decl && decl != error_mark_node)
23684 decl = TYPE_NAME (decl);
23685 else
23686 decl = error_mark_node;
23688 /* Perform access checks for template parameters. */
23689 cp_parser_perform_template_parameter_access_checks (checks);
23693 /* Complain about missing 'typename' or other invalid type names. */
23694 if (!decl_specifiers.any_type_specifiers_p
23695 && cp_parser_parse_and_diagnose_invalid_type_name (parser))
23697 /* cp_parser_parse_and_diagnose_invalid_type_name calls
23698 cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
23699 the rest of this declaration. */
23700 decl = error_mark_node;
23701 goto out;
23704 /* If it's not a template class, try for a template function. If
23705 the next token is a `;', then this declaration does not declare
23706 anything. But, if there were errors in the decl-specifiers, then
23707 the error might well have come from an attempted class-specifier.
23708 In that case, there's no need to warn about a missing declarator. */
23709 if (!decl
23710 && (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
23711 || decl_specifiers.type != error_mark_node))
23713 decl = cp_parser_init_declarator (parser,
23714 &decl_specifiers,
23715 checks,
23716 /*function_definition_allowed_p=*/true,
23717 member_p,
23718 declares_class_or_enum,
23719 &function_definition_p,
23720 NULL);
23722 /* 7.1.1-1 [dcl.stc]
23724 A storage-class-specifier shall not be specified in an explicit
23725 specialization... */
23726 if (decl
23727 && explicit_specialization_p
23728 && decl_specifiers.storage_class != sc_none)
23730 error_at (decl_spec_token_start->location,
23731 "explicit template specialization cannot have a storage class");
23732 decl = error_mark_node;
23735 if (decl && VAR_P (decl))
23736 check_template_variable (decl);
23739 /* Look for a trailing `;' after the declaration. */
23740 if (!function_definition_p
23741 && (decl == error_mark_node
23742 || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
23743 cp_parser_skip_to_end_of_block_or_statement (parser);
23745 out:
23746 pop_deferring_access_checks ();
23748 /* Clear any current qualification; whatever comes next is the start
23749 of something new. */
23750 parser->scope = NULL_TREE;
23751 parser->qualifying_scope = NULL_TREE;
23752 parser->object_scope = NULL_TREE;
23754 return decl;
23757 /* Parse a cast-expression that is not the operand of a unary "&". */
23759 static tree
23760 cp_parser_simple_cast_expression (cp_parser *parser)
23762 return cp_parser_cast_expression (parser, /*address_p=*/false,
23763 /*cast_p=*/false, /*decltype*/false, NULL);
23766 /* Parse a functional cast to TYPE. Returns an expression
23767 representing the cast. */
23769 static tree
23770 cp_parser_functional_cast (cp_parser* parser, tree type)
23772 vec<tree, va_gc> *vec;
23773 tree expression_list;
23774 tree cast;
23775 bool nonconst_p;
23777 if (!type)
23778 type = error_mark_node;
23780 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
23782 cp_lexer_set_source_position (parser->lexer);
23783 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
23784 expression_list = cp_parser_braced_list (parser, &nonconst_p);
23785 CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
23786 if (TREE_CODE (type) == TYPE_DECL)
23787 type = TREE_TYPE (type);
23788 return finish_compound_literal (type, expression_list,
23789 tf_warning_or_error);
23793 vec = cp_parser_parenthesized_expression_list (parser, non_attr,
23794 /*cast_p=*/true,
23795 /*allow_expansion_p=*/true,
23796 /*non_constant_p=*/NULL);
23797 if (vec == NULL)
23798 expression_list = error_mark_node;
23799 else
23801 expression_list = build_tree_list_vec (vec);
23802 release_tree_vector (vec);
23805 cast = build_functional_cast (type, expression_list,
23806 tf_warning_or_error);
23807 /* [expr.const]/1: In an integral constant expression "only type
23808 conversions to integral or enumeration type can be used". */
23809 if (TREE_CODE (type) == TYPE_DECL)
23810 type = TREE_TYPE (type);
23811 if (cast != error_mark_node
23812 && !cast_valid_in_integral_constant_expression_p (type)
23813 && cp_parser_non_integral_constant_expression (parser,
23814 NIC_CONSTRUCTOR))
23815 return error_mark_node;
23816 return cast;
23819 /* Save the tokens that make up the body of a member function defined
23820 in a class-specifier. The DECL_SPECIFIERS and DECLARATOR have
23821 already been parsed. The ATTRIBUTES are any GNU "__attribute__"
23822 specifiers applied to the declaration. Returns the FUNCTION_DECL
23823 for the member function. */
23825 static tree
23826 cp_parser_save_member_function_body (cp_parser* parser,
23827 cp_decl_specifier_seq *decl_specifiers,
23828 cp_declarator *declarator,
23829 tree attributes)
23831 cp_token *first;
23832 cp_token *last;
23833 tree fn;
23835 /* Create the FUNCTION_DECL. */
23836 fn = grokmethod (decl_specifiers, declarator, attributes);
23837 cp_finalize_omp_declare_simd (parser, fn);
23838 /* If something went badly wrong, bail out now. */
23839 if (fn == error_mark_node)
23841 /* If there's a function-body, skip it. */
23842 if (cp_parser_token_starts_function_definition_p
23843 (cp_lexer_peek_token (parser->lexer)))
23844 cp_parser_skip_to_end_of_block_or_statement (parser);
23845 return error_mark_node;
23848 /* Remember it, if there default args to post process. */
23849 cp_parser_save_default_args (parser, fn);
23851 /* Save away the tokens that make up the body of the
23852 function. */
23853 first = parser->lexer->next_token;
23854 /* Handle function try blocks. */
23855 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
23856 cp_lexer_consume_token (parser->lexer);
23857 /* We can have braced-init-list mem-initializers before the fn body. */
23858 if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
23860 cp_lexer_consume_token (parser->lexer);
23861 while (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
23863 /* cache_group will stop after an un-nested { } pair, too. */
23864 if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
23865 break;
23867 /* variadic mem-inits have ... after the ')'. */
23868 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
23869 cp_lexer_consume_token (parser->lexer);
23872 cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
23873 /* Handle function try blocks. */
23874 while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
23875 cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
23876 last = parser->lexer->next_token;
23878 /* Save away the inline definition; we will process it when the
23879 class is complete. */
23880 DECL_PENDING_INLINE_INFO (fn) = cp_token_cache_new (first, last);
23881 DECL_PENDING_INLINE_P (fn) = 1;
23883 /* We need to know that this was defined in the class, so that
23884 friend templates are handled correctly. */
23885 DECL_INITIALIZED_IN_CLASS_P (fn) = 1;
23887 /* Add FN to the queue of functions to be parsed later. */
23888 vec_safe_push (unparsed_funs_with_definitions, fn);
23890 return fn;
23893 /* Save the tokens that make up the in-class initializer for a non-static
23894 data member. Returns a DEFAULT_ARG. */
23896 static tree
23897 cp_parser_save_nsdmi (cp_parser* parser)
23899 return cp_parser_cache_defarg (parser, /*nsdmi=*/true);
23902 /* Parse a template-argument-list, as well as the trailing ">" (but
23903 not the opening "<"). See cp_parser_template_argument_list for the
23904 return value. */
23906 static tree
23907 cp_parser_enclosed_template_argument_list (cp_parser* parser)
23909 tree arguments;
23910 tree saved_scope;
23911 tree saved_qualifying_scope;
23912 tree saved_object_scope;
23913 bool saved_greater_than_is_operator_p;
23914 int saved_unevaluated_operand;
23915 int saved_inhibit_evaluation_warnings;
23917 /* [temp.names]
23919 When parsing a template-id, the first non-nested `>' is taken as
23920 the end of the template-argument-list rather than a greater-than
23921 operator. */
23922 saved_greater_than_is_operator_p
23923 = parser->greater_than_is_operator_p;
23924 parser->greater_than_is_operator_p = false;
23925 /* Parsing the argument list may modify SCOPE, so we save it
23926 here. */
23927 saved_scope = parser->scope;
23928 saved_qualifying_scope = parser->qualifying_scope;
23929 saved_object_scope = parser->object_scope;
23930 /* We need to evaluate the template arguments, even though this
23931 template-id may be nested within a "sizeof". */
23932 saved_unevaluated_operand = cp_unevaluated_operand;
23933 cp_unevaluated_operand = 0;
23934 saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
23935 c_inhibit_evaluation_warnings = 0;
23936 /* Parse the template-argument-list itself. */
23937 if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)
23938 || cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
23939 arguments = NULL_TREE;
23940 else
23941 arguments = cp_parser_template_argument_list (parser);
23942 /* Look for the `>' that ends the template-argument-list. If we find
23943 a '>>' instead, it's probably just a typo. */
23944 if (cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
23946 if (cxx_dialect != cxx98)
23948 /* In C++0x, a `>>' in a template argument list or cast
23949 expression is considered to be two separate `>'
23950 tokens. So, change the current token to a `>', but don't
23951 consume it: it will be consumed later when the outer
23952 template argument list (or cast expression) is parsed.
23953 Note that this replacement of `>' for `>>' is necessary
23954 even if we are parsing tentatively: in the tentative
23955 case, after calling
23956 cp_parser_enclosed_template_argument_list we will always
23957 throw away all of the template arguments and the first
23958 closing `>', either because the template argument list
23959 was erroneous or because we are replacing those tokens
23960 with a CPP_TEMPLATE_ID token. The second `>' (which will
23961 not have been thrown away) is needed either to close an
23962 outer template argument list or to complete a new-style
23963 cast. */
23964 cp_token *token = cp_lexer_peek_token (parser->lexer);
23965 token->type = CPP_GREATER;
23967 else if (!saved_greater_than_is_operator_p)
23969 /* If we're in a nested template argument list, the '>>' has
23970 to be a typo for '> >'. We emit the error message, but we
23971 continue parsing and we push a '>' as next token, so that
23972 the argument list will be parsed correctly. Note that the
23973 global source location is still on the token before the
23974 '>>', so we need to say explicitly where we want it. */
23975 cp_token *token = cp_lexer_peek_token (parser->lexer);
23976 error_at (token->location, "%<>>%> should be %<> >%> "
23977 "within a nested template argument list");
23979 token->type = CPP_GREATER;
23981 else
23983 /* If this is not a nested template argument list, the '>>'
23984 is a typo for '>'. Emit an error message and continue.
23985 Same deal about the token location, but here we can get it
23986 right by consuming the '>>' before issuing the diagnostic. */
23987 cp_token *token = cp_lexer_consume_token (parser->lexer);
23988 error_at (token->location,
23989 "spurious %<>>%>, use %<>%> to terminate "
23990 "a template argument list");
23993 else
23994 cp_parser_skip_to_end_of_template_parameter_list (parser);
23995 /* The `>' token might be a greater-than operator again now. */
23996 parser->greater_than_is_operator_p
23997 = saved_greater_than_is_operator_p;
23998 /* Restore the SAVED_SCOPE. */
23999 parser->scope = saved_scope;
24000 parser->qualifying_scope = saved_qualifying_scope;
24001 parser->object_scope = saved_object_scope;
24002 cp_unevaluated_operand = saved_unevaluated_operand;
24003 c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
24005 return arguments;
24008 /* MEMBER_FUNCTION is a member function, or a friend. If default
24009 arguments, or the body of the function have not yet been parsed,
24010 parse them now. */
24012 static void
24013 cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
24015 timevar_push (TV_PARSE_INMETH);
24016 /* If this member is a template, get the underlying
24017 FUNCTION_DECL. */
24018 if (DECL_FUNCTION_TEMPLATE_P (member_function))
24019 member_function = DECL_TEMPLATE_RESULT (member_function);
24021 /* There should not be any class definitions in progress at this
24022 point; the bodies of members are only parsed outside of all class
24023 definitions. */
24024 gcc_assert (parser->num_classes_being_defined == 0);
24025 /* While we're parsing the member functions we might encounter more
24026 classes. We want to handle them right away, but we don't want
24027 them getting mixed up with functions that are currently in the
24028 queue. */
24029 push_unparsed_function_queues (parser);
24031 /* Make sure that any template parameters are in scope. */
24032 maybe_begin_member_template_processing (member_function);
24034 /* If the body of the function has not yet been parsed, parse it
24035 now. */
24036 if (DECL_PENDING_INLINE_P (member_function))
24038 tree function_scope;
24039 cp_token_cache *tokens;
24041 /* The function is no longer pending; we are processing it. */
24042 tokens = DECL_PENDING_INLINE_INFO (member_function);
24043 DECL_PENDING_INLINE_INFO (member_function) = NULL;
24044 DECL_PENDING_INLINE_P (member_function) = 0;
24046 /* If this is a local class, enter the scope of the containing
24047 function. */
24048 function_scope = current_function_decl;
24049 if (function_scope)
24050 push_function_context ();
24052 /* Push the body of the function onto the lexer stack. */
24053 cp_parser_push_lexer_for_tokens (parser, tokens);
24055 /* Let the front end know that we going to be defining this
24056 function. */
24057 start_preparsed_function (member_function, NULL_TREE,
24058 SF_PRE_PARSED | SF_INCLASS_INLINE);
24060 /* Don't do access checking if it is a templated function. */
24061 if (processing_template_decl)
24062 push_deferring_access_checks (dk_no_check);
24064 /* #pragma omp declare reduction needs special parsing. */
24065 if (DECL_OMP_DECLARE_REDUCTION_P (member_function))
24067 parser->lexer->in_pragma = true;
24068 cp_parser_omp_declare_reduction_exprs (member_function, parser);
24069 finish_function (/*inline*/2);
24070 cp_check_omp_declare_reduction (member_function);
24072 else
24073 /* Now, parse the body of the function. */
24074 cp_parser_function_definition_after_declarator (parser,
24075 /*inline_p=*/true);
24077 if (processing_template_decl)
24078 pop_deferring_access_checks ();
24080 /* Leave the scope of the containing function. */
24081 if (function_scope)
24082 pop_function_context ();
24083 cp_parser_pop_lexer (parser);
24086 /* Remove any template parameters from the symbol table. */
24087 maybe_end_member_template_processing ();
24089 /* Restore the queue. */
24090 pop_unparsed_function_queues (parser);
24091 timevar_pop (TV_PARSE_INMETH);
24094 /* If DECL contains any default args, remember it on the unparsed
24095 functions queue. */
24097 static void
24098 cp_parser_save_default_args (cp_parser* parser, tree decl)
24100 tree probe;
24102 for (probe = TYPE_ARG_TYPES (TREE_TYPE (decl));
24103 probe;
24104 probe = TREE_CHAIN (probe))
24105 if (TREE_PURPOSE (probe))
24107 cp_default_arg_entry entry = {current_class_type, decl};
24108 vec_safe_push (unparsed_funs_with_default_args, entry);
24109 break;
24113 /* DEFAULT_ARG contains the saved tokens for the initializer of DECL,
24114 which is either a FIELD_DECL or PARM_DECL. Parse it and return
24115 the result. For a PARM_DECL, PARMTYPE is the corresponding type
24116 from the parameter-type-list. */
24118 static tree
24119 cp_parser_late_parse_one_default_arg (cp_parser *parser, tree decl,
24120 tree default_arg, tree parmtype)
24122 cp_token_cache *tokens;
24123 tree parsed_arg;
24124 bool dummy;
24126 if (default_arg == error_mark_node)
24127 return error_mark_node;
24129 /* Push the saved tokens for the default argument onto the parser's
24130 lexer stack. */
24131 tokens = DEFARG_TOKENS (default_arg);
24132 cp_parser_push_lexer_for_tokens (parser, tokens);
24134 start_lambda_scope (decl);
24136 /* Parse the default argument. */
24137 parsed_arg = cp_parser_initializer (parser, &dummy, &dummy);
24138 if (BRACE_ENCLOSED_INITIALIZER_P (parsed_arg))
24139 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
24141 finish_lambda_scope ();
24143 if (parsed_arg == error_mark_node)
24144 cp_parser_skip_to_end_of_statement (parser);
24146 if (!processing_template_decl)
24148 /* In a non-template class, check conversions now. In a template,
24149 we'll wait and instantiate these as needed. */
24150 if (TREE_CODE (decl) == PARM_DECL)
24151 parsed_arg = check_default_argument (parmtype, parsed_arg,
24152 tf_warning_or_error);
24153 else
24154 parsed_arg = digest_nsdmi_init (decl, parsed_arg);
24157 /* If the token stream has not been completely used up, then
24158 there was extra junk after the end of the default
24159 argument. */
24160 if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
24162 if (TREE_CODE (decl) == PARM_DECL)
24163 cp_parser_error (parser, "expected %<,%>");
24164 else
24165 cp_parser_error (parser, "expected %<;%>");
24168 /* Revert to the main lexer. */
24169 cp_parser_pop_lexer (parser);
24171 return parsed_arg;
24174 /* FIELD is a non-static data member with an initializer which we saved for
24175 later; parse it now. */
24177 static void
24178 cp_parser_late_parsing_nsdmi (cp_parser *parser, tree field)
24180 tree def;
24182 maybe_begin_member_template_processing (field);
24184 push_unparsed_function_queues (parser);
24185 def = cp_parser_late_parse_one_default_arg (parser, field,
24186 DECL_INITIAL (field),
24187 NULL_TREE);
24188 pop_unparsed_function_queues (parser);
24190 maybe_end_member_template_processing ();
24192 DECL_INITIAL (field) = def;
24195 /* FN is a FUNCTION_DECL which may contains a parameter with an
24196 unparsed DEFAULT_ARG. Parse the default args now. This function
24197 assumes that the current scope is the scope in which the default
24198 argument should be processed. */
24200 static void
24201 cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
24203 bool saved_local_variables_forbidden_p;
24204 tree parm, parmdecl;
24206 /* While we're parsing the default args, we might (due to the
24207 statement expression extension) encounter more classes. We want
24208 to handle them right away, but we don't want them getting mixed
24209 up with default args that are currently in the queue. */
24210 push_unparsed_function_queues (parser);
24212 /* Local variable names (and the `this' keyword) may not appear
24213 in a default argument. */
24214 saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
24215 parser->local_variables_forbidden_p = true;
24217 push_defarg_context (fn);
24219 for (parm = TYPE_ARG_TYPES (TREE_TYPE (fn)),
24220 parmdecl = DECL_ARGUMENTS (fn);
24221 parm && parm != void_list_node;
24222 parm = TREE_CHAIN (parm),
24223 parmdecl = DECL_CHAIN (parmdecl))
24225 tree default_arg = TREE_PURPOSE (parm);
24226 tree parsed_arg;
24227 vec<tree, va_gc> *insts;
24228 tree copy;
24229 unsigned ix;
24231 if (!default_arg)
24232 continue;
24234 if (TREE_CODE (default_arg) != DEFAULT_ARG)
24235 /* This can happen for a friend declaration for a function
24236 already declared with default arguments. */
24237 continue;
24239 parsed_arg
24240 = cp_parser_late_parse_one_default_arg (parser, parmdecl,
24241 default_arg,
24242 TREE_VALUE (parm));
24243 if (parsed_arg == error_mark_node)
24245 continue;
24248 TREE_PURPOSE (parm) = parsed_arg;
24250 /* Update any instantiations we've already created. */
24251 for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
24252 vec_safe_iterate (insts, ix, &copy); ix++)
24253 TREE_PURPOSE (copy) = parsed_arg;
24256 pop_defarg_context ();
24258 /* Make sure no default arg is missing. */
24259 check_default_args (fn);
24261 /* Restore the state of local_variables_forbidden_p. */
24262 parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
24264 /* Restore the queue. */
24265 pop_unparsed_function_queues (parser);
24268 /* Subroutine of cp_parser_sizeof_operand, for handling C++11
24270 sizeof ... ( identifier )
24272 where the 'sizeof' token has already been consumed. */
24274 static tree
24275 cp_parser_sizeof_pack (cp_parser *parser)
24277 /* Consume the `...'. */
24278 cp_lexer_consume_token (parser->lexer);
24279 maybe_warn_variadic_templates ();
24281 bool paren = cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN);
24282 if (paren)
24283 cp_lexer_consume_token (parser->lexer);
24284 else
24285 permerror (cp_lexer_peek_token (parser->lexer)->location,
24286 "%<sizeof...%> argument must be surrounded by parentheses");
24288 cp_token *token = cp_lexer_peek_token (parser->lexer);
24289 tree name = cp_parser_identifier (parser);
24290 if (name == error_mark_node)
24291 return error_mark_node;
24292 /* The name is not qualified. */
24293 parser->scope = NULL_TREE;
24294 parser->qualifying_scope = NULL_TREE;
24295 parser->object_scope = NULL_TREE;
24296 tree expr = cp_parser_lookup_name_simple (parser, name, token->location);
24297 if (expr == error_mark_node)
24298 cp_parser_name_lookup_error (parser, name, expr, NLE_NULL,
24299 token->location);
24300 if (TREE_CODE (expr) == TYPE_DECL)
24301 expr = TREE_TYPE (expr);
24302 else if (TREE_CODE (expr) == CONST_DECL)
24303 expr = DECL_INITIAL (expr);
24304 expr = make_pack_expansion (expr);
24306 if (paren)
24307 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
24309 return expr;
24312 /* Parse the operand of `sizeof' (or a similar operator). Returns
24313 either a TYPE or an expression, depending on the form of the
24314 input. The KEYWORD indicates which kind of expression we have
24315 encountered. */
24317 static tree
24318 cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
24320 tree expr = NULL_TREE;
24321 const char *saved_message;
24322 char *tmp;
24323 bool saved_integral_constant_expression_p;
24324 bool saved_non_integral_constant_expression_p;
24326 /* If it's a `...', then we are computing the length of a parameter
24327 pack. */
24328 if (keyword == RID_SIZEOF
24329 && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
24330 return cp_parser_sizeof_pack (parser);
24332 /* Types cannot be defined in a `sizeof' expression. Save away the
24333 old message. */
24334 saved_message = parser->type_definition_forbidden_message;
24335 /* And create the new one. */
24336 tmp = concat ("types may not be defined in %<",
24337 IDENTIFIER_POINTER (ridpointers[keyword]),
24338 "%> expressions", NULL);
24339 parser->type_definition_forbidden_message = tmp;
24341 /* The restrictions on constant-expressions do not apply inside
24342 sizeof expressions. */
24343 saved_integral_constant_expression_p
24344 = parser->integral_constant_expression_p;
24345 saved_non_integral_constant_expression_p
24346 = parser->non_integral_constant_expression_p;
24347 parser->integral_constant_expression_p = false;
24349 /* Do not actually evaluate the expression. */
24350 ++cp_unevaluated_operand;
24351 ++c_inhibit_evaluation_warnings;
24352 /* If it's a `(', then we might be looking at the type-id
24353 construction. */
24354 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24356 tree type = NULL_TREE;
24358 /* We can't be sure yet whether we're looking at a type-id or an
24359 expression. */
24360 cp_parser_parse_tentatively (parser);
24361 /* Note: as a GNU Extension, compound literals are considered
24362 postfix-expressions as they are in C99, so they are valid
24363 arguments to sizeof. See comment in cp_parser_cast_expression
24364 for details. */
24365 if (cp_parser_compound_literal_p (parser))
24366 cp_parser_simulate_error (parser);
24367 else
24369 bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
24370 parser->in_type_id_in_expr_p = true;
24371 /* Look for the type-id. */
24372 type = cp_parser_type_id (parser);
24373 /* Look for the closing `)'. */
24374 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
24375 parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
24378 /* If all went well, then we're done. */
24379 if (cp_parser_parse_definitely (parser))
24381 cp_decl_specifier_seq decl_specs;
24383 /* Build a trivial decl-specifier-seq. */
24384 clear_decl_specs (&decl_specs);
24385 decl_specs.type = type;
24387 /* Call grokdeclarator to figure out what type this is. */
24388 expr = grokdeclarator (NULL,
24389 &decl_specs,
24390 TYPENAME,
24391 /*initialized=*/0,
24392 /*attrlist=*/NULL);
24396 /* If the type-id production did not work out, then we must be
24397 looking at the unary-expression production. */
24398 if (!expr)
24399 expr = cp_parser_unary_expression (parser);
24401 /* Go back to evaluating expressions. */
24402 --cp_unevaluated_operand;
24403 --c_inhibit_evaluation_warnings;
24405 /* Free the message we created. */
24406 free (tmp);
24407 /* And restore the old one. */
24408 parser->type_definition_forbidden_message = saved_message;
24409 parser->integral_constant_expression_p
24410 = saved_integral_constant_expression_p;
24411 parser->non_integral_constant_expression_p
24412 = saved_non_integral_constant_expression_p;
24414 return expr;
24417 /* If the current declaration has no declarator, return true. */
24419 static bool
24420 cp_parser_declares_only_class_p (cp_parser *parser)
24422 /* If the next token is a `;' or a `,' then there is no
24423 declarator. */
24424 return (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
24425 || cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
24428 /* Update the DECL_SPECS to reflect the storage class indicated by
24429 KEYWORD. */
24431 static void
24432 cp_parser_set_storage_class (cp_parser *parser,
24433 cp_decl_specifier_seq *decl_specs,
24434 enum rid keyword,
24435 cp_token *token)
24437 cp_storage_class storage_class;
24439 if (parser->in_unbraced_linkage_specification_p)
24441 error_at (token->location, "invalid use of %qD in linkage specification",
24442 ridpointers[keyword]);
24443 return;
24445 else if (decl_specs->storage_class != sc_none)
24447 decl_specs->conflicting_specifiers_p = true;
24448 return;
24451 if ((keyword == RID_EXTERN || keyword == RID_STATIC)
24452 && decl_spec_seq_has_spec_p (decl_specs, ds_thread)
24453 && decl_specs->gnu_thread_keyword_p)
24455 pedwarn (decl_specs->locations[ds_thread], 0,
24456 "%<__thread%> before %qD", ridpointers[keyword]);
24459 switch (keyword)
24461 case RID_AUTO:
24462 storage_class = sc_auto;
24463 break;
24464 case RID_REGISTER:
24465 storage_class = sc_register;
24466 break;
24467 case RID_STATIC:
24468 storage_class = sc_static;
24469 break;
24470 case RID_EXTERN:
24471 storage_class = sc_extern;
24472 break;
24473 case RID_MUTABLE:
24474 storage_class = sc_mutable;
24475 break;
24476 default:
24477 gcc_unreachable ();
24479 decl_specs->storage_class = storage_class;
24480 set_and_check_decl_spec_loc (decl_specs, ds_storage_class, token);
24482 /* A storage class specifier cannot be applied alongside a typedef
24483 specifier. If there is a typedef specifier present then set
24484 conflicting_specifiers_p which will trigger an error later
24485 on in grokdeclarator. */
24486 if (decl_spec_seq_has_spec_p (decl_specs, ds_typedef))
24487 decl_specs->conflicting_specifiers_p = true;
24490 /* Update the DECL_SPECS to reflect the TYPE_SPEC. If TYPE_DEFINITION_P
24491 is true, the type is a class or enum definition. */
24493 static void
24494 cp_parser_set_decl_spec_type (cp_decl_specifier_seq *decl_specs,
24495 tree type_spec,
24496 cp_token *token,
24497 bool type_definition_p)
24499 decl_specs->any_specifiers_p = true;
24501 /* If the user tries to redeclare bool, char16_t, char32_t, or wchar_t
24502 (with, for example, in "typedef int wchar_t;") we remember that
24503 this is what happened. In system headers, we ignore these
24504 declarations so that G++ can work with system headers that are not
24505 C++-safe. */
24506 if (decl_spec_seq_has_spec_p (decl_specs, ds_typedef)
24507 && !type_definition_p
24508 && (type_spec == boolean_type_node
24509 || type_spec == char16_type_node
24510 || type_spec == char32_type_node
24511 || type_spec == wchar_type_node)
24512 && (decl_specs->type
24513 || decl_spec_seq_has_spec_p (decl_specs, ds_long)
24514 || decl_spec_seq_has_spec_p (decl_specs, ds_short)
24515 || decl_spec_seq_has_spec_p (decl_specs, ds_unsigned)
24516 || decl_spec_seq_has_spec_p (decl_specs, ds_signed)))
24518 decl_specs->redefined_builtin_type = type_spec;
24519 set_and_check_decl_spec_loc (decl_specs,
24520 ds_redefined_builtin_type_spec,
24521 token);
24522 if (!decl_specs->type)
24524 decl_specs->type = type_spec;
24525 decl_specs->type_definition_p = false;
24526 set_and_check_decl_spec_loc (decl_specs,ds_type_spec, token);
24529 else if (decl_specs->type)
24530 decl_specs->multiple_types_p = true;
24531 else
24533 decl_specs->type = type_spec;
24534 decl_specs->type_definition_p = type_definition_p;
24535 decl_specs->redefined_builtin_type = NULL_TREE;
24536 set_and_check_decl_spec_loc (decl_specs, ds_type_spec, token);
24540 /* True iff TOKEN is the GNU keyword __thread. */
24542 static bool
24543 token_is__thread (cp_token *token)
24545 gcc_assert (token->keyword == RID_THREAD);
24546 return !strcmp (IDENTIFIER_POINTER (token->u.value), "__thread");
24549 /* Set the location for a declarator specifier and check if it is
24550 duplicated.
24552 DECL_SPECS is the sequence of declarator specifiers onto which to
24553 set the location.
24555 DS is the single declarator specifier to set which location is to
24556 be set onto the existing sequence of declarators.
24558 LOCATION is the location for the declarator specifier to
24559 consider. */
24561 static void
24562 set_and_check_decl_spec_loc (cp_decl_specifier_seq *decl_specs,
24563 cp_decl_spec ds, cp_token *token)
24565 gcc_assert (ds < ds_last);
24567 if (decl_specs == NULL)
24568 return;
24570 source_location location = token->location;
24572 if (decl_specs->locations[ds] == 0)
24574 decl_specs->locations[ds] = location;
24575 if (ds == ds_thread)
24576 decl_specs->gnu_thread_keyword_p = token_is__thread (token);
24578 else
24580 if (ds == ds_long)
24582 if (decl_specs->locations[ds_long_long] != 0)
24583 error_at (location,
24584 "%<long long long%> is too long for GCC");
24585 else
24587 decl_specs->locations[ds_long_long] = location;
24588 pedwarn_cxx98 (location,
24589 OPT_Wlong_long,
24590 "ISO C++ 1998 does not support %<long long%>");
24593 else if (ds == ds_thread)
24595 bool gnu = token_is__thread (token);
24596 if (gnu != decl_specs->gnu_thread_keyword_p)
24597 error_at (location,
24598 "both %<__thread%> and %<thread_local%> specified");
24599 else
24600 error_at (location, "duplicate %qD", token->u.value);
24602 else
24604 static const char *const decl_spec_names[] = {
24605 "signed",
24606 "unsigned",
24607 "short",
24608 "long",
24609 "const",
24610 "volatile",
24611 "restrict",
24612 "inline",
24613 "virtual",
24614 "explicit",
24615 "friend",
24616 "typedef",
24617 "using",
24618 "constexpr",
24619 "__complex"
24621 error_at (location,
24622 "duplicate %qs", decl_spec_names[ds]);
24627 /* Return true iff the declarator specifier DS is present in the
24628 sequence of declarator specifiers DECL_SPECS. */
24630 bool
24631 decl_spec_seq_has_spec_p (const cp_decl_specifier_seq * decl_specs,
24632 cp_decl_spec ds)
24634 gcc_assert (ds < ds_last);
24636 if (decl_specs == NULL)
24637 return false;
24639 return decl_specs->locations[ds] != 0;
24642 /* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
24643 Returns TRUE iff `friend' appears among the DECL_SPECIFIERS. */
24645 static bool
24646 cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
24648 return decl_spec_seq_has_spec_p (decl_specifiers, ds_friend);
24651 /* Issue an error message indicating that TOKEN_DESC was expected.
24652 If KEYWORD is true, it indicated this function is called by
24653 cp_parser_require_keword and the required token can only be
24654 a indicated keyword. */
24656 static void
24657 cp_parser_required_error (cp_parser *parser,
24658 required_token token_desc,
24659 bool keyword)
24661 switch (token_desc)
24663 case RT_NEW:
24664 cp_parser_error (parser, "expected %<new%>");
24665 return;
24666 case RT_DELETE:
24667 cp_parser_error (parser, "expected %<delete%>");
24668 return;
24669 case RT_RETURN:
24670 cp_parser_error (parser, "expected %<return%>");
24671 return;
24672 case RT_WHILE:
24673 cp_parser_error (parser, "expected %<while%>");
24674 return;
24675 case RT_EXTERN:
24676 cp_parser_error (parser, "expected %<extern%>");
24677 return;
24678 case RT_STATIC_ASSERT:
24679 cp_parser_error (parser, "expected %<static_assert%>");
24680 return;
24681 case RT_DECLTYPE:
24682 cp_parser_error (parser, "expected %<decltype%>");
24683 return;
24684 case RT_OPERATOR:
24685 cp_parser_error (parser, "expected %<operator%>");
24686 return;
24687 case RT_CLASS:
24688 cp_parser_error (parser, "expected %<class%>");
24689 return;
24690 case RT_TEMPLATE:
24691 cp_parser_error (parser, "expected %<template%>");
24692 return;
24693 case RT_NAMESPACE:
24694 cp_parser_error (parser, "expected %<namespace%>");
24695 return;
24696 case RT_USING:
24697 cp_parser_error (parser, "expected %<using%>");
24698 return;
24699 case RT_ASM:
24700 cp_parser_error (parser, "expected %<asm%>");
24701 return;
24702 case RT_TRY:
24703 cp_parser_error (parser, "expected %<try%>");
24704 return;
24705 case RT_CATCH:
24706 cp_parser_error (parser, "expected %<catch%>");
24707 return;
24708 case RT_THROW:
24709 cp_parser_error (parser, "expected %<throw%>");
24710 return;
24711 case RT_LABEL:
24712 cp_parser_error (parser, "expected %<__label__%>");
24713 return;
24714 case RT_AT_TRY:
24715 cp_parser_error (parser, "expected %<@try%>");
24716 return;
24717 case RT_AT_SYNCHRONIZED:
24718 cp_parser_error (parser, "expected %<@synchronized%>");
24719 return;
24720 case RT_AT_THROW:
24721 cp_parser_error (parser, "expected %<@throw%>");
24722 return;
24723 case RT_TRANSACTION_ATOMIC:
24724 cp_parser_error (parser, "expected %<__transaction_atomic%>");
24725 return;
24726 case RT_TRANSACTION_RELAXED:
24727 cp_parser_error (parser, "expected %<__transaction_relaxed%>");
24728 return;
24729 default:
24730 break;
24732 if (!keyword)
24734 switch (token_desc)
24736 case RT_SEMICOLON:
24737 cp_parser_error (parser, "expected %<;%>");
24738 return;
24739 case RT_OPEN_PAREN:
24740 cp_parser_error (parser, "expected %<(%>");
24741 return;
24742 case RT_CLOSE_BRACE:
24743 cp_parser_error (parser, "expected %<}%>");
24744 return;
24745 case RT_OPEN_BRACE:
24746 cp_parser_error (parser, "expected %<{%>");
24747 return;
24748 case RT_CLOSE_SQUARE:
24749 cp_parser_error (parser, "expected %<]%>");
24750 return;
24751 case RT_OPEN_SQUARE:
24752 cp_parser_error (parser, "expected %<[%>");
24753 return;
24754 case RT_COMMA:
24755 cp_parser_error (parser, "expected %<,%>");
24756 return;
24757 case RT_SCOPE:
24758 cp_parser_error (parser, "expected %<::%>");
24759 return;
24760 case RT_LESS:
24761 cp_parser_error (parser, "expected %<<%>");
24762 return;
24763 case RT_GREATER:
24764 cp_parser_error (parser, "expected %<>%>");
24765 return;
24766 case RT_EQ:
24767 cp_parser_error (parser, "expected %<=%>");
24768 return;
24769 case RT_ELLIPSIS:
24770 cp_parser_error (parser, "expected %<...%>");
24771 return;
24772 case RT_MULT:
24773 cp_parser_error (parser, "expected %<*%>");
24774 return;
24775 case RT_COMPL:
24776 cp_parser_error (parser, "expected %<~%>");
24777 return;
24778 case RT_COLON:
24779 cp_parser_error (parser, "expected %<:%>");
24780 return;
24781 case RT_COLON_SCOPE:
24782 cp_parser_error (parser, "expected %<:%> or %<::%>");
24783 return;
24784 case RT_CLOSE_PAREN:
24785 cp_parser_error (parser, "expected %<)%>");
24786 return;
24787 case RT_COMMA_CLOSE_PAREN:
24788 cp_parser_error (parser, "expected %<,%> or %<)%>");
24789 return;
24790 case RT_PRAGMA_EOL:
24791 cp_parser_error (parser, "expected end of line");
24792 return;
24793 case RT_NAME:
24794 cp_parser_error (parser, "expected identifier");
24795 return;
24796 case RT_SELECT:
24797 cp_parser_error (parser, "expected selection-statement");
24798 return;
24799 case RT_INTERATION:
24800 cp_parser_error (parser, "expected iteration-statement");
24801 return;
24802 case RT_JUMP:
24803 cp_parser_error (parser, "expected jump-statement");
24804 return;
24805 case RT_CLASS_KEY:
24806 cp_parser_error (parser, "expected class-key");
24807 return;
24808 case RT_CLASS_TYPENAME_TEMPLATE:
24809 cp_parser_error (parser,
24810 "expected %<class%>, %<typename%>, or %<template%>");
24811 return;
24812 default:
24813 gcc_unreachable ();
24816 else
24817 gcc_unreachable ();
24822 /* If the next token is of the indicated TYPE, consume it. Otherwise,
24823 issue an error message indicating that TOKEN_DESC was expected.
24825 Returns the token consumed, if the token had the appropriate type.
24826 Otherwise, returns NULL. */
24828 static cp_token *
24829 cp_parser_require (cp_parser* parser,
24830 enum cpp_ttype type,
24831 required_token token_desc)
24833 if (cp_lexer_next_token_is (parser->lexer, type))
24834 return cp_lexer_consume_token (parser->lexer);
24835 else
24837 /* Output the MESSAGE -- unless we're parsing tentatively. */
24838 if (!cp_parser_simulate_error (parser))
24839 cp_parser_required_error (parser, token_desc, /*keyword=*/false);
24840 return NULL;
24844 /* An error message is produced if the next token is not '>'.
24845 All further tokens are skipped until the desired token is
24846 found or '{', '}', ';' or an unbalanced ')' or ']'. */
24848 static void
24849 cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
24851 /* Current level of '< ... >'. */
24852 unsigned level = 0;
24853 /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'. */
24854 unsigned nesting_depth = 0;
24856 /* Are we ready, yet? If not, issue error message. */
24857 if (cp_parser_require (parser, CPP_GREATER, RT_GREATER))
24858 return;
24860 /* Skip tokens until the desired token is found. */
24861 while (true)
24863 /* Peek at the next token. */
24864 switch (cp_lexer_peek_token (parser->lexer)->type)
24866 case CPP_LESS:
24867 if (!nesting_depth)
24868 ++level;
24869 break;
24871 case CPP_RSHIFT:
24872 if (cxx_dialect == cxx98)
24873 /* C++0x views the `>>' operator as two `>' tokens, but
24874 C++98 does not. */
24875 break;
24876 else if (!nesting_depth && level-- == 0)
24878 /* We've hit a `>>' where the first `>' closes the
24879 template argument list, and the second `>' is
24880 spurious. Just consume the `>>' and stop; we've
24881 already produced at least one error. */
24882 cp_lexer_consume_token (parser->lexer);
24883 return;
24885 /* Fall through for C++0x, so we handle the second `>' in
24886 the `>>'. */
24888 case CPP_GREATER:
24889 if (!nesting_depth && level-- == 0)
24891 /* We've reached the token we want, consume it and stop. */
24892 cp_lexer_consume_token (parser->lexer);
24893 return;
24895 break;
24897 case CPP_OPEN_PAREN:
24898 case CPP_OPEN_SQUARE:
24899 ++nesting_depth;
24900 break;
24902 case CPP_CLOSE_PAREN:
24903 case CPP_CLOSE_SQUARE:
24904 if (nesting_depth-- == 0)
24905 return;
24906 break;
24908 case CPP_EOF:
24909 case CPP_PRAGMA_EOL:
24910 case CPP_SEMICOLON:
24911 case CPP_OPEN_BRACE:
24912 case CPP_CLOSE_BRACE:
24913 /* The '>' was probably forgotten, don't look further. */
24914 return;
24916 default:
24917 break;
24920 /* Consume this token. */
24921 cp_lexer_consume_token (parser->lexer);
24925 /* If the next token is the indicated keyword, consume it. Otherwise,
24926 issue an error message indicating that TOKEN_DESC was expected.
24928 Returns the token consumed, if the token had the appropriate type.
24929 Otherwise, returns NULL. */
24931 static cp_token *
24932 cp_parser_require_keyword (cp_parser* parser,
24933 enum rid keyword,
24934 required_token token_desc)
24936 cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
24938 if (token && token->keyword != keyword)
24940 cp_parser_required_error (parser, token_desc, /*keyword=*/true);
24941 return NULL;
24944 return token;
24947 /* Returns TRUE iff TOKEN is a token that can begin the body of a
24948 function-definition. */
24950 static bool
24951 cp_parser_token_starts_function_definition_p (cp_token* token)
24953 return (/* An ordinary function-body begins with an `{'. */
24954 token->type == CPP_OPEN_BRACE
24955 /* A ctor-initializer begins with a `:'. */
24956 || token->type == CPP_COLON
24957 /* A function-try-block begins with `try'. */
24958 || token->keyword == RID_TRY
24959 /* A function-transaction-block begins with `__transaction_atomic'
24960 or `__transaction_relaxed'. */
24961 || token->keyword == RID_TRANSACTION_ATOMIC
24962 || token->keyword == RID_TRANSACTION_RELAXED
24963 /* The named return value extension begins with `return'. */
24964 || token->keyword == RID_RETURN);
24967 /* Returns TRUE iff the next token is the ":" or "{" beginning a class
24968 definition. */
24970 static bool
24971 cp_parser_next_token_starts_class_definition_p (cp_parser *parser)
24973 cp_token *token;
24975 token = cp_lexer_peek_token (parser->lexer);
24976 return (token->type == CPP_OPEN_BRACE
24977 || (token->type == CPP_COLON
24978 && !parser->colon_doesnt_start_class_def_p));
24981 /* Returns TRUE iff the next token is the "," or ">" (or `>>', in
24982 C++0x) ending a template-argument. */
24984 static bool
24985 cp_parser_next_token_ends_template_argument_p (cp_parser *parser)
24987 cp_token *token;
24989 token = cp_lexer_peek_token (parser->lexer);
24990 return (token->type == CPP_COMMA
24991 || token->type == CPP_GREATER
24992 || token->type == CPP_ELLIPSIS
24993 || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT));
24996 /* Returns TRUE iff the n-th token is a "<", or the n-th is a "[" and the
24997 (n+1)-th is a ":" (which is a possible digraph typo for "< ::"). */
24999 static bool
25000 cp_parser_nth_token_starts_template_argument_list_p (cp_parser * parser,
25001 size_t n)
25003 cp_token *token;
25005 token = cp_lexer_peek_nth_token (parser->lexer, n);
25006 if (token->type == CPP_LESS)
25007 return true;
25008 /* Check for the sequence `<::' in the original code. It would be lexed as
25009 `[:', where `[' is a digraph, and there is no whitespace before
25010 `:'. */
25011 if (token->type == CPP_OPEN_SQUARE && token->flags & DIGRAPH)
25013 cp_token *token2;
25014 token2 = cp_lexer_peek_nth_token (parser->lexer, n+1);
25015 if (token2->type == CPP_COLON && !(token2->flags & PREV_WHITE))
25016 return true;
25018 return false;
25021 /* Returns the kind of tag indicated by TOKEN, if it is a class-key,
25022 or none_type otherwise. */
25024 static enum tag_types
25025 cp_parser_token_is_class_key (cp_token* token)
25027 switch (token->keyword)
25029 case RID_CLASS:
25030 return class_type;
25031 case RID_STRUCT:
25032 return record_type;
25033 case RID_UNION:
25034 return union_type;
25036 default:
25037 return none_type;
25041 /* Returns the kind of tag indicated by TOKEN, if it is a type-parameter-key,
25042 or none_type otherwise or if the token is null. */
25044 static enum tag_types
25045 cp_parser_token_is_type_parameter_key (cp_token* token)
25047 if (!token)
25048 return none_type;
25050 switch (token->keyword)
25052 case RID_CLASS:
25053 return class_type;
25054 case RID_TYPENAME:
25055 return typename_type;
25057 default:
25058 return none_type;
25062 /* Issue an error message if the CLASS_KEY does not match the TYPE. */
25064 static void
25065 cp_parser_check_class_key (enum tag_types class_key, tree type)
25067 if (type == error_mark_node)
25068 return;
25069 if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
25071 if (permerror (input_location, "%qs tag used in naming %q#T",
25072 class_key == union_type ? "union"
25073 : class_key == record_type ? "struct" : "class",
25074 type))
25075 inform (DECL_SOURCE_LOCATION (TYPE_NAME (type)),
25076 "%q#T was previously declared here", type);
25080 /* Issue an error message if DECL is redeclared with different
25081 access than its original declaration [class.access.spec/3].
25082 This applies to nested classes and nested class templates.
25083 [class.mem/1]. */
25085 static void
25086 cp_parser_check_access_in_redeclaration (tree decl, location_t location)
25088 if (!decl || !CLASS_TYPE_P (TREE_TYPE (decl)))
25089 return;
25091 if ((TREE_PRIVATE (decl)
25092 != (current_access_specifier == access_private_node))
25093 || (TREE_PROTECTED (decl)
25094 != (current_access_specifier == access_protected_node)))
25095 error_at (location, "%qD redeclared with different access", decl);
25098 /* Look for the `template' keyword, as a syntactic disambiguator.
25099 Return TRUE iff it is present, in which case it will be
25100 consumed. */
25102 static bool
25103 cp_parser_optional_template_keyword (cp_parser *parser)
25105 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
25107 /* In C++98 the `template' keyword can only be used within templates;
25108 outside templates the parser can always figure out what is a
25109 template and what is not. In C++11, per the resolution of DR 468,
25110 `template' is allowed in cases where it is not strictly necessary. */
25111 if (!processing_template_decl
25112 && pedantic && cxx_dialect == cxx98)
25114 cp_token *token = cp_lexer_peek_token (parser->lexer);
25115 pedwarn (token->location, OPT_Wpedantic,
25116 "in C++98 %<template%> (as a disambiguator) is only "
25117 "allowed within templates");
25118 /* If this part of the token stream is rescanned, the same
25119 error message would be generated. So, we purge the token
25120 from the stream. */
25121 cp_lexer_purge_token (parser->lexer);
25122 return false;
25124 else
25126 /* Consume the `template' keyword. */
25127 cp_lexer_consume_token (parser->lexer);
25128 return true;
25131 return false;
25134 /* The next token is a CPP_NESTED_NAME_SPECIFIER. Consume the token,
25135 set PARSER->SCOPE, and perform other related actions. */
25137 static void
25138 cp_parser_pre_parsed_nested_name_specifier (cp_parser *parser)
25140 int i;
25141 struct tree_check *check_value;
25142 deferred_access_check *chk;
25143 vec<deferred_access_check, va_gc> *checks;
25145 /* Get the stored value. */
25146 check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
25147 /* Perform any access checks that were deferred. */
25148 checks = check_value->checks;
25149 if (checks)
25151 FOR_EACH_VEC_SAFE_ELT (checks, i, chk)
25152 perform_or_defer_access_check (chk->binfo,
25153 chk->decl,
25154 chk->diag_decl, tf_warning_or_error);
25156 /* Set the scope from the stored value. */
25157 parser->scope = check_value->value;
25158 parser->qualifying_scope = check_value->qualifying_scope;
25159 parser->object_scope = NULL_TREE;
25162 /* Consume tokens up through a non-nested END token. Returns TRUE if we
25163 encounter the end of a block before what we were looking for. */
25165 static bool
25166 cp_parser_cache_group (cp_parser *parser,
25167 enum cpp_ttype end,
25168 unsigned depth)
25170 while (true)
25172 cp_token *token = cp_lexer_peek_token (parser->lexer);
25174 /* Abort a parenthesized expression if we encounter a semicolon. */
25175 if ((end == CPP_CLOSE_PAREN || depth == 0)
25176 && token->type == CPP_SEMICOLON)
25177 return true;
25178 /* If we've reached the end of the file, stop. */
25179 if (token->type == CPP_EOF
25180 || (end != CPP_PRAGMA_EOL
25181 && token->type == CPP_PRAGMA_EOL))
25182 return true;
25183 if (token->type == CPP_CLOSE_BRACE && depth == 0)
25184 /* We've hit the end of an enclosing block, so there's been some
25185 kind of syntax error. */
25186 return true;
25188 /* Consume the token. */
25189 cp_lexer_consume_token (parser->lexer);
25190 /* See if it starts a new group. */
25191 if (token->type == CPP_OPEN_BRACE)
25193 cp_parser_cache_group (parser, CPP_CLOSE_BRACE, depth + 1);
25194 /* In theory this should probably check end == '}', but
25195 cp_parser_save_member_function_body needs it to exit
25196 after either '}' or ')' when called with ')'. */
25197 if (depth == 0)
25198 return false;
25200 else if (token->type == CPP_OPEN_PAREN)
25202 cp_parser_cache_group (parser, CPP_CLOSE_PAREN, depth + 1);
25203 if (depth == 0 && end == CPP_CLOSE_PAREN)
25204 return false;
25206 else if (token->type == CPP_PRAGMA)
25207 cp_parser_cache_group (parser, CPP_PRAGMA_EOL, depth + 1);
25208 else if (token->type == end)
25209 return false;
25213 /* Like above, for caching a default argument or NSDMI. Both of these are
25214 terminated by a non-nested comma, but it can be unclear whether or not a
25215 comma is nested in a template argument list unless we do more parsing.
25216 In order to handle this ambiguity, when we encounter a ',' after a '<'
25217 we try to parse what follows as a parameter-declaration-list (in the
25218 case of a default argument) or a member-declarator (in the case of an
25219 NSDMI). If that succeeds, then we stop caching. */
25221 static tree
25222 cp_parser_cache_defarg (cp_parser *parser, bool nsdmi)
25224 unsigned depth = 0;
25225 int maybe_template_id = 0;
25226 cp_token *first_token;
25227 cp_token *token;
25228 tree default_argument;
25230 /* Add tokens until we have processed the entire default
25231 argument. We add the range [first_token, token). */
25232 first_token = cp_lexer_peek_token (parser->lexer);
25233 if (first_token->type == CPP_OPEN_BRACE)
25235 /* For list-initialization, this is straightforward. */
25236 cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
25237 token = cp_lexer_peek_token (parser->lexer);
25239 else while (true)
25241 bool done = false;
25243 /* Peek at the next token. */
25244 token = cp_lexer_peek_token (parser->lexer);
25245 /* What we do depends on what token we have. */
25246 switch (token->type)
25248 /* In valid code, a default argument must be
25249 immediately followed by a `,' `)', or `...'. */
25250 case CPP_COMMA:
25251 if (depth == 0 && maybe_template_id)
25253 /* If we've seen a '<', we might be in a
25254 template-argument-list. Until Core issue 325 is
25255 resolved, we don't know how this situation ought
25256 to be handled, so try to DTRT. We check whether
25257 what comes after the comma is a valid parameter
25258 declaration list. If it is, then the comma ends
25259 the default argument; otherwise the default
25260 argument continues. */
25261 bool error = false;
25263 /* Set ITALP so cp_parser_parameter_declaration_list
25264 doesn't decide to commit to this parse. */
25265 bool saved_italp = parser->in_template_argument_list_p;
25266 parser->in_template_argument_list_p = true;
25268 cp_parser_parse_tentatively (parser);
25269 cp_lexer_consume_token (parser->lexer);
25271 if (nsdmi)
25273 int ctor_dtor_or_conv_p;
25274 cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
25275 &ctor_dtor_or_conv_p,
25276 /*parenthesized_p=*/NULL,
25277 /*member_p=*/true,
25278 /*friend_p=*/false);
25280 else
25282 begin_scope (sk_function_parms, NULL_TREE);
25283 cp_parser_parameter_declaration_list (parser, &error);
25284 pop_bindings_and_leave_scope ();
25286 if (!cp_parser_error_occurred (parser) && !error)
25287 done = true;
25288 cp_parser_abort_tentative_parse (parser);
25290 parser->in_template_argument_list_p = saved_italp;
25291 break;
25293 case CPP_CLOSE_PAREN:
25294 case CPP_ELLIPSIS:
25295 /* If we run into a non-nested `;', `}', or `]',
25296 then the code is invalid -- but the default
25297 argument is certainly over. */
25298 case CPP_SEMICOLON:
25299 case CPP_CLOSE_BRACE:
25300 case CPP_CLOSE_SQUARE:
25301 if (depth == 0
25302 /* Handle correctly int n = sizeof ... ( p ); */
25303 && token->type != CPP_ELLIPSIS)
25304 done = true;
25305 /* Update DEPTH, if necessary. */
25306 else if (token->type == CPP_CLOSE_PAREN
25307 || token->type == CPP_CLOSE_BRACE
25308 || token->type == CPP_CLOSE_SQUARE)
25309 --depth;
25310 break;
25312 case CPP_OPEN_PAREN:
25313 case CPP_OPEN_SQUARE:
25314 case CPP_OPEN_BRACE:
25315 ++depth;
25316 break;
25318 case CPP_LESS:
25319 if (depth == 0)
25320 /* This might be the comparison operator, or it might
25321 start a template argument list. */
25322 ++maybe_template_id;
25323 break;
25325 case CPP_RSHIFT:
25326 if (cxx_dialect == cxx98)
25327 break;
25328 /* Fall through for C++0x, which treats the `>>'
25329 operator like two `>' tokens in certain
25330 cases. */
25332 case CPP_GREATER:
25333 if (depth == 0)
25335 /* This might be an operator, or it might close a
25336 template argument list. But if a previous '<'
25337 started a template argument list, this will have
25338 closed it, so we can't be in one anymore. */
25339 maybe_template_id -= 1 + (token->type == CPP_RSHIFT);
25340 if (maybe_template_id < 0)
25341 maybe_template_id = 0;
25343 break;
25345 /* If we run out of tokens, issue an error message. */
25346 case CPP_EOF:
25347 case CPP_PRAGMA_EOL:
25348 error_at (token->location, "file ends in default argument");
25349 done = true;
25350 break;
25352 case CPP_NAME:
25353 case CPP_SCOPE:
25354 /* In these cases, we should look for template-ids.
25355 For example, if the default argument is
25356 `X<int, double>()', we need to do name lookup to
25357 figure out whether or not `X' is a template; if
25358 so, the `,' does not end the default argument.
25360 That is not yet done. */
25361 break;
25363 default:
25364 break;
25367 /* If we've reached the end, stop. */
25368 if (done)
25369 break;
25371 /* Add the token to the token block. */
25372 token = cp_lexer_consume_token (parser->lexer);
25375 /* Create a DEFAULT_ARG to represent the unparsed default
25376 argument. */
25377 default_argument = make_node (DEFAULT_ARG);
25378 DEFARG_TOKENS (default_argument)
25379 = cp_token_cache_new (first_token, token);
25380 DEFARG_INSTANTIATIONS (default_argument) = NULL;
25382 return default_argument;
25385 /* Begin parsing tentatively. We always save tokens while parsing
25386 tentatively so that if the tentative parsing fails we can restore the
25387 tokens. */
25389 static void
25390 cp_parser_parse_tentatively (cp_parser* parser)
25392 /* Enter a new parsing context. */
25393 parser->context = cp_parser_context_new (parser->context);
25394 /* Begin saving tokens. */
25395 cp_lexer_save_tokens (parser->lexer);
25396 /* In order to avoid repetitive access control error messages,
25397 access checks are queued up until we are no longer parsing
25398 tentatively. */
25399 push_deferring_access_checks (dk_deferred);
25402 /* Commit to the currently active tentative parse. */
25404 static void
25405 cp_parser_commit_to_tentative_parse (cp_parser* parser)
25407 cp_parser_context *context;
25408 cp_lexer *lexer;
25410 /* Mark all of the levels as committed. */
25411 lexer = parser->lexer;
25412 for (context = parser->context; context->next; context = context->next)
25414 if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
25415 break;
25416 context->status = CP_PARSER_STATUS_KIND_COMMITTED;
25417 while (!cp_lexer_saving_tokens (lexer))
25418 lexer = lexer->next;
25419 cp_lexer_commit_tokens (lexer);
25423 /* Commit to the topmost currently active tentative parse.
25425 Note that this function shouldn't be called when there are
25426 irreversible side-effects while in a tentative state. For
25427 example, we shouldn't create a permanent entry in the symbol
25428 table, or issue an error message that might not apply if the
25429 tentative parse is aborted. */
25431 static void
25432 cp_parser_commit_to_topmost_tentative_parse (cp_parser* parser)
25434 cp_parser_context *context = parser->context;
25435 cp_lexer *lexer = parser->lexer;
25437 if (context)
25439 if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
25440 return;
25441 context->status = CP_PARSER_STATUS_KIND_COMMITTED;
25443 while (!cp_lexer_saving_tokens (lexer))
25444 lexer = lexer->next;
25445 cp_lexer_commit_tokens (lexer);
25449 /* Abort the currently active tentative parse. All consumed tokens
25450 will be rolled back, and no diagnostics will be issued. */
25452 static void
25453 cp_parser_abort_tentative_parse (cp_parser* parser)
25455 gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
25456 || errorcount > 0);
25457 cp_parser_simulate_error (parser);
25458 /* Now, pretend that we want to see if the construct was
25459 successfully parsed. */
25460 cp_parser_parse_definitely (parser);
25463 /* Stop parsing tentatively. If a parse error has occurred, restore the
25464 token stream. Otherwise, commit to the tokens we have consumed.
25465 Returns true if no error occurred; false otherwise. */
25467 static bool
25468 cp_parser_parse_definitely (cp_parser* parser)
25470 bool error_occurred;
25471 cp_parser_context *context;
25473 /* Remember whether or not an error occurred, since we are about to
25474 destroy that information. */
25475 error_occurred = cp_parser_error_occurred (parser);
25476 /* Remove the topmost context from the stack. */
25477 context = parser->context;
25478 parser->context = context->next;
25479 /* If no parse errors occurred, commit to the tentative parse. */
25480 if (!error_occurred)
25482 /* Commit to the tokens read tentatively, unless that was
25483 already done. */
25484 if (context->status != CP_PARSER_STATUS_KIND_COMMITTED)
25485 cp_lexer_commit_tokens (parser->lexer);
25487 pop_to_parent_deferring_access_checks ();
25489 /* Otherwise, if errors occurred, roll back our state so that things
25490 are just as they were before we began the tentative parse. */
25491 else
25493 cp_lexer_rollback_tokens (parser->lexer);
25494 pop_deferring_access_checks ();
25496 /* Add the context to the front of the free list. */
25497 context->next = cp_parser_context_free_list;
25498 cp_parser_context_free_list = context;
25500 return !error_occurred;
25503 /* Returns true if we are parsing tentatively and are not committed to
25504 this tentative parse. */
25506 static bool
25507 cp_parser_uncommitted_to_tentative_parse_p (cp_parser* parser)
25509 return (cp_parser_parsing_tentatively (parser)
25510 && parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED);
25513 /* Returns nonzero iff an error has occurred during the most recent
25514 tentative parse. */
25516 static bool
25517 cp_parser_error_occurred (cp_parser* parser)
25519 return (cp_parser_parsing_tentatively (parser)
25520 && parser->context->status == CP_PARSER_STATUS_KIND_ERROR);
25523 /* Returns nonzero if GNU extensions are allowed. */
25525 static bool
25526 cp_parser_allow_gnu_extensions_p (cp_parser* parser)
25528 return parser->allow_gnu_extensions_p;
25531 /* Objective-C++ Productions */
25534 /* Parse an Objective-C expression, which feeds into a primary-expression
25535 above.
25537 objc-expression:
25538 objc-message-expression
25539 objc-string-literal
25540 objc-encode-expression
25541 objc-protocol-expression
25542 objc-selector-expression
25544 Returns a tree representation of the expression. */
25546 static tree
25547 cp_parser_objc_expression (cp_parser* parser)
25549 /* Try to figure out what kind of declaration is present. */
25550 cp_token *kwd = cp_lexer_peek_token (parser->lexer);
25552 switch (kwd->type)
25554 case CPP_OPEN_SQUARE:
25555 return cp_parser_objc_message_expression (parser);
25557 case CPP_OBJC_STRING:
25558 kwd = cp_lexer_consume_token (parser->lexer);
25559 return objc_build_string_object (kwd->u.value);
25561 case CPP_KEYWORD:
25562 switch (kwd->keyword)
25564 case RID_AT_ENCODE:
25565 return cp_parser_objc_encode_expression (parser);
25567 case RID_AT_PROTOCOL:
25568 return cp_parser_objc_protocol_expression (parser);
25570 case RID_AT_SELECTOR:
25571 return cp_parser_objc_selector_expression (parser);
25573 default:
25574 break;
25576 default:
25577 error_at (kwd->location,
25578 "misplaced %<@%D%> Objective-C++ construct",
25579 kwd->u.value);
25580 cp_parser_skip_to_end_of_block_or_statement (parser);
25583 return error_mark_node;
25586 /* Parse an Objective-C message expression.
25588 objc-message-expression:
25589 [ objc-message-receiver objc-message-args ]
25591 Returns a representation of an Objective-C message. */
25593 static tree
25594 cp_parser_objc_message_expression (cp_parser* parser)
25596 tree receiver, messageargs;
25598 cp_lexer_consume_token (parser->lexer); /* Eat '['. */
25599 receiver = cp_parser_objc_message_receiver (parser);
25600 messageargs = cp_parser_objc_message_args (parser);
25601 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
25603 return objc_build_message_expr (receiver, messageargs);
25606 /* Parse an objc-message-receiver.
25608 objc-message-receiver:
25609 expression
25610 simple-type-specifier
25612 Returns a representation of the type or expression. */
25614 static tree
25615 cp_parser_objc_message_receiver (cp_parser* parser)
25617 tree rcv;
25619 /* An Objective-C message receiver may be either (1) a type
25620 or (2) an expression. */
25621 cp_parser_parse_tentatively (parser);
25622 rcv = cp_parser_expression (parser);
25624 if (cp_parser_parse_definitely (parser))
25625 return rcv;
25627 rcv = cp_parser_simple_type_specifier (parser,
25628 /*decl_specs=*/NULL,
25629 CP_PARSER_FLAGS_NONE);
25631 return objc_get_class_reference (rcv);
25634 /* Parse the arguments and selectors comprising an Objective-C message.
25636 objc-message-args:
25637 objc-selector
25638 objc-selector-args
25639 objc-selector-args , objc-comma-args
25641 objc-selector-args:
25642 objc-selector [opt] : assignment-expression
25643 objc-selector-args objc-selector [opt] : assignment-expression
25645 objc-comma-args:
25646 assignment-expression
25647 objc-comma-args , assignment-expression
25649 Returns a TREE_LIST, with TREE_PURPOSE containing a list of
25650 selector arguments and TREE_VALUE containing a list of comma
25651 arguments. */
25653 static tree
25654 cp_parser_objc_message_args (cp_parser* parser)
25656 tree sel_args = NULL_TREE, addl_args = NULL_TREE;
25657 bool maybe_unary_selector_p = true;
25658 cp_token *token = cp_lexer_peek_token (parser->lexer);
25660 while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
25662 tree selector = NULL_TREE, arg;
25664 if (token->type != CPP_COLON)
25665 selector = cp_parser_objc_selector (parser);
25667 /* Detect if we have a unary selector. */
25668 if (maybe_unary_selector_p
25669 && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
25670 return build_tree_list (selector, NULL_TREE);
25672 maybe_unary_selector_p = false;
25673 cp_parser_require (parser, CPP_COLON, RT_COLON);
25674 arg = cp_parser_assignment_expression (parser);
25676 sel_args
25677 = chainon (sel_args,
25678 build_tree_list (selector, arg));
25680 token = cp_lexer_peek_token (parser->lexer);
25683 /* Handle non-selector arguments, if any. */
25684 while (token->type == CPP_COMMA)
25686 tree arg;
25688 cp_lexer_consume_token (parser->lexer);
25689 arg = cp_parser_assignment_expression (parser);
25691 addl_args
25692 = chainon (addl_args,
25693 build_tree_list (NULL_TREE, arg));
25695 token = cp_lexer_peek_token (parser->lexer);
25698 if (sel_args == NULL_TREE && addl_args == NULL_TREE)
25700 cp_parser_error (parser, "objective-c++ message argument(s) are expected");
25701 return build_tree_list (error_mark_node, error_mark_node);
25704 return build_tree_list (sel_args, addl_args);
25707 /* Parse an Objective-C encode expression.
25709 objc-encode-expression:
25710 @encode objc-typename
25712 Returns an encoded representation of the type argument. */
25714 static tree
25715 cp_parser_objc_encode_expression (cp_parser* parser)
25717 tree type;
25718 cp_token *token;
25720 cp_lexer_consume_token (parser->lexer); /* Eat '@encode'. */
25721 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
25722 token = cp_lexer_peek_token (parser->lexer);
25723 type = complete_type (cp_parser_type_id (parser));
25724 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
25726 if (!type)
25728 error_at (token->location,
25729 "%<@encode%> must specify a type as an argument");
25730 return error_mark_node;
25733 /* This happens if we find @encode(T) (where T is a template
25734 typename or something dependent on a template typename) when
25735 parsing a template. In that case, we can't compile it
25736 immediately, but we rather create an AT_ENCODE_EXPR which will
25737 need to be instantiated when the template is used.
25739 if (dependent_type_p (type))
25741 tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
25742 TREE_READONLY (value) = 1;
25743 return value;
25746 return objc_build_encode_expr (type);
25749 /* Parse an Objective-C @defs expression. */
25751 static tree
25752 cp_parser_objc_defs_expression (cp_parser *parser)
25754 tree name;
25756 cp_lexer_consume_token (parser->lexer); /* Eat '@defs'. */
25757 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
25758 name = cp_parser_identifier (parser);
25759 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
25761 return objc_get_class_ivars (name);
25764 /* Parse an Objective-C protocol expression.
25766 objc-protocol-expression:
25767 @protocol ( identifier )
25769 Returns a representation of the protocol expression. */
25771 static tree
25772 cp_parser_objc_protocol_expression (cp_parser* parser)
25774 tree proto;
25776 cp_lexer_consume_token (parser->lexer); /* Eat '@protocol'. */
25777 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
25778 proto = cp_parser_identifier (parser);
25779 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
25781 return objc_build_protocol_expr (proto);
25784 /* Parse an Objective-C selector expression.
25786 objc-selector-expression:
25787 @selector ( objc-method-signature )
25789 objc-method-signature:
25790 objc-selector
25791 objc-selector-seq
25793 objc-selector-seq:
25794 objc-selector :
25795 objc-selector-seq objc-selector :
25797 Returns a representation of the method selector. */
25799 static tree
25800 cp_parser_objc_selector_expression (cp_parser* parser)
25802 tree sel_seq = NULL_TREE;
25803 bool maybe_unary_selector_p = true;
25804 cp_token *token;
25805 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
25807 cp_lexer_consume_token (parser->lexer); /* Eat '@selector'. */
25808 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
25809 token = cp_lexer_peek_token (parser->lexer);
25811 while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
25812 || token->type == CPP_SCOPE)
25814 tree selector = NULL_TREE;
25816 if (token->type != CPP_COLON
25817 || token->type == CPP_SCOPE)
25818 selector = cp_parser_objc_selector (parser);
25820 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
25821 && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
25823 /* Detect if we have a unary selector. */
25824 if (maybe_unary_selector_p)
25826 sel_seq = selector;
25827 goto finish_selector;
25829 else
25831 cp_parser_error (parser, "expected %<:%>");
25834 maybe_unary_selector_p = false;
25835 token = cp_lexer_consume_token (parser->lexer);
25837 if (token->type == CPP_SCOPE)
25839 sel_seq
25840 = chainon (sel_seq,
25841 build_tree_list (selector, NULL_TREE));
25842 sel_seq
25843 = chainon (sel_seq,
25844 build_tree_list (NULL_TREE, NULL_TREE));
25846 else
25847 sel_seq
25848 = chainon (sel_seq,
25849 build_tree_list (selector, NULL_TREE));
25851 token = cp_lexer_peek_token (parser->lexer);
25854 finish_selector:
25855 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
25857 return objc_build_selector_expr (loc, sel_seq);
25860 /* Parse a list of identifiers.
25862 objc-identifier-list:
25863 identifier
25864 objc-identifier-list , identifier
25866 Returns a TREE_LIST of identifier nodes. */
25868 static tree
25869 cp_parser_objc_identifier_list (cp_parser* parser)
25871 tree identifier;
25872 tree list;
25873 cp_token *sep;
25875 identifier = cp_parser_identifier (parser);
25876 if (identifier == error_mark_node)
25877 return error_mark_node;
25879 list = build_tree_list (NULL_TREE, identifier);
25880 sep = cp_lexer_peek_token (parser->lexer);
25882 while (sep->type == CPP_COMMA)
25884 cp_lexer_consume_token (parser->lexer); /* Eat ','. */
25885 identifier = cp_parser_identifier (parser);
25886 if (identifier == error_mark_node)
25887 return list;
25889 list = chainon (list, build_tree_list (NULL_TREE,
25890 identifier));
25891 sep = cp_lexer_peek_token (parser->lexer);
25894 return list;
25897 /* Parse an Objective-C alias declaration.
25899 objc-alias-declaration:
25900 @compatibility_alias identifier identifier ;
25902 This function registers the alias mapping with the Objective-C front end.
25903 It returns nothing. */
25905 static void
25906 cp_parser_objc_alias_declaration (cp_parser* parser)
25908 tree alias, orig;
25910 cp_lexer_consume_token (parser->lexer); /* Eat '@compatibility_alias'. */
25911 alias = cp_parser_identifier (parser);
25912 orig = cp_parser_identifier (parser);
25913 objc_declare_alias (alias, orig);
25914 cp_parser_consume_semicolon_at_end_of_statement (parser);
25917 /* Parse an Objective-C class forward-declaration.
25919 objc-class-declaration:
25920 @class objc-identifier-list ;
25922 The function registers the forward declarations with the Objective-C
25923 front end. It returns nothing. */
25925 static void
25926 cp_parser_objc_class_declaration (cp_parser* parser)
25928 cp_lexer_consume_token (parser->lexer); /* Eat '@class'. */
25929 while (true)
25931 tree id;
25933 id = cp_parser_identifier (parser);
25934 if (id == error_mark_node)
25935 break;
25937 objc_declare_class (id);
25939 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
25940 cp_lexer_consume_token (parser->lexer);
25941 else
25942 break;
25944 cp_parser_consume_semicolon_at_end_of_statement (parser);
25947 /* Parse a list of Objective-C protocol references.
25949 objc-protocol-refs-opt:
25950 objc-protocol-refs [opt]
25952 objc-protocol-refs:
25953 < objc-identifier-list >
25955 Returns a TREE_LIST of identifiers, if any. */
25957 static tree
25958 cp_parser_objc_protocol_refs_opt (cp_parser* parser)
25960 tree protorefs = NULL_TREE;
25962 if(cp_lexer_next_token_is (parser->lexer, CPP_LESS))
25964 cp_lexer_consume_token (parser->lexer); /* Eat '<'. */
25965 protorefs = cp_parser_objc_identifier_list (parser);
25966 cp_parser_require (parser, CPP_GREATER, RT_GREATER);
25969 return protorefs;
25972 /* Parse a Objective-C visibility specification. */
25974 static void
25975 cp_parser_objc_visibility_spec (cp_parser* parser)
25977 cp_token *vis = cp_lexer_peek_token (parser->lexer);
25979 switch (vis->keyword)
25981 case RID_AT_PRIVATE:
25982 objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
25983 break;
25984 case RID_AT_PROTECTED:
25985 objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
25986 break;
25987 case RID_AT_PUBLIC:
25988 objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
25989 break;
25990 case RID_AT_PACKAGE:
25991 objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
25992 break;
25993 default:
25994 return;
25997 /* Eat '@private'/'@protected'/'@public'. */
25998 cp_lexer_consume_token (parser->lexer);
26001 /* Parse an Objective-C method type. Return 'true' if it is a class
26002 (+) method, and 'false' if it is an instance (-) method. */
26004 static inline bool
26005 cp_parser_objc_method_type (cp_parser* parser)
26007 if (cp_lexer_consume_token (parser->lexer)->type == CPP_PLUS)
26008 return true;
26009 else
26010 return false;
26013 /* Parse an Objective-C protocol qualifier. */
26015 static tree
26016 cp_parser_objc_protocol_qualifiers (cp_parser* parser)
26018 tree quals = NULL_TREE, node;
26019 cp_token *token = cp_lexer_peek_token (parser->lexer);
26021 node = token->u.value;
26023 while (node && identifier_p (node)
26024 && (node == ridpointers [(int) RID_IN]
26025 || node == ridpointers [(int) RID_OUT]
26026 || node == ridpointers [(int) RID_INOUT]
26027 || node == ridpointers [(int) RID_BYCOPY]
26028 || node == ridpointers [(int) RID_BYREF]
26029 || node == ridpointers [(int) RID_ONEWAY]))
26031 quals = tree_cons (NULL_TREE, node, quals);
26032 cp_lexer_consume_token (parser->lexer);
26033 token = cp_lexer_peek_token (parser->lexer);
26034 node = token->u.value;
26037 return quals;
26040 /* Parse an Objective-C typename. */
26042 static tree
26043 cp_parser_objc_typename (cp_parser* parser)
26045 tree type_name = NULL_TREE;
26047 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
26049 tree proto_quals, cp_type = NULL_TREE;
26051 cp_lexer_consume_token (parser->lexer); /* Eat '('. */
26052 proto_quals = cp_parser_objc_protocol_qualifiers (parser);
26054 /* An ObjC type name may consist of just protocol qualifiers, in which
26055 case the type shall default to 'id'. */
26056 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
26058 cp_type = cp_parser_type_id (parser);
26060 /* If the type could not be parsed, an error has already
26061 been produced. For error recovery, behave as if it had
26062 not been specified, which will use the default type
26063 'id'. */
26064 if (cp_type == error_mark_node)
26066 cp_type = NULL_TREE;
26067 /* We need to skip to the closing parenthesis as
26068 cp_parser_type_id() does not seem to do it for
26069 us. */
26070 cp_parser_skip_to_closing_parenthesis (parser,
26071 /*recovering=*/true,
26072 /*or_comma=*/false,
26073 /*consume_paren=*/false);
26077 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
26078 type_name = build_tree_list (proto_quals, cp_type);
26081 return type_name;
26084 /* Check to see if TYPE refers to an Objective-C selector name. */
26086 static bool
26087 cp_parser_objc_selector_p (enum cpp_ttype type)
26089 return (type == CPP_NAME || type == CPP_KEYWORD
26090 || type == CPP_AND_AND || type == CPP_AND_EQ || type == CPP_AND
26091 || type == CPP_OR || type == CPP_COMPL || type == CPP_NOT
26092 || type == CPP_NOT_EQ || type == CPP_OR_OR || type == CPP_OR_EQ
26093 || type == CPP_XOR || type == CPP_XOR_EQ);
26096 /* Parse an Objective-C selector. */
26098 static tree
26099 cp_parser_objc_selector (cp_parser* parser)
26101 cp_token *token = cp_lexer_consume_token (parser->lexer);
26103 if (!cp_parser_objc_selector_p (token->type))
26105 error_at (token->location, "invalid Objective-C++ selector name");
26106 return error_mark_node;
26109 /* C++ operator names are allowed to appear in ObjC selectors. */
26110 switch (token->type)
26112 case CPP_AND_AND: return get_identifier ("and");
26113 case CPP_AND_EQ: return get_identifier ("and_eq");
26114 case CPP_AND: return get_identifier ("bitand");
26115 case CPP_OR: return get_identifier ("bitor");
26116 case CPP_COMPL: return get_identifier ("compl");
26117 case CPP_NOT: return get_identifier ("not");
26118 case CPP_NOT_EQ: return get_identifier ("not_eq");
26119 case CPP_OR_OR: return get_identifier ("or");
26120 case CPP_OR_EQ: return get_identifier ("or_eq");
26121 case CPP_XOR: return get_identifier ("xor");
26122 case CPP_XOR_EQ: return get_identifier ("xor_eq");
26123 default: return token->u.value;
26127 /* Parse an Objective-C params list. */
26129 static tree
26130 cp_parser_objc_method_keyword_params (cp_parser* parser, tree* attributes)
26132 tree params = NULL_TREE;
26133 bool maybe_unary_selector_p = true;
26134 cp_token *token = cp_lexer_peek_token (parser->lexer);
26136 while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
26138 tree selector = NULL_TREE, type_name, identifier;
26139 tree parm_attr = NULL_TREE;
26141 if (token->keyword == RID_ATTRIBUTE)
26142 break;
26144 if (token->type != CPP_COLON)
26145 selector = cp_parser_objc_selector (parser);
26147 /* Detect if we have a unary selector. */
26148 if (maybe_unary_selector_p
26149 && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
26151 params = selector; /* Might be followed by attributes. */
26152 break;
26155 maybe_unary_selector_p = false;
26156 if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
26158 /* Something went quite wrong. There should be a colon
26159 here, but there is not. Stop parsing parameters. */
26160 break;
26162 type_name = cp_parser_objc_typename (parser);
26163 /* New ObjC allows attributes on parameters too. */
26164 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
26165 parm_attr = cp_parser_attributes_opt (parser);
26166 identifier = cp_parser_identifier (parser);
26168 params
26169 = chainon (params,
26170 objc_build_keyword_decl (selector,
26171 type_name,
26172 identifier,
26173 parm_attr));
26175 token = cp_lexer_peek_token (parser->lexer);
26178 if (params == NULL_TREE)
26180 cp_parser_error (parser, "objective-c++ method declaration is expected");
26181 return error_mark_node;
26184 /* We allow tail attributes for the method. */
26185 if (token->keyword == RID_ATTRIBUTE)
26187 *attributes = cp_parser_attributes_opt (parser);
26188 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
26189 || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
26190 return params;
26191 cp_parser_error (parser,
26192 "method attributes must be specified at the end");
26193 return error_mark_node;
26196 if (params == NULL_TREE)
26198 cp_parser_error (parser, "objective-c++ method declaration is expected");
26199 return error_mark_node;
26201 return params;
26204 /* Parse the non-keyword Objective-C params. */
26206 static tree
26207 cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp,
26208 tree* attributes)
26210 tree params = make_node (TREE_LIST);
26211 cp_token *token = cp_lexer_peek_token (parser->lexer);
26212 *ellipsisp = false; /* Initially, assume no ellipsis. */
26214 while (token->type == CPP_COMMA)
26216 cp_parameter_declarator *parmdecl;
26217 tree parm;
26219 cp_lexer_consume_token (parser->lexer); /* Eat ','. */
26220 token = cp_lexer_peek_token (parser->lexer);
26222 if (token->type == CPP_ELLIPSIS)
26224 cp_lexer_consume_token (parser->lexer); /* Eat '...'. */
26225 *ellipsisp = true;
26226 token = cp_lexer_peek_token (parser->lexer);
26227 break;
26230 /* TODO: parse attributes for tail parameters. */
26231 parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
26232 parm = grokdeclarator (parmdecl->declarator,
26233 &parmdecl->decl_specifiers,
26234 PARM, /*initialized=*/0,
26235 /*attrlist=*/NULL);
26237 chainon (params, build_tree_list (NULL_TREE, parm));
26238 token = cp_lexer_peek_token (parser->lexer);
26241 /* We allow tail attributes for the method. */
26242 if (token->keyword == RID_ATTRIBUTE)
26244 if (*attributes == NULL_TREE)
26246 *attributes = cp_parser_attributes_opt (parser);
26247 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
26248 || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
26249 return params;
26251 else
26252 /* We have an error, but parse the attributes, so that we can
26253 carry on. */
26254 *attributes = cp_parser_attributes_opt (parser);
26256 cp_parser_error (parser,
26257 "method attributes must be specified at the end");
26258 return error_mark_node;
26261 return params;
26264 /* Parse a linkage specification, a pragma, an extra semicolon or a block. */
26266 static void
26267 cp_parser_objc_interstitial_code (cp_parser* parser)
26269 cp_token *token = cp_lexer_peek_token (parser->lexer);
26271 /* If the next token is `extern' and the following token is a string
26272 literal, then we have a linkage specification. */
26273 if (token->keyword == RID_EXTERN
26274 && cp_parser_is_pure_string_literal
26275 (cp_lexer_peek_nth_token (parser->lexer, 2)))
26276 cp_parser_linkage_specification (parser);
26277 /* Handle #pragma, if any. */
26278 else if (token->type == CPP_PRAGMA)
26279 cp_parser_pragma (parser, pragma_objc_icode);
26280 /* Allow stray semicolons. */
26281 else if (token->type == CPP_SEMICOLON)
26282 cp_lexer_consume_token (parser->lexer);
26283 /* Mark methods as optional or required, when building protocols. */
26284 else if (token->keyword == RID_AT_OPTIONAL)
26286 cp_lexer_consume_token (parser->lexer);
26287 objc_set_method_opt (true);
26289 else if (token->keyword == RID_AT_REQUIRED)
26291 cp_lexer_consume_token (parser->lexer);
26292 objc_set_method_opt (false);
26294 else if (token->keyword == RID_NAMESPACE)
26295 cp_parser_namespace_definition (parser);
26296 /* Other stray characters must generate errors. */
26297 else if (token->type == CPP_OPEN_BRACE || token->type == CPP_CLOSE_BRACE)
26299 cp_lexer_consume_token (parser->lexer);
26300 error ("stray %qs between Objective-C++ methods",
26301 token->type == CPP_OPEN_BRACE ? "{" : "}");
26303 /* Finally, try to parse a block-declaration, or a function-definition. */
26304 else
26305 cp_parser_block_declaration (parser, /*statement_p=*/false);
26308 /* Parse a method signature. */
26310 static tree
26311 cp_parser_objc_method_signature (cp_parser* parser, tree* attributes)
26313 tree rettype, kwdparms, optparms;
26314 bool ellipsis = false;
26315 bool is_class_method;
26317 is_class_method = cp_parser_objc_method_type (parser);
26318 rettype = cp_parser_objc_typename (parser);
26319 *attributes = NULL_TREE;
26320 kwdparms = cp_parser_objc_method_keyword_params (parser, attributes);
26321 if (kwdparms == error_mark_node)
26322 return error_mark_node;
26323 optparms = cp_parser_objc_method_tail_params_opt (parser, &ellipsis, attributes);
26324 if (optparms == error_mark_node)
26325 return error_mark_node;
26327 return objc_build_method_signature (is_class_method, rettype, kwdparms, optparms, ellipsis);
26330 static bool
26331 cp_parser_objc_method_maybe_bad_prefix_attributes (cp_parser* parser)
26333 tree tattr;
26334 cp_lexer_save_tokens (parser->lexer);
26335 tattr = cp_parser_attributes_opt (parser);
26336 gcc_assert (tattr) ;
26338 /* If the attributes are followed by a method introducer, this is not allowed.
26339 Dump the attributes and flag the situation. */
26340 if (cp_lexer_next_token_is (parser->lexer, CPP_PLUS)
26341 || cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
26342 return true;
26344 /* Otherwise, the attributes introduce some interstitial code, possibly so
26345 rewind to allow that check. */
26346 cp_lexer_rollback_tokens (parser->lexer);
26347 return false;
26350 /* Parse an Objective-C method prototype list. */
26352 static void
26353 cp_parser_objc_method_prototype_list (cp_parser* parser)
26355 cp_token *token = cp_lexer_peek_token (parser->lexer);
26357 while (token->keyword != RID_AT_END && token->type != CPP_EOF)
26359 if (token->type == CPP_PLUS || token->type == CPP_MINUS)
26361 tree attributes, sig;
26362 bool is_class_method;
26363 if (token->type == CPP_PLUS)
26364 is_class_method = true;
26365 else
26366 is_class_method = false;
26367 sig = cp_parser_objc_method_signature (parser, &attributes);
26368 if (sig == error_mark_node)
26370 cp_parser_skip_to_end_of_block_or_statement (parser);
26371 token = cp_lexer_peek_token (parser->lexer);
26372 continue;
26374 objc_add_method_declaration (is_class_method, sig, attributes);
26375 cp_parser_consume_semicolon_at_end_of_statement (parser);
26377 else if (token->keyword == RID_AT_PROPERTY)
26378 cp_parser_objc_at_property_declaration (parser);
26379 else if (token->keyword == RID_ATTRIBUTE
26380 && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
26381 warning_at (cp_lexer_peek_token (parser->lexer)->location,
26382 OPT_Wattributes,
26383 "prefix attributes are ignored for methods");
26384 else
26385 /* Allow for interspersed non-ObjC++ code. */
26386 cp_parser_objc_interstitial_code (parser);
26388 token = cp_lexer_peek_token (parser->lexer);
26391 if (token->type != CPP_EOF)
26392 cp_lexer_consume_token (parser->lexer); /* Eat '@end'. */
26393 else
26394 cp_parser_error (parser, "expected %<@end%>");
26396 objc_finish_interface ();
26399 /* Parse an Objective-C method definition list. */
26401 static void
26402 cp_parser_objc_method_definition_list (cp_parser* parser)
26404 cp_token *token = cp_lexer_peek_token (parser->lexer);
26406 while (token->keyword != RID_AT_END && token->type != CPP_EOF)
26408 tree meth;
26410 if (token->type == CPP_PLUS || token->type == CPP_MINUS)
26412 cp_token *ptk;
26413 tree sig, attribute;
26414 bool is_class_method;
26415 if (token->type == CPP_PLUS)
26416 is_class_method = true;
26417 else
26418 is_class_method = false;
26419 push_deferring_access_checks (dk_deferred);
26420 sig = cp_parser_objc_method_signature (parser, &attribute);
26421 if (sig == error_mark_node)
26423 cp_parser_skip_to_end_of_block_or_statement (parser);
26424 token = cp_lexer_peek_token (parser->lexer);
26425 continue;
26427 objc_start_method_definition (is_class_method, sig, attribute,
26428 NULL_TREE);
26430 /* For historical reasons, we accept an optional semicolon. */
26431 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
26432 cp_lexer_consume_token (parser->lexer);
26434 ptk = cp_lexer_peek_token (parser->lexer);
26435 if (!(ptk->type == CPP_PLUS || ptk->type == CPP_MINUS
26436 || ptk->type == CPP_EOF || ptk->keyword == RID_AT_END))
26438 perform_deferred_access_checks (tf_warning_or_error);
26439 stop_deferring_access_checks ();
26440 meth = cp_parser_function_definition_after_declarator (parser,
26441 false);
26442 pop_deferring_access_checks ();
26443 objc_finish_method_definition (meth);
26446 /* The following case will be removed once @synthesize is
26447 completely implemented. */
26448 else if (token->keyword == RID_AT_PROPERTY)
26449 cp_parser_objc_at_property_declaration (parser);
26450 else if (token->keyword == RID_AT_SYNTHESIZE)
26451 cp_parser_objc_at_synthesize_declaration (parser);
26452 else if (token->keyword == RID_AT_DYNAMIC)
26453 cp_parser_objc_at_dynamic_declaration (parser);
26454 else if (token->keyword == RID_ATTRIBUTE
26455 && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
26456 warning_at (token->location, OPT_Wattributes,
26457 "prefix attributes are ignored for methods");
26458 else
26459 /* Allow for interspersed non-ObjC++ code. */
26460 cp_parser_objc_interstitial_code (parser);
26462 token = cp_lexer_peek_token (parser->lexer);
26465 if (token->type != CPP_EOF)
26466 cp_lexer_consume_token (parser->lexer); /* Eat '@end'. */
26467 else
26468 cp_parser_error (parser, "expected %<@end%>");
26470 objc_finish_implementation ();
26473 /* Parse Objective-C ivars. */
26475 static void
26476 cp_parser_objc_class_ivars (cp_parser* parser)
26478 cp_token *token = cp_lexer_peek_token (parser->lexer);
26480 if (token->type != CPP_OPEN_BRACE)
26481 return; /* No ivars specified. */
26483 cp_lexer_consume_token (parser->lexer); /* Eat '{'. */
26484 token = cp_lexer_peek_token (parser->lexer);
26486 while (token->type != CPP_CLOSE_BRACE
26487 && token->keyword != RID_AT_END && token->type != CPP_EOF)
26489 cp_decl_specifier_seq declspecs;
26490 int decl_class_or_enum_p;
26491 tree prefix_attributes;
26493 cp_parser_objc_visibility_spec (parser);
26495 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
26496 break;
26498 cp_parser_decl_specifier_seq (parser,
26499 CP_PARSER_FLAGS_OPTIONAL,
26500 &declspecs,
26501 &decl_class_or_enum_p);
26503 /* auto, register, static, extern, mutable. */
26504 if (declspecs.storage_class != sc_none)
26506 cp_parser_error (parser, "invalid type for instance variable");
26507 declspecs.storage_class = sc_none;
26510 /* thread_local. */
26511 if (decl_spec_seq_has_spec_p (&declspecs, ds_thread))
26513 cp_parser_error (parser, "invalid type for instance variable");
26514 declspecs.locations[ds_thread] = 0;
26517 /* typedef. */
26518 if (decl_spec_seq_has_spec_p (&declspecs, ds_typedef))
26520 cp_parser_error (parser, "invalid type for instance variable");
26521 declspecs.locations[ds_typedef] = 0;
26524 prefix_attributes = declspecs.attributes;
26525 declspecs.attributes = NULL_TREE;
26527 /* Keep going until we hit the `;' at the end of the
26528 declaration. */
26529 while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
26531 tree width = NULL_TREE, attributes, first_attribute, decl;
26532 cp_declarator *declarator = NULL;
26533 int ctor_dtor_or_conv_p;
26535 /* Check for a (possibly unnamed) bitfield declaration. */
26536 token = cp_lexer_peek_token (parser->lexer);
26537 if (token->type == CPP_COLON)
26538 goto eat_colon;
26540 if (token->type == CPP_NAME
26541 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
26542 == CPP_COLON))
26544 /* Get the name of the bitfield. */
26545 declarator = make_id_declarator (NULL_TREE,
26546 cp_parser_identifier (parser),
26547 sfk_none);
26549 eat_colon:
26550 cp_lexer_consume_token (parser->lexer); /* Eat ':'. */
26551 /* Get the width of the bitfield. */
26552 width
26553 = cp_parser_constant_expression (parser);
26555 else
26557 /* Parse the declarator. */
26558 declarator
26559 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
26560 &ctor_dtor_or_conv_p,
26561 /*parenthesized_p=*/NULL,
26562 /*member_p=*/false,
26563 /*friend_p=*/false);
26566 /* Look for attributes that apply to the ivar. */
26567 attributes = cp_parser_attributes_opt (parser);
26568 /* Remember which attributes are prefix attributes and
26569 which are not. */
26570 first_attribute = attributes;
26571 /* Combine the attributes. */
26572 attributes = chainon (prefix_attributes, attributes);
26574 if (width)
26575 /* Create the bitfield declaration. */
26576 decl = grokbitfield (declarator, &declspecs,
26577 width,
26578 attributes);
26579 else
26580 decl = grokfield (declarator, &declspecs,
26581 NULL_TREE, /*init_const_expr_p=*/false,
26582 NULL_TREE, attributes);
26584 /* Add the instance variable. */
26585 if (decl != error_mark_node && decl != NULL_TREE)
26586 objc_add_instance_variable (decl);
26588 /* Reset PREFIX_ATTRIBUTES. */
26589 while (attributes && TREE_CHAIN (attributes) != first_attribute)
26590 attributes = TREE_CHAIN (attributes);
26591 if (attributes)
26592 TREE_CHAIN (attributes) = NULL_TREE;
26594 token = cp_lexer_peek_token (parser->lexer);
26596 if (token->type == CPP_COMMA)
26598 cp_lexer_consume_token (parser->lexer); /* Eat ','. */
26599 continue;
26601 break;
26604 cp_parser_consume_semicolon_at_end_of_statement (parser);
26605 token = cp_lexer_peek_token (parser->lexer);
26608 if (token->keyword == RID_AT_END)
26609 cp_parser_error (parser, "expected %<}%>");
26611 /* Do not consume the RID_AT_END, so it will be read again as terminating
26612 the @interface of @implementation. */
26613 if (token->keyword != RID_AT_END && token->type != CPP_EOF)
26614 cp_lexer_consume_token (parser->lexer); /* Eat '}'. */
26616 /* For historical reasons, we accept an optional semicolon. */
26617 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
26618 cp_lexer_consume_token (parser->lexer);
26621 /* Parse an Objective-C protocol declaration. */
26623 static void
26624 cp_parser_objc_protocol_declaration (cp_parser* parser, tree attributes)
26626 tree proto, protorefs;
26627 cp_token *tok;
26629 cp_lexer_consume_token (parser->lexer); /* Eat '@protocol'. */
26630 if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
26632 tok = cp_lexer_peek_token (parser->lexer);
26633 error_at (tok->location, "identifier expected after %<@protocol%>");
26634 cp_parser_consume_semicolon_at_end_of_statement (parser);
26635 return;
26638 /* See if we have a forward declaration or a definition. */
26639 tok = cp_lexer_peek_nth_token (parser->lexer, 2);
26641 /* Try a forward declaration first. */
26642 if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
26644 while (true)
26646 tree id;
26648 id = cp_parser_identifier (parser);
26649 if (id == error_mark_node)
26650 break;
26652 objc_declare_protocol (id, attributes);
26654 if(cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
26655 cp_lexer_consume_token (parser->lexer);
26656 else
26657 break;
26659 cp_parser_consume_semicolon_at_end_of_statement (parser);
26662 /* Ok, we got a full-fledged definition (or at least should). */
26663 else
26665 proto = cp_parser_identifier (parser);
26666 protorefs = cp_parser_objc_protocol_refs_opt (parser);
26667 objc_start_protocol (proto, protorefs, attributes);
26668 cp_parser_objc_method_prototype_list (parser);
26672 /* Parse an Objective-C superclass or category. */
26674 static void
26675 cp_parser_objc_superclass_or_category (cp_parser *parser,
26676 bool iface_p,
26677 tree *super,
26678 tree *categ, bool *is_class_extension)
26680 cp_token *next = cp_lexer_peek_token (parser->lexer);
26682 *super = *categ = NULL_TREE;
26683 *is_class_extension = false;
26684 if (next->type == CPP_COLON)
26686 cp_lexer_consume_token (parser->lexer); /* Eat ':'. */
26687 *super = cp_parser_identifier (parser);
26689 else if (next->type == CPP_OPEN_PAREN)
26691 cp_lexer_consume_token (parser->lexer); /* Eat '('. */
26693 /* If there is no category name, and this is an @interface, we
26694 have a class extension. */
26695 if (iface_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
26697 *categ = NULL_TREE;
26698 *is_class_extension = true;
26700 else
26701 *categ = cp_parser_identifier (parser);
26703 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
26707 /* Parse an Objective-C class interface. */
26709 static void
26710 cp_parser_objc_class_interface (cp_parser* parser, tree attributes)
26712 tree name, super, categ, protos;
26713 bool is_class_extension;
26715 cp_lexer_consume_token (parser->lexer); /* Eat '@interface'. */
26716 name = cp_parser_identifier (parser);
26717 if (name == error_mark_node)
26719 /* It's hard to recover because even if valid @interface stuff
26720 is to follow, we can't compile it (or validate it) if we
26721 don't even know which class it refers to. Let's assume this
26722 was a stray '@interface' token in the stream and skip it.
26724 return;
26726 cp_parser_objc_superclass_or_category (parser, true, &super, &categ,
26727 &is_class_extension);
26728 protos = cp_parser_objc_protocol_refs_opt (parser);
26730 /* We have either a class or a category on our hands. */
26731 if (categ || is_class_extension)
26732 objc_start_category_interface (name, categ, protos, attributes);
26733 else
26735 objc_start_class_interface (name, super, protos, attributes);
26736 /* Handle instance variable declarations, if any. */
26737 cp_parser_objc_class_ivars (parser);
26738 objc_continue_interface ();
26741 cp_parser_objc_method_prototype_list (parser);
26744 /* Parse an Objective-C class implementation. */
26746 static void
26747 cp_parser_objc_class_implementation (cp_parser* parser)
26749 tree name, super, categ;
26750 bool is_class_extension;
26752 cp_lexer_consume_token (parser->lexer); /* Eat '@implementation'. */
26753 name = cp_parser_identifier (parser);
26754 if (name == error_mark_node)
26756 /* It's hard to recover because even if valid @implementation
26757 stuff is to follow, we can't compile it (or validate it) if
26758 we don't even know which class it refers to. Let's assume
26759 this was a stray '@implementation' token in the stream and
26760 skip it.
26762 return;
26764 cp_parser_objc_superclass_or_category (parser, false, &super, &categ,
26765 &is_class_extension);
26767 /* We have either a class or a category on our hands. */
26768 if (categ)
26769 objc_start_category_implementation (name, categ);
26770 else
26772 objc_start_class_implementation (name, super);
26773 /* Handle instance variable declarations, if any. */
26774 cp_parser_objc_class_ivars (parser);
26775 objc_continue_implementation ();
26778 cp_parser_objc_method_definition_list (parser);
26781 /* Consume the @end token and finish off the implementation. */
26783 static void
26784 cp_parser_objc_end_implementation (cp_parser* parser)
26786 cp_lexer_consume_token (parser->lexer); /* Eat '@end'. */
26787 objc_finish_implementation ();
26790 /* Parse an Objective-C declaration. */
26792 static void
26793 cp_parser_objc_declaration (cp_parser* parser, tree attributes)
26795 /* Try to figure out what kind of declaration is present. */
26796 cp_token *kwd = cp_lexer_peek_token (parser->lexer);
26798 if (attributes)
26799 switch (kwd->keyword)
26801 case RID_AT_ALIAS:
26802 case RID_AT_CLASS:
26803 case RID_AT_END:
26804 error_at (kwd->location, "attributes may not be specified before"
26805 " the %<@%D%> Objective-C++ keyword",
26806 kwd->u.value);
26807 attributes = NULL;
26808 break;
26809 case RID_AT_IMPLEMENTATION:
26810 warning_at (kwd->location, OPT_Wattributes,
26811 "prefix attributes are ignored before %<@%D%>",
26812 kwd->u.value);
26813 attributes = NULL;
26814 default:
26815 break;
26818 switch (kwd->keyword)
26820 case RID_AT_ALIAS:
26821 cp_parser_objc_alias_declaration (parser);
26822 break;
26823 case RID_AT_CLASS:
26824 cp_parser_objc_class_declaration (parser);
26825 break;
26826 case RID_AT_PROTOCOL:
26827 cp_parser_objc_protocol_declaration (parser, attributes);
26828 break;
26829 case RID_AT_INTERFACE:
26830 cp_parser_objc_class_interface (parser, attributes);
26831 break;
26832 case RID_AT_IMPLEMENTATION:
26833 cp_parser_objc_class_implementation (parser);
26834 break;
26835 case RID_AT_END:
26836 cp_parser_objc_end_implementation (parser);
26837 break;
26838 default:
26839 error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
26840 kwd->u.value);
26841 cp_parser_skip_to_end_of_block_or_statement (parser);
26845 /* Parse an Objective-C try-catch-finally statement.
26847 objc-try-catch-finally-stmt:
26848 @try compound-statement objc-catch-clause-seq [opt]
26849 objc-finally-clause [opt]
26851 objc-catch-clause-seq:
26852 objc-catch-clause objc-catch-clause-seq [opt]
26854 objc-catch-clause:
26855 @catch ( objc-exception-declaration ) compound-statement
26857 objc-finally-clause:
26858 @finally compound-statement
26860 objc-exception-declaration:
26861 parameter-declaration
26862 '...'
26864 where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
26866 Returns NULL_TREE.
26868 PS: This function is identical to c_parser_objc_try_catch_finally_statement
26869 for C. Keep them in sync. */
26871 static tree
26872 cp_parser_objc_try_catch_finally_statement (cp_parser *parser)
26874 location_t location;
26875 tree stmt;
26877 cp_parser_require_keyword (parser, RID_AT_TRY, RT_AT_TRY);
26878 location = cp_lexer_peek_token (parser->lexer)->location;
26879 objc_maybe_warn_exceptions (location);
26880 /* NB: The @try block needs to be wrapped in its own STATEMENT_LIST
26881 node, lest it get absorbed into the surrounding block. */
26882 stmt = push_stmt_list ();
26883 cp_parser_compound_statement (parser, NULL, false, false);
26884 objc_begin_try_stmt (location, pop_stmt_list (stmt));
26886 while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
26888 cp_parameter_declarator *parm;
26889 tree parameter_declaration = error_mark_node;
26890 bool seen_open_paren = false;
26892 cp_lexer_consume_token (parser->lexer);
26893 if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
26894 seen_open_paren = true;
26895 if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
26897 /* We have "@catch (...)" (where the '...' are literally
26898 what is in the code). Skip the '...'.
26899 parameter_declaration is set to NULL_TREE, and
26900 objc_being_catch_clauses() knows that that means
26901 '...'. */
26902 cp_lexer_consume_token (parser->lexer);
26903 parameter_declaration = NULL_TREE;
26905 else
26907 /* We have "@catch (NSException *exception)" or something
26908 like that. Parse the parameter declaration. */
26909 parm = cp_parser_parameter_declaration (parser, false, NULL);
26910 if (parm == NULL)
26911 parameter_declaration = error_mark_node;
26912 else
26913 parameter_declaration = grokdeclarator (parm->declarator,
26914 &parm->decl_specifiers,
26915 PARM, /*initialized=*/0,
26916 /*attrlist=*/NULL);
26918 if (seen_open_paren)
26919 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
26920 else
26922 /* If there was no open parenthesis, we are recovering from
26923 an error, and we are trying to figure out what mistake
26924 the user has made. */
26926 /* If there is an immediate closing parenthesis, the user
26927 probably forgot the opening one (ie, they typed "@catch
26928 NSException *e)". Parse the closing parenthesis and keep
26929 going. */
26930 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
26931 cp_lexer_consume_token (parser->lexer);
26933 /* If these is no immediate closing parenthesis, the user
26934 probably doesn't know that parenthesis are required at
26935 all (ie, they typed "@catch NSException *e"). So, just
26936 forget about the closing parenthesis and keep going. */
26938 objc_begin_catch_clause (parameter_declaration);
26939 cp_parser_compound_statement (parser, NULL, false, false);
26940 objc_finish_catch_clause ();
26942 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_FINALLY))
26944 cp_lexer_consume_token (parser->lexer);
26945 location = cp_lexer_peek_token (parser->lexer)->location;
26946 /* NB: The @finally block needs to be wrapped in its own STATEMENT_LIST
26947 node, lest it get absorbed into the surrounding block. */
26948 stmt = push_stmt_list ();
26949 cp_parser_compound_statement (parser, NULL, false, false);
26950 objc_build_finally_clause (location, pop_stmt_list (stmt));
26953 return objc_finish_try_stmt ();
26956 /* Parse an Objective-C synchronized statement.
26958 objc-synchronized-stmt:
26959 @synchronized ( expression ) compound-statement
26961 Returns NULL_TREE. */
26963 static tree
26964 cp_parser_objc_synchronized_statement (cp_parser *parser)
26966 location_t location;
26967 tree lock, stmt;
26969 cp_parser_require_keyword (parser, RID_AT_SYNCHRONIZED, RT_AT_SYNCHRONIZED);
26971 location = cp_lexer_peek_token (parser->lexer)->location;
26972 objc_maybe_warn_exceptions (location);
26973 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
26974 lock = cp_parser_expression (parser);
26975 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
26977 /* NB: The @synchronized block needs to be wrapped in its own STATEMENT_LIST
26978 node, lest it get absorbed into the surrounding block. */
26979 stmt = push_stmt_list ();
26980 cp_parser_compound_statement (parser, NULL, false, false);
26982 return objc_build_synchronized (location, lock, pop_stmt_list (stmt));
26985 /* Parse an Objective-C throw statement.
26987 objc-throw-stmt:
26988 @throw assignment-expression [opt] ;
26990 Returns a constructed '@throw' statement. */
26992 static tree
26993 cp_parser_objc_throw_statement (cp_parser *parser)
26995 tree expr = NULL_TREE;
26996 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
26998 cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW);
27000 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
27001 expr = cp_parser_expression (parser);
27003 cp_parser_consume_semicolon_at_end_of_statement (parser);
27005 return objc_build_throw_stmt (loc, expr);
27008 /* Parse an Objective-C statement. */
27010 static tree
27011 cp_parser_objc_statement (cp_parser * parser)
27013 /* Try to figure out what kind of declaration is present. */
27014 cp_token *kwd = cp_lexer_peek_token (parser->lexer);
27016 switch (kwd->keyword)
27018 case RID_AT_TRY:
27019 return cp_parser_objc_try_catch_finally_statement (parser);
27020 case RID_AT_SYNCHRONIZED:
27021 return cp_parser_objc_synchronized_statement (parser);
27022 case RID_AT_THROW:
27023 return cp_parser_objc_throw_statement (parser);
27024 default:
27025 error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
27026 kwd->u.value);
27027 cp_parser_skip_to_end_of_block_or_statement (parser);
27030 return error_mark_node;
27033 /* If we are compiling ObjC++ and we see an __attribute__ we neeed to
27034 look ahead to see if an objc keyword follows the attributes. This
27035 is to detect the use of prefix attributes on ObjC @interface and
27036 @protocol. */
27038 static bool
27039 cp_parser_objc_valid_prefix_attributes (cp_parser* parser, tree *attrib)
27041 cp_lexer_save_tokens (parser->lexer);
27042 *attrib = cp_parser_attributes_opt (parser);
27043 gcc_assert (*attrib);
27044 if (OBJC_IS_AT_KEYWORD (cp_lexer_peek_token (parser->lexer)->keyword))
27046 cp_lexer_commit_tokens (parser->lexer);
27047 return true;
27049 cp_lexer_rollback_tokens (parser->lexer);
27050 return false;
27053 /* This routine is a minimal replacement for
27054 c_parser_struct_declaration () used when parsing the list of
27055 types/names or ObjC++ properties. For example, when parsing the
27056 code
27058 @property (readonly) int a, b, c;
27060 this function is responsible for parsing "int a, int b, int c" and
27061 returning the declarations as CHAIN of DECLs.
27063 TODO: Share this code with cp_parser_objc_class_ivars. It's very
27064 similar parsing. */
27065 static tree
27066 cp_parser_objc_struct_declaration (cp_parser *parser)
27068 tree decls = NULL_TREE;
27069 cp_decl_specifier_seq declspecs;
27070 int decl_class_or_enum_p;
27071 tree prefix_attributes;
27073 cp_parser_decl_specifier_seq (parser,
27074 CP_PARSER_FLAGS_NONE,
27075 &declspecs,
27076 &decl_class_or_enum_p);
27078 if (declspecs.type == error_mark_node)
27079 return error_mark_node;
27081 /* auto, register, static, extern, mutable. */
27082 if (declspecs.storage_class != sc_none)
27084 cp_parser_error (parser, "invalid type for property");
27085 declspecs.storage_class = sc_none;
27088 /* thread_local. */
27089 if (decl_spec_seq_has_spec_p (&declspecs, ds_thread))
27091 cp_parser_error (parser, "invalid type for property");
27092 declspecs.locations[ds_thread] = 0;
27095 /* typedef. */
27096 if (decl_spec_seq_has_spec_p (&declspecs, ds_typedef))
27098 cp_parser_error (parser, "invalid type for property");
27099 declspecs.locations[ds_typedef] = 0;
27102 prefix_attributes = declspecs.attributes;
27103 declspecs.attributes = NULL_TREE;
27105 /* Keep going until we hit the `;' at the end of the declaration. */
27106 while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
27108 tree attributes, first_attribute, decl;
27109 cp_declarator *declarator;
27110 cp_token *token;
27112 /* Parse the declarator. */
27113 declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
27114 NULL, NULL, false, false);
27116 /* Look for attributes that apply to the ivar. */
27117 attributes = cp_parser_attributes_opt (parser);
27118 /* Remember which attributes are prefix attributes and
27119 which are not. */
27120 first_attribute = attributes;
27121 /* Combine the attributes. */
27122 attributes = chainon (prefix_attributes, attributes);
27124 decl = grokfield (declarator, &declspecs,
27125 NULL_TREE, /*init_const_expr_p=*/false,
27126 NULL_TREE, attributes);
27128 if (decl == error_mark_node || decl == NULL_TREE)
27129 return error_mark_node;
27131 /* Reset PREFIX_ATTRIBUTES. */
27132 while (attributes && TREE_CHAIN (attributes) != first_attribute)
27133 attributes = TREE_CHAIN (attributes);
27134 if (attributes)
27135 TREE_CHAIN (attributes) = NULL_TREE;
27137 DECL_CHAIN (decl) = decls;
27138 decls = decl;
27140 token = cp_lexer_peek_token (parser->lexer);
27141 if (token->type == CPP_COMMA)
27143 cp_lexer_consume_token (parser->lexer); /* Eat ','. */
27144 continue;
27146 else
27147 break;
27149 return decls;
27152 /* Parse an Objective-C @property declaration. The syntax is:
27154 objc-property-declaration:
27155 '@property' objc-property-attributes[opt] struct-declaration ;
27157 objc-property-attributes:
27158 '(' objc-property-attribute-list ')'
27160 objc-property-attribute-list:
27161 objc-property-attribute
27162 objc-property-attribute-list, objc-property-attribute
27164 objc-property-attribute
27165 'getter' = identifier
27166 'setter' = identifier
27167 'readonly'
27168 'readwrite'
27169 'assign'
27170 'retain'
27171 'copy'
27172 'nonatomic'
27174 For example:
27175 @property NSString *name;
27176 @property (readonly) id object;
27177 @property (retain, nonatomic, getter=getTheName) id name;
27178 @property int a, b, c;
27180 PS: This function is identical to
27181 c_parser_objc_at_property_declaration for C. Keep them in sync. */
27182 static void
27183 cp_parser_objc_at_property_declaration (cp_parser *parser)
27185 /* The following variables hold the attributes of the properties as
27186 parsed. They are 'false' or 'NULL_TREE' if the attribute was not
27187 seen. When we see an attribute, we set them to 'true' (if they
27188 are boolean properties) or to the identifier (if they have an
27189 argument, ie, for getter and setter). Note that here we only
27190 parse the list of attributes, check the syntax and accumulate the
27191 attributes that we find. objc_add_property_declaration() will
27192 then process the information. */
27193 bool property_assign = false;
27194 bool property_copy = false;
27195 tree property_getter_ident = NULL_TREE;
27196 bool property_nonatomic = false;
27197 bool property_readonly = false;
27198 bool property_readwrite = false;
27199 bool property_retain = false;
27200 tree property_setter_ident = NULL_TREE;
27202 /* 'properties' is the list of properties that we read. Usually a
27203 single one, but maybe more (eg, in "@property int a, b, c;" there
27204 are three). */
27205 tree properties;
27206 location_t loc;
27208 loc = cp_lexer_peek_token (parser->lexer)->location;
27210 cp_lexer_consume_token (parser->lexer); /* Eat '@property'. */
27212 /* Parse the optional attribute list... */
27213 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
27215 /* Eat the '('. */
27216 cp_lexer_consume_token (parser->lexer);
27218 while (true)
27220 bool syntax_error = false;
27221 cp_token *token = cp_lexer_peek_token (parser->lexer);
27222 enum rid keyword;
27224 if (token->type != CPP_NAME)
27226 cp_parser_error (parser, "expected identifier");
27227 break;
27229 keyword = C_RID_CODE (token->u.value);
27230 cp_lexer_consume_token (parser->lexer);
27231 switch (keyword)
27233 case RID_ASSIGN: property_assign = true; break;
27234 case RID_COPY: property_copy = true; break;
27235 case RID_NONATOMIC: property_nonatomic = true; break;
27236 case RID_READONLY: property_readonly = true; break;
27237 case RID_READWRITE: property_readwrite = true; break;
27238 case RID_RETAIN: property_retain = true; break;
27240 case RID_GETTER:
27241 case RID_SETTER:
27242 if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
27244 if (keyword == RID_GETTER)
27245 cp_parser_error (parser,
27246 "missing %<=%> (after %<getter%> attribute)");
27247 else
27248 cp_parser_error (parser,
27249 "missing %<=%> (after %<setter%> attribute)");
27250 syntax_error = true;
27251 break;
27253 cp_lexer_consume_token (parser->lexer); /* eat the = */
27254 if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser->lexer)->type))
27256 cp_parser_error (parser, "expected identifier");
27257 syntax_error = true;
27258 break;
27260 if (keyword == RID_SETTER)
27262 if (property_setter_ident != NULL_TREE)
27264 cp_parser_error (parser, "the %<setter%> attribute may only be specified once");
27265 cp_lexer_consume_token (parser->lexer);
27267 else
27268 property_setter_ident = cp_parser_objc_selector (parser);
27269 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
27270 cp_parser_error (parser, "setter name must terminate with %<:%>");
27271 else
27272 cp_lexer_consume_token (parser->lexer);
27274 else
27276 if (property_getter_ident != NULL_TREE)
27278 cp_parser_error (parser, "the %<getter%> attribute may only be specified once");
27279 cp_lexer_consume_token (parser->lexer);
27281 else
27282 property_getter_ident = cp_parser_objc_selector (parser);
27284 break;
27285 default:
27286 cp_parser_error (parser, "unknown property attribute");
27287 syntax_error = true;
27288 break;
27291 if (syntax_error)
27292 break;
27294 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
27295 cp_lexer_consume_token (parser->lexer);
27296 else
27297 break;
27300 /* FIXME: "@property (setter, assign);" will generate a spurious
27301 "error: expected ‘)’ before ‘,’ token". This is because
27302 cp_parser_require, unlike the C counterpart, will produce an
27303 error even if we are in error recovery. */
27304 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
27306 cp_parser_skip_to_closing_parenthesis (parser,
27307 /*recovering=*/true,
27308 /*or_comma=*/false,
27309 /*consume_paren=*/true);
27313 /* ... and the property declaration(s). */
27314 properties = cp_parser_objc_struct_declaration (parser);
27316 if (properties == error_mark_node)
27318 cp_parser_skip_to_end_of_statement (parser);
27319 /* If the next token is now a `;', consume it. */
27320 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
27321 cp_lexer_consume_token (parser->lexer);
27322 return;
27325 if (properties == NULL_TREE)
27326 cp_parser_error (parser, "expected identifier");
27327 else
27329 /* Comma-separated properties are chained together in
27330 reverse order; add them one by one. */
27331 properties = nreverse (properties);
27333 for (; properties; properties = TREE_CHAIN (properties))
27334 objc_add_property_declaration (loc, copy_node (properties),
27335 property_readonly, property_readwrite,
27336 property_assign, property_retain,
27337 property_copy, property_nonatomic,
27338 property_getter_ident, property_setter_ident);
27341 cp_parser_consume_semicolon_at_end_of_statement (parser);
27344 /* Parse an Objective-C++ @synthesize declaration. The syntax is:
27346 objc-synthesize-declaration:
27347 @synthesize objc-synthesize-identifier-list ;
27349 objc-synthesize-identifier-list:
27350 objc-synthesize-identifier
27351 objc-synthesize-identifier-list, objc-synthesize-identifier
27353 objc-synthesize-identifier
27354 identifier
27355 identifier = identifier
27357 For example:
27358 @synthesize MyProperty;
27359 @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
27361 PS: This function is identical to c_parser_objc_at_synthesize_declaration
27362 for C. Keep them in sync.
27364 static void
27365 cp_parser_objc_at_synthesize_declaration (cp_parser *parser)
27367 tree list = NULL_TREE;
27368 location_t loc;
27369 loc = cp_lexer_peek_token (parser->lexer)->location;
27371 cp_lexer_consume_token (parser->lexer); /* Eat '@synthesize'. */
27372 while (true)
27374 tree property, ivar;
27375 property = cp_parser_identifier (parser);
27376 if (property == error_mark_node)
27378 cp_parser_consume_semicolon_at_end_of_statement (parser);
27379 return;
27381 if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
27383 cp_lexer_consume_token (parser->lexer);
27384 ivar = cp_parser_identifier (parser);
27385 if (ivar == error_mark_node)
27387 cp_parser_consume_semicolon_at_end_of_statement (parser);
27388 return;
27391 else
27392 ivar = NULL_TREE;
27393 list = chainon (list, build_tree_list (ivar, property));
27394 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
27395 cp_lexer_consume_token (parser->lexer);
27396 else
27397 break;
27399 cp_parser_consume_semicolon_at_end_of_statement (parser);
27400 objc_add_synthesize_declaration (loc, list);
27403 /* Parse an Objective-C++ @dynamic declaration. The syntax is:
27405 objc-dynamic-declaration:
27406 @dynamic identifier-list ;
27408 For example:
27409 @dynamic MyProperty;
27410 @dynamic MyProperty, AnotherProperty;
27412 PS: This function is identical to c_parser_objc_at_dynamic_declaration
27413 for C. Keep them in sync.
27415 static void
27416 cp_parser_objc_at_dynamic_declaration (cp_parser *parser)
27418 tree list = NULL_TREE;
27419 location_t loc;
27420 loc = cp_lexer_peek_token (parser->lexer)->location;
27422 cp_lexer_consume_token (parser->lexer); /* Eat '@dynamic'. */
27423 while (true)
27425 tree property;
27426 property = cp_parser_identifier (parser);
27427 if (property == error_mark_node)
27429 cp_parser_consume_semicolon_at_end_of_statement (parser);
27430 return;
27432 list = chainon (list, build_tree_list (NULL, property));
27433 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
27434 cp_lexer_consume_token (parser->lexer);
27435 else
27436 break;
27438 cp_parser_consume_semicolon_at_end_of_statement (parser);
27439 objc_add_dynamic_declaration (loc, list);
27443 /* OpenMP 2.5 / 3.0 / 3.1 / 4.0 parsing routines. */
27445 /* Returns name of the next clause.
27446 If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
27447 the token is not consumed. Otherwise appropriate pragma_omp_clause is
27448 returned and the token is consumed. */
27450 static pragma_omp_clause
27451 cp_parser_omp_clause_name (cp_parser *parser)
27453 pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
27455 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_IF))
27456 result = PRAGMA_OMP_CLAUSE_IF;
27457 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DEFAULT))
27458 result = PRAGMA_OMP_CLAUSE_DEFAULT;
27459 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DELETE))
27460 result = PRAGMA_OMP_CLAUSE_DELETE;
27461 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_PRIVATE))
27462 result = PRAGMA_OMP_CLAUSE_PRIVATE;
27463 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
27464 result = PRAGMA_OMP_CLAUSE_FOR;
27465 else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
27467 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
27468 const char *p = IDENTIFIER_POINTER (id);
27470 switch (p[0])
27472 case 'a':
27473 if (!strcmp ("aligned", p))
27474 result = PRAGMA_OMP_CLAUSE_ALIGNED;
27475 else if (!strcmp ("async", p))
27476 result = PRAGMA_OMP_CLAUSE_ASYNC;
27477 break;
27478 case 'c':
27479 if (!strcmp ("collapse", p))
27480 result = PRAGMA_OMP_CLAUSE_COLLAPSE;
27481 else if (!strcmp ("copy", p))
27482 result = PRAGMA_OMP_CLAUSE_COPY;
27483 else if (!strcmp ("copyin", p))
27484 result = PRAGMA_OMP_CLAUSE_COPYIN;
27485 else if (!strcmp ("copyout", p))
27486 result = PRAGMA_OMP_CLAUSE_COPYOUT;
27487 else if (!strcmp ("copyprivate", p))
27488 result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
27489 else if (!strcmp ("create", p))
27490 result = PRAGMA_OMP_CLAUSE_CREATE;
27491 break;
27492 case 'd':
27493 if (!strcmp ("depend", p))
27494 result = PRAGMA_OMP_CLAUSE_DEPEND;
27495 else if (!strcmp ("device", p))
27496 result = PRAGMA_OMP_CLAUSE_DEVICE;
27497 else if (!strcmp ("deviceptr", p))
27498 result = PRAGMA_OMP_CLAUSE_DEVICEPTR;
27499 else if (!strcmp ("dist_schedule", p))
27500 result = PRAGMA_OMP_CLAUSE_DIST_SCHEDULE;
27501 break;
27502 case 'f':
27503 if (!strcmp ("final", p))
27504 result = PRAGMA_OMP_CLAUSE_FINAL;
27505 else if (!strcmp ("firstprivate", p))
27506 result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
27507 else if (!strcmp ("from", p))
27508 result = PRAGMA_OMP_CLAUSE_FROM;
27509 break;
27510 case 'h':
27511 if (!strcmp ("host", p))
27512 result = PRAGMA_OMP_CLAUSE_HOST;
27513 break;
27514 case 'i':
27515 if (!strcmp ("inbranch", p))
27516 result = PRAGMA_OMP_CLAUSE_INBRANCH;
27517 break;
27518 case 'l':
27519 if (!strcmp ("lastprivate", p))
27520 result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
27521 else if (!strcmp ("linear", p))
27522 result = PRAGMA_OMP_CLAUSE_LINEAR;
27523 break;
27524 case 'm':
27525 if (!strcmp ("map", p))
27526 result = PRAGMA_OMP_CLAUSE_MAP;
27527 else if (!strcmp ("mergeable", p))
27528 result = PRAGMA_OMP_CLAUSE_MERGEABLE;
27529 else if (flag_cilkplus && !strcmp ("mask", p))
27530 result = PRAGMA_CILK_CLAUSE_MASK;
27531 break;
27532 case 'n':
27533 if (!strcmp ("notinbranch", p))
27534 result = PRAGMA_OMP_CLAUSE_NOTINBRANCH;
27535 else if (!strcmp ("nowait", p))
27536 result = PRAGMA_OMP_CLAUSE_NOWAIT;
27537 else if (flag_cilkplus && !strcmp ("nomask", p))
27538 result = PRAGMA_CILK_CLAUSE_NOMASK;
27539 else if (!strcmp ("num_gangs", p))
27540 result = PRAGMA_OMP_CLAUSE_NUM_GANGS;
27541 else if (!strcmp ("num_teams", p))
27542 result = PRAGMA_OMP_CLAUSE_NUM_TEAMS;
27543 else if (!strcmp ("num_threads", p))
27544 result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
27545 else if (!strcmp ("num_workers", p))
27546 result = PRAGMA_OMP_CLAUSE_NUM_WORKERS;
27547 break;
27548 case 'o':
27549 if (!strcmp ("ordered", p))
27550 result = PRAGMA_OMP_CLAUSE_ORDERED;
27551 break;
27552 case 'p':
27553 if (!strcmp ("parallel", p))
27554 result = PRAGMA_OMP_CLAUSE_PARALLEL;
27555 else if (!strcmp ("present", p))
27556 result = PRAGMA_OMP_CLAUSE_PRESENT;
27557 else if (!strcmp ("present_or_copy", p)
27558 || !strcmp ("pcopy", p))
27559 result = PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY;
27560 else if (!strcmp ("present_or_copyin", p)
27561 || !strcmp ("pcopyin", p))
27562 result = PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN;
27563 else if (!strcmp ("present_or_copyout", p)
27564 || !strcmp ("pcopyout", p))
27565 result = PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT;
27566 else if (!strcmp ("present_or_create", p)
27567 || !strcmp ("pcreate", p))
27568 result = PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE;
27569 else if (!strcmp ("private", p))
27570 result = PRAGMA_OMP_CLAUSE_PRIVATE;
27571 else if (!strcmp ("proc_bind", p))
27572 result = PRAGMA_OMP_CLAUSE_PROC_BIND;
27573 break;
27574 case 'r':
27575 if (!strcmp ("reduction", p))
27576 result = PRAGMA_OMP_CLAUSE_REDUCTION;
27577 break;
27578 case 's':
27579 if (!strcmp ("safelen", p))
27580 result = PRAGMA_OMP_CLAUSE_SAFELEN;
27581 else if (!strcmp ("schedule", p))
27582 result = PRAGMA_OMP_CLAUSE_SCHEDULE;
27583 else if (!strcmp ("sections", p))
27584 result = PRAGMA_OMP_CLAUSE_SECTIONS;
27585 else if (!strcmp ("self", p))
27586 result = PRAGMA_OMP_CLAUSE_SELF;
27587 else if (!strcmp ("shared", p))
27588 result = PRAGMA_OMP_CLAUSE_SHARED;
27589 else if (!strcmp ("simdlen", p))
27590 result = PRAGMA_OMP_CLAUSE_SIMDLEN;
27591 break;
27592 case 't':
27593 if (!strcmp ("taskgroup", p))
27594 result = PRAGMA_OMP_CLAUSE_TASKGROUP;
27595 else if (!strcmp ("thread_limit", p))
27596 result = PRAGMA_OMP_CLAUSE_THREAD_LIMIT;
27597 else if (!strcmp ("to", p))
27598 result = PRAGMA_OMP_CLAUSE_TO;
27599 break;
27600 case 'u':
27601 if (!strcmp ("uniform", p))
27602 result = PRAGMA_OMP_CLAUSE_UNIFORM;
27603 else if (!strcmp ("untied", p))
27604 result = PRAGMA_OMP_CLAUSE_UNTIED;
27605 break;
27606 case 'v':
27607 if (!strcmp ("vector_length", p))
27608 result = PRAGMA_OMP_CLAUSE_VECTOR_LENGTH;
27609 else if (flag_cilkplus && !strcmp ("vectorlength", p))
27610 result = PRAGMA_CILK_CLAUSE_VECTORLENGTH;
27611 break;
27612 case 'w':
27613 if (!strcmp ("wait", p))
27614 result = PRAGMA_OMP_CLAUSE_WAIT;
27615 break;
27619 if (result != PRAGMA_OMP_CLAUSE_NONE)
27620 cp_lexer_consume_token (parser->lexer);
27622 return result;
27625 /* Validate that a clause of the given type does not already exist. */
27627 static void
27628 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
27629 const char *name, location_t location)
27631 tree c;
27633 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
27634 if (OMP_CLAUSE_CODE (c) == code)
27636 error_at (location, "too many %qs clauses", name);
27637 break;
27641 /* OpenMP 2.5:
27642 variable-list:
27643 identifier
27644 variable-list , identifier
27646 In addition, we match a closing parenthesis (or, if COLON is non-NULL,
27647 colon). An opening parenthesis will have been consumed by the caller.
27649 If KIND is nonzero, create the appropriate node and install the decl
27650 in OMP_CLAUSE_DECL and add the node to the head of the list.
27652 If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
27653 return the list created.
27655 COLON can be NULL if only closing parenthesis should end the list,
27656 or pointer to bool which will receive false if the list is terminated
27657 by closing parenthesis or true if the list is terminated by colon. */
27659 static tree
27660 cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
27661 tree list, bool *colon)
27663 cp_token *token;
27664 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
27665 if (colon)
27667 parser->colon_corrects_to_scope_p = false;
27668 *colon = false;
27670 while (1)
27672 tree name, decl;
27674 token = cp_lexer_peek_token (parser->lexer);
27675 name = cp_parser_id_expression (parser, /*template_p=*/false,
27676 /*check_dependency_p=*/true,
27677 /*template_p=*/NULL,
27678 /*declarator_p=*/false,
27679 /*optional_p=*/false);
27680 if (name == error_mark_node)
27681 goto skip_comma;
27683 decl = cp_parser_lookup_name_simple (parser, name, token->location);
27684 if (decl == error_mark_node)
27685 cp_parser_name_lookup_error (parser, name, decl, NLE_NULL,
27686 token->location);
27687 else if (kind != 0)
27689 switch (kind)
27691 case OMP_CLAUSE__CACHE_:
27692 if (cp_lexer_peek_token (parser->lexer)->type != CPP_OPEN_SQUARE)
27694 error_at (token->location, "expected %<[%>");
27695 decl = error_mark_node;
27696 break;
27698 /* FALL THROUGH. */
27699 case OMP_CLAUSE_MAP:
27700 case OMP_CLAUSE_FROM:
27701 case OMP_CLAUSE_TO:
27702 case OMP_CLAUSE_DEPEND:
27703 while (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
27705 tree low_bound = NULL_TREE, length = NULL_TREE;
27707 parser->colon_corrects_to_scope_p = false;
27708 cp_lexer_consume_token (parser->lexer);
27709 if (!cp_lexer_next_token_is (parser->lexer, CPP_COLON))
27710 low_bound = cp_parser_expression (parser);
27711 if (!colon)
27712 parser->colon_corrects_to_scope_p
27713 = saved_colon_corrects_to_scope_p;
27714 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_SQUARE))
27715 length = integer_one_node;
27716 else
27718 /* Look for `:'. */
27719 if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
27720 goto skip_comma;
27721 if (!cp_lexer_next_token_is (parser->lexer,
27722 CPP_CLOSE_SQUARE))
27723 length = cp_parser_expression (parser);
27725 /* Look for the closing `]'. */
27726 if (!cp_parser_require (parser, CPP_CLOSE_SQUARE,
27727 RT_CLOSE_SQUARE))
27728 goto skip_comma;
27730 if (kind == OMP_CLAUSE__CACHE_)
27732 if (TREE_CODE (low_bound) != INTEGER_CST
27733 && !TREE_READONLY (low_bound))
27735 error_at (token->location,
27736 "%qD is not a constant", low_bound);
27737 decl = error_mark_node;
27740 if (TREE_CODE (length) != INTEGER_CST
27741 && !TREE_READONLY (length))
27743 error_at (token->location,
27744 "%qD is not a constant", length);
27745 decl = error_mark_node;
27749 decl = tree_cons (low_bound, length, decl);
27751 break;
27752 default:
27753 break;
27756 tree u = build_omp_clause (token->location, kind);
27757 OMP_CLAUSE_DECL (u) = decl;
27758 OMP_CLAUSE_CHAIN (u) = list;
27759 list = u;
27761 else
27762 list = tree_cons (decl, NULL_TREE, list);
27764 get_comma:
27765 if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
27766 break;
27767 cp_lexer_consume_token (parser->lexer);
27770 if (colon)
27771 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
27773 if (colon != NULL && cp_lexer_next_token_is (parser->lexer, CPP_COLON))
27775 *colon = true;
27776 cp_parser_require (parser, CPP_COLON, RT_COLON);
27777 return list;
27780 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
27782 int ending;
27784 /* Try to resync to an unnested comma. Copied from
27785 cp_parser_parenthesized_expression_list. */
27786 skip_comma:
27787 if (colon)
27788 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
27789 ending = cp_parser_skip_to_closing_parenthesis (parser,
27790 /*recovering=*/true,
27791 /*or_comma=*/true,
27792 /*consume_paren=*/true);
27793 if (ending < 0)
27794 goto get_comma;
27797 return list;
27800 /* Similarly, but expect leading and trailing parenthesis. This is a very
27801 common case for omp clauses. */
27803 static tree
27804 cp_parser_omp_var_list (cp_parser *parser, enum omp_clause_code kind, tree list)
27806 if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
27807 return cp_parser_omp_var_list_no_open (parser, kind, list, NULL);
27808 return list;
27811 /* OpenACC 2.0:
27812 copy ( variable-list )
27813 copyin ( variable-list )
27814 copyout ( variable-list )
27815 create ( variable-list )
27816 delete ( variable-list )
27817 present ( variable-list )
27818 present_or_copy ( variable-list )
27819 pcopy ( variable-list )
27820 present_or_copyin ( variable-list )
27821 pcopyin ( variable-list )
27822 present_or_copyout ( variable-list )
27823 pcopyout ( variable-list )
27824 present_or_create ( variable-list )
27825 pcreate ( variable-list ) */
27827 static tree
27828 cp_parser_oacc_data_clause (cp_parser *parser, pragma_omp_clause c_kind,
27829 tree list)
27831 enum omp_clause_map_kind kind;
27832 switch (c_kind)
27834 case PRAGMA_OMP_CLAUSE_COPY:
27835 kind = OMP_CLAUSE_MAP_FORCE_TOFROM;
27836 break;
27837 case PRAGMA_OMP_CLAUSE_COPYIN:
27838 kind = OMP_CLAUSE_MAP_FORCE_TO;
27839 break;
27840 case PRAGMA_OMP_CLAUSE_COPYOUT:
27841 kind = OMP_CLAUSE_MAP_FORCE_FROM;
27842 break;
27843 case PRAGMA_OMP_CLAUSE_CREATE:
27844 kind = OMP_CLAUSE_MAP_FORCE_ALLOC;
27845 break;
27846 case PRAGMA_OMP_CLAUSE_DELETE:
27847 kind = OMP_CLAUSE_MAP_FORCE_DEALLOC;
27848 break;
27849 case PRAGMA_OMP_CLAUSE_DEVICE:
27850 kind = OMP_CLAUSE_MAP_FORCE_TO;
27851 break;
27852 case PRAGMA_OMP_CLAUSE_HOST:
27853 case PRAGMA_OMP_CLAUSE_SELF:
27854 kind = OMP_CLAUSE_MAP_FORCE_FROM;
27855 break;
27856 case PRAGMA_OMP_CLAUSE_PRESENT:
27857 kind = OMP_CLAUSE_MAP_FORCE_PRESENT;
27858 break;
27859 case PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY:
27860 kind = OMP_CLAUSE_MAP_TOFROM;
27861 break;
27862 case PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN:
27863 kind = OMP_CLAUSE_MAP_TO;
27864 break;
27865 case PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT:
27866 kind = OMP_CLAUSE_MAP_FROM;
27867 break;
27868 case PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE:
27869 kind = OMP_CLAUSE_MAP_ALLOC;
27870 break;
27871 default:
27872 gcc_unreachable ();
27874 tree nl, c;
27875 nl = cp_parser_omp_var_list (parser, OMP_CLAUSE_MAP, list);
27877 for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
27878 OMP_CLAUSE_MAP_KIND (c) = kind;
27880 return nl;
27883 /* OpenACC 2.0:
27884 deviceptr ( variable-list ) */
27886 static tree
27887 cp_parser_oacc_data_clause_deviceptr (cp_parser *parser, tree list)
27889 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
27890 tree vars, t;
27892 /* Can't use OMP_CLAUSE_MAP here (that is, can't use the generic
27893 cp_parser_oacc_data_clause), as for PRAGMA_OMP_CLAUSE_DEVICEPTR,
27894 variable-list must only allow for pointer variables. */
27895 vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
27896 for (t = vars; t; t = TREE_CHAIN (t))
27898 tree v = TREE_PURPOSE (t);
27900 /* FIXME diagnostics: Ideally we should keep individual
27901 locations for all the variables in the var list to make the
27902 following errors more precise. Perhaps
27903 c_parser_omp_var_list_parens should construct a list of
27904 locations to go along with the var list. */
27906 if (TREE_CODE (v) != VAR_DECL)
27907 error_at (loc, "%qD is not a variable", v);
27908 else if (TREE_TYPE (v) == error_mark_node)
27910 else if (!POINTER_TYPE_P (TREE_TYPE (v)))
27911 error_at (loc, "%qD is not a pointer variable", v);
27913 tree u = build_omp_clause (loc, OMP_CLAUSE_MAP);
27914 OMP_CLAUSE_MAP_KIND (u) = OMP_CLAUSE_MAP_FORCE_DEVICEPTR;
27915 OMP_CLAUSE_DECL (u) = v;
27916 OMP_CLAUSE_CHAIN (u) = list;
27917 list = u;
27920 return list;
27923 /* OpenACC:
27924 vector_length ( expression ) */
27926 static tree
27927 cp_parser_oacc_clause_vector_length (cp_parser *parser, tree list)
27929 tree t, c;
27930 location_t location = cp_lexer_peek_token (parser->lexer)->location;
27931 bool error = false;
27932 HOST_WIDE_INT n;
27934 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
27935 return list;
27937 t = cp_parser_condition (parser);
27938 if (t == error_mark_node
27939 || !INTEGRAL_TYPE_P (TREE_TYPE (t))
27940 || !tree_fits_shwi_p (t)
27941 || (n = tree_to_shwi (t)) <= 0
27942 || (int) n != n)
27944 error_at (location, "expected positive integer expression");
27945 error = true;
27948 if (error || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
27950 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
27951 /*or_comma=*/false,
27952 /*consume_paren=*/true);
27953 return list;
27956 check_no_duplicate_clause (list, OMP_CLAUSE_VECTOR_LENGTH,
27957 "vector_length", location);
27959 c = build_omp_clause (location, OMP_CLAUSE_VECTOR_LENGTH);
27960 OMP_CLAUSE_VECTOR_LENGTH_EXPR (c) = t;
27961 OMP_CLAUSE_CHAIN (c) = list;
27962 list = c;
27964 return list;
27967 /* OpenACC 2.0
27968 Parse wait clause or directive parameters. */
27970 static tree
27971 cp_parser_oacc_wait_list (cp_parser *parser, location_t clause_loc, tree list)
27973 vec<tree, va_gc> *args;
27974 tree t, args_tree;
27976 args = cp_parser_parenthesized_expression_list (parser, non_attr,
27977 /*cast_p=*/false,
27978 /*allow_expansion_p=*/true,
27979 /*non_constant_p=*/NULL);
27981 if (args == NULL || args->length() == 0)
27983 cp_parser_error (parser, "expected integer expression before ')'");
27984 if (args != NULL)
27985 release_tree_vector (args);
27986 return list;
27989 args_tree = build_tree_list_vec (args);
27991 release_tree_vector (args);
27993 for (t = args_tree; t; t = TREE_CHAIN (t))
27995 tree targ = TREE_VALUE (t);
27997 if (targ != error_mark_node)
27999 if (!INTEGRAL_TYPE_P (TREE_TYPE (targ)))
28001 error("%<wait%> expression must be integral");
28002 targ = error_mark_node;
28004 else
28006 tree c = build_omp_clause (clause_loc, OMP_CLAUSE_WAIT);
28008 mark_rvalue_use (targ);
28010 OMP_CLAUSE_DECL (c) = targ;
28011 OMP_CLAUSE_CHAIN (c) = list;
28012 list = c;
28017 return list;
28020 /* OpenACC:
28021 wait ( int-expr-list ) */
28023 static tree
28024 cp_parser_oacc_clause_wait (cp_parser *parser, tree list)
28026 location_t location = cp_lexer_peek_token (parser->lexer)->location;
28028 if (cp_lexer_peek_token (parser->lexer)->type != CPP_OPEN_PAREN)
28029 return list;
28031 list = cp_parser_oacc_wait_list (parser, location, list);
28033 return list;
28036 /* OpenMP 3.0:
28037 collapse ( constant-expression ) */
28039 static tree
28040 cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location)
28042 tree c, num;
28043 location_t loc;
28044 HOST_WIDE_INT n;
28046 loc = cp_lexer_peek_token (parser->lexer)->location;
28047 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28048 return list;
28050 num = cp_parser_constant_expression (parser);
28052 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28053 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28054 /*or_comma=*/false,
28055 /*consume_paren=*/true);
28057 if (num == error_mark_node)
28058 return list;
28059 num = fold_non_dependent_expr (num);
28060 if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
28061 || !tree_fits_shwi_p (num)
28062 || (n = tree_to_shwi (num)) <= 0
28063 || (int) n != n)
28065 error_at (loc, "collapse argument needs positive constant integer expression");
28066 return list;
28069 check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse", location);
28070 c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
28071 OMP_CLAUSE_CHAIN (c) = list;
28072 OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
28074 return c;
28077 /* OpenMP 2.5:
28078 default ( shared | none ) */
28080 static tree
28081 cp_parser_omp_clause_default (cp_parser *parser, tree list, location_t location)
28083 enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
28084 tree c;
28086 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28087 return list;
28088 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
28090 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
28091 const char *p = IDENTIFIER_POINTER (id);
28093 switch (p[0])
28095 case 'n':
28096 if (strcmp ("none", p) != 0)
28097 goto invalid_kind;
28098 kind = OMP_CLAUSE_DEFAULT_NONE;
28099 break;
28101 case 's':
28102 if (strcmp ("shared", p) != 0)
28103 goto invalid_kind;
28104 kind = OMP_CLAUSE_DEFAULT_SHARED;
28105 break;
28107 default:
28108 goto invalid_kind;
28111 cp_lexer_consume_token (parser->lexer);
28113 else
28115 invalid_kind:
28116 cp_parser_error (parser, "expected %<none%> or %<shared%>");
28119 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28120 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28121 /*or_comma=*/false,
28122 /*consume_paren=*/true);
28124 if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
28125 return list;
28127 check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default", location);
28128 c = build_omp_clause (location, OMP_CLAUSE_DEFAULT);
28129 OMP_CLAUSE_CHAIN (c) = list;
28130 OMP_CLAUSE_DEFAULT_KIND (c) = kind;
28132 return c;
28135 /* OpenMP 3.1:
28136 final ( expression ) */
28138 static tree
28139 cp_parser_omp_clause_final (cp_parser *parser, tree list, location_t location)
28141 tree t, c;
28143 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28144 return list;
28146 t = cp_parser_condition (parser);
28148 if (t == error_mark_node
28149 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28150 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28151 /*or_comma=*/false,
28152 /*consume_paren=*/true);
28154 check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final", location);
28156 c = build_omp_clause (location, OMP_CLAUSE_FINAL);
28157 OMP_CLAUSE_FINAL_EXPR (c) = t;
28158 OMP_CLAUSE_CHAIN (c) = list;
28160 return c;
28163 /* OpenMP 2.5:
28164 if ( expression ) */
28166 static tree
28167 cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location)
28169 tree t, c;
28171 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28172 return list;
28174 t = cp_parser_condition (parser);
28176 if (t == error_mark_node
28177 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28178 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28179 /*or_comma=*/false,
28180 /*consume_paren=*/true);
28182 check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if", location);
28184 c = build_omp_clause (location, OMP_CLAUSE_IF);
28185 OMP_CLAUSE_IF_EXPR (c) = t;
28186 OMP_CLAUSE_CHAIN (c) = list;
28188 return c;
28191 /* OpenMP 3.1:
28192 mergeable */
28194 static tree
28195 cp_parser_omp_clause_mergeable (cp_parser * /*parser*/,
28196 tree list, location_t location)
28198 tree c;
28200 check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable",
28201 location);
28203 c = build_omp_clause (location, OMP_CLAUSE_MERGEABLE);
28204 OMP_CLAUSE_CHAIN (c) = list;
28205 return c;
28208 /* OpenMP 2.5:
28209 nowait */
28211 static tree
28212 cp_parser_omp_clause_nowait (cp_parser * /*parser*/,
28213 tree list, location_t location)
28215 tree c;
28217 check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait", location);
28219 c = build_omp_clause (location, OMP_CLAUSE_NOWAIT);
28220 OMP_CLAUSE_CHAIN (c) = list;
28221 return c;
28224 /* OpenACC:
28225 num_gangs ( expression ) */
28227 static tree
28228 cp_parser_omp_clause_num_gangs (cp_parser *parser, tree list)
28230 tree t, c;
28231 location_t location = cp_lexer_peek_token (parser->lexer)->location;
28232 HOST_WIDE_INT n;
28234 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28235 return list;
28237 t = cp_parser_condition (parser);
28239 if (t == error_mark_node
28240 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28241 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28242 /*or_comma=*/false,
28243 /*consume_paren=*/true);
28245 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
28246 || !tree_fits_shwi_p (t)
28247 || (n = tree_to_shwi (t)) <= 0
28248 || (int) n != n)
28250 error_at (location, "expected positive integer expression");
28251 return list;
28254 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_GANGS, "num_gangs", location);
28256 c = build_omp_clause (location, OMP_CLAUSE_NUM_GANGS);
28257 OMP_CLAUSE_NUM_GANGS_EXPR (c) = t;
28258 OMP_CLAUSE_CHAIN (c) = list;
28259 list = c;
28261 return list;
28264 /* OpenMP 2.5:
28265 num_threads ( expression ) */
28267 static tree
28268 cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
28269 location_t location)
28271 tree t, c;
28273 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28274 return list;
28276 t = cp_parser_expression (parser);
28278 if (t == error_mark_node
28279 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28280 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28281 /*or_comma=*/false,
28282 /*consume_paren=*/true);
28284 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS,
28285 "num_threads", location);
28287 c = build_omp_clause (location, OMP_CLAUSE_NUM_THREADS);
28288 OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
28289 OMP_CLAUSE_CHAIN (c) = list;
28291 return c;
28294 /* OpenACC:
28295 num_workers ( expression ) */
28297 static tree
28298 cp_parser_omp_clause_num_workers (cp_parser *parser, tree list)
28300 tree t, c;
28301 location_t location = cp_lexer_peek_token (parser->lexer)->location;
28302 HOST_WIDE_INT n;
28304 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28305 return list;
28307 t = cp_parser_condition (parser);
28309 if (t == error_mark_node
28310 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28311 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28312 /*or_comma=*/false,
28313 /*consume_paren=*/true);
28315 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
28316 || !tree_fits_shwi_p (t)
28317 || (n = tree_to_shwi (t)) <= 0
28318 || (int) n != n)
28320 error_at (location, "expected positive integer expression");
28321 return list;
28324 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_WORKERS, "num_gangs",
28325 location);
28327 c = build_omp_clause (location, OMP_CLAUSE_NUM_WORKERS);
28328 OMP_CLAUSE_NUM_WORKERS_EXPR (c) = t;
28329 OMP_CLAUSE_CHAIN (c) = list;
28330 list = c;
28332 return list;
28335 /* OpenMP 2.5:
28336 ordered */
28338 static tree
28339 cp_parser_omp_clause_ordered (cp_parser * /*parser*/,
28340 tree list, location_t location)
28342 tree c;
28344 check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED,
28345 "ordered", location);
28347 c = build_omp_clause (location, OMP_CLAUSE_ORDERED);
28348 OMP_CLAUSE_CHAIN (c) = list;
28349 return c;
28352 /* OpenMP 2.5:
28353 reduction ( reduction-operator : variable-list )
28355 reduction-operator:
28356 One of: + * - & ^ | && ||
28358 OpenMP 3.1:
28360 reduction-operator:
28361 One of: + * - & ^ | && || min max
28363 OpenMP 4.0:
28365 reduction-operator:
28366 One of: + * - & ^ | && ||
28367 id-expression */
28369 static tree
28370 cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
28372 enum tree_code code = ERROR_MARK;
28373 tree nlist, c, id = NULL_TREE;
28375 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28376 return list;
28378 switch (cp_lexer_peek_token (parser->lexer)->type)
28380 case CPP_PLUS: code = PLUS_EXPR; break;
28381 case CPP_MULT: code = MULT_EXPR; break;
28382 case CPP_MINUS: code = MINUS_EXPR; break;
28383 case CPP_AND: code = BIT_AND_EXPR; break;
28384 case CPP_XOR: code = BIT_XOR_EXPR; break;
28385 case CPP_OR: code = BIT_IOR_EXPR; break;
28386 case CPP_AND_AND: code = TRUTH_ANDIF_EXPR; break;
28387 case CPP_OR_OR: code = TRUTH_ORIF_EXPR; break;
28388 default: break;
28391 if (code != ERROR_MARK)
28392 cp_lexer_consume_token (parser->lexer);
28393 else
28395 bool saved_colon_corrects_to_scope_p;
28396 saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
28397 parser->colon_corrects_to_scope_p = false;
28398 id = cp_parser_id_expression (parser, /*template_p=*/false,
28399 /*check_dependency_p=*/true,
28400 /*template_p=*/NULL,
28401 /*declarator_p=*/false,
28402 /*optional_p=*/false);
28403 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
28404 if (identifier_p (id))
28406 const char *p = IDENTIFIER_POINTER (id);
28408 if (strcmp (p, "min") == 0)
28409 code = MIN_EXPR;
28410 else if (strcmp (p, "max") == 0)
28411 code = MAX_EXPR;
28412 else if (id == ansi_opname (PLUS_EXPR))
28413 code = PLUS_EXPR;
28414 else if (id == ansi_opname (MULT_EXPR))
28415 code = MULT_EXPR;
28416 else if (id == ansi_opname (MINUS_EXPR))
28417 code = MINUS_EXPR;
28418 else if (id == ansi_opname (BIT_AND_EXPR))
28419 code = BIT_AND_EXPR;
28420 else if (id == ansi_opname (BIT_IOR_EXPR))
28421 code = BIT_IOR_EXPR;
28422 else if (id == ansi_opname (BIT_XOR_EXPR))
28423 code = BIT_XOR_EXPR;
28424 else if (id == ansi_opname (TRUTH_ANDIF_EXPR))
28425 code = TRUTH_ANDIF_EXPR;
28426 else if (id == ansi_opname (TRUTH_ORIF_EXPR))
28427 code = TRUTH_ORIF_EXPR;
28428 id = omp_reduction_id (code, id, NULL_TREE);
28429 tree scope = parser->scope;
28430 if (scope)
28431 id = build_qualified_name (NULL_TREE, scope, id, false);
28432 parser->scope = NULL_TREE;
28433 parser->qualifying_scope = NULL_TREE;
28434 parser->object_scope = NULL_TREE;
28436 else
28438 error ("invalid reduction-identifier");
28439 resync_fail:
28440 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28441 /*or_comma=*/false,
28442 /*consume_paren=*/true);
28443 return list;
28447 if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
28448 goto resync_fail;
28450 nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_REDUCTION, list,
28451 NULL);
28452 for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
28454 OMP_CLAUSE_REDUCTION_CODE (c) = code;
28455 OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = id;
28458 return nlist;
28461 /* OpenMP 2.5:
28462 schedule ( schedule-kind )
28463 schedule ( schedule-kind , expression )
28465 schedule-kind:
28466 static | dynamic | guided | runtime | auto */
28468 static tree
28469 cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location)
28471 tree c, t;
28473 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28474 return list;
28476 c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE);
28478 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
28480 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
28481 const char *p = IDENTIFIER_POINTER (id);
28483 switch (p[0])
28485 case 'd':
28486 if (strcmp ("dynamic", p) != 0)
28487 goto invalid_kind;
28488 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
28489 break;
28491 case 'g':
28492 if (strcmp ("guided", p) != 0)
28493 goto invalid_kind;
28494 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
28495 break;
28497 case 'r':
28498 if (strcmp ("runtime", p) != 0)
28499 goto invalid_kind;
28500 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
28501 break;
28503 default:
28504 goto invalid_kind;
28507 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
28508 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
28509 else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
28510 OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
28511 else
28512 goto invalid_kind;
28513 cp_lexer_consume_token (parser->lexer);
28515 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
28517 cp_token *token;
28518 cp_lexer_consume_token (parser->lexer);
28520 token = cp_lexer_peek_token (parser->lexer);
28521 t = cp_parser_assignment_expression (parser);
28523 if (t == error_mark_node)
28524 goto resync_fail;
28525 else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
28526 error_at (token->location, "schedule %<runtime%> does not take "
28527 "a %<chunk_size%> parameter");
28528 else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
28529 error_at (token->location, "schedule %<auto%> does not take "
28530 "a %<chunk_size%> parameter");
28531 else
28532 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
28534 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28535 goto resync_fail;
28537 else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
28538 goto resync_fail;
28540 check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule", location);
28541 OMP_CLAUSE_CHAIN (c) = list;
28542 return c;
28544 invalid_kind:
28545 cp_parser_error (parser, "invalid schedule kind");
28546 resync_fail:
28547 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28548 /*or_comma=*/false,
28549 /*consume_paren=*/true);
28550 return list;
28553 /* OpenMP 3.0:
28554 untied */
28556 static tree
28557 cp_parser_omp_clause_untied (cp_parser * /*parser*/,
28558 tree list, location_t location)
28560 tree c;
28562 check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied", location);
28564 c = build_omp_clause (location, OMP_CLAUSE_UNTIED);
28565 OMP_CLAUSE_CHAIN (c) = list;
28566 return c;
28569 /* OpenMP 4.0:
28570 inbranch
28571 notinbranch */
28573 static tree
28574 cp_parser_omp_clause_branch (cp_parser * /*parser*/, enum omp_clause_code code,
28575 tree list, location_t location)
28577 check_no_duplicate_clause (list, code, omp_clause_code_name[code], location);
28578 tree c = build_omp_clause (location, code);
28579 OMP_CLAUSE_CHAIN (c) = list;
28580 return c;
28583 /* OpenMP 4.0:
28584 parallel
28586 sections
28587 taskgroup */
28589 static tree
28590 cp_parser_omp_clause_cancelkind (cp_parser * /*parser*/,
28591 enum omp_clause_code code,
28592 tree list, location_t location)
28594 tree c = build_omp_clause (location, code);
28595 OMP_CLAUSE_CHAIN (c) = list;
28596 return c;
28599 /* OpenMP 4.0:
28600 num_teams ( expression ) */
28602 static tree
28603 cp_parser_omp_clause_num_teams (cp_parser *parser, tree list,
28604 location_t location)
28606 tree t, c;
28608 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28609 return list;
28611 t = cp_parser_expression (parser);
28613 if (t == error_mark_node
28614 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28615 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28616 /*or_comma=*/false,
28617 /*consume_paren=*/true);
28619 check_no_duplicate_clause (list, OMP_CLAUSE_NUM_TEAMS,
28620 "num_teams", location);
28622 c = build_omp_clause (location, OMP_CLAUSE_NUM_TEAMS);
28623 OMP_CLAUSE_NUM_TEAMS_EXPR (c) = t;
28624 OMP_CLAUSE_CHAIN (c) = list;
28626 return c;
28629 /* OpenMP 4.0:
28630 thread_limit ( expression ) */
28632 static tree
28633 cp_parser_omp_clause_thread_limit (cp_parser *parser, tree list,
28634 location_t location)
28636 tree t, c;
28638 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28639 return list;
28641 t = cp_parser_expression (parser);
28643 if (t == error_mark_node
28644 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28645 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28646 /*or_comma=*/false,
28647 /*consume_paren=*/true);
28649 check_no_duplicate_clause (list, OMP_CLAUSE_THREAD_LIMIT,
28650 "thread_limit", location);
28652 c = build_omp_clause (location, OMP_CLAUSE_THREAD_LIMIT);
28653 OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = t;
28654 OMP_CLAUSE_CHAIN (c) = list;
28656 return c;
28659 /* OpenMP 4.0:
28660 aligned ( variable-list )
28661 aligned ( variable-list : constant-expression ) */
28663 static tree
28664 cp_parser_omp_clause_aligned (cp_parser *parser, tree list)
28666 tree nlist, c, alignment = NULL_TREE;
28667 bool colon;
28669 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28670 return list;
28672 nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_ALIGNED, list,
28673 &colon);
28675 if (colon)
28677 alignment = cp_parser_constant_expression (parser);
28679 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28680 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28681 /*or_comma=*/false,
28682 /*consume_paren=*/true);
28684 if (alignment == error_mark_node)
28685 alignment = NULL_TREE;
28688 for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
28689 OMP_CLAUSE_ALIGNED_ALIGNMENT (c) = alignment;
28691 return nlist;
28694 /* OpenMP 4.0:
28695 linear ( variable-list )
28696 linear ( variable-list : expression ) */
28698 static tree
28699 cp_parser_omp_clause_linear (cp_parser *parser, tree list,
28700 bool is_cilk_simd_fn)
28702 tree nlist, c, step = integer_one_node;
28703 bool colon;
28705 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28706 return list;
28708 nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_LINEAR, list,
28709 &colon);
28711 if (colon)
28713 step = cp_parser_expression (parser);
28715 if (is_cilk_simd_fn && TREE_CODE (step) == PARM_DECL)
28717 sorry ("using parameters for %<linear%> step is not supported yet");
28718 step = integer_one_node;
28720 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28721 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28722 /*or_comma=*/false,
28723 /*consume_paren=*/true);
28725 if (step == error_mark_node)
28726 return list;
28729 for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
28730 OMP_CLAUSE_LINEAR_STEP (c) = step;
28732 return nlist;
28735 /* OpenMP 4.0:
28736 safelen ( constant-expression ) */
28738 static tree
28739 cp_parser_omp_clause_safelen (cp_parser *parser, tree list,
28740 location_t location)
28742 tree t, c;
28744 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28745 return list;
28747 t = cp_parser_constant_expression (parser);
28749 if (t == error_mark_node
28750 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28751 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28752 /*or_comma=*/false,
28753 /*consume_paren=*/true);
28755 check_no_duplicate_clause (list, OMP_CLAUSE_SAFELEN, "safelen", location);
28757 c = build_omp_clause (location, OMP_CLAUSE_SAFELEN);
28758 OMP_CLAUSE_SAFELEN_EXPR (c) = t;
28759 OMP_CLAUSE_CHAIN (c) = list;
28761 return c;
28764 /* OpenMP 4.0:
28765 simdlen ( constant-expression ) */
28767 static tree
28768 cp_parser_omp_clause_simdlen (cp_parser *parser, tree list,
28769 location_t location)
28771 tree t, c;
28773 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28774 return list;
28776 t = cp_parser_constant_expression (parser);
28778 if (t == error_mark_node
28779 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28780 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28781 /*or_comma=*/false,
28782 /*consume_paren=*/true);
28784 check_no_duplicate_clause (list, OMP_CLAUSE_SIMDLEN, "simdlen", location);
28786 c = build_omp_clause (location, OMP_CLAUSE_SIMDLEN);
28787 OMP_CLAUSE_SIMDLEN_EXPR (c) = t;
28788 OMP_CLAUSE_CHAIN (c) = list;
28790 return c;
28793 /* OpenMP 4.0:
28794 depend ( depend-kind : variable-list )
28796 depend-kind:
28797 in | out | inout */
28799 static tree
28800 cp_parser_omp_clause_depend (cp_parser *parser, tree list)
28802 tree nlist, c;
28803 enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_INOUT;
28805 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28806 return list;
28808 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
28810 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
28811 const char *p = IDENTIFIER_POINTER (id);
28813 if (strcmp ("in", p) == 0)
28814 kind = OMP_CLAUSE_DEPEND_IN;
28815 else if (strcmp ("inout", p) == 0)
28816 kind = OMP_CLAUSE_DEPEND_INOUT;
28817 else if (strcmp ("out", p) == 0)
28818 kind = OMP_CLAUSE_DEPEND_OUT;
28819 else
28820 goto invalid_kind;
28822 else
28823 goto invalid_kind;
28825 cp_lexer_consume_token (parser->lexer);
28826 if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
28827 goto resync_fail;
28829 nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_DEPEND, list,
28830 NULL);
28832 for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
28833 OMP_CLAUSE_DEPEND_KIND (c) = kind;
28835 return nlist;
28837 invalid_kind:
28838 cp_parser_error (parser, "invalid depend kind");
28839 resync_fail:
28840 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28841 /*or_comma=*/false,
28842 /*consume_paren=*/true);
28843 return list;
28846 /* OpenMP 4.0:
28847 map ( map-kind : variable-list )
28848 map ( variable-list )
28850 map-kind:
28851 alloc | to | from | tofrom */
28853 static tree
28854 cp_parser_omp_clause_map (cp_parser *parser, tree list)
28856 tree nlist, c;
28857 enum omp_clause_map_kind kind = OMP_CLAUSE_MAP_TOFROM;
28859 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28860 return list;
28862 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
28863 && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
28865 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
28866 const char *p = IDENTIFIER_POINTER (id);
28868 if (strcmp ("alloc", p) == 0)
28869 kind = OMP_CLAUSE_MAP_ALLOC;
28870 else if (strcmp ("to", p) == 0)
28871 kind = OMP_CLAUSE_MAP_TO;
28872 else if (strcmp ("from", p) == 0)
28873 kind = OMP_CLAUSE_MAP_FROM;
28874 else if (strcmp ("tofrom", p) == 0)
28875 kind = OMP_CLAUSE_MAP_TOFROM;
28876 else
28878 cp_parser_error (parser, "invalid map kind");
28879 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28880 /*or_comma=*/false,
28881 /*consume_paren=*/true);
28882 return list;
28884 cp_lexer_consume_token (parser->lexer);
28885 cp_lexer_consume_token (parser->lexer);
28888 nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_MAP, list,
28889 NULL);
28891 for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
28892 OMP_CLAUSE_MAP_KIND (c) = kind;
28894 return nlist;
28897 /* OpenMP 4.0:
28898 device ( expression ) */
28900 static tree
28901 cp_parser_omp_clause_device (cp_parser *parser, tree list,
28902 location_t location)
28904 tree t, c;
28906 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28907 return list;
28909 t = cp_parser_expression (parser);
28911 if (t == error_mark_node
28912 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28913 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28914 /*or_comma=*/false,
28915 /*consume_paren=*/true);
28917 check_no_duplicate_clause (list, OMP_CLAUSE_DEVICE,
28918 "device", location);
28920 c = build_omp_clause (location, OMP_CLAUSE_DEVICE);
28921 OMP_CLAUSE_DEVICE_ID (c) = t;
28922 OMP_CLAUSE_CHAIN (c) = list;
28924 return c;
28927 /* OpenMP 4.0:
28928 dist_schedule ( static )
28929 dist_schedule ( static , expression ) */
28931 static tree
28932 cp_parser_omp_clause_dist_schedule (cp_parser *parser, tree list,
28933 location_t location)
28935 tree c, t;
28937 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28938 return list;
28940 c = build_omp_clause (location, OMP_CLAUSE_DIST_SCHEDULE);
28942 if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
28943 goto invalid_kind;
28944 cp_lexer_consume_token (parser->lexer);
28946 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
28948 cp_lexer_consume_token (parser->lexer);
28950 t = cp_parser_assignment_expression (parser);
28952 if (t == error_mark_node)
28953 goto resync_fail;
28954 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = t;
28956 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
28957 goto resync_fail;
28959 else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
28960 goto resync_fail;
28962 check_no_duplicate_clause (list, OMP_CLAUSE_DIST_SCHEDULE, "dist_schedule",
28963 location);
28964 OMP_CLAUSE_CHAIN (c) = list;
28965 return c;
28967 invalid_kind:
28968 cp_parser_error (parser, "invalid dist_schedule kind");
28969 resync_fail:
28970 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
28971 /*or_comma=*/false,
28972 /*consume_paren=*/true);
28973 return list;
28976 /* OpenMP 4.0:
28977 proc_bind ( proc-bind-kind )
28979 proc-bind-kind:
28980 master | close | spread */
28982 static tree
28983 cp_parser_omp_clause_proc_bind (cp_parser *parser, tree list,
28984 location_t location)
28986 tree c;
28987 enum omp_clause_proc_bind_kind kind;
28989 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
28990 return list;
28992 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
28994 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
28995 const char *p = IDENTIFIER_POINTER (id);
28997 if (strcmp ("master", p) == 0)
28998 kind = OMP_CLAUSE_PROC_BIND_MASTER;
28999 else if (strcmp ("close", p) == 0)
29000 kind = OMP_CLAUSE_PROC_BIND_CLOSE;
29001 else if (strcmp ("spread", p) == 0)
29002 kind = OMP_CLAUSE_PROC_BIND_SPREAD;
29003 else
29004 goto invalid_kind;
29006 else
29007 goto invalid_kind;
29009 cp_lexer_consume_token (parser->lexer);
29010 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
29011 goto resync_fail;
29013 c = build_omp_clause (location, OMP_CLAUSE_PROC_BIND);
29014 check_no_duplicate_clause (list, OMP_CLAUSE_PROC_BIND, "proc_bind",
29015 location);
29016 OMP_CLAUSE_PROC_BIND_KIND (c) = kind;
29017 OMP_CLAUSE_CHAIN (c) = list;
29018 return c;
29020 invalid_kind:
29021 cp_parser_error (parser, "invalid depend kind");
29022 resync_fail:
29023 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
29024 /*or_comma=*/false,
29025 /*consume_paren=*/true);
29026 return list;
29029 /* OpenACC:
29030 async [( int-expr )] */
29032 static tree
29033 cp_parser_oacc_clause_async (cp_parser *parser, tree list)
29035 tree c, t;
29036 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
29038 /* TODO XXX: FIX -1 (acc_async_noval). */
29039 t = build_int_cst (integer_type_node, -1);
29041 if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
29043 cp_lexer_consume_token (parser->lexer);
29045 t = cp_parser_expression (parser);
29046 if (t == error_mark_node
29047 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
29048 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
29049 /*or_comma=*/false,
29050 /*consume_paren=*/true);
29053 check_no_duplicate_clause (list, OMP_CLAUSE_ASYNC, "async", loc);
29055 c = build_omp_clause (loc, OMP_CLAUSE_ASYNC);
29056 OMP_CLAUSE_ASYNC_EXPR (c) = t;
29057 OMP_CLAUSE_CHAIN (c) = list;
29058 list = c;
29060 return list;
29063 /* Parse all OpenACC clauses. The set clauses allowed by the directive
29064 is a bitmask in MASK. Return the list of clauses found. */
29066 static tree
29067 cp_parser_oacc_all_clauses (cp_parser *parser, omp_clause_mask mask,
29068 const char *where, cp_token *pragma_tok,
29069 bool finish_p = true)
29071 tree clauses = NULL;
29072 bool first = true;
29074 while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
29076 location_t here;
29077 pragma_omp_clause c_kind;
29078 const char *c_name;
29079 tree prev = clauses;
29081 if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
29082 cp_lexer_consume_token (parser->lexer);
29084 here = cp_lexer_peek_token (parser->lexer)->location;
29085 c_kind = cp_parser_omp_clause_name (parser);
29087 switch (c_kind)
29089 case PRAGMA_OMP_CLAUSE_ASYNC:
29090 clauses = cp_parser_oacc_clause_async (parser, clauses);
29091 c_name = "async";
29092 break;
29093 case PRAGMA_OMP_CLAUSE_COLLAPSE:
29094 clauses = cp_parser_omp_clause_collapse (parser, clauses, here);
29095 c_name = "collapse";
29096 break;
29097 case PRAGMA_OMP_CLAUSE_COPY:
29098 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29099 c_name = "copy";
29100 break;
29101 case PRAGMA_OMP_CLAUSE_COPYIN:
29102 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29103 c_name = "copyin";
29104 break;
29105 case PRAGMA_OMP_CLAUSE_COPYOUT:
29106 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29107 c_name = "copyout";
29108 break;
29109 case PRAGMA_OMP_CLAUSE_CREATE:
29110 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29111 c_name = "create";
29112 break;
29113 case PRAGMA_OMP_CLAUSE_DELETE:
29114 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29115 c_name = "delete";
29116 break;
29117 case PRAGMA_OMP_CLAUSE_DEVICE:
29118 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29119 c_name = "device";
29120 break;
29121 case PRAGMA_OMP_CLAUSE_DEVICEPTR:
29122 clauses = cp_parser_oacc_data_clause_deviceptr (parser, clauses);
29123 c_name = "deviceptr";
29124 break;
29125 case PRAGMA_OMP_CLAUSE_HOST:
29126 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29127 c_name = "host";
29128 break;
29129 case PRAGMA_OMP_CLAUSE_IF:
29130 clauses = cp_parser_omp_clause_if (parser, clauses, here);
29131 c_name = "if";
29132 break;
29133 case PRAGMA_OMP_CLAUSE_NUM_GANGS:
29134 clauses = cp_parser_omp_clause_num_gangs (parser, clauses);
29135 c_name = "num_gangs";
29136 break;
29137 case PRAGMA_OMP_CLAUSE_NUM_WORKERS:
29138 clauses = cp_parser_omp_clause_num_workers (parser, clauses);
29139 c_name = "num_workers";
29140 break;
29141 case PRAGMA_OMP_CLAUSE_PRESENT:
29142 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29143 c_name = "present";
29144 break;
29145 case PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY:
29146 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29147 c_name = "present_or_copy";
29148 break;
29149 case PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN:
29150 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29151 c_name = "present_or_copyin";
29152 break;
29153 case PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT:
29154 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29155 c_name = "present_or_copyout";
29156 break;
29157 case PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE:
29158 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29159 c_name = "present_or_create";
29160 break;
29161 case PRAGMA_OMP_CLAUSE_REDUCTION:
29162 clauses = cp_parser_omp_clause_reduction (parser, clauses);
29163 c_name = "reduction";
29164 break;
29165 case PRAGMA_OMP_CLAUSE_SELF:
29166 clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
29167 c_name = "self";
29168 break;
29169 case PRAGMA_OMP_CLAUSE_VECTOR_LENGTH:
29170 clauses =
29171 cp_parser_oacc_clause_vector_length (parser, clauses);
29172 c_name = "vector_length";
29173 break;
29174 case PRAGMA_OMP_CLAUSE_WAIT:
29175 clauses = cp_parser_oacc_clause_wait (parser, clauses);
29176 c_name = "wait";
29177 break;
29178 default:
29179 cp_parser_error (parser, "expected clause");
29180 goto saw_error;
29183 first = false;
29185 if (((mask >> c_kind) & 1) == 0)
29187 /* Remove the invalid clause(s) from the list to avoid
29188 confusing the rest of the compiler. */
29189 clauses = prev;
29190 error_at (here, "%qs is not valid for %qs", c_name, where);
29194 saw_error:
29195 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
29197 if (finish_p)
29198 return finish_omp_clauses (clauses);
29200 return clauses;
29203 /* Parse all OpenMP clauses. The set clauses allowed by the directive
29204 is a bitmask in MASK. Return the list of clauses found; the result
29205 of clause default goes in *pdefault. */
29207 static tree
29208 cp_parser_omp_all_clauses (cp_parser *parser, omp_clause_mask mask,
29209 const char *where, cp_token *pragma_tok,
29210 bool finish_p = true)
29212 tree clauses = NULL;
29213 bool first = true;
29214 cp_token *token = NULL;
29215 bool cilk_simd_fn = false;
29217 while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
29219 pragma_omp_clause c_kind;
29220 const char *c_name;
29221 tree prev = clauses;
29223 if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
29224 cp_lexer_consume_token (parser->lexer);
29226 token = cp_lexer_peek_token (parser->lexer);
29227 c_kind = cp_parser_omp_clause_name (parser);
29229 switch (c_kind)
29231 case PRAGMA_OMP_CLAUSE_COLLAPSE:
29232 clauses = cp_parser_omp_clause_collapse (parser, clauses,
29233 token->location);
29234 c_name = "collapse";
29235 break;
29236 case PRAGMA_OMP_CLAUSE_COPYIN:
29237 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYIN, clauses);
29238 c_name = "copyin";
29239 break;
29240 case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
29241 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYPRIVATE,
29242 clauses);
29243 c_name = "copyprivate";
29244 break;
29245 case PRAGMA_OMP_CLAUSE_DEFAULT:
29246 clauses = cp_parser_omp_clause_default (parser, clauses,
29247 token->location);
29248 c_name = "default";
29249 break;
29250 case PRAGMA_OMP_CLAUSE_FINAL:
29251 clauses = cp_parser_omp_clause_final (parser, clauses, token->location);
29252 c_name = "final";
29253 break;
29254 case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
29255 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
29256 clauses);
29257 c_name = "firstprivate";
29258 break;
29259 case PRAGMA_OMP_CLAUSE_IF:
29260 clauses = cp_parser_omp_clause_if (parser, clauses, token->location);
29261 c_name = "if";
29262 break;
29263 case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
29264 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
29265 clauses);
29266 c_name = "lastprivate";
29267 break;
29268 case PRAGMA_OMP_CLAUSE_MERGEABLE:
29269 clauses = cp_parser_omp_clause_mergeable (parser, clauses,
29270 token->location);
29271 c_name = "mergeable";
29272 break;
29273 case PRAGMA_OMP_CLAUSE_NOWAIT:
29274 clauses = cp_parser_omp_clause_nowait (parser, clauses, token->location);
29275 c_name = "nowait";
29276 break;
29277 case PRAGMA_OMP_CLAUSE_NUM_THREADS:
29278 clauses = cp_parser_omp_clause_num_threads (parser, clauses,
29279 token->location);
29280 c_name = "num_threads";
29281 break;
29282 case PRAGMA_OMP_CLAUSE_ORDERED:
29283 clauses = cp_parser_omp_clause_ordered (parser, clauses,
29284 token->location);
29285 c_name = "ordered";
29286 break;
29287 case PRAGMA_OMP_CLAUSE_PRIVATE:
29288 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
29289 clauses);
29290 c_name = "private";
29291 break;
29292 case PRAGMA_OMP_CLAUSE_REDUCTION:
29293 clauses = cp_parser_omp_clause_reduction (parser, clauses);
29294 c_name = "reduction";
29295 break;
29296 case PRAGMA_OMP_CLAUSE_SCHEDULE:
29297 clauses = cp_parser_omp_clause_schedule (parser, clauses,
29298 token->location);
29299 c_name = "schedule";
29300 break;
29301 case PRAGMA_OMP_CLAUSE_SHARED:
29302 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_SHARED,
29303 clauses);
29304 c_name = "shared";
29305 break;
29306 case PRAGMA_OMP_CLAUSE_UNTIED:
29307 clauses = cp_parser_omp_clause_untied (parser, clauses,
29308 token->location);
29309 c_name = "untied";
29310 break;
29311 case PRAGMA_OMP_CLAUSE_INBRANCH:
29312 case PRAGMA_CILK_CLAUSE_MASK:
29313 clauses = cp_parser_omp_clause_branch (parser, OMP_CLAUSE_INBRANCH,
29314 clauses, token->location);
29315 c_name = "inbranch";
29316 break;
29317 case PRAGMA_OMP_CLAUSE_NOTINBRANCH:
29318 case PRAGMA_CILK_CLAUSE_NOMASK:
29319 clauses = cp_parser_omp_clause_branch (parser,
29320 OMP_CLAUSE_NOTINBRANCH,
29321 clauses, token->location);
29322 c_name = "notinbranch";
29323 break;
29324 case PRAGMA_OMP_CLAUSE_PARALLEL:
29325 clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_PARALLEL,
29326 clauses, token->location);
29327 c_name = "parallel";
29328 if (!first)
29330 clause_not_first:
29331 error_at (token->location, "%qs must be the first clause of %qs",
29332 c_name, where);
29333 clauses = prev;
29335 break;
29336 case PRAGMA_OMP_CLAUSE_FOR:
29337 clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_FOR,
29338 clauses, token->location);
29339 c_name = "for";
29340 if (!first)
29341 goto clause_not_first;
29342 break;
29343 case PRAGMA_OMP_CLAUSE_SECTIONS:
29344 clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_SECTIONS,
29345 clauses, token->location);
29346 c_name = "sections";
29347 if (!first)
29348 goto clause_not_first;
29349 break;
29350 case PRAGMA_OMP_CLAUSE_TASKGROUP:
29351 clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_TASKGROUP,
29352 clauses, token->location);
29353 c_name = "taskgroup";
29354 if (!first)
29355 goto clause_not_first;
29356 break;
29357 case PRAGMA_OMP_CLAUSE_TO:
29358 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO,
29359 clauses);
29360 c_name = "to";
29361 break;
29362 case PRAGMA_OMP_CLAUSE_FROM:
29363 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FROM,
29364 clauses);
29365 c_name = "from";
29366 break;
29367 case PRAGMA_OMP_CLAUSE_UNIFORM:
29368 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_UNIFORM,
29369 clauses);
29370 c_name = "uniform";
29371 break;
29372 case PRAGMA_OMP_CLAUSE_NUM_TEAMS:
29373 clauses = cp_parser_omp_clause_num_teams (parser, clauses,
29374 token->location);
29375 c_name = "num_teams";
29376 break;
29377 case PRAGMA_OMP_CLAUSE_THREAD_LIMIT:
29378 clauses = cp_parser_omp_clause_thread_limit (parser, clauses,
29379 token->location);
29380 c_name = "thread_limit";
29381 break;
29382 case PRAGMA_OMP_CLAUSE_ALIGNED:
29383 clauses = cp_parser_omp_clause_aligned (parser, clauses);
29384 c_name = "aligned";
29385 break;
29386 case PRAGMA_OMP_CLAUSE_LINEAR:
29387 if (((mask >> PRAGMA_CILK_CLAUSE_VECTORLENGTH) & 1) != 0)
29388 cilk_simd_fn = true;
29389 clauses = cp_parser_omp_clause_linear (parser, clauses, cilk_simd_fn);
29390 c_name = "linear";
29391 break;
29392 case PRAGMA_OMP_CLAUSE_DEPEND:
29393 clauses = cp_parser_omp_clause_depend (parser, clauses);
29394 c_name = "depend";
29395 break;
29396 case PRAGMA_OMP_CLAUSE_MAP:
29397 clauses = cp_parser_omp_clause_map (parser, clauses);
29398 c_name = "map";
29399 break;
29400 case PRAGMA_OMP_CLAUSE_DEVICE:
29401 clauses = cp_parser_omp_clause_device (parser, clauses,
29402 token->location);
29403 c_name = "device";
29404 break;
29405 case PRAGMA_OMP_CLAUSE_DIST_SCHEDULE:
29406 clauses = cp_parser_omp_clause_dist_schedule (parser, clauses,
29407 token->location);
29408 c_name = "dist_schedule";
29409 break;
29410 case PRAGMA_OMP_CLAUSE_PROC_BIND:
29411 clauses = cp_parser_omp_clause_proc_bind (parser, clauses,
29412 token->location);
29413 c_name = "proc_bind";
29414 break;
29415 case PRAGMA_OMP_CLAUSE_SAFELEN:
29416 clauses = cp_parser_omp_clause_safelen (parser, clauses,
29417 token->location);
29418 c_name = "safelen";
29419 break;
29420 case PRAGMA_OMP_CLAUSE_SIMDLEN:
29421 clauses = cp_parser_omp_clause_simdlen (parser, clauses,
29422 token->location);
29423 c_name = "simdlen";
29424 break;
29425 case PRAGMA_CILK_CLAUSE_VECTORLENGTH:
29426 clauses = cp_parser_cilk_simd_vectorlength (parser, clauses, true);
29427 c_name = "simdlen";
29428 break;
29429 default:
29430 cp_parser_error (parser, "expected clause");
29431 goto saw_error;
29434 first = false;
29436 if (((mask >> c_kind) & 1) == 0)
29438 /* Remove the invalid clause(s) from the list to avoid
29439 confusing the rest of the compiler. */
29440 clauses = prev;
29441 error_at (token->location, "%qs is not valid for %qs", c_name, where);
29444 saw_error:
29445 /* In Cilk Plus SIMD enabled functions there is no pragma_token, so
29446 no reason to skip to the end. */
29447 if (!(flag_cilkplus && pragma_tok == NULL))
29448 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
29449 if (finish_p)
29450 return finish_omp_clauses (clauses);
29451 return clauses;
29454 /* OpenMP 2.5:
29455 structured-block:
29456 statement
29458 In practice, we're also interested in adding the statement to an
29459 outer node. So it is convenient if we work around the fact that
29460 cp_parser_statement calls add_stmt. */
29462 static unsigned
29463 cp_parser_begin_omp_structured_block (cp_parser *parser)
29465 unsigned save = parser->in_statement;
29467 /* Only move the values to IN_OMP_BLOCK if they weren't false.
29468 This preserves the "not within loop or switch" style error messages
29469 for nonsense cases like
29470 void foo() {
29471 #pragma omp single
29472 break;
29475 if (parser->in_statement)
29476 parser->in_statement = IN_OMP_BLOCK;
29478 return save;
29481 static void
29482 cp_parser_end_omp_structured_block (cp_parser *parser, unsigned save)
29484 parser->in_statement = save;
29487 static tree
29488 cp_parser_omp_structured_block (cp_parser *parser)
29490 tree stmt = begin_omp_structured_block ();
29491 unsigned int save = cp_parser_begin_omp_structured_block (parser);
29493 cp_parser_statement (parser, NULL_TREE, false, NULL);
29495 cp_parser_end_omp_structured_block (parser, save);
29496 return finish_omp_structured_block (stmt);
29499 /* OpenMP 2.5:
29500 # pragma omp atomic new-line
29501 expression-stmt
29503 expression-stmt:
29504 x binop= expr | x++ | ++x | x-- | --x
29505 binop:
29506 +, *, -, /, &, ^, |, <<, >>
29508 where x is an lvalue expression with scalar type.
29510 OpenMP 3.1:
29511 # pragma omp atomic new-line
29512 update-stmt
29514 # pragma omp atomic read new-line
29515 read-stmt
29517 # pragma omp atomic write new-line
29518 write-stmt
29520 # pragma omp atomic update new-line
29521 update-stmt
29523 # pragma omp atomic capture new-line
29524 capture-stmt
29526 # pragma omp atomic capture new-line
29527 capture-block
29529 read-stmt:
29530 v = x
29531 write-stmt:
29532 x = expr
29533 update-stmt:
29534 expression-stmt | x = x binop expr
29535 capture-stmt:
29536 v = expression-stmt
29537 capture-block:
29538 { v = x; update-stmt; } | { update-stmt; v = x; }
29540 OpenMP 4.0:
29541 update-stmt:
29542 expression-stmt | x = x binop expr | x = expr binop x
29543 capture-stmt:
29544 v = update-stmt
29545 capture-block:
29546 { v = x; update-stmt; } | { update-stmt; v = x; } | { v = x; x = expr; }
29548 where x and v are lvalue expressions with scalar type. */
29550 static void
29551 cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok)
29553 tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE, lhs1 = NULL_TREE;
29554 tree rhs1 = NULL_TREE, orig_lhs;
29555 enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
29556 bool structured_block = false;
29557 bool seq_cst = false;
29559 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
29561 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
29562 const char *p = IDENTIFIER_POINTER (id);
29564 if (!strcmp (p, "seq_cst"))
29566 seq_cst = true;
29567 cp_lexer_consume_token (parser->lexer);
29568 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
29569 && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
29570 cp_lexer_consume_token (parser->lexer);
29573 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
29575 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
29576 const char *p = IDENTIFIER_POINTER (id);
29578 if (!strcmp (p, "read"))
29579 code = OMP_ATOMIC_READ;
29580 else if (!strcmp (p, "write"))
29581 code = NOP_EXPR;
29582 else if (!strcmp (p, "update"))
29583 code = OMP_ATOMIC;
29584 else if (!strcmp (p, "capture"))
29585 code = OMP_ATOMIC_CAPTURE_NEW;
29586 else
29587 p = NULL;
29588 if (p)
29589 cp_lexer_consume_token (parser->lexer);
29591 if (!seq_cst)
29593 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
29594 && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
29595 cp_lexer_consume_token (parser->lexer);
29597 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
29599 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
29600 const char *p = IDENTIFIER_POINTER (id);
29602 if (!strcmp (p, "seq_cst"))
29604 seq_cst = true;
29605 cp_lexer_consume_token (parser->lexer);
29609 cp_parser_require_pragma_eol (parser, pragma_tok);
29611 switch (code)
29613 case OMP_ATOMIC_READ:
29614 case NOP_EXPR: /* atomic write */
29615 v = cp_parser_unary_expression (parser);
29616 if (v == error_mark_node)
29617 goto saw_error;
29618 if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
29619 goto saw_error;
29620 if (code == NOP_EXPR)
29621 lhs = cp_parser_expression (parser);
29622 else
29623 lhs = cp_parser_unary_expression (parser);
29624 if (lhs == error_mark_node)
29625 goto saw_error;
29626 if (code == NOP_EXPR)
29628 /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
29629 opcode. */
29630 code = OMP_ATOMIC;
29631 rhs = lhs;
29632 lhs = v;
29633 v = NULL_TREE;
29635 goto done;
29636 case OMP_ATOMIC_CAPTURE_NEW:
29637 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
29639 cp_lexer_consume_token (parser->lexer);
29640 structured_block = true;
29642 else
29644 v = cp_parser_unary_expression (parser);
29645 if (v == error_mark_node)
29646 goto saw_error;
29647 if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
29648 goto saw_error;
29650 default:
29651 break;
29654 restart:
29655 lhs = cp_parser_unary_expression (parser);
29656 orig_lhs = lhs;
29657 switch (TREE_CODE (lhs))
29659 case ERROR_MARK:
29660 goto saw_error;
29662 case POSTINCREMENT_EXPR:
29663 if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
29664 code = OMP_ATOMIC_CAPTURE_OLD;
29665 /* FALLTHROUGH */
29666 case PREINCREMENT_EXPR:
29667 lhs = TREE_OPERAND (lhs, 0);
29668 opcode = PLUS_EXPR;
29669 rhs = integer_one_node;
29670 break;
29672 case POSTDECREMENT_EXPR:
29673 if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
29674 code = OMP_ATOMIC_CAPTURE_OLD;
29675 /* FALLTHROUGH */
29676 case PREDECREMENT_EXPR:
29677 lhs = TREE_OPERAND (lhs, 0);
29678 opcode = MINUS_EXPR;
29679 rhs = integer_one_node;
29680 break;
29682 case COMPOUND_EXPR:
29683 if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
29684 && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
29685 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
29686 && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
29687 && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
29688 (TREE_OPERAND (lhs, 1), 0), 0)))
29689 == BOOLEAN_TYPE)
29690 /* Undo effects of boolean_increment for post {in,de}crement. */
29691 lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
29692 /* FALLTHRU */
29693 case MODIFY_EXPR:
29694 if (TREE_CODE (lhs) == MODIFY_EXPR
29695 && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
29697 /* Undo effects of boolean_increment. */
29698 if (integer_onep (TREE_OPERAND (lhs, 1)))
29700 /* This is pre or post increment. */
29701 rhs = TREE_OPERAND (lhs, 1);
29702 lhs = TREE_OPERAND (lhs, 0);
29703 opcode = NOP_EXPR;
29704 if (code == OMP_ATOMIC_CAPTURE_NEW
29705 && !structured_block
29706 && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
29707 code = OMP_ATOMIC_CAPTURE_OLD;
29708 break;
29711 /* FALLTHRU */
29712 default:
29713 switch (cp_lexer_peek_token (parser->lexer)->type)
29715 case CPP_MULT_EQ:
29716 opcode = MULT_EXPR;
29717 break;
29718 case CPP_DIV_EQ:
29719 opcode = TRUNC_DIV_EXPR;
29720 break;
29721 case CPP_PLUS_EQ:
29722 opcode = PLUS_EXPR;
29723 break;
29724 case CPP_MINUS_EQ:
29725 opcode = MINUS_EXPR;
29726 break;
29727 case CPP_LSHIFT_EQ:
29728 opcode = LSHIFT_EXPR;
29729 break;
29730 case CPP_RSHIFT_EQ:
29731 opcode = RSHIFT_EXPR;
29732 break;
29733 case CPP_AND_EQ:
29734 opcode = BIT_AND_EXPR;
29735 break;
29736 case CPP_OR_EQ:
29737 opcode = BIT_IOR_EXPR;
29738 break;
29739 case CPP_XOR_EQ:
29740 opcode = BIT_XOR_EXPR;
29741 break;
29742 case CPP_EQ:
29743 enum cp_parser_prec oprec;
29744 cp_token *token;
29745 cp_lexer_consume_token (parser->lexer);
29746 cp_parser_parse_tentatively (parser);
29747 rhs1 = cp_parser_simple_cast_expression (parser);
29748 if (rhs1 == error_mark_node)
29750 cp_parser_abort_tentative_parse (parser);
29751 cp_parser_simple_cast_expression (parser);
29752 goto saw_error;
29754 token = cp_lexer_peek_token (parser->lexer);
29755 if (token->type != CPP_SEMICOLON && !cp_tree_equal (lhs, rhs1))
29757 cp_parser_abort_tentative_parse (parser);
29758 cp_parser_parse_tentatively (parser);
29759 rhs = cp_parser_binary_expression (parser, false, true,
29760 PREC_NOT_OPERATOR, NULL);
29761 if (rhs == error_mark_node)
29763 cp_parser_abort_tentative_parse (parser);
29764 cp_parser_binary_expression (parser, false, true,
29765 PREC_NOT_OPERATOR, NULL);
29766 goto saw_error;
29768 switch (TREE_CODE (rhs))
29770 case MULT_EXPR:
29771 case TRUNC_DIV_EXPR:
29772 case PLUS_EXPR:
29773 case MINUS_EXPR:
29774 case LSHIFT_EXPR:
29775 case RSHIFT_EXPR:
29776 case BIT_AND_EXPR:
29777 case BIT_IOR_EXPR:
29778 case BIT_XOR_EXPR:
29779 if (cp_tree_equal (lhs, TREE_OPERAND (rhs, 1)))
29781 if (cp_parser_parse_definitely (parser))
29783 opcode = TREE_CODE (rhs);
29784 rhs1 = TREE_OPERAND (rhs, 0);
29785 rhs = TREE_OPERAND (rhs, 1);
29786 goto stmt_done;
29788 else
29789 goto saw_error;
29791 break;
29792 default:
29793 break;
29795 cp_parser_abort_tentative_parse (parser);
29796 if (structured_block && code == OMP_ATOMIC_CAPTURE_OLD)
29798 rhs = cp_parser_expression (parser);
29799 if (rhs == error_mark_node)
29800 goto saw_error;
29801 opcode = NOP_EXPR;
29802 rhs1 = NULL_TREE;
29803 goto stmt_done;
29805 cp_parser_error (parser,
29806 "invalid form of %<#pragma omp atomic%>");
29807 goto saw_error;
29809 if (!cp_parser_parse_definitely (parser))
29810 goto saw_error;
29811 switch (token->type)
29813 case CPP_SEMICOLON:
29814 if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
29816 code = OMP_ATOMIC_CAPTURE_OLD;
29817 v = lhs;
29818 lhs = NULL_TREE;
29819 lhs1 = rhs1;
29820 rhs1 = NULL_TREE;
29821 cp_lexer_consume_token (parser->lexer);
29822 goto restart;
29824 else if (structured_block)
29826 opcode = NOP_EXPR;
29827 rhs = rhs1;
29828 rhs1 = NULL_TREE;
29829 goto stmt_done;
29831 cp_parser_error (parser,
29832 "invalid form of %<#pragma omp atomic%>");
29833 goto saw_error;
29834 case CPP_MULT:
29835 opcode = MULT_EXPR;
29836 break;
29837 case CPP_DIV:
29838 opcode = TRUNC_DIV_EXPR;
29839 break;
29840 case CPP_PLUS:
29841 opcode = PLUS_EXPR;
29842 break;
29843 case CPP_MINUS:
29844 opcode = MINUS_EXPR;
29845 break;
29846 case CPP_LSHIFT:
29847 opcode = LSHIFT_EXPR;
29848 break;
29849 case CPP_RSHIFT:
29850 opcode = RSHIFT_EXPR;
29851 break;
29852 case CPP_AND:
29853 opcode = BIT_AND_EXPR;
29854 break;
29855 case CPP_OR:
29856 opcode = BIT_IOR_EXPR;
29857 break;
29858 case CPP_XOR:
29859 opcode = BIT_XOR_EXPR;
29860 break;
29861 default:
29862 cp_parser_error (parser,
29863 "invalid operator for %<#pragma omp atomic%>");
29864 goto saw_error;
29866 oprec = TOKEN_PRECEDENCE (token);
29867 gcc_assert (oprec != PREC_NOT_OPERATOR);
29868 if (commutative_tree_code (opcode))
29869 oprec = (enum cp_parser_prec) (oprec - 1);
29870 cp_lexer_consume_token (parser->lexer);
29871 rhs = cp_parser_binary_expression (parser, false, false,
29872 oprec, NULL);
29873 if (rhs == error_mark_node)
29874 goto saw_error;
29875 goto stmt_done;
29876 /* FALLTHROUGH */
29877 default:
29878 cp_parser_error (parser,
29879 "invalid operator for %<#pragma omp atomic%>");
29880 goto saw_error;
29882 cp_lexer_consume_token (parser->lexer);
29884 rhs = cp_parser_expression (parser);
29885 if (rhs == error_mark_node)
29886 goto saw_error;
29887 break;
29889 stmt_done:
29890 if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
29892 if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
29893 goto saw_error;
29894 v = cp_parser_unary_expression (parser);
29895 if (v == error_mark_node)
29896 goto saw_error;
29897 if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
29898 goto saw_error;
29899 lhs1 = cp_parser_unary_expression (parser);
29900 if (lhs1 == error_mark_node)
29901 goto saw_error;
29903 if (structured_block)
29905 cp_parser_consume_semicolon_at_end_of_statement (parser);
29906 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
29908 done:
29909 finish_omp_atomic (code, opcode, lhs, rhs, v, lhs1, rhs1, seq_cst);
29910 if (!structured_block)
29911 cp_parser_consume_semicolon_at_end_of_statement (parser);
29912 return;
29914 saw_error:
29915 cp_parser_skip_to_end_of_block_or_statement (parser);
29916 if (structured_block)
29918 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
29919 cp_lexer_consume_token (parser->lexer);
29920 else if (code == OMP_ATOMIC_CAPTURE_NEW)
29922 cp_parser_skip_to_end_of_block_or_statement (parser);
29923 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
29924 cp_lexer_consume_token (parser->lexer);
29930 /* OpenMP 2.5:
29931 # pragma omp barrier new-line */
29933 static void
29934 cp_parser_omp_barrier (cp_parser *parser, cp_token *pragma_tok)
29936 cp_parser_require_pragma_eol (parser, pragma_tok);
29937 finish_omp_barrier ();
29940 /* OpenMP 2.5:
29941 # pragma omp critical [(name)] new-line
29942 structured-block */
29944 static tree
29945 cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok)
29947 tree stmt, name = NULL;
29949 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
29951 cp_lexer_consume_token (parser->lexer);
29953 name = cp_parser_identifier (parser);
29955 if (name == error_mark_node
29956 || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
29957 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
29958 /*or_comma=*/false,
29959 /*consume_paren=*/true);
29960 if (name == error_mark_node)
29961 name = NULL;
29963 cp_parser_require_pragma_eol (parser, pragma_tok);
29965 stmt = cp_parser_omp_structured_block (parser);
29966 return c_finish_omp_critical (input_location, stmt, name);
29969 /* OpenMP 2.5:
29970 # pragma omp flush flush-vars[opt] new-line
29972 flush-vars:
29973 ( variable-list ) */
29975 static void
29976 cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
29978 if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
29979 (void) cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
29980 cp_parser_require_pragma_eol (parser, pragma_tok);
29982 finish_omp_flush ();
29985 /* Helper function, to parse omp for increment expression. */
29987 static tree
29988 cp_parser_omp_for_cond (cp_parser *parser, tree decl, enum tree_code code)
29990 tree cond = cp_parser_binary_expression (parser, false, true,
29991 PREC_NOT_OPERATOR, NULL);
29992 if (cond == error_mark_node
29993 || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
29995 cp_parser_skip_to_end_of_statement (parser);
29996 return error_mark_node;
29999 switch (TREE_CODE (cond))
30001 case GT_EXPR:
30002 case GE_EXPR:
30003 case LT_EXPR:
30004 case LE_EXPR:
30005 break;
30006 case NE_EXPR:
30007 if (code == CILK_SIMD || code == CILK_FOR)
30008 break;
30009 /* Fall through: OpenMP disallows NE_EXPR. */
30010 default:
30011 return error_mark_node;
30014 /* If decl is an iterator, preserve LHS and RHS of the relational
30015 expr until finish_omp_for. */
30016 if (decl
30017 && (type_dependent_expression_p (decl)
30018 || CLASS_TYPE_P (TREE_TYPE (decl))))
30019 return cond;
30021 return build_x_binary_op (input_location, TREE_CODE (cond),
30022 TREE_OPERAND (cond, 0), ERROR_MARK,
30023 TREE_OPERAND (cond, 1), ERROR_MARK,
30024 /*overload=*/NULL, tf_warning_or_error);
30027 /* Helper function, to parse omp for increment expression. */
30029 static tree
30030 cp_parser_omp_for_incr (cp_parser *parser, tree decl)
30032 cp_token *token = cp_lexer_peek_token (parser->lexer);
30033 enum tree_code op;
30034 tree lhs, rhs;
30035 cp_id_kind idk;
30036 bool decl_first;
30038 if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
30040 op = (token->type == CPP_PLUS_PLUS
30041 ? PREINCREMENT_EXPR : PREDECREMENT_EXPR);
30042 cp_lexer_consume_token (parser->lexer);
30043 lhs = cp_parser_simple_cast_expression (parser);
30044 if (lhs != decl)
30045 return error_mark_node;
30046 return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
30049 lhs = cp_parser_primary_expression (parser, false, false, false, &idk);
30050 if (lhs != decl)
30051 return error_mark_node;
30053 token = cp_lexer_peek_token (parser->lexer);
30054 if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
30056 op = (token->type == CPP_PLUS_PLUS
30057 ? POSTINCREMENT_EXPR : POSTDECREMENT_EXPR);
30058 cp_lexer_consume_token (parser->lexer);
30059 return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
30062 op = cp_parser_assignment_operator_opt (parser);
30063 if (op == ERROR_MARK)
30064 return error_mark_node;
30066 if (op != NOP_EXPR)
30068 rhs = cp_parser_assignment_expression (parser);
30069 rhs = build2 (op, TREE_TYPE (decl), decl, rhs);
30070 return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
30073 lhs = cp_parser_binary_expression (parser, false, false,
30074 PREC_ADDITIVE_EXPRESSION, NULL);
30075 token = cp_lexer_peek_token (parser->lexer);
30076 decl_first = lhs == decl;
30077 if (decl_first)
30078 lhs = NULL_TREE;
30079 if (token->type != CPP_PLUS
30080 && token->type != CPP_MINUS)
30081 return error_mark_node;
30085 op = token->type == CPP_PLUS ? PLUS_EXPR : MINUS_EXPR;
30086 cp_lexer_consume_token (parser->lexer);
30087 rhs = cp_parser_binary_expression (parser, false, false,
30088 PREC_ADDITIVE_EXPRESSION, NULL);
30089 token = cp_lexer_peek_token (parser->lexer);
30090 if (token->type == CPP_PLUS || token->type == CPP_MINUS || decl_first)
30092 if (lhs == NULL_TREE)
30094 if (op == PLUS_EXPR)
30095 lhs = rhs;
30096 else
30097 lhs = build_x_unary_op (input_location, NEGATE_EXPR, rhs,
30098 tf_warning_or_error);
30100 else
30101 lhs = build_x_binary_op (input_location, op, lhs, ERROR_MARK, rhs,
30102 ERROR_MARK, NULL, tf_warning_or_error);
30105 while (token->type == CPP_PLUS || token->type == CPP_MINUS);
30107 if (!decl_first)
30109 if (rhs != decl || op == MINUS_EXPR)
30110 return error_mark_node;
30111 rhs = build2 (op, TREE_TYPE (decl), lhs, decl);
30113 else
30114 rhs = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, lhs);
30116 return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
30119 /* Parse the initialization statement of either an OpenMP for loop or
30120 a Cilk Plus for loop.
30122 Return true if the resulting construct should have an
30123 OMP_CLAUSE_PRIVATE added to it. */
30125 static bool
30126 cp_parser_omp_for_loop_init (cp_parser *parser,
30127 enum tree_code code,
30128 tree &this_pre_body,
30129 vec<tree, va_gc> *for_block,
30130 tree &init,
30131 tree &decl,
30132 tree &real_decl)
30134 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
30135 return false;
30137 bool add_private_clause = false;
30139 /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too):
30141 init-expr:
30142 var = lb
30143 integer-type var = lb
30144 random-access-iterator-type var = lb
30145 pointer-type var = lb
30147 cp_decl_specifier_seq type_specifiers;
30149 /* First, try to parse as an initialized declaration. See
30150 cp_parser_condition, from whence the bulk of this is copied. */
30152 cp_parser_parse_tentatively (parser);
30153 cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
30154 /*is_trailing_return=*/false,
30155 &type_specifiers);
30156 if (cp_parser_parse_definitely (parser))
30158 /* If parsing a type specifier seq succeeded, then this
30159 MUST be a initialized declaration. */
30160 tree asm_specification, attributes;
30161 cp_declarator *declarator;
30163 declarator = cp_parser_declarator (parser,
30164 CP_PARSER_DECLARATOR_NAMED,
30165 /*ctor_dtor_or_conv_p=*/NULL,
30166 /*parenthesized_p=*/NULL,
30167 /*member_p=*/false,
30168 /*friend_p=*/false);
30169 attributes = cp_parser_attributes_opt (parser);
30170 asm_specification = cp_parser_asm_specification_opt (parser);
30172 if (declarator == cp_error_declarator)
30173 cp_parser_skip_to_end_of_statement (parser);
30175 else
30177 tree pushed_scope, auto_node;
30179 decl = start_decl (declarator, &type_specifiers,
30180 SD_INITIALIZED, attributes,
30181 /*prefix_attributes=*/NULL_TREE,
30182 &pushed_scope);
30184 auto_node = type_uses_auto (TREE_TYPE (decl));
30185 if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
30187 if (cp_lexer_next_token_is (parser->lexer,
30188 CPP_OPEN_PAREN))
30190 if (code != CILK_SIMD && code != CILK_FOR)
30191 error ("parenthesized initialization is not allowed in "
30192 "OpenMP %<for%> loop");
30193 else
30194 error ("parenthesized initialization is "
30195 "not allowed in for-loop");
30197 else
30198 /* Trigger an error. */
30199 cp_parser_require (parser, CPP_EQ, RT_EQ);
30201 init = error_mark_node;
30202 cp_parser_skip_to_end_of_statement (parser);
30204 else if (CLASS_TYPE_P (TREE_TYPE (decl))
30205 || type_dependent_expression_p (decl)
30206 || auto_node)
30208 bool is_direct_init, is_non_constant_init;
30210 init = cp_parser_initializer (parser,
30211 &is_direct_init,
30212 &is_non_constant_init);
30214 if (auto_node)
30216 TREE_TYPE (decl)
30217 = do_auto_deduction (TREE_TYPE (decl), init,
30218 auto_node);
30220 if (!CLASS_TYPE_P (TREE_TYPE (decl))
30221 && !type_dependent_expression_p (decl))
30222 goto non_class;
30225 cp_finish_decl (decl, init, !is_non_constant_init,
30226 asm_specification,
30227 LOOKUP_ONLYCONVERTING);
30228 if (CLASS_TYPE_P (TREE_TYPE (decl)))
30230 vec_safe_push (for_block, this_pre_body);
30231 init = NULL_TREE;
30233 else
30234 init = pop_stmt_list (this_pre_body);
30235 this_pre_body = NULL_TREE;
30237 else
30239 /* Consume '='. */
30240 cp_lexer_consume_token (parser->lexer);
30241 init = cp_parser_assignment_expression (parser);
30243 non_class:
30244 if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
30245 init = error_mark_node;
30246 else
30247 cp_finish_decl (decl, NULL_TREE,
30248 /*init_const_expr_p=*/false,
30249 asm_specification,
30250 LOOKUP_ONLYCONVERTING);
30253 if (pushed_scope)
30254 pop_scope (pushed_scope);
30257 else
30259 cp_id_kind idk;
30260 /* If parsing a type specifier sequence failed, then
30261 this MUST be a simple expression. */
30262 if (code == CILK_FOR)
30263 error ("%<_Cilk_for%> allows expression instead of declaration only "
30264 "in C, not in C++");
30265 cp_parser_parse_tentatively (parser);
30266 decl = cp_parser_primary_expression (parser, false, false,
30267 false, &idk);
30268 if (!cp_parser_error_occurred (parser)
30269 && decl
30270 && DECL_P (decl)
30271 && CLASS_TYPE_P (TREE_TYPE (decl)))
30273 tree rhs;
30275 cp_parser_parse_definitely (parser);
30276 cp_parser_require (parser, CPP_EQ, RT_EQ);
30277 rhs = cp_parser_assignment_expression (parser);
30278 finish_expr_stmt (build_x_modify_expr (EXPR_LOCATION (rhs),
30279 decl, NOP_EXPR,
30280 rhs,
30281 tf_warning_or_error));
30282 add_private_clause = true;
30284 else
30286 decl = NULL;
30287 cp_parser_abort_tentative_parse (parser);
30288 init = cp_parser_expression (parser);
30289 if (init)
30291 if (TREE_CODE (init) == MODIFY_EXPR
30292 || TREE_CODE (init) == MODOP_EXPR)
30293 real_decl = TREE_OPERAND (init, 0);
30297 return add_private_clause;
30300 /* Parse the restricted form of the for statement allowed by OpenMP. */
30302 static tree
30303 cp_parser_omp_for_loop (cp_parser *parser, enum tree_code code, tree clauses,
30304 tree *cclauses)
30306 tree init, cond, incr, body, decl, pre_body = NULL_TREE, ret;
30307 tree real_decl, initv, condv, incrv, declv;
30308 tree this_pre_body, cl;
30309 location_t loc_first;
30310 bool collapse_err = false;
30311 int i, collapse = 1, nbraces = 0;
30312 vec<tree, va_gc> *for_block = make_tree_vector ();
30314 for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
30315 if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
30316 collapse = tree_to_shwi (OMP_CLAUSE_COLLAPSE_EXPR (cl));
30318 gcc_assert (collapse >= 1);
30320 declv = make_tree_vec (collapse);
30321 initv = make_tree_vec (collapse);
30322 condv = make_tree_vec (collapse);
30323 incrv = make_tree_vec (collapse);
30325 loc_first = cp_lexer_peek_token (parser->lexer)->location;
30327 for (i = 0; i < collapse; i++)
30329 int bracecount = 0;
30330 bool add_private_clause = false;
30331 location_t loc;
30333 if (code != CILK_FOR
30334 && !cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
30336 cp_parser_error (parser, "for statement expected");
30337 return NULL;
30339 if (code == CILK_FOR
30340 && !cp_lexer_next_token_is_keyword (parser->lexer, RID_CILK_FOR))
30342 cp_parser_error (parser, "_Cilk_for statement expected");
30343 return NULL;
30345 loc = cp_lexer_consume_token (parser->lexer)->location;
30347 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
30348 return NULL;
30350 init = decl = real_decl = NULL;
30351 this_pre_body = push_stmt_list ();
30353 add_private_clause
30354 |= cp_parser_omp_for_loop_init (parser, code,
30355 this_pre_body, for_block,
30356 init, decl, real_decl);
30358 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
30359 if (this_pre_body)
30361 this_pre_body = pop_stmt_list (this_pre_body);
30362 if (pre_body)
30364 tree t = pre_body;
30365 pre_body = push_stmt_list ();
30366 add_stmt (t);
30367 add_stmt (this_pre_body);
30368 pre_body = pop_stmt_list (pre_body);
30370 else
30371 pre_body = this_pre_body;
30374 if (decl)
30375 real_decl = decl;
30376 if (cclauses != NULL
30377 && cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL] != NULL
30378 && real_decl != NULL_TREE)
30380 tree *c;
30381 for (c = &cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL]; *c ; )
30382 if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE
30383 && OMP_CLAUSE_DECL (*c) == real_decl)
30385 error_at (loc, "iteration variable %qD"
30386 " should not be firstprivate", real_decl);
30387 *c = OMP_CLAUSE_CHAIN (*c);
30389 else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
30390 && OMP_CLAUSE_DECL (*c) == real_decl)
30392 /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES,
30393 change it to shared (decl) in OMP_PARALLEL_CLAUSES. */
30394 tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
30395 OMP_CLAUSE_DECL (l) = real_decl;
30396 CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
30397 if (code == OMP_SIMD)
30399 OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
30400 cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
30402 else
30404 OMP_CLAUSE_CHAIN (l) = clauses;
30405 clauses = l;
30407 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
30408 CP_OMP_CLAUSE_INFO (*c) = NULL;
30409 add_private_clause = false;
30411 else
30413 if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_PRIVATE
30414 && OMP_CLAUSE_DECL (*c) == real_decl)
30415 add_private_clause = false;
30416 c = &OMP_CLAUSE_CHAIN (*c);
30420 if (add_private_clause)
30422 tree c;
30423 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
30425 if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
30426 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
30427 && OMP_CLAUSE_DECL (c) == decl)
30428 break;
30429 else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
30430 && OMP_CLAUSE_DECL (c) == decl)
30431 error_at (loc, "iteration variable %qD "
30432 "should not be firstprivate",
30433 decl);
30434 else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
30435 && OMP_CLAUSE_DECL (c) == decl)
30436 error_at (loc, "iteration variable %qD should not be reduction",
30437 decl);
30439 if (c == NULL)
30441 c = build_omp_clause (loc, OMP_CLAUSE_PRIVATE);
30442 OMP_CLAUSE_DECL (c) = decl;
30443 c = finish_omp_clauses (c);
30444 if (c)
30446 OMP_CLAUSE_CHAIN (c) = clauses;
30447 clauses = c;
30452 cond = NULL;
30453 if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
30454 cond = cp_parser_omp_for_cond (parser, decl, code);
30455 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
30457 incr = NULL;
30458 if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
30460 /* If decl is an iterator, preserve the operator on decl
30461 until finish_omp_for. */
30462 if (real_decl
30463 && ((processing_template_decl
30464 && !POINTER_TYPE_P (TREE_TYPE (real_decl)))
30465 || CLASS_TYPE_P (TREE_TYPE (real_decl))))
30466 incr = cp_parser_omp_for_incr (parser, real_decl);
30467 else
30468 incr = cp_parser_expression (parser);
30469 if (CAN_HAVE_LOCATION_P (incr) && !EXPR_HAS_LOCATION (incr))
30470 SET_EXPR_LOCATION (incr, input_location);
30473 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
30474 cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
30475 /*or_comma=*/false,
30476 /*consume_paren=*/true);
30478 TREE_VEC_ELT (declv, i) = decl;
30479 TREE_VEC_ELT (initv, i) = init;
30480 TREE_VEC_ELT (condv, i) = cond;
30481 TREE_VEC_ELT (incrv, i) = incr;
30483 if (i == collapse - 1)
30484 break;
30486 /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
30487 in between the collapsed for loops to be still considered perfectly
30488 nested. Hopefully the final version clarifies this.
30489 For now handle (multiple) {'s and empty statements. */
30490 cp_parser_parse_tentatively (parser);
30493 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
30494 break;
30495 else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
30497 cp_lexer_consume_token (parser->lexer);
30498 bracecount++;
30500 else if (bracecount
30501 && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
30502 cp_lexer_consume_token (parser->lexer);
30503 else
30505 loc = cp_lexer_peek_token (parser->lexer)->location;
30506 error_at (loc, "not enough collapsed for loops");
30507 collapse_err = true;
30508 cp_parser_abort_tentative_parse (parser);
30509 declv = NULL_TREE;
30510 break;
30513 while (1);
30515 if (declv)
30517 cp_parser_parse_definitely (parser);
30518 nbraces += bracecount;
30522 /* Note that we saved the original contents of this flag when we entered
30523 the structured block, and so we don't need to re-save it here. */
30524 if (code == CILK_SIMD || code == CILK_FOR)
30525 parser->in_statement = IN_CILK_SIMD_FOR;
30526 else
30527 parser->in_statement = IN_OMP_FOR;
30529 /* Note that the grammar doesn't call for a structured block here,
30530 though the loop as a whole is a structured block. */
30531 body = push_stmt_list ();
30532 cp_parser_statement (parser, NULL_TREE, false, NULL);
30533 body = pop_stmt_list (body);
30535 if (declv == NULL_TREE)
30536 ret = NULL_TREE;
30537 else
30538 ret = finish_omp_for (loc_first, code, declv, initv, condv, incrv, body,
30539 pre_body, clauses);
30541 while (nbraces)
30543 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
30545 cp_lexer_consume_token (parser->lexer);
30546 nbraces--;
30548 else if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
30549 cp_lexer_consume_token (parser->lexer);
30550 else
30552 if (!collapse_err)
30554 error_at (cp_lexer_peek_token (parser->lexer)->location,
30555 "collapsed loops not perfectly nested");
30557 collapse_err = true;
30558 cp_parser_statement_seq_opt (parser, NULL);
30559 if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
30560 break;
30564 while (!for_block->is_empty ())
30565 add_stmt (pop_stmt_list (for_block->pop ()));
30566 release_tree_vector (for_block);
30568 return ret;
30571 /* Helper function for OpenMP parsing, split clauses and call
30572 finish_omp_clauses on each of the set of clauses afterwards. */
30574 static void
30575 cp_omp_split_clauses (location_t loc, enum tree_code code,
30576 omp_clause_mask mask, tree clauses, tree *cclauses)
30578 int i;
30579 c_omp_split_clauses (loc, code, mask, clauses, cclauses);
30580 for (i = 0; i < C_OMP_CLAUSE_SPLIT_COUNT; i++)
30581 if (cclauses[i])
30582 cclauses[i] = finish_omp_clauses (cclauses[i]);
30585 /* OpenMP 4.0:
30586 #pragma omp simd simd-clause[optseq] new-line
30587 for-loop */
30589 #define OMP_SIMD_CLAUSE_MASK \
30590 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SAFELEN) \
30591 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \
30592 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED) \
30593 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
30594 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
30595 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
30596 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
30598 static tree
30599 cp_parser_omp_simd (cp_parser *parser, cp_token *pragma_tok,
30600 char *p_name, omp_clause_mask mask, tree *cclauses)
30602 tree clauses, sb, ret;
30603 unsigned int save;
30604 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
30606 strcat (p_name, " simd");
30607 mask |= OMP_SIMD_CLAUSE_MASK;
30608 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED);
30610 clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
30611 cclauses == NULL);
30612 if (cclauses)
30614 cp_omp_split_clauses (loc, OMP_SIMD, mask, clauses, cclauses);
30615 clauses = cclauses[C_OMP_CLAUSE_SPLIT_SIMD];
30618 sb = begin_omp_structured_block ();
30619 save = cp_parser_begin_omp_structured_block (parser);
30621 ret = cp_parser_omp_for_loop (parser, OMP_SIMD, clauses, cclauses);
30623 cp_parser_end_omp_structured_block (parser, save);
30624 add_stmt (finish_omp_structured_block (sb));
30626 return ret;
30629 /* OpenMP 2.5:
30630 #pragma omp for for-clause[optseq] new-line
30631 for-loop
30633 OpenMP 4.0:
30634 #pragma omp for simd for-simd-clause[optseq] new-line
30635 for-loop */
30637 #define OMP_FOR_CLAUSE_MASK \
30638 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
30639 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
30640 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
30641 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
30642 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED) \
30643 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SCHEDULE) \
30644 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT) \
30645 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
30647 static tree
30648 cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok,
30649 char *p_name, omp_clause_mask mask, tree *cclauses)
30651 tree clauses, sb, ret;
30652 unsigned int save;
30653 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
30655 strcat (p_name, " for");
30656 mask |= OMP_FOR_CLAUSE_MASK;
30657 if (cclauses)
30658 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
30660 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
30662 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
30663 const char *p = IDENTIFIER_POINTER (id);
30665 if (strcmp (p, "simd") == 0)
30667 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
30668 if (cclauses == NULL)
30669 cclauses = cclauses_buf;
30671 cp_lexer_consume_token (parser->lexer);
30672 if (!flag_openmp) /* flag_openmp_simd */
30673 return cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
30674 cclauses);
30675 sb = begin_omp_structured_block ();
30676 save = cp_parser_begin_omp_structured_block (parser);
30677 ret = cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
30678 cclauses);
30679 cp_parser_end_omp_structured_block (parser, save);
30680 tree body = finish_omp_structured_block (sb);
30681 if (ret == NULL)
30682 return ret;
30683 ret = make_node (OMP_FOR);
30684 TREE_TYPE (ret) = void_type_node;
30685 OMP_FOR_BODY (ret) = body;
30686 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
30687 SET_EXPR_LOCATION (ret, loc);
30688 add_stmt (ret);
30689 return ret;
30692 if (!flag_openmp) /* flag_openmp_simd */
30694 cp_parser_require_pragma_eol (parser, pragma_tok);
30695 return NULL_TREE;
30698 clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
30699 cclauses == NULL);
30700 if (cclauses)
30702 cp_omp_split_clauses (loc, OMP_FOR, mask, clauses, cclauses);
30703 clauses = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
30706 sb = begin_omp_structured_block ();
30707 save = cp_parser_begin_omp_structured_block (parser);
30709 ret = cp_parser_omp_for_loop (parser, OMP_FOR, clauses, cclauses);
30711 cp_parser_end_omp_structured_block (parser, save);
30712 add_stmt (finish_omp_structured_block (sb));
30714 return ret;
30717 /* OpenMP 2.5:
30718 # pragma omp master new-line
30719 structured-block */
30721 static tree
30722 cp_parser_omp_master (cp_parser *parser, cp_token *pragma_tok)
30724 cp_parser_require_pragma_eol (parser, pragma_tok);
30725 return c_finish_omp_master (input_location,
30726 cp_parser_omp_structured_block (parser));
30729 /* OpenMP 2.5:
30730 # pragma omp ordered new-line
30731 structured-block */
30733 static tree
30734 cp_parser_omp_ordered (cp_parser *parser, cp_token *pragma_tok)
30736 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
30737 cp_parser_require_pragma_eol (parser, pragma_tok);
30738 return c_finish_omp_ordered (loc, cp_parser_omp_structured_block (parser));
30741 /* OpenMP 2.5:
30743 section-scope:
30744 { section-sequence }
30746 section-sequence:
30747 section-directive[opt] structured-block
30748 section-sequence section-directive structured-block */
30750 static tree
30751 cp_parser_omp_sections_scope (cp_parser *parser)
30753 tree stmt, substmt;
30754 bool error_suppress = false;
30755 cp_token *tok;
30757 if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
30758 return NULL_TREE;
30760 stmt = push_stmt_list ();
30762 if (cp_lexer_peek_token (parser->lexer)->pragma_kind != PRAGMA_OMP_SECTION)
30764 substmt = cp_parser_omp_structured_block (parser);
30765 substmt = build1 (OMP_SECTION, void_type_node, substmt);
30766 add_stmt (substmt);
30769 while (1)
30771 tok = cp_lexer_peek_token (parser->lexer);
30772 if (tok->type == CPP_CLOSE_BRACE)
30773 break;
30774 if (tok->type == CPP_EOF)
30775 break;
30777 if (tok->pragma_kind == PRAGMA_OMP_SECTION)
30779 cp_lexer_consume_token (parser->lexer);
30780 cp_parser_require_pragma_eol (parser, tok);
30781 error_suppress = false;
30783 else if (!error_suppress)
30785 cp_parser_error (parser, "expected %<#pragma omp section%> or %<}%>");
30786 error_suppress = true;
30789 substmt = cp_parser_omp_structured_block (parser);
30790 substmt = build1 (OMP_SECTION, void_type_node, substmt);
30791 add_stmt (substmt);
30793 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
30795 substmt = pop_stmt_list (stmt);
30797 stmt = make_node (OMP_SECTIONS);
30798 TREE_TYPE (stmt) = void_type_node;
30799 OMP_SECTIONS_BODY (stmt) = substmt;
30801 add_stmt (stmt);
30802 return stmt;
30805 /* OpenMP 2.5:
30806 # pragma omp sections sections-clause[optseq] newline
30807 sections-scope */
30809 #define OMP_SECTIONS_CLAUSE_MASK \
30810 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
30811 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
30812 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE) \
30813 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
30814 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
30816 static tree
30817 cp_parser_omp_sections (cp_parser *parser, cp_token *pragma_tok,
30818 char *p_name, omp_clause_mask mask, tree *cclauses)
30820 tree clauses, ret;
30821 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
30823 strcat (p_name, " sections");
30824 mask |= OMP_SECTIONS_CLAUSE_MASK;
30825 if (cclauses)
30826 mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
30828 clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
30829 cclauses == NULL);
30830 if (cclauses)
30832 cp_omp_split_clauses (loc, OMP_SECTIONS, mask, clauses, cclauses);
30833 clauses = cclauses[C_OMP_CLAUSE_SPLIT_SECTIONS];
30836 ret = cp_parser_omp_sections_scope (parser);
30837 if (ret)
30838 OMP_SECTIONS_CLAUSES (ret) = clauses;
30840 return ret;
30843 /* OpenMP 2.5:
30844 # pragma omp parallel parallel-clause[optseq] new-line
30845 structured-block
30846 # pragma omp parallel for parallel-for-clause[optseq] new-line
30847 structured-block
30848 # pragma omp parallel sections parallel-sections-clause[optseq] new-line
30849 structured-block
30851 OpenMP 4.0:
30852 # pragma omp parallel for simd parallel-for-simd-clause[optseq] new-line
30853 structured-block */
30855 #define OMP_PARALLEL_CLAUSE_MASK \
30856 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
30857 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
30858 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
30859 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \
30860 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \
30861 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \
30862 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
30863 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_THREADS) \
30864 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PROC_BIND))
30866 static tree
30867 cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok,
30868 char *p_name, omp_clause_mask mask, tree *cclauses)
30870 tree stmt, clauses, block;
30871 unsigned int save;
30872 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
30874 strcat (p_name, " parallel");
30875 mask |= OMP_PARALLEL_CLAUSE_MASK;
30877 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
30879 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
30880 if (cclauses == NULL)
30881 cclauses = cclauses_buf;
30883 cp_lexer_consume_token (parser->lexer);
30884 if (!flag_openmp) /* flag_openmp_simd */
30885 return cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
30886 block = begin_omp_parallel ();
30887 save = cp_parser_begin_omp_structured_block (parser);
30888 tree ret = cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
30889 cp_parser_end_omp_structured_block (parser, save);
30890 stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
30891 block);
30892 if (ret == NULL_TREE)
30893 return ret;
30894 OMP_PARALLEL_COMBINED (stmt) = 1;
30895 return stmt;
30897 else if (cclauses)
30899 error_at (loc, "expected %<for%> after %qs", p_name);
30900 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
30901 return NULL_TREE;
30903 else if (!flag_openmp) /* flag_openmp_simd */
30905 cp_parser_require_pragma_eol (parser, pragma_tok);
30906 return NULL_TREE;
30908 else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
30910 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
30911 const char *p = IDENTIFIER_POINTER (id);
30912 if (strcmp (p, "sections") == 0)
30914 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
30915 cclauses = cclauses_buf;
30917 cp_lexer_consume_token (parser->lexer);
30918 block = begin_omp_parallel ();
30919 save = cp_parser_begin_omp_structured_block (parser);
30920 cp_parser_omp_sections (parser, pragma_tok, p_name, mask, cclauses);
30921 cp_parser_end_omp_structured_block (parser, save);
30922 stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
30923 block);
30924 OMP_PARALLEL_COMBINED (stmt) = 1;
30925 return stmt;
30929 clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
30931 block = begin_omp_parallel ();
30932 save = cp_parser_begin_omp_structured_block (parser);
30933 cp_parser_statement (parser, NULL_TREE, false, NULL);
30934 cp_parser_end_omp_structured_block (parser, save);
30935 stmt = finish_omp_parallel (clauses, block);
30936 return stmt;
30939 /* OpenMP 2.5:
30940 # pragma omp single single-clause[optseq] new-line
30941 structured-block */
30943 #define OMP_SINGLE_CLAUSE_MASK \
30944 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
30945 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
30946 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYPRIVATE) \
30947 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
30949 static tree
30950 cp_parser_omp_single (cp_parser *parser, cp_token *pragma_tok)
30952 tree stmt = make_node (OMP_SINGLE);
30953 TREE_TYPE (stmt) = void_type_node;
30955 OMP_SINGLE_CLAUSES (stmt)
30956 = cp_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
30957 "#pragma omp single", pragma_tok);
30958 OMP_SINGLE_BODY (stmt) = cp_parser_omp_structured_block (parser);
30960 return add_stmt (stmt);
30963 /* OpenMP 3.0:
30964 # pragma omp task task-clause[optseq] new-line
30965 structured-block */
30967 #define OMP_TASK_CLAUSE_MASK \
30968 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
30969 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNTIED) \
30970 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT) \
30971 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
30972 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
30973 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \
30974 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL) \
30975 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE) \
30976 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND))
30978 static tree
30979 cp_parser_omp_task (cp_parser *parser, cp_token *pragma_tok)
30981 tree clauses, block;
30982 unsigned int save;
30984 clauses = cp_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
30985 "#pragma omp task", pragma_tok);
30986 block = begin_omp_task ();
30987 save = cp_parser_begin_omp_structured_block (parser);
30988 cp_parser_statement (parser, NULL_TREE, false, NULL);
30989 cp_parser_end_omp_structured_block (parser, save);
30990 return finish_omp_task (clauses, block);
30993 /* OpenMP 3.0:
30994 # pragma omp taskwait new-line */
30996 static void
30997 cp_parser_omp_taskwait (cp_parser *parser, cp_token *pragma_tok)
30999 cp_parser_require_pragma_eol (parser, pragma_tok);
31000 finish_omp_taskwait ();
31003 /* OpenMP 3.1:
31004 # pragma omp taskyield new-line */
31006 static void
31007 cp_parser_omp_taskyield (cp_parser *parser, cp_token *pragma_tok)
31009 cp_parser_require_pragma_eol (parser, pragma_tok);
31010 finish_omp_taskyield ();
31013 /* OpenMP 4.0:
31014 # pragma omp taskgroup new-line
31015 structured-block */
31017 static tree
31018 cp_parser_omp_taskgroup (cp_parser *parser, cp_token *pragma_tok)
31020 cp_parser_require_pragma_eol (parser, pragma_tok);
31021 return c_finish_omp_taskgroup (input_location,
31022 cp_parser_omp_structured_block (parser));
31026 /* OpenMP 2.5:
31027 # pragma omp threadprivate (variable-list) */
31029 static void
31030 cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
31032 tree vars;
31034 vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
31035 cp_parser_require_pragma_eol (parser, pragma_tok);
31037 finish_omp_threadprivate (vars);
31040 /* OpenMP 4.0:
31041 # pragma omp cancel cancel-clause[optseq] new-line */
31043 #define OMP_CANCEL_CLAUSE_MASK \
31044 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL) \
31045 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR) \
31046 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS) \
31047 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP) \
31048 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
31050 static void
31051 cp_parser_omp_cancel (cp_parser *parser, cp_token *pragma_tok)
31053 tree clauses = cp_parser_omp_all_clauses (parser, OMP_CANCEL_CLAUSE_MASK,
31054 "#pragma omp cancel", pragma_tok);
31055 finish_omp_cancel (clauses);
31058 /* OpenMP 4.0:
31059 # pragma omp cancellation point cancelpt-clause[optseq] new-line */
31061 #define OMP_CANCELLATION_POINT_CLAUSE_MASK \
31062 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL) \
31063 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR) \
31064 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS) \
31065 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP))
31067 static void
31068 cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok)
31070 tree clauses;
31071 bool point_seen = false;
31073 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31075 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31076 const char *p = IDENTIFIER_POINTER (id);
31078 if (strcmp (p, "point") == 0)
31080 cp_lexer_consume_token (parser->lexer);
31081 point_seen = true;
31084 if (!point_seen)
31086 cp_parser_error (parser, "expected %<point%>");
31087 cp_parser_require_pragma_eol (parser, pragma_tok);
31088 return;
31091 clauses = cp_parser_omp_all_clauses (parser,
31092 OMP_CANCELLATION_POINT_CLAUSE_MASK,
31093 "#pragma omp cancellation point",
31094 pragma_tok);
31095 finish_omp_cancellation_point (clauses);
31098 /* OpenMP 4.0:
31099 #pragma omp distribute distribute-clause[optseq] new-line
31100 for-loop */
31102 #define OMP_DISTRIBUTE_CLAUSE_MASK \
31103 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
31104 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
31105 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)\
31106 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
31108 static tree
31109 cp_parser_omp_distribute (cp_parser *parser, cp_token *pragma_tok,
31110 char *p_name, omp_clause_mask mask, tree *cclauses)
31112 tree clauses, sb, ret;
31113 unsigned int save;
31114 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
31116 strcat (p_name, " distribute");
31117 mask |= OMP_DISTRIBUTE_CLAUSE_MASK;
31119 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31121 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31122 const char *p = IDENTIFIER_POINTER (id);
31123 bool simd = false;
31124 bool parallel = false;
31126 if (strcmp (p, "simd") == 0)
31127 simd = true;
31128 else
31129 parallel = strcmp (p, "parallel") == 0;
31130 if (parallel || simd)
31132 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
31133 if (cclauses == NULL)
31134 cclauses = cclauses_buf;
31135 cp_lexer_consume_token (parser->lexer);
31136 if (!flag_openmp) /* flag_openmp_simd */
31138 if (simd)
31139 return cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
31140 cclauses);
31141 else
31142 return cp_parser_omp_parallel (parser, pragma_tok, p_name, mask,
31143 cclauses);
31145 sb = begin_omp_structured_block ();
31146 save = cp_parser_begin_omp_structured_block (parser);
31147 if (simd)
31148 ret = cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
31149 cclauses);
31150 else
31151 ret = cp_parser_omp_parallel (parser, pragma_tok, p_name, mask,
31152 cclauses);
31153 cp_parser_end_omp_structured_block (parser, save);
31154 tree body = finish_omp_structured_block (sb);
31155 if (ret == NULL)
31156 return ret;
31157 ret = make_node (OMP_DISTRIBUTE);
31158 TREE_TYPE (ret) = void_type_node;
31159 OMP_FOR_BODY (ret) = body;
31160 OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE];
31161 SET_EXPR_LOCATION (ret, loc);
31162 add_stmt (ret);
31163 return ret;
31166 if (!flag_openmp) /* flag_openmp_simd */
31168 cp_parser_require_pragma_eol (parser, pragma_tok);
31169 return NULL_TREE;
31172 clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
31173 cclauses == NULL);
31174 if (cclauses)
31176 cp_omp_split_clauses (loc, OMP_DISTRIBUTE, mask, clauses, cclauses);
31177 clauses = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE];
31180 sb = begin_omp_structured_block ();
31181 save = cp_parser_begin_omp_structured_block (parser);
31183 ret = cp_parser_omp_for_loop (parser, OMP_DISTRIBUTE, clauses, NULL);
31185 cp_parser_end_omp_structured_block (parser, save);
31186 add_stmt (finish_omp_structured_block (sb));
31188 return ret;
31191 /* OpenMP 4.0:
31192 # pragma omp teams teams-clause[optseq] new-line
31193 structured-block */
31195 #define OMP_TEAMS_CLAUSE_MASK \
31196 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE) \
31197 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE) \
31198 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED) \
31199 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
31200 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS) \
31201 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREAD_LIMIT) \
31202 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT))
31204 static tree
31205 cp_parser_omp_teams (cp_parser *parser, cp_token *pragma_tok,
31206 char *p_name, omp_clause_mask mask, tree *cclauses)
31208 tree clauses, sb, ret;
31209 unsigned int save;
31210 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
31212 strcat (p_name, " teams");
31213 mask |= OMP_TEAMS_CLAUSE_MASK;
31215 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31217 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31218 const char *p = IDENTIFIER_POINTER (id);
31219 if (strcmp (p, "distribute") == 0)
31221 tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
31222 if (cclauses == NULL)
31223 cclauses = cclauses_buf;
31225 cp_lexer_consume_token (parser->lexer);
31226 if (!flag_openmp) /* flag_openmp_simd */
31227 return cp_parser_omp_distribute (parser, pragma_tok, p_name, mask,
31228 cclauses);
31229 sb = begin_omp_structured_block ();
31230 save = cp_parser_begin_omp_structured_block (parser);
31231 ret = cp_parser_omp_distribute (parser, pragma_tok, p_name, mask,
31232 cclauses);
31233 cp_parser_end_omp_structured_block (parser, save);
31234 tree body = finish_omp_structured_block (sb);
31235 if (ret == NULL)
31236 return ret;
31237 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
31238 ret = make_node (OMP_TEAMS);
31239 TREE_TYPE (ret) = void_type_node;
31240 OMP_TEAMS_CLAUSES (ret) = clauses;
31241 OMP_TEAMS_BODY (ret) = body;
31242 return add_stmt (ret);
31245 if (!flag_openmp) /* flag_openmp_simd */
31247 cp_parser_require_pragma_eol (parser, pragma_tok);
31248 return NULL_TREE;
31251 clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
31252 cclauses == NULL);
31253 if (cclauses)
31255 cp_omp_split_clauses (loc, OMP_TEAMS, mask, clauses, cclauses);
31256 clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
31259 tree stmt = make_node (OMP_TEAMS);
31260 TREE_TYPE (stmt) = void_type_node;
31261 OMP_TEAMS_CLAUSES (stmt) = clauses;
31262 OMP_TEAMS_BODY (stmt) = cp_parser_omp_structured_block (parser);
31264 return add_stmt (stmt);
31267 /* OpenMP 4.0:
31268 # pragma omp target data target-data-clause[optseq] new-line
31269 structured-block */
31271 #define OMP_TARGET_DATA_CLAUSE_MASK \
31272 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
31273 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \
31274 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
31276 static tree
31277 cp_parser_omp_target_data (cp_parser *parser, cp_token *pragma_tok)
31279 tree stmt = make_node (OMP_TARGET_DATA);
31280 TREE_TYPE (stmt) = void_type_node;
31282 OMP_TARGET_DATA_CLAUSES (stmt)
31283 = cp_parser_omp_all_clauses (parser, OMP_TARGET_DATA_CLAUSE_MASK,
31284 "#pragma omp target data", pragma_tok);
31285 keep_next_level (true);
31286 OMP_TARGET_DATA_BODY (stmt) = cp_parser_omp_structured_block (parser);
31288 SET_EXPR_LOCATION (stmt, pragma_tok->location);
31289 return add_stmt (stmt);
31292 /* OpenMP 4.0:
31293 # pragma omp target update target-update-clause[optseq] new-line */
31295 #define OMP_TARGET_UPDATE_CLAUSE_MASK \
31296 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FROM) \
31297 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO) \
31298 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
31299 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
31301 static bool
31302 cp_parser_omp_target_update (cp_parser *parser, cp_token *pragma_tok,
31303 enum pragma_context context)
31305 if (context == pragma_stmt)
31307 error_at (pragma_tok->location,
31308 "%<#pragma omp target update%> may only be "
31309 "used in compound statements");
31310 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31311 return false;
31314 tree clauses
31315 = cp_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
31316 "#pragma omp target update", pragma_tok);
31317 if (find_omp_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
31318 && find_omp_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
31320 error_at (pragma_tok->location,
31321 "%<#pragma omp target update must contain at least one "
31322 "%<from%> or %<to%> clauses");
31323 return false;
31326 tree stmt = make_node (OMP_TARGET_UPDATE);
31327 TREE_TYPE (stmt) = void_type_node;
31328 OMP_TARGET_UPDATE_CLAUSES (stmt) = clauses;
31329 SET_EXPR_LOCATION (stmt, pragma_tok->location);
31330 add_stmt (stmt);
31331 return false;
31334 /* OpenMP 4.0:
31335 # pragma omp target target-clause[optseq] new-line
31336 structured-block */
31338 #define OMP_TARGET_CLAUSE_MASK \
31339 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
31340 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \
31341 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
31343 static bool
31344 cp_parser_omp_target (cp_parser *parser, cp_token *pragma_tok,
31345 enum pragma_context context)
31347 if (context != pragma_stmt && context != pragma_compound)
31349 cp_parser_error (parser, "expected declaration specifiers");
31350 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31351 return false;
31354 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31356 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31357 const char *p = IDENTIFIER_POINTER (id);
31359 if (strcmp (p, "teams") == 0)
31361 tree cclauses[C_OMP_CLAUSE_SPLIT_COUNT];
31362 char p_name[sizeof ("#pragma omp target teams distribute "
31363 "parallel for simd")];
31365 cp_lexer_consume_token (parser->lexer);
31366 strcpy (p_name, "#pragma omp target");
31367 if (!flag_openmp) /* flag_openmp_simd */
31369 tree stmt = cp_parser_omp_teams (parser, pragma_tok, p_name,
31370 OMP_TARGET_CLAUSE_MASK,
31371 cclauses);
31372 return stmt != NULL_TREE;
31374 keep_next_level (true);
31375 tree sb = begin_omp_structured_block ();
31376 unsigned save = cp_parser_begin_omp_structured_block (parser);
31377 tree ret = cp_parser_omp_teams (parser, pragma_tok, p_name,
31378 OMP_TARGET_CLAUSE_MASK, cclauses);
31379 cp_parser_end_omp_structured_block (parser, save);
31380 tree body = finish_omp_structured_block (sb);
31381 if (ret == NULL_TREE)
31382 return false;
31383 tree stmt = make_node (OMP_TARGET);
31384 TREE_TYPE (stmt) = void_type_node;
31385 OMP_TARGET_CLAUSES (stmt) = cclauses[C_OMP_CLAUSE_SPLIT_TARGET];
31386 OMP_TARGET_BODY (stmt) = body;
31387 add_stmt (stmt);
31388 return true;
31390 else if (!flag_openmp) /* flag_openmp_simd */
31392 cp_parser_require_pragma_eol (parser, pragma_tok);
31393 return false;
31395 else if (strcmp (p, "data") == 0)
31397 cp_lexer_consume_token (parser->lexer);
31398 cp_parser_omp_target_data (parser, pragma_tok);
31399 return true;
31401 else if (strcmp (p, "update") == 0)
31403 cp_lexer_consume_token (parser->lexer);
31404 return cp_parser_omp_target_update (parser, pragma_tok, context);
31408 tree stmt = make_node (OMP_TARGET);
31409 TREE_TYPE (stmt) = void_type_node;
31411 OMP_TARGET_CLAUSES (stmt)
31412 = cp_parser_omp_all_clauses (parser, OMP_TARGET_CLAUSE_MASK,
31413 "#pragma omp target", pragma_tok);
31414 keep_next_level (true);
31415 OMP_TARGET_BODY (stmt) = cp_parser_omp_structured_block (parser);
31417 SET_EXPR_LOCATION (stmt, pragma_tok->location);
31418 add_stmt (stmt);
31419 return true;
31422 /* OpenACC 2.0:
31423 # pragma acc cache (variable-list) new-line
31426 static tree
31427 cp_parser_oacc_cache (cp_parser *parser, cp_token *pragma_tok)
31429 tree stmt, clauses;
31431 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE__CACHE_, NULL_TREE);
31432 clauses = finish_omp_clauses (clauses);
31434 cp_parser_require_pragma_eol (parser, cp_lexer_peek_token (parser->lexer));
31436 stmt = make_node (OACC_CACHE);
31437 TREE_TYPE (stmt) = void_type_node;
31438 OACC_CACHE_CLAUSES (stmt) = clauses;
31439 SET_EXPR_LOCATION (stmt, pragma_tok->location);
31440 add_stmt (stmt);
31442 return stmt;
31445 /* OpenACC 2.0:
31446 # pragma acc data oacc-data-clause[optseq] new-line
31447 structured-block */
31449 #define OACC_DATA_CLAUSE_MASK \
31450 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPY) \
31451 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \
31452 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYOUT) \
31453 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_CREATE) \
31454 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICEPTR) \
31455 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
31456 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT) \
31457 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY) \
31458 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN) \
31459 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT) \
31460 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE))
31462 static tree
31463 cp_parser_oacc_data (cp_parser *parser, cp_token *pragma_tok)
31465 tree stmt, clauses, block;
31466 unsigned int save;
31468 clauses = cp_parser_oacc_all_clauses (parser, OACC_DATA_CLAUSE_MASK,
31469 "#pragma acc data", pragma_tok);
31471 block = begin_omp_parallel ();
31472 save = cp_parser_begin_omp_structured_block (parser);
31473 cp_parser_statement (parser, NULL_TREE, false, NULL);
31474 cp_parser_end_omp_structured_block (parser, save);
31475 stmt = finish_oacc_data (clauses, block);
31476 return stmt;
31479 /* OpenACC 2.0:
31480 # pragma acc enter data oacc-enter-data-clause[optseq] new-line
31484 # pragma acc exit data oacc-exit-data-clause[optseq] new-line
31486 LOC is the location of the #pragma token.
31489 #define OACC_ENTER_DATA_CLAUSE_MASK \
31490 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
31491 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ASYNC) \
31492 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \
31493 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_CREATE) \
31494 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN) \
31495 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE) \
31496 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_WAIT) )
31498 #define OACC_EXIT_DATA_CLAUSE_MASK \
31499 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
31500 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ASYNC) \
31501 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYOUT) \
31502 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DELETE) \
31503 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_WAIT) )
31505 static tree
31506 cp_parser_oacc_enter_exit_data (cp_parser *parser, cp_token *pragma_tok,
31507 bool enter)
31509 tree stmt, clauses;
31511 if (cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA_EOL)
31512 || cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
31514 cp_parser_error (parser, enter
31515 ? "expected %<data%> in %<#pragma acc enter data%>"
31516 : "expected %<data%> in %<#pragma acc exit data%>");
31517 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31518 return NULL_TREE;
31521 const char *p =
31522 IDENTIFIER_POINTER (cp_lexer_peek_token (parser->lexer)->u.value);
31523 if (strcmp (p, "data") != 0)
31525 cp_parser_error (parser, "invalid pragma");
31526 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31527 return NULL_TREE;
31530 cp_lexer_consume_token (parser->lexer);
31532 if (enter)
31533 clauses = cp_parser_oacc_all_clauses (parser, OACC_ENTER_DATA_CLAUSE_MASK,
31534 "#pragma acc enter data", pragma_tok);
31535 else
31536 clauses = cp_parser_oacc_all_clauses (parser, OACC_EXIT_DATA_CLAUSE_MASK,
31537 "#pragma acc exit data", pragma_tok);
31539 if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
31541 error_at (pragma_tok->location,
31542 "%<#pragma acc enter data%> has no data movement clause");
31543 return NULL_TREE;
31546 stmt = enter ? make_node (OACC_ENTER_DATA) : make_node (OACC_EXIT_DATA);
31547 TREE_TYPE (stmt) = void_type_node;
31548 if (enter)
31549 OACC_ENTER_DATA_CLAUSES (stmt) = clauses;
31550 else
31551 OACC_EXIT_DATA_CLAUSES (stmt) = clauses;
31552 SET_EXPR_LOCATION (stmt, pragma_tok->location);
31553 add_stmt (stmt);
31554 return stmt;
31557 /* OpenACC 2.0:
31558 # pragma acc kernels oacc-kernels-clause[optseq] new-line
31559 structured-block */
31561 #define OACC_KERNELS_CLAUSE_MASK \
31562 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ASYNC) \
31563 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPY) \
31564 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \
31565 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYOUT) \
31566 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_CREATE) \
31567 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICEPTR) \
31568 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
31569 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT) \
31570 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY) \
31571 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN) \
31572 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT) \
31573 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE) \
31574 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_WAIT))
31576 static tree
31577 cp_parser_oacc_kernels (cp_parser *parser, cp_token *pragma_tok)
31579 tree stmt, clauses, block;
31580 unsigned int save;
31582 clauses = cp_parser_oacc_all_clauses (parser, OACC_KERNELS_CLAUSE_MASK,
31583 "#pragma acc kernels", pragma_tok);
31585 block = begin_omp_parallel ();
31586 save = cp_parser_begin_omp_structured_block (parser);
31587 cp_parser_statement (parser, NULL_TREE, false, NULL);
31588 cp_parser_end_omp_structured_block (parser, save);
31589 stmt = finish_oacc_kernels (clauses, block);
31590 return stmt;
31593 /* OpenACC 2.0:
31594 # pragma acc loop oacc-loop-clause[optseq] new-line
31595 structured-block */
31597 #define OACC_LOOP_CLAUSE_MASK \
31598 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \
31599 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION))
31601 static tree
31602 cp_parser_oacc_loop (cp_parser *parser, cp_token *pragma_tok)
31604 tree stmt, clauses, block;
31605 int save;
31607 clauses = cp_parser_oacc_all_clauses (parser, OACC_LOOP_CLAUSE_MASK,
31608 "#pragma acc loop", pragma_tok);
31610 block = begin_omp_structured_block ();
31611 save = cp_parser_begin_omp_structured_block (parser);
31612 stmt = cp_parser_omp_for_loop (parser, OACC_LOOP, clauses, NULL);
31613 cp_parser_end_omp_structured_block (parser, save);
31614 add_stmt (finish_omp_structured_block (block));
31615 return stmt;
31618 /* OpenACC 2.0:
31619 # pragma acc parallel oacc-parallel-clause[optseq] new-line
31620 structured-block */
31622 #define OACC_PARALLEL_CLAUSE_MASK \
31623 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ASYNC) \
31624 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPY) \
31625 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN) \
31626 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYOUT) \
31627 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_CREATE) \
31628 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICEPTR) \
31629 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
31630 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_GANGS) \
31631 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_WORKERS) \
31632 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT) \
31633 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY) \
31634 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN) \
31635 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT) \
31636 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE) \
31637 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \
31638 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_VECTOR_LENGTH) \
31639 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_WAIT))
31641 static tree
31642 cp_parser_oacc_parallel (cp_parser *parser, cp_token *pragma_tok)
31644 tree stmt, clauses, block;
31645 unsigned int save;
31647 clauses = cp_parser_oacc_all_clauses (parser, OACC_PARALLEL_CLAUSE_MASK,
31648 "#pragma acc parallel", pragma_tok);
31650 block = begin_omp_parallel ();
31651 save = cp_parser_begin_omp_structured_block (parser);
31652 cp_parser_statement (parser, NULL_TREE, false, NULL);
31653 cp_parser_end_omp_structured_block (parser, save);
31654 stmt = finish_oacc_parallel (clauses, block);
31655 return stmt;
31658 /* OpenACC 2.0:
31659 # pragma acc update oacc-update-clause[optseq] new-line
31662 #define OACC_UPDATE_CLAUSE_MASK \
31663 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ASYNC) \
31664 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \
31665 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_HOST) \
31666 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \
31667 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SELF) \
31668 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_WAIT))
31670 static tree
31671 cp_parser_oacc_update (cp_parser *parser, cp_token *pragma_tok)
31673 tree stmt, clauses;
31675 clauses = cp_parser_oacc_all_clauses (parser, OACC_UPDATE_CLAUSE_MASK,
31676 "#pragma acc update", pragma_tok);
31678 if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
31680 error_at (pragma_tok->location,
31681 "%<#pragma acc update%> must contain at least one "
31682 "%<device%> or %<host/self%> clause");
31683 return NULL_TREE;
31686 stmt = make_node (OACC_UPDATE);
31687 TREE_TYPE (stmt) = void_type_node;
31688 OACC_UPDATE_CLAUSES (stmt) = clauses;
31689 SET_EXPR_LOCATION (stmt, pragma_tok->location);
31690 add_stmt (stmt);
31691 return stmt;
31694 /* OpenACC 2.0:
31695 # pragma acc wait [(intseq)] oacc-wait-clause[optseq] new-line
31697 LOC is the location of the #pragma token.
31700 #define OACC_WAIT_CLAUSE_MASK \
31701 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ASYNC))
31703 static tree
31704 cp_parser_oacc_wait (cp_parser *parser, cp_token *pragma_tok)
31706 tree clauses, list = NULL_TREE, stmt = NULL_TREE;
31707 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
31709 if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
31710 list = cp_parser_oacc_wait_list (parser, loc, list);
31712 clauses = cp_parser_oacc_all_clauses (parser, OACC_WAIT_CLAUSE_MASK,
31713 "#pragma acc wait", pragma_tok);
31715 stmt = c_finish_oacc_wait (loc, list, clauses);
31717 return stmt;
31720 /* OpenMP 4.0:
31721 # pragma omp declare simd declare-simd-clauses[optseq] new-line */
31723 #define OMP_DECLARE_SIMD_CLAUSE_MASK \
31724 ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMDLEN) \
31725 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR) \
31726 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED) \
31727 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNIFORM) \
31728 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_INBRANCH) \
31729 | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOTINBRANCH))
31731 static void
31732 cp_parser_omp_declare_simd (cp_parser *parser, cp_token *pragma_tok,
31733 enum pragma_context context)
31735 bool first_p = parser->omp_declare_simd == NULL;
31736 cp_omp_declare_simd_data data;
31737 if (first_p)
31739 data.error_seen = false;
31740 data.fndecl_seen = false;
31741 data.tokens = vNULL;
31742 parser->omp_declare_simd = &data;
31744 while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)
31745 && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
31746 cp_lexer_consume_token (parser->lexer);
31747 if (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
31748 parser->omp_declare_simd->error_seen = true;
31749 cp_parser_require_pragma_eol (parser, pragma_tok);
31750 struct cp_token_cache *cp
31751 = cp_token_cache_new (pragma_tok, cp_lexer_peek_token (parser->lexer));
31752 parser->omp_declare_simd->tokens.safe_push (cp);
31753 if (first_p)
31755 while (cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA))
31756 cp_parser_pragma (parser, context);
31757 switch (context)
31759 case pragma_external:
31760 cp_parser_declaration (parser);
31761 break;
31762 case pragma_member:
31763 cp_parser_member_declaration (parser);
31764 break;
31765 case pragma_objc_icode:
31766 cp_parser_block_declaration (parser, /*statement_p=*/false);
31767 break;
31768 default:
31769 cp_parser_declaration_statement (parser);
31770 break;
31772 if (parser->omp_declare_simd
31773 && !parser->omp_declare_simd->error_seen
31774 && !parser->omp_declare_simd->fndecl_seen)
31775 error_at (pragma_tok->location,
31776 "%<#pragma omp declare simd%> not immediately followed by "
31777 "function declaration or definition");
31778 data.tokens.release ();
31779 parser->omp_declare_simd = NULL;
31783 /* Handles the delayed parsing of the Cilk Plus SIMD-enabled function.
31784 This function is modelled similar to the late parsing of omp declare
31785 simd. */
31787 static tree
31788 cp_parser_late_parsing_cilk_simd_fn_info (cp_parser *parser, tree attrs)
31790 struct cp_token_cache *ce;
31791 cp_omp_declare_simd_data *info = parser->cilk_simd_fn_info;
31792 int ii = 0;
31794 if (parser->omp_declare_simd != NULL)
31796 error ("%<#pragma omp declare simd%> cannot be used in the same function"
31797 " marked as a Cilk Plus SIMD-enabled function");
31798 XDELETE (parser->cilk_simd_fn_info);
31799 parser->cilk_simd_fn_info = NULL;
31800 return attrs;
31802 if (!info->error_seen && info->fndecl_seen)
31804 error ("vector attribute not immediately followed by a single function"
31805 " declaration or definition");
31806 info->error_seen = true;
31808 if (info->error_seen)
31809 return attrs;
31811 FOR_EACH_VEC_ELT (info->tokens, ii, ce)
31813 tree c, cl;
31815 cp_parser_push_lexer_for_tokens (parser, ce);
31816 parser->lexer->in_pragma = true;
31817 cl = cp_parser_omp_all_clauses (parser, CILK_SIMD_FN_CLAUSE_MASK,
31818 "SIMD-enabled functions attribute",
31819 NULL);
31820 cp_parser_pop_lexer (parser);
31821 if (cl)
31822 cl = tree_cons (NULL_TREE, cl, NULL_TREE);
31824 c = build_tree_list (get_identifier ("cilk simd function"), NULL_TREE);
31825 TREE_CHAIN (c) = attrs;
31826 attrs = c;
31828 c = build_tree_list (get_identifier ("omp declare simd"), cl);
31829 TREE_CHAIN (c) = attrs;
31830 if (processing_template_decl)
31831 ATTR_IS_DEPENDENT (c) = 1;
31832 attrs = c;
31834 info->fndecl_seen = true;
31835 XDELETE (parser->cilk_simd_fn_info);
31836 parser->cilk_simd_fn_info = NULL;
31837 return attrs;
31840 /* Finalize #pragma omp declare simd clauses after direct declarator has
31841 been parsed, and put that into "omp declare simd" attribute. */
31843 static tree
31844 cp_parser_late_parsing_omp_declare_simd (cp_parser *parser, tree attrs)
31846 struct cp_token_cache *ce;
31847 cp_omp_declare_simd_data *data = parser->omp_declare_simd;
31848 int i;
31850 if (!data->error_seen && data->fndecl_seen)
31852 error ("%<#pragma omp declare simd%> not immediately followed by "
31853 "a single function declaration or definition");
31854 data->error_seen = true;
31855 return attrs;
31857 if (data->error_seen)
31858 return attrs;
31860 FOR_EACH_VEC_ELT (data->tokens, i, ce)
31862 tree c, cl;
31864 cp_parser_push_lexer_for_tokens (parser, ce);
31865 parser->lexer->in_pragma = true;
31866 gcc_assert (cp_lexer_peek_token (parser->lexer)->type == CPP_PRAGMA);
31867 cp_token *pragma_tok = cp_lexer_consume_token (parser->lexer);
31868 cp_lexer_consume_token (parser->lexer);
31869 cl = cp_parser_omp_all_clauses (parser, OMP_DECLARE_SIMD_CLAUSE_MASK,
31870 "#pragma omp declare simd", pragma_tok);
31871 cp_parser_pop_lexer (parser);
31872 if (cl)
31873 cl = tree_cons (NULL_TREE, cl, NULL_TREE);
31874 c = build_tree_list (get_identifier ("omp declare simd"), cl);
31875 TREE_CHAIN (c) = attrs;
31876 if (processing_template_decl)
31877 ATTR_IS_DEPENDENT (c) = 1;
31878 attrs = c;
31881 data->fndecl_seen = true;
31882 return attrs;
31886 /* OpenMP 4.0:
31887 # pragma omp declare target new-line
31888 declarations and definitions
31889 # pragma omp end declare target new-line */
31891 static void
31892 cp_parser_omp_declare_target (cp_parser *parser, cp_token *pragma_tok)
31894 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31895 scope_chain->omp_declare_target_attribute++;
31898 static void
31899 cp_parser_omp_end_declare_target (cp_parser *parser, cp_token *pragma_tok)
31901 const char *p = "";
31902 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31904 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31905 p = IDENTIFIER_POINTER (id);
31907 if (strcmp (p, "declare") == 0)
31909 cp_lexer_consume_token (parser->lexer);
31910 p = "";
31911 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31913 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31914 p = IDENTIFIER_POINTER (id);
31916 if (strcmp (p, "target") == 0)
31917 cp_lexer_consume_token (parser->lexer);
31918 else
31920 cp_parser_error (parser, "expected %<target%>");
31921 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31922 return;
31925 else
31927 cp_parser_error (parser, "expected %<declare%>");
31928 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31929 return;
31931 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
31932 if (!scope_chain->omp_declare_target_attribute)
31933 error_at (pragma_tok->location,
31934 "%<#pragma omp end declare target%> without corresponding "
31935 "%<#pragma omp declare target%>");
31936 else
31937 scope_chain->omp_declare_target_attribute--;
31940 /* Helper function of cp_parser_omp_declare_reduction. Parse the combiner
31941 expression and optional initializer clause of
31942 #pragma omp declare reduction. We store the expression(s) as
31943 either 3, 6 or 7 special statements inside of the artificial function's
31944 body. The first two statements are DECL_EXPRs for the artificial
31945 OMP_OUT resp. OMP_IN variables, followed by a statement with the combiner
31946 expression that uses those variables.
31947 If there was any INITIALIZER clause, this is followed by further statements,
31948 the fourth and fifth statements are DECL_EXPRs for the artificial
31949 OMP_PRIV resp. OMP_ORIG variables. If the INITIALIZER clause wasn't the
31950 constructor variant (first token after open paren is not omp_priv),
31951 then the sixth statement is a statement with the function call expression
31952 that uses the OMP_PRIV and optionally OMP_ORIG variable.
31953 Otherwise, the sixth statement is whatever statement cp_finish_decl emits
31954 to initialize the OMP_PRIV artificial variable and there is seventh
31955 statement, a DECL_EXPR of the OMP_PRIV statement again. */
31957 static bool
31958 cp_parser_omp_declare_reduction_exprs (tree fndecl, cp_parser *parser)
31960 tree type = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
31961 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
31962 type = TREE_TYPE (type);
31963 tree omp_out = build_lang_decl (VAR_DECL, get_identifier ("omp_out"), type);
31964 DECL_ARTIFICIAL (omp_out) = 1;
31965 pushdecl (omp_out);
31966 add_decl_expr (omp_out);
31967 tree omp_in = build_lang_decl (VAR_DECL, get_identifier ("omp_in"), type);
31968 DECL_ARTIFICIAL (omp_in) = 1;
31969 pushdecl (omp_in);
31970 add_decl_expr (omp_in);
31971 tree combiner;
31972 tree omp_priv = NULL_TREE, omp_orig = NULL_TREE, initializer = NULL_TREE;
31974 keep_next_level (true);
31975 tree block = begin_omp_structured_block ();
31976 combiner = cp_parser_expression (parser);
31977 finish_expr_stmt (combiner);
31978 block = finish_omp_structured_block (block);
31979 add_stmt (block);
31981 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
31982 return false;
31984 const char *p = "";
31985 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31987 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31988 p = IDENTIFIER_POINTER (id);
31991 if (strcmp (p, "initializer") == 0)
31993 cp_lexer_consume_token (parser->lexer);
31994 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
31995 return false;
31997 p = "";
31998 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32000 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
32001 p = IDENTIFIER_POINTER (id);
32004 omp_priv = build_lang_decl (VAR_DECL, get_identifier ("omp_priv"), type);
32005 DECL_ARTIFICIAL (omp_priv) = 1;
32006 pushdecl (omp_priv);
32007 add_decl_expr (omp_priv);
32008 omp_orig = build_lang_decl (VAR_DECL, get_identifier ("omp_orig"), type);
32009 DECL_ARTIFICIAL (omp_orig) = 1;
32010 pushdecl (omp_orig);
32011 add_decl_expr (omp_orig);
32013 keep_next_level (true);
32014 block = begin_omp_structured_block ();
32016 bool ctor = false;
32017 if (strcmp (p, "omp_priv") == 0)
32019 bool is_direct_init, is_non_constant_init;
32020 ctor = true;
32021 cp_lexer_consume_token (parser->lexer);
32022 /* Reject initializer (omp_priv) and initializer (omp_priv ()). */
32023 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
32024 || (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
32025 && cp_lexer_peek_nth_token (parser->lexer, 2)->type
32026 == CPP_CLOSE_PAREN
32027 && cp_lexer_peek_nth_token (parser->lexer, 3)->type
32028 == CPP_CLOSE_PAREN))
32030 finish_omp_structured_block (block);
32031 error ("invalid initializer clause");
32032 return false;
32034 initializer = cp_parser_initializer (parser, &is_direct_init,
32035 &is_non_constant_init);
32036 cp_finish_decl (omp_priv, initializer, !is_non_constant_init,
32037 NULL_TREE, LOOKUP_ONLYCONVERTING);
32039 else
32041 cp_parser_parse_tentatively (parser);
32042 tree fn_name = cp_parser_id_expression (parser, /*template_p=*/false,
32043 /*check_dependency_p=*/true,
32044 /*template_p=*/NULL,
32045 /*declarator_p=*/false,
32046 /*optional_p=*/false);
32047 vec<tree, va_gc> *args;
32048 if (fn_name == error_mark_node
32049 || cp_parser_error_occurred (parser)
32050 || !cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
32051 || ((args = cp_parser_parenthesized_expression_list
32052 (parser, non_attr, /*cast_p=*/false,
32053 /*allow_expansion_p=*/true,
32054 /*non_constant_p=*/NULL)),
32055 cp_parser_error_occurred (parser)))
32057 finish_omp_structured_block (block);
32058 cp_parser_abort_tentative_parse (parser);
32059 cp_parser_error (parser, "expected id-expression (arguments)");
32060 return false;
32062 unsigned int i;
32063 tree arg;
32064 FOR_EACH_VEC_SAFE_ELT (args, i, arg)
32065 if (arg == omp_priv
32066 || (TREE_CODE (arg) == ADDR_EXPR
32067 && TREE_OPERAND (arg, 0) == omp_priv))
32068 break;
32069 cp_parser_abort_tentative_parse (parser);
32070 if (arg == NULL_TREE)
32071 error ("one of the initializer call arguments should be %<omp_priv%>"
32072 " or %<&omp_priv%>");
32073 initializer = cp_parser_postfix_expression (parser, false, false, false,
32074 false, NULL);
32075 finish_expr_stmt (initializer);
32078 block = finish_omp_structured_block (block);
32079 cp_walk_tree (&block, cp_remove_omp_priv_cleanup_stmt, omp_priv, NULL);
32080 add_stmt (block);
32082 if (ctor)
32083 add_decl_expr (omp_orig);
32085 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
32086 return false;
32089 if (!cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA_EOL))
32090 cp_parser_required_error (parser, RT_PRAGMA_EOL, /*keyword=*/false);
32092 return true;
32095 /* OpenMP 4.0
32096 #pragma omp declare reduction (reduction-id : typename-list : expression) \
32097 initializer-clause[opt] new-line
32099 initializer-clause:
32100 initializer (omp_priv initializer)
32101 initializer (function-name (argument-list)) */
32103 static void
32104 cp_parser_omp_declare_reduction (cp_parser *parser, cp_token *pragma_tok,
32105 enum pragma_context)
32107 auto_vec<tree> types;
32108 enum tree_code reduc_code = ERROR_MARK;
32109 tree reduc_id = NULL_TREE, orig_reduc_id = NULL_TREE, type;
32110 unsigned int i;
32111 cp_token *first_token;
32112 cp_token_cache *cp;
32113 int errs;
32114 void *p;
32116 /* Get the high-water mark for the DECLARATOR_OBSTACK. */
32117 p = obstack_alloc (&declarator_obstack, 0);
32119 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
32120 goto fail;
32122 switch (cp_lexer_peek_token (parser->lexer)->type)
32124 case CPP_PLUS:
32125 reduc_code = PLUS_EXPR;
32126 break;
32127 case CPP_MULT:
32128 reduc_code = MULT_EXPR;
32129 break;
32130 case CPP_MINUS:
32131 reduc_code = MINUS_EXPR;
32132 break;
32133 case CPP_AND:
32134 reduc_code = BIT_AND_EXPR;
32135 break;
32136 case CPP_XOR:
32137 reduc_code = BIT_XOR_EXPR;
32138 break;
32139 case CPP_OR:
32140 reduc_code = BIT_IOR_EXPR;
32141 break;
32142 case CPP_AND_AND:
32143 reduc_code = TRUTH_ANDIF_EXPR;
32144 break;
32145 case CPP_OR_OR:
32146 reduc_code = TRUTH_ORIF_EXPR;
32147 break;
32148 case CPP_NAME:
32149 reduc_id = orig_reduc_id = cp_parser_identifier (parser);
32150 break;
32151 default:
32152 cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, "
32153 "%<|%>, %<&&%>, %<||%> or identifier");
32154 goto fail;
32157 if (reduc_code != ERROR_MARK)
32158 cp_lexer_consume_token (parser->lexer);
32160 reduc_id = omp_reduction_id (reduc_code, reduc_id, NULL_TREE);
32161 if (reduc_id == error_mark_node)
32162 goto fail;
32164 if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
32165 goto fail;
32167 /* Types may not be defined in declare reduction type list. */
32168 const char *saved_message;
32169 saved_message = parser->type_definition_forbidden_message;
32170 parser->type_definition_forbidden_message
32171 = G_("types may not be defined in declare reduction type list");
32172 bool saved_colon_corrects_to_scope_p;
32173 saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
32174 parser->colon_corrects_to_scope_p = false;
32175 bool saved_colon_doesnt_start_class_def_p;
32176 saved_colon_doesnt_start_class_def_p
32177 = parser->colon_doesnt_start_class_def_p;
32178 parser->colon_doesnt_start_class_def_p = true;
32180 while (true)
32182 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
32183 type = cp_parser_type_id (parser);
32184 if (type == error_mark_node)
32186 else if (ARITHMETIC_TYPE_P (type)
32187 && (orig_reduc_id == NULL_TREE
32188 || (TREE_CODE (type) != COMPLEX_TYPE
32189 && (strcmp (IDENTIFIER_POINTER (orig_reduc_id),
32190 "min") == 0
32191 || strcmp (IDENTIFIER_POINTER (orig_reduc_id),
32192 "max") == 0))))
32193 error_at (loc, "predeclared arithmetic type %qT in "
32194 "%<#pragma omp declare reduction%>", type);
32195 else if (TREE_CODE (type) == FUNCTION_TYPE
32196 || TREE_CODE (type) == METHOD_TYPE
32197 || TREE_CODE (type) == ARRAY_TYPE)
32198 error_at (loc, "function or array type %qT in "
32199 "%<#pragma omp declare reduction%>", type);
32200 else if (TREE_CODE (type) == REFERENCE_TYPE)
32201 error_at (loc, "reference type %qT in "
32202 "%<#pragma omp declare reduction%>", type);
32203 else if (TYPE_QUALS_NO_ADDR_SPACE (type))
32204 error_at (loc, "const, volatile or __restrict qualified type %qT in "
32205 "%<#pragma omp declare reduction%>", type);
32206 else
32207 types.safe_push (type);
32209 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
32210 cp_lexer_consume_token (parser->lexer);
32211 else
32212 break;
32215 /* Restore the saved message. */
32216 parser->type_definition_forbidden_message = saved_message;
32217 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
32218 parser->colon_doesnt_start_class_def_p
32219 = saved_colon_doesnt_start_class_def_p;
32221 if (!cp_parser_require (parser, CPP_COLON, RT_COLON)
32222 || types.is_empty ())
32224 fail:
32225 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
32226 goto done;
32229 first_token = cp_lexer_peek_token (parser->lexer);
32230 cp = NULL;
32231 errs = errorcount;
32232 FOR_EACH_VEC_ELT (types, i, type)
32234 tree fntype
32235 = build_function_type_list (void_type_node,
32236 cp_build_reference_type (type, false),
32237 NULL_TREE);
32238 tree this_reduc_id = reduc_id;
32239 if (!dependent_type_p (type))
32240 this_reduc_id = omp_reduction_id (ERROR_MARK, reduc_id, type);
32241 tree fndecl = build_lang_decl (FUNCTION_DECL, this_reduc_id, fntype);
32242 DECL_SOURCE_LOCATION (fndecl) = pragma_tok->location;
32243 DECL_ARTIFICIAL (fndecl) = 1;
32244 DECL_EXTERNAL (fndecl) = 1;
32245 DECL_DECLARED_INLINE_P (fndecl) = 1;
32246 DECL_IGNORED_P (fndecl) = 1;
32247 DECL_OMP_DECLARE_REDUCTION_P (fndecl) = 1;
32248 DECL_ATTRIBUTES (fndecl)
32249 = tree_cons (get_identifier ("gnu_inline"), NULL_TREE,
32250 DECL_ATTRIBUTES (fndecl));
32251 if (processing_template_decl)
32252 fndecl = push_template_decl (fndecl);
32253 bool block_scope = false;
32254 tree block = NULL_TREE;
32255 if (current_function_decl)
32257 block_scope = true;
32258 DECL_CONTEXT (fndecl) = global_namespace;
32259 if (!processing_template_decl)
32260 pushdecl (fndecl);
32262 else if (current_class_type)
32264 if (cp == NULL)
32266 while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)
32267 && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
32268 cp_lexer_consume_token (parser->lexer);
32269 if (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
32270 goto fail;
32271 cp = cp_token_cache_new (first_token,
32272 cp_lexer_peek_nth_token (parser->lexer,
32273 2));
32275 DECL_STATIC_FUNCTION_P (fndecl) = 1;
32276 finish_member_declaration (fndecl);
32277 DECL_PENDING_INLINE_INFO (fndecl) = cp;
32278 DECL_PENDING_INLINE_P (fndecl) = 1;
32279 vec_safe_push (unparsed_funs_with_definitions, fndecl);
32280 continue;
32282 else
32284 DECL_CONTEXT (fndecl) = current_namespace;
32285 pushdecl (fndecl);
32287 if (!block_scope)
32288 start_preparsed_function (fndecl, NULL_TREE, SF_PRE_PARSED);
32289 else
32290 block = begin_omp_structured_block ();
32291 if (cp)
32293 cp_parser_push_lexer_for_tokens (parser, cp);
32294 parser->lexer->in_pragma = true;
32296 if (!cp_parser_omp_declare_reduction_exprs (fndecl, parser))
32298 if (!block_scope)
32299 finish_function (0);
32300 else
32301 DECL_CONTEXT (fndecl) = current_function_decl;
32302 if (cp)
32303 cp_parser_pop_lexer (parser);
32304 goto fail;
32306 if (cp)
32307 cp_parser_pop_lexer (parser);
32308 if (!block_scope)
32309 finish_function (0);
32310 else
32312 DECL_CONTEXT (fndecl) = current_function_decl;
32313 block = finish_omp_structured_block (block);
32314 if (TREE_CODE (block) == BIND_EXPR)
32315 DECL_SAVED_TREE (fndecl) = BIND_EXPR_BODY (block);
32316 else if (TREE_CODE (block) == STATEMENT_LIST)
32317 DECL_SAVED_TREE (fndecl) = block;
32318 if (processing_template_decl)
32319 add_decl_expr (fndecl);
32321 cp_check_omp_declare_reduction (fndecl);
32322 if (cp == NULL && types.length () > 1)
32323 cp = cp_token_cache_new (first_token,
32324 cp_lexer_peek_nth_token (parser->lexer, 2));
32325 if (errs != errorcount)
32326 break;
32329 cp_parser_require_pragma_eol (parser, pragma_tok);
32331 done:
32332 /* Free any declarators allocated. */
32333 obstack_free (&declarator_obstack, p);
32336 /* OpenMP 4.0
32337 #pragma omp declare simd declare-simd-clauses[optseq] new-line
32338 #pragma omp declare reduction (reduction-id : typename-list : expression) \
32339 initializer-clause[opt] new-line
32340 #pragma omp declare target new-line */
32342 static void
32343 cp_parser_omp_declare (cp_parser *parser, cp_token *pragma_tok,
32344 enum pragma_context context)
32346 if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32348 tree id = cp_lexer_peek_token (parser->lexer)->u.value;
32349 const char *p = IDENTIFIER_POINTER (id);
32351 if (strcmp (p, "simd") == 0)
32353 cp_lexer_consume_token (parser->lexer);
32354 cp_parser_omp_declare_simd (parser, pragma_tok,
32355 context);
32356 return;
32358 cp_ensure_no_omp_declare_simd (parser);
32359 if (strcmp (p, "reduction") == 0)
32361 cp_lexer_consume_token (parser->lexer);
32362 cp_parser_omp_declare_reduction (parser, pragma_tok,
32363 context);
32364 return;
32366 if (!flag_openmp) /* flag_openmp_simd */
32368 cp_parser_require_pragma_eol (parser, pragma_tok);
32369 return;
32371 if (strcmp (p, "target") == 0)
32373 cp_lexer_consume_token (parser->lexer);
32374 cp_parser_omp_declare_target (parser, pragma_tok);
32375 return;
32378 cp_parser_error (parser, "expected %<simd%> or %<reduction%> "
32379 "or %<target%>");
32380 cp_parser_require_pragma_eol (parser, pragma_tok);
32383 /* Main entry point to OpenMP statement pragmas. */
32385 static void
32386 cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok)
32388 tree stmt;
32389 char p_name[sizeof "#pragma omp teams distribute parallel for simd"];
32390 omp_clause_mask mask (0);
32392 switch (pragma_tok->pragma_kind)
32394 case PRAGMA_OACC_CACHE:
32395 stmt = cp_parser_oacc_cache (parser, pragma_tok);
32396 break;
32397 case PRAGMA_OACC_DATA:
32398 stmt = cp_parser_oacc_data (parser, pragma_tok);
32399 break;
32400 case PRAGMA_OACC_ENTER_DATA:
32401 stmt = cp_parser_oacc_enter_exit_data (parser, pragma_tok, true);
32402 break;
32403 case PRAGMA_OACC_EXIT_DATA:
32404 stmt = cp_parser_oacc_enter_exit_data (parser, pragma_tok, false);
32405 break;
32406 case PRAGMA_OACC_KERNELS:
32407 stmt = cp_parser_oacc_kernels (parser, pragma_tok);
32408 break;
32409 case PRAGMA_OACC_LOOP:
32410 stmt = cp_parser_oacc_loop (parser, pragma_tok);
32411 break;
32412 case PRAGMA_OACC_PARALLEL:
32413 stmt = cp_parser_oacc_parallel (parser, pragma_tok);
32414 break;
32415 case PRAGMA_OACC_UPDATE:
32416 stmt = cp_parser_oacc_update (parser, pragma_tok);
32417 break;
32418 case PRAGMA_OACC_WAIT:
32419 stmt = cp_parser_oacc_wait (parser, pragma_tok);
32420 break;
32421 case PRAGMA_OMP_ATOMIC:
32422 cp_parser_omp_atomic (parser, pragma_tok);
32423 return;
32424 case PRAGMA_OMP_CRITICAL:
32425 stmt = cp_parser_omp_critical (parser, pragma_tok);
32426 break;
32427 case PRAGMA_OMP_DISTRIBUTE:
32428 strcpy (p_name, "#pragma omp");
32429 stmt = cp_parser_omp_distribute (parser, pragma_tok, p_name, mask, NULL);
32430 break;
32431 case PRAGMA_OMP_FOR:
32432 strcpy (p_name, "#pragma omp");
32433 stmt = cp_parser_omp_for (parser, pragma_tok, p_name, mask, NULL);
32434 break;
32435 case PRAGMA_OMP_MASTER:
32436 stmt = cp_parser_omp_master (parser, pragma_tok);
32437 break;
32438 case PRAGMA_OMP_ORDERED:
32439 stmt = cp_parser_omp_ordered (parser, pragma_tok);
32440 break;
32441 case PRAGMA_OMP_PARALLEL:
32442 strcpy (p_name, "#pragma omp");
32443 stmt = cp_parser_omp_parallel (parser, pragma_tok, p_name, mask, NULL);
32444 break;
32445 case PRAGMA_OMP_SECTIONS:
32446 strcpy (p_name, "#pragma omp");
32447 stmt = cp_parser_omp_sections (parser, pragma_tok, p_name, mask, NULL);
32448 break;
32449 case PRAGMA_OMP_SIMD:
32450 strcpy (p_name, "#pragma omp");
32451 stmt = cp_parser_omp_simd (parser, pragma_tok, p_name, mask, NULL);
32452 break;
32453 case PRAGMA_OMP_SINGLE:
32454 stmt = cp_parser_omp_single (parser, pragma_tok);
32455 break;
32456 case PRAGMA_OMP_TASK:
32457 stmt = cp_parser_omp_task (parser, pragma_tok);
32458 break;
32459 case PRAGMA_OMP_TASKGROUP:
32460 stmt = cp_parser_omp_taskgroup (parser, pragma_tok);
32461 break;
32462 case PRAGMA_OMP_TEAMS:
32463 strcpy (p_name, "#pragma omp");
32464 stmt = cp_parser_omp_teams (parser, pragma_tok, p_name, mask, NULL);
32465 break;
32466 default:
32467 gcc_unreachable ();
32470 if (stmt)
32471 SET_EXPR_LOCATION (stmt, pragma_tok->location);
32474 /* Transactional Memory parsing routines. */
32476 /* Parse a transaction attribute.
32478 txn-attribute:
32479 attribute
32480 [ [ identifier ] ]
32482 ??? Simplify this when C++0x bracket attributes are
32483 implemented properly. */
32485 static tree
32486 cp_parser_txn_attribute_opt (cp_parser *parser)
32488 cp_token *token;
32489 tree attr_name, attr = NULL;
32491 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
32492 return cp_parser_attributes_opt (parser);
32494 if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
32495 return NULL_TREE;
32496 cp_lexer_consume_token (parser->lexer);
32497 if (!cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE))
32498 goto error1;
32500 token = cp_lexer_peek_token (parser->lexer);
32501 if (token->type == CPP_NAME || token->type == CPP_KEYWORD)
32503 token = cp_lexer_consume_token (parser->lexer);
32505 attr_name = (token->type == CPP_KEYWORD
32506 /* For keywords, use the canonical spelling,
32507 not the parsed identifier. */
32508 ? ridpointers[(int) token->keyword]
32509 : token->u.value);
32510 attr = build_tree_list (attr_name, NULL_TREE);
32512 else
32513 cp_parser_error (parser, "expected identifier");
32515 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
32516 error1:
32517 cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
32518 return attr;
32521 /* Parse a __transaction_atomic or __transaction_relaxed statement.
32523 transaction-statement:
32524 __transaction_atomic txn-attribute[opt] txn-noexcept-spec[opt]
32525 compound-statement
32526 __transaction_relaxed txn-noexcept-spec[opt] compound-statement
32529 static tree
32530 cp_parser_transaction (cp_parser *parser, enum rid keyword)
32532 unsigned char old_in = parser->in_transaction;
32533 unsigned char this_in = 1, new_in;
32534 cp_token *token;
32535 tree stmt, attrs, noex;
32537 gcc_assert (keyword == RID_TRANSACTION_ATOMIC
32538 || keyword == RID_TRANSACTION_RELAXED);
32539 token = cp_parser_require_keyword (parser, keyword,
32540 (keyword == RID_TRANSACTION_ATOMIC ? RT_TRANSACTION_ATOMIC
32541 : RT_TRANSACTION_RELAXED));
32542 gcc_assert (token != NULL);
32544 if (keyword == RID_TRANSACTION_RELAXED)
32545 this_in |= TM_STMT_ATTR_RELAXED;
32546 else
32548 attrs = cp_parser_txn_attribute_opt (parser);
32549 if (attrs)
32550 this_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
32553 /* Parse a noexcept specification. */
32554 noex = cp_parser_noexcept_specification_opt (parser, true, NULL, true);
32556 /* Keep track if we're in the lexical scope of an outer transaction. */
32557 new_in = this_in | (old_in & TM_STMT_ATTR_OUTER);
32559 stmt = begin_transaction_stmt (token->location, NULL, this_in);
32561 parser->in_transaction = new_in;
32562 cp_parser_compound_statement (parser, NULL, false, false);
32563 parser->in_transaction = old_in;
32565 finish_transaction_stmt (stmt, NULL, this_in, noex);
32567 return stmt;
32570 /* Parse a __transaction_atomic or __transaction_relaxed expression.
32572 transaction-expression:
32573 __transaction_atomic txn-noexcept-spec[opt] ( expression )
32574 __transaction_relaxed txn-noexcept-spec[opt] ( expression )
32577 static tree
32578 cp_parser_transaction_expression (cp_parser *parser, enum rid keyword)
32580 unsigned char old_in = parser->in_transaction;
32581 unsigned char this_in = 1;
32582 cp_token *token;
32583 tree expr, noex;
32584 bool noex_expr;
32586 gcc_assert (keyword == RID_TRANSACTION_ATOMIC
32587 || keyword == RID_TRANSACTION_RELAXED);
32589 if (!flag_tm)
32590 error (keyword == RID_TRANSACTION_RELAXED
32591 ? G_("%<__transaction_relaxed%> without transactional memory "
32592 "support enabled")
32593 : G_("%<__transaction_atomic%> without transactional memory "
32594 "support enabled"));
32596 token = cp_parser_require_keyword (parser, keyword,
32597 (keyword == RID_TRANSACTION_ATOMIC ? RT_TRANSACTION_ATOMIC
32598 : RT_TRANSACTION_RELAXED));
32599 gcc_assert (token != NULL);
32601 if (keyword == RID_TRANSACTION_RELAXED)
32602 this_in |= TM_STMT_ATTR_RELAXED;
32604 /* Set this early. This might mean that we allow transaction_cancel in
32605 an expression that we find out later actually has to be a constexpr.
32606 However, we expect that cxx_constant_value will be able to deal with
32607 this; also, if the noexcept has no constexpr, then what we parse next
32608 really is a transaction's body. */
32609 parser->in_transaction = this_in;
32611 /* Parse a noexcept specification. */
32612 noex = cp_parser_noexcept_specification_opt (parser, false, &noex_expr,
32613 true);
32615 if (!noex || !noex_expr
32616 || cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
32618 cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
32620 expr = cp_parser_expression (parser);
32621 expr = finish_parenthesized_expr (expr);
32623 cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
32625 else
32627 /* The only expression that is available got parsed for the noexcept
32628 already. noexcept is true then. */
32629 expr = noex;
32630 noex = boolean_true_node;
32633 expr = build_transaction_expr (token->location, expr, this_in, noex);
32634 parser->in_transaction = old_in;
32636 if (cp_parser_non_integral_constant_expression (parser, NIC_TRANSACTION))
32637 return error_mark_node;
32639 return (flag_tm ? expr : error_mark_node);
32642 /* Parse a function-transaction-block.
32644 function-transaction-block:
32645 __transaction_atomic txn-attribute[opt] ctor-initializer[opt]
32646 function-body
32647 __transaction_atomic txn-attribute[opt] function-try-block
32648 __transaction_relaxed ctor-initializer[opt] function-body
32649 __transaction_relaxed function-try-block
32652 static bool
32653 cp_parser_function_transaction (cp_parser *parser, enum rid keyword)
32655 unsigned char old_in = parser->in_transaction;
32656 unsigned char new_in = 1;
32657 tree compound_stmt, stmt, attrs;
32658 bool ctor_initializer_p;
32659 cp_token *token;
32661 gcc_assert (keyword == RID_TRANSACTION_ATOMIC
32662 || keyword == RID_TRANSACTION_RELAXED);
32663 token = cp_parser_require_keyword (parser, keyword,
32664 (keyword == RID_TRANSACTION_ATOMIC ? RT_TRANSACTION_ATOMIC
32665 : RT_TRANSACTION_RELAXED));
32666 gcc_assert (token != NULL);
32668 if (keyword == RID_TRANSACTION_RELAXED)
32669 new_in |= TM_STMT_ATTR_RELAXED;
32670 else
32672 attrs = cp_parser_txn_attribute_opt (parser);
32673 if (attrs)
32674 new_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
32677 stmt = begin_transaction_stmt (token->location, &compound_stmt, new_in);
32679 parser->in_transaction = new_in;
32681 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
32682 ctor_initializer_p = cp_parser_function_try_block (parser);
32683 else
32684 ctor_initializer_p = cp_parser_ctor_initializer_opt_and_function_body
32685 (parser, /*in_function_try_block=*/false);
32687 parser->in_transaction = old_in;
32689 finish_transaction_stmt (stmt, compound_stmt, new_in, NULL_TREE);
32691 return ctor_initializer_p;
32694 /* Parse a __transaction_cancel statement.
32696 cancel-statement:
32697 __transaction_cancel txn-attribute[opt] ;
32698 __transaction_cancel txn-attribute[opt] throw-expression ;
32700 ??? Cancel and throw is not yet implemented. */
32702 static tree
32703 cp_parser_transaction_cancel (cp_parser *parser)
32705 cp_token *token;
32706 bool is_outer = false;
32707 tree stmt, attrs;
32709 token = cp_parser_require_keyword (parser, RID_TRANSACTION_CANCEL,
32710 RT_TRANSACTION_CANCEL);
32711 gcc_assert (token != NULL);
32713 attrs = cp_parser_txn_attribute_opt (parser);
32714 if (attrs)
32715 is_outer = (parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER) != 0);
32717 /* ??? Parse cancel-and-throw here. */
32719 cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
32721 if (!flag_tm)
32723 error_at (token->location, "%<__transaction_cancel%> without "
32724 "transactional memory support enabled");
32725 return error_mark_node;
32727 else if (parser->in_transaction & TM_STMT_ATTR_RELAXED)
32729 error_at (token->location, "%<__transaction_cancel%> within a "
32730 "%<__transaction_relaxed%>");
32731 return error_mark_node;
32733 else if (is_outer)
32735 if ((parser->in_transaction & TM_STMT_ATTR_OUTER) == 0
32736 && !is_tm_may_cancel_outer (current_function_decl))
32738 error_at (token->location, "outer %<__transaction_cancel%> not "
32739 "within outer %<__transaction_atomic%>");
32740 error_at (token->location,
32741 " or a %<transaction_may_cancel_outer%> function");
32742 return error_mark_node;
32745 else if (parser->in_transaction == 0)
32747 error_at (token->location, "%<__transaction_cancel%> not within "
32748 "%<__transaction_atomic%>");
32749 return error_mark_node;
32752 stmt = build_tm_abort_call (token->location, is_outer);
32753 add_stmt (stmt);
32755 return stmt;
32758 /* The parser. */
32760 static GTY (()) cp_parser *the_parser;
32763 /* Special handling for the first token or line in the file. The first
32764 thing in the file might be #pragma GCC pch_preprocess, which loads a
32765 PCH file, which is a GC collection point. So we need to handle this
32766 first pragma without benefit of an existing lexer structure.
32768 Always returns one token to the caller in *FIRST_TOKEN. This is
32769 either the true first token of the file, or the first token after
32770 the initial pragma. */
32772 static void
32773 cp_parser_initial_pragma (cp_token *first_token)
32775 tree name = NULL;
32777 cp_lexer_get_preprocessor_token (NULL, first_token);
32778 if (first_token->pragma_kind != PRAGMA_GCC_PCH_PREPROCESS)
32779 return;
32781 cp_lexer_get_preprocessor_token (NULL, first_token);
32782 if (first_token->type == CPP_STRING)
32784 name = first_token->u.value;
32786 cp_lexer_get_preprocessor_token (NULL, first_token);
32787 if (first_token->type != CPP_PRAGMA_EOL)
32788 error_at (first_token->location,
32789 "junk at end of %<#pragma GCC pch_preprocess%>");
32791 else
32792 error_at (first_token->location, "expected string literal");
32794 /* Skip to the end of the pragma. */
32795 while (first_token->type != CPP_PRAGMA_EOL && first_token->type != CPP_EOF)
32796 cp_lexer_get_preprocessor_token (NULL, first_token);
32798 /* Now actually load the PCH file. */
32799 if (name)
32800 c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
32802 /* Read one more token to return to our caller. We have to do this
32803 after reading the PCH file in, since its pointers have to be
32804 live. */
32805 cp_lexer_get_preprocessor_token (NULL, first_token);
32808 /* Parses the grainsize pragma for the _Cilk_for statement.
32809 Syntax:
32810 #pragma cilk grainsize = <VALUE>. */
32812 static void
32813 cp_parser_cilk_grainsize (cp_parser *parser, cp_token *pragma_tok)
32815 if (cp_parser_require (parser, CPP_EQ, RT_EQ))
32817 tree exp = cp_parser_binary_expression (parser, false, false,
32818 PREC_NOT_OPERATOR, NULL);
32819 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
32820 if (!exp || exp == error_mark_node)
32822 error_at (pragma_tok->location, "invalid grainsize for _Cilk_for");
32823 return;
32826 /* Make sure the next token is _Cilk_for, it is invalid otherwise. */
32827 if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CILK_FOR))
32828 cp_parser_cilk_for (parser, exp);
32829 else
32830 warning_at (cp_lexer_peek_token (parser->lexer)->location, 0,
32831 "%<#pragma cilk grainsize%> is not followed by "
32832 "%<_Cilk_for%>");
32833 return;
32835 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
32838 /* Normal parsing of a pragma token. Here we can (and must) use the
32839 regular lexer. */
32841 static bool
32842 cp_parser_pragma (cp_parser *parser, enum pragma_context context)
32844 cp_token *pragma_tok;
32845 unsigned int id;
32847 pragma_tok = cp_lexer_consume_token (parser->lexer);
32848 gcc_assert (pragma_tok->type == CPP_PRAGMA);
32849 parser->lexer->in_pragma = true;
32851 id = pragma_tok->pragma_kind;
32852 if (id != PRAGMA_OMP_DECLARE_REDUCTION)
32853 cp_ensure_no_omp_declare_simd (parser);
32854 switch (id)
32856 case PRAGMA_GCC_PCH_PREPROCESS:
32857 error_at (pragma_tok->location,
32858 "%<#pragma GCC pch_preprocess%> must be first");
32859 break;
32861 case PRAGMA_OMP_BARRIER:
32862 switch (context)
32864 case pragma_compound:
32865 cp_parser_omp_barrier (parser, pragma_tok);
32866 return false;
32867 case pragma_stmt:
32868 error_at (pragma_tok->location, "%<#pragma omp barrier%> may only be "
32869 "used in compound statements");
32870 break;
32871 default:
32872 goto bad_stmt;
32874 break;
32876 case PRAGMA_OMP_FLUSH:
32877 switch (context)
32879 case pragma_compound:
32880 cp_parser_omp_flush (parser, pragma_tok);
32881 return false;
32882 case pragma_stmt:
32883 error_at (pragma_tok->location, "%<#pragma omp flush%> may only be "
32884 "used in compound statements");
32885 break;
32886 default:
32887 goto bad_stmt;
32889 break;
32891 case PRAGMA_OMP_TASKWAIT:
32892 switch (context)
32894 case pragma_compound:
32895 cp_parser_omp_taskwait (parser, pragma_tok);
32896 return false;
32897 case pragma_stmt:
32898 error_at (pragma_tok->location,
32899 "%<#pragma omp taskwait%> may only be "
32900 "used in compound statements");
32901 break;
32902 default:
32903 goto bad_stmt;
32905 break;
32907 case PRAGMA_OMP_TASKYIELD:
32908 switch (context)
32910 case pragma_compound:
32911 cp_parser_omp_taskyield (parser, pragma_tok);
32912 return false;
32913 case pragma_stmt:
32914 error_at (pragma_tok->location,
32915 "%<#pragma omp taskyield%> may only be "
32916 "used in compound statements");
32917 break;
32918 default:
32919 goto bad_stmt;
32921 break;
32923 case PRAGMA_OMP_CANCEL:
32924 switch (context)
32926 case pragma_compound:
32927 cp_parser_omp_cancel (parser, pragma_tok);
32928 return false;
32929 case pragma_stmt:
32930 error_at (pragma_tok->location,
32931 "%<#pragma omp cancel%> may only be "
32932 "used in compound statements");
32933 break;
32934 default:
32935 goto bad_stmt;
32937 break;
32939 case PRAGMA_OMP_CANCELLATION_POINT:
32940 switch (context)
32942 case pragma_compound:
32943 cp_parser_omp_cancellation_point (parser, pragma_tok);
32944 return false;
32945 case pragma_stmt:
32946 error_at (pragma_tok->location,
32947 "%<#pragma omp cancellation point%> may only be "
32948 "used in compound statements");
32949 break;
32950 default:
32951 goto bad_stmt;
32953 break;
32955 case PRAGMA_OMP_THREADPRIVATE:
32956 cp_parser_omp_threadprivate (parser, pragma_tok);
32957 return false;
32959 case PRAGMA_OMP_DECLARE_REDUCTION:
32960 cp_parser_omp_declare (parser, pragma_tok, context);
32961 return false;
32963 case PRAGMA_OACC_CACHE:
32964 case PRAGMA_OACC_DATA:
32965 case PRAGMA_OACC_ENTER_DATA:
32966 case PRAGMA_OACC_EXIT_DATA:
32967 case PRAGMA_OACC_KERNELS:
32968 case PRAGMA_OACC_PARALLEL:
32969 case PRAGMA_OACC_LOOP:
32970 case PRAGMA_OACC_UPDATE:
32971 case PRAGMA_OACC_WAIT:
32972 case PRAGMA_OMP_ATOMIC:
32973 case PRAGMA_OMP_CRITICAL:
32974 case PRAGMA_OMP_DISTRIBUTE:
32975 case PRAGMA_OMP_FOR:
32976 case PRAGMA_OMP_MASTER:
32977 case PRAGMA_OMP_ORDERED:
32978 case PRAGMA_OMP_PARALLEL:
32979 case PRAGMA_OMP_SECTIONS:
32980 case PRAGMA_OMP_SIMD:
32981 case PRAGMA_OMP_SINGLE:
32982 case PRAGMA_OMP_TASK:
32983 case PRAGMA_OMP_TASKGROUP:
32984 case PRAGMA_OMP_TEAMS:
32985 if (context != pragma_stmt && context != pragma_compound)
32986 goto bad_stmt;
32987 cp_parser_omp_construct (parser, pragma_tok);
32988 return true;
32990 case PRAGMA_OMP_TARGET:
32991 return cp_parser_omp_target (parser, pragma_tok, context);
32993 case PRAGMA_OMP_END_DECLARE_TARGET:
32994 cp_parser_omp_end_declare_target (parser, pragma_tok);
32995 return false;
32997 case PRAGMA_OMP_SECTION:
32998 error_at (pragma_tok->location,
32999 "%<#pragma omp section%> may only be used in "
33000 "%<#pragma omp sections%> construct");
33001 break;
33003 case PRAGMA_IVDEP:
33005 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
33006 cp_token *tok;
33007 tok = cp_lexer_peek_token (the_parser->lexer);
33008 if (tok->type != CPP_KEYWORD
33009 || (tok->keyword != RID_FOR && tok->keyword != RID_WHILE
33010 && tok->keyword != RID_DO))
33012 cp_parser_error (parser, "for, while or do statement expected");
33013 return false;
33015 cp_parser_iteration_statement (parser, true);
33016 return true;
33019 case PRAGMA_CILK_SIMD:
33020 if (context == pragma_external)
33022 error_at (pragma_tok->location,
33023 "%<#pragma simd%> must be inside a function");
33024 break;
33026 cp_parser_cilk_simd (parser, pragma_tok);
33027 return true;
33029 case PRAGMA_CILK_GRAINSIZE:
33030 if (context == pragma_external)
33032 error_at (pragma_tok->location,
33033 "%<#pragma cilk grainsize%> must be inside a function");
33034 break;
33037 /* Ignore the pragma if Cilk Plus is not enabled. */
33038 if (flag_cilkplus)
33040 cp_parser_cilk_grainsize (parser, pragma_tok);
33041 return true;
33043 else
33045 error_at (pragma_tok->location, "-fcilkplus must be enabled to use "
33046 "%<#pragma cilk grainsize%>");
33047 break;
33050 default:
33051 gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
33052 c_invoke_pragma_handler (id);
33053 break;
33055 bad_stmt:
33056 cp_parser_error (parser, "expected declaration specifiers");
33057 break;
33060 cp_parser_skip_to_pragma_eol (parser, pragma_tok);
33061 return false;
33064 /* The interface the pragma parsers have to the lexer. */
33066 enum cpp_ttype
33067 pragma_lex (tree *value)
33069 cp_token *tok;
33070 enum cpp_ttype ret;
33072 tok = cp_lexer_peek_token (the_parser->lexer);
33074 ret = tok->type;
33075 *value = tok->u.value;
33077 if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
33078 ret = CPP_EOF;
33079 else if (ret == CPP_STRING)
33080 *value = cp_parser_string_literal (the_parser, false, false);
33081 else
33083 cp_lexer_consume_token (the_parser->lexer);
33084 if (ret == CPP_KEYWORD)
33085 ret = CPP_NAME;
33088 return ret;
33092 /* External interface. */
33094 /* Parse one entire translation unit. */
33096 void
33097 c_parse_file (void)
33099 static bool already_called = false;
33101 if (already_called)
33102 fatal_error ("inter-module optimizations not implemented for C++");
33103 already_called = true;
33105 the_parser = cp_parser_new ();
33106 push_deferring_access_checks (flag_access_control
33107 ? dk_no_deferred : dk_no_check);
33108 cp_parser_translation_unit (the_parser);
33109 the_parser = NULL;
33112 /* Parses the Cilk Plus #pragma simd and SIMD-enabled function attribute's
33113 vectorlength clause:
33114 Syntax:
33115 vectorlength ( constant-expression ) */
33117 static tree
33118 cp_parser_cilk_simd_vectorlength (cp_parser *parser, tree clauses,
33119 bool is_simd_fn)
33121 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
33122 tree expr;
33123 /* The vectorlength clause in #pragma simd behaves exactly like OpenMP's
33124 safelen clause. Thus, vectorlength is represented as OMP 4.0
33125 safelen. For SIMD-enabled function it is represented by OMP 4.0
33126 simdlen. */
33127 if (!is_simd_fn)
33128 check_no_duplicate_clause (clauses, OMP_CLAUSE_SAFELEN, "vectorlength",
33129 loc);
33130 else
33131 check_no_duplicate_clause (clauses, OMP_CLAUSE_SIMDLEN, "vectorlength",
33132 loc);
33134 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
33135 return error_mark_node;
33137 expr = cp_parser_constant_expression (parser);
33138 expr = maybe_constant_value (expr);
33140 /* If expr == error_mark_node, then don't emit any errors nor
33141 create a clause. if any of the above functions returns
33142 error mark node then they would have emitted an error message. */
33143 if (expr == error_mark_node)
33145 else if (!TREE_TYPE (expr)
33146 || !TREE_CONSTANT (expr)
33147 || !INTEGRAL_TYPE_P (TREE_TYPE (expr)))
33148 error_at (loc, "vectorlength must be an integer constant");
33149 else if (TREE_CONSTANT (expr)
33150 && exact_log2 (TREE_INT_CST_LOW (expr)) == -1)
33151 error_at (loc, "vectorlength must be a power of 2");
33152 else
33154 tree c;
33155 if (!is_simd_fn)
33157 c = build_omp_clause (loc, OMP_CLAUSE_SAFELEN);
33158 OMP_CLAUSE_SAFELEN_EXPR (c) = expr;
33159 OMP_CLAUSE_CHAIN (c) = clauses;
33160 clauses = c;
33162 else
33164 c = build_omp_clause (loc, OMP_CLAUSE_SIMDLEN);
33165 OMP_CLAUSE_SIMDLEN_EXPR (c) = expr;
33166 OMP_CLAUSE_CHAIN (c) = clauses;
33167 clauses = c;
33171 if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
33172 return error_mark_node;
33173 return clauses;
33176 /* Handles the Cilk Plus #pragma simd linear clause.
33177 Syntax:
33178 linear ( simd-linear-variable-list )
33180 simd-linear-variable-list:
33181 simd-linear-variable
33182 simd-linear-variable-list , simd-linear-variable
33184 simd-linear-variable:
33185 id-expression
33186 id-expression : simd-linear-step
33188 simd-linear-step:
33189 conditional-expression */
33191 static tree
33192 cp_parser_cilk_simd_linear (cp_parser *parser, tree clauses)
33194 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
33196 if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
33197 return clauses;
33198 if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
33200 cp_parser_error (parser, "expected identifier");
33201 cp_parser_skip_to_closing_parenthesis (parser, false, false, true);
33202 return error_mark_node;
33205 bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
33206 parser->colon_corrects_to_scope_p = false;
33207 while (1)
33209 cp_token *token = cp_lexer_peek_token (parser->lexer);
33210 if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
33212 cp_parser_error (parser, "expected variable-name");
33213 clauses = error_mark_node;
33214 break;
33217 tree var_name = cp_parser_id_expression (parser, false, true, NULL,
33218 false, false);
33219 tree decl = cp_parser_lookup_name_simple (parser, var_name,
33220 token->location);
33221 if (decl == error_mark_node)
33223 cp_parser_name_lookup_error (parser, var_name, decl, NLE_NULL,
33224 token->location);
33225 clauses = error_mark_node;
33227 else
33229 tree e = NULL_TREE;
33230 tree step_size = integer_one_node;
33232 /* If present, parse the linear step. Otherwise, assume the default
33233 value of 1. */
33234 if (cp_lexer_peek_token (parser->lexer)->type == CPP_COLON)
33236 cp_lexer_consume_token (parser->lexer);
33238 e = cp_parser_assignment_expression (parser);
33239 e = maybe_constant_value (e);
33241 if (e == error_mark_node)
33243 /* If an error has occurred, then the whole pragma is
33244 considered ill-formed. Thus, no reason to keep
33245 parsing. */
33246 clauses = error_mark_node;
33247 break;
33249 else if (type_dependent_expression_p (e)
33250 || value_dependent_expression_p (e)
33251 || (TREE_TYPE (e)
33252 && INTEGRAL_TYPE_P (TREE_TYPE (e))
33253 && (TREE_CONSTANT (e)
33254 || DECL_P (e))))
33255 step_size = e;
33256 else
33257 cp_parser_error (parser,
33258 "step size must be an integer constant "
33259 "expression or an integer variable");
33262 /* Use the OMP_CLAUSE_LINEAR, which has the same semantics. */
33263 tree l = build_omp_clause (loc, OMP_CLAUSE_LINEAR);
33264 OMP_CLAUSE_DECL (l) = decl;
33265 OMP_CLAUSE_LINEAR_STEP (l) = step_size;
33266 OMP_CLAUSE_CHAIN (l) = clauses;
33267 clauses = l;
33269 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
33270 cp_lexer_consume_token (parser->lexer);
33271 else if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
33272 break;
33273 else
33275 error_at (cp_lexer_peek_token (parser->lexer)->location,
33276 "expected %<,%> or %<)%> after %qE", decl);
33277 clauses = error_mark_node;
33278 break;
33281 parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
33282 cp_parser_skip_to_closing_parenthesis (parser, false, false, true);
33283 return clauses;
33286 /* Returns the name of the next clause. If the clause is not
33287 recognized, then PRAGMA_CILK_CLAUSE_NONE is returned and the next
33288 token is not consumed. Otherwise, the appropriate enum from the
33289 pragma_simd_clause is returned and the token is consumed. */
33291 static pragma_omp_clause
33292 cp_parser_cilk_simd_clause_name (cp_parser *parser)
33294 pragma_omp_clause clause_type;
33295 cp_token *token = cp_lexer_peek_token (parser->lexer);
33297 if (token->keyword == RID_PRIVATE)
33298 clause_type = PRAGMA_CILK_CLAUSE_PRIVATE;
33299 else if (!token->u.value || token->type != CPP_NAME)
33300 return PRAGMA_CILK_CLAUSE_NONE;
33301 else if (!strcmp (IDENTIFIER_POINTER (token->u.value), "vectorlength"))
33302 clause_type = PRAGMA_CILK_CLAUSE_VECTORLENGTH;
33303 else if (!strcmp (IDENTIFIER_POINTER (token->u.value), "linear"))
33304 clause_type = PRAGMA_CILK_CLAUSE_LINEAR;
33305 else if (!strcmp (IDENTIFIER_POINTER (token->u.value), "firstprivate"))
33306 clause_type = PRAGMA_CILK_CLAUSE_FIRSTPRIVATE;
33307 else if (!strcmp (IDENTIFIER_POINTER (token->u.value), "lastprivate"))
33308 clause_type = PRAGMA_CILK_CLAUSE_LASTPRIVATE;
33309 else if (!strcmp (IDENTIFIER_POINTER (token->u.value), "reduction"))
33310 clause_type = PRAGMA_CILK_CLAUSE_REDUCTION;
33311 else
33312 return PRAGMA_CILK_CLAUSE_NONE;
33314 cp_lexer_consume_token (parser->lexer);
33315 return clause_type;
33318 /* Parses all the #pragma simd clauses. Returns a list of clauses found. */
33320 static tree
33321 cp_parser_cilk_simd_all_clauses (cp_parser *parser, cp_token *pragma_token)
33323 tree clauses = NULL_TREE;
33325 while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)
33326 && clauses != error_mark_node)
33328 pragma_omp_clause c_kind;
33329 c_kind = cp_parser_cilk_simd_clause_name (parser);
33330 if (c_kind == PRAGMA_CILK_CLAUSE_VECTORLENGTH)
33331 clauses = cp_parser_cilk_simd_vectorlength (parser, clauses, false);
33332 else if (c_kind == PRAGMA_CILK_CLAUSE_LINEAR)
33333 clauses = cp_parser_cilk_simd_linear (parser, clauses);
33334 else if (c_kind == PRAGMA_CILK_CLAUSE_PRIVATE)
33335 /* Use the OpenMP 4.0 equivalent function. */
33336 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE, clauses);
33337 else if (c_kind == PRAGMA_CILK_CLAUSE_FIRSTPRIVATE)
33338 /* Use the OpenMP 4.0 equivalent function. */
33339 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
33340 clauses);
33341 else if (c_kind == PRAGMA_CILK_CLAUSE_LASTPRIVATE)
33342 /* Use the OMP 4.0 equivalent function. */
33343 clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
33344 clauses);
33345 else if (c_kind == PRAGMA_CILK_CLAUSE_REDUCTION)
33346 /* Use the OMP 4.0 equivalent function. */
33347 clauses = cp_parser_omp_clause_reduction (parser, clauses);
33348 else
33350 clauses = error_mark_node;
33351 cp_parser_error (parser, "expected %<#pragma simd%> clause");
33352 break;
33356 cp_parser_skip_to_pragma_eol (parser, pragma_token);
33358 if (clauses == error_mark_node)
33359 return error_mark_node;
33360 else
33361 return c_finish_cilk_clauses (clauses);
33364 /* Main entry-point for parsing Cilk Plus <#pragma simd> for loops. */
33366 static void
33367 cp_parser_cilk_simd (cp_parser *parser, cp_token *pragma_token)
33369 tree clauses = cp_parser_cilk_simd_all_clauses (parser, pragma_token);
33371 if (clauses == error_mark_node)
33372 return;
33374 if (cp_lexer_next_token_is_not_keyword (parser->lexer, RID_FOR))
33376 error_at (cp_lexer_peek_token (parser->lexer)->location,
33377 "for statement expected");
33378 return;
33381 tree sb = begin_omp_structured_block ();
33382 int save = cp_parser_begin_omp_structured_block (parser);
33383 tree ret = cp_parser_omp_for_loop (parser, CILK_SIMD, clauses, NULL);
33384 if (ret)
33385 cpp_validate_cilk_plus_loop (OMP_FOR_BODY (ret));
33386 cp_parser_end_omp_structured_block (parser, save);
33387 add_stmt (finish_omp_structured_block (sb));
33390 /* Main entry-point for parsing Cilk Plus _Cilk_for
33391 loops. The return value is error_mark_node
33392 when errors happen and CILK_FOR tree on success. */
33394 static tree
33395 cp_parser_cilk_for (cp_parser *parser, tree grain)
33397 if (cp_lexer_next_token_is_not_keyword (parser->lexer, RID_CILK_FOR))
33398 gcc_unreachable ();
33400 tree sb = begin_omp_structured_block ();
33401 int save = cp_parser_begin_omp_structured_block (parser);
33403 tree clauses = build_omp_clause (EXPR_LOCATION (grain), OMP_CLAUSE_SCHEDULE);
33404 OMP_CLAUSE_SCHEDULE_KIND (clauses) = OMP_CLAUSE_SCHEDULE_CILKFOR;
33405 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clauses) = grain;
33406 clauses = finish_omp_clauses (clauses);
33408 tree ret = cp_parser_omp_for_loop (parser, CILK_FOR, clauses, NULL);
33409 if (ret)
33410 cpp_validate_cilk_plus_loop (ret);
33411 else
33412 ret = error_mark_node;
33414 cp_parser_end_omp_structured_block (parser, save);
33415 add_stmt (finish_omp_structured_block (sb));
33416 return ret;
33419 /* Create an identifier for a generic parameter type (a synthesized
33420 template parameter implied by `auto' or a concept identifier). */
33422 static GTY(()) int generic_parm_count;
33423 static tree
33424 make_generic_type_name ()
33426 char buf[32];
33427 sprintf (buf, "auto:%d", ++generic_parm_count);
33428 return get_identifier (buf);
33431 /* Predicate that behaves as is_auto_or_concept but matches the parent
33432 node of the generic type rather than the generic type itself. This
33433 allows for type transformation in add_implicit_template_parms. */
33435 static inline bool
33436 tree_type_is_auto_or_concept (const_tree t)
33438 return TREE_TYPE (t) && is_auto_or_concept (TREE_TYPE (t));
33441 /* Add an implicit template type parameter to the CURRENT_TEMPLATE_PARMS
33442 (creating a new template parameter list if necessary). Returns the newly
33443 created template type parm. */
33445 tree
33446 synthesize_implicit_template_parm (cp_parser *parser)
33448 gcc_assert (current_binding_level->kind == sk_function_parms);
33450 /* We are either continuing a function template that already contains implicit
33451 template parameters, creating a new fully-implicit function template, or
33452 extending an existing explicit function template with implicit template
33453 parameters. */
33455 cp_binding_level *const entry_scope = current_binding_level;
33457 bool become_template = false;
33458 cp_binding_level *parent_scope = 0;
33460 if (parser->implicit_template_scope)
33462 gcc_assert (parser->implicit_template_parms);
33464 current_binding_level = parser->implicit_template_scope;
33466 else
33468 /* Roll back to the existing template parameter scope (in the case of
33469 extending an explicit function template) or introduce a new template
33470 parameter scope ahead of the function parameter scope (or class scope
33471 in the case of out-of-line member definitions). The function scope is
33472 added back after template parameter synthesis below. */
33474 cp_binding_level *scope = entry_scope;
33476 while (scope->kind == sk_function_parms)
33478 parent_scope = scope;
33479 scope = scope->level_chain;
33481 if (current_class_type && !LAMBDA_TYPE_P (current_class_type))
33483 /* If not defining a class, then any class scope is a scope level in
33484 an out-of-line member definition. In this case simply wind back
33485 beyond the first such scope to inject the template parameter list.
33486 Otherwise wind back to the class being defined. The latter can
33487 occur in class member friend declarations such as:
33489 class A {
33490 void foo (auto);
33492 class B {
33493 friend void A::foo (auto);
33496 The template parameter list synthesized for the friend declaration
33497 must be injected in the scope of 'B'. This can also occur in
33498 erroneous cases such as:
33500 struct A {
33501 struct B {
33502 void foo (auto);
33504 void B::foo (auto) {}
33507 Here the attempted definition of 'B::foo' within 'A' is ill-formed
33508 but, nevertheless, the template parameter list synthesized for the
33509 declarator should be injected into the scope of 'A' as if the
33510 ill-formed template was specified explicitly. */
33512 while (scope->kind == sk_class && !scope->defining_class_p)
33514 parent_scope = scope;
33515 scope = scope->level_chain;
33519 current_binding_level = scope;
33521 if (scope->kind != sk_template_parms
33522 || !function_being_declared_is_template_p (parser))
33524 /* Introduce a new template parameter list for implicit template
33525 parameters. */
33527 become_template = true;
33529 parser->implicit_template_scope
33530 = begin_scope (sk_template_parms, NULL);
33532 ++processing_template_decl;
33534 parser->fully_implicit_function_template_p = true;
33535 ++parser->num_template_parameter_lists;
33537 else
33539 /* Synthesize implicit template parameters at the end of the explicit
33540 template parameter list. */
33542 gcc_assert (current_template_parms);
33544 parser->implicit_template_scope = scope;
33546 tree v = INNERMOST_TEMPLATE_PARMS (current_template_parms);
33547 parser->implicit_template_parms
33548 = TREE_VEC_ELT (v, TREE_VEC_LENGTH (v) - 1);
33552 /* Synthesize a new template parameter and track the current template
33553 parameter chain with implicit_template_parms. */
33555 tree synth_id = make_generic_type_name ();
33556 tree synth_tmpl_parm = finish_template_type_parm (class_type_node,
33557 synth_id);
33558 tree new_parm
33559 = process_template_parm (parser->implicit_template_parms,
33560 input_location,
33561 build_tree_list (NULL_TREE, synth_tmpl_parm),
33562 /*non_type=*/false,
33563 /*param_pack=*/false);
33566 if (parser->implicit_template_parms)
33567 parser->implicit_template_parms
33568 = TREE_CHAIN (parser->implicit_template_parms);
33569 else
33570 parser->implicit_template_parms = new_parm;
33572 tree new_type = TREE_TYPE (getdecls ());
33574 /* If creating a fully implicit function template, start the new implicit
33575 template parameter list with this synthesized type, otherwise grow the
33576 current template parameter list. */
33578 if (become_template)
33580 parent_scope->level_chain = current_binding_level;
33582 tree new_parms = make_tree_vec (1);
33583 TREE_VEC_ELT (new_parms, 0) = parser->implicit_template_parms;
33584 current_template_parms = tree_cons (size_int (processing_template_decl),
33585 new_parms, current_template_parms);
33587 else
33589 tree& new_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms);
33590 int new_parm_idx = TREE_VEC_LENGTH (new_parms);
33591 new_parms = grow_tree_vec (new_parms, new_parm_idx + 1);
33592 TREE_VEC_ELT (new_parms, new_parm_idx) = parser->implicit_template_parms;
33595 current_binding_level = entry_scope;
33597 return new_type;
33600 /* Finish the declaration of a fully implicit function template. Such a
33601 template has no explicit template parameter list so has not been through the
33602 normal template head and tail processing. synthesize_implicit_template_parm
33603 tries to do the head; this tries to do the tail. MEMBER_DECL_OPT should be
33604 provided if the declaration is a class member such that its template
33605 declaration can be completed. If MEMBER_DECL_OPT is provided the finished
33606 form is returned. Otherwise NULL_TREE is returned. */
33608 tree
33609 finish_fully_implicit_template (cp_parser *parser, tree member_decl_opt)
33611 gcc_assert (parser->fully_implicit_function_template_p);
33613 if (member_decl_opt && member_decl_opt != error_mark_node
33614 && DECL_VIRTUAL_P (member_decl_opt))
33616 error_at (DECL_SOURCE_LOCATION (member_decl_opt),
33617 "implicit templates may not be %<virtual%>");
33618 DECL_VIRTUAL_P (member_decl_opt) = false;
33621 if (member_decl_opt)
33622 member_decl_opt = finish_member_template_decl (member_decl_opt);
33623 end_template_decl ();
33625 parser->fully_implicit_function_template_p = false;
33626 --parser->num_template_parameter_lists;
33628 return member_decl_opt;
33631 #include "gt-cp-parser.h"